1828d3e15SZiyang Xuan /* SPDX-License-Identifier: BSD-3-Clause 2828d3e15SZiyang Xuan * Copyright(c) 2017 Huawei Technologies Co., Ltd 3828d3e15SZiyang Xuan */ 4828d3e15SZiyang Xuan 5828d3e15SZiyang Xuan #ifndef _HINIC_PMD_NICIO_H_ 6828d3e15SZiyang Xuan #define _HINIC_PMD_NICIO_H_ 7828d3e15SZiyang Xuan 8828d3e15SZiyang Xuan #define RX_BUF_LEN_16K 16384 9828d3e15SZiyang Xuan #define RX_BUF_LEN_1_5K 1536 10828d3e15SZiyang Xuan 11*ee2cf75eSXiaoyun Wang /* vhd type */ 12*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_0B 2 13*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_10B 1 14*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_12B 0 15*ee2cf75eSXiaoyun Wang 16828d3e15SZiyang Xuan #define HINIC_Q_CTXT_MAX 42 17828d3e15SZiyang Xuan 18828d3e15SZiyang Xuan /* performance: ci addr RTE_CACHE_SIZE(64B) alignment */ 19828d3e15SZiyang Xuan #define HINIC_CI_Q_ADDR_SIZE 64 20828d3e15SZiyang Xuan 21828d3e15SZiyang Xuan #define CI_TABLE_SIZE(num_qps, pg_sz) \ 22828d3e15SZiyang Xuan (ALIGN((num_qps) * HINIC_CI_Q_ADDR_SIZE, pg_sz)) 23828d3e15SZiyang Xuan 24828d3e15SZiyang Xuan #define HINIC_CI_VADDR(base_addr, q_id) \ 25828d3e15SZiyang Xuan ((u8 *)(base_addr) + (q_id) * HINIC_CI_Q_ADDR_SIZE) 26828d3e15SZiyang Xuan 27828d3e15SZiyang Xuan #define HINIC_CI_PADDR(base_paddr, q_id) \ 28828d3e15SZiyang Xuan ((base_paddr) + (q_id) * HINIC_CI_Q_ADDR_SIZE) 29828d3e15SZiyang Xuan 30828d3e15SZiyang Xuan #define Q_CTXT_SIZE 48 31828d3e15SZiyang Xuan #define TSO_LRO_CTXT_SIZE 240 32828d3e15SZiyang Xuan 33828d3e15SZiyang Xuan #define SQ_CTXT_OFFSET(max_sqs, max_rqs, q_id) \ 34828d3e15SZiyang Xuan (((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE + \ 35828d3e15SZiyang Xuan (q_id) * Q_CTXT_SIZE) 36828d3e15SZiyang Xuan 37828d3e15SZiyang Xuan #define RQ_CTXT_OFFSET(max_sqs, max_rqs, q_id) \ 38828d3e15SZiyang Xuan (((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE + \ 39828d3e15SZiyang Xuan (max_sqs) * Q_CTXT_SIZE + (q_id) * Q_CTXT_SIZE) 40828d3e15SZiyang Xuan 41828d3e15SZiyang Xuan #define SQ_CTXT_SIZE(num_sqs) \ 42828d3e15SZiyang Xuan ((u16)(sizeof(struct hinic_qp_ctxt_header) + \ 43828d3e15SZiyang Xuan (num_sqs) * sizeof(struct hinic_sq_ctxt))) 44828d3e15SZiyang Xuan 45828d3e15SZiyang Xuan #define RQ_CTXT_SIZE(num_rqs) \ 46828d3e15SZiyang Xuan ((u16)(sizeof(struct hinic_qp_ctxt_header) + \ 47828d3e15SZiyang Xuan (num_rqs) * sizeof(struct hinic_rq_ctxt))) 48828d3e15SZiyang Xuan 49828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_CEQ_ID_SHIFT 8 50828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_SHIFT 13 51828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_EN_SHIFT 23 52828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_ARM_SHIFT 31 53828d3e15SZiyang Xuan 54828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_CEQ_ID_MASK 0x1FU 55828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_MASK 0x3FFU 56828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_EN_MASK 0x1U 57828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_ARM_MASK 0x1U 58828d3e15SZiyang Xuan 59828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_SET(val, member) \ 60828d3e15SZiyang Xuan (((val) & SQ_CTXT_CEQ_ATTR_##member##_MASK) << \ 61828d3e15SZiyang Xuan SQ_CTXT_CEQ_ATTR_##member##_SHIFT) 62828d3e15SZiyang Xuan 63828d3e15SZiyang Xuan #define SQ_CTXT_CI_IDX_SHIFT 11 64828d3e15SZiyang Xuan #define SQ_CTXT_CI_OWNER_SHIFT 23 65828d3e15SZiyang Xuan 66828d3e15SZiyang Xuan #define SQ_CTXT_CI_IDX_MASK 0xFFFU 67828d3e15SZiyang Xuan #define SQ_CTXT_CI_OWNER_MASK 0x1U 68828d3e15SZiyang Xuan 69828d3e15SZiyang Xuan #define SQ_CTXT_CI_SET(val, member) \ 70828d3e15SZiyang Xuan (((val) & SQ_CTXT_CI_##member##_MASK) << SQ_CTXT_CI_##member##_SHIFT) 71828d3e15SZiyang Xuan 72828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_HI_PFN_SHIFT 0 73828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_PI_SHIFT 20 74828d3e15SZiyang Xuan 75828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_HI_PFN_MASK 0xFFFFFU 76828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_PI_MASK 0xFFFU 77828d3e15SZiyang Xuan 78828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_SET(val, member) \ 79828d3e15SZiyang Xuan (((val) & SQ_CTXT_WQ_PAGE_##member##_MASK) << \ 80828d3e15SZiyang Xuan SQ_CTXT_WQ_PAGE_##member##_SHIFT) 81828d3e15SZiyang Xuan 82828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT 0 83828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MAX_SHIFT 14 84828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MIN_SHIFT 25 85828d3e15SZiyang Xuan 86828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_THRESHOLD_MASK 0x3FFFU 87828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MAX_MASK 0x7FFU 88828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MIN_MASK 0x7FU 89828d3e15SZiyang Xuan 90828d3e15SZiyang Xuan #define SQ_CTXT_PREF_WQ_PFN_HI_SHIFT 0 91828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CI_SHIFT 20 92828d3e15SZiyang Xuan 93828d3e15SZiyang Xuan #define SQ_CTXT_PREF_WQ_PFN_HI_MASK 0xFFFFFU 94828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CI_MASK 0xFFFU 95828d3e15SZiyang Xuan 96828d3e15SZiyang Xuan #define SQ_CTXT_PREF_SET(val, member) \ 97828d3e15SZiyang Xuan (((val) & SQ_CTXT_PREF_##member##_MASK) << \ 98828d3e15SZiyang Xuan SQ_CTXT_PREF_##member##_SHIFT) 99828d3e15SZiyang Xuan 100828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT 0 101828d3e15SZiyang Xuan 102828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_PFN_HI_MASK 0x7FFFFFU 103828d3e15SZiyang Xuan 104828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_SET(val, member) \ 105828d3e15SZiyang Xuan (((val) & SQ_CTXT_WQ_BLOCK_##member##_MASK) << \ 106828d3e15SZiyang Xuan SQ_CTXT_WQ_BLOCK_##member##_SHIFT) 107828d3e15SZiyang Xuan 108828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_EN_SHIFT 0 109828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_OWNER_SHIFT 1 110828d3e15SZiyang Xuan 111828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_EN_MASK 0x1U 112828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_OWNER_MASK 0x1U 113828d3e15SZiyang Xuan 114828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_SET(val, member) \ 115828d3e15SZiyang Xuan (((val) & RQ_CTXT_CEQ_ATTR_##member##_MASK) << \ 116828d3e15SZiyang Xuan RQ_CTXT_CEQ_ATTR_##member##_SHIFT) 117828d3e15SZiyang Xuan 118828d3e15SZiyang Xuan #define RQ_CTXT_PI_IDX_SHIFT 0 119828d3e15SZiyang Xuan #define RQ_CTXT_PI_INTR_SHIFT 22 120828d3e15SZiyang Xuan #define RQ_CTXT_PI_CEQ_ARM_SHIFT 31 121828d3e15SZiyang Xuan 122828d3e15SZiyang Xuan #define RQ_CTXT_PI_IDX_MASK 0xFFFU 123828d3e15SZiyang Xuan #define RQ_CTXT_PI_INTR_MASK 0x3FFU 124828d3e15SZiyang Xuan #define RQ_CTXT_PI_CEQ_ARM_MASK 0x1U 125828d3e15SZiyang Xuan 126828d3e15SZiyang Xuan #define RQ_CTXT_PI_SET(val, member) \ 127828d3e15SZiyang Xuan (((val) & RQ_CTXT_PI_##member##_MASK) << RQ_CTXT_PI_##member##_SHIFT) 128828d3e15SZiyang Xuan 129828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_HI_PFN_SHIFT 0 130828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_CI_SHIFT 20 131828d3e15SZiyang Xuan 132828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_HI_PFN_MASK 0xFFFFFU 133828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_CI_MASK 0xFFFU 134828d3e15SZiyang Xuan 135828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_SET(val, member) \ 136828d3e15SZiyang Xuan (((val) & RQ_CTXT_WQ_PAGE_##member##_MASK) << \ 137828d3e15SZiyang Xuan RQ_CTXT_WQ_PAGE_##member##_SHIFT) 138828d3e15SZiyang Xuan 139828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT 0 140828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MAX_SHIFT 14 141828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MIN_SHIFT 25 142828d3e15SZiyang Xuan 143828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_THRESHOLD_MASK 0x3FFFU 144828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MAX_MASK 0x7FFU 145828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MIN_MASK 0x7FU 146828d3e15SZiyang Xuan 147828d3e15SZiyang Xuan #define RQ_CTXT_PREF_WQ_PFN_HI_SHIFT 0 148828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CI_SHIFT 20 149828d3e15SZiyang Xuan 150828d3e15SZiyang Xuan #define RQ_CTXT_PREF_WQ_PFN_HI_MASK 0xFFFFFU 151828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CI_MASK 0xFFFU 152828d3e15SZiyang Xuan 153828d3e15SZiyang Xuan #define RQ_CTXT_PREF_SET(val, member) \ 154828d3e15SZiyang Xuan (((val) & RQ_CTXT_PREF_##member##_MASK) << \ 155828d3e15SZiyang Xuan RQ_CTXT_PREF_##member##_SHIFT) 156828d3e15SZiyang Xuan 157828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT 0 158828d3e15SZiyang Xuan 159828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_PFN_HI_MASK 0x7FFFFFU 160828d3e15SZiyang Xuan 161828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_SET(val, member) \ 162828d3e15SZiyang Xuan (((val) & RQ_CTXT_WQ_BLOCK_##member##_MASK) << \ 163828d3e15SZiyang Xuan RQ_CTXT_WQ_BLOCK_##member##_SHIFT) 164828d3e15SZiyang Xuan 165828d3e15SZiyang Xuan #define SIZE_16BYTES(size) (ALIGN((size), 16) >> 4) 166828d3e15SZiyang Xuan 167828d3e15SZiyang Xuan enum hinic_qp_ctxt_type { 168828d3e15SZiyang Xuan HINIC_QP_CTXT_TYPE_SQ, 169828d3e15SZiyang Xuan HINIC_QP_CTXT_TYPE_RQ, 170828d3e15SZiyang Xuan }; 171828d3e15SZiyang Xuan 172828d3e15SZiyang Xuan struct hinic_sq { 173828d3e15SZiyang Xuan struct hinic_wq *wq; 174828d3e15SZiyang Xuan volatile u16 *cons_idx_addr; 175828d3e15SZiyang Xuan void __iomem *db_addr; 176828d3e15SZiyang Xuan 177828d3e15SZiyang Xuan u16 q_id; 178828d3e15SZiyang Xuan u16 owner; 179828d3e15SZiyang Xuan u16 sq_depth; 180828d3e15SZiyang Xuan }; 181828d3e15SZiyang Xuan 182828d3e15SZiyang Xuan struct hinic_rq { 183828d3e15SZiyang Xuan struct hinic_wq *wq; 184828d3e15SZiyang Xuan volatile u16 *pi_virt_addr; 185828d3e15SZiyang Xuan dma_addr_t pi_dma_addr; 186828d3e15SZiyang Xuan 187828d3e15SZiyang Xuan u16 irq_id; 188828d3e15SZiyang Xuan u16 msix_entry_idx; 189828d3e15SZiyang Xuan u16 q_id; 190828d3e15SZiyang Xuan u16 rq_depth; 191828d3e15SZiyang Xuan }; 192828d3e15SZiyang Xuan 193828d3e15SZiyang Xuan struct hinic_qp { 194828d3e15SZiyang Xuan struct hinic_sq sq; 195828d3e15SZiyang Xuan struct hinic_rq rq; 196828d3e15SZiyang Xuan }; 197828d3e15SZiyang Xuan 198828d3e15SZiyang Xuan struct hinic_event { 199828d3e15SZiyang Xuan void (*tx_ack)(void *handle, u16 q_id); 200828d3e15SZiyang Xuan /* status: 0 - link down; 1 - link up */ 201828d3e15SZiyang Xuan void (*link_change)(void *handle, int status); 202828d3e15SZiyang Xuan }; 203828d3e15SZiyang Xuan 204828d3e15SZiyang Xuan struct hinic_nic_io { 205828d3e15SZiyang Xuan struct hinic_hwdev *hwdev; 206828d3e15SZiyang Xuan 207828d3e15SZiyang Xuan u16 global_qpn; 208828d3e15SZiyang Xuan 209828d3e15SZiyang Xuan struct hinic_wq *sq_wq; 210828d3e15SZiyang Xuan struct hinic_wq *rq_wq; 211828d3e15SZiyang Xuan 212828d3e15SZiyang Xuan u16 max_qps; 213828d3e15SZiyang Xuan u16 num_qps; 214828d3e15SZiyang Xuan 215828d3e15SZiyang Xuan u16 num_sqs; 216828d3e15SZiyang Xuan u16 num_rqs; 217828d3e15SZiyang Xuan 218828d3e15SZiyang Xuan u16 sq_depth; 219828d3e15SZiyang Xuan u16 rq_depth; 220828d3e15SZiyang Xuan 221828d3e15SZiyang Xuan u16 rq_buf_size; 222828d3e15SZiyang Xuan u16 vhd_mode; 223828d3e15SZiyang Xuan 224828d3e15SZiyang Xuan struct hinic_qp *qps; 225828d3e15SZiyang Xuan /* sq ci mem base addr of the function */ 226828d3e15SZiyang Xuan void *ci_vaddr_base; 227828d3e15SZiyang Xuan dma_addr_t ci_dma_base; 228828d3e15SZiyang Xuan 229828d3e15SZiyang Xuan struct hinic_event event; 230828d3e15SZiyang Xuan void *event_handle; 231828d3e15SZiyang Xuan }; 232828d3e15SZiyang Xuan 233828d3e15SZiyang Xuan struct hinic_sq_db { 234828d3e15SZiyang Xuan u32 db_info; 235828d3e15SZiyang Xuan }; 236828d3e15SZiyang Xuan 237828d3e15SZiyang Xuan int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev); 238828d3e15SZiyang Xuan 239828d3e15SZiyang Xuan void hinic_free_qp_ctxts(struct hinic_hwdev *hwdev); 240828d3e15SZiyang Xuan 241828d3e15SZiyang Xuan int hinic_rx_tx_flush(struct hinic_hwdev *hwdev); 242828d3e15SZiyang Xuan 243828d3e15SZiyang Xuan int hinic_get_sq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id); 244828d3e15SZiyang Xuan 245828d3e15SZiyang Xuan u16 hinic_get_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id); 246828d3e15SZiyang Xuan 247828d3e15SZiyang Xuan void hinic_update_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id, 248828d3e15SZiyang Xuan int wqebb_cnt); 249828d3e15SZiyang Xuan 250828d3e15SZiyang Xuan void hinic_return_sq_wqe(struct hinic_hwdev *hwdev, u16 q_id, 251828d3e15SZiyang Xuan int num_wqebbs, u16 owner); 252828d3e15SZiyang Xuan 253828d3e15SZiyang Xuan int hinic_get_rq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id); 254828d3e15SZiyang Xuan 255828d3e15SZiyang Xuan void *hinic_get_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, u16 *pi); 256828d3e15SZiyang Xuan 257828d3e15SZiyang Xuan void hinic_return_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, int num_wqebbs); 258828d3e15SZiyang Xuan 259828d3e15SZiyang Xuan u16 hinic_get_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id); 260828d3e15SZiyang Xuan 261828d3e15SZiyang Xuan void hinic_update_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id, int wqe_cnt); 262828d3e15SZiyang Xuan 263828d3e15SZiyang Xuan int hinic_init_nicio(struct hinic_hwdev *hwdev); 264828d3e15SZiyang Xuan 265828d3e15SZiyang Xuan void hinic_deinit_nicio(struct hinic_hwdev *hwdev); 266828d3e15SZiyang Xuan 267828d3e15SZiyang Xuan int hinic_convert_rx_buf_size(u32 rx_buf_sz, u32 *match_sz); 268828d3e15SZiyang Xuan 269828d3e15SZiyang Xuan #endif /* _HINIC_PMD_NICIO_H_ */ 270