xref: /openbmc/dbus-sensors/src/nvidia-gpu/OcpMctpVdm.hpp (revision 560e6af7b1f74e9c020a0f82817f9d926e0c4f72)
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION &
3  * AFFILIATES. All rights reserved.
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #pragma once
8 
9 #include <cstdint>
10 #include <span>
11 
12 namespace ocp
13 {
14 namespace accelerator_management
15 {
16 
17 constexpr uint8_t messageType = 0x7E;
18 
19 constexpr uint8_t ocpType = 8;
20 constexpr uint8_t ocpVersion = 9;
21 constexpr uint8_t ocpTypeBitOffset = 4;
22 constexpr uint8_t ocpTypeBitMask = 0b11110000;
23 constexpr uint8_t ocpVersionBitMask = 0b00001111;
24 constexpr uint8_t instanceIdBitMask = 0b00011111;
25 constexpr uint8_t instanceIdReservedBitMask = 0b00100000;
26 constexpr uint8_t datagramBitMask = 0b01000000;
27 constexpr uint8_t requestBitMask = 0b10000000;
28 
29 constexpr uint8_t instanceMin = 0;
30 constexpr uint8_t instanceMax = 31;
31 
32 enum class CompletionCode : uint8_t
33 {
34     SUCCESS = 0x00,
35     ERROR = 0x01,
36     ERR_INVALID_DATA = 0x02,
37     ERR_INVALID_DATA_LENGTH = 0x03,
38     ERR_NOT_READY = 0x04,
39     ERR_UNSUPPORTED_COMMAND_CODE = 0x05,
40     ERR_UNSUPPORTED_MSG_TYPE = 0x06,
41     ERR_BUS_ACCESS = 0x7f,
42     ERR_NULL = 0x80,
43 };
44 
45 enum class ReasonCode : uint16_t
46 {
47     REASON_NONE = 0x00,
48 };
49 
50 enum class MessageType : uint8_t
51 {
52     RESPONSE = 0, //!< OCP MCTP VDM response message
53     REQUEST = 2,  //!< OCP MCTP VDM request message
54 };
55 
56 struct BindingPciVid
57 {
58     uint16_t pci_vendor_id;                      //!< PCI defined vendor ID
59     uint8_t instance_id;                         //!< Instance ID
60     uint8_t ocp_version;                         //!< OCP version
61     uint8_t ocp_accelerator_management_msg_type; //!< Message Type
62 } __attribute__((packed));
63 
64 struct Message
65 {
66     BindingPciVid hdr; //!< OCP MCTP VDM message header
67 } __attribute__((packed));
68 
69 struct BindingPciVidInfo
70 {
71     uint8_t ocp_accelerator_management_msg_type;
72     uint8_t instance_id;
73     uint8_t msg_type;
74 };
75 
76 struct CommonRequest
77 {
78     Message msgHdr;
79     uint8_t command;
80     uint8_t data_size;
81 } __attribute__((packed));
82 
83 struct CommonResponse
84 {
85     Message msgHdr;
86     uint8_t command;
87     uint8_t completion_code;
88     uint16_t reserved;
89     uint16_t data_size;
90 } __attribute__((packed));
91 
92 struct CommonNonSuccessResponse
93 {
94     Message msgHdr;
95     uint8_t command;
96     uint8_t completion_code;
97     uint16_t reason_code;
98 } __attribute__((packed));
99 
100 int packHeader(uint16_t pciVendorId, const BindingPciVidInfo& hdr,
101                BindingPciVid& msg);
102 
103 int decodeReasonCodeAndCC(std::span<const uint8_t> buf, CompletionCode& cc,
104                           uint16_t& reasonCode);
105 
106 } // namespace accelerator_management
107 } // namespace ocp
108