mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
Add asynchronous control interface for the GPU scheduler. The interface consists of: - General FIFO specification - General message send/receive procedures - The initial set of command messages for handshake, domain switching, and error responses JIRA GCSS-1892 Change-Id: Ib86baf470d9fdf2e45f4391faf247006d9b80f0b Signed-off-by: Sami Kiminki <skiminki@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2675369 Reviewed-by: Debarshi Dutta <ddutta@nvidia.com> Reviewed-by: Ankur Kishore <ankkishore@nvidia.com>
439 lines
9.5 KiB
C++
439 lines
9.5 KiB
C++
/*
|
|
* Copyright (c) 2022 NVIDIA Corporation. All rights reserved.
|
|
*
|
|
* NVIDIA Corporation and its licensors retain all intellectual property
|
|
* and proprietary rights in and to this software, related documentation
|
|
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
* distribution of this software and related documentation without an express
|
|
* license agreement from NVIDIA Corporation is strictly prohibited.
|
|
*/
|
|
|
|
#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>
|
|
#else
|
|
#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
|