xref: /dpdk/drivers/net/hinic/base/hinic_pmd_eqs.h (revision 17ff26b6302416a1b97d566fd744bf28488c76a8)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Huawei Technologies Co., Ltd
3  */
4 
5 #ifndef _HINIC_PMD_EQS_H_
6 #define _HINIC_PMD_EQS_H_
7 
8 #define HINIC_EQ_PAGE_SIZE		0x00001000
9 
10 #define HINIC_AEQN_START		0
11 #define HINIC_MAX_AEQS			4
12 #define HINIC_MIN_AEQS			2
13 #define HINIC_AEQN_0			0
14 #define HINIC_AEQN_1			1
15 #define HINIC_AEQN_2			2
16 
17 #define HINIC_EQ_MAX_PAGES		8
18 
19 #define HINIC_AEQE_SIZE			64
20 #define HINIC_CEQE_SIZE			4
21 
22 #define HINIC_AEQE_DESC_SIZE		4
23 #define HINIC_AEQE_DATA_SIZE		\
24 			(HINIC_AEQE_SIZE - HINIC_AEQE_DESC_SIZE)
25 
26 #define HINIC_DEFAULT_AEQ_LEN		64
27 
28 #define GET_EQ_ELEMENT(eq, idx)		\
29 		(((u8 *)(eq)->virt_addr[(idx) / (eq)->num_elem_in_pg]) + \
30 		(((u32)(idx) & ((eq)->num_elem_in_pg - 1)) * (eq)->elem_size))
31 
32 #define GET_AEQ_ELEM(eq, idx)		\
33 			((struct hinic_aeq_elem *)GET_EQ_ELEMENT((eq), (idx)))
34 
35 #define GET_CEQ_ELEM(eq, idx)	((u32 *)GET_EQ_ELEMENT((eq), (idx)))
36 
37 enum hinic_eq_intr_mode {
38 	HINIC_INTR_MODE_ARMED,
39 	HINIC_INTR_MODE_ALWAYS,
40 };
41 
42 enum hinic_eq_ci_arm_state {
43 	HINIC_EQ_NOT_ARMED,
44 	HINIC_EQ_ARMED,
45 };
46 
47 enum hinic_aeq_type {
48 	HINIC_HW_INTER_INT = 0,
49 	HINIC_MBX_FROM_FUNC = 1,
50 	HINIC_MSG_FROM_MGMT_CPU = 2,
51 	HINIC_API_RSP = 3,
52 	HINIC_API_CHAIN_STS = 4,
53 	HINIC_MBX_SEND_RSLT = 5,
54 	HINIC_MAX_AEQ_EVENTS
55 };
56 
57 #define HINIC_RETRY_NUM	(10)
58 
59 struct hinic_eq {
60 	struct hinic_hwdev		*hwdev;
61 	u16				q_id;
62 	u16				type;
63 	u32				page_size;
64 	u16				eq_len;
65 
66 	u16				cons_idx;
67 	u16				wrapped;
68 
69 	u16				elem_size;
70 	u16				num_pages;
71 	u32				num_elem_in_pg;
72 
73 	struct irq_info			eq_irq;
74 
75 	dma_addr_t			*dma_addr;
76 	u8				**virt_addr;
77 
78 	u16				poll_retry_nr;
79 };
80 
81 struct hinic_aeq_elem {
82 	u8	aeqe_data[HINIC_AEQE_DATA_SIZE];
83 	u32	desc;
84 };
85 
86 struct hinic_aeqs {
87 	struct hinic_hwdev	*hwdev;
88 	u16			poll_retry_nr;
89 
90 	struct hinic_eq		aeq[HINIC_MAX_AEQS];
91 	u16			num_aeqs;
92 };
93 
94 void eq_update_ci(struct hinic_eq *eq);
95 
96 void hinic_dump_aeq_info(struct hinic_hwdev *hwdev);
97 
98 int hinic_comm_aeqs_init(struct hinic_hwdev *hwdev);
99 
100 void hinic_comm_aeqs_free(struct hinic_hwdev *hwdev);
101 
102 #endif /* _HINIC_PMD_EQS_H_ */
103