1024a8abbSNagadheeraj Rottela /* SPDX-License-Identifier: BSD-3-Clause
2024a8abbSNagadheeraj Rottela * Copyright(C) 2019 Marvell International Ltd.
3024a8abbSNagadheeraj Rottela */
4024a8abbSNagadheeraj Rottela
5024a8abbSNagadheeraj Rottela #ifndef _NITROX_HAL_H_
6024a8abbSNagadheeraj Rottela #define _NITROX_HAL_H_
7024a8abbSNagadheeraj Rottela
8024a8abbSNagadheeraj Rottela #include <rte_cycles.h>
9024a8abbSNagadheeraj Rottela #include <rte_byteorder.h>
10024a8abbSNagadheeraj Rottela
11024a8abbSNagadheeraj Rottela #include "nitrox_csr.h"
12024a8abbSNagadheeraj Rottela
13024a8abbSNagadheeraj Rottela union nps_pkt_slc_cnts {
14024a8abbSNagadheeraj Rottela uint64_t u64;
15024a8abbSNagadheeraj Rottela struct {
16024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
17024a8abbSNagadheeraj Rottela uint64_t slc_int : 1;
18024a8abbSNagadheeraj Rottela uint64_t uns_int : 1;
19024a8abbSNagadheeraj Rottela uint64_t in_int : 1;
20024a8abbSNagadheeraj Rottela uint64_t mbox_int : 1;
21024a8abbSNagadheeraj Rottela uint64_t resend : 1;
22024a8abbSNagadheeraj Rottela uint64_t raz : 5;
23024a8abbSNagadheeraj Rottela uint64_t timer : 22;
24024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
25024a8abbSNagadheeraj Rottela #else
26024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
27024a8abbSNagadheeraj Rottela uint64_t timer : 22;
28024a8abbSNagadheeraj Rottela uint64_t raz : 5;
29024a8abbSNagadheeraj Rottela uint64_t resend : 1;
30024a8abbSNagadheeraj Rottela uint64_t mbox_int : 1;
31024a8abbSNagadheeraj Rottela uint64_t in_int : 1;
32024a8abbSNagadheeraj Rottela uint64_t uns_int : 1;
33024a8abbSNagadheeraj Rottela uint64_t slc_int : 1;
34024a8abbSNagadheeraj Rottela #endif
35024a8abbSNagadheeraj Rottela } s;
36024a8abbSNagadheeraj Rottela };
37024a8abbSNagadheeraj Rottela
38024a8abbSNagadheeraj Rottela union nps_pkt_slc_int_levels {
39024a8abbSNagadheeraj Rottela uint64_t u64;
40024a8abbSNagadheeraj Rottela struct {
41024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
42024a8abbSNagadheeraj Rottela uint64_t bmode : 1;
43024a8abbSNagadheeraj Rottela uint64_t raz : 9;
44024a8abbSNagadheeraj Rottela uint64_t timet : 22;
45024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
46024a8abbSNagadheeraj Rottela #else
47024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
48024a8abbSNagadheeraj Rottela uint64_t timet : 22;
49024a8abbSNagadheeraj Rottela uint64_t raz : 9;
50024a8abbSNagadheeraj Rottela uint64_t bmode : 1;
51024a8abbSNagadheeraj Rottela #endif
52024a8abbSNagadheeraj Rottela } s;
53024a8abbSNagadheeraj Rottela };
54024a8abbSNagadheeraj Rottela
55024a8abbSNagadheeraj Rottela union nps_pkt_slc_ctl {
56024a8abbSNagadheeraj Rottela uint64_t u64;
57024a8abbSNagadheeraj Rottela struct {
58024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
59024a8abbSNagadheeraj Rottela uint64_t raz : 61;
60024a8abbSNagadheeraj Rottela uint64_t rh : 1;
61024a8abbSNagadheeraj Rottela uint64_t z : 1;
62024a8abbSNagadheeraj Rottela uint64_t enb : 1;
63024a8abbSNagadheeraj Rottela #else
64024a8abbSNagadheeraj Rottela uint64_t enb : 1;
65024a8abbSNagadheeraj Rottela uint64_t z : 1;
66024a8abbSNagadheeraj Rottela uint64_t rh : 1;
67024a8abbSNagadheeraj Rottela uint64_t raz : 61;
68024a8abbSNagadheeraj Rottela #endif
69024a8abbSNagadheeraj Rottela } s;
70024a8abbSNagadheeraj Rottela };
71024a8abbSNagadheeraj Rottela
72024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_ctl {
73024a8abbSNagadheeraj Rottela uint64_t u64;
74024a8abbSNagadheeraj Rottela struct {
75024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
76024a8abbSNagadheeraj Rottela uint64_t raz : 62;
77024a8abbSNagadheeraj Rottela uint64_t is64b : 1;
78024a8abbSNagadheeraj Rottela uint64_t enb : 1;
79024a8abbSNagadheeraj Rottela #else
80024a8abbSNagadheeraj Rottela uint64_t enb : 1;
81024a8abbSNagadheeraj Rottela uint64_t is64b : 1;
82024a8abbSNagadheeraj Rottela uint64_t raz : 62;
83024a8abbSNagadheeraj Rottela #endif
84024a8abbSNagadheeraj Rottela } s;
85024a8abbSNagadheeraj Rottela };
86024a8abbSNagadheeraj Rottela
87024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_rsize {
88024a8abbSNagadheeraj Rottela uint64_t u64;
89024a8abbSNagadheeraj Rottela struct {
90024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
91024a8abbSNagadheeraj Rottela uint64_t raz : 32;
92024a8abbSNagadheeraj Rottela uint64_t rsize : 32;
93024a8abbSNagadheeraj Rottela #else
94024a8abbSNagadheeraj Rottela uint64_t rsize : 32;
95024a8abbSNagadheeraj Rottela uint64_t raz : 32;
96024a8abbSNagadheeraj Rottela #endif
97024a8abbSNagadheeraj Rottela } s;
98024a8abbSNagadheeraj Rottela };
99024a8abbSNagadheeraj Rottela
100024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_baoff_dbell {
101024a8abbSNagadheeraj Rottela uint64_t u64;
102024a8abbSNagadheeraj Rottela struct {
103024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
104024a8abbSNagadheeraj Rottela uint64_t aoff : 32;
105024a8abbSNagadheeraj Rottela uint64_t dbell : 32;
106024a8abbSNagadheeraj Rottela #else
107024a8abbSNagadheeraj Rottela uint64_t dbell : 32;
108024a8abbSNagadheeraj Rottela uint64_t aoff : 32;
109024a8abbSNagadheeraj Rottela #endif
110024a8abbSNagadheeraj Rottela } s;
111024a8abbSNagadheeraj Rottela };
112024a8abbSNagadheeraj Rottela
113024a8abbSNagadheeraj Rottela union nps_pkt_in_done_cnts {
114024a8abbSNagadheeraj Rottela uint64_t u64;
115024a8abbSNagadheeraj Rottela struct {
116024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
117024a8abbSNagadheeraj Rottela uint64_t slc_int : 1;
118024a8abbSNagadheeraj Rottela uint64_t uns_int : 1;
119024a8abbSNagadheeraj Rottela uint64_t in_int : 1;
120024a8abbSNagadheeraj Rottela uint64_t mbox_int : 1;
121024a8abbSNagadheeraj Rottela uint64_t resend : 1;
122024a8abbSNagadheeraj Rottela uint64_t raz : 27;
123024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
124024a8abbSNagadheeraj Rottela #else
125024a8abbSNagadheeraj Rottela uint64_t cnt : 32;
126024a8abbSNagadheeraj Rottela uint64_t raz : 27;
127024a8abbSNagadheeraj Rottela uint64_t resend : 1;
128024a8abbSNagadheeraj Rottela uint64_t mbox_int : 1;
129024a8abbSNagadheeraj Rottela uint64_t in_int : 1;
130024a8abbSNagadheeraj Rottela uint64_t uns_int : 1;
131024a8abbSNagadheeraj Rottela uint64_t slc_int : 1;
132024a8abbSNagadheeraj Rottela #endif
133024a8abbSNagadheeraj Rottela } s;
134024a8abbSNagadheeraj Rottela };
135024a8abbSNagadheeraj Rottela
136024a8abbSNagadheeraj Rottela union aqmq_qsz {
137024a8abbSNagadheeraj Rottela uint64_t u64;
138024a8abbSNagadheeraj Rottela struct {
139024a8abbSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
140024a8abbSNagadheeraj Rottela uint64_t raz : 32;
141024a8abbSNagadheeraj Rottela uint64_t host_queue_size : 32;
142024a8abbSNagadheeraj Rottela #else
143024a8abbSNagadheeraj Rottela uint64_t host_queue_size : 32;
144024a8abbSNagadheeraj Rottela uint64_t raz : 32;
145024a8abbSNagadheeraj Rottela #endif
146024a8abbSNagadheeraj Rottela } s;
147024a8abbSNagadheeraj Rottela };
148024a8abbSNagadheeraj Rottela
149*751ea2c0SNagadheeraj Rottela union zqmq_activity_stat {
150*751ea2c0SNagadheeraj Rottela uint64_t u64;
151*751ea2c0SNagadheeraj Rottela struct {
152*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
153*751ea2c0SNagadheeraj Rottela uint64_t raz : 63;
154*751ea2c0SNagadheeraj Rottela uint64_t queue_active : 1;
155*751ea2c0SNagadheeraj Rottela #else
156*751ea2c0SNagadheeraj Rottela uint64_t queue_active : 1;
157*751ea2c0SNagadheeraj Rottela uint64_t raz : 63;
158*751ea2c0SNagadheeraj Rottela #endif
159*751ea2c0SNagadheeraj Rottela } s;
160*751ea2c0SNagadheeraj Rottela };
161*751ea2c0SNagadheeraj Rottela
162*751ea2c0SNagadheeraj Rottela union zqmq_en {
163*751ea2c0SNagadheeraj Rottela uint64_t u64;
164*751ea2c0SNagadheeraj Rottela struct {
165*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
166*751ea2c0SNagadheeraj Rottela uint64_t raz : 63;
167*751ea2c0SNagadheeraj Rottela uint64_t queue_enable : 1;
168*751ea2c0SNagadheeraj Rottela #else
169*751ea2c0SNagadheeraj Rottela uint64_t queue_enable : 1;
170*751ea2c0SNagadheeraj Rottela uint64_t raz : 63;
171*751ea2c0SNagadheeraj Rottela #endif
172*751ea2c0SNagadheeraj Rottela } s;
173*751ea2c0SNagadheeraj Rottela };
174*751ea2c0SNagadheeraj Rottela
175*751ea2c0SNagadheeraj Rottela union zqmq_cmp_cnt {
176*751ea2c0SNagadheeraj Rottela uint64_t u64;
177*751ea2c0SNagadheeraj Rottela struct {
178*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
179*751ea2c0SNagadheeraj Rottela uint64_t raz : 30;
180*751ea2c0SNagadheeraj Rottela uint64_t resend : 1;
181*751ea2c0SNagadheeraj Rottela uint64_t completion_status : 1;
182*751ea2c0SNagadheeraj Rottela uint64_t commands_completed_count: 32;
183*751ea2c0SNagadheeraj Rottela #else
184*751ea2c0SNagadheeraj Rottela uint64_t commands_completed_count: 32;
185*751ea2c0SNagadheeraj Rottela uint64_t completion_status : 1;
186*751ea2c0SNagadheeraj Rottela uint64_t resend : 1;
187*751ea2c0SNagadheeraj Rottela uint64_t raz : 30;
188*751ea2c0SNagadheeraj Rottela #endif
189*751ea2c0SNagadheeraj Rottela } s;
190*751ea2c0SNagadheeraj Rottela };
191*751ea2c0SNagadheeraj Rottela
192*751ea2c0SNagadheeraj Rottela union zqmq_drbl {
193*751ea2c0SNagadheeraj Rottela uint64_t u64;
194*751ea2c0SNagadheeraj Rottela struct {
195*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
196*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
197*751ea2c0SNagadheeraj Rottela uint64_t dbell_count : 32;
198*751ea2c0SNagadheeraj Rottela #else
199*751ea2c0SNagadheeraj Rottela uint64_t dbell_count : 32;
200*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
201*751ea2c0SNagadheeraj Rottela #endif
202*751ea2c0SNagadheeraj Rottela } s;
203*751ea2c0SNagadheeraj Rottela };
204*751ea2c0SNagadheeraj Rottela
205*751ea2c0SNagadheeraj Rottela union zqmq_qsz {
206*751ea2c0SNagadheeraj Rottela uint64_t u64;
207*751ea2c0SNagadheeraj Rottela struct {
208*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
209*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
210*751ea2c0SNagadheeraj Rottela uint64_t host_queue_size: 32;
211*751ea2c0SNagadheeraj Rottela #else
212*751ea2c0SNagadheeraj Rottela uint64_t host_queue_size: 32;
213*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
214*751ea2c0SNagadheeraj Rottela #endif
215*751ea2c0SNagadheeraj Rottela } s;
216*751ea2c0SNagadheeraj Rottela };
217*751ea2c0SNagadheeraj Rottela
218*751ea2c0SNagadheeraj Rottela union zqmq_cmp_thr {
219*751ea2c0SNagadheeraj Rottela uint64_t u64;
220*751ea2c0SNagadheeraj Rottela struct {
221*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
222*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
223*751ea2c0SNagadheeraj Rottela uint64_t commands_completed_threshold : 32;
224*751ea2c0SNagadheeraj Rottela #else
225*751ea2c0SNagadheeraj Rottela uint64_t commands_completed_threshold : 32;
226*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
227*751ea2c0SNagadheeraj Rottela #endif
228*751ea2c0SNagadheeraj Rottela } s;
229*751ea2c0SNagadheeraj Rottela };
230*751ea2c0SNagadheeraj Rottela
231*751ea2c0SNagadheeraj Rottela union zqmq_timer_ld {
232*751ea2c0SNagadheeraj Rottela uint64_t u64;
233*751ea2c0SNagadheeraj Rottela struct {
234*751ea2c0SNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
235*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
236*751ea2c0SNagadheeraj Rottela uint64_t timer_load_value: 32;
237*751ea2c0SNagadheeraj Rottela #else
238*751ea2c0SNagadheeraj Rottela uint64_t timer_load_value: 32;
239*751ea2c0SNagadheeraj Rottela uint64_t raz : 32;
240*751ea2c0SNagadheeraj Rottela #endif
241*751ea2c0SNagadheeraj Rottela } s;
242*751ea2c0SNagadheeraj Rottela };
243*751ea2c0SNagadheeraj Rottela
244024a8abbSNagadheeraj Rottela enum nitrox_vf_mode {
245024a8abbSNagadheeraj Rottela NITROX_MODE_PF = 0x0,
246024a8abbSNagadheeraj Rottela NITROX_MODE_VF16 = 0x1,
247024a8abbSNagadheeraj Rottela NITROX_MODE_VF32 = 0x2,
248024a8abbSNagadheeraj Rottela NITROX_MODE_VF64 = 0x3,
249024a8abbSNagadheeraj Rottela NITROX_MODE_VF128 = 0x4,
250024a8abbSNagadheeraj Rottela };
251024a8abbSNagadheeraj Rottela
252*751ea2c0SNagadheeraj Rottela static inline int
inc_zqmq_next_cmd(uint8_t * bar_addr,uint16_t ring)253*751ea2c0SNagadheeraj Rottela inc_zqmq_next_cmd(uint8_t *bar_addr, uint16_t ring)
254*751ea2c0SNagadheeraj Rottela {
255*751ea2c0SNagadheeraj Rottela uint64_t reg_addr = 0;
256*751ea2c0SNagadheeraj Rottela uint64_t val;
257*751ea2c0SNagadheeraj Rottela
258*751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_NXT_CMDX(ring);
259*751ea2c0SNagadheeraj Rottela val = nitrox_read_csr(bar_addr, reg_addr);
260*751ea2c0SNagadheeraj Rottela val++;
261*751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, val);
262*751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY);
263*751ea2c0SNagadheeraj Rottela if (nitrox_read_csr(bar_addr, reg_addr) != val)
264*751ea2c0SNagadheeraj Rottela return -EIO;
265*751ea2c0SNagadheeraj Rottela
266*751ea2c0SNagadheeraj Rottela return 0;
267*751ea2c0SNagadheeraj Rottela }
268*751ea2c0SNagadheeraj Rottela
269024a8abbSNagadheeraj Rottela int vf_get_vf_config_mode(uint8_t *bar_addr);
270024a8abbSNagadheeraj Rottela int vf_config_mode_to_nr_queues(enum nitrox_vf_mode vf_mode);
271024a8abbSNagadheeraj Rottela void setup_nps_pkt_input_ring(uint8_t *bar_addr, uint16_t ring, uint32_t rsize,
272024a8abbSNagadheeraj Rottela phys_addr_t raddr);
273024a8abbSNagadheeraj Rottela void setup_nps_pkt_solicit_output_port(uint8_t *bar_addr, uint16_t port);
274024a8abbSNagadheeraj Rottela void nps_pkt_input_ring_disable(uint8_t *bar_addr, uint16_t ring);
275024a8abbSNagadheeraj Rottela void nps_pkt_solicited_port_disable(uint8_t *bar_addr, uint16_t port);
276*751ea2c0SNagadheeraj Rottela int setup_zqmq_input_ring(uint8_t *bar_addr, uint16_t ring, uint32_t rsize,
277*751ea2c0SNagadheeraj Rottela phys_addr_t raddr);
278*751ea2c0SNagadheeraj Rottela int zqmq_input_ring_disable(uint8_t *bar_addr, uint16_t ring);
279024a8abbSNagadheeraj Rottela
280024a8abbSNagadheeraj Rottela #endif /* _NITROX_HAL_H_ */
281