xref: /linux/drivers/infiniband/hw/bng_re/bng_fw.h (revision 55aa394a5ed871208eac11c5f4677cafd258c4dd)
153310b69SSiva Reddy Kallam /* SPDX-License-Identifier: GPL-2.0 */
253310b69SSiva Reddy Kallam // Copyright (c) 2025 Broadcom.
353310b69SSiva Reddy Kallam 
453310b69SSiva Reddy Kallam #ifndef __BNG_FW_H__
553310b69SSiva Reddy Kallam #define __BNG_FW_H__
653310b69SSiva Reddy Kallam 
74f830cd8SSiva Reddy Kallam #include "bng_tlv.h"
84f830cd8SSiva Reddy Kallam 
94f830cd8SSiva Reddy Kallam /* FW DB related */
104f830cd8SSiva Reddy Kallam #define BNG_FW_CMDQ_TRIG_VAL		1
114f830cd8SSiva Reddy Kallam #define BNG_FW_COMM_PCI_BAR_REGION	0
124f830cd8SSiva Reddy Kallam #define BNG_FW_COMM_CONS_PCI_BAR_REGION	2
13*04e031ffSSiva Reddy Kallam #define BNG_FW_DBR_BASE_PAGE_SHIFT	12
144f830cd8SSiva Reddy Kallam #define BNG_FW_COMM_SIZE		0x104
154f830cd8SSiva Reddy Kallam #define BNG_FW_COMM_BASE_OFFSET		0x600
164f830cd8SSiva Reddy Kallam #define BNG_FW_COMM_TRIG_OFFSET		0x100
174f830cd8SSiva Reddy Kallam #define BNG_FW_PF_VF_COMM_PROD_OFFSET	0xc
184f830cd8SSiva Reddy Kallam #define BNG_FW_CREQ_DB_LEN		8
194f830cd8SSiva Reddy Kallam 
2053310b69SSiva Reddy Kallam /* CREQ */
2153310b69SSiva Reddy Kallam #define BNG_FW_CREQE_MAX_CNT		(64 * 1024)
2253310b69SSiva Reddy Kallam #define BNG_FW_CREQE_UNITS		16
234f830cd8SSiva Reddy Kallam #define BNG_FW_CREQ_ENTRY_POLL_BUDGET	0x100
244f830cd8SSiva Reddy Kallam #define BNG_FW_CREQ_CMP_VALID(hdr, pass)			\
254f830cd8SSiva Reddy Kallam 	(!!((hdr)->v & CREQ_BASE_V) ==				\
264f830cd8SSiva Reddy Kallam 	   !((pass) & BNG_RE_FLAG_EPOCH_CONS_MASK))
274f830cd8SSiva Reddy Kallam #define BNG_FW_CREQ_ENTRY_POLL_BUDGET	0x100
2853310b69SSiva Reddy Kallam 
2953310b69SSiva Reddy Kallam /* CMDQ */
3053310b69SSiva Reddy Kallam struct bng_fw_cmdqe {
3153310b69SSiva Reddy Kallam 	u8	data[16];
3253310b69SSiva Reddy Kallam };
3353310b69SSiva Reddy Kallam 
3453310b69SSiva Reddy Kallam #define BNG_FW_CMDQE_MAX_CNT		8192
3553310b69SSiva Reddy Kallam #define BNG_FW_CMDQE_UNITS		sizeof(struct bng_fw_cmdqe)
3653310b69SSiva Reddy Kallam #define BNG_FW_CMDQE_BYTES(depth)	((depth) * BNG_FW_CMDQE_UNITS)
3753310b69SSiva Reddy Kallam 
384f830cd8SSiva Reddy Kallam #define BNG_FW_MAX_COOKIE_VALUE		(BNG_FW_CMDQE_MAX_CNT - 1)
394f830cd8SSiva Reddy Kallam #define BNG_FW_CMD_IS_BLOCKING		0x8000
404f830cd8SSiva Reddy Kallam 
414f830cd8SSiva Reddy Kallam /* Crsq buf is 1024-Byte */
424f830cd8SSiva Reddy Kallam struct bng_re_crsbe {
434f830cd8SSiva Reddy Kallam 	u8			data[1024];
444f830cd8SSiva Reddy Kallam };
454f830cd8SSiva Reddy Kallam 
464f830cd8SSiva Reddy Kallam 
bng_fw_cmdqe_npages(u32 depth)4753310b69SSiva Reddy Kallam static inline u32 bng_fw_cmdqe_npages(u32 depth)
4853310b69SSiva Reddy Kallam {
4953310b69SSiva Reddy Kallam 	u32 npages;
5053310b69SSiva Reddy Kallam 
5153310b69SSiva Reddy Kallam 	npages = BNG_FW_CMDQE_BYTES(depth) / PAGE_SIZE;
5253310b69SSiva Reddy Kallam 	if (BNG_FW_CMDQE_BYTES(depth) % PAGE_SIZE)
5353310b69SSiva Reddy Kallam 		npages++;
5453310b69SSiva Reddy Kallam 	return npages;
5553310b69SSiva Reddy Kallam }
5653310b69SSiva Reddy Kallam 
bng_fw_cmdqe_page_size(u32 depth)5753310b69SSiva Reddy Kallam static inline u32 bng_fw_cmdqe_page_size(u32 depth)
5853310b69SSiva Reddy Kallam {
5953310b69SSiva Reddy Kallam 	return (bng_fw_cmdqe_npages(depth) * PAGE_SIZE);
6053310b69SSiva Reddy Kallam }
614f830cd8SSiva Reddy Kallam struct bng_re_cmdq_mbox {
624f830cd8SSiva Reddy Kallam 	struct bng_re_reg_desc		reg;
634f830cd8SSiva Reddy Kallam 	void __iomem			*prod;
644f830cd8SSiva Reddy Kallam 	void __iomem			*db;
654f830cd8SSiva Reddy Kallam };
6653310b69SSiva Reddy Kallam 
6753310b69SSiva Reddy Kallam /* HWQ */
6853310b69SSiva Reddy Kallam struct bng_re_cmdq_ctx {
6953310b69SSiva Reddy Kallam 	struct bng_re_hwq		hwq;
704f830cd8SSiva Reddy Kallam 	struct bng_re_cmdq_mbox		cmdq_mbox;
714f830cd8SSiva Reddy Kallam 	unsigned long			flags;
724f830cd8SSiva Reddy Kallam #define FIRMWARE_INITIALIZED_FLAG	(0)
734f830cd8SSiva Reddy Kallam #define FIRMWARE_STALL_DETECTED		(3)
744f830cd8SSiva Reddy Kallam #define FIRMWARE_FIRST_FLAG		(31)
754f830cd8SSiva Reddy Kallam 	wait_queue_head_t		waitq;
764f830cd8SSiva Reddy Kallam 	u32				seq_num;
774f830cd8SSiva Reddy Kallam };
784f830cd8SSiva Reddy Kallam 
794f830cd8SSiva Reddy Kallam struct bng_re_creq_db {
804f830cd8SSiva Reddy Kallam 	struct bng_re_reg_desc	reg;
814f830cd8SSiva Reddy Kallam 	struct bng_re_db_info	dbinfo;
824f830cd8SSiva Reddy Kallam };
834f830cd8SSiva Reddy Kallam 
844f830cd8SSiva Reddy Kallam struct bng_re_creq_stat {
854f830cd8SSiva Reddy Kallam 	u64	creq_qp_event_processed;
864f830cd8SSiva Reddy Kallam 	u64	creq_func_event_processed;
8753310b69SSiva Reddy Kallam };
8853310b69SSiva Reddy Kallam 
8953310b69SSiva Reddy Kallam struct bng_re_creq_ctx {
9053310b69SSiva Reddy Kallam 	struct bng_re_hwq		hwq;
914f830cd8SSiva Reddy Kallam 	struct bng_re_creq_db		creq_db;
924f830cd8SSiva Reddy Kallam 	struct bng_re_creq_stat		stats;
934f830cd8SSiva Reddy Kallam 	struct tasklet_struct		creq_tasklet;
944f830cd8SSiva Reddy Kallam 	u16				ring_id;
954f830cd8SSiva Reddy Kallam 	int				msix_vec;
964f830cd8SSiva Reddy Kallam 	bool				irq_handler_avail;
974f830cd8SSiva Reddy Kallam 	char				*irq_name;
9853310b69SSiva Reddy Kallam };
9953310b69SSiva Reddy Kallam 
10053310b69SSiva Reddy Kallam struct bng_re_crsqe {
10153310b69SSiva Reddy Kallam 	struct creq_qp_event	*resp;
10253310b69SSiva Reddy Kallam 	u32			req_size;
10353310b69SSiva Reddy Kallam 	/* Free slots at the time of submission */
10453310b69SSiva Reddy Kallam 	u32			free_slots;
10553310b69SSiva Reddy Kallam 	u8			opcode;
1064f830cd8SSiva Reddy Kallam 	bool			is_waiter_alive;
1074f830cd8SSiva Reddy Kallam 	bool			is_in_used;
1084f830cd8SSiva Reddy Kallam };
1094f830cd8SSiva Reddy Kallam 
1104f830cd8SSiva Reddy Kallam struct bng_re_rcfw_sbuf {
1114f830cd8SSiva Reddy Kallam 	void *sb;
1124f830cd8SSiva Reddy Kallam 	dma_addr_t dma_addr;
1134f830cd8SSiva Reddy Kallam 	u32 size;
11453310b69SSiva Reddy Kallam };
11553310b69SSiva Reddy Kallam 
11653310b69SSiva Reddy Kallam /* RoCE FW Communication Channels */
11753310b69SSiva Reddy Kallam struct bng_re_rcfw {
11853310b69SSiva Reddy Kallam 	struct pci_dev		*pdev;
11953310b69SSiva Reddy Kallam 	struct bng_re_res	*res;
12053310b69SSiva Reddy Kallam 	struct bng_re_cmdq_ctx	cmdq;
12153310b69SSiva Reddy Kallam 	struct bng_re_creq_ctx	creq;
12253310b69SSiva Reddy Kallam 	struct bng_re_crsqe	*crsqe_tbl;
12353310b69SSiva Reddy Kallam 	/* To synchronize the qp-handle hash table */
12453310b69SSiva Reddy Kallam 	spinlock_t		tbl_lock;
12553310b69SSiva Reddy Kallam 	u32			cmdq_depth;
12653310b69SSiva Reddy Kallam 	/* cached from chip cctx for quick reference in slow path */
12753310b69SSiva Reddy Kallam 	u16			max_timeout;
1284f830cd8SSiva Reddy Kallam 	atomic_t		rcfw_intr_enabled;
12953310b69SSiva Reddy Kallam };
13053310b69SSiva Reddy Kallam 
1314f830cd8SSiva Reddy Kallam struct bng_re_cmdqmsg {
1324f830cd8SSiva Reddy Kallam 	struct cmdq_base	*req;
1334f830cd8SSiva Reddy Kallam 	struct creq_base	*resp;
1344f830cd8SSiva Reddy Kallam 	void			*sb;
1354f830cd8SSiva Reddy Kallam 	u32			req_sz;
1364f830cd8SSiva Reddy Kallam 	u32			res_sz;
1374f830cd8SSiva Reddy Kallam 	u8			block;
1384f830cd8SSiva Reddy Kallam };
1394f830cd8SSiva Reddy Kallam 
bng_re_rcfw_cmd_prep(struct cmdq_base * req,u8 opcode,u8 cmd_size)14053c6ee7dSSiva Reddy Kallam static inline void bng_re_rcfw_cmd_prep(struct cmdq_base *req,
14153c6ee7dSSiva Reddy Kallam 					u8 opcode, u8 cmd_size)
14253c6ee7dSSiva Reddy Kallam {
14353c6ee7dSSiva Reddy Kallam 	req->opcode = opcode;
14453c6ee7dSSiva Reddy Kallam 	req->cmd_size = cmd_size;
14553c6ee7dSSiva Reddy Kallam }
14653c6ee7dSSiva Reddy Kallam 
bng_re_fill_cmdqmsg(struct bng_re_cmdqmsg * msg,void * req,void * resp,void * sb,u32 req_sz,u32 res_sz,u8 block)1474f830cd8SSiva Reddy Kallam static inline void bng_re_fill_cmdqmsg(struct bng_re_cmdqmsg *msg,
1484f830cd8SSiva Reddy Kallam 				       void *req, void *resp, void *sb,
1494f830cd8SSiva Reddy Kallam 				       u32 req_sz, u32 res_sz, u8 block)
1504f830cd8SSiva Reddy Kallam {
1514f830cd8SSiva Reddy Kallam 	msg->req = req;
1524f830cd8SSiva Reddy Kallam 	msg->resp = resp;
1534f830cd8SSiva Reddy Kallam 	msg->sb = sb;
1544f830cd8SSiva Reddy Kallam 	msg->req_sz = req_sz;
1554f830cd8SSiva Reddy Kallam 	msg->res_sz = res_sz;
1564f830cd8SSiva Reddy Kallam 	msg->block = block;
1574f830cd8SSiva Reddy Kallam }
1584f830cd8SSiva Reddy Kallam 
1594f830cd8SSiva Reddy Kallam /* Get the number of command units required for the req. The
1604f830cd8SSiva Reddy Kallam  * function returns correct value only if called before
1614f830cd8SSiva Reddy Kallam  * setting using bng_re_set_cmd_slots
1624f830cd8SSiva Reddy Kallam  */
bng_re_get_cmd_slots(struct cmdq_base * req)1634f830cd8SSiva Reddy Kallam static inline u32 bng_re_get_cmd_slots(struct cmdq_base *req)
1644f830cd8SSiva Reddy Kallam {
1654f830cd8SSiva Reddy Kallam 	u32 cmd_units = 0;
1664f830cd8SSiva Reddy Kallam 
1674f830cd8SSiva Reddy Kallam 	if (HAS_TLV_HEADER(req)) {
1684f830cd8SSiva Reddy Kallam 		struct roce_tlv *tlv_req = (struct roce_tlv *)req;
1694f830cd8SSiva Reddy Kallam 
1704f830cd8SSiva Reddy Kallam 		cmd_units = tlv_req->total_size;
1714f830cd8SSiva Reddy Kallam 	} else {
1724f830cd8SSiva Reddy Kallam 		cmd_units = (req->cmd_size + BNG_FW_CMDQE_UNITS - 1) /
1734f830cd8SSiva Reddy Kallam 			    BNG_FW_CMDQE_UNITS;
1744f830cd8SSiva Reddy Kallam 	}
1754f830cd8SSiva Reddy Kallam 
1764f830cd8SSiva Reddy Kallam 	return cmd_units;
1774f830cd8SSiva Reddy Kallam }
1784f830cd8SSiva Reddy Kallam 
bng_re_set_cmd_slots(struct cmdq_base * req)1794f830cd8SSiva Reddy Kallam static inline u32 bng_re_set_cmd_slots(struct cmdq_base *req)
1804f830cd8SSiva Reddy Kallam {
1814f830cd8SSiva Reddy Kallam 	u32 cmd_byte = 0;
1824f830cd8SSiva Reddy Kallam 
1834f830cd8SSiva Reddy Kallam 	if (HAS_TLV_HEADER(req)) {
1844f830cd8SSiva Reddy Kallam 		struct roce_tlv *tlv_req = (struct roce_tlv *)req;
1854f830cd8SSiva Reddy Kallam 
1864f830cd8SSiva Reddy Kallam 		cmd_byte = tlv_req->total_size * BNG_FW_CMDQE_UNITS;
1874f830cd8SSiva Reddy Kallam 	} else {
1884f830cd8SSiva Reddy Kallam 		cmd_byte = req->cmd_size;
1894f830cd8SSiva Reddy Kallam 		req->cmd_size = (req->cmd_size + BNG_FW_CMDQE_UNITS - 1) /
1904f830cd8SSiva Reddy Kallam 				 BNG_FW_CMDQE_UNITS;
1914f830cd8SSiva Reddy Kallam 	}
1924f830cd8SSiva Reddy Kallam 
1934f830cd8SSiva Reddy Kallam 	return cmd_byte;
1944f830cd8SSiva Reddy Kallam }
1954f830cd8SSiva Reddy Kallam 
19653310b69SSiva Reddy Kallam void bng_re_free_rcfw_channel(struct bng_re_rcfw *rcfw);
19753310b69SSiva Reddy Kallam int bng_re_alloc_fw_channel(struct bng_re_res *res,
19853310b69SSiva Reddy Kallam 			    struct bng_re_rcfw *rcfw);
1994f830cd8SSiva Reddy Kallam int bng_re_enable_fw_channel(struct bng_re_rcfw *rcfw,
2004f830cd8SSiva Reddy Kallam 			     int msix_vector,
2014f830cd8SSiva Reddy Kallam 			     int cp_bar_reg_off);
2024f830cd8SSiva Reddy Kallam void bng_re_disable_rcfw_channel(struct bng_re_rcfw *rcfw);
2034f830cd8SSiva Reddy Kallam int bng_re_rcfw_start_irq(struct bng_re_rcfw *rcfw, int msix_vector,
2044f830cd8SSiva Reddy Kallam 			  bool need_init);
2054f830cd8SSiva Reddy Kallam void bng_re_rcfw_stop_irq(struct bng_re_rcfw *rcfw, bool kill);
20653c6ee7dSSiva Reddy Kallam int bng_re_rcfw_send_message(struct bng_re_rcfw *rcfw,
20753c6ee7dSSiva Reddy Kallam 			     struct bng_re_cmdqmsg *msg);
208*04e031ffSSiva Reddy Kallam int bng_re_init_rcfw(struct bng_re_rcfw *rcfw,
209*04e031ffSSiva Reddy Kallam 		     struct bng_re_stats *stats_ctx);
210*04e031ffSSiva Reddy Kallam int bng_re_deinit_rcfw(struct bng_re_rcfw *rcfw);
21153310b69SSiva Reddy Kallam #endif
212