1/*-
2*******************************************************************************
3Copyright (C) 2015 Annapurna Labs Ltd.
4
5This file may be licensed under the terms of the Annapurna Labs Commercial
6License Agreement.
7
8Alternatively, this file can be distributed under the terms of the GNU General
9Public License V2 as published by the Free Software Foundation and can be
10found at http://www.gnu.org/licenses/gpl-2.0.html
11
12Alternatively, redistribution and use in source and binary forms, with or
13without modification, are permitted provided that the following conditions are
14met:
15
16    *     Redistributions of source code must retain the above copyright notice,
17this list of conditions and the following disclaimer.
18
19    *     Redistributions in binary form must reproduce the above copyright
20notice, this list of conditions and the following disclaimer in
21the documentation and/or other materials provided with the
22distribution.
23
24THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35*******************************************************************************/
36
37/**
38 * @defgroup group_udma_interrupts UDMA I/O Fabric Interrupt Controller
39 * @ingroup group_udma_api
40 *  UDMA IOFIC API
41 *  @{
42 * @file   al_hal_udma_iofic.h
43 *
44 * @brief C Header file for programming the interrupt controller that found
45 * in UDMA based units. These APIs rely and use some the Interrupt controller
46 * API under al_hal_iofic.h
47 */
48
49#ifndef __AL_HAL_UDMA_IOFIC_H__
50#define __AL_HAL_UDMA_IOFIC_H__
51
52#include <al_hal_common.h>
53#include <al_hal_iofic.h>
54#include <al_hal_udma_regs.h>
55
56/* *INDENT-OFF* */
57#ifdef __cplusplus
58extern "C" {
59#endif
60/* *INDENT-ON* */
61
62/**
63 * Interrupt Mode
64 * This is the interrupt mode for the primary interrupt level The secondary
65 * interrupt level does not have mode and it is always a level sensitive
66 * interrupt that is reflected in group D of the primary.
67 */
68enum al_iofic_mode {
69	AL_IOFIC_MODE_LEGACY, /**< level-sensitive interrupt wire */
70	AL_IOFIC_MODE_MSIX_PER_Q, /**< per UDMA queue MSI-X interrupt */
71	AL_IOFIC_MODE_MSIX_PER_GROUP
72};
73
74/** interrupt controller level (primary/secondary) */
75enum al_udma_iofic_level {
76	AL_UDMA_IOFIC_LEVEL_PRIMARY,
77	AL_UDMA_IOFIC_LEVEL_SECONDARY
78};
79
80/*
81 * The next four groups represents the standard 4 groups in the primary
82 * interrupt controller of each bus-master unit in the I/O Fabric.
83 * The first two groups can be used when accessing the secondary interrupt
84 * controller as well.
85 */
86#define AL_INT_GROUP_A		0 /**< summary of the below events */
87#define AL_INT_GROUP_B		1 /**< RX completion queues */
88#define AL_INT_GROUP_C		2 /**< TX completion queues */
89#define AL_INT_GROUP_D		3 /**< Misc */
90
91/*******************************************************************************
92 * Primary interrupt controller, group A bits
93 ******************************************************************************/
94/* Group A bits which are just summary bits of GROUP B, C and D */
95#define AL_INT_GROUP_A_GROUP_B_SUM	AL_BIT(0)
96#define AL_INT_GROUP_A_GROUP_C_SUM	AL_BIT(1)
97#define AL_INT_GROUP_A_GROUP_D_SUM	AL_BIT(2)
98
99/*******************************************************************************
100 * MSIX entry indices
101 ******************************************************************************/
102/** MSIX entry index for summary of group D in group A */
103#define AL_INT_MSIX_GROUP_A_SUM_D_IDX 	2
104/** MSIX entry index for RX completion queue 0 */
105#define AL_INT_MSIX_RX_COMPLETION_START	3
106
107/*******************************************************************************
108 * Primary interrupt controller, group D bits
109 ******************************************************************************/
110#define AL_INT_GROUP_D_CROSS_MAIL_BOXES	\
111			(AL_BIT(0) | AL_BIT(1) | AL_BIT(2) | AL_BIT(3))
112/** Summary of secondary interrupt controller, group A) */
113#define AL_INT_GROUP_D_M2S	AL_BIT(8)
114/** Summary of secondary interrupt controller, group B) */
115#define AL_INT_GROUP_D_S2M	AL_BIT(9)
116#define AL_INT_GROUP_D_SW_TIMER_INT	AL_BIT(10)
117#define AL_INT_GROUP_D_APP_EXT_INT	AL_BIT(11)
118#define AL_INT_GROUP_D_ALL			\
119			AL_INT_GROUP_D_CROSS_MAIL_BOXES | \
120			AL_INT_GROUP_D_M2S | \
121			AL_INT_GROUP_D_S2M | \
122			AL_INT_GROUP_D_SW_TIMER_INT | \
123			AL_INT_GROUP_D_APP_EXT_INT
124
125/*
126 * Until this point, all description above is for Groups A/B/C/D in the PRIMARY
127 * Interrupt controller.
128 * Following are definitions related to the secondary interrupt controller with
129 * two cause registers (group A and group B) that covers UDMA M2S/S2M errors.
130 * Secondary interrupt controller summary bits are not mapped to the Processor
131 * GIC directly, rather they are represented in Group D of the primary interrupt
132 * controller.
133 */
134
135/******************************************************************************
136 * Secondary interrupt Controller, Group A, which holds the TX (M2S) error
137 * interrupt bits
138 ******************************************************************************/
139
140/**
141 * MSIx response
142 * MSIX Bus generator response error, the Bus response received with error indication
143 */
144#define AL_INT_2ND_GROUP_A_M2S_MSIX_RESP		AL_BIT(27)
145/**
146 * MSIx timeout	MSIX Bus generator timeout error.
147 * The generator didn't receive bus response for the MSIx write transaction.
148 */
149#define AL_INT_2ND_GROUP_A_M2S_MSIX_TO			AL_BIT(26)
150/** Prefetch header buffer parity error */
151#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_HDR_PARITY	AL_BIT(25)
152/** Prefetch descriptor buffer parity error */
153#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_DESC_PARITY	AL_BIT(24)
154/** Data buffer parity error */
155#define AL_INT_2ND_GROUP_A_M2S_DATA_PARITY		AL_BIT(23)
156/** Data header buffer parity error */
157#define AL_INT_2ND_GROUP_A_M2S_HDR_PARITY		AL_BIT(22)
158/** Completion coalescing buffer parity error */
159#define AL_INT_2ND_GROUP_A_M2S_COMPL_COAL_PARITY	AL_BIT(21)
160/** UNACK packets buffer parity error */
161#define AL_INT_2ND_GROUP_A_M2S_UNACK_PKT_PARITY		AL_BIT(20)
162/** ACK packets buffer parity error */
163#define AL_INT_2ND_GROUP_A_M2S_ACK_PKT_PARITY		AL_BIT(19)
164/** AXI data buffer parity error */
165#define AL_INT_2ND_GROUP_A_M2S_AX_DATA_PARITY		AL_BIT(18)
166/**
167 * Prefetch Ring ID error
168 * A wrong RingId was received while prefetching submission descriptor. This
169 * could indicate a software bug or hardware failure, unless the UDMA is
170 * working in a mode to ignore RingId (the al_udma_iofic_config() API can be
171 * used to configure the UDMA to ignore the Ring ID check)
172 */
173#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_RING_ID		AL_BIT(17)
174/**
175 * Prefetch last
176 * Error in last bit indication of the descriptor
177 * Descriptor with Last bit asserted is read from the queue to the prefetch
178 * FIFO when the prefetch engine is not in a middle of packet processing (a
179 * descriptor with First bit asserted should be read first to indicate start of
180 * packet)
181 */
182#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_LAST		AL_BIT(16)
183/**
184 * Prefetch first
185 * Error in first bit indication of the descriptor
186 * Descriptor with First bit asserted is read from the queue to the prefetch
187 * FIFO while the prefetch engine is in a middle of packet processing ( a
188 * descriptor with Last bit asserted should be read to indicate end of packet
189 * before starting a new one)
190 */
191#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_FIRST		AL_BIT(15)
192/**
193 * Prefetch max descriptors
194 * Number of descriptors per packet exceeds the configurable maximum
195 * descriptors per packet. This could indicate a software bug or a hardware
196 * failure.  (The al_udma_m2s_max_descs_set() API is used to configure the
197 * maximum descriptors per packet)
198 */
199#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_MAX_DESC	AL_BIT(14)
200/**
201 * Packet length
202 * Packet length exceeds the configurable maximum packet size.  The
203 * al_udma_m2s_packet_size_cfg_set() API is used to configure the maximum
204 * packet size)
205 */
206#define AL_INT_2ND_GROUP_A_M2S_PKT_LEN			AL_BIT(13)
207/**
208 * Prefetch AXI timeout
209 * Bus request to I/O Fabric timeout error
210 */
211#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_TO		AL_BIT(12)
212/**
213 * Prefetch AXI response
214 * Bus response from I/O Fabric error
215 */
216#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_RESP	AL_BIT(11)
217/**
218 * Prefetch AXI parity
219 * Bus parity error on descriptor being prefetched
220 */
221#define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_PARITY	AL_BIT(10)
222/**
223 * Data AXI timeout
224 * Bus request to I/O Fabric timeout error
225 */
226#define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_TO		AL_BIT(9)
227/**
228 * Data AXI response
229 * Bus response from I/O Fabric error
230 */
231#define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_RESP		AL_BIT(8)
232/**
233 * Data AXI parity
234 * Bus parity error on data being read
235 */
236#define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_PARITY		AL_BIT(7)
237/**
238 * Completion AXI timeout
239 * Bus request to I/O Fabric timeout error
240 */
241#define AL_INT_2ND_GROUP_A_M2S_CONPL_AXI_TO		AL_BIT(6)
242/**
243 * Completion AXI response
244 * Bus response from I/O Fabric error
245 */
246#define AL_INT_2ND_GROUP_A_M2S_COMPL_AXI_RESP		AL_BIT(5)
247/**
248 * Completion AXI parity
249 * Bus generator internal SRAM parity error
250 */
251#define AL_INT_2ND_GROUP_A_M2S_COMP_AXI_PARITY		AL_BIT(4)
252/**
253 * Stream timeout
254 * Application stream interface timeout indicating a failure at the Application
255 * layer (RAID, Ethernet etc)
256 */
257#define AL_INT_2ND_GROUP_A_M2S_STRM_TO			AL_BIT(3)
258/**
259 * Stream response
260 * Application stream interface response error indicating a failure at the
261 * Application layer (RAID, Ethernet etc)
262 */
263#define AL_INT_2ND_GROUP_A_M2S_STRM_RESP		AL_BIT(2)
264/**
265 * Stream parity
266 * Application stream interface parity error indicating a failure at the
267 * Application layer (RAID, Ethernet etc)
268 */
269#define AL_INT_2ND_GROUP_A_M2S_STRM_PARITY		 AL_BIT(1)
270/**
271 * Stream completion mismatch
272 * Application stream interface, packet serial mismatch error indicating a
273 * failure at the Application layer (RAID, Ethernet etc)
274 */
275#define AL_INT_2ND_GROUP_A_M2S_STRM_COMPL_MISMATCH	AL_BIT(0)
276
277/*******************************************************************************
278 * Secondary interrupt Controller, Group B, which holds the RX (S2M) error
279 * interrupt bits
280 ******************************************************************************/
281
282/** Prefetch descriptor buffer parity error */
283#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_DESC_PARITY	AL_BIT(30)
284/** Completion coalescing buffer parity error */
285#define AL_INT_2ND_GROUP_B_S2M_COMPL_COAL_PARITY	AL_BIT(29)
286/** PRE-UNACK packets buffer parity error */
287#define AL_INT_2ND_GROUP_B_S2M_PRE_UNACK_PKT_PARITY	AL_BIT(28)
288/** UNACK packets buffer parity error */
289#define AL_INT_2ND_GROUP_B_S2M_UNACK_PKT_PARITY		AL_BIT(27)
290/** Data buffer parity error */
291#define AL_INT_2ND_GROUP_B_S2M_DATA_PARITY		AL_BIT(26)
292/** Data header buffer parity error */
293#define AL_INT_2ND_GROUP_B_S2M_DATA_HDR_PARITY		AL_BIT(25)
294/**
295 * Packet length
296 * Application stream interface, Data counter length mismatch with metadata
297 * packet length indicating a failure at the Application layer (RAID, Ethernet
298 * etc)
299 */
300#define AL_INT_2ND_GROUP_B_S2M_PKT_LEN			AL_BIT(24)
301/**
302 * Stream last
303 * Application stream interface, error in Last bit indication, this error is
304 * asserted when a 'last' indication is asserted on the stream interface
305 * (between the application and the UDMA) when the interface is not in the
306 * middle of packet, meaning that there was no 'first' indication before. This
307 * indicates a failure at the application layer.
308 */
309#define AL_INT_2ND_GROUP_B_S2M_STRM_LAST		AL_BIT(23)
310/**
311 * Stream first
312 * Application stream interface error in first bit indication, this error is
313 * asserted when a 'first' indication is asserted on the stream interface
314 * (between the application and the UDMA) when the interface is in the middle
315 * of packet, meaning that there was a 'first' indication before and the UDMA
316 * is waiting for a 'last' indication to end the packet. This indicates a
317 * failure at the application layer.
318 */
319#define AL_INT_2ND_GROUP_B_S2M_STRM_FIRST		AL_BIT(22)
320/**
321 * Stream data
322 * Application stream interface, error indication during data transaction
323 */
324#define AL_INT_2ND_GROUP_B_S2M_STRM_DATA		AL_BIT(21)
325/**
326 * Stream Data parity
327 * Application stream interface, parity error during data transaction
328 */
329#define AL_INT_2ND_GROUP_B_S2M_STRM_DATA_PARITY		AL_BIT(20)
330/**
331 * Stream Header error
332 * Application stream interface, error indication during header transaction
333 */
334#define AL_INT_2ND_GROUP_B_S2M_STRM_HDR			AL_BIT(19)
335/**
336 * Stream Header parity
337 * Application stream interface, parity error during header transaction
338 */
339#define AL_INT_2ND_GROUP_B_S2M_STRM_HDR_PARITY		AL_BIT(18)
340/**
341 * Completion UNACK
342 * Completion write, UNACK timeout due to completion FIFO back pressure
343 */
344#define AL_INT_2ND_GROUP_B_S2M_COMPL_UNACK		AL_BIT(17)
345/**
346 * Completion stream
347 * Completion write, UNACK timeout due to stream ACK FIFO back pressure
348 */
349#define AL_INT_2ND_GROUP_B_S2M_COMPL_STRM		AL_BIT(16)
350/**
351 * Completion AXI timeout
352 * Bus request to I/O Fabric timeout error
353 */
354#define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_TO		AL_BIT(15)
355/**
356 * Completion AXI response
357 * Bus response from I/O Fabric error
358 */
359#define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_RESP		AL_BIT(14)
360/**
361 * Completion AXI parity
362 * Completion Bus generator internal SRAM parity error
363 */
364#define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_PARITY		AL_BIT(13)
365/**
366 * Prefetch saturate
367 * Prefetch engine, packet length counter saturated (32 bit) , this is caused
368 * by an error at the application layer which sends packet data without
369 * 'last'/'first' indication.
370 */
371#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_SAT		AL_BIT(12)
372/**
373 * Prefetch ring ID
374 * Prefetch engine, Ring ID is not matching the expected RingID. This could
375 * indicate a software bug or hardware failure, unless the UDMA is working in a
376 * mode to ignore RingId  (the al_udma_iofic_config() API can be used to
377 * configure the UDMA to ignore the Ring ID check)
378 */
379#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_RING_ID		AL_BIT(11)
380/**
381 * Prefetch AXI timeout
382 * Bus request to I/O Fabric timeout error
383 */
384#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_TO		AL_BIT(10)
385/**
386 * Prefetch AXI response
387 * Bus response from I/O Fabric error
388 */
389#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_RESP	AL_BIT(9)
390/**
391 * Prefetch AXI parity
392 * Bus parity error on descriptor being prefetched
393 */
394#define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_PARITY	AL_BIT(8)
395/**
396 * No descriptors hint
397 * Data write, Hint to the SW that there are not enough descriptors in the
398 * queue for the current received packet. This is considered a hint and not an
399 * error, as it could be a normal situation in certain application. The S2M
400 * UDMA behavior when it runs out of Rx Descriptor is controlled by driver
401 * which can use this hint to add more descriptors to the Rx queue.
402 */
403#define AL_INT_2ND_GROUP_B_S2M_NO_DESC_HINT		AL_BIT(7)
404/**
405 * No descriptors timeout
406 * Data write, Timeout indication when there are not enough descriptors for the
407 * current packet and the timeout expires. The S2M UDMA behavior when it runs
408 * out of Rx Descriptor is controlled by driver which can use this hint to add
409 * more descriptors to the Rx queue. The al_udma_s2m_no_desc_cfg_set() is used
410 * to configure theUDMA S2M timeout and behavior when there are no Rx
411 * descriptors for the received packet.
412 */
413#define AL_INT_2ND_GROUP_B_S2M_NO_DESC_TO		AL_BIT(6)
414/**
415 * Promotion indication
416 * Data write, the data write engine checks the queue number of the two packets
417 * at the head of the data FIFO, the data write engine notify the prefetch
418 * engine to promote these queue numbers in the prefetch scheduler to make sure
419 * that these queue will have RX descriptors for these packets. This error
420 * indicates that the prefetch promotion didn't work for the second packet in
421 * the FIFO. This is an indication used for system debug and not an error.
422 */
423#define AL_INT_2ND_GROUP_B_S2M_PROM_IND			AL_BIT(5)
424/**
425 * Header split ignored
426 * Data write, The application requested header split but the buffer descriptor
427 * doesn't include a second buffer for the header
428 */
429#define AL_INT_2ND_GROUP_B_S2M_HDR_SPLT_IGNORED		AL_BIT(4)
430/**
431 * Header split length
432 * Data write, The application requested header split and the length of the
433 * second buffer allocated for the header is not enough for the requested
434 * header length. The remaining of the header is written to buffer 1 (data
435 * buffer).
436 */
437#define AL_INT_2ND_GROUP_B_S2M_HDR_SPLT_LEN		AL_BIT(3)
438/**
439 * Data AXI timeout
440 * Bus request to I/O Fabric timeout error
441 */
442#define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_TO		AL_BIT(2)
443/**
444 * Data AXI response
445 * Bus response from I/O Fabric error
446 */
447#define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_RESP		AL_BIT(1)
448/**
449 * Data AXI parity
450 * Bus parity error on data being read
451 */
452#define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_PARITY		AL_BIT(0)
453
454/*******************************************************************************
455 * Configurations
456 ******************************************************************************/
457
458/**
459 * Configure the UDMA interrupt controller registers, interrupts will are kept
460 * masked.
461 * This is a static setting that should be called while initialized the
462 * interrupt controller within a given UDMA, and should not be modified during
463 * runtime unless the UDMA is completely disabled. The first argument sets the
464 * interrupt and MSIX modes. The m2s/s2m errors/abort are a set of bit-wise
465 * masks to define the behaviour of the UDMA once an error happens: The _abort
466 * will put the UDMA in abort state once an error happens The _error bitmask
467 * will indicate and error in the secondary cause register but will not abort.
468 * The bit-mask that the _errors_disable and _aborts_disable are described in
469 * 'AL_INT_2ND_GROUP_A_*' and 'AL_INT_2ND_GROUP_B_*'
470 *
471 * @param regs pointer to unit registers
472 * @param mode interrupt scheme mode (legacy, MSI-X..)
473 * @param m2s_errors_disable
474 * 	  This is a bit-wise mask, to indicate which one of the error causes in
475 * 	  secondary interrupt group_A should generate an interrupt. When a bit is
476 * 	  set, the error cause is ignored.
477 * 	  Recommended value: 0 (enable all errors).
478 * @param m2s_aborts_disable
479 * 	  This is a bit-wise mask, to indicate which one of the error causes in
480 * 	  secondary interrupt group_A should automatically put the UDMA in
481 * 	  abort state. When a bit is set, the error cause does cause an abort.
482 * 	  Recommended value: 0 (enable all aborts).
483 * @param s2m_errors_disable
484 * 	  This is a bit-wise mask, to indicate which one of the error causes in
485 * 	  secondary interrupt group_A should generate an interrupt. When a bit is
486 * 	  set, the error cause is ignored.
487 * 	  Recommended value: 0xE0 (disable hint errors).
488 * @param s2m_aborts_disable
489 * 	  This is a bit-wise mask, to indicate which one of the error causes in
490 * 	  secondary interrupt group_A should automatically put the UDMA in
491 * 	  abort state. When a bit is set, the error cause does cause an abort.
492 * 	  Recommended value: 0xE0 (disable hint aborts).
493 *
494 * @return 0 on success. -EINVAL otherwise.
495 */
496int al_udma_iofic_config(struct unit_regs __iomem *regs,
497			enum al_iofic_mode mode,
498			uint32_t	m2s_errors_disable,
499			uint32_t	m2s_aborts_disable,
500			uint32_t	s2m_errors_disable,
501			uint32_t	s2m_aborts_disable);
502/**
503 * return the offset of the unmask register for a given group.
504 * this function can be used when the upper layer wants to directly
505 * access the unmask regiter and bypass the al_udma_iofic_unmask() API.
506 *
507 * @param regs pointer to udma registers
508 * @param level the interrupt controller level (primary / secondary)
509 * @param group the interrupt group ('AL_INT_GROUP_*')
510 * @return the offset of the unmask register.
511 */
512uint32_t __iomem * al_udma_iofic_unmask_offset_get(
513	struct unit_regs __iomem	*regs,
514	enum al_udma_iofic_level	level,
515	int				group);
516
517/**
518 * Get the interrupt controller base address for either the primary or secondary
519 * interrupt controller
520 *
521 * @param regs pointer to udma unit registers
522 * @param level the interrupt controller level (primary / secondary)
523 *
524 * @returns	The interrupt controller base address
525 *
526 */
527static INLINE void __iomem *al_udma_iofic_reg_base_get(
528	struct unit_regs __iomem	*regs,
529	enum al_udma_iofic_level	level)
530{
531	void __iomem *iofic_regs = (level == AL_UDMA_IOFIC_LEVEL_PRIMARY) ?
532		(void __iomem *)&regs->gen.interrupt_regs.main_iofic :
533		(void __iomem *)&regs->gen.interrupt_regs.secondary_iofic_ctrl;
534
535	return iofic_regs;
536}
537
538/**
539 * Check the interrupt controller level/group validity
540 *
541 * @param level the interrupt controller level (primary / secondary)
542 * @param group the interrupt group ('AL_INT_GROUP_*')
543 *
544 * @returns	0 - invalid, 1 - valid
545 *
546 */
547static INLINE int al_udma_iofic_level_and_group_valid(
548	enum al_udma_iofic_level	level,
549	int				group)
550{
551	if (((level == AL_UDMA_IOFIC_LEVEL_PRIMARY) && (group >= 0) && (group < 4)) ||
552		((level == AL_UDMA_IOFIC_LEVEL_SECONDARY) && (group >= 0) && (group < 2)))
553		return 1;
554
555	return 0;
556}
557/**
558 * unmask specific interrupts for a given group
559 * this functions uses the interrupt mask clear register to guarantee atomicity
560 * it's safe to call it while the mask is changed by the HW (auto mask) or another cpu.
561 *
562 * @param regs pointer to udma unit registers
563 * @param level the interrupt controller level (primary / secondary)
564 * @param group the interrupt group ('AL_INT_GROUP_*')
565 * @param mask bitwise of interrupts to unmask, set bits will be unmasked.
566 */
567static INLINE void al_udma_iofic_unmask(
568	struct unit_regs __iomem	*regs,
569	enum al_udma_iofic_level	level,
570	int				group,
571	uint32_t			mask)
572{
573	al_assert(al_udma_iofic_level_and_group_valid(level, group));
574	al_iofic_unmask(al_udma_iofic_reg_base_get(regs, level), group, mask);
575}
576
577/**
578 * mask specific interrupts for a given group
579 * this functions modifies interrupt mask register, the callee must make sure
580 * the mask is not changed by another cpu.
581 *
582 * @param regs pointer to udma unit registers
583 * @param level the interrupt controller level (primary / secondary)
584 * @param group the interrupt group ('AL_INT_GROUP_*')
585 * @param mask bitwise of interrupts to mask, set bits will be masked.
586 */
587static INLINE void al_udma_iofic_mask(
588	struct unit_regs __iomem	*regs,
589	enum al_udma_iofic_level	level,
590	int				group,
591	uint32_t			mask)
592{
593	al_assert(al_udma_iofic_level_and_group_valid(level, group));
594	al_iofic_mask(al_udma_iofic_reg_base_get(regs, level), group, mask);
595}
596
597/**
598 * read interrupt cause register for a given group
599 * this will clear the set bits if the Clear on Read mode enabled.
600 * @param regs pointer to udma unit registers
601 * @param level the interrupt controller level (primary / secondary)
602 * @param group the interrupt group ('AL_INT_GROUP_*')
603 */
604static INLINE uint32_t al_udma_iofic_read_cause(
605	struct unit_regs __iomem	*regs,
606	enum al_udma_iofic_level	level,
607	int				group)
608{
609	al_assert(al_udma_iofic_level_and_group_valid(level, group));
610	return al_iofic_read_cause(al_udma_iofic_reg_base_get(regs, level), group);
611}
612
613#endif
614/** @} end of UDMA group */
615