Nvidia-gpu: Encode/decode APIs for GPU Inventory
Added support for encoding and decoding Get Inventory command.
The command supports fetching inventory properties including Serial
Number, Part Number, Marketing Name, etc for Nvidia GPUs
Tested
- added new UT for encode and decode APIs which pass
Change-Id: I9e5afbe356b64fd7ae4f7a2a65043f3eeffa3807
Signed-off-by: Rohit PAI <ropai@nvidia.com>
diff --git a/src/nvidia-gpu/NvidiaGpuMctpVdm.hpp b/src/nvidia-gpu/NvidiaGpuMctpVdm.hpp
index 09df4e6..19b9929 100644
--- a/src/nvidia-gpu/NvidiaGpuMctpVdm.hpp
+++ b/src/nvidia-gpu/NvidiaGpuMctpVdm.hpp
@@ -8,12 +8,20 @@
#include <OcpMctpVdm.hpp>
+#include <array>
+#include <cstddef>
#include <cstdint>
#include <span>
+#include <string>
+#include <variant>
+#include <vector>
namespace gpu
{
+using InventoryValue = std::variant<std::string, std::vector<uint8_t>>;
+constexpr size_t maxInventoryDataSize = 256;
+
constexpr uint16_t nvidiaPciVendorId = 0x10de;
enum class MessageType : uint8_t
@@ -33,6 +41,7 @@
READ_THERMAL_PARAMETERS = 0x02,
GET_CURRENT_POWER_DRAW = 0x03,
GET_CURRENT_ENERGY_COUNTER = 0x06,
+ GET_INVENTORY_INFORMATION = 0x0C,
GET_VOLTAGE = 0x0F,
};
@@ -42,6 +51,47 @@
DEVICE_SMA = 5
};
+enum class InventoryPropertyId : uint8_t
+{
+ BOARD_PART_NUMBER = 0,
+ SERIAL_NUMBER = 1,
+ MARKETING_NAME = 2,
+ DEVICE_PART_NUMBER = 3,
+ FRU_PART_NUMBER = 4,
+ MEMORY_VENDOR = 5,
+ MEMORY_PART_NUMBER = 6,
+ MAX_MEMORY_CAPACITY = 7,
+ BUILD_DATE = 8,
+ FIRMWARE_VERSION = 9,
+ DEVICE_GUID = 10,
+ INFOROM_VERSION = 11,
+ PRODUCT_LENGTH = 12,
+ PRODUCT_WIDTH = 13,
+ PRODUCT_HEIGHT = 14,
+ RATED_DEVICE_POWER_LIMIT = 15,
+ MIN_DEVICE_POWER_LIMIT = 16,
+ MAX_DEVICE_POWER_LIMIT = 17,
+ MAX_MODULE_POWER_LIMIT = 18,
+ MIN_MODULE_POWER_LIMIT = 19,
+ RATED_MODULE_POWER_LIMIT = 20,
+ DEFAULT_BOOST_CLOCKS = 21,
+ DEFAULT_BASE_CLOCKS = 22,
+ DEFAULT_EDPP_SCALING = 23,
+ MIN_EDPP_SCALING = 24,
+ MAX_EDPP_SCALING = 25,
+ MIN_GRAPHICS_CLOCK = 26,
+ MAX_GRAPHICS_CLOCK = 27,
+ MIN_MEMORY_CLOCK = 28,
+ MAX_MEMORY_CLOCK = 29,
+ INFINIBAND_GUID = 30,
+ RACK_GUID = 31,
+ RACK_SLOT_NUMBER = 32,
+ COMPUTE_SLOT_INDEX = 33,
+ NODE_INDEX = 34,
+ GPU_NODE_ID = 35,
+ NVLINK_PEER_TYPE = 36
+};
+
struct QueryDeviceIdentificationRequest
{
ocp::accelerator_management::CommonRequest hdr;
@@ -105,6 +155,18 @@
uint32_t voltage;
} __attribute__((packed));
+struct GetInventoryInformationRequest
+{
+ ocp::accelerator_management::CommonRequest hdr;
+ uint8_t property_id;
+} __attribute__((packed));
+
+struct GetInventoryInformationResponse
+{
+ ocp::accelerator_management::CommonResponse hdr;
+ std::array<uint8_t, maxInventoryDataSize> data;
+} __attribute__((packed));
+
int packHeader(const ocp::accelerator_management::BindingPciVidInfo& hdr,
ocp::accelerator_management::BindingPciVid& msg);
@@ -155,4 +217,13 @@
int decodeGetVoltageResponse(std::span<const uint8_t> buf,
ocp::accelerator_management::CompletionCode& cc,
uint16_t& reasonCode, uint32_t& voltage);
+
+int encodeGetInventoryInformationRequest(uint8_t instanceId, uint8_t propertyId,
+ std::span<uint8_t> buf);
+
+int decodeGetInventoryInformationResponse(
+ std::span<const uint8_t> buf,
+ ocp::accelerator_management::CompletionCode& cc, uint16_t& reasonCode,
+ InventoryPropertyId propertyId, InventoryValue& value);
+
} // namespace gpu