/* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2023 Intel Corporation. */ #ifndef ADF_TELEMETRY_H #define ADF_TELEMETRY_H #include #include #include #include #include "icp_qat_fw_init_admin.h" struct adf_accel_dev; struct adf_tl_dbg_counter; struct dentry; #define ADF_TL_SL_CNT_COUNT \ (sizeof(struct icp_qat_fw_init_admin_slice_cnt) / sizeof(__u8)) #define TL_CAPABILITY_BIT BIT(1) /* Interval within device writes data to DMA region. Value in milliseconds. */ #define ADF_TL_DATA_WR_INTERVAL_MS 1000 /* Interval within timer interrupt should be handled. Value in milliseconds. */ #define ADF_TL_TIMER_INT_MS (ADF_TL_DATA_WR_INTERVAL_MS / 2) #define ADF_TL_RP_REGS_DISABLED (0xff) struct adf_tl_hw_data { size_t layout_sz; size_t slice_reg_sz; size_t rp_reg_sz; size_t msg_cnt_off; const struct adf_tl_dbg_counter *dev_counters; const struct adf_tl_dbg_counter *sl_util_counters; const struct adf_tl_dbg_counter *sl_exec_counters; const struct adf_tl_dbg_counter *rp_counters; u8 num_hbuff; u8 cpp_ns_per_cycle; u8 bw_units_to_bytes; u8 num_dev_counters; u8 num_rp_counters; u8 max_rp; }; struct adf_telemetry { struct adf_accel_dev *accel_dev; atomic_t state; u32 hbuffs; int hb_num; u32 msg_cnt; dma_addr_t regs_data_p; /* bus address for DMA mapping */ void *regs_data; /* virtual address for DMA mapping */ /** * @regs_hist_buff: array of pointers to copies of the last @hbuffs * values of @regs_data */ void **regs_hist_buff; struct dentry *dbg_dir; u8 *rp_num_indexes; /** * @regs_hist_lock: protects from race conditions between write and read * to the copies referenced by @regs_hist_buff */ struct mutex regs_hist_lock; /** * @wr_lock: protects from concurrent writes to debugfs telemetry files */ struct mutex wr_lock; struct delayed_work work_ctx; struct icp_qat_fw_init_admin_slice_cnt slice_cnt; }; #ifdef CONFIG_DEBUG_FS int adf_tl_init(struct adf_accel_dev *accel_dev); int adf_tl_start(struct adf_accel_dev *accel_dev); void adf_tl_stop(struct adf_accel_dev *accel_dev); void adf_tl_shutdown(struct adf_accel_dev *accel_dev); int adf_tl_run(struct adf_accel_dev *accel_dev, int state); int adf_tl_halt(struct adf_accel_dev *accel_dev); #else static inline int adf_tl_init(struct adf_accel_dev *accel_dev) { return 0; } static inline int adf_tl_start(struct adf_accel_dev *accel_dev) { return 0; } static inline void adf_tl_stop(struct adf_accel_dev *accel_dev) { } static inline void adf_tl_shutdown(struct adf_accel_dev *accel_dev) { } #endif /* CONFIG_DEBUG_FS */ #endif /* ADF_TELEMETRY_H */