1325 lines
40 KiB
C
1325 lines
40 KiB
C
/* 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
|