mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
Change NV license for nvsched sources and Makefile.doxygen to MIT
license as those can be distributed with other linux sources but
they are also used in qnx.
Bug 3871403
Change-Id: Iefc957b4afdf4c3c2ff19df144caac9790490114
Signed-off-by: Sagar Kamble <skamble@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2814847
(cherry picked from commit 406e5392b7)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2818121
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com>
Reviewed-by: svc-mobile-misra <svc-mobile-misra@nvidia.com>
Reviewed-by: Ankur Kishore <ankkishore@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
451 lines
10 KiB
C++
451 lines
10 KiB
C++
/*
|
|
* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef NVS_CONTROL_MESSAGES_H
|
|
#define NVS_CONTROL_MESSAGES_H
|
|
|
|
/**
|
|
* @file
|
|
* @brief <b>NVIDIA GPU domain scheduler asynchronous message definitions</b>
|
|
*/
|
|
|
|
#if defined(__cplusplus)
|
|
#include <cstdint>
|
|
#elif !defined(__KERNEL__)
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Communication error
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_error_resp
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_TYPE_CTRL_ERROR (0U)
|
|
|
|
/**
|
|
* @brief Unknown/undefined error
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_error_resp::error_code
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_CTRL_ERROR_UNKNOWN (0U)
|
|
|
|
/**
|
|
* @brief Unhandled message
|
|
*
|
|
* The scheduler received a message that it does not know how to handle.
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_error_resp::error_code
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_CTRL_ERROR_UNHANDLED_MESSAGE (1U)
|
|
|
|
/**
|
|
* @brief Communication error
|
|
*
|
|
* This control message is sent as a response to an erroneous request.
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_ERROR
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_error_resp {
|
|
|
|
/**
|
|
* @brief Communication error code
|
|
*
|
|
* See NVS_DOMAIN_MSG_CTRL_ERROR_* error codes.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint32_t error_code;
|
|
};
|
|
|
|
/**
|
|
* @brief Scheduler capability query
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_get_caps_req
|
|
* @sa nvs_domain_msg_ctrl_get_caps_resp
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_TYPE_CTRL_GET_CAPS_INFO (1U)
|
|
|
|
/**
|
|
* @brief Scheduler capability query request
|
|
*
|
|
* The client version is used by the scheduler to check the client
|
|
* compatibility, following the semantic versioning specification. (See
|
|
* #NVS_DOMAIN_SCHED_VERSION_MAJOR for details.)
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_GET_CAPS_INFO
|
|
* @sa nvs_domain_msg_ctrl_get_caps_resp::client_version_status
|
|
*
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_get_caps_req {
|
|
|
|
/**
|
|
* @brief Client major version
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t client_version_major;
|
|
|
|
/**
|
|
* @brief Client minor version
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t client_version_minor;
|
|
|
|
/**
|
|
* @brief Client patch level
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t client_version_patch;
|
|
};
|
|
|
|
/**
|
|
* @brief Major version of the domain scheduler interface
|
|
*
|
|
* The versioning scheme follows the Semantic Versioning 2.0.0
|
|
* specification. See https://semver.org/spec/v2.0.0.html
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_SCHED_VERSION_MAJOR (1U)
|
|
|
|
/**
|
|
* @brief Minor version of the domain scheduler interface
|
|
*
|
|
* The versioning scheme follows the Semantic Versioning 2.0.0
|
|
* specification. See https://semver.org/spec/v2.0.0.html
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_SCHED_VERSION_MINOR (0U)
|
|
|
|
/**
|
|
* @brief Patch version of the domain scheduler interface
|
|
*
|
|
* The versioning scheme follows the Semantic Versioning 2.0.0
|
|
* specification. See https://semver.org/spec/v2.0.0.html
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_SCHED_VERSION_PATCH (0U)
|
|
|
|
/**
|
|
* @brief Client version check failed
|
|
*
|
|
* The client should not proceed with scheduler communication. The
|
|
* scheduler is not expected to be compatible.
|
|
*/
|
|
#define NVS_DOMAIN_MSG_CTRL_GET_CAPS_RESP_CLIENT_VERSION_STATUS_FAILED (0U)
|
|
|
|
/**
|
|
* @brief Client version check passed
|
|
*/
|
|
#define NVS_DOMAIN_MSG_CTRL_GET_CAPS_RESP_CLIENT_VERSION_STATUS_OK (1U)
|
|
|
|
/**
|
|
* @brief Scheduler capability query response
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_GET_CAPS_INFO
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_get_caps_resp {
|
|
|
|
/**
|
|
* @brief Scheduler major version
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t sched_version_major;
|
|
|
|
/**
|
|
* @brief Scheduler minor version
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t sched_version_minor;
|
|
|
|
/**
|
|
* @brief Scheduler patch level
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t sched_version_patch;
|
|
|
|
/**
|
|
* @brief Client version check status
|
|
*
|
|
* This field indicates the scheduler-side check for client
|
|
* version compatibility. In general, the version numbering
|
|
* scheme follows the semantic versioning specification (see
|
|
* #NVS_DOMAIN_SCHED_VERSION_MAJOR). Additionally, the scheduler is
|
|
* allowed to fail this check for known incompatible or otherwise bad
|
|
* versions of the client.
|
|
*
|
|
* In general:
|
|
* - When the client and scheduler major version numbers match,
|
|
* #NVS_DOMAIN_MSG_CTRL_GET_CAPS_RESP_CLIENT_VERSION_STATUS_OK
|
|
* is returned.
|
|
* - When the client and scheduler major versions do not match,
|
|
* #NVS_DOMAIN_MSG_CTRL_GET_CAPS_RESP_CLIENT_VERSION_STATUS_FAILED
|
|
* is returned. Future note: If the client supports multiple
|
|
* scheduler major versions, the client is allowed to send
|
|
* #nvs_domain_msg_ctrl_get_caps_req again with a compatible
|
|
* version number.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t client_version_status;
|
|
};
|
|
|
|
/**
|
|
* @brief Switch to another domain
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_switch_domain_req
|
|
* @sa nvs_domain_msg_ctrl_switch_domain_resp
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_TYPE_CTRL_SWITCH_DOMAIN (2U)
|
|
|
|
/**
|
|
* @brief Pseudo-domain ID for all TSGs over all domains
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_switch_domain_req::domain_id
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_CTRL_DOMAIN_ID_ALL (~(uint64_t)0U)
|
|
|
|
/**
|
|
* @brief Scheduler domain switch request
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_SWITCH_DOMAIN
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_switch_domain_req {
|
|
|
|
/**
|
|
* @brief Domain id
|
|
*
|
|
* @remark Domain id #NVS_DOMAIN_CTRL_DOMAIN_ID_ALL has a special meaning. This
|
|
* is a request to switch to a runlist that contains all TSGs in all domains.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint64_t domain_id;
|
|
};
|
|
|
|
/**
|
|
* @brief Scheduler domain switch succeeded
|
|
*
|
|
* @sa nvs_domain_msg_ctrl_switch_domain_resp::status
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MSG_TYPE_CTRL_SWITCH_DOMAIN_STATUS_SUCCESS (0U)
|
|
|
|
/**
|
|
* @brief Scheduler domain switch response
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_SWITCH_DOMAIN
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_switch_domain_resp {
|
|
|
|
/**
|
|
* @brief Domain switch status
|
|
*
|
|
* @remark The domain scheduler may return a status code that
|
|
* is not listed below. In this case, domain switch failed and
|
|
* the status code is returned for diagnostic and debugging
|
|
* purposes.
|
|
*
|
|
* @sa NVS_DOMAIN_MSG_TYPE_CTRL_SWITCH_DOMAIN_STATUS_SUCCESS
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t status;
|
|
|
|
/**
|
|
* @brief Padding to ensure 8B alignment for the next field
|
|
* for 32/64-bit compatibility
|
|
*/
|
|
uint8_t reserved[7];
|
|
|
|
/**
|
|
* @brief Time it took to preempt and switch to the new domain (nanoseconds)
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint64_t switch_ns;
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief Maximum payload size for #nvs_domain_message.
|
|
*
|
|
* @sa nvs_domain_message::payload
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
#define NVS_DOMAIN_MESSAGE_MAX_PAYLOAD_SIZE (48U)
|
|
|
|
|
|
/**
|
|
* @brief Payload union
|
|
*
|
|
* Union that contains all defined messages.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
union nvs_domain_msg_payload_union {
|
|
/**
|
|
* @brief Control response message: communication error
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_error_resp resp_error;
|
|
|
|
/**
|
|
* @brief Control request message: get_caps
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_get_caps_req req_get_caps;
|
|
|
|
/**
|
|
* @brief Control response message: get_caps
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_get_caps_resp resp_get_caps;
|
|
|
|
/**
|
|
* @brief Control request message: switch_domain
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_switch_domain_req req_switch_domain;
|
|
|
|
/**
|
|
* @brief Control response message: switch_domain
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_msg_ctrl_switch_domain_resp resp_switch_domain;
|
|
|
|
|
|
/**
|
|
* @brief Raw message data
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint8_t raw_data[NVS_DOMAIN_MESSAGE_MAX_PAYLOAD_SIZE];
|
|
};
|
|
|
|
#if (defined(__cplusplus) && (__cplusplus >= 201103L))
|
|
static_assert(
|
|
sizeof(nvs_domain_msg_payload_union) == NVS_DOMAIN_MESSAGE_MAX_PAYLOAD_SIZE,
|
|
"Check for expected payload size");
|
|
#endif
|
|
|
|
/**
|
|
* @brief The generic NVS domain message envelope
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
struct nvs_domain_message {
|
|
|
|
/**
|
|
* @brief FIFO-specific message type
|
|
*
|
|
* Message type defines:
|
|
* - control messages: NVS_DOMAIN_MSG_TYPE_CTRL_*
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint32_t type;
|
|
|
|
/**
|
|
* @brief Client-provided message tag
|
|
*
|
|
* - **Request-response messages.** The client provides a tag
|
|
* which the scheduler copies to the corresponding
|
|
* response.
|
|
*
|
|
* @remark It is recommended that the client uses a sequence
|
|
* to generate the tags for easier request/response tracing.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint32_t sequence_tag;
|
|
|
|
/**
|
|
* @brief Message timestamp (nanoseconds)
|
|
*
|
|
* client --> scheduler: host CPU time (CLOCK_MONOTONIC)
|
|
*
|
|
* scheduler --> client: scheduler local time
|
|
*
|
|
* @remark The timestamp field is primarily intended for
|
|
* message tracing purposes for allowing the reconstruction of
|
|
* the timeline of events. For operational purposes such as
|
|
* measuring the request/response round-trips as a health
|
|
* indicator, the usermode software should use local CPU
|
|
* host-side clock sampling, instead. The GSP clock is not
|
|
* guaranteed to use the same time domain with the host
|
|
* CPU. Further, drift may occur between the host CPU and GSP
|
|
* time domains.
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
uint64_t timestamp_ns;
|
|
|
|
/**
|
|
* @brief Payload union
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
union nvs_domain_msg_payload_union payload;
|
|
};
|
|
|
|
#if defined(__cplusplus)
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif
|