File Index
Files and directories
Sign in
FILE

hinic3_cmdq.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/huawei/hinic3/hinic3_cmdq.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */
  3
  4#ifndef _HINIC3_CMDQ_H_
  5#define _HINIC3_CMDQ_H_
  6
  7#include <linux/dmapool.h>
  8
  9#include "hinic3_hw_intf.h"
 10#include "hinic3_wq.h"
 11
 12#define CMDQ_DEPTH  4096
 13
 14struct cmdq_db {
 15	__le32 db_head;
 16	__le32 db_info;
 17};
 18
 19/* hw defined cmdq wqe header */
 20struct cmdq_header {
 21	__le32 header_info;
 22	__le32 saved_data;
 23};
 24
 25struct cmdq_lcmd_bufdesc {
 26	struct hinic3_sge sge;
 27	__le64            rsvd2;
 28	__le64            rsvd3;
 29};
 30
 31struct cmdq_status {
 32	__le32 status_info;
 33};
 34
 35struct cmdq_ctrl {
 36	__le32 ctrl_info;
 37};
 38
 39struct cmdq_direct_resp {
 40	__le64 val;
 41	__le64 rsvd;
 42};
 43
 44struct cmdq_completion {
 45	union {
 46		struct hinic3_sge       sge;
 47		struct cmdq_direct_resp direct;
 48	} resp;
 49};
 50
 51struct cmdq_wqe_scmd {
 52	struct cmdq_header     header;
 53	__le64                 rsvd3;
 54	struct cmdq_status     status;
 55	struct cmdq_ctrl       ctrl;
 56	struct cmdq_completion completion;
 57	__le32                 rsvd10[6];
 58};
 59
 60struct cmdq_wqe_lcmd {
 61	struct cmdq_header       header;
 62	struct cmdq_status       status;
 63	struct cmdq_ctrl         ctrl;
 64	struct cmdq_completion   completion;
 65	struct cmdq_lcmd_bufdesc buf_desc;
 66};
 67
 68struct cmdq_wqe {
 69	union {
 70		struct cmdq_wqe_scmd wqe_scmd;
 71		struct cmdq_wqe_lcmd wqe_lcmd;
 72	};
 73};
 74
 75static_assert(sizeof(struct cmdq_wqe) == 64);
 76
 77enum hinic3_cmdq_type {
 78	HINIC3_CMDQ_SYNC      = 0,
 79	HINIC3_MAX_CMDQ_TYPES = 4
 80};
 81
 82enum hinic3_cmdq_status {
 83	HINIC3_CMDQ_ENABLE = BIT(0),
 84};
 85
 86enum hinic3_cmdq_cmd_type {
 87	HINIC3_CMD_TYPE_NONE,
 88	HINIC3_CMD_TYPE_DIRECT_RESP,
 89	HINIC3_CMD_TYPE_FAKE_TIMEOUT,
 90	HINIC3_CMD_TYPE_TIMEOUT,
 91	HINIC3_CMD_TYPE_FORCE_STOP,
 92};
 93
 94struct hinic3_cmd_buf {
 95	void       *buf;
 96	dma_addr_t dma_addr;
 97	__le16     size;
 98	refcount_t ref_cnt;
 99};
100
101struct hinic3_cmdq_cmd_info {
102	enum hinic3_cmdq_cmd_type cmd_type;
103	struct completion         *done;
104	int                       *errcode;
105	/* completion code */
106	int                       *cmpt_code;
107	__le64                    *direct_resp;
108	u64                       cmdq_msg_id;
109	struct hinic3_cmd_buf     *buf_in;
110};
111
112struct hinic3_cmdq {
113	struct hinic3_wq            wq;
114	enum hinic3_cmdq_type       cmdq_type;
115	u8                          wrapped;
116	/* synchronize command submission with completions via event queue */
117	spinlock_t                  cmdq_lock;
118	struct hinic3_cmdq_cmd_info *cmd_infos;
119	struct hinic3_hwdev         *hwdev;
120};
121
122struct hinic3_cmdqs {
123	struct hinic3_hwdev *hwdev;
124	struct hinic3_cmdq  cmdq[HINIC3_MAX_CMDQ_TYPES];
125	struct dma_pool     *cmd_buf_pool;
126	/* doorbell area */
127	u8 __iomem          *cmdqs_db_base;
128
129	/* When command queue uses multiple memory pages (1-level CLA), this
130	 * block will hold aggregated indirection table for all command queues
131	 * of cmdqs. Not used for small cmdq (0-level CLA).
132	 */
133	dma_addr_t          wq_block_paddr;
134	void                *wq_block_vaddr;
135
136	u32                 status;
137	u32                 disable_flag;
138	u8                  cmdq_num;
139};
140
141int hinic3_cmdqs_init(struct hinic3_hwdev *hwdev);
142void hinic3_cmdqs_free(struct hinic3_hwdev *hwdev);
143
144struct hinic3_cmd_buf *hinic3_alloc_cmd_buf(struct hinic3_hwdev *hwdev);
145void hinic3_free_cmd_buf(struct hinic3_hwdev *hwdev,
146			 struct hinic3_cmd_buf *cmd_buf);
147void hinic3_cmdq_ceq_handler(struct hinic3_hwdev *hwdev, __le32 ceqe_data);
148
149int hinic3_cmdq_direct_resp(struct hinic3_hwdev *hwdev, u8 mod, u8 cmd,
150			    struct hinic3_cmd_buf *buf_in, __le64 *out_param);
151
152void hinic3_cmdq_flush_sync_cmd(struct hinic3_hwdev *hwdev);
153int hinic3_reinit_cmdq_ctxts(struct hinic3_hwdev *hwdev);
154bool hinic3_cmdq_idle(struct hinic3_cmdq *cmdq);
155
156#endif
~/ Read-only file preview.