1*99a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2*99a2dd95SBruce Richardson * Copyright 2020 Mellanox Technologies, Ltd 3*99a2dd95SBruce Richardson */ 4*99a2dd95SBruce Richardson 5*99a2dd95SBruce Richardson #ifndef _RTE_ECPRI_H_ 6*99a2dd95SBruce Richardson #define _RTE_ECPRI_H_ 7*99a2dd95SBruce Richardson 8*99a2dd95SBruce Richardson /** 9*99a2dd95SBruce Richardson * @file 10*99a2dd95SBruce Richardson * 11*99a2dd95SBruce Richardson * eCPRI headers definition. 12*99a2dd95SBruce Richardson * 13*99a2dd95SBruce Richardson * eCPRI (Common Public Radio Interface) is used in internal interfaces 14*99a2dd95SBruce Richardson * of radio base station in a 5G infrastructure. 15*99a2dd95SBruce Richardson */ 16*99a2dd95SBruce Richardson 17*99a2dd95SBruce Richardson #include <stdint.h> 18*99a2dd95SBruce Richardson #include <rte_byteorder.h> 19*99a2dd95SBruce Richardson 20*99a2dd95SBruce Richardson /* 21*99a2dd95SBruce Richardson * eCPRI Protocol Revision 1.0, 1.1, 1.2, 2.0: 0001b 22*99a2dd95SBruce Richardson * Other values are reserved for future 23*99a2dd95SBruce Richardson */ 24*99a2dd95SBruce Richardson #define RTE_ECPRI_REV_UP_TO_20 1 25*99a2dd95SBruce Richardson 26*99a2dd95SBruce Richardson /* 27*99a2dd95SBruce Richardson * eCPRI message types in specifications 28*99a2dd95SBruce Richardson * IWF* types will only be supported from rev.2 29*99a2dd95SBruce Richardson * 12-63: Reserved for future revision 30*99a2dd95SBruce Richardson * 64-255: Vendor Specific 31*99a2dd95SBruce Richardson */ 32*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_IQ_DATA 0 33*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_BIT_SEQ 1 34*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_RTC_CTRL 2 35*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_GEN_DATA 3 36*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_RM_ACC 4 37*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_DLY_MSR 5 38*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_RMT_RST 6 39*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_EVT_IND 7 40*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_IWF_UP 8 41*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_IWF_OPT 9 42*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_IWF_MAP 10 43*99a2dd95SBruce Richardson #define RTE_ECPRI_MSG_TYPE_IWF_DCTRL 11 44*99a2dd95SBruce Richardson 45*99a2dd95SBruce Richardson /* 46*99a2dd95SBruce Richardson * Event Type of Message Type #7: Event Indication 47*99a2dd95SBruce Richardson * 0x00: Fault(s) Indication 48*99a2dd95SBruce Richardson * 0x01: Fault(s) Indication Acknowledge 49*99a2dd95SBruce Richardson * 0x02: Notification(s) Indication 50*99a2dd95SBruce Richardson * 0x03: Synchronization Request 51*99a2dd95SBruce Richardson * 0x04: Synchronization Acknowledge 52*99a2dd95SBruce Richardson * 0x05: Synchronization End Indication 53*99a2dd95SBruce Richardson * 0x06...0xFF: Reserved 54*99a2dd95SBruce Richardson */ 55*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_FAULT_IND 0x00 56*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_FAULT_ACK 0x01 57*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_NTFY_IND 0x02 58*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_SYNC_REQ 0x03 59*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_SYNC_ACK 0x04 60*99a2dd95SBruce Richardson #define RTE_ECPRI_EVT_IND_SYNC_END 0x05 61*99a2dd95SBruce Richardson 62*99a2dd95SBruce Richardson /** 63*99a2dd95SBruce Richardson * eCPRI Common Header 64*99a2dd95SBruce Richardson */ 65*99a2dd95SBruce Richardson struct rte_ecpri_common_hdr { 66*99a2dd95SBruce Richardson union { 67*99a2dd95SBruce Richardson rte_be32_t u32; /**< 4B common header in BE */ 68*99a2dd95SBruce Richardson struct { 69*99a2dd95SBruce Richardson #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 70*99a2dd95SBruce Richardson uint32_t size:16; /**< Payload Size */ 71*99a2dd95SBruce Richardson uint32_t type:8; /**< Message Type */ 72*99a2dd95SBruce Richardson uint32_t c:1; /**< Concatenation Indicator */ 73*99a2dd95SBruce Richardson uint32_t res:3; /**< Reserved */ 74*99a2dd95SBruce Richardson uint32_t revision:4; /**< Protocol Revision */ 75*99a2dd95SBruce Richardson #elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN 76*99a2dd95SBruce Richardson uint32_t revision:4; /**< Protocol Revision */ 77*99a2dd95SBruce Richardson uint32_t res:3; /**< Reserved */ 78*99a2dd95SBruce Richardson uint32_t c:1; /**< Concatenation Indicator */ 79*99a2dd95SBruce Richardson uint32_t type:8; /**< Message Type */ 80*99a2dd95SBruce Richardson uint32_t size:16; /**< Payload Size */ 81*99a2dd95SBruce Richardson #endif 82*99a2dd95SBruce Richardson }; 83*99a2dd95SBruce Richardson }; 84*99a2dd95SBruce Richardson }; 85*99a2dd95SBruce Richardson 86*99a2dd95SBruce Richardson /** 87*99a2dd95SBruce Richardson * eCPRI Message Header of Type #0: IQ Data 88*99a2dd95SBruce Richardson */ 89*99a2dd95SBruce Richardson struct rte_ecpri_msg_iq_data { 90*99a2dd95SBruce Richardson rte_be16_t pc_id; /**< Physical channel ID */ 91*99a2dd95SBruce Richardson rte_be16_t seq_id; /**< Sequence ID */ 92*99a2dd95SBruce Richardson }; 93*99a2dd95SBruce Richardson 94*99a2dd95SBruce Richardson /** 95*99a2dd95SBruce Richardson * eCPRI Message Header of Type #1: Bit Sequence 96*99a2dd95SBruce Richardson */ 97*99a2dd95SBruce Richardson struct rte_ecpri_msg_bit_seq { 98*99a2dd95SBruce Richardson rte_be16_t pc_id; /**< Physical channel ID */ 99*99a2dd95SBruce Richardson rte_be16_t seq_id; /**< Sequence ID */ 100*99a2dd95SBruce Richardson }; 101*99a2dd95SBruce Richardson 102*99a2dd95SBruce Richardson /** 103*99a2dd95SBruce Richardson * eCPRI Message Header of Type #2: Real-Time Control Data 104*99a2dd95SBruce Richardson */ 105*99a2dd95SBruce Richardson struct rte_ecpri_msg_rtc_ctrl { 106*99a2dd95SBruce Richardson rte_be16_t rtc_id; /**< Real-Time Control Data ID */ 107*99a2dd95SBruce Richardson rte_be16_t seq_id; /**< Sequence ID */ 108*99a2dd95SBruce Richardson }; 109*99a2dd95SBruce Richardson 110*99a2dd95SBruce Richardson /** 111*99a2dd95SBruce Richardson * eCPRI Message Header of Type #3: Generic Data Transfer 112*99a2dd95SBruce Richardson */ 113*99a2dd95SBruce Richardson struct rte_ecpri_msg_gen_data { 114*99a2dd95SBruce Richardson rte_be32_t pc_id; /**< Physical channel ID */ 115*99a2dd95SBruce Richardson rte_be32_t seq_id; /**< Sequence ID */ 116*99a2dd95SBruce Richardson }; 117*99a2dd95SBruce Richardson 118*99a2dd95SBruce Richardson /** 119*99a2dd95SBruce Richardson * eCPRI Message Header of Type #4: Remote Memory Access 120*99a2dd95SBruce Richardson */ 121*99a2dd95SBruce Richardson struct rte_ecpri_msg_rm_access { 122*99a2dd95SBruce Richardson #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 123*99a2dd95SBruce Richardson uint32_t ele_id:16; /**< Element ID */ 124*99a2dd95SBruce Richardson uint32_t rr:4; /**< Req/Resp */ 125*99a2dd95SBruce Richardson uint32_t rw:4; /**< Read/Write */ 126*99a2dd95SBruce Richardson uint32_t rma_id:8; /**< Remote Memory Access ID */ 127*99a2dd95SBruce Richardson #elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN 128*99a2dd95SBruce Richardson uint32_t rma_id:8; /**< Remote Memory Access ID */ 129*99a2dd95SBruce Richardson uint32_t rw:4; /**< Read/Write */ 130*99a2dd95SBruce Richardson uint32_t rr:4; /**< Req/Resp */ 131*99a2dd95SBruce Richardson uint32_t ele_id:16; /**< Element ID */ 132*99a2dd95SBruce Richardson #endif 133*99a2dd95SBruce Richardson uint8_t addr[6]; /**< 48-bits address */ 134*99a2dd95SBruce Richardson rte_be16_t length; /**< number of bytes */ 135*99a2dd95SBruce Richardson }; 136*99a2dd95SBruce Richardson 137*99a2dd95SBruce Richardson /** 138*99a2dd95SBruce Richardson * eCPRI Message Header of Type #5: One-Way Delay Measurement 139*99a2dd95SBruce Richardson */ 140*99a2dd95SBruce Richardson struct rte_ecpri_msg_delay_measure { 141*99a2dd95SBruce Richardson uint8_t msr_id; /**< Measurement ID */ 142*99a2dd95SBruce Richardson uint8_t act_type; /**< Action Type */ 143*99a2dd95SBruce Richardson }; 144*99a2dd95SBruce Richardson 145*99a2dd95SBruce Richardson /** 146*99a2dd95SBruce Richardson * eCPRI Message Header of Type #6: Remote Reset 147*99a2dd95SBruce Richardson */ 148*99a2dd95SBruce Richardson struct rte_ecpri_msg_remote_reset { 149*99a2dd95SBruce Richardson rte_be16_t rst_id; /**< Reset ID */ 150*99a2dd95SBruce Richardson uint8_t rst_op; /**< Reset Code Op */ 151*99a2dd95SBruce Richardson }; 152*99a2dd95SBruce Richardson 153*99a2dd95SBruce Richardson /** 154*99a2dd95SBruce Richardson * eCPRI Message Header of Type #7: Event Indication 155*99a2dd95SBruce Richardson */ 156*99a2dd95SBruce Richardson struct rte_ecpri_msg_event_ind { 157*99a2dd95SBruce Richardson uint8_t evt_id; /**< Event ID */ 158*99a2dd95SBruce Richardson uint8_t evt_type; /**< Event Type */ 159*99a2dd95SBruce Richardson uint8_t seq; /**< Sequence Number */ 160*99a2dd95SBruce Richardson uint8_t number; /**< Number of Faults/Notif */ 161*99a2dd95SBruce Richardson }; 162*99a2dd95SBruce Richardson 163*99a2dd95SBruce Richardson /** 164*99a2dd95SBruce Richardson * eCPRI Combined Message Header Format: Common Header + Message Types 165*99a2dd95SBruce Richardson */ 166*99a2dd95SBruce Richardson struct rte_ecpri_combined_msg_hdr { 167*99a2dd95SBruce Richardson struct rte_ecpri_common_hdr common; 168*99a2dd95SBruce Richardson union { 169*99a2dd95SBruce Richardson struct rte_ecpri_msg_iq_data type0; 170*99a2dd95SBruce Richardson struct rte_ecpri_msg_bit_seq type1; 171*99a2dd95SBruce Richardson struct rte_ecpri_msg_rtc_ctrl type2; 172*99a2dd95SBruce Richardson struct rte_ecpri_msg_gen_data type3; 173*99a2dd95SBruce Richardson struct rte_ecpri_msg_rm_access type4; 174*99a2dd95SBruce Richardson struct rte_ecpri_msg_delay_measure type5; 175*99a2dd95SBruce Richardson struct rte_ecpri_msg_remote_reset type6; 176*99a2dd95SBruce Richardson struct rte_ecpri_msg_event_ind type7; 177*99a2dd95SBruce Richardson rte_be32_t dummy[3]; 178*99a2dd95SBruce Richardson }; 179*99a2dd95SBruce Richardson }; 180*99a2dd95SBruce Richardson 181*99a2dd95SBruce Richardson #endif /* _RTE_ECPRI_H_ */ 182