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