1*c6b012a2SVijay Sundar Selvamani /* SPDX-License-Identifier: GPL-2.0-only */ 2*c6b012a2SVijay Sundar Selvamani /* Copyright (c) 2025 Intel Corporation. */ 3*c6b012a2SVijay Sundar Selvamani #ifndef ADF_GEN6_TL_H 4*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_H 5*c6b012a2SVijay Sundar Selvamani 6*c6b012a2SVijay Sundar Selvamani #include <linux/types.h> 7*c6b012a2SVijay Sundar Selvamani 8*c6b012a2SVijay Sundar Selvamani struct adf_tl_hw_data; 9*c6b012a2SVijay Sundar Selvamani 10*c6b012a2SVijay Sundar Selvamani /* Computation constants. */ 11*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_CPP_NS_PER_CYCLE 2 12*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_BW_HW_UNITS_TO_BYTES 64 13*c6b012a2SVijay Sundar Selvamani 14*c6b012a2SVijay Sundar Selvamani /* Maximum aggregation time. Value is in milliseconds. */ 15*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_MAX_AGGR_TIME_MS 4000 16*c6b012a2SVijay Sundar Selvamani /* Number of buffers to store historic values. */ 17*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_NUM_HIST_BUFFS \ 18*c6b012a2SVijay Sundar Selvamani (ADF_GEN6_TL_MAX_AGGR_TIME_MS / ADF_TL_DATA_WR_INTERVAL_MS) 19*c6b012a2SVijay Sundar Selvamani 20*c6b012a2SVijay Sundar Selvamani /* Max number of HW resources of one type */ 21*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_MAX_SLICES_PER_TYPE 32 22*c6b012a2SVijay Sundar Selvamani #define MAX_ATH_SL_COUNT 7 23*c6b012a2SVijay Sundar Selvamani #define MAX_CNV_SL_COUNT 2 24*c6b012a2SVijay Sundar Selvamani #define MAX_DCPRZ_SL_COUNT 2 25*c6b012a2SVijay Sundar Selvamani #define MAX_PKE_SL_COUNT 32 26*c6b012a2SVijay Sundar Selvamani #define MAX_UCS_SL_COUNT 4 27*c6b012a2SVijay Sundar Selvamani #define MAX_WAT_SL_COUNT 5 28*c6b012a2SVijay Sundar Selvamani #define MAX_WCP_SL_COUNT 5 29*c6b012a2SVijay Sundar Selvamani 30*c6b012a2SVijay Sundar Selvamani #define MAX_ATH_CMDQ_COUNT 14 31*c6b012a2SVijay Sundar Selvamani #define MAX_CNV_CMDQ_COUNT 6 32*c6b012a2SVijay Sundar Selvamani #define MAX_DCPRZ_CMDQ_COUNT 6 33*c6b012a2SVijay Sundar Selvamani #define MAX_PKE_CMDQ_COUNT 32 34*c6b012a2SVijay Sundar Selvamani #define MAX_UCS_CMDQ_COUNT 12 35*c6b012a2SVijay Sundar Selvamani #define MAX_WAT_CMDQ_COUNT 35 36*c6b012a2SVijay Sundar Selvamani #define MAX_WCP_CMDQ_COUNT 35 37*c6b012a2SVijay Sundar Selvamani 38*c6b012a2SVijay Sundar Selvamani /* Max number of simultaneously monitored ring pairs. */ 39*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_MAX_RP_NUM 4 40*c6b012a2SVijay Sundar Selvamani 41*c6b012a2SVijay Sundar Selvamani /** 42*c6b012a2SVijay Sundar Selvamani * struct adf_gen6_tl_slice_data_regs - HW slice data as populated by FW. 43*c6b012a2SVijay Sundar Selvamani * @reg_tm_slice_exec_cnt: Slice execution count. 44*c6b012a2SVijay Sundar Selvamani * @reg_tm_slice_util: Slice utilization. 45*c6b012a2SVijay Sundar Selvamani */ 46*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs { 47*c6b012a2SVijay Sundar Selvamani __u32 reg_tm_slice_exec_cnt; 48*c6b012a2SVijay Sundar Selvamani __u32 reg_tm_slice_util; 49*c6b012a2SVijay Sundar Selvamani }; 50*c6b012a2SVijay Sundar Selvamani 51*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_SLICE_REG_SZ sizeof(struct adf_gen6_tl_slice_data_regs) 52*c6b012a2SVijay Sundar Selvamani 53*c6b012a2SVijay Sundar Selvamani /** 54*c6b012a2SVijay Sundar Selvamani * struct adf_gen6_tl_cmdq_data_regs - HW CMDQ data as populated by FW. 55*c6b012a2SVijay Sundar Selvamani * @reg_tm_cmdq_wait_cnt: CMDQ wait count. 56*c6b012a2SVijay Sundar Selvamani * @reg_tm_cmdq_exec_cnt: CMDQ execution count. 57*c6b012a2SVijay Sundar Selvamani * @reg_tm_cmdq_drain_cnt: CMDQ drain count. 58*c6b012a2SVijay Sundar Selvamani */ 59*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs { 60*c6b012a2SVijay Sundar Selvamani __u32 reg_tm_cmdq_wait_cnt; 61*c6b012a2SVijay Sundar Selvamani __u32 reg_tm_cmdq_exec_cnt; 62*c6b012a2SVijay Sundar Selvamani __u32 reg_tm_cmdq_drain_cnt; 63*c6b012a2SVijay Sundar Selvamani __u32 reserved; 64*c6b012a2SVijay Sundar Selvamani }; 65*c6b012a2SVijay Sundar Selvamani 66*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_CMDQ_REG_SZ sizeof(struct adf_gen6_tl_cmdq_data_regs) 67*c6b012a2SVijay Sundar Selvamani 68*c6b012a2SVijay Sundar Selvamani /** 69*c6b012a2SVijay Sundar Selvamani * struct adf_gen6_tl_device_data_regs - This structure stores device telemetry 70*c6b012a2SVijay Sundar Selvamani * counter values as are being populated periodically by device. 71*c6b012a2SVijay Sundar Selvamani * @reg_tl_rd_lat_acc: read latency accumulator 72*c6b012a2SVijay Sundar Selvamani * @reg_tl_gp_lat_acc: "get to put" latency accumulator 73*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_page_req_lat_acc: AT/DevTLB page request latency accumulator 74*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_trans_lat_acc: DevTLB transaction latency accumulator 75*c6b012a2SVijay Sundar Selvamani * @reg_tl_re_acc: accumulated ring empty time 76*c6b012a2SVijay Sundar Selvamani * @reg_tl_prt_trans_cnt: PCIe partial transactions 77*c6b012a2SVijay Sundar Selvamani * @reg_tl_rd_lat_max: maximum logged read latency 78*c6b012a2SVijay Sundar Selvamani * @reg_tl_rd_cmpl_cnt: read requests completed count 79*c6b012a2SVijay Sundar Selvamani * @reg_tl_gp_lat_max: maximum logged get to put latency 80*c6b012a2SVijay Sundar Selvamani * @reg_tl_ae_put_cnt: Accelerator Engine put counts across all rings 81*c6b012a2SVijay Sundar Selvamani * @reg_tl_bw_in: PCIe write bandwidth 82*c6b012a2SVijay Sundar Selvamani * @reg_tl_bw_out: PCIe read bandwidth 83*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_page_req_cnt: DevTLB page requests count 84*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_trans_lat_cnt: DevTLB transaction latency samples count 85*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_max_utlb_used: maximum uTLB used 86*c6b012a2SVijay Sundar Selvamani * @reg_tl_re_cnt: ring empty time samples count 87*c6b012a2SVijay Sundar Selvamani * @reserved: reserved 88*c6b012a2SVijay Sundar Selvamani * @ath_slices: array of Authentication slices utilization registers 89*c6b012a2SVijay Sundar Selvamani * @cnv_slices: array of Compression slices utilization registers 90*c6b012a2SVijay Sundar Selvamani * @dcprz_slices: array of Decompression slices utilization registers 91*c6b012a2SVijay Sundar Selvamani * @pke_slices: array of PKE slices utilization registers 92*c6b012a2SVijay Sundar Selvamani * @ucs_slices: array of UCS slices utilization registers 93*c6b012a2SVijay Sundar Selvamani * @wat_slices: array of Wireless Authentication slices utilization registers 94*c6b012a2SVijay Sundar Selvamani * @wcp_slices: array of Wireless Cipher slices utilization registers 95*c6b012a2SVijay Sundar Selvamani * @ath_cmdq: array of Authentication cmdq telemetry registers 96*c6b012a2SVijay Sundar Selvamani * @cnv_cmdq: array of Compression cmdq telemetry registers 97*c6b012a2SVijay Sundar Selvamani * @dcprz_cmdq: array of Decomopression cmdq telemetry registers 98*c6b012a2SVijay Sundar Selvamani * @pke_cmdq: array of PKE cmdq telemetry registers 99*c6b012a2SVijay Sundar Selvamani * @ucs_cmdq: array of UCS cmdq telemetry registers 100*c6b012a2SVijay Sundar Selvamani * @wat_cmdq: array of Wireless Authentication cmdq telemetry registers 101*c6b012a2SVijay Sundar Selvamani * @wcp_cmdq: array of Wireless Cipher cmdq telemetry registers 102*c6b012a2SVijay Sundar Selvamani */ 103*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_device_data_regs { 104*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_rd_lat_acc; 105*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_gp_lat_acc; 106*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_at_page_req_lat_acc; 107*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_at_trans_lat_acc; 108*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_re_acc; 109*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_prt_trans_cnt; 110*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_rd_lat_max; 111*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_rd_cmpl_cnt; 112*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_gp_lat_max; 113*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_ae_put_cnt; 114*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_bw_in; 115*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_bw_out; 116*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_page_req_cnt; 117*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_trans_lat_cnt; 118*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_max_utlb_used; 119*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_re_cnt; 120*c6b012a2SVijay Sundar Selvamani __u32 reserved; 121*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs ath_slices[MAX_ATH_SL_COUNT]; 122*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs cnv_slices[MAX_CNV_SL_COUNT]; 123*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs dcprz_slices[MAX_DCPRZ_SL_COUNT]; 124*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs pke_slices[MAX_PKE_SL_COUNT]; 125*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs ucs_slices[MAX_UCS_SL_COUNT]; 126*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs wat_slices[MAX_WAT_SL_COUNT]; 127*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_slice_data_regs wcp_slices[MAX_WCP_SL_COUNT]; 128*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs ath_cmdq[MAX_ATH_CMDQ_COUNT]; 129*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs cnv_cmdq[MAX_CNV_CMDQ_COUNT]; 130*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs dcprz_cmdq[MAX_DCPRZ_CMDQ_COUNT]; 131*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs pke_cmdq[MAX_PKE_CMDQ_COUNT]; 132*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs ucs_cmdq[MAX_UCS_CMDQ_COUNT]; 133*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs wat_cmdq[MAX_WAT_CMDQ_COUNT]; 134*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_cmdq_data_regs wcp_cmdq[MAX_WCP_CMDQ_COUNT]; 135*c6b012a2SVijay Sundar Selvamani }; 136*c6b012a2SVijay Sundar Selvamani 137*c6b012a2SVijay Sundar Selvamani /** 138*c6b012a2SVijay Sundar Selvamani * struct adf_gen6_tl_ring_pair_data_regs - This structure stores ring pair 139*c6b012a2SVijay Sundar Selvamani * telemetry counter values as they are being populated periodically by device. 140*c6b012a2SVijay Sundar Selvamani * @reg_tl_gp_lat_acc: get-put latency accumulator 141*c6b012a2SVijay Sundar Selvamani * @reg_tl_re_acc: accumulated ring empty time 142*c6b012a2SVijay Sundar Selvamani * @reg_tl_pci_trans_cnt: PCIe partial transactions 143*c6b012a2SVijay Sundar Selvamani * @reg_tl_ae_put_cnt: Accelerator Engine put counts across all rings 144*c6b012a2SVijay Sundar Selvamani * @reg_tl_bw_in: PCIe write bandwidth 145*c6b012a2SVijay Sundar Selvamani * @reg_tl_bw_out: PCIe read bandwidth 146*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_glob_devtlb_hit: Message descriptor DevTLB hit rate 147*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_glob_devtlb_miss: Message descriptor DevTLB miss rate 148*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_payld_devtlb_hit: Payload DevTLB hit rate 149*c6b012a2SVijay Sundar Selvamani * @reg_tl_at_payld_devtlb_miss: Payload DevTLB miss rate 150*c6b012a2SVijay Sundar Selvamani * @reg_tl_re_cnt: ring empty time samples count 151*c6b012a2SVijay Sundar Selvamani * @reserved1: reserved 152*c6b012a2SVijay Sundar Selvamani */ 153*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_ring_pair_data_regs { 154*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_gp_lat_acc; 155*c6b012a2SVijay Sundar Selvamani __u64 reg_tl_re_acc; 156*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_prt_trans_cnt; 157*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_ae_put_cnt; 158*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_bw_in; 159*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_bw_out; 160*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_glob_devtlb_hit; 161*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_glob_devtlb_miss; 162*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_payld_devtlb_hit; 163*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_at_payld_devtlb_miss; 164*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_re_cnt; 165*c6b012a2SVijay Sundar Selvamani __u32 reserved1; 166*c6b012a2SVijay Sundar Selvamani }; 167*c6b012a2SVijay Sundar Selvamani 168*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_RP_REG_SZ sizeof(struct adf_gen6_tl_ring_pair_data_regs) 169*c6b012a2SVijay Sundar Selvamani 170*c6b012a2SVijay Sundar Selvamani /** 171*c6b012a2SVijay Sundar Selvamani * struct adf_gen6_tl_layout - This structure represents the entire telemetry 172*c6b012a2SVijay Sundar Selvamani * counters data: Device + 4 Ring Pairs as they are being populated periodically 173*c6b012a2SVijay Sundar Selvamani * by device. 174*c6b012a2SVijay Sundar Selvamani * @tl_device_data_regs: structure of device telemetry registers 175*c6b012a2SVijay Sundar Selvamani * @tl_ring_pairs_data_regs: array of ring pairs telemetry registers 176*c6b012a2SVijay Sundar Selvamani * @reg_tl_msg_cnt: telemetry message counter 177*c6b012a2SVijay Sundar Selvamani * @reserved: reserved 178*c6b012a2SVijay Sundar Selvamani */ 179*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_layout { 180*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_device_data_regs tl_device_data_regs; 181*c6b012a2SVijay Sundar Selvamani struct adf_gen6_tl_ring_pair_data_regs 182*c6b012a2SVijay Sundar Selvamani tl_ring_pairs_data_regs[ADF_GEN6_TL_MAX_RP_NUM]; 183*c6b012a2SVijay Sundar Selvamani __u32 reg_tl_msg_cnt; 184*c6b012a2SVijay Sundar Selvamani __u32 reserved; 185*c6b012a2SVijay Sundar Selvamani }; 186*c6b012a2SVijay Sundar Selvamani 187*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_LAYOUT_SZ sizeof(struct adf_gen6_tl_layout) 188*c6b012a2SVijay Sundar Selvamani #define ADF_GEN6_TL_MSG_CNT_OFF \ 189*c6b012a2SVijay Sundar Selvamani offsetof(struct adf_gen6_tl_layout, reg_tl_msg_cnt) 190*c6b012a2SVijay Sundar Selvamani 191*c6b012a2SVijay Sundar Selvamani #ifdef CONFIG_DEBUG_FS 192*c6b012a2SVijay Sundar Selvamani void adf_gen6_init_tl_data(struct adf_tl_hw_data *tl_data); 193*c6b012a2SVijay Sundar Selvamani #else 194*c6b012a2SVijay Sundar Selvamani static inline void adf_gen6_init_tl_data(struct adf_tl_hw_data *tl_data) 195*c6b012a2SVijay Sundar Selvamani { 196*c6b012a2SVijay Sundar Selvamani } 197*c6b012a2SVijay Sundar Selvamani #endif /* CONFIG_DEBUG_FS */ 198*c6b012a2SVijay Sundar Selvamani #endif /* ADF_GEN6_TL_H */ 199