xref: /dpdk/drivers/net/hinic/base/hinic_pmd_eqs.h (revision 17ff26b6302416a1b97d566fd744bf28488c76a8)
178f6c5dbSZiyang Xuan /* SPDX-License-Identifier: BSD-3-Clause
278f6c5dbSZiyang Xuan  * Copyright(c) 2017 Huawei Technologies Co., Ltd
378f6c5dbSZiyang Xuan  */
478f6c5dbSZiyang Xuan 
578f6c5dbSZiyang Xuan #ifndef _HINIC_PMD_EQS_H_
678f6c5dbSZiyang Xuan #define _HINIC_PMD_EQS_H_
778f6c5dbSZiyang Xuan 
878f6c5dbSZiyang Xuan #define HINIC_EQ_PAGE_SIZE		0x00001000
978f6c5dbSZiyang Xuan 
1078f6c5dbSZiyang Xuan #define HINIC_AEQN_START		0
1178f6c5dbSZiyang Xuan #define HINIC_MAX_AEQS			4
12*17ff26b6SGuoyang Zhou #define HINIC_MIN_AEQS			2
13*17ff26b6SGuoyang Zhou #define HINIC_AEQN_0			0
14*17ff26b6SGuoyang Zhou #define HINIC_AEQN_1			1
15*17ff26b6SGuoyang Zhou #define HINIC_AEQN_2			2
1678f6c5dbSZiyang Xuan 
1778f6c5dbSZiyang Xuan #define HINIC_EQ_MAX_PAGES		8
1878f6c5dbSZiyang Xuan 
1978f6c5dbSZiyang Xuan #define HINIC_AEQE_SIZE			64
2078f6c5dbSZiyang Xuan #define HINIC_CEQE_SIZE			4
2178f6c5dbSZiyang Xuan 
2278f6c5dbSZiyang Xuan #define HINIC_AEQE_DESC_SIZE		4
2378f6c5dbSZiyang Xuan #define HINIC_AEQE_DATA_SIZE		\
2478f6c5dbSZiyang Xuan 			(HINIC_AEQE_SIZE - HINIC_AEQE_DESC_SIZE)
2578f6c5dbSZiyang Xuan 
2678f6c5dbSZiyang Xuan #define HINIC_DEFAULT_AEQ_LEN		64
2778f6c5dbSZiyang Xuan 
2878f6c5dbSZiyang Xuan #define GET_EQ_ELEMENT(eq, idx)		\
2978f6c5dbSZiyang Xuan 		(((u8 *)(eq)->virt_addr[(idx) / (eq)->num_elem_in_pg]) + \
3078f6c5dbSZiyang Xuan 		(((u32)(idx) & ((eq)->num_elem_in_pg - 1)) * (eq)->elem_size))
3178f6c5dbSZiyang Xuan 
3278f6c5dbSZiyang Xuan #define GET_AEQ_ELEM(eq, idx)		\
3378f6c5dbSZiyang Xuan 			((struct hinic_aeq_elem *)GET_EQ_ELEMENT((eq), (idx)))
3478f6c5dbSZiyang Xuan 
3578f6c5dbSZiyang Xuan #define GET_CEQ_ELEM(eq, idx)	((u32 *)GET_EQ_ELEMENT((eq), (idx)))
3678f6c5dbSZiyang Xuan 
3778f6c5dbSZiyang Xuan enum hinic_eq_intr_mode {
3878f6c5dbSZiyang Xuan 	HINIC_INTR_MODE_ARMED,
3978f6c5dbSZiyang Xuan 	HINIC_INTR_MODE_ALWAYS,
4078f6c5dbSZiyang Xuan };
4178f6c5dbSZiyang Xuan 
4278f6c5dbSZiyang Xuan enum hinic_eq_ci_arm_state {
4378f6c5dbSZiyang Xuan 	HINIC_EQ_NOT_ARMED,
4478f6c5dbSZiyang Xuan 	HINIC_EQ_ARMED,
4578f6c5dbSZiyang Xuan };
4678f6c5dbSZiyang Xuan 
4778f6c5dbSZiyang Xuan enum hinic_aeq_type {
4878f6c5dbSZiyang Xuan 	HINIC_HW_INTER_INT = 0,
4978f6c5dbSZiyang Xuan 	HINIC_MBX_FROM_FUNC = 1,
5078f6c5dbSZiyang Xuan 	HINIC_MSG_FROM_MGMT_CPU = 2,
5178f6c5dbSZiyang Xuan 	HINIC_API_RSP = 3,
5278f6c5dbSZiyang Xuan 	HINIC_API_CHAIN_STS = 4,
5378f6c5dbSZiyang Xuan 	HINIC_MBX_SEND_RSLT = 5,
5478f6c5dbSZiyang Xuan 	HINIC_MAX_AEQ_EVENTS
5578f6c5dbSZiyang Xuan };
5678f6c5dbSZiyang Xuan 
5778f6c5dbSZiyang Xuan #define HINIC_RETRY_NUM	(10)
5878f6c5dbSZiyang Xuan 
5978f6c5dbSZiyang Xuan struct hinic_eq {
6078f6c5dbSZiyang Xuan 	struct hinic_hwdev		*hwdev;
6178f6c5dbSZiyang Xuan 	u16				q_id;
62dd93390eSXiaoyun Wang 	u16				type;
6378f6c5dbSZiyang Xuan 	u32				page_size;
6478f6c5dbSZiyang Xuan 	u16				eq_len;
6578f6c5dbSZiyang Xuan 
6678f6c5dbSZiyang Xuan 	u16				cons_idx;
6778f6c5dbSZiyang Xuan 	u16				wrapped;
6878f6c5dbSZiyang Xuan 
6978f6c5dbSZiyang Xuan 	u16				elem_size;
7078f6c5dbSZiyang Xuan 	u16				num_pages;
7178f6c5dbSZiyang Xuan 	u32				num_elem_in_pg;
7278f6c5dbSZiyang Xuan 
7378f6c5dbSZiyang Xuan 	struct irq_info			eq_irq;
7478f6c5dbSZiyang Xuan 
7578f6c5dbSZiyang Xuan 	dma_addr_t			*dma_addr;
7678f6c5dbSZiyang Xuan 	u8				**virt_addr;
7778f6c5dbSZiyang Xuan 
7878f6c5dbSZiyang Xuan 	u16				poll_retry_nr;
7978f6c5dbSZiyang Xuan };
8078f6c5dbSZiyang Xuan 
8178f6c5dbSZiyang Xuan struct hinic_aeq_elem {
8278f6c5dbSZiyang Xuan 	u8	aeqe_data[HINIC_AEQE_DATA_SIZE];
8378f6c5dbSZiyang Xuan 	u32	desc;
8478f6c5dbSZiyang Xuan };
8578f6c5dbSZiyang Xuan 
8678f6c5dbSZiyang Xuan struct hinic_aeqs {
8778f6c5dbSZiyang Xuan 	struct hinic_hwdev	*hwdev;
8878f6c5dbSZiyang Xuan 	u16			poll_retry_nr;
8978f6c5dbSZiyang Xuan 
9078f6c5dbSZiyang Xuan 	struct hinic_eq		aeq[HINIC_MAX_AEQS];
9178f6c5dbSZiyang Xuan 	u16			num_aeqs;
9278f6c5dbSZiyang Xuan };
9378f6c5dbSZiyang Xuan 
9478f6c5dbSZiyang Xuan void eq_update_ci(struct hinic_eq *eq);
9578f6c5dbSZiyang Xuan 
9678f6c5dbSZiyang Xuan void hinic_dump_aeq_info(struct hinic_hwdev *hwdev);
9778f6c5dbSZiyang Xuan 
9878f6c5dbSZiyang Xuan int hinic_comm_aeqs_init(struct hinic_hwdev *hwdev);
9978f6c5dbSZiyang Xuan 
10078f6c5dbSZiyang Xuan void hinic_comm_aeqs_free(struct hinic_hwdev *hwdev);
10178f6c5dbSZiyang Xuan 
10278f6c5dbSZiyang Xuan #endif /* _HINIC_PMD_EQS_H_ */
103