The function adf_send_admin_tl_start() enables the telemetry (TL)
feature on a QAT device by sending the ICP_QAT_FW_TL_START message to
the firmware. This triggers the FW to start writing TL data to a DMA
buffer in memory and returns an array containing the number of
accelerators of each type (slices) supported by this HW.
The pointer to this array is stored in the adf_tl_hw_data data
structure called slice_cnt.
The array slice_cnt is then used in the function tl_print_dev_data()
to report in debugfs only statistics about the supported accelerators.
An incorrect value of the elements in slice_cnt might lead to an out
of bounds memory read.
At the moment, there isn't an implementation of FW that returns a wrong
value, but for robustness validate the slice count array returned by FW.
Fixes: 69e7649f7c
("crypto: qat - add support for device telemetry")
Signed-off-by: Lucas Segarra Fernandez <lucas.segarra.fernandez@intel.com>
Reviewed-by: Damian Muszynski <damian.muszynski@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
154 lines
6.1 KiB
C
154 lines
6.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/* Copyright (c) 2023 Intel Corporation. */
|
|
#include <linux/export.h>
|
|
#include <linux/kernel.h>
|
|
|
|
#include "adf_gen4_tl.h"
|
|
#include "adf_telemetry.h"
|
|
#include "adf_tl_debugfs.h"
|
|
|
|
#define ADF_GEN4_TL_DEV_REG_OFF(reg) ADF_TL_DEV_REG_OFF(reg, gen4)
|
|
|
|
#define ADF_GEN4_TL_RP_REG_OFF(reg) ADF_TL_RP_REG_OFF(reg, gen4)
|
|
|
|
#define ADF_GEN4_TL_SL_UTIL_COUNTER(_name) \
|
|
ADF_TL_COUNTER("util_" #_name, \
|
|
ADF_TL_SIMPLE_COUNT, \
|
|
ADF_TL_SLICE_REG_OFF(_name, reg_tm_slice_util, gen4))
|
|
|
|
#define ADF_GEN4_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, gen4))
|
|
|
|
/* 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_GEN4_TL_DEV_REG_OFF(reg_tl_pci_trans_cnt)),
|
|
/* Max read latency[ns]. */
|
|
ADF_TL_COUNTER(MAX_RD_LAT_NAME, ADF_TL_COUNTER_NS,
|
|
ADF_GEN4_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_GEN4_TL_DEV_REG_OFF(reg_tl_rd_lat_acc),
|
|
ADF_GEN4_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_GEN4_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_GEN4_TL_DEV_REG_OFF(reg_tl_gp_lat_acc),
|
|
ADF_GEN4_TL_DEV_REG_OFF(reg_tl_ae_put_cnt)),
|
|
/* PCIe write bandwidth[Mbps]. */
|
|
ADF_TL_COUNTER(BW_IN_NAME, ADF_TL_COUNTER_MBPS,
|
|
ADF_GEN4_TL_DEV_REG_OFF(reg_tl_bw_in)),
|
|
/* PCIe read bandwidth[Mbps]. */
|
|
ADF_TL_COUNTER(BW_OUT_NAME, ADF_TL_COUNTER_MBPS,
|
|
ADF_GEN4_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_GEN4_TL_DEV_REG_OFF(reg_tl_at_page_req_lat_acc),
|
|
ADF_GEN4_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_GEN4_TL_DEV_REG_OFF(reg_tl_at_trans_lat_acc),
|
|
ADF_GEN4_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_GEN4_TL_DEV_REG_OFF(reg_tl_at_max_tlb_used)),
|
|
};
|
|
|
|
/* Slice utilization counters. */
|
|
static const struct adf_tl_dbg_counter sl_util_counters[ADF_TL_SL_CNT_COUNT] = {
|
|
/* Compression slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(cpr),
|
|
/* Translator slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(xlt),
|
|
/* Decompression slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(dcpr),
|
|
/* PKE utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(pke),
|
|
/* Wireless Authentication slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(wat),
|
|
/* Wireless Cipher slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(wcp),
|
|
/* UCS slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(ucs),
|
|
/* Cipher slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(cph),
|
|
/* Authentication slice utilization. */
|
|
ADF_GEN4_TL_SL_UTIL_COUNTER(ath),
|
|
};
|
|
|
|
/* Slice execution counters. */
|
|
static const struct adf_tl_dbg_counter sl_exec_counters[ADF_TL_SL_CNT_COUNT] = {
|
|
/* Compression slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(cpr),
|
|
/* Translator slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(xlt),
|
|
/* Decompression slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(dcpr),
|
|
/* PKE execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(pke),
|
|
/* Wireless Authentication slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(wat),
|
|
/* Wireless Cipher slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(wcp),
|
|
/* UCS slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(ucs),
|
|
/* Cipher slice execution count. */
|
|
ADF_GEN4_TL_SL_EXEC_COUNTER(cph),
|
|
/* Authentication slice execution count. */
|
|
ADF_GEN4_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_GEN4_TL_RP_REG_OFF(reg_tl_pci_trans_cnt)),
|
|
/* Get to put latency average[ns]. */
|
|
ADF_TL_COUNTER_LATENCY(LAT_ACC_NAME, ADF_TL_COUNTER_NS_AVG,
|
|
ADF_GEN4_TL_RP_REG_OFF(reg_tl_gp_lat_acc),
|
|
ADF_GEN4_TL_RP_REG_OFF(reg_tl_ae_put_cnt)),
|
|
/* PCIe write bandwidth[Mbps]. */
|
|
ADF_TL_COUNTER(BW_IN_NAME, ADF_TL_COUNTER_MBPS,
|
|
ADF_GEN4_TL_RP_REG_OFF(reg_tl_bw_in)),
|
|
/* PCIe read bandwidth[Mbps]. */
|
|
ADF_TL_COUNTER(BW_OUT_NAME, ADF_TL_COUNTER_MBPS,
|
|
ADF_GEN4_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_GEN4_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_GEN4_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_GEN4_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_GEN4_TL_RP_REG_OFF(reg_tl_at_payld_devtlb_miss)),
|
|
};
|
|
|
|
void adf_gen4_init_tl_data(struct adf_tl_hw_data *tl_data)
|
|
{
|
|
tl_data->layout_sz = ADF_GEN4_TL_LAYOUT_SZ;
|
|
tl_data->slice_reg_sz = ADF_GEN4_TL_SLICE_REG_SZ;
|
|
tl_data->rp_reg_sz = ADF_GEN4_TL_RP_REG_SZ;
|
|
tl_data->num_hbuff = ADF_GEN4_TL_NUM_HIST_BUFFS;
|
|
tl_data->max_rp = ADF_GEN4_TL_MAX_RP_NUM;
|
|
tl_data->msg_cnt_off = ADF_GEN4_TL_MSG_CNT_OFF;
|
|
tl_data->cpp_ns_per_cycle = ADF_GEN4_CPP_NS_PER_CYCLE;
|
|
tl_data->bw_units_to_bytes = ADF_GEN4_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_GEN4_TL_MAX_SLICES_PER_TYPE;
|
|
}
|
|
EXPORT_SYMBOL_GPL(adf_gen4_init_tl_data);
|