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