File Index
Files and directories
Sign in
FILE

bnge_hwrm.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/broadcom/bnge/bnge_hwrm.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/* Copyright (c) 2025 Broadcom */
  3
  4#ifndef _BNGE_HWRM_H_
  5#define _BNGE_HWRM_H_
  6
  7#include <linux/bnxt/hsi.h>
  8
  9enum bnge_hwrm_ctx_flags {
 10	BNGE_HWRM_INTERNAL_CTX_OWNED	= BIT(0),
 11	BNGE_HWRM_INTERNAL_RESP_DIRTY	= BIT(1),
 12	BNGE_HWRM_CTX_SILENT		= BIT(2),
 13	BNGE_HWRM_FULL_WAIT		= BIT(3),
 14};
 15
 16#define BNGE_HWRM_API_FLAGS (BNGE_HWRM_CTX_SILENT | BNGE_HWRM_FULL_WAIT)
 17
 18struct bnge_hwrm_ctx {
 19	u64 sentinel;
 20	dma_addr_t dma_handle;
 21	struct output *resp;
 22	struct input *req;
 23	dma_addr_t slice_handle;
 24	void *slice_addr;
 25	u32 slice_size;
 26	u32 req_len;
 27	enum bnge_hwrm_ctx_flags flags;
 28	unsigned int timeout;
 29	u32 allocated;
 30	gfp_t gfp;
 31};
 32
 33enum bnge_hwrm_wait_state {
 34	BNGE_HWRM_PENDING,
 35	BNGE_HWRM_DEFERRED,
 36	BNGE_HWRM_COMPLETE,
 37	BNGE_HWRM_CANCELLED,
 38};
 39
 40enum bnge_hwrm_chnl { BNGE_HWRM_CHNL_CHIMP, BNGE_HWRM_CHNL_KONG };
 41
 42struct bnge_hwrm_wait_token {
 43	struct rcu_head rcu;
 44	struct hlist_node node;
 45	enum bnge_hwrm_wait_state state;
 46	enum bnge_hwrm_chnl dst;
 47	u16 seq_id;
 48};
 49
 50#define BNGE_DFLT_HWRM_CMD_TIMEOUT		500
 51
 52#define BNGE_GRCPF_REG_CHIMP_COMM		0x0
 53#define BNGE_GRCPF_REG_CHIMP_COMM_TRIGGER	0x100
 54
 55#define BNGE_HWRM_MAX_REQ_LEN		(bd->hwrm_max_req_len)
 56#define BNGE_HWRM_SHORT_REQ_LEN		sizeof(struct hwrm_short_input)
 57#define BNGE_HWRM_CMD_MAX_TIMEOUT	40000U
 58#define BNGE_SHORT_HWRM_CMD_TIMEOUT	20
 59#define BNGE_HWRM_CMD_TIMEOUT		(bd->hwrm_cmd_timeout)
 60#define BNGE_HWRM_RESET_TIMEOUT		((BNGE_HWRM_CMD_TIMEOUT) * 4)
 61#define BNGE_HWRM_TARGET		0xffff
 62#define BNGE_HWRM_NO_CMPL_RING		-1
 63#define BNGE_HWRM_REQ_MAX_SIZE		128
 64#define BNGE_HWRM_DMA_SIZE		(2 * PAGE_SIZE) /* space for req+resp */
 65#define BNGE_HWRM_RESP_RESERVED		PAGE_SIZE
 66#define BNGE_HWRM_RESP_OFFSET		(BNGE_HWRM_DMA_SIZE -		\
 67					 BNGE_HWRM_RESP_RESERVED)
 68#define BNGE_HWRM_CTX_OFFSET		(BNGE_HWRM_RESP_OFFSET -	\
 69					 sizeof(struct bnge_hwrm_ctx))
 70#define BNGE_HWRM_DMA_ALIGN		16
 71#define BNGE_HWRM_SENTINEL		0xb6e1f68a12e9a7eb /* arbitrary value */
 72#define BNGE_HWRM_SHORT_MIN_TIMEOUT		3
 73#define BNGE_HWRM_SHORT_MAX_TIMEOUT		10
 74#define BNGE_HWRM_SHORT_TIMEOUT_COUNTER		5
 75
 76#define BNGE_HWRM_MIN_TIMEOUT		25
 77#define BNGE_HWRM_MAX_TIMEOUT		40
 78
 79static inline unsigned int bnge_hwrm_timeout(unsigned int n)
 80{
 81	return n <= BNGE_HWRM_SHORT_TIMEOUT_COUNTER ?
 82		n * BNGE_HWRM_SHORT_MIN_TIMEOUT :
 83		BNGE_HWRM_SHORT_TIMEOUT_COUNTER *
 84			BNGE_HWRM_SHORT_MIN_TIMEOUT +
 85			(n - BNGE_HWRM_SHORT_TIMEOUT_COUNTER) *
 86				BNGE_HWRM_MIN_TIMEOUT;
 87}
 88
 89#define BNGE_HWRM_FIN_WAIT_USEC	50000
 90
 91void bnge_cleanup_hwrm_resources(struct bnge_dev *bd);
 92int bnge_init_hwrm_resources(struct bnge_dev *bd);
 93
 94int bnge_hwrm_req_create(struct bnge_dev *bd, void **req, u16 req_type,
 95			 u32 req_len);
 96#define bnge_hwrm_req_init(bd, req, req_type) \
 97	bnge_hwrm_req_create((bd), (void **)&(req), (req_type),	\
 98			     sizeof(*(req)))
 99void *bnge_hwrm_req_hold(struct bnge_dev *bd, void *req);
100void bnge_hwrm_req_drop(struct bnge_dev *bd, void *req);
101void bnge_hwrm_req_flags(struct bnge_dev *bd, void *req,
102			 enum bnge_hwrm_ctx_flags flags);
103void bnge_hwrm_req_timeout(struct bnge_dev *bd, void *req,
104			   unsigned int timeout);
105int bnge_hwrm_req_send(struct bnge_dev *bd, void *req);
106int bnge_hwrm_req_send_silent(struct bnge_dev *bd, void *req);
107void bnge_hwrm_req_alloc_flags(struct bnge_dev *bd, void *req, gfp_t flags);
108void *bnge_hwrm_req_dma_slice(struct bnge_dev *bd, void *req, u32 size,
109			      dma_addr_t *dma);
110int bnge_hwrm_req_replace(struct bnge_dev *bd, void *req, void *new_req,
111			  u32 len);
112#endif /* _BNGE_HWRM_H_ */
~/ Read-only file preview.