blob: 735d0a5ea889a48f22a7ed130cefced8f16c7b62 [file] [log] [blame]
/*
* SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION &
* AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <cstdint>
#include <span>
namespace ocp
{
namespace accelerator_management
{
constexpr uint8_t messageType = 0x7E;
constexpr uint8_t ocpType = 8;
constexpr uint8_t ocpVersion = 9;
constexpr uint8_t ocpTypeBitOffset = 4;
constexpr uint8_t ocpTypeBitMask = 0b11110000;
constexpr uint8_t ocpVersionBitMask = 0b00001111;
constexpr uint8_t instanceIdBitMask = 0b00011111;
constexpr uint8_t instanceIdReservedBitMask = 0b00100000;
constexpr uint8_t datagramBitMask = 0b01000000;
constexpr uint8_t requestBitMask = 0b10000000;
constexpr uint8_t instanceMin = 0;
constexpr uint8_t instanceMax = 31;
enum class CompletionCode : uint8_t
{
SUCCESS = 0x00,
ERROR = 0x01,
ERR_INVALID_DATA = 0x02,
ERR_INVALID_DATA_LENGTH = 0x03,
ERR_NOT_READY = 0x04,
ERR_UNSUPPORTED_COMMAND_CODE = 0x05,
ERR_UNSUPPORTED_MSG_TYPE = 0x06,
ERR_BUS_ACCESS = 0x7f,
ERR_NULL = 0x80,
};
enum class ReasonCode : uint16_t
{
REASON_NONE = 0x00,
};
enum class MessageType : uint8_t
{
RESPONSE = 0, //!< OCP MCTP VDM response message
REQUEST = 2, //!< OCP MCTP VDM request message
};
struct BindingPciVid
{
uint16_t pci_vendor_id; //!< PCI defined vendor ID
uint8_t instance_id; //!< Instance ID
uint8_t ocp_version; //!< OCP version
uint8_t ocp_accelerator_management_msg_type; //!< Message Type
} __attribute__((packed));
struct Message
{
BindingPciVid hdr; //!< OCP MCTP VDM message header
} __attribute__((packed));
struct BindingPciVidInfo
{
uint8_t ocp_accelerator_management_msg_type;
uint8_t instance_id;
uint8_t msg_type;
};
struct CommonRequest
{
Message msgHdr;
uint8_t command;
uint8_t data_size;
} __attribute__((packed));
struct CommonResponse
{
Message msgHdr;
uint8_t command;
uint8_t completion_code;
uint16_t reserved;
uint16_t data_size;
} __attribute__((packed));
struct CommonNonSuccessResponse
{
Message msgHdr;
uint8_t command;
uint8_t completion_code;
uint16_t reason_code;
} __attribute__((packed));
int packHeader(uint16_t pciVendorId, const BindingPciVidInfo& hdr,
BindingPciVid& msg);
int decodeReasonCodeAndCC(std::span<const uint8_t> buf, CompletionCode& cc,
uint16_t& reasonCode);
} // namespace accelerator_management
} // namespace ocp