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