xref: /dpdk/drivers/net/hinic/base/hinic_pmd_cmdq.h (revision f8dbaebbf1c9efcbb2e2354b341ed62175466a57)
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