]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: qat - enable telemetry for GEN6 devices
authorVijay Sundar Selvamani <vijay.sundar.selvamani@intel.com>
Thu, 10 Jul 2025 06:39:44 +0000 (07:39 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Jul 2025 10:52:00 +0000 (20:52 +1000)
Enable telemetry for QAT GEN6 devices by defining the firmware data
structures layouts, implementing the counters parsing logic and setting
the required properties on the adf_tl_hw_data data structure.

As for QAT GEN4, telemetry counters are exposed via debugfs using the
interface described in Documentation/ABI/testing/debugfs-driver-qat_telemetry.

Co-developed-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: Vijay Sundar Selvamani <vijay.sundar.selvamani@intel.com>
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
drivers/crypto/intel/qat/qat_common/Makefile
drivers/crypto/intel/qat/qat_common/adf_gen6_tl.c [new file with mode: 0644]
drivers/crypto/intel/qat/qat_common/adf_gen6_tl.h [new file with mode: 0644]

index ecef3dc28a91e4d95a23d321d5f2812aad2c2e5f..d3f1034f33fb79ea629126d9db36797e63644d98 100644 (file)
@@ -19,6 +19,7 @@
 #include <adf_gen6_pm.h>
 #include <adf_gen6_ras.h>
 #include <adf_gen6_shared.h>
+#include <adf_gen6_tl.h>
 #include <adf_timer.h>
 #include "adf_6xxx_hw_data.h"
 #include "icp_qat_fw_comp.h"
@@ -861,12 +862,14 @@ void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data)
        hw_data->init_device = adf_init_device;
        hw_data->enable_pm = enable_pm;
        hw_data->services_supported = services_supported;
+       hw_data->num_rps = ADF_GEN6_ETR_MAX_BANKS;
 
        adf_gen6_init_hw_csr_ops(&hw_data->csr_ops);
        adf_gen6_init_pf_pfvf_ops(&hw_data->pfvf_ops);
        adf_gen6_init_dc_ops(&hw_data->dc_ops);
        adf_gen6_init_vf_mig_ops(&hw_data->vfmig_ops);
        adf_gen6_init_ras_ops(&hw_data->ras_ops);
+       adf_gen6_init_tl_data(&hw_data->tl_data);
 }
 
 void adf_clean_hw_data_6xxx(struct adf_hw_device_data *hw_data)
index 34019d8637a50d11e5829b241e7a5e6b395bd832..89845754841b879fa9f353fc5ffffae380ba414d 100644 (file)
@@ -50,6 +50,7 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_cnv_dbgfs.o \
                                adf_gen4_pm_debugfs.o \
                                adf_gen4_tl.o \
                                adf_gen6_pm_dbgfs.o \
+                               adf_gen6_tl.o \
                                adf_heartbeat_dbgfs.o \
                                adf_heartbeat.o \
                                adf_pm_dbgfs.o \
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen6_tl.c b/drivers/crypto/intel/qat/qat_common/adf_gen6_tl.c
new file mode 100644 (file)
index 0000000..cf804f9
--- /dev/null
@@ -0,0 +1,146 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2025 Intel Corporation. */
+#include <linux/export.h>
+
+#include "adf_gen6_tl.h"
+#include "adf_telemetry.h"
+#include "adf_tl_debugfs.h"
+#include "icp_qat_fw_init_admin.h"
+
+#define ADF_GEN6_TL_DEV_REG_OFF(reg) ADF_TL_DEV_REG_OFF(reg, gen6)
+
+#define ADF_GEN6_TL_RP_REG_OFF(reg) ADF_TL_RP_REG_OFF(reg, gen6)
+
+#define ADF_GEN6_TL_SL_UTIL_COUNTER(_name)                     \
+       ADF_TL_COUNTER("util_" #_name, ADF_TL_SIMPLE_COUNT,     \
+                       ADF_TL_SLICE_REG_OFF(_name, reg_tm_slice_util, gen6))
+
+#define ADF_GEN6_TL_SL_EXEC_COUNTER(_name)                     \
+       ADF_TL_COUNTER("exec_" #_name, ADF_TL_SIMPLE_COUNT,     \
+                       ADF_TL_SLICE_REG_OFF(_name, reg_tm_slice_exec_cnt, gen6))
+
+#define SLICE_IDX(sl) offsetof(struct icp_qat_fw_init_admin_slice_cnt, sl##_cnt)
+
+/* Device level counters. */
+static const struct adf_tl_dbg_counter dev_counters[] = {
+       /* PCIe partial transactions. */
+       ADF_TL_COUNTER(PCI_TRANS_CNT_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_prt_trans_cnt)),
+       /* Max read latency[ns]. */
+       ADF_TL_COUNTER(MAX_RD_LAT_NAME, ADF_TL_COUNTER_NS,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_rd_lat_max)),
+       /* Read latency average[ns]. */
+       ADF_TL_COUNTER_LATENCY(RD_LAT_ACC_NAME, ADF_TL_COUNTER_NS_AVG,
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_rd_lat_acc),
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_rd_cmpl_cnt)),
+       /* Max "get to put" latency[ns]. */
+       ADF_TL_COUNTER(MAX_LAT_NAME, ADF_TL_COUNTER_NS,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_gp_lat_max)),
+       /* "Get to put" latency average[ns]. */
+       ADF_TL_COUNTER_LATENCY(LAT_ACC_NAME, ADF_TL_COUNTER_NS_AVG,
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_gp_lat_acc),
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_ae_put_cnt)),
+       /* PCIe write bandwidth[Mbps]. */
+       ADF_TL_COUNTER(BW_IN_NAME, ADF_TL_COUNTER_MBPS,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_bw_in)),
+       /* PCIe read bandwidth[Mbps]. */
+       ADF_TL_COUNTER(BW_OUT_NAME, ADF_TL_COUNTER_MBPS,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_bw_out)),
+       /* Page request latency average[ns]. */
+       ADF_TL_COUNTER_LATENCY(PAGE_REQ_LAT_NAME, ADF_TL_COUNTER_NS_AVG,
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_at_page_req_lat_acc),
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_at_page_req_cnt)),
+       /* Page translation latency average[ns]. */
+       ADF_TL_COUNTER_LATENCY(AT_TRANS_LAT_NAME, ADF_TL_COUNTER_NS_AVG,
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_at_trans_lat_acc),
+                              ADF_GEN6_TL_DEV_REG_OFF(reg_tl_at_trans_lat_cnt)),
+       /* Maximum uTLB used. */
+       ADF_TL_COUNTER(AT_MAX_UTLB_USED_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_DEV_REG_OFF(reg_tl_at_max_utlb_used)),
+};
+
+/* Accelerator utilization counters */
+static const struct adf_tl_dbg_counter sl_util_counters[ADF_TL_SL_CNT_COUNT] = {
+       /* Compression accelerator utilization. */
+       [SLICE_IDX(cpr)] = ADF_GEN6_TL_SL_UTIL_COUNTER(cnv),
+       /* Decompression accelerator utilization. */
+       [SLICE_IDX(dcpr)] = ADF_GEN6_TL_SL_UTIL_COUNTER(dcprz),
+       /* PKE accelerator utilization. */
+       [SLICE_IDX(pke)] = ADF_GEN6_TL_SL_UTIL_COUNTER(pke),
+       /* Wireless Authentication accelerator utilization. */
+       [SLICE_IDX(wat)] = ADF_GEN6_TL_SL_UTIL_COUNTER(wat),
+       /* Wireless Cipher accelerator utilization. */
+       [SLICE_IDX(wcp)] = ADF_GEN6_TL_SL_UTIL_COUNTER(wcp),
+       /* UCS accelerator utilization. */
+       [SLICE_IDX(ucs)] = ADF_GEN6_TL_SL_UTIL_COUNTER(ucs),
+       /* Authentication accelerator utilization. */
+       [SLICE_IDX(ath)] = ADF_GEN6_TL_SL_UTIL_COUNTER(ath),
+};
+
+/* Accelerator execution counters */
+static const struct adf_tl_dbg_counter sl_exec_counters[ADF_TL_SL_CNT_COUNT] = {
+       /* Compression accelerator execution count. */
+       [SLICE_IDX(cpr)] = ADF_GEN6_TL_SL_EXEC_COUNTER(cnv),
+       /* Decompression accelerator execution count. */
+       [SLICE_IDX(dcpr)] = ADF_GEN6_TL_SL_EXEC_COUNTER(dcprz),
+       /* PKE execution count. */
+       [SLICE_IDX(pke)] = ADF_GEN6_TL_SL_EXEC_COUNTER(pke),
+       /* Wireless Authentication accelerator execution count. */
+       [SLICE_IDX(wat)] = ADF_GEN6_TL_SL_EXEC_COUNTER(wat),
+       /* Wireless Cipher accelerator execution count. */
+       [SLICE_IDX(wcp)] = ADF_GEN6_TL_SL_EXEC_COUNTER(wcp),
+       /* UCS accelerator execution count. */
+       [SLICE_IDX(ucs)] = ADF_GEN6_TL_SL_EXEC_COUNTER(ucs),
+       /* Authentication accelerator execution count. */
+       [SLICE_IDX(ath)] = ADF_GEN6_TL_SL_EXEC_COUNTER(ath),
+};
+
+/* Ring pair counters. */
+static const struct adf_tl_dbg_counter rp_counters[] = {
+       /* PCIe partial transactions. */
+       ADF_TL_COUNTER(PCI_TRANS_CNT_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_prt_trans_cnt)),
+       /* "Get to put" latency average[ns]. */
+       ADF_TL_COUNTER_LATENCY(LAT_ACC_NAME, ADF_TL_COUNTER_NS_AVG,
+                              ADF_GEN6_TL_RP_REG_OFF(reg_tl_gp_lat_acc),
+                              ADF_GEN6_TL_RP_REG_OFF(reg_tl_ae_put_cnt)),
+       /* PCIe write bandwidth[Mbps]. */
+       ADF_TL_COUNTER(BW_IN_NAME, ADF_TL_COUNTER_MBPS,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_bw_in)),
+       /* PCIe read bandwidth[Mbps]. */
+       ADF_TL_COUNTER(BW_OUT_NAME, ADF_TL_COUNTER_MBPS,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_bw_out)),
+       /* Message descriptor DevTLB hit rate. */
+       ADF_TL_COUNTER(AT_GLOB_DTLB_HIT_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_at_glob_devtlb_hit)),
+       /* Message descriptor DevTLB miss rate. */
+       ADF_TL_COUNTER(AT_GLOB_DTLB_MISS_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_at_glob_devtlb_miss)),
+       /* Payload DevTLB hit rate. */
+       ADF_TL_COUNTER(AT_PAYLD_DTLB_HIT_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_at_payld_devtlb_hit)),
+       /* Payload DevTLB miss rate. */
+       ADF_TL_COUNTER(AT_PAYLD_DTLB_MISS_NAME, ADF_TL_SIMPLE_COUNT,
+                      ADF_GEN6_TL_RP_REG_OFF(reg_tl_at_payld_devtlb_miss)),
+};
+
+void adf_gen6_init_tl_data(struct adf_tl_hw_data *tl_data)
+{
+       tl_data->layout_sz = ADF_GEN6_TL_LAYOUT_SZ;
+       tl_data->slice_reg_sz = ADF_GEN6_TL_SLICE_REG_SZ;
+       tl_data->rp_reg_sz = ADF_GEN6_TL_RP_REG_SZ;
+       tl_data->num_hbuff = ADF_GEN6_TL_NUM_HIST_BUFFS;
+       tl_data->max_rp = ADF_GEN6_TL_MAX_RP_NUM;
+       tl_data->msg_cnt_off = ADF_GEN6_TL_MSG_CNT_OFF;
+       tl_data->cpp_ns_per_cycle = ADF_GEN6_CPP_NS_PER_CYCLE;
+       tl_data->bw_units_to_bytes = ADF_GEN6_TL_BW_HW_UNITS_TO_BYTES;
+
+       tl_data->dev_counters = dev_counters;
+       tl_data->num_dev_counters = ARRAY_SIZE(dev_counters);
+       tl_data->sl_util_counters = sl_util_counters;
+       tl_data->sl_exec_counters = sl_exec_counters;
+       tl_data->rp_counters = rp_counters;
+       tl_data->num_rp_counters = ARRAY_SIZE(rp_counters);
+       tl_data->max_sl_cnt = ADF_GEN6_TL_MAX_SLICES_PER_TYPE;
+}
+EXPORT_SYMBOL_GPL(adf_gen6_init_tl_data);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen6_tl.h b/drivers/crypto/intel/qat/qat_common/adf_gen6_tl.h
new file mode 100644 (file)
index 0000000..49db660
--- /dev/null
@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright (c) 2025 Intel Corporation. */
+#ifndef ADF_GEN6_TL_H
+#define ADF_GEN6_TL_H
+
+#include <linux/types.h>
+
+struct adf_tl_hw_data;
+
+/* Computation constants. */
+#define ADF_GEN6_CPP_NS_PER_CYCLE              2
+#define ADF_GEN6_TL_BW_HW_UNITS_TO_BYTES       64
+
+/* Maximum aggregation time. Value is in milliseconds. */
+#define ADF_GEN6_TL_MAX_AGGR_TIME_MS           4000
+/* Number of buffers to store historic values. */
+#define ADF_GEN6_TL_NUM_HIST_BUFFS \
+       (ADF_GEN6_TL_MAX_AGGR_TIME_MS / ADF_TL_DATA_WR_INTERVAL_MS)
+
+/* Max number of HW resources of one type */
+#define ADF_GEN6_TL_MAX_SLICES_PER_TYPE                32
+#define MAX_ATH_SL_COUNT                       7
+#define MAX_CNV_SL_COUNT                       2
+#define MAX_DCPRZ_SL_COUNT                     2
+#define MAX_PKE_SL_COUNT                       32
+#define MAX_UCS_SL_COUNT                       4
+#define MAX_WAT_SL_COUNT                       5
+#define MAX_WCP_SL_COUNT                       5
+
+#define MAX_ATH_CMDQ_COUNT                     14
+#define MAX_CNV_CMDQ_COUNT                     6
+#define MAX_DCPRZ_CMDQ_COUNT                   6
+#define MAX_PKE_CMDQ_COUNT                     32
+#define MAX_UCS_CMDQ_COUNT                     12
+#define MAX_WAT_CMDQ_COUNT                     35
+#define MAX_WCP_CMDQ_COUNT                     35
+
+/* Max number of simultaneously monitored ring pairs. */
+#define ADF_GEN6_TL_MAX_RP_NUM                 4
+
+/**
+ * struct adf_gen6_tl_slice_data_regs - HW slice data as populated by FW.
+ * @reg_tm_slice_exec_cnt: Slice execution count.
+ * @reg_tm_slice_util: Slice utilization.
+ */
+struct adf_gen6_tl_slice_data_regs {
+       __u32 reg_tm_slice_exec_cnt;
+       __u32 reg_tm_slice_util;
+};
+
+#define ADF_GEN6_TL_SLICE_REG_SZ sizeof(struct adf_gen6_tl_slice_data_regs)
+
+/**
+ * struct adf_gen6_tl_cmdq_data_regs - HW CMDQ data as populated by FW.
+ * @reg_tm_cmdq_wait_cnt: CMDQ wait count.
+ * @reg_tm_cmdq_exec_cnt: CMDQ execution count.
+ * @reg_tm_cmdq_drain_cnt: CMDQ drain count.
+ */
+struct adf_gen6_tl_cmdq_data_regs {
+       __u32 reg_tm_cmdq_wait_cnt;
+       __u32 reg_tm_cmdq_exec_cnt;
+       __u32 reg_tm_cmdq_drain_cnt;
+       __u32 reserved;
+};
+
+#define ADF_GEN6_TL_CMDQ_REG_SZ sizeof(struct adf_gen6_tl_cmdq_data_regs)
+
+/**
+ * struct adf_gen6_tl_device_data_regs - This structure stores device telemetry
+ * counter values as are being populated periodically by device.
+ * @reg_tl_rd_lat_acc: read latency accumulator
+ * @reg_tl_gp_lat_acc: "get to put" latency accumulator
+ * @reg_tl_at_page_req_lat_acc: AT/DevTLB page request latency accumulator
+ * @reg_tl_at_trans_lat_acc: DevTLB transaction latency accumulator
+ * @reg_tl_re_acc: accumulated ring empty time
+ * @reg_tl_prt_trans_cnt: PCIe partial transactions
+ * @reg_tl_rd_lat_max: maximum logged read latency
+ * @reg_tl_rd_cmpl_cnt: read requests completed count
+ * @reg_tl_gp_lat_max: maximum logged get to put latency
+ * @reg_tl_ae_put_cnt: Accelerator Engine put counts across all rings
+ * @reg_tl_bw_in: PCIe write bandwidth
+ * @reg_tl_bw_out: PCIe read bandwidth
+ * @reg_tl_at_page_req_cnt: DevTLB page requests count
+ * @reg_tl_at_trans_lat_cnt: DevTLB transaction latency samples count
+ * @reg_tl_at_max_utlb_used: maximum uTLB used
+ * @reg_tl_re_cnt: ring empty time samples count
+ * @reserved: reserved
+ * @ath_slices: array of Authentication slices utilization registers
+ * @cnv_slices: array of Compression slices utilization registers
+ * @dcprz_slices: array of Decompression slices utilization registers
+ * @pke_slices: array of PKE slices utilization registers
+ * @ucs_slices: array of UCS slices utilization registers
+ * @wat_slices: array of Wireless Authentication slices utilization registers
+ * @wcp_slices: array of Wireless Cipher slices utilization registers
+ * @ath_cmdq: array of Authentication cmdq telemetry registers
+ * @cnv_cmdq: array of Compression cmdq telemetry registers
+ * @dcprz_cmdq: array of Decomopression cmdq telemetry registers
+ * @pke_cmdq: array of PKE cmdq telemetry registers
+ * @ucs_cmdq: array of UCS cmdq telemetry registers
+ * @wat_cmdq: array of Wireless Authentication cmdq telemetry registers
+ * @wcp_cmdq: array of Wireless Cipher cmdq telemetry registers
+ */
+struct adf_gen6_tl_device_data_regs {
+       __u64 reg_tl_rd_lat_acc;
+       __u64 reg_tl_gp_lat_acc;
+       __u64 reg_tl_at_page_req_lat_acc;
+       __u64 reg_tl_at_trans_lat_acc;
+       __u64 reg_tl_re_acc;
+       __u32 reg_tl_prt_trans_cnt;
+       __u32 reg_tl_rd_lat_max;
+       __u32 reg_tl_rd_cmpl_cnt;
+       __u32 reg_tl_gp_lat_max;
+       __u32 reg_tl_ae_put_cnt;
+       __u32 reg_tl_bw_in;
+       __u32 reg_tl_bw_out;
+       __u32 reg_tl_at_page_req_cnt;
+       __u32 reg_tl_at_trans_lat_cnt;
+       __u32 reg_tl_at_max_utlb_used;
+       __u32 reg_tl_re_cnt;
+       __u32 reserved;
+       struct adf_gen6_tl_slice_data_regs ath_slices[MAX_ATH_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs cnv_slices[MAX_CNV_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs dcprz_slices[MAX_DCPRZ_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs pke_slices[MAX_PKE_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs ucs_slices[MAX_UCS_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs wat_slices[MAX_WAT_SL_COUNT];
+       struct adf_gen6_tl_slice_data_regs wcp_slices[MAX_WCP_SL_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs ath_cmdq[MAX_ATH_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs cnv_cmdq[MAX_CNV_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs dcprz_cmdq[MAX_DCPRZ_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs pke_cmdq[MAX_PKE_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs ucs_cmdq[MAX_UCS_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs wat_cmdq[MAX_WAT_CMDQ_COUNT];
+       struct adf_gen6_tl_cmdq_data_regs wcp_cmdq[MAX_WCP_CMDQ_COUNT];
+};
+
+/**
+ * struct adf_gen6_tl_ring_pair_data_regs - This structure stores ring pair
+ * telemetry counter values as they are being populated periodically by device.
+ * @reg_tl_gp_lat_acc: get-put latency accumulator
+ * @reg_tl_re_acc: accumulated ring empty time
+ * @reg_tl_pci_trans_cnt: PCIe partial transactions
+ * @reg_tl_ae_put_cnt: Accelerator Engine put counts across all rings
+ * @reg_tl_bw_in: PCIe write bandwidth
+ * @reg_tl_bw_out: PCIe read bandwidth
+ * @reg_tl_at_glob_devtlb_hit: Message descriptor DevTLB hit rate
+ * @reg_tl_at_glob_devtlb_miss: Message descriptor DevTLB miss rate
+ * @reg_tl_at_payld_devtlb_hit: Payload DevTLB hit rate
+ * @reg_tl_at_payld_devtlb_miss: Payload DevTLB miss rate
+ * @reg_tl_re_cnt: ring empty time samples count
+ * @reserved1: reserved
+ */
+struct adf_gen6_tl_ring_pair_data_regs {
+       __u64 reg_tl_gp_lat_acc;
+       __u64 reg_tl_re_acc;
+       __u32 reg_tl_prt_trans_cnt;
+       __u32 reg_tl_ae_put_cnt;
+       __u32 reg_tl_bw_in;
+       __u32 reg_tl_bw_out;
+       __u32 reg_tl_at_glob_devtlb_hit;
+       __u32 reg_tl_at_glob_devtlb_miss;
+       __u32 reg_tl_at_payld_devtlb_hit;
+       __u32 reg_tl_at_payld_devtlb_miss;
+       __u32 reg_tl_re_cnt;
+       __u32 reserved1;
+};
+
+#define ADF_GEN6_TL_RP_REG_SZ sizeof(struct adf_gen6_tl_ring_pair_data_regs)
+
+/**
+ * struct adf_gen6_tl_layout - This structure represents the entire telemetry
+ * counters data: Device + 4 Ring Pairs as they are being populated periodically
+ * by device.
+ * @tl_device_data_regs: structure of device telemetry registers
+ * @tl_ring_pairs_data_regs: array of ring pairs telemetry registers
+ * @reg_tl_msg_cnt: telemetry message counter
+ * @reserved: reserved
+ */
+struct adf_gen6_tl_layout {
+       struct adf_gen6_tl_device_data_regs tl_device_data_regs;
+       struct adf_gen6_tl_ring_pair_data_regs
+               tl_ring_pairs_data_regs[ADF_GEN6_TL_MAX_RP_NUM];
+       __u32 reg_tl_msg_cnt;
+       __u32 reserved;
+};
+
+#define ADF_GEN6_TL_LAYOUT_SZ sizeof(struct adf_gen6_tl_layout)
+#define ADF_GEN6_TL_MSG_CNT_OFF \
+       offsetof(struct adf_gen6_tl_layout, reg_tl_msg_cnt)
+
+#ifdef CONFIG_DEBUG_FS
+void adf_gen6_init_tl_data(struct adf_tl_hw_data *tl_data);
+#else
+static inline void adf_gen6_init_tl_data(struct adf_tl_hw_data *tl_data)
+{
+}
+#endif /* CONFIG_DEBUG_FS */
+#endif /* ADF_GEN6_TL_H */