FMAPI-release/main.h

1325 lines
40 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* SPDX-License-Identifier: Apache-2.0 */
/**
* @file fmapi.h
*
* @brief Header file for CXL Fabric Management API commands
*
* @details As per CXL specification, all registers are little-endian
*
* @copyright Copyright (C) 2024 Jackrabbit Founders LLC. All rights reserved.
*
* @date Jan 2024
* @author Barrett Edwards <code@jrlabs.io>
*
* Macro / Enumeration Prefixes
* FMCT - CXL.io Configuration Request Type
* FMDT - CXL Device Type
* FMDV - CXL version for the connected device
* FMEL - Event Logs
* FMET - Physical Switch Event Record - Event Type (ET)
* FMLF - Link Flags - Bitmask Flags for Link State for CXL Swithc Port info struct
* FMLN - Serialized Length of each FM API Object (struct) (LN)
* FMLO - PCIe Lane reverse ordering state as defined in CXL 2.0 table 92
* FMLS - PCIe Link state
* FMMG - Memory Granularity for Get LD Allocation
* FMMS - Encoding for PCIe Max Link Speeds
* FMMR - MLD Port Event Record - Event Type (MR)
* FMMT - FM API Header Message Catgories
* FMNW - Negotiated Link Width (NW)
* FMOB - Types of FM API Objects (OB)
* FMOP - FM API Header Opcodes
* FMPO - Port Control Op Code
* FMPS - CXL Port State possibilities
* FMQT - QoS Telemetry Capability Bitmask
* FMRC - FM API Return Codes
* FMSS - Bitmask fields for PCIe Supported Link Speeds
* FMUB - Unbind options for vPPB Unbind Command
* FMVS - VCS State
* FMVT - Virtual CXL Switch Event Record - Event Type (VT)
*
*/
#ifndef _FMAPI_H
#define _FMAPI_H
/* INCLUDES ==================================================================*/
/**
* For PCIe Supported link speed macros
*/
#include <linux/pci_regs.h>
/**
* For __u8, __u16, __u32, __u64 types
*/
#include <linux/types.h>
/* MACROS ====================================================================*/
/**
* Version of this API
*/
#define FMAPI_VERSION 1
/**
* The CXL 2.0 FM API has an 8-bit field for port id so there is a maximum of 256 ports
*/
#define FM_MAX_PORTS 256
/**
* The CXL 2.0 FM API has an 8-bit field for VCS id so there is a maximum of 256 ports
*/
#define FM_MAX_VCS 256
/**
*The CXL 2.0 FM API has an 8-bit field for port id so there is a maximum of 256 ports
*/
#define FM_MAX_VPPBS FM_MAX_PORTS
/**
* The maximum number of VCS Info blocks returned in a Get VCS Info Response
*/
#define FM_MAX_VCS_PER_RSP 7
/**
* Maximum Message Body Size in Bytes
*/
#define FM_MAX_MSG_LEN 65536
/**
* Send LD CXL.io Memory Request Data payload length
* CXL 2.0 v1.0 Table 108
*/
#define FM_LD_MEM_REQ_LEN 4096
/**
* Maximum number of Logical Devices supported by an MLD
*/
#define FM_MAX_NUM_LD 16
/**
* Length of a PCIe TLP Header in bytes
*/
#define FM_TLP_HEADER 32
/**
* Serialized Length in bytes of each FM API Object (struct) (LN)
*
* This length excludes any variable length data that comes after the object
*/
#define FMLN_HDR 12 //!< struct fmapi_hdr
#define FMLN_MSG 8192 //!< Maximum length of a FM API Message Body (HDR + payload)
#define FMLN_PAYLOAD (FMLN_MSG - FMLN_HDR) //!< Maximum length of the FM API Message Payload
#define FMLN_PSC_IDENTIFY_SWITCH 93 //!< struct fmapi_psc_id_rsp
#define FMLN_PSC_GET_PHY_PORT_REQ 1 //!< struct fmapi_psc_port_req
#define FMLN_PSC_GET_PHY_PORT_INFO 16 //!< struct fmapi_psc_port_info
#define FMLN_PSC_GET_PHY_PORT_RESP 4 //!< struct fmapi_psc_port_rsp
#define FMLN_PSC_PHY_PORT_CTRL 2 //!< struct fmapi_psc_port_ctrl_req
#define FMLN_PSC_PPB_IO_CFG_REQ 8 //!< struct fmapi_psc_cfg_req
#define FMLN_PSC_PPB_IO_CFG_RESP 4 //!< struct fmapi_psc_cfg_rsp
#define FMLN_VSC_GET_INFO_REQ 3 //!< struct fmapi_vsc_info_req
#define FMLN_VSC_PPB_STATUS 4 //!< struct fmapi_vsc_ppb_stat_blk
#define FMLN_VSC_INFO 4 //!< struct fmapi_vsc_info_blk
#define FMLN_VSC_GET_INFO_RESP 4 //!< struct fmapi_vsc_info_rsp
#define FMLN_VSC_BIND 6 //!< struct fmapi_vsc_bind_req
#define FMLN_VSC_UNBIND 3 //!< struct fmapi_vsc_unbind_req
#define FMLN_VSC_GEN_AER 40 //!< struct fmapi_vsc_aer_req
#define FMLN_MPC_TUNNEL_CMD_REQ 5 //!< struct fmapi_mpc_tmc_req includes MCTP Type Byte
#define FMLN_MPC_TUNNEL_CMD_RESP 5 //!< struct fmapi_mpc_tmc_rsp includes MCTP Type Byte
#define FMLN_MPC_TUNNEL_PAYLOAD (FMLN_PAYLOAD - FMLN_MPC_TUNNEL_CMD_REQ)
#define FMLN_MPC_LD_IO_CFG_REQ 12 //!< struct fmapi_mpc_cfg_req
#define FMLN_MPC_LD_IO_CFG_RESP 4 //!< struct fmapi_mpc_cfg_rsp
#define FMLN_MPC_LD_MEM_REQ 16 //!< struct fmapi_mpc_mem_req
#define FMLN_MPC_LD_MEM_RESP 4 //!< struct fmapi_mpc_mem_rsp
#define FMLN_MCC_GET_LD_INFO 11 //!< struct fmapi_mcc_info_rsp
#define FMLN_MCC_LD_ALLOC_ENTRY 16 //!< struct fmapi_mcc_alloc_blk
#define FMLN_MCC_GET_LD_ALLOC_REQ 2 //!< struct fmapi_mcc_alloc_get_req
#define FMLN_MCC_GET_LD_ALLOC_RSP 4 //!< struct fmapi_mcc_alloc_get_rsp
#define FMLN_MCC_SET_LD_ALLOC_REQ 4 //!< struct fmapi_mcc_alloc_set_req
#define FMLN_MCC_SET_LD_ALLOC_RSP 4 //!< struct fmapi_mcc_alloc_set_rsp
#define FMLN_MCC_QOS_CTRL 7 //!< struct fmapi_mcc_qos_ctrl
#define FMLN_MCC_QOS_STATUS 1 //!< struct fmapi_mcc_qos_stat_rsp
#define FMLN_MCC_GET_QOS_BW_REQ 2 //!< struct fmapi_mcc_qos_bw_alloc_get_req
#define FMLN_MCC_QOS_BW_ALLOC 2 //!< struct fmapi_mcc_qos_bw_alloc
#define FMLN_MCC_GET_QOS_BW_LIMIT_REQ 2 //!< struct fmapi_mcc_qos_bw_limit_get_req
#define FMLN_MCC_QOS_BW_LIMIT 2 //!< struct fmapi_mcc_qos_bw_limit
#define FMLN_ISC_ID_RSP 17 //!< struct fmapi_isc_id
#define FMLN_ISC_MSG_LIMIT 1 //!< struct fmapi_isc_msg_limit
#define FMLN_ISC_BOS 8 //!< struct fmapi_isc_bos
/* ENUMERATIONS ==============================================================*/
/**
* Types of FM API Objects (OB)
*
* The primary purpose of this enum is for serialization/deserialization.
* This is not an enumeration defined by the CXL FM API
*/
enum _FMOB {
FMOB_NULL = 0,
FMOB_HDR = 1, //!< struct fmapi_hdr
FMOB_PSC_ID_RSP = 2, //!< struct fmapi_psc_id_rsp
FMOB_PSC_PORT_REQ = 3, //!< struct fmapi_psc_port_req
FMOB_PSC_PORT_INFO = 4, //!< struct fmapi_psc_port_info
FMOB_PSC_PORT_RSP = 5, //!< struct fmapi_psc_port_rsp
FMOB_PSC_PORT_CTRL_REQ = 6, //!< struct fmapi_psc_port_ctrl_req
FMOB_PSC_CFG_REQ = 7, //!< struct fmapi_psc_cfg_req
FMOB_PSC_CFG_RSP = 8, //!< struct fmapi_psc_cfg_rsp
FMOB_VSC_INFO_REQ = 9, //!< struct fmapi_vsc_info_req
FMOB_VSC_PPB_STAT_BLK = 10, //!< struct fmapi_vsc_ppb_stat_blk
FMOB_VSC_INFO_BLK = 11, //!< struct fmapi_vsc_info_blk
FMOB_VSC_INFO_RSP = 12, //!< struct fmapi_vsc_info_rsp
FMOB_VSC_BIND_REQ = 13, //!< struct fmapi_vsc_bind_req
FMOB_VSC_UNBIND_REQ = 14, //!< struct fmapi_vsc_unbind_req
FMOB_VSC_AER_REQ = 15, //!< struct fmapi_vsc_aer_req
FMOB_MPC_TMC_REQ = 16, //!< struct fmapi_mpc_tmc_req
FMOB_MPC_TMC_RSP = 17, //!< struct fmapi_mpc_tmc_rsp
FMOB_MPC_CFG_REQ = 18, //!< struct fmapi_mpc_cfg_req
FMOB_MPC_CFG_RSP = 19, //!< struct fmapi_mpc_cfg_rsp
FMOB_MPC_MEM_REQ = 20, //!< struct fmapi_mpc_mem_req
FMOB_MPC_MEM_RSP = 21, //!< struct fmapi_mpc_mem_rsp
FMOB_MCC_INFO_RSP = 22, //!< struct fmapi_mcc_info_rsp
FMOB_MCC_ALLOC_BLK = 23, //!< struct fmapi_mcc_alloc_blk
FMOB_MCC_ALLOC_GET_REQ = 24, //!< struct fmapi_mcc_alloc_get_req
FMOB_MCC_ALLOC_GET_RSP = 25, //!< struct fmapi_mcc_alloc_get_rsp
FMOB_MCC_ALLOC_SET_REQ = 26, //!< struct fmapi_mcc_alloc_set_req
FMOB_MCC_ALLOC_SET_RSP = 27, //!< struct fmapi_mcc_alloc_set_rsp
FMOB_MCC_QOS_CTRL = 28, //!< struct fmapi_mcc_qos_ctrl
FMOB_MCC_QOS_STAT_RSP = 29, //!< struct fmapi_mcc_qos_stat_rsp
FMOB_MCC_QOS_BW_GET_REQ = 30, //!< struct fmapi_mcc_qos_bw_alloc_get_req
FMOB_MCC_QOS_BW_ALLOC = 31, //!< struct fmapi_mcc_qos_bw_alloc
FMOB_MCC_QOS_BW_LIMIT_GET_REQ = 32, //!< struct fmapi_mcc_qos_bw_limit_get_req
FMOB_MCC_QOS_BW_LIMIT = 33, //!< struct fmapi_mcc_qos_bw_limit
FMOB_ISC_ID_RSP = 34, //!< struct fmapi_isc_id_rsp
FMOB_ISC_MSG_LIMIT = 35, //!< struct fmapi_isc_msg_limit
FMOB_ISC_BOS = 36, //!< struct fmapi_isc_bos
FMOB_MAX
};
/**
* FM API Command Message Category Types (MT)
*
* CXL 2.0 v1.0 Table 84
*/
enum _FMMT {
FMMT_REQ = 0,
FMMT_RESP = 1,
FMMT_MAX
};
/**
* FM API Command Opcodes (OP)
*
* CXL 2.0 v1.0 Table 205
*/
enum _FMOP {
FMOP_PSC_ID = 0x5100,
FMOP_PSC_PORT = 0x5101,
FMOP_PSC_PORT_CTRL = 0x5102,
FMOP_PSC_CFG = 0x5103,
FMOP_VSC_INFO = 0x5200,
FMOP_VSC_BIND = 0x5201,
FMOP_VSC_UNBIND = 0x5202,
FMOP_VSC_AER = 0x5203,
FMOP_MPC_TMC = 0x5300,
FMOP_MPC_CFG = 0x5301,
FMOP_MPC_MEM = 0x5302,
FMOP_MCC_INFO = 0x5400,
FMOP_MCC_ALLOC_GET = 0x5401,
FMOP_MCC_ALLOC_SET = 0x5402,
FMOP_MCC_QOS_CTRL_GET = 0x5403,
FMOP_MCC_QOS_CTRL_SET = 0x5404,
FMOP_MCC_QOS_STAT = 0x5405,
FMOP_MCC_QOS_BW_ALLOC_GET = 0x5406,
FMOP_MCC_QOS_BW_ALLOC_SET = 0x5407,
FMOP_MCC_QOS_BW_LIMIT_GET = 0x5408,
FMOP_MCC_QOS_BW_LIMIT_SET = 0x5409,
FMOP_ISC_ID = 0x0001,
FMOP_ISC_BOS = 0x0002,
FMOP_ISC_MSG_LIMIT_GET = 0x0003,
FMOP_ISC_MSG_LIMIT_SET = 0x0004,
FMOP_MAX
};
/**
* FM API Command Return Codes (RC)
*
* CXL 2.0 v1.0 Table 150
*/
enum _FMRC {
FMRC_SUCCESS = 0x0000,
FMRC_BACKGROUND_OP_STARTED = 0x0001,
FMRC_INVALID_INPUT = 0x0002,
FMRC_UNSUPPORTED = 0x0003,
FMRC_INTERNAL_ERROR = 0x0004,
FMRC_RETRY_REQUIRED = 0x0005,
FMRC_BUSY = 0x0006,
FMRC_MEDIA_DISABLED = 0x0007,
FMRC_FW_TXFR_IN_PROGRESS = 0x0008,
FMRC_FW_TXFR_OUT_OF_ORDER = 0x0009,
FMRC_FW_AUTH_FAILED = 0x000A,
FMRC_FW_INVALID_SLOT = 0x000B,
FMRC_FW_ACTV_FAILED_ROLLED_BACK = 0x000C,
FMRC_FW_ACTV_FAILED_RESET_REQ = 0x000D,
FMRC_INVALID_HANDLE = 0x000E,
FMRC_INVALID_PHY_ADDR = 0x000F,
FMRC_POISON_LIMIT_REACHED = 0x0010,
FMRC_MEDIA_FAILURE = 0x0011,
FMRC_ABORTED = 0x0012,
FMRC_INVALID_SECURITY_STATE = 0x0013,
FMRC_INCORRECT_PASSPHRASE = 0x0014,
FMRC_UNSUPPORTED_MAILBOX = 0x0015,
FMRC_INVALID_PAYLOAD_LEN = 0x0016,
FMRC_MAX
};
/**
* Event Log (EL)
*
* CXL 2.0 v1.0 Table 87
*/
enum _FMEL {
FMEL_INFO = 0x00,
FMEL_WARN = 0x01,
FMEL_FAIL = 0x02,
FMEL_FATAL = 0x03,
FMEL_MAX
};
/**
* Current Port Configuration State (PS)
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMPS {
FMPS_DISABLED = 0,
FMPS_BINDING = 1,
FMPS_UNBINDING = 2,
FMPS_DSP = 3,
FMPS_USP = 4,
FMPS_FABRIC = 5,
FMPS_MAX = 6,
FMPS_INVALID = 0x0F
};
/**
* Connected Device CXL version (DV)
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMDV {
FMDV_NOT_CXL = 0,
FMDV_CXL1_1 = 1,
FMDV_CXL2_0 = 2,
FMDV_MAX
};
/**
* Connected Device Type (DT)
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMDT {
FMDT_NONE = 0,
FMDT_PCIE = 1,
FMDT_CXL_TYPE_1 = 2,
FMDT_CXL_TYPE_2 = 3,
FMDT_CXL_TYPE_3 = 4,
FMDT_CXL_TYPE_3_POOLED = 5,
FMDT_CXL_SWITCH = 6,
FMDT_MAX
};
/*
* Connected CXL Version (VC)
*
* CXL 2.0 v1.0 Table 92
* Bitmask fields for CXL version in fm_psc_port_info struct
*/
enum _FMVC {
FMCV_CXL1_1 = 0x01,
FMCV_CXL2_0 = 0x02,
FMCV_MAX
};
/**
* Negotiated Link Width (NW)
*
* CXL 2.0 v1.0 Table 92
* Also defined in linux/pci_regs.h
* - PCI_EXP_LNKSTA_NLW_X1
*/
enum _FMNW {
FMNW_X1 = PCI_EXP_LNKSTA_NLW_X1, // 0x0010
FMNW_X2 = PCI_EXP_LNKSTA_NLW_X2, // 0x0020
FMNW_X4 = PCI_EXP_LNKSTA_NLW_X4, // 0x0040
FMNW_X8 = PCI_EXP_LNKSTA_NLW_X8, // 0x0080
FMNW_MAX
};
/**
* PCIe Supported Link Speeds (SS) - Bitmask fields
*
* CXL 2.0 v1.0 Table 92
* Also defined in linux/pci_regs.h - PCI_EXP_LNKCAP2_SLS_XXXX
*/
enum _FMSS {
FMSS_PCIE1 = PCI_EXP_LNKCAP2_SLS_2_5GB, // 0x02
FMSS_PCIE2 = PCI_EXP_LNKCAP2_SLS_5_0GB, // 0x04
FMSS_PCIE3 = PCI_EXP_LNKCAP2_SLS_8_0GB, // 0x08
FMSS_PCIE4 = PCI_EXP_LNKCAP2_SLS_16_0GB, // 0x10
FMSS_PCIE5 = PCI_EXP_LNKCAP2_SLS_32_0GB, // 0x20
FMSS_PCIE6 = PCI_EXP_LNKCAP2_SLS_64_0GB // 0x40
};
/**
* PCIe Max Link Speed (MS)
*
* CXL 2.0 v1.0 Table 92
* Also matches fields for Current Link Speed
* Also defined in linux/pci_regs.h
* - PCI_EXP_LNKCAP_SLS_2_5GB - Link Capacity
* - PCI_EXP_LNKSTA_CLS_2_5GB - Current Link Speed
*/
enum _FMMS {
FMMS_PCIE1 = PCI_EXP_LNKCAP_SLS_2_5GB, // 1
FMMS_PCIE2 = PCI_EXP_LNKCAP_SLS_5_0GB, // 2
FMMS_PCIE3 = PCI_EXP_LNKCAP_SLS_8_0GB, // 3
FMMS_PCIE4 = PCI_EXP_LNKCAP_SLS_16_0GB, // 4
FMMS_PCIE5 = PCI_EXP_LNKCAP_SLS_32_0GB, // 5
FMMS_PCIE6 = PCI_EXP_LNKCAP_SLS_64_0GB, // 6
FMMS_MAX
};
/**
* LTSSM State - PCIe Link State (LS)
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMLS {
FMLS_DETECT = 0,
FMLS_POOLING = 1,
FMLS_CONFIGURATION = 2,
FMLS_RECOVERY = 3,
FMLS_L0 = 4,
FMLS_L0S = 5,
FMLS_L1 = 6,
FMLS_L2 = 7,
FMLS_DISABLED = 8,
FMLS_LOOPBACK = 9,
FMLS_HOT_RESET = 10,
FMLS_MAX
};
/**
* Link State Flags (LF) - Bitmask Shift
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMLF {
FMLF_LANE_REVERSAL_BIT = 0,
FMLF_PERST_STATE_BIT = 1,
FMLF_PRSNT_STATE_BIT = 2,
FMLF_PWRCTL_STATE_BIT = 3
};
/**
* PCIe Lane Reverse Ordering State (LO)
*
* CXL 2.0 v1.0 Table 92
*/
enum _FMLO {
FMLO_LANE_STANDARD_ORDERING = 0,
FMLO_LANE_REVERSE_ORDERING = 1,
FMLO_MAX
};
/**
* Port Opcode - Actions for Physical Port Control (PO)
*
* CXL 2.0 v1.0 Table 93
*/
enum _FMPO {
FMPO_ASSERT_PERST = 0x00,
FMPO_DEASSERT_PERST = 0x01,
FMPO_RESET_PPB = 0x02,
FMPO_MAX
};
/**
* VCS State (VS)
*
* CXL 2.0 v1.0 Table 99
*/
enum _FMVS {
FMVS_DISABLED = 0,
FMVS_ENABLED = 1,
FMVS_INVALID = 0xFF
};
#define FMVS_NUM 3
/**
* PBB Binding Status (BS)
*
* CXL 2.0 v1.0 Table 99
*/
enum _FMBS {
FMBS_UNBOUND = 0,
FMBS_INPROGRESS = 1,
FMBS_BOUND_PORT = 2,
FMBS_BOUND_LD = 3,
FMBS_MAX
};
/**
* Unbind option - For Unbind vPPB Command (UB)
*
* CXL 2.0 v1.0 Table 101
*/
enum _FMUB {
FMUB_WAIT = 0,
FMUB_MANAGED_HOT_REMOVE = 1,
FMUB_SURPRISE_HOT_REMOVE = 2,
FMUB_MAX
};
/**
* Memory Granularity - For Get LD Allocation Command (MG)
*
* CXL 2.0 v1.0 Table 112
*/
enum _FMMG {
FMMG_256MB = 0,
FMMG_512MB = 1,
FMMG_1GB = 2,
FMMG_MAX
};
/**
* QoS Telemetry Control (QT) - Bitmask
*
* CXL 2.0 v1.0 Table 116
*/
enum _FMQT {
FMQT_EGRESS_PORT_CONGESTION_BIT = 0x00,
FMQT_TEMP_THROUGHPUT_REDUCTION_BIT = 0x01,
FMQT_MAX
};
/**
* Physical Switch Event Record - Event Type (ET)
*
* CXL 2.0 v1.0 Table 120
*/
enum _FMET {
FMET_LINK_STATUS_CHANGE = 0,
FMET_SLOT_STATUS_REGISTER_UPDATED = 1,
FMET_MAX
};
/**
* Virtual CXL Switch Event Record - Event Type (VT)
*
* CXL 2.0 v1.0 Table 121
*/
enum _FMVT {
FMVT_BINDING_CHANGE = 0,
FMVT_SECONDARY_BUS_RESET = 1,
FMVT_LINK_CONTROL_REGISTER_UPDATED = 2,
FMVT_SLOT_CONTROL_REGISTER_UPDATED = 3,
FMVT_MAX
};
/**
* MLD Port Event Record - Event Type (MR)
*
* CXL 2.0 v1.0 Table 121
*/
enum _FMMR {
FMMR_CORRECTABLE_MSG_RECEIVED = 0,
FMMR_NONFATAL_MSG_RECEIVED = 1,
FMMR_FATAL_MSG_RECEIVED = 2,
FMMR_MAX
};
/**
* CXL.io Configuration Request Type (CT)
*
* CXL 2.0 v1.0 Table 94
*/
enum _FMCT {
FMCT_READ = 0,
FMCT_WRITE = 1,
FMCT_MAX
};
/* STRUCTS ===================================================================*/
/**
* FM API Protocol Header
*
* CXL 2.0 v1 Table 84
*/
struct fmapi_hdr
{
__u8 category : 4; //!< Type of FM API message [FMMT]
__u8 tag; //!< Tag used to track response messages
__u16 opcode; //!< enum _FMOP
__u8 background : 1; //!< Run operation in the background
__u32 len : 21; //!< Payload length in bytes
__u16 return_code; //!< enum _FMRC
__u16 ext_status; //!< Vendor Specific Extended Status
};
/**
* Identify (Opcode 0001h)
*
* Retrieves status information about the component, including whether it is ready to process
* commands. A component that is not ready to process commands shall return Retry Required.
*
* CXL 2.0 Errata Table X
*/
struct fmapi_isc_id_rsp
{
__u16 vid; //!< PCIe Vendor ID
__u16 did; //!< PCIe Device ID
__u16 svid; //!< PCIe Subsystem Vendor ID
__u16 ssid; //!< PCIe Subsystem ID
__u64 sn; //!< Device Serial Number
__u8 size; //!< Max msg size n where size = 2^n. Min 2^8=256B, Max 2^20=1MB
};
/**
* Get Response Message Limit - Response (Opcode 0003h)
*
* Retrieves the current configured response message limit used by the component.
*
* CXL 2.0 Errata Table Z
*/
struct fmapi_isc_msg_limit
{
__u8 limit; //!< Response Message Limit. n of 2^n.
};
/**
* Background Operation Status - Response (Opcode 0002h)
*
* Retrieves the current configured response message limit used by the component.
*
* CXL 2.0 Errata Table Y
*/
struct fmapi_isc_bos
{
__u8 running; //!< Indicates if a Background Operation is running. 0=not, 1=running
__u8 pcnt; //!< Percent Complete [0-100]
__u16 opcode; //!< Command Opcode of last command executed in the background
__u16 rc; //!< Return Code of last operation run in the back ground. Valid when pcnt=100
__u16 ext; //!< Vendor Specific Extedned Status. Valid when pcnt=100
};
/**
* Identify Switch Device (Opcode 5100h)
*
* CXL 2.0 v1.0 Table 89
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_id_rsp
{
__u8 ingress_port; //!< Ingress Port ID
__u8 num_ports; //!< Total number of physical ports
__u8 num_vcss; //!< Max number of VCSs
__u8 active_ports[FM_MAX_PORTS/8]; //!< Active physical port bitmask: enabled (1), disabled (0)
__u8 active_vcss[FM_MAX_VCS/8]; //!< Active VCS bitmask: enabled (1), disabled (0)
__u16 num_vppbs; //!< Max number of vPPBs
__u16 active_vppbs; //!< Number of active vPPBs
__u8 num_decoders; //!< Number of HDM decoders available per USP
};
/**
* Get Physical Port State - Request (Opcode 5101h)
*
* CXL 2.0 v1.0 Table 90
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_port_req
{
__u8 num; //!< Number of ports requested
__u8 ports[FM_MAX_PORTS]; //!< Variable length list __u8 port IDs
};
/**
* Get Physical Port State Port Info Block
*
* CXL 2.0 v1.0 Table 92
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_port_info
{
__u8 ppid; //!< Physical Port ID
__u8 state; //!< Current Port Configuration State [FMPS]
__u8 dv; //!< Connected Device CXL Version [FMDV]
__u8 dt; //!< Connected Device Type [FMDT]
__u8 cv; //!< Connected device CXL Version [FMCV]
__u8 mlw; //!< Max link width
__u8 nlw; //!< Negotiated link width [FMNW]
__u8 speeds; //!< Supported Link speeds vector [FMSS]
__u8 mls; //!< Max Link Speed [FMMS]
__u8 cls; //!< Current Link Speed [FMMS]
__u8 ltssm; //!< LTSSM State [FMLS]
__u8 lane; //!< First negotiated lane number
/* Link State Flags [FMLF] and [FMLO] */
__u8 lane_rev; //!< Lane reversal state. 0=standard, 1=rev [FMLO]
__u8 perst; //!< PCIe Reset State PERST#
__u8 prsnt; //!< Port Presence pin state PRSNT#
__u8 pwrctrl; //!< Power Control State (PWR_CTRL)
__u8 num_ld; //!< Supported Logical Device (LDs) count
};
/**
* Get Physical Port State - Response (Opcode 5101h)
*
* CXL 2.0 v1.0 Table 91
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_port_rsp
{
__u8 num; //!< num ports returned in this command
struct fmapi_psc_port_info list[FM_MAX_PORTS]; //!< Variable list of fm_psc_port_info structs
};
/**
* Physical Port Control (Opcode 5102h)
*
* CXL 2.0 v1.0 Table 93
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_port_ctrl_req
{
__u8 ppid; //!< Physical PPD ID which is the physical port number
__u8 opcode; //!< Port Opcode [FMPO]
};
/*
* Send PPB CXL.io Configuration - Request (Opcode 5103h)
*
* CXL 2.0 v1.0 Table 94
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_cfg_req
{
__u8 ppid; //!< PPB ID: Target PPB physical port
__u32 reg : 8 ; //!< Register Number as defined in PCIe spec
__u32 ext : 4 ; //!< Extended Register Number as defined in PCIe spec
__u32 fdbe : 4 ; //!< First DWord Byte Enable as defined in PCIe spec
__u32 type : 1 ; //!< Transation type [FMCT]
__u8 data[4]; //!< Transaction Data: Write data. Only valid for write transactions
};
/**
* Send PPB CXL.io Configuration - Response (Opcode 5103h)
*
* CXL 2.0 v1.0 Table 95
*
* Physical Switch Command Set (PSC)
*/
struct fmapi_psc_cfg_rsp
{
__u8 data[4]; //!< Return Data: Read data. Only valid for read transactions
};
/**
* Get Virtual CXL Switch Info - Request (Opcode 5200h)
*
* CXL 2.0 v1.0 Table 97
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_info_req
{
__u8 vppbid_start; //!< Starting vPPB IDa
__u8 vppbid_limit; //!< Max num of vPPB entries to include in the response
__u8 num; //!< Number of VCSs requested
__u8 vcss[FM_MAX_VCS]; //!< Variable list of VCS IDs: 1 byte ID of requested VCS, repeated num_vcs times
};
/**
* Get Virtual CXL Switch PPB Status Block
*
* CXL 2.0 v1.0 Table 99
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_ppb_stat_blk
{
__u8 status; //!< PBB Binding Status. [FMBS]
__u8 ppid; //!< PBB Physical Port ID
__u8 ldid; //!< PBB Bound LD ID. 0xFF if not bound to an LD
};
/**
* Get Virtual CXL Switch Info Block
*
* CXL 2.0 v1.0 Table 99
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_info_blk
{
__u8 vcsid; //!< Virtual CXL Switch ID
__u8 state; //!< VCS State [FMVS]
__u8 uspid; //!< USP ID. Upstream physical port ID
__u8 total; //!< Total Number of vPPBs in this VCS
__u8 num; //!< Number of vPPBs in this object
//!< Variable array of PPB Status Blocks:
struct fmapi_vsc_ppb_stat_blk list[FM_MAX_VPPBS];
};
/**
* Get Virtual CXL Switch Info - Response (Opcode 5200h)
*
* CXL 2.0 v1.0 Table 98
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_info_rsp
{
__u8 num; //!< Number of VCSs returned
//!< Variable Array of vcs info blocks
struct fmapi_vsc_info_blk list[FM_MAX_VCS_PER_RSP];
};
/**
* Bind vPPB (Opcode 5201h)
*
* CXL 2.0 v1.0 Table 100
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_bind_req
{
__u8 vcsid; //!< Virtual CXL Switch ID
__u8 vppbid; //!< vPPB ID: Index of the vPPB within the VCS specified in VCS_ID
__u8 ppid; //!< Physical Port ID
__u16 ldid; //!< LD ID if target port is an MLD. 0xFFFF otherwise
};
/**
* Unbind vPPB (Opcode 5202h)
*
* CXL 2.0 v1.0 Table 101
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_unbind_req
{
__u8 vcsid; //!< Virtual CXL Switch ID
__u8 vppbid; //!< vPPB ID: Index of the vPPB within the VCS specified in VCS_ID
__u8 option : 4; //!< Unbind Option [FMUB]
};
/**
* Generate AER Event (Opcode 5203h)
*
* CXL 2.0 v1.0 Table 102
*
* Virtual Switch Command Set (VSC)
*/
struct fmapi_vsc_aer_req
{
__u8 vcsid; //!< Virtual CXL Switch ID
__u8 vppbid; //!< vPPB ID: Index of the vPPB within the VCS specified in VCS_ID
__u32 error_type; //!< AER error type, as defined in the PCIe Specification
__u8 header[FM_TLP_HEADER]; //!< TLP Header to place in AER registers, as defined in the PCIe specification
};
/**
* Tunnel Management Command - Request (Opcode 5300h)
*
* CXL 2.0 v1.0 Table 104
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_tmc_req
{
__u8 ppid; //!< Egress port ID
__u16 len; //!< Command Size: Number of valid bytes in Management Command
__u8 type; //!< MCTP Message Type
__u8 msg[FMLN_MPC_TUNNEL_PAYLOAD]; //!< Management Command: Raw Message Body after MCPT Type Byte
};
/**
* Tunnel Management Command - Response (Opcode 5300h)
*
* CXL 2.0 v1.0 Table 105
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_tmc_rsp
{
__u8 type; //!< MCTP Message Type
__u16 len; //!< Response Length: Number of valid bytes in Response Message.
__u8 msg[FMLN_MPC_TUNNEL_PAYLOAD]; //!< Response Message: Sent by MLD. Variable in Length follows this struct
};
/**
* Send LD CXL.io Configuration - Request (Opcode 5301h)
*
* CXL 2.0 v1.0 Table 106
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_cfg_req
{
__u8 ppid; //!< PPB ID: Target PPB physical port
__u8 reg; //!< Register Number as defined in PCIe spec
__u8 ext : 4 ; //!< Extended Register Number as defined in PCIe spec
__u8 fdbe : 4 ; //!< First DWord Byte Enable as defined in PCIe spec
__u8 type : 1 ; //!< Transation type [FMCT]
__u16 ldid; //!< Target LD ID
__u8 data[4]; //!< Transaction Data. Only valid for write transactions
};
/**
* Send LD CXL.io Configuration - Response (Opcode 5301h)
*
* CXL 2.0 v1.0 Table 107
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_cfg_rsp
{
__u8 data[4]; //!< Return Data. Only valid for read transacitons
};
/**
* Send LD CXL.io Memory - Request (Opcode 5302h)
*
* CXL 2.0 v1.0 Table 108
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_mem_req
{
__u8 ppid; //!< Port ID. Target MLD port
__u32 fdbe : 4 ; //!< First DWord Byte Enable as defined in PCIe spec
__u32 ldbe : 4 ; //!< Last DWord Byte Enable as defined in PCIe spec
__u32 type : 1 ; //!< Transation type [FMCT]
__u16 ldid; //!< Target LD ID
__u16 len; //!< Transaction Length in bytes, max of 4 kB
__u64 offset; //!< Transaction Offset into target device mem space
__u8 data[FM_LD_MEM_REQ_LEN]; //!< Transacrtion Data. Only valid for write transactions
};
/**
* Send LD CXL.io Memory - Response (Opcode 5302h)
*
* CXL 2.0 v1.0 Table 109
*
* MLD Port Command Set (MPC)
*/
struct fmapi_mpc_mem_rsp
{
__u16 len; //!< Return Size: Number of successfully transferred bytes
__u8 data[FM_LD_MEM_REQ_LEN]; //!< Transacrtion Data. Only valid for read transactions
};
/**
* Get LD Info (Opcode 5400h)
*
* CXL 2.0 v1.0 Table 111
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_info_rsp
{
__u64 size; //!< Memory Size: Total device memory capacity
__u16 num; //!< LD Count: Number of logical devices supported
/* QoS Telemetry Fields */
__u8 epc; //!< Egress Port Congestion Supported [FMQT]
__u8 ttr; //!< Temporary Throughput Reduction Supported [FMQT]
};
/**
* Get LD Allocations List Format (Opcode 5401h)
*
* CXL 2.0 v1.0 Table 113
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_alloc_blk
{
__u64 rng1; //!< Range 1 Allocation Multiplier: Memory allocation range 1 for LD. This value is multiplied with Memory Granularity to calculate memory allocation range in bytes.
__u64 rng2; //!< Range 2 Allocation Multiplier: Memory allocation range 2 for LD. This value is multiplied with Memory Granularity to calculate memory allocation range in bytes.
};
/**
* Get LD Allocations - Request (Opcode 5401h)
*
* CXL 2.0 Errata Table Z
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_alloc_get_req
{
__u8 start; //!< LD ID of the first LD in the allocation list
__u8 limit; //!< Max num of LD information blocks to return
};
/**
* Get LD Allocations - Response (Opcode 5401h)
*
* CXL 2.0 v1.0 Table 112
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_alloc_get_rsp
{
__u8 total; //!< Total number of Logical Deviecs supported by this device
__u8 granularity; //!< Memory Granularity: Specifies the granularity of the memory sizes configured for each LD: [FMMG]
__u8 start; //!< LD ID of the first LD in the list
__u8 num; //!< Num LDs returned in this object
//!< Variable number of LD Allocation List Blocks
struct fmapi_mcc_alloc_blk list[FM_MAX_NUM_LD];
};
/**
* Set LD Allocations - Request (Opcode 5402h)
*
* CXL 2.0 v1.0 Table 114
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_alloc_set_req
{
__u8 num; //!< Number of LDs: Number of LDs to configure
__u8 start; //!< LD ID of the first entry in the list
//!< Variable number of LD Allocation List Blocks
struct fmapi_mcc_alloc_blk list[FM_MAX_NUM_LD];
};
/**
* Set LD Allocations - Response (Opcode 5402h)
*
* CXL 2.0 v1.0 Table 115
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_alloc_set_rsp
{
__u8 num; //!< Number of LDs: Number of LDs configured
__u8 start; //!< LD ID of the first entry in the list
//!< Variable number of LD Allocation List Blocks
struct fmapi_mcc_alloc_blk list[FM_MAX_NUM_LD];
};
/**
* QoS Control Payload (Opcodes 5403h, 5404h, 5405h)
*
* CXL 2.0 v1.0 Table 116
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
* This structure is the same for multiple request and response payloads
*/
struct fmapi_mcc_qos_ctrl
{
__u8 epc_en; //!< QoS Telem: Egress Port Congestion Enable. Bitfield [FMQT]
__u8 ttr_en; //!< QoS Telem: Temporary Throuhput Reduction Enable. Bitfield [FMQT]
__u8 egress_mod_pcnt; //!< Egress Moderate Percentage: Threshold in percent for Egress Port Congestion mechanism to indicate moderate congestion. Valid range is 1-100. Default is 10.
__u8 egress_sev_pcnt; //!< Egress Severe Percentage: Threshold in percent for Egress Port Congestion mechanism to indicate severe congestion. Valid range is 1-100. Default is 25
__u8 sample_interval; //!< Backpressure Sample Interval: Interval in ns for Egress Port Congestion mechanism to take samples. Valid range is 0-15. Default is 8 (800 ns of history). Value of 0 disables the mechanism.
__u16 rcb; //!< ReqCmpBasis. Estimated maximum sustained sum of requests and recent responses across the entire device, serving as the basis for QoS Limit Fraction. Valid range is 0-65,535. Value of 0 disables the mechanism. Default is 0.
__u8 comp_interval; //!< Completion Collection Interval: Interval in ns for Completion Counting mechanism to collect the number of transmitted responses in a single counter. Valid range is 0-255. Default is 64
};
#define fmapi_mcc_get_qos_ctrl_rsp fmapi_mcc_qos_ctrl
#define fmapi_mcc_set_qos_ctrl_req fmapi_mcc_qos_ctrl
#define fmapi_mcc_set_qos_ctrl_rsp fmapi_mcc_qos_ctrl
/**
* Get QoS Status (Opcode 5405h)
*
* CXL 2.0 v1.0 Table 117
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
*/
struct fmapi_mcc_qos_stat_rsp
{
__u8 bp_avg_pcnt; //!< Backpressure Average Percentage: Current snapshot of the measured Egress Port average congestion.
};
/**
* Get QoS Allocated BW - Request (Opcode 5406h)
*
* CXL 2.0 Errata Table A
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
* The payload of this command is just an array of __u8 bytes
*/
struct fmapi_mcc_qos_bw_alloc_get_req
{
__u8 num; //!< Number of LDs requested
__u8 start; //!< LD ID of the first entry in the list
};
/**
* QoS Allocated BW Payload (Opcodes 5406h, 5407h)
*
* CXL 2.0 v1.0 Table 118
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
* The payload of this command is just an array of __u8 bytes
*/
struct fmapi_mcc_qos_bw_alloc
{
__u8 num; //!< Number of LDs
__u8 start; //!< LD ID of the first entry in the list
__u8 list[FM_MAX_NUM_LD]; //!< QoS Allocation Fraction: Byte array of allocated bandwidth fractions, where n = LD Count, as returned by the Get LD Info command. The valid range of each array element is 0-255. Default value is 0. Value in each byte is the fraction multiplied by 256.
};
/**
* Get QoS BW Limit - Request (Opcode 5408h)
*
* CXL 2.0 Errata Table B
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
* The payload of this command is just an array of __u8 bytes
*/
struct fmapi_mcc_qos_bw_limit_get_req
{
__u8 num; //!< Number of LDs requested
__u8 start; //!< LD ID of the first entry in the list
};
/**
* QoS BW Limit payload (Opcodes 5408h, 5409h)
*
* CXL 2.0 v1.0 Table 119
*
* MLD Component Command Set (MCC)
* These commands are passed to the MLD using the Tunnel Management Command
* The payload of this command is just an array of __u8 bytes
*/
struct fmapi_mcc_qos_bw_limit
{
__u8 num;
__u8 start;
__u8 list[FM_MAX_NUM_LD]; //!< QoS Limit Fraction: Byte array of allocated bandwidth limit fractions, where n = LD Count, as returned by the Get QoS BW command. The valid range of each array element is 0-255. Default value is 0. Value in each byte is the fraction multiplied by 256.
};
/**
* This struct is to store the serialized FM API header and object
*/
struct __attribute__((__packed__)) fmapi_buf
{
__u8 hdr[FMLN_HDR]; //!< Buffer to store serialized FM API Header
__u8 payload[FMLN_PAYLOAD]; //!< Buffer to store serialized FM API Message Payload
};
/**
* FM API Message
*/
struct fmapi_msg
{
struct fmapi_hdr hdr; //!< FM API Header
struct fmapi_buf *buf; //!< Pointer to use to cast a mctp_msg buffer
//!< This union is to store the deserialized object
union
{
struct fmapi_isc_id_rsp isc_id_rsp;
struct fmapi_isc_msg_limit isc_msg_limit;
struct fmapi_isc_bos isc_bos;
struct fmapi_psc_id_rsp psc_id_rsp;
struct fmapi_psc_port_req psc_port_req;
struct fmapi_psc_port_rsp psc_port_rsp;
struct fmapi_psc_port_ctrl_req psc_port_ctrl_req;
struct fmapi_psc_cfg_req psc_cfg_req;
struct fmapi_psc_cfg_rsp psc_cfg_rsp;
struct fmapi_vsc_info_req vsc_info_req;
struct fmapi_vsc_info_rsp vsc_info_rsp;
struct fmapi_vsc_bind_req vsc_bind_req;
struct fmapi_vsc_unbind_req vsc_unbind_req;
struct fmapi_vsc_aer_req vsc_aer_req;
struct fmapi_mpc_tmc_req mpc_tmc_req;
struct fmapi_mpc_tmc_rsp mpc_tmc_rsp;
struct fmapi_mpc_cfg_req mpc_cfg_req;
struct fmapi_mpc_cfg_rsp mpc_cfg_rsp;
struct fmapi_mpc_mem_req mpc_mem_req;
struct fmapi_mpc_mem_rsp mpc_mem_rsp;
struct fmapi_mcc_info_rsp mcc_info_rsp;
struct fmapi_mcc_alloc_get_req mcc_alloc_get_req;
struct fmapi_mcc_alloc_get_rsp mcc_alloc_get_rsp;
struct fmapi_mcc_alloc_set_req mcc_alloc_set_req;
struct fmapi_mcc_alloc_set_rsp mcc_alloc_set_rsp;
struct fmapi_mcc_qos_ctrl mcc_qos_ctrl;
struct fmapi_mcc_qos_stat_rsp mcc_qos_stat_rsp;
struct fmapi_mcc_qos_bw_alloc_get_req mcc_qos_bw_alloc_get_req;
struct fmapi_mcc_qos_bw_alloc mcc_qos_bw_alloc;
struct fmapi_mcc_qos_bw_limit_get_req mcc_qos_bw_limit_get_req;
struct fmapi_mcc_qos_bw_limit mcc_qos_bw_limit;
} obj;
};
/* GLOBAL VARIABLES ==========================================================*/
/* PROTOTYPES ================================================================*/
/**
* @brief Convert from a Little Endian byte array to a struct
*
* @param[out] dst void Pointer to destination struct
* @param[in] src void Pointer to unsigned char array
* @param[in] type unsigned enum _FMOB representing type of object to deserialize
* @param[in] param void * to data needed to deserialize the byte stream
* (e.g. count of objects to expect in the stream)
* @return number of bytes consumed. 0 upon error otherwise.
*/
int fmapi_deserialize(void *dst, __u8 *src, unsigned type, void *param);
/**
* Convenience function to populate a fmapi_hdr object
*
* @param[out] fh struct fmapi_hdr* to fill in
* @param[in] category __u8 Request / Response [FMMT]
* @param[in] tag __u8
* @param[in] opcode __u16
* @param[in] background __u8
* @param[in] len __u32 Length of payload in bytes
* @param[in] return_code __u16
* @param[in] ext_status __u16
* @return Returns the length of the mctp_msg payload (HDR + Obj)
*/
int fmapi_fill_hdr
(
struct fmapi_hdr *fh,
__u8 category, //!< Type of FM API message [FMMT] (4 bit field)
__u8 tag, //!< Tag used to track response messages
__u16 opcode, //!< enum _FMOP
__u8 background, //!< Run operation in the background (1 bit field)
__u32 len, //!< Payload length in bytes (21 bit field)
__u16 return_code, //!< enum _FMRC
__u16 ext_status //!< Vendor Specific Extended Status
);
int fmapi_fill_isc_id(struct fmapi_msg *m);
int fmapi_fill_isc_bos(struct fmapi_msg *m);
int fmapi_fill_isc_get_msg_limit(struct fmapi_msg *m);
int fmapi_fill_isc_set_msg_limit(struct fmapi_msg *m, __u8 limit);
int fmapi_fill_mcc_get_alloc(struct fmapi_msg *m, int start, int limit);
int fmapi_fill_mcc_get_info(struct fmapi_msg *m);
int fmapi_fill_mcc_get_qos_alloc(struct fmapi_msg *m, int start, int limit);
int fmapi_fill_mcc_get_qos_ctrl(struct fmapi_msg *m);
int fmapi_fill_mcc_get_qos_limit(struct fmapi_msg *m, int start, int limit);
int fmapi_fill_mcc_get_qos_status(struct fmapi_msg *m);
int fmapi_fill_mcc_set_alloc(struct fmapi_msg *m, int start, int num, __u64 *rng1, __u64 *rng2);
int fmapi_fill_mcc_set_qos_alloc(struct fmapi_msg *m, int start, int num, __u8 *list);
int fmapi_fill_mcc_set_qos_ctrl(struct fmapi_msg *m, int epc, int ttr, int mod, int sev, int si, int rcb, int ci);
int fmapi_fill_mcc_set_qos_limit(struct fmapi_msg *m, int start, int num, __u8 *list);
int fmapi_fill_mpc_tmc(struct fmapi_msg *m, int ppid, int type, struct fmapi_msg *sub);
int fmapi_fill_mpc_cfg(struct fmapi_msg *m, int ppid, int ldid, int reg, int ext, int fdbe, int type, __u8 *data);
int fmapi_fill_mpc_mem(struct fmapi_msg *m, int ppid, int ldid, __u64 offset, int len, int fdbe, int ldbe, int type, __u8 *data);
int fmapi_fill_psc_cfg(struct fmapi_msg *m, int ppid, int reg, int ext, int fdbe, int type, __u8 *data);
int fmapi_fill_psc_id(struct fmapi_msg *m);
int fmapi_fill_psc_get_all_ports(struct fmapi_msg *m);
int fmapi_fill_psc_get_port(struct fmapi_msg *m, __u8 port);
int fmapi_fill_psc_get_ports(struct fmapi_msg *m, int num, __u8 *list);
int fmapi_fill_psc_port_ctrl(struct fmapi_msg *m, int ppid, int opcode);
int fmapi_fill_vsc_aer(struct fmapi_msg *m, int vcsid, int vppbid, __u32 type, __u8 *header);
int fmapi_fill_vsc_bind(struct fmapi_msg *m, int vcsid, int vppbid, int ppid, int ldid);
int fmapi_fill_vsc_get_vcs(struct fmapi_msg *m, int vcsid, int start, int limit);
int fmapi_fill_vsc_unbind(struct fmapi_msg *m, int vcsid, int vppbid, int option);
/**
* Determine the Request Object Identifier [FMOB] for an FM API Message Opcode [FMOP]
*
* @param opcode This is an FM API Opcode [FMOP]
* @return int Returns the FM API Object Identifier [FMOB] used in a Request
*/
int fmapi_fmob_req(unsigned int opcode);
/**
* Determine the Response Object Identifier [FMOB] for an FM API Message Opcode [FMOP]
*
* @param opcode This is an FM API Opcode [FMOP]
* @return int Returns the FM API Object Identifier [FMOB] used in a Response
*/
int fmapi_fmob_rsp(unsigned int opcode);
/**
* @brief Convert an object into Little Endian byte array format
*
* @param[out] dst void Pointer to destination unsigned char array
* @param[in] src void Pointer to object to serialize
* @param[in] type unsigned enum _FMOB representing type of object to serialize
* @return number of serialized bytes, 0 if error
*/
int fmapi_serialize(__u8 *dst, void *src, unsigned type);
/**
* Print an object to the screen
*
* @param ptr A pointer to the object to print
* @param type The type of object to be printed from enum _FMOB
*/
void fmapi_prnt(void *ptr, unsigned type);
/* Functions to return a string representation of an object*/
const char *fmbs(unsigned int u);
const char *fmct(unsigned int u);
const char *fmdt(unsigned int u);
const char *fmdv(unsigned int u);
const char *fmet(unsigned int u);
const char *fmlf(unsigned int u);
const char *fmlo(unsigned int u);
const char *fmls(unsigned int u);
const char *fmmg(unsigned int u);
const char *fmmr(unsigned int u);
const char *fmms(unsigned int u);
const char *fmmt(unsigned int u);
const char *fmnw(unsigned int u);
const char *fmop(unsigned int u);
const char *fmpo(unsigned int u);
const char *fmps(unsigned int u);
const char *fmqt(unsigned int u);
const char *fmrc(unsigned int u);
const char *fmss(unsigned int u);
const char *fmub(unsigned int u);
const char *fmvc(unsigned int u);
const char *fmvs(unsigned int u);
const char *fmvt(unsigned int u);
#endif //ifndef _FMAPI_H