xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_eqs.h (revision ec2e0fb07d789976c601bec19ecced7a501c3705)
1a4511307SFan Gong /* SPDX-License-Identifier: GPL-2.0 */
2a4511307SFan Gong /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */
3a4511307SFan Gong 
4a4511307SFan Gong #ifndef _HINIC3_EQS_H_
5a4511307SFan Gong #define _HINIC3_EQS_H_
6a4511307SFan Gong 
7a4511307SFan Gong #include <linux/interrupt.h>
8a4511307SFan Gong 
9a4511307SFan Gong #include "hinic3_hw_cfg.h"
10a4511307SFan Gong #include "hinic3_queue_common.h"
11a4511307SFan Gong 
12a4511307SFan Gong #define HINIC3_MAX_AEQS              4
13*c4bbfd9bSFan Gong #define HINIC3_MAX_CEQS              32
14a4511307SFan Gong 
15a4511307SFan Gong #define HINIC3_AEQ_MAX_PAGES         4
16*c4bbfd9bSFan Gong #define HINIC3_CEQ_MAX_PAGES         8
17a4511307SFan Gong 
18a4511307SFan Gong #define HINIC3_AEQE_SIZE             64
19*c4bbfd9bSFan Gong #define HINIC3_CEQE_SIZE             4
20a4511307SFan Gong 
21a4511307SFan Gong #define HINIC3_AEQE_DESC_SIZE        4
22a4511307SFan Gong #define HINIC3_AEQE_DATA_SIZE        (HINIC3_AEQE_SIZE - HINIC3_AEQE_DESC_SIZE)
23a4511307SFan Gong 
24a4511307SFan Gong #define HINIC3_DEFAULT_AEQ_LEN       0x10000
25*c4bbfd9bSFan Gong #define HINIC3_DEFAULT_CEQ_LEN       0x10000
26a4511307SFan Gong 
27a4511307SFan Gong #define HINIC3_EQ_IRQ_NAME_LEN       64
28a4511307SFan Gong 
29a4511307SFan Gong #define HINIC3_EQ_USLEEP_LOW_BOUND   900
30a4511307SFan Gong #define HINIC3_EQ_USLEEP_HIGH_BOUND  1000
31a4511307SFan Gong 
32a4511307SFan Gong enum hinic3_eq_type {
33a4511307SFan Gong 	HINIC3_AEQ = 0,
34*c4bbfd9bSFan Gong 	HINIC3_CEQ = 1,
35a4511307SFan Gong };
36a4511307SFan Gong 
37a4511307SFan Gong enum hinic3_eq_intr_mode {
38a4511307SFan Gong 	HINIC3_INTR_MODE_ARMED  = 0,
39a4511307SFan Gong 	HINIC3_INTR_MODE_ALWAYS = 1,
40a4511307SFan Gong };
41a4511307SFan Gong 
42a4511307SFan Gong enum hinic3_eq_ci_arm_state {
43a4511307SFan Gong 	HINIC3_EQ_NOT_ARMED = 0,
44a4511307SFan Gong 	HINIC3_EQ_ARMED     = 1,
45a4511307SFan Gong };
46a4511307SFan Gong 
47a4511307SFan Gong struct hinic3_eq {
48a4511307SFan Gong 	struct hinic3_hwdev       *hwdev;
49a4511307SFan Gong 	struct hinic3_queue_pages qpages;
50a4511307SFan Gong 	u16                       q_id;
51a4511307SFan Gong 	enum hinic3_eq_type       type;
52a4511307SFan Gong 	u32                       eq_len;
53a4511307SFan Gong 	u32                       cons_idx;
54a4511307SFan Gong 	u8                        wrapped;
55a4511307SFan Gong 	u32                       irq_id;
56a4511307SFan Gong 	u16                       msix_entry_idx;
57a4511307SFan Gong 	char                      irq_name[HINIC3_EQ_IRQ_NAME_LEN];
58a4511307SFan Gong 	struct work_struct        aeq_work;
59a4511307SFan Gong };
60a4511307SFan Gong 
61a4511307SFan Gong struct hinic3_aeq_elem {
62a4511307SFan Gong 	u8     aeqe_data[HINIC3_AEQE_DATA_SIZE];
63a4511307SFan Gong 	__be32 desc;
64a4511307SFan Gong };
65a4511307SFan Gong 
66a4511307SFan Gong enum hinic3_aeq_type {
67a4511307SFan Gong 	HINIC3_HW_INTER_INT   = 0,
68a4511307SFan Gong 	HINIC3_MBX_FROM_FUNC  = 1,
69a4511307SFan Gong 	HINIC3_MSG_FROM_FW    = 2,
70a4511307SFan Gong 	HINIC3_MAX_AEQ_EVENTS = 6,
71a4511307SFan Gong };
72a4511307SFan Gong 
73a4511307SFan Gong typedef void (*hinic3_aeq_event_cb)(struct hinic3_hwdev *hwdev, u8 *data,
74a4511307SFan Gong 				    u8 size);
75a4511307SFan Gong 
76a4511307SFan Gong struct hinic3_aeqs {
77a4511307SFan Gong 	struct hinic3_hwdev     *hwdev;
78a4511307SFan Gong 	hinic3_aeq_event_cb     aeq_cb[HINIC3_MAX_AEQ_EVENTS];
79a4511307SFan Gong 	struct hinic3_eq        aeq[HINIC3_MAX_AEQS];
80a4511307SFan Gong 	u16                     num_aeqs;
81a4511307SFan Gong 	struct workqueue_struct *workq;
82a4511307SFan Gong 	/* lock for aeq event flag */
83a4511307SFan Gong 	spinlock_t              aeq_lock;
84a4511307SFan Gong };
85a4511307SFan Gong 
86*c4bbfd9bSFan Gong enum hinic3_ceq_event {
87*c4bbfd9bSFan Gong 	HINIC3_CMDQ           = 3,
88*c4bbfd9bSFan Gong 	HINIC3_MAX_CEQ_EVENTS = 6,
89*c4bbfd9bSFan Gong };
90*c4bbfd9bSFan Gong 
91*c4bbfd9bSFan Gong typedef void (*hinic3_ceq_event_cb)(struct hinic3_hwdev *hwdev,
92*c4bbfd9bSFan Gong 				    __le32 ceqe_data);
93*c4bbfd9bSFan Gong 
94*c4bbfd9bSFan Gong struct hinic3_ceqs {
95*c4bbfd9bSFan Gong 	struct hinic3_hwdev *hwdev;
96*c4bbfd9bSFan Gong 
97*c4bbfd9bSFan Gong 	hinic3_ceq_event_cb ceq_cb[HINIC3_MAX_CEQ_EVENTS];
98*c4bbfd9bSFan Gong 
99*c4bbfd9bSFan Gong 	struct hinic3_eq    ceq[HINIC3_MAX_CEQS];
100*c4bbfd9bSFan Gong 	u16                 num_ceqs;
101*c4bbfd9bSFan Gong 	/* lock for ceq event flag */
102*c4bbfd9bSFan Gong 	spinlock_t          ceq_lock;
103*c4bbfd9bSFan Gong };
104*c4bbfd9bSFan Gong 
105a4511307SFan Gong int hinic3_aeqs_init(struct hinic3_hwdev *hwdev, u16 num_aeqs,
106a4511307SFan Gong 		     struct msix_entry *msix_entries);
107a4511307SFan Gong void hinic3_aeqs_free(struct hinic3_hwdev *hwdev);
108a4511307SFan Gong int hinic3_aeq_register_cb(struct hinic3_hwdev *hwdev,
109a4511307SFan Gong 			   enum hinic3_aeq_type event,
110a4511307SFan Gong 			   hinic3_aeq_event_cb hwe_cb);
111a4511307SFan Gong void hinic3_aeq_unregister_cb(struct hinic3_hwdev *hwdev,
112a4511307SFan Gong 			      enum hinic3_aeq_type event);
113*c4bbfd9bSFan Gong int hinic3_ceqs_init(struct hinic3_hwdev *hwdev, u16 num_ceqs,
114*c4bbfd9bSFan Gong 		     struct msix_entry *msix_entries);
115*c4bbfd9bSFan Gong void hinic3_ceqs_free(struct hinic3_hwdev *hwdev);
116*c4bbfd9bSFan Gong int hinic3_ceq_register_cb(struct hinic3_hwdev *hwdev,
117*c4bbfd9bSFan Gong 			   enum hinic3_ceq_event event,
118*c4bbfd9bSFan Gong 			   hinic3_ceq_event_cb callback);
119*c4bbfd9bSFan Gong void hinic3_ceq_unregister_cb(struct hinic3_hwdev *hwdev,
120*c4bbfd9bSFan Gong 			      enum hinic3_ceq_event event);
121a4511307SFan Gong 
122a4511307SFan Gong #endif
123