17fcd6b05SZiyang Xuan /* SPDX-License-Identifier: BSD-3-Clause 27fcd6b05SZiyang Xuan * Copyright(c) 2017 Huawei Technologies Co., Ltd 37fcd6b05SZiyang Xuan */ 47fcd6b05SZiyang Xuan 57fcd6b05SZiyang Xuan #ifndef _HINIC_PMD_CMDQ_H_ 67fcd6b05SZiyang Xuan #define _HINIC_PMD_CMDQ_H_ 77fcd6b05SZiyang Xuan 87fcd6b05SZiyang Xuan #define HINIC_DB_OFF 0x00000800 97fcd6b05SZiyang Xuan 107fcd6b05SZiyang Xuan #define HINIC_SCMD_DATA_LEN 16 117fcd6b05SZiyang Xuan 12*f8dbaebbSSean Morrissey /* PMD uses 64, kernel l2nic use 4096 */ 137fcd6b05SZiyang Xuan #define HINIC_CMDQ_DEPTH 64 147fcd6b05SZiyang Xuan 157fcd6b05SZiyang Xuan #define HINIC_CMDQ_BUF_SIZE 2048U 167fcd6b05SZiyang Xuan #define HINIC_CMDQ_BUF_HW_RSVD 8 177fcd6b05SZiyang Xuan #define HINIC_CMDQ_MAX_DATA_SIZE (HINIC_CMDQ_BUF_SIZE \ 187fcd6b05SZiyang Xuan - HINIC_CMDQ_BUF_HW_RSVD) 197fcd6b05SZiyang Xuan 207fcd6b05SZiyang Xuan #define HINIC_CEQ_ID_CMDQ 0 217fcd6b05SZiyang Xuan 227fcd6b05SZiyang Xuan enum cmdq_scmd_type { 237fcd6b05SZiyang Xuan CMDQ_SET_ARM_CMD = 2, 247fcd6b05SZiyang Xuan }; 257fcd6b05SZiyang Xuan 267fcd6b05SZiyang Xuan enum cmdq_wqe_type { 277fcd6b05SZiyang Xuan WQE_LCMD_TYPE, 287fcd6b05SZiyang Xuan WQE_SCMD_TYPE, 297fcd6b05SZiyang Xuan }; 307fcd6b05SZiyang Xuan 317fcd6b05SZiyang Xuan enum ctrl_sect_len { 327fcd6b05SZiyang Xuan CTRL_SECT_LEN = 1, 337fcd6b05SZiyang Xuan CTRL_DIRECT_SECT_LEN = 2, 347fcd6b05SZiyang Xuan }; 357fcd6b05SZiyang Xuan 367fcd6b05SZiyang Xuan enum bufdesc_len { 377fcd6b05SZiyang Xuan BUFDESC_LCMD_LEN = 2, 387fcd6b05SZiyang Xuan BUFDESC_SCMD_LEN = 3, 397fcd6b05SZiyang Xuan }; 407fcd6b05SZiyang Xuan 417fcd6b05SZiyang Xuan enum data_format { 427fcd6b05SZiyang Xuan DATA_SGE, 437fcd6b05SZiyang Xuan }; 447fcd6b05SZiyang Xuan 457fcd6b05SZiyang Xuan enum completion_format { 467fcd6b05SZiyang Xuan COMPLETE_DIRECT, 477fcd6b05SZiyang Xuan COMPLETE_SGE, 487fcd6b05SZiyang Xuan }; 497fcd6b05SZiyang Xuan 507fcd6b05SZiyang Xuan enum completion_request { 517fcd6b05SZiyang Xuan CEQ_SET = 1, 527fcd6b05SZiyang Xuan }; 537fcd6b05SZiyang Xuan 547fcd6b05SZiyang Xuan enum cmdq_cmd_type { 557fcd6b05SZiyang Xuan SYNC_CMD_DIRECT_RESP, 567fcd6b05SZiyang Xuan SYNC_CMD_SGE_RESP, 577fcd6b05SZiyang Xuan ASYNC_CMD, 587fcd6b05SZiyang Xuan }; 597fcd6b05SZiyang Xuan 607fcd6b05SZiyang Xuan enum hinic_cmdq_type { 617fcd6b05SZiyang Xuan HINIC_CMDQ_SYNC, 627fcd6b05SZiyang Xuan HINIC_CMDQ_ASYNC, 637fcd6b05SZiyang Xuan HINIC_MAX_CMDQ_TYPES, 647fcd6b05SZiyang Xuan }; 657fcd6b05SZiyang Xuan 667fcd6b05SZiyang Xuan enum hinic_db_src_type { 677fcd6b05SZiyang Xuan HINIC_DB_SRC_CMDQ_TYPE, 687fcd6b05SZiyang Xuan HINIC_DB_SRC_L2NIC_SQ_TYPE, 697fcd6b05SZiyang Xuan }; 707fcd6b05SZiyang Xuan 717fcd6b05SZiyang Xuan enum hinic_cmdq_db_type { 727fcd6b05SZiyang Xuan HINIC_DB_SQ_RQ_TYPE, 737fcd6b05SZiyang Xuan HINIC_DB_CMDQ_TYPE, 747fcd6b05SZiyang Xuan }; 757fcd6b05SZiyang Xuan 767fcd6b05SZiyang Xuan /* CMDQ WQE CTRLS */ 777fcd6b05SZiyang Xuan struct hinic_cmdq_header { 787fcd6b05SZiyang Xuan u32 header_info; 797fcd6b05SZiyang Xuan u32 saved_data; 807fcd6b05SZiyang Xuan }; 817fcd6b05SZiyang Xuan 827fcd6b05SZiyang Xuan struct hinic_scmd_bufdesc { 837fcd6b05SZiyang Xuan u32 buf_len; 847fcd6b05SZiyang Xuan u32 rsvd; 857fcd6b05SZiyang Xuan u8 data[HINIC_SCMD_DATA_LEN]; 867fcd6b05SZiyang Xuan }; 877fcd6b05SZiyang Xuan 887fcd6b05SZiyang Xuan struct hinic_lcmd_bufdesc { 897fcd6b05SZiyang Xuan struct hinic_sge sge; 907fcd6b05SZiyang Xuan u32 rsvd1; 917fcd6b05SZiyang Xuan u64 saved_async_buf; 927fcd6b05SZiyang Xuan u64 rsvd3; 937fcd6b05SZiyang Xuan }; 947fcd6b05SZiyang Xuan 957fcd6b05SZiyang Xuan struct hinic_cmdq_db { 967fcd6b05SZiyang Xuan u32 db_info; 977fcd6b05SZiyang Xuan u32 rsvd; 987fcd6b05SZiyang Xuan }; 997fcd6b05SZiyang Xuan 1007fcd6b05SZiyang Xuan struct hinic_status { 1017fcd6b05SZiyang Xuan u32 status_info; 1027fcd6b05SZiyang Xuan }; 1037fcd6b05SZiyang Xuan 1047fcd6b05SZiyang Xuan struct hinic_ctrl { 1057fcd6b05SZiyang Xuan u32 ctrl_info; 1067fcd6b05SZiyang Xuan }; 1077fcd6b05SZiyang Xuan 1087fcd6b05SZiyang Xuan struct hinic_sge_resp { 1097fcd6b05SZiyang Xuan struct hinic_sge sge; 1107fcd6b05SZiyang Xuan u32 rsvd; 1117fcd6b05SZiyang Xuan }; 1127fcd6b05SZiyang Xuan 1137fcd6b05SZiyang Xuan struct hinic_cmdq_completion { 1147fcd6b05SZiyang Xuan /* HW Format */ 1157fcd6b05SZiyang Xuan union { 1167fcd6b05SZiyang Xuan struct hinic_sge_resp sge_resp; 1177fcd6b05SZiyang Xuan u64 direct_resp; 1187fcd6b05SZiyang Xuan }; 1197fcd6b05SZiyang Xuan }; 1207fcd6b05SZiyang Xuan 1217fcd6b05SZiyang Xuan struct hinic_cmdq_wqe_scmd { 1227fcd6b05SZiyang Xuan struct hinic_cmdq_header header; 1237fcd6b05SZiyang Xuan struct hinic_cmdq_db db; 1247fcd6b05SZiyang Xuan struct hinic_status status; 1257fcd6b05SZiyang Xuan struct hinic_ctrl ctrl; 1267fcd6b05SZiyang Xuan struct hinic_cmdq_completion completion; 1277fcd6b05SZiyang Xuan struct hinic_scmd_bufdesc buf_desc; 1287fcd6b05SZiyang Xuan }; 1297fcd6b05SZiyang Xuan 1307fcd6b05SZiyang Xuan struct hinic_cmdq_wqe_lcmd { 1317fcd6b05SZiyang Xuan struct hinic_cmdq_header header; 1327fcd6b05SZiyang Xuan struct hinic_status status; 1337fcd6b05SZiyang Xuan struct hinic_ctrl ctrl; 1347fcd6b05SZiyang Xuan struct hinic_cmdq_completion completion; 1357fcd6b05SZiyang Xuan struct hinic_lcmd_bufdesc buf_desc; 1367fcd6b05SZiyang Xuan }; 1377fcd6b05SZiyang Xuan 1387fcd6b05SZiyang Xuan struct hinic_cmdq_inline_wqe { 1397fcd6b05SZiyang Xuan struct hinic_cmdq_wqe_scmd wqe_scmd; 1407fcd6b05SZiyang Xuan }; 1417fcd6b05SZiyang Xuan 1427fcd6b05SZiyang Xuan struct hinic_cmdq_wqe { 1437fcd6b05SZiyang Xuan /* HW Format */ 1447fcd6b05SZiyang Xuan union{ 1457fcd6b05SZiyang Xuan struct hinic_cmdq_inline_wqe inline_wqe; 1467fcd6b05SZiyang Xuan struct hinic_cmdq_wqe_lcmd wqe_lcmd; 1477fcd6b05SZiyang Xuan }; 1487fcd6b05SZiyang Xuan }; 1497fcd6b05SZiyang Xuan 1507fcd6b05SZiyang Xuan struct hinic_cmdq_ctxt_info { 1517fcd6b05SZiyang Xuan u64 curr_wqe_page_pfn; 1527fcd6b05SZiyang Xuan u64 wq_block_pfn; 1537fcd6b05SZiyang Xuan }; 1547fcd6b05SZiyang Xuan 1557fcd6b05SZiyang Xuan /* New interface */ 1567fcd6b05SZiyang Xuan struct hinic_cmdq_ctxt { 1577fcd6b05SZiyang Xuan u8 status; 1587fcd6b05SZiyang Xuan u8 version; 1597fcd6b05SZiyang Xuan u8 resp_aeq_num; 1607fcd6b05SZiyang Xuan u8 rsvd0[5]; 1617fcd6b05SZiyang Xuan 1627fcd6b05SZiyang Xuan u16 func_idx; 1637fcd6b05SZiyang Xuan u8 cmdq_id; 1647fcd6b05SZiyang Xuan u8 ppf_idx; 1657fcd6b05SZiyang Xuan 1667fcd6b05SZiyang Xuan u8 rsvd1[4]; 1677fcd6b05SZiyang Xuan 1687fcd6b05SZiyang Xuan struct hinic_cmdq_ctxt_info ctxt_info; 1697fcd6b05SZiyang Xuan }; 1707fcd6b05SZiyang Xuan 1717fcd6b05SZiyang Xuan enum hinic_cmdq_status { 1727fcd6b05SZiyang Xuan HINIC_CMDQ_ENABLE = BIT(0), 1730194313bSXiaoyun Wang HINIC_CMDQ_SET_FAIL = BIT(1) 1747fcd6b05SZiyang Xuan }; 1757fcd6b05SZiyang Xuan 1767fcd6b05SZiyang Xuan enum hinic_cmdq_cmd_type { 1777fcd6b05SZiyang Xuan HINIC_CMD_TYPE_NONE, 1787fcd6b05SZiyang Xuan HINIC_CMD_TYPE_SET_ARM, 1797fcd6b05SZiyang Xuan HINIC_CMD_TYPE_NORMAL, 1807fcd6b05SZiyang Xuan }; 1817fcd6b05SZiyang Xuan 1827fcd6b05SZiyang Xuan struct hinic_cmdq_cmd_info { 1837fcd6b05SZiyang Xuan enum hinic_cmdq_cmd_type cmd_type; 1847fcd6b05SZiyang Xuan }; 1857fcd6b05SZiyang Xuan 1867fcd6b05SZiyang Xuan struct hinic_cmdq { 1877fcd6b05SZiyang Xuan struct hinic_wq *wq; 1887fcd6b05SZiyang Xuan 1897fcd6b05SZiyang Xuan enum hinic_cmdq_type cmdq_type; 1907fcd6b05SZiyang Xuan int wrapped; 1917fcd6b05SZiyang Xuan 1927fcd6b05SZiyang Xuan hinic_spinlock_t cmdq_lock; 1937fcd6b05SZiyang Xuan 1947fcd6b05SZiyang Xuan int *errcode; 1957fcd6b05SZiyang Xuan 1967fcd6b05SZiyang Xuan /* doorbell area */ 1977fcd6b05SZiyang Xuan u8 __iomem *db_base; 1987fcd6b05SZiyang Xuan 1997fcd6b05SZiyang Xuan struct hinic_cmdq_ctxt cmdq_ctxt; 2007fcd6b05SZiyang Xuan 2017fcd6b05SZiyang Xuan struct hinic_cmdq_cmd_info *cmd_infos; 2027fcd6b05SZiyang Xuan }; 2037fcd6b05SZiyang Xuan 2047fcd6b05SZiyang Xuan struct hinic_cmdqs { 2057fcd6b05SZiyang Xuan struct hinic_hwdev *hwdev; 2067fcd6b05SZiyang Xuan 2077fcd6b05SZiyang Xuan struct pci_pool *cmd_buf_pool; 2087fcd6b05SZiyang Xuan 2097fcd6b05SZiyang Xuan struct hinic_wq *saved_wqs; 2107fcd6b05SZiyang Xuan 2117fcd6b05SZiyang Xuan struct hinic_cmdq cmdq[HINIC_MAX_CMDQ_TYPES]; 2127fcd6b05SZiyang Xuan 2137fcd6b05SZiyang Xuan u32 status; 2147fcd6b05SZiyang Xuan }; 2157fcd6b05SZiyang Xuan 2167fcd6b05SZiyang Xuan struct hinic_cmd_buf { 2177fcd6b05SZiyang Xuan void *buf; 2187fcd6b05SZiyang Xuan dma_addr_t dma_addr; 2197fcd6b05SZiyang Xuan struct rte_mbuf *mbuf; 2207fcd6b05SZiyang Xuan u16 size; 2217fcd6b05SZiyang Xuan }; 2227fcd6b05SZiyang Xuan 2237fcd6b05SZiyang Xuan int hinic_reinit_cmdq_ctxts(struct hinic_hwdev *hwdev); 2247fcd6b05SZiyang Xuan 2257fcd6b05SZiyang Xuan bool hinic_cmdq_idle(struct hinic_cmdq *cmdq); 2267fcd6b05SZiyang Xuan 2277fcd6b05SZiyang Xuan struct hinic_cmd_buf *hinic_alloc_cmd_buf(void *hwdev); 2287fcd6b05SZiyang Xuan 2297fcd6b05SZiyang Xuan void hinic_free_cmd_buf(void *hwdev, struct hinic_cmd_buf *cmd_buf); 2307fcd6b05SZiyang Xuan 2317fcd6b05SZiyang Xuan /* PF/VF send cmd to ucode by cmdq, and return if success. 2327fcd6b05SZiyang Xuan * timeout=0, use default timeout. 2337fcd6b05SZiyang Xuan */ 2347fcd6b05SZiyang Xuan int hinic_cmdq_direct_resp(void *hwdev, enum hinic_ack_type ack_type, 2357fcd6b05SZiyang Xuan enum hinic_mod_type mod, u8 cmd, 2367fcd6b05SZiyang Xuan struct hinic_cmd_buf *buf_in, 2377fcd6b05SZiyang Xuan u64 *out_param, u32 timeout); 2387fcd6b05SZiyang Xuan 2397fcd6b05SZiyang Xuan int hinic_comm_cmdqs_init(struct hinic_hwdev *hwdev); 2407fcd6b05SZiyang Xuan 2417fcd6b05SZiyang Xuan void hinic_comm_cmdqs_free(struct hinic_hwdev *hwdev); 2427fcd6b05SZiyang Xuan 2437fcd6b05SZiyang Xuan #endif /* _HINIC_PMD_CMDQ_H_ */ 244