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