blob: 94bf8e3d4b9035d860a89cca730d7fd8ce480a0a [file]
/*
* SPDX-FileCopyrightText: Copyright OpenBMC Authors
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "MessagePackUnpackUtils.hpp"
#include <cstddef>
#include <cstdint>
#include <functional>
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 eventAckRequiredBitMask = 0b00010000;
constexpr uint8_t eventVersionBitMask = 0b00001111;
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,
ACCEPTED = 0x7D,
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
};
constexpr size_t messageHeaderSize = 5;
constexpr size_t instanceIdOffset = 2;
constexpr size_t commonRequestSize = messageHeaderSize + 2;
constexpr size_t commonResponseSize = messageHeaderSize + 6;
constexpr size_t eventHeaderSize = messageHeaderSize + 6;
int packHeader(PackBuffer& buffer, uint16_t pciVendorId,
MessageType ocpAcceleratorManagementMsgType, uint8_t instanceId,
uint8_t msgType);
int unpackHeader(UnpackBuffer& buffer, uint16_t pciVendorId,
MessageType& ocpAcceleratorManagementMsgType,
uint8_t& instanceId, uint8_t& msgType);
int decodeReasonCodeAndCC(std::span<const uint8_t> buf, CompletionCode& cc,
uint16_t& reasonCode);
int decodeInstanceId(std::span<const uint8_t> buf, uint8_t& instanceId);
int unpackReasonCodeAndCC(UnpackBuffer& buffer, CompletionCode& cc,
uint16_t& reasonCode);
int decodeEvent(std::span<const uint8_t> buf, uint16_t pciVendorId,
uint8_t& messageType, bool& ackRequired, uint8_t& version,
uint8_t& eventId, uint8_t& eventClass, uint16_t& eventState,
uint8_t& size, std::span<const uint8_t>& eventData);
int unpackAggregateResponse(
UnpackBuffer& buffer,
std::move_only_function<int(const uint8_t tag, const uint8_t length,
UnpackBuffer& buffer)>
handler);
} // namespace accelerator_management
} // namespace ocp