xref: /freebsd/sys/dev/dpaa/qman_var.h (revision 7a40b8a89e7da2a7e8d8e132bc37885b22e9bfb1)
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 "dpaa_common.h"
11 #include "portals.h"
12 
13 struct qman_eqcr_entry {
14 	uint8_t verb;
15 	uint8_t dca;
16 	uint16_t seqnum;
17 	uint32_t orp;
18 	uint32_t fqid;
19 	uint32_t tag;
20 	struct dpaa_fd fd;
21 	uint8_t _rsvd[32];
22 };
23 _Static_assert(sizeof(struct qman_eqcr_entry) == 64, "EQCR entry mis-sized");
24 DPAA_RING_DECLARE(qman_eqcr);
25 DPAA_RING_DECLARE(qman_dqrr);
26 DPAA_RING_DECLARE(qman_mr);
27 
28 union qman_mc_command {
29 	struct {
30 		uint8_t	verb;
31 		uint8_t data[63];
32 	} common;
33 	struct {
34 		uint8_t verb;
35 		uint8_t _rsvd0;
36 		uint16_t we_mask;
37 		uint32_t fqid;	/* Only bottom 24 bits allowed */
38 		uint16_t count;
39 		uint8_t orpc;
40 		uint8_t cgid;
41 		uint16_t fq_ctrl;
42 		uint16_t dest_chan:13;
43 		uint16_t dest_wq:3;
44 		uint16_t ics_cred;
45 		uint16_t td_thresh_oac;
46 		uint32_t context_b;
47 		uint32_t context_a;
48 		uint8_t _rsvd1[32];
49 	} init_fq;
50 	struct {
51 		uint8_t verb;
52 		uint8_t _rsvd0[3];
53 		uint32_t fqid; /* Only bottom 24 bits used */
54 		uint8_t _rsvd1[56];
55 	} query_fq;
56 	struct {
57 		uint8_t verb;
58 		uint8_t _rsvd0[3];
59 		uint32_t fqid;
60 		uint8_t _rsvd1[56];
61 	} query_fq_np;
62 	struct {
63 		uint8_t verb;
64 		uint8_t _rsvd0[3];
65 		uint32_t fqid;
66 		uint8_t _rsvd1;
67 		uint8_t count;
68 		uint8_t _rsvd2[10];
69 		uint32_t context_b;
70 		uint8_t _rsvd3[40];
71 	} alter_fqs;
72 };
73 
74 union qman_mc_result {
75 	struct {
76 		uint8_t verb;
77 		uint8_t data[63];
78 	} common;
79 	struct {
80 		uint8_t verb;
81 		uint8_t rslt;
82 		uint8_t _rsvd[62];
83 	} init_fq;
84 	struct {
85 		uint8_t verb;
86 		uint8_t rslt;
87 		uint8_t _rsvd0[8];
88 		uint8_t orpc;
89 		uint8_t cgid;
90 		uint16_t fq_ctrl;
91 		uint16_t dest_wq;
92 		uint16_t ics_cred;
93 		uint16_t td_thresh;
94 		uint32_t context_b;
95 		uint32_t context_a;
96 		uint16_t oac;
97 		uint8_t _rsvd1[30];
98 	} query_fq;
99 	struct {
100 		uint8_t verb;
101 		uint8_t rslt;
102 		uint8_t _rsvd0;
103 		uint8_t state;
104 		uint32_t fqd_link;
105 		uint16_t odp_seq;
106 		uint16_t orp_nesn;
107 		uint16_t orp_ea_hseq;
108 		uint16_t orp_ea_tseq;
109 		uint32_t orp_ea_hptr;
110 		uint32_t orp_ea_tptr;
111 		uint32_t pfdr_hptr;
112 		uint32_t pfdr_tptr;
113 		uint8_t _rsvd1[5];
114 		uint8_t is;
115 		uint16_t ics_surp;
116 		uint32_t byte_cnt;
117 		uint32_t frm_cnt;
118 		uint32_t _rsvd2;
119 		uint16_t ra1_sfdr;
120 		uint16_t ra2_sfdr;
121 		uint16_t _rsvd3;
122 		uint16_t od1_sfdr;
123 		uint16_t od2_sfdr;
124 		uint16_t od3_sfdr;
125 	} query_fq_np;
126 	struct {
127 		uint8_t verb;
128 		uint8_t rslt;
129 		uint8_t fqs;
130 		uint8_t _rsvd[61];
131 	} alter_fqs;
132 };
133 
134 struct qman_mc {
135 	uint8_t polarity;
136 	bool busy;
137 };
138 
139 struct qman_fq {
140 	uint32_t fqid;
141 	struct qman_cb cb;
142 };
143 
144 struct qman_portal_softc {
145 	struct dpaa_portal_softc sc_base;
146 
147 	/* Rings (Enqueue, Dequeue, Message */
148 	struct qman_eqcr_ring sc_eqcr;
149 	struct qman_dqrr_ring sc_dqrr;
150 	struct qman_mr_ring sc_mr;
151 	struct qman_mc sc_mc;
152 
153 	int sc_affine_channel;
154 };
155 
156 struct qman_fq *qman_fq_from_index(uint32_t fqid);
157 
158 union qman_mc_result *
159 qman_portal_mc_send_raw(device_t, union qman_mc_command *);
160 int qman_portal_fq_enqueue(device_t, struct qman_fq *, struct dpaa_fd *);
161 void qman_portal_static_dequeue_channel(device_t, int);
162 void qman_portal_static_dequeue_rm_channel(device_t dev, int channel);
163 
164 extern int qman_channel_base;
165 DPCPU_DECLARE(device_t, qman_affine_portal);
166 
167 #endif	/* QMAN_VAR_H */
168