xref: /openbmc/dbus-sensors/src/tests/test_NvidiaDeviceInventoryMctpVdm.cpp (revision 87a0745bbf15a7f8a23bc5183e3640bd3a92db08)
1*87a0745bSEd Tanous #include "NvidiaGpuMctpVdm.hpp"
2*87a0745bSEd Tanous #include "OcpMctpVdm.hpp"
3*87a0745bSEd Tanous 
4*87a0745bSEd Tanous #include <endian.h>
5*87a0745bSEd Tanous 
6*87a0745bSEd Tanous #include <array>
7*87a0745bSEd Tanous #include <cstdint>
8*87a0745bSEd Tanous #include <cstring>
9*87a0745bSEd Tanous #include <string>
10*87a0745bSEd Tanous #include <variant>
11*87a0745bSEd Tanous #include <vector>
12*87a0745bSEd Tanous 
13*87a0745bSEd Tanous #include <gtest/gtest.h>
14*87a0745bSEd Tanous 
15*87a0745bSEd Tanous using namespace gpu;
16*87a0745bSEd Tanous // NOLINTBEGIN(cppcoreguidelines-pro-type-reinterpret-cast)
TEST(NvidiaGpuMctpVdmTest,EncodeGetInventoryInformationRequest)17*87a0745bSEd Tanous TEST(NvidiaGpuMctpVdmTest, EncodeGetInventoryInformationRequest)
18*87a0745bSEd Tanous {
19*87a0745bSEd Tanous     std::array<uint8_t, 256> buf{};
20*87a0745bSEd Tanous     uint8_t instanceId = 1;
21*87a0745bSEd Tanous     uint8_t propertyId =
22*87a0745bSEd Tanous         static_cast<uint8_t>(InventoryPropertyId::BOARD_PART_NUMBER);
23*87a0745bSEd Tanous 
24*87a0745bSEd Tanous     auto rc = encodeGetInventoryInformationRequest(instanceId, propertyId, buf);
25*87a0745bSEd Tanous     EXPECT_EQ(rc, 0);
26*87a0745bSEd Tanous 
27*87a0745bSEd Tanous     auto* msg = reinterpret_cast<GetInventoryInformationRequest*>(buf.data());
28*87a0745bSEd Tanous     EXPECT_EQ(msg->hdr.command,
29*87a0745bSEd Tanous               static_cast<uint8_t>(
30*87a0745bSEd Tanous                   PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION));
31*87a0745bSEd Tanous     EXPECT_EQ(msg->hdr.data_size, sizeof(propertyId));
32*87a0745bSEd Tanous     EXPECT_EQ(msg->property_id, propertyId);
33*87a0745bSEd Tanous }
34*87a0745bSEd Tanous 
TEST(NvidiaGpuMctpVdmTest,DecodeInventoryString)35*87a0745bSEd Tanous TEST(NvidiaGpuMctpVdmTest, DecodeInventoryString)
36*87a0745bSEd Tanous {
37*87a0745bSEd Tanous     std::array<uint8_t, 256> buf{};
38*87a0745bSEd Tanous     auto* response =
39*87a0745bSEd Tanous         reinterpret_cast<ocp::accelerator_management::CommonResponse*>(
40*87a0745bSEd Tanous             buf.data());
41*87a0745bSEd Tanous 
42*87a0745bSEd Tanous     // Fill header
43*87a0745bSEd Tanous     response->msgHdr.hdr.pci_vendor_id = htobe16(0x10DE); // NVIDIA vendor ID
44*87a0745bSEd Tanous     response->msgHdr.hdr.instance_id = 0x01;              // Instance ID
45*87a0745bSEd Tanous     response->msgHdr.hdr.ocp_version = 0x89; // OCP version and type
46*87a0745bSEd Tanous     response->msgHdr.hdr.ocp_accelerator_management_msg_type =
47*87a0745bSEd Tanous         static_cast<uint8_t>(
48*87a0745bSEd Tanous             ocp::accelerator_management::MessageType::RESPONSE);
49*87a0745bSEd Tanous 
50*87a0745bSEd Tanous     response->command = static_cast<uint8_t>(
51*87a0745bSEd Tanous         PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION);
52*87a0745bSEd Tanous     response->completion_code = static_cast<uint8_t>(
53*87a0745bSEd Tanous         ocp::accelerator_management::CompletionCode::SUCCESS);
54*87a0745bSEd Tanous     response->reserved = 0;
55*87a0745bSEd Tanous     response->data_size = htole16(5); // 5 bytes for "TEST1"
56*87a0745bSEd Tanous 
57*87a0745bSEd Tanous     const char* testStr = "TEST1";
58*87a0745bSEd Tanous     memcpy(buf.data() + sizeof(ocp::accelerator_management::CommonResponse),
59*87a0745bSEd Tanous            testStr, 5);
60*87a0745bSEd Tanous 
61*87a0745bSEd Tanous     ocp::accelerator_management::CompletionCode cc =
62*87a0745bSEd Tanous         ocp::accelerator_management::CompletionCode::ERROR;
63*87a0745bSEd Tanous     uint16_t reasonCode = 0;
64*87a0745bSEd Tanous     InventoryValue info;
65*87a0745bSEd Tanous 
66*87a0745bSEd Tanous     auto rc = decodeGetInventoryInformationResponse(
67*87a0745bSEd Tanous         buf, cc, reasonCode, InventoryPropertyId::BOARD_PART_NUMBER, info);
68*87a0745bSEd Tanous     EXPECT_EQ(rc, 0);
69*87a0745bSEd Tanous     EXPECT_EQ(cc, ocp::accelerator_management::CompletionCode::SUCCESS);
70*87a0745bSEd Tanous     EXPECT_EQ(reasonCode, 0);
71*87a0745bSEd Tanous     EXPECT_TRUE(std::holds_alternative<std::string>(info));
72*87a0745bSEd Tanous     EXPECT_EQ(std::get<std::string>(info), "TEST1");
73*87a0745bSEd Tanous }
74*87a0745bSEd Tanous 
TEST(NvidiaGpuMctpVdmTest,DecodeInventoryDeviceGuid)75*87a0745bSEd Tanous TEST(NvidiaGpuMctpVdmTest, DecodeInventoryDeviceGuid)
76*87a0745bSEd Tanous {
77*87a0745bSEd Tanous     std::array<uint8_t, 256> buf{};
78*87a0745bSEd Tanous     auto* response =
79*87a0745bSEd Tanous         reinterpret_cast<ocp::accelerator_management::CommonResponse*>(
80*87a0745bSEd Tanous             buf.data());
81*87a0745bSEd Tanous 
82*87a0745bSEd Tanous     // Fill header
83*87a0745bSEd Tanous     response->msgHdr.hdr.pci_vendor_id = htobe16(0x10DE); // NVIDIA vendor ID
84*87a0745bSEd Tanous     response->msgHdr.hdr.instance_id = 0x01;              // Instance ID
85*87a0745bSEd Tanous     response->msgHdr.hdr.ocp_version = 0x89; // OCP version and type
86*87a0745bSEd Tanous     response->msgHdr.hdr.ocp_accelerator_management_msg_type =
87*87a0745bSEd Tanous         static_cast<uint8_t>(
88*87a0745bSEd Tanous             ocp::accelerator_management::MessageType::RESPONSE);
89*87a0745bSEd Tanous 
90*87a0745bSEd Tanous     response->command = static_cast<uint8_t>(
91*87a0745bSEd Tanous         PlatformEnvironmentalCommands::GET_INVENTORY_INFORMATION);
92*87a0745bSEd Tanous     response->completion_code = static_cast<uint8_t>(
93*87a0745bSEd Tanous         ocp::accelerator_management::CompletionCode::SUCCESS);
94*87a0745bSEd Tanous     response->reserved = 0;
95*87a0745bSEd Tanous     response->data_size = htole16(8); // 8 bytes for DEVICE_GUID
96*87a0745bSEd Tanous 
97*87a0745bSEd Tanous     std::vector<uint8_t> dummyGuid = {0xDE, 0xAD, 0xBE, 0xEF,
98*87a0745bSEd Tanous                                       0x01, 0x23, 0x45, 0x67};
99*87a0745bSEd Tanous     memcpy(buf.data() + sizeof(ocp::accelerator_management::CommonResponse),
100*87a0745bSEd Tanous            dummyGuid.data(), dummyGuid.size());
101*87a0745bSEd Tanous 
102*87a0745bSEd Tanous     ocp::accelerator_management::CompletionCode cc =
103*87a0745bSEd Tanous         ocp::accelerator_management::CompletionCode::ERROR;
104*87a0745bSEd Tanous     uint16_t reasonCode = 0;
105*87a0745bSEd Tanous     InventoryValue info;
106*87a0745bSEd Tanous 
107*87a0745bSEd Tanous     auto rc = decodeGetInventoryInformationResponse(
108*87a0745bSEd Tanous         buf, cc, reasonCode, InventoryPropertyId::DEVICE_GUID, info);
109*87a0745bSEd Tanous     EXPECT_EQ(rc, 0);
110*87a0745bSEd Tanous     EXPECT_EQ(cc, ocp::accelerator_management::CompletionCode::SUCCESS);
111*87a0745bSEd Tanous     EXPECT_EQ(reasonCode, 0);
112*87a0745bSEd Tanous     EXPECT_TRUE(std::holds_alternative<std::vector<uint8_t>>(info));
113*87a0745bSEd Tanous     EXPECT_EQ(std::get<std::vector<uint8_t>>(info), dummyGuid);
114*87a0745bSEd Tanous }
115*87a0745bSEd Tanous // NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast)
116