1359b84f8SDamian Muszynski /* SPDX-License-Identifier: GPL-2.0-only */
2359b84f8SDamian Muszynski /* Copyright(c) 2023 Intel Corporation */
3359b84f8SDamian Muszynski 
4359b84f8SDamian Muszynski #ifndef ADF_HEARTBEAT_H_
5359b84f8SDamian Muszynski #define ADF_HEARTBEAT_H_
6359b84f8SDamian Muszynski 
7359b84f8SDamian Muszynski #include <linux/types.h>
8359b84f8SDamian Muszynski 
9359b84f8SDamian Muszynski struct adf_accel_dev;
10359b84f8SDamian Muszynski struct dentry;
11359b84f8SDamian Muszynski 
12359b84f8SDamian Muszynski #define ADF_CFG_HB_TIMER_MIN_MS 200
13359b84f8SDamian Muszynski #define ADF_CFG_HB_TIMER_DEFAULT_MS 500
14359b84f8SDamian Muszynski #define ADF_CFG_HB_COUNT_THRESHOLD 3
15359b84f8SDamian Muszynski 
16359b84f8SDamian Muszynski enum adf_device_heartbeat_status {
17359b84f8SDamian Muszynski 	HB_DEV_UNRESPONSIVE = 0,
18359b84f8SDamian Muszynski 	HB_DEV_ALIVE,
19359b84f8SDamian Muszynski 	HB_DEV_UNSUPPORTED,
20359b84f8SDamian Muszynski };
21359b84f8SDamian Muszynski 
22359b84f8SDamian Muszynski struct adf_heartbeat {
23359b84f8SDamian Muszynski 	unsigned int hb_sent_counter;
24359b84f8SDamian Muszynski 	unsigned int hb_failed_counter;
25359b84f8SDamian Muszynski 	unsigned int hb_timer;
26359b84f8SDamian Muszynski 	u64 last_hb_check_time;
27*bec61a29SDamian Muszynski 	bool ctrs_cnt_checked;
28359b84f8SDamian Muszynski 	struct hb_dma_addr {
29359b84f8SDamian Muszynski 		dma_addr_t phy_addr;
30359b84f8SDamian Muszynski 		void *virt_addr;
31359b84f8SDamian Muszynski 	} dma;
32359b84f8SDamian Muszynski 	struct {
33359b84f8SDamian Muszynski 		struct dentry *base_dir;
34359b84f8SDamian Muszynski 		struct dentry *status;
35359b84f8SDamian Muszynski 		struct dentry *cfg;
36359b84f8SDamian Muszynski 		struct dentry *sent;
37359b84f8SDamian Muszynski 		struct dentry *failed;
38359b84f8SDamian Muszynski 	} dbgfs;
39359b84f8SDamian Muszynski };
40359b84f8SDamian Muszynski 
41359b84f8SDamian Muszynski #ifdef CONFIG_DEBUG_FS
42359b84f8SDamian Muszynski int adf_heartbeat_init(struct adf_accel_dev *accel_dev);
43359b84f8SDamian Muszynski int adf_heartbeat_start(struct adf_accel_dev *accel_dev);
44359b84f8SDamian Muszynski void adf_heartbeat_shutdown(struct adf_accel_dev *accel_dev);
45359b84f8SDamian Muszynski 
46359b84f8SDamian Muszynski int adf_heartbeat_ms_to_ticks(struct adf_accel_dev *accel_dev, unsigned int time_ms,
47359b84f8SDamian Muszynski 			      uint32_t *value);
48359b84f8SDamian Muszynski int adf_heartbeat_save_cfg_param(struct adf_accel_dev *accel_dev,
49359b84f8SDamian Muszynski 				 unsigned int timer_ms);
50359b84f8SDamian Muszynski void adf_heartbeat_status(struct adf_accel_dev *accel_dev,
51359b84f8SDamian Muszynski 			  enum adf_device_heartbeat_status *hb_status);
52*bec61a29SDamian Muszynski void adf_heartbeat_check_ctrs(struct adf_accel_dev *accel_dev);
53359b84f8SDamian Muszynski 
54359b84f8SDamian Muszynski #else
adf_heartbeat_init(struct adf_accel_dev * accel_dev)55359b84f8SDamian Muszynski static inline int adf_heartbeat_init(struct adf_accel_dev *accel_dev)
56359b84f8SDamian Muszynski {
57359b84f8SDamian Muszynski 	return 0;
58359b84f8SDamian Muszynski }
59359b84f8SDamian Muszynski 
adf_heartbeat_start(struct adf_accel_dev * accel_dev)60359b84f8SDamian Muszynski static inline int adf_heartbeat_start(struct adf_accel_dev *accel_dev)
61359b84f8SDamian Muszynski {
62359b84f8SDamian Muszynski 	return 0;
63359b84f8SDamian Muszynski }
64359b84f8SDamian Muszynski 
adf_heartbeat_shutdown(struct adf_accel_dev * accel_dev)65359b84f8SDamian Muszynski static inline void adf_heartbeat_shutdown(struct adf_accel_dev *accel_dev)
66359b84f8SDamian Muszynski {
67359b84f8SDamian Muszynski }
68359b84f8SDamian Muszynski 
adf_heartbeat_save_cfg_param(struct adf_accel_dev * accel_dev,unsigned int timer_ms)69359b84f8SDamian Muszynski static inline int adf_heartbeat_save_cfg_param(struct adf_accel_dev *accel_dev,
70359b84f8SDamian Muszynski 					       unsigned int timer_ms)
71359b84f8SDamian Muszynski {
72359b84f8SDamian Muszynski 	return 0;
73359b84f8SDamian Muszynski }
74*bec61a29SDamian Muszynski 
adf_heartbeat_check_ctrs(struct adf_accel_dev * accel_dev)75*bec61a29SDamian Muszynski static inline void adf_heartbeat_check_ctrs(struct adf_accel_dev *accel_dev)
76*bec61a29SDamian Muszynski {
77*bec61a29SDamian Muszynski }
78359b84f8SDamian Muszynski #endif
79359b84f8SDamian Muszynski #endif /* ADF_HEARTBEAT_H_ */
80