/*
* 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 NVIDIA GPU domain scheduler asynchronous message definitions
*/
#if defined(__cplusplus)
#include
#elif !defined(__KERNEL__)
#include
#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