xref: /freebsd/sys/dev/dpaa/qman_var.h (revision aefd61a1de86521abc1551aa98ed94316fc83d86)
1 /*
2  * Copyright (c) 2026 Justin Hibbits
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #ifndef	QMAN_VAR_H
8 #define	QMAN_VAR_H
9 
10 #include <sys/queue.h>
11 
12 #include "dpaa_common.h"
13 #include "portals.h"
14 
15 struct qman_eqcr_entry {
16 	uint8_t verb;
17 	uint8_t dca;
18 	uint16_t seqnum;
19 	uint32_t orp;
20 	uint32_t fqid;
21 	uint32_t tag;
22 	struct dpaa_fd fd;
23 	uint8_t _rsvd[32];
24 };
25 _Static_assert(sizeof(struct qman_eqcr_entry) == 64, "EQCR entry mis-sized");
26 DPAA_RING_DECLARE(qman_eqcr);
27 DPAA_RING_DECLARE(qman_dqrr);
28 DPAA_RING_DECLARE(qman_mr);
29 
30 union qman_mc_command {
31 	struct {
32 		uint8_t	verb;
33 		uint8_t data[63];
34 	} common;
35 	struct {
36 		uint8_t verb;
37 		uint8_t _rsvd0;
38 		uint16_t we_mask;
39 		uint32_t fqid;	/* Only bottom 24 bits allowed */
40 		uint16_t count;
41 		uint8_t orpc;
42 		uint8_t cgid;
43 		uint16_t fq_ctrl;
44 		uint16_t dest_chan:13;
45 		uint16_t dest_wq:3;
46 		uint16_t ics_cred;
47 		uint16_t td_thresh_oac;
48 		uint32_t context_b;
49 		uint64_t context_a;
50 		uint8_t _rsvd1[32];
51 	} init_fq;
52 	struct {
53 		uint8_t verb;
54 		uint8_t _rsvd0[3];
55 		uint32_t fqid; /* Only bottom 24 bits used */
56 		uint8_t _rsvd1[56];
57 	} query_fq;
58 	struct {
59 		uint8_t verb;
60 		uint8_t _rsvd0[3];
61 		uint32_t fqid;
62 		uint8_t _rsvd1[56];
63 	} query_fq_np;
64 	struct {
65 		uint8_t verb;
66 		uint8_t _rsvd0[3];
67 		uint32_t fqid;
68 		uint8_t _rsvd1;
69 		uint8_t count;
70 		uint8_t _rsvd2[10];
71 		uint32_t context_b;
72 		uint8_t _rsvd3[40];
73 	} alter_fqs;
74 };
75 
76 union qman_mc_result {
77 	struct {
78 		uint8_t verb;
79 		uint8_t data[63];
80 	} common;
81 	struct {
82 		uint8_t verb;
83 		uint8_t rslt;
84 		uint8_t _rsvd[62];
85 	} init_fq;
86 	struct {
87 		uint8_t verb;
88 		uint8_t rslt;
89 		uint8_t _rsvd0[8];
90 		uint8_t orpc;
91 		uint8_t cgid;
92 		uint16_t fq_ctrl;
93 		uint16_t dest_wq;
94 		uint16_t ics_cred;
95 		uint16_t td_thresh;
96 		uint32_t context_b;
97 		uint64_t context_a;	/* 8 bytes on the wire */
98 		uint16_t oac;
99 		uint8_t _rsvd1[30];
100 	} query_fq;
101 	struct {
102 		uint8_t verb;
103 		uint8_t rslt;
104 		uint8_t _rsvd0;
105 		uint8_t state;
106 		uint32_t fqd_link;
107 		uint16_t odp_seq;
108 		uint16_t orp_nesn;
109 		uint16_t orp_ea_hseq;
110 		uint16_t orp_ea_tseq;
111 		uint32_t orp_ea_hptr;
112 		uint32_t orp_ea_tptr;
113 		uint32_t pfdr_hptr;
114 		uint32_t pfdr_tptr;
115 		uint8_t _rsvd1[5];
116 		uint8_t is;
117 		uint16_t ics_surp;
118 		uint32_t byte_cnt;
119 		uint32_t frm_cnt;
120 		uint32_t _rsvd2;
121 		uint16_t ra1_sfdr;
122 		uint16_t ra2_sfdr;
123 		uint16_t _rsvd3;
124 		uint16_t od1_sfdr;
125 		uint16_t od2_sfdr;
126 		uint16_t od3_sfdr;
127 	} query_fq_np;
128 	struct {
129 		uint8_t verb;
130 		uint8_t rslt;
131 		uint8_t fqs;
132 		uint8_t _rsvd[61];
133 	} alter_fqs;
134 };
135 _Static_assert(sizeof(union qman_mc_command) == 64, "MC command mis-sized");
136 _Static_assert(sizeof(union qman_mc_result) == 64, "MC result mis-sized");
137 
138 #define	QCSP_VERB_INIT_FQ_PARK		0x40
139 #define	QCSP_VERB_INIT_FQ_SCHED		0x41
140 #define	QCSP_VERB_QUERY_FQ		0x44
141 #define	QCSP_VERB_QUERY_FQ_NP		0x45
142 #define	QCSP_VERB_ALTER_FQ_SCHED	0x48
143 #define	QCSP_VERB_ALTER_FQ_FE		0x49
144 #define	QCSP_VERB_ALTER_FQ_RETIRE	0x4a
145 #define	QCSP_VERB_ALTER_FQ_TAKE_OUT	0x4b
146 #define	QCSP_VERB_ALTER_FQ_RETIRE_CTXB	0x4c
147 #define	QCSP_VERB_ALTER_FQ_XON		0x4d
148 #define	QCSP_VERB_ALTER_FQ_XOFF		0x4e
149 
150 /* Init FQ */
151 #define	QCSP_INIT_FQ_WE_OAC		0x0100
152 #define	QCSP_INIT_FQ_WE_ORPC		0x0080
153 #define	QCSP_INIT_FQ_WE_CGID		0x0040
154 #define	QCSP_INIT_FQ_WE_FQ_CTRL		0x0020
155 #define	QCSP_INIT_FQ_WE_DEST_WQ		0x0010
156 #define	QCSP_INIT_FQ_WE_ICS_CRED	0x0008
157 #define	QCSP_INIT_FQ_WE_TD_THRESH	0x0004
158 #define	QCSP_INIT_FQ_WE_CONTEXT_B	0x0002
159 #define	QCSP_INIT_FQ_WE_CONTEXT_A	0x0001
160 
161 #define	QMAN_MC_RES_OK			0xf0
162 
163 #define	QMAN_MC_AFQS_NE			0x01
164 
165 /* Init FQ options */
166 #define	QM_FQCTRL_CGE			0x0400
167 #define	QM_FQCTRL_TDE			0x0200
168 #define	QM_FQCTRL_ORP			0x0100
169 #define	QM_FQCTRL_CTXASTASH		0x0080
170 #define	QM_FQCTRL_CPCSTASH		0x0040
171 #define	QM_FQCTRL_FORCESFDR		0x0008
172 #define	QM_FQCTRL_AVOIDBLOCK		0x0004
173 #define	QM_FQCTRL_HOLDACTIVE		0x0002
174 #define	QM_FQCTRL_LIC			0x0001
175 
176 
177 struct qman_mc {
178 	uint8_t polarity;
179 	bool busy;
180 };
181 
182 struct qman_fq {
183 	uint32_t fqid;			/* base FQID of the range */
184 	uint32_t fqid_count;		/* length of the range (>=1) */
185 	bool	 force_fqid;		/* caller owns the FQID allocation */
186 	bool	 dirty;			/* on a portal's dirty list this poll */
187 	SLIST_ENTRY(qman_fq) dirty_next;/* DQRR loop dirty list. */
188 	struct qman_cb cb;
189 };
190 
191 struct qman_portal_softc {
192 	struct dpaa_portal_softc sc_base;
193 
194 	/* Rings (Enqueue, Dequeue, Message */
195 	struct qman_eqcr_ring sc_eqcr;
196 	struct qman_dqrr_ring sc_dqrr;
197 	struct qman_mr_ring sc_mr;
198 	struct qman_mc sc_mc;
199 
200 	int sc_affine_channel;
201 };
202 
203 struct qman_fq *qman_fq_from_index(uint32_t fqid);
204 
205 union qman_mc_result *
206 qman_portal_mc_send_raw(device_t, union qman_mc_command *);
207 int qman_portal_fq_enqueue(device_t, struct qman_fq *, struct dpaa_fd *);
208 void qman_portal_static_dequeue_channel(device_t, int);
209 void qman_portal_static_dequeue_rm_channel(device_t dev, int channel);
210 
211 extern int qman_channel_base;
212 DPCPU_DECLARE(device_t, qman_affine_portal);
213 
214 #endif	/* QMAN_VAR_H */
215