mirror of
https://github.com/torvalds/linux.git
synced 2026-04-30 20:42:33 -04:00
A firmware update for QAT GEN2 changed the format of a data structure used to report the heartbeat counters. To support all firmware versions, extend the heartbeat logic with an algorithm that detects the number of counters returned by firmware. The algorithm detects the number of counters to be used (and size of the corresponding data structure) by the comparison the expected size of the data in memory, with the data which was written by the firmware. Firmware detection is done one time during the first read of heartbeat debugfs file to avoid increasing the time needed to load the module. Signed-off-by: Damian Muszynski <damian.muszynski@intel.com> Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
80 lines
1.8 KiB
C
80 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* Copyright(c) 2023 Intel Corporation */
|
|
|
|
#ifndef ADF_HEARTBEAT_H_
|
|
#define ADF_HEARTBEAT_H_
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct adf_accel_dev;
|
|
struct dentry;
|
|
|
|
#define ADF_CFG_HB_TIMER_MIN_MS 200
|
|
#define ADF_CFG_HB_TIMER_DEFAULT_MS 500
|
|
#define ADF_CFG_HB_COUNT_THRESHOLD 3
|
|
|
|
enum adf_device_heartbeat_status {
|
|
HB_DEV_UNRESPONSIVE = 0,
|
|
HB_DEV_ALIVE,
|
|
HB_DEV_UNSUPPORTED,
|
|
};
|
|
|
|
struct adf_heartbeat {
|
|
unsigned int hb_sent_counter;
|
|
unsigned int hb_failed_counter;
|
|
unsigned int hb_timer;
|
|
u64 last_hb_check_time;
|
|
bool ctrs_cnt_checked;
|
|
struct hb_dma_addr {
|
|
dma_addr_t phy_addr;
|
|
void *virt_addr;
|
|
} dma;
|
|
struct {
|
|
struct dentry *base_dir;
|
|
struct dentry *status;
|
|
struct dentry *cfg;
|
|
struct dentry *sent;
|
|
struct dentry *failed;
|
|
} dbgfs;
|
|
};
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
int adf_heartbeat_init(struct adf_accel_dev *accel_dev);
|
|
int adf_heartbeat_start(struct adf_accel_dev *accel_dev);
|
|
void adf_heartbeat_shutdown(struct adf_accel_dev *accel_dev);
|
|
|
|
int adf_heartbeat_ms_to_ticks(struct adf_accel_dev *accel_dev, unsigned int time_ms,
|
|
uint32_t *value);
|
|
int adf_heartbeat_save_cfg_param(struct adf_accel_dev *accel_dev,
|
|
unsigned int timer_ms);
|
|
void adf_heartbeat_status(struct adf_accel_dev *accel_dev,
|
|
enum adf_device_heartbeat_status *hb_status);
|
|
void adf_heartbeat_check_ctrs(struct adf_accel_dev *accel_dev);
|
|
|
|
#else
|
|
static inline int adf_heartbeat_init(struct adf_accel_dev *accel_dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int adf_heartbeat_start(struct adf_accel_dev *accel_dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void adf_heartbeat_shutdown(struct adf_accel_dev *accel_dev)
|
|
{
|
|
}
|
|
|
|
static inline int adf_heartbeat_save_cfg_param(struct adf_accel_dev *accel_dev,
|
|
unsigned int timer_ms)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void adf_heartbeat_check_ctrs(struct adf_accel_dev *accel_dev)
|
|
{
|
|
}
|
|
#endif
|
|
#endif /* ADF_HEARTBEAT_H_ */
|