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_WQ_H_ 6828d3e15SZiyang Xuan #define _HINIC_PMD_WQ_H_ 7828d3e15SZiyang Xuan 8828d3e15SZiyang Xuan #define WQS_BLOCKS_PER_PAGE 4 9828d3e15SZiyang Xuan 10828d3e15SZiyang Xuan #define WQ_SIZE(wq) (u32)((u64)(wq)->q_depth * (wq)->wqebb_size) 11828d3e15SZiyang Xuan 12828d3e15SZiyang Xuan #define WQE_PAGE_NUM(wq, idx) (((idx) >> ((wq)->wqebbs_per_page_shift)) & \ 13828d3e15SZiyang Xuan ((wq)->num_q_pages - 1)) 14828d3e15SZiyang Xuan 15828d3e15SZiyang Xuan #define WQE_PAGE_OFF(wq, idx) ((u64)((wq)->wqebb_size) * \ 16828d3e15SZiyang Xuan ((idx) & ((wq)->num_wqebbs_per_page - 1))) 17828d3e15SZiyang Xuan 18828d3e15SZiyang Xuan #define WQ_PAGE_ADDR_SIZE sizeof(u64) 19828d3e15SZiyang Xuan #define WQ_PAGE_ADDR_SIZE_SHIFT 3 20828d3e15SZiyang Xuan #define WQ_PAGE_ADDR(wq, idx) \ 21828d3e15SZiyang Xuan (u8 *)(*(u64 *)((u64)((wq)->shadow_block_vaddr) + \ 22828d3e15SZiyang Xuan (WQE_PAGE_NUM(wq, idx) << WQ_PAGE_ADDR_SIZE_SHIFT))) 23828d3e15SZiyang Xuan 24828d3e15SZiyang Xuan #define WQ_BLOCK_SIZE 4096UL 25828d3e15SZiyang Xuan #define WQS_PAGE_SIZE (WQS_BLOCKS_PER_PAGE * WQ_BLOCK_SIZE) 26828d3e15SZiyang Xuan #define WQ_MAX_PAGES (WQ_BLOCK_SIZE >> WQ_PAGE_ADDR_SIZE_SHIFT) 27828d3e15SZiyang Xuan 28828d3e15SZiyang Xuan #define CMDQ_BLOCKS_PER_PAGE 8 29828d3e15SZiyang Xuan #define CMDQ_BLOCK_SIZE 512UL 30828d3e15SZiyang Xuan #define CMDQ_PAGE_SIZE ALIGN((CMDQ_BLOCKS_PER_PAGE * \ 31828d3e15SZiyang Xuan CMDQ_BLOCK_SIZE), PAGE_SIZE) 32828d3e15SZiyang Xuan 33828d3e15SZiyang Xuan #define ADDR_4K_ALIGNED(addr) (0 == ((addr) & 0xfff)) 34828d3e15SZiyang Xuan #define ADDR_256K_ALIGNED(addr) (0 == ((addr) & 0x3ffff)) 35828d3e15SZiyang Xuan 36828d3e15SZiyang Xuan #define WQ_BASE_VADDR(wqs, wq) \ 37828d3e15SZiyang Xuan (u64 *)(((u64)((wqs)->page_vaddr[(wq)->page_idx])) \ 38828d3e15SZiyang Xuan + (wq)->block_idx * WQ_BLOCK_SIZE) 39828d3e15SZiyang Xuan 40828d3e15SZiyang Xuan #define WQ_BASE_PADDR(wqs, wq) (((wqs)->page_paddr[(wq)->page_idx]) \ 41828d3e15SZiyang Xuan + (u64)(wq)->block_idx * WQ_BLOCK_SIZE) 42828d3e15SZiyang Xuan 43828d3e15SZiyang Xuan #define WQ_BASE_ADDR(wqs, wq) \ 44828d3e15SZiyang Xuan (u64 *)(((u64)((wqs)->shadow_page_vaddr[(wq)->page_idx])) \ 45828d3e15SZiyang Xuan + (wq)->block_idx * WQ_BLOCK_SIZE) 46828d3e15SZiyang Xuan 47828d3e15SZiyang Xuan #define CMDQ_BASE_VADDR(cmdq_pages, wq) \ 48828d3e15SZiyang Xuan (u64 *)(((u64)((cmdq_pages)->cmdq_page_vaddr)) \ 49828d3e15SZiyang Xuan + (wq)->block_idx * CMDQ_BLOCK_SIZE) 50828d3e15SZiyang Xuan 51828d3e15SZiyang Xuan #define CMDQ_BASE_PADDR(cmdq_pages, wq) \ 52828d3e15SZiyang Xuan (((u64)((cmdq_pages)->cmdq_page_paddr)) \ 53828d3e15SZiyang Xuan + (u64)(wq)->block_idx * CMDQ_BLOCK_SIZE) 54828d3e15SZiyang Xuan 55828d3e15SZiyang Xuan #define CMDQ_BASE_ADDR(cmdq_pages, wq) \ 56828d3e15SZiyang Xuan (u64 *)(((u64)((cmdq_pages)->cmdq_shadow_page_vaddr)) \ 57828d3e15SZiyang Xuan + (wq)->block_idx * CMDQ_BLOCK_SIZE) 58828d3e15SZiyang Xuan 59828d3e15SZiyang Xuan #define MASKED_WQE_IDX(wq, idx) ((idx) & (wq)->mask) 60828d3e15SZiyang Xuan 61828d3e15SZiyang Xuan #define WQE_SHADOW_PAGE(wq, wqe) \ 62828d3e15SZiyang Xuan (u16)(((unsigned long)(wqe) - (unsigned long)(wq)->shadow_wqe) \ 63828d3e15SZiyang Xuan / (wq)->max_wqe_size) 64828d3e15SZiyang Xuan 65828d3e15SZiyang Xuan #define WQE_IN_RANGE(wqe, start, end) \ 66828d3e15SZiyang Xuan (((unsigned long)(wqe) >= (unsigned long)(start)) && \ 67828d3e15SZiyang Xuan ((unsigned long)(wqe) < (unsigned long)(end))) 68828d3e15SZiyang Xuan 69828d3e15SZiyang Xuan #define WQ_NUM_PAGES(num_wqs) \ 70828d3e15SZiyang Xuan (ALIGN((u32)num_wqs, WQS_BLOCKS_PER_PAGE) / WQS_BLOCKS_PER_PAGE) 71828d3e15SZiyang Xuan 72828d3e15SZiyang Xuan #define WQ_WQE_ADDR(wq, idx) ((void *)((u64)((wq)->queue_buf_vaddr) + \ 73828d3e15SZiyang Xuan ((idx) << (wq)->wqebb_shift))) 74828d3e15SZiyang Xuan 75828d3e15SZiyang Xuan #define WQ_PAGE_PFN_SHIFT 12 76828d3e15SZiyang Xuan #define WQ_BLOCK_PFN_SHIFT 9 77828d3e15SZiyang Xuan 78828d3e15SZiyang Xuan #define WQ_PAGE_PFN(page_addr) ((page_addr) >> WQ_PAGE_PFN_SHIFT) 79828d3e15SZiyang Xuan #define WQ_BLOCK_PFN(page_addr) ((page_addr) >> WQ_BLOCK_PFN_SHIFT) 80828d3e15SZiyang Xuan 81828d3e15SZiyang Xuan 82828d3e15SZiyang Xuan #define HINIC_SQ_WQEBB_SIZE 64 83828d3e15SZiyang Xuan #define HINIC_RQ_WQE_SIZE 32 84828d3e15SZiyang Xuan #define HINIC_SQ_WQEBB_SHIFT 6 85828d3e15SZiyang Xuan #define HINIC_RQ_WQEBB_SHIFT 5 86828d3e15SZiyang Xuan 87828d3e15SZiyang Xuan struct hinic_sge { 88828d3e15SZiyang Xuan u32 hi_addr; 89828d3e15SZiyang Xuan u32 lo_addr; 90828d3e15SZiyang Xuan u32 len; 91828d3e15SZiyang Xuan }; 92828d3e15SZiyang Xuan 93828d3e15SZiyang Xuan /* Working Queue */ 94828d3e15SZiyang Xuan struct hinic_wq { 95828d3e15SZiyang Xuan /* The addresses are 64 bit in the HW */ 96828d3e15SZiyang Xuan u64 queue_buf_vaddr; 97828d3e15SZiyang Xuan 98828d3e15SZiyang Xuan u16 q_depth; 99828d3e15SZiyang Xuan u16 mask; 100828d3e15SZiyang Xuan u32 delta; 101828d3e15SZiyang Xuan 102828d3e15SZiyang Xuan u32 cons_idx; 103828d3e15SZiyang Xuan u32 prod_idx; 104828d3e15SZiyang Xuan 105828d3e15SZiyang Xuan u64 queue_buf_paddr; 106828d3e15SZiyang Xuan 107828d3e15SZiyang Xuan u32 wqebb_size; 108828d3e15SZiyang Xuan u32 wqebb_shift; 109828d3e15SZiyang Xuan 110828d3e15SZiyang Xuan u32 wq_buf_size; 111828d3e15SZiyang Xuan 112828d3e15SZiyang Xuan u32 rsvd[5]; 113828d3e15SZiyang Xuan }; 114828d3e15SZiyang Xuan 115828d3e15SZiyang Xuan void hinic_wq_wqe_pg_clear(struct hinic_wq *wq); 116828d3e15SZiyang Xuan 117828d3e15SZiyang Xuan int hinic_cmdq_alloc(struct hinic_wq *wq, struct hinic_hwdev *hwdev, 118828d3e15SZiyang Xuan int cmdq_blocks, u32 wq_buf_size, u32 wqebb_shift, 119828d3e15SZiyang Xuan u16 q_depth); 120828d3e15SZiyang Xuan 121828d3e15SZiyang Xuan void hinic_cmdq_free(struct hinic_hwdev *hwdev, struct hinic_wq *wq, 122828d3e15SZiyang Xuan int cmdq_blocks); 123828d3e15SZiyang Xuan 124828d3e15SZiyang Xuan int hinic_wq_allocate(struct hinic_hwdev *hwdev, struct hinic_wq *wq, 125*1b7b9f17SXiaoyun Wang u32 wqebb_shift, u16 q_depth, unsigned int socket_id); 126828d3e15SZiyang Xuan 127828d3e15SZiyang Xuan void hinic_wq_free(struct hinic_hwdev *hwdev, struct hinic_wq *wq); 128828d3e15SZiyang Xuan 129828d3e15SZiyang Xuan void *hinic_get_wqe(struct hinic_wq *wq, int num_wqebbs, u16 *prod_idx); 130828d3e15SZiyang Xuan 131828d3e15SZiyang Xuan void hinic_put_wqe(struct hinic_wq *wq, int num_wqebbs); 132828d3e15SZiyang Xuan 133828d3e15SZiyang Xuan void *hinic_read_wqe(struct hinic_wq *wq, int num_wqebbs, u16 *cons_idx); 134828d3e15SZiyang Xuan 135828d3e15SZiyang Xuan void hinic_set_sge(struct hinic_sge *sge, dma_addr_t addr, u32 len); 136828d3e15SZiyang Xuan 137828d3e15SZiyang Xuan #endif /* _HINIC_PMD_WQ_H_ */ 138