xref: /freebsd/sys/contrib/alpine-hal/al_hal_udma_iofic.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
149b49cdaSZbigniew Bodek /*-
249b49cdaSZbigniew Bodek *******************************************************************************
349b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
449b49cdaSZbigniew Bodek 
549b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
649b49cdaSZbigniew Bodek License Agreement.
749b49cdaSZbigniew Bodek 
849b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
949b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
1049b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
1149b49cdaSZbigniew Bodek 
1249b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
1349b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are
1449b49cdaSZbigniew Bodek met:
1549b49cdaSZbigniew Bodek 
1649b49cdaSZbigniew Bodek     *     Redistributions of source code must retain the above copyright notice,
1749b49cdaSZbigniew Bodek this list of conditions and the following disclaimer.
1849b49cdaSZbigniew Bodek 
1949b49cdaSZbigniew Bodek     *     Redistributions in binary form must reproduce the above copyright
2049b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in
2149b49cdaSZbigniew Bodek the documentation and/or other materials provided with the
2249b49cdaSZbigniew Bodek distribution.
2349b49cdaSZbigniew Bodek 
2449b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2549b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2649b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2749b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
2849b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2949b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3049b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
3149b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3249b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3349b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3449b49cdaSZbigniew Bodek 
3549b49cdaSZbigniew Bodek *******************************************************************************/
3649b49cdaSZbigniew Bodek 
3749b49cdaSZbigniew Bodek /**
3849b49cdaSZbigniew Bodek  * @defgroup group_udma_interrupts UDMA I/O Fabric Interrupt Controller
3949b49cdaSZbigniew Bodek  * @ingroup group_udma_api
4049b49cdaSZbigniew Bodek  *  UDMA IOFIC API
4149b49cdaSZbigniew Bodek  *  @{
4249b49cdaSZbigniew Bodek  * @file   al_hal_udma_iofic.h
4349b49cdaSZbigniew Bodek  *
4449b49cdaSZbigniew Bodek  * @brief C Header file for programming the interrupt controller that found
4549b49cdaSZbigniew Bodek  * in UDMA based units. These APIs rely and use some the Interrupt controller
4649b49cdaSZbigniew Bodek  * API under al_hal_iofic.h
4749b49cdaSZbigniew Bodek  */
4849b49cdaSZbigniew Bodek 
4949b49cdaSZbigniew Bodek #ifndef __AL_HAL_UDMA_IOFIC_H__
5049b49cdaSZbigniew Bodek #define __AL_HAL_UDMA_IOFIC_H__
5149b49cdaSZbigniew Bodek 
5249b49cdaSZbigniew Bodek #include <al_hal_common.h>
5349b49cdaSZbigniew Bodek #include <al_hal_iofic.h>
5449b49cdaSZbigniew Bodek #include <al_hal_udma_regs.h>
5549b49cdaSZbigniew Bodek 
5649b49cdaSZbigniew Bodek /* *INDENT-OFF* */
5749b49cdaSZbigniew Bodek #ifdef __cplusplus
5849b49cdaSZbigniew Bodek extern "C" {
5949b49cdaSZbigniew Bodek #endif
6049b49cdaSZbigniew Bodek /* *INDENT-ON* */
6149b49cdaSZbigniew Bodek 
6249b49cdaSZbigniew Bodek /**
6349b49cdaSZbigniew Bodek  * Interrupt Mode
6449b49cdaSZbigniew Bodek  * This is the interrupt mode for the primary interrupt level The secondary
6549b49cdaSZbigniew Bodek  * interrupt level does not have mode and it is always a level sensitive
6649b49cdaSZbigniew Bodek  * interrupt that is reflected in group D of the primary.
6749b49cdaSZbigniew Bodek  */
6849b49cdaSZbigniew Bodek enum al_iofic_mode {
6949b49cdaSZbigniew Bodek 	AL_IOFIC_MODE_LEGACY, /**< level-sensitive interrupt wire */
7049b49cdaSZbigniew Bodek 	AL_IOFIC_MODE_MSIX_PER_Q, /**< per UDMA queue MSI-X interrupt */
7149b49cdaSZbigniew Bodek 	AL_IOFIC_MODE_MSIX_PER_GROUP
7249b49cdaSZbigniew Bodek };
7349b49cdaSZbigniew Bodek 
7449b49cdaSZbigniew Bodek /** interrupt controller level (primary/secondary) */
7549b49cdaSZbigniew Bodek enum al_udma_iofic_level {
7649b49cdaSZbigniew Bodek 	AL_UDMA_IOFIC_LEVEL_PRIMARY,
7749b49cdaSZbigniew Bodek 	AL_UDMA_IOFIC_LEVEL_SECONDARY
7849b49cdaSZbigniew Bodek };
7949b49cdaSZbigniew Bodek 
8049b49cdaSZbigniew Bodek /*
8149b49cdaSZbigniew Bodek  * The next four groups represents the standard 4 groups in the primary
8249b49cdaSZbigniew Bodek  * interrupt controller of each bus-master unit in the I/O Fabric.
8349b49cdaSZbigniew Bodek  * The first two groups can be used when accessing the secondary interrupt
8449b49cdaSZbigniew Bodek  * controller as well.
8549b49cdaSZbigniew Bodek  */
8649b49cdaSZbigniew Bodek #define AL_INT_GROUP_A		0 /**< summary of the below events */
8749b49cdaSZbigniew Bodek #define AL_INT_GROUP_B		1 /**< RX completion queues */
8849b49cdaSZbigniew Bodek #define AL_INT_GROUP_C		2 /**< TX completion queues */
8949b49cdaSZbigniew Bodek #define AL_INT_GROUP_D		3 /**< Misc */
9049b49cdaSZbigniew Bodek 
9149b49cdaSZbigniew Bodek /*******************************************************************************
9249b49cdaSZbigniew Bodek  * Primary interrupt controller, group A bits
9349b49cdaSZbigniew Bodek  ******************************************************************************/
9449b49cdaSZbigniew Bodek /* Group A bits which are just summary bits of GROUP B, C and D */
9549b49cdaSZbigniew Bodek #define AL_INT_GROUP_A_GROUP_B_SUM	AL_BIT(0)
9649b49cdaSZbigniew Bodek #define AL_INT_GROUP_A_GROUP_C_SUM	AL_BIT(1)
9749b49cdaSZbigniew Bodek #define AL_INT_GROUP_A_GROUP_D_SUM	AL_BIT(2)
9849b49cdaSZbigniew Bodek 
9949b49cdaSZbigniew Bodek /*******************************************************************************
10049b49cdaSZbigniew Bodek  * MSIX entry indices
10149b49cdaSZbigniew Bodek  ******************************************************************************/
10249b49cdaSZbigniew Bodek /** MSIX entry index for summary of group D in group A */
10349b49cdaSZbigniew Bodek #define AL_INT_MSIX_GROUP_A_SUM_D_IDX 	2
10449b49cdaSZbigniew Bodek /** MSIX entry index for RX completion queue 0 */
10549b49cdaSZbigniew Bodek #define AL_INT_MSIX_RX_COMPLETION_START	3
10649b49cdaSZbigniew Bodek 
10749b49cdaSZbigniew Bodek /*******************************************************************************
10849b49cdaSZbigniew Bodek  * Primary interrupt controller, group D bits
10949b49cdaSZbigniew Bodek  ******************************************************************************/
11049b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_CROSS_MAIL_BOXES	\
11149b49cdaSZbigniew Bodek 			(AL_BIT(0) | AL_BIT(1) | AL_BIT(2) | AL_BIT(3))
11249b49cdaSZbigniew Bodek /** Summary of secondary interrupt controller, group A) */
11349b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_M2S	AL_BIT(8)
11449b49cdaSZbigniew Bodek /** Summary of secondary interrupt controller, group B) */
11549b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_S2M	AL_BIT(9)
11649b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_SW_TIMER_INT	AL_BIT(10)
11749b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_APP_EXT_INT	AL_BIT(11)
11849b49cdaSZbigniew Bodek #define AL_INT_GROUP_D_ALL			\
11949b49cdaSZbigniew Bodek 			AL_INT_GROUP_D_CROSS_MAIL_BOXES | \
12049b49cdaSZbigniew Bodek 			AL_INT_GROUP_D_M2S | \
12149b49cdaSZbigniew Bodek 			AL_INT_GROUP_D_S2M | \
12249b49cdaSZbigniew Bodek 			AL_INT_GROUP_D_SW_TIMER_INT | \
12349b49cdaSZbigniew Bodek 			AL_INT_GROUP_D_APP_EXT_INT
12449b49cdaSZbigniew Bodek 
12549b49cdaSZbigniew Bodek /*
12649b49cdaSZbigniew Bodek  * Until this point, all description above is for Groups A/B/C/D in the PRIMARY
12749b49cdaSZbigniew Bodek  * Interrupt controller.
12849b49cdaSZbigniew Bodek  * Following are definitions related to the secondary interrupt controller with
12949b49cdaSZbigniew Bodek  * two cause registers (group A and group B) that covers UDMA M2S/S2M errors.
13049b49cdaSZbigniew Bodek  * Secondary interrupt controller summary bits are not mapped to the Processor
13149b49cdaSZbigniew Bodek  * GIC directly, rather they are represented in Group D of the primary interrupt
13249b49cdaSZbigniew Bodek  * controller.
13349b49cdaSZbigniew Bodek  */
13449b49cdaSZbigniew Bodek 
13549b49cdaSZbigniew Bodek /******************************************************************************
13649b49cdaSZbigniew Bodek  * Secondary interrupt Controller, Group A, which holds the TX (M2S) error
13749b49cdaSZbigniew Bodek  * interrupt bits
13849b49cdaSZbigniew Bodek  ******************************************************************************/
13949b49cdaSZbigniew Bodek 
14049b49cdaSZbigniew Bodek /**
14149b49cdaSZbigniew Bodek  * MSIx response
14249b49cdaSZbigniew Bodek  * MSIX Bus generator response error, the Bus response received with error indication
14349b49cdaSZbigniew Bodek  */
14449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_MSIX_RESP		AL_BIT(27)
14549b49cdaSZbigniew Bodek /**
14649b49cdaSZbigniew Bodek  * MSIx timeout	MSIX Bus generator timeout error.
14749b49cdaSZbigniew Bodek  * The generator didn't receive bus response for the MSIx write transaction.
14849b49cdaSZbigniew Bodek  */
14949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_MSIX_TO			AL_BIT(26)
15049b49cdaSZbigniew Bodek /** Prefetch header buffer parity error */
15149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_HDR_PARITY	AL_BIT(25)
15249b49cdaSZbigniew Bodek /** Prefetch descriptor buffer parity error */
15349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_DESC_PARITY	AL_BIT(24)
15449b49cdaSZbigniew Bodek /** Data buffer parity error */
15549b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_DATA_PARITY		AL_BIT(23)
15649b49cdaSZbigniew Bodek /** Data header buffer parity error */
15749b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_HDR_PARITY		AL_BIT(22)
15849b49cdaSZbigniew Bodek /** Completion coalescing buffer parity error */
15949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_COMPL_COAL_PARITY	AL_BIT(21)
16049b49cdaSZbigniew Bodek /** UNACK packets buffer parity error */
16149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_UNACK_PKT_PARITY		AL_BIT(20)
16249b49cdaSZbigniew Bodek /** ACK packets buffer parity error */
16349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_ACK_PKT_PARITY		AL_BIT(19)
16449b49cdaSZbigniew Bodek /** AXI data buffer parity error */
16549b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_AX_DATA_PARITY		AL_BIT(18)
16649b49cdaSZbigniew Bodek /**
16749b49cdaSZbigniew Bodek  * Prefetch Ring ID error
16849b49cdaSZbigniew Bodek  * A wrong RingId was received while prefetching submission descriptor. This
16949b49cdaSZbigniew Bodek  * could indicate a software bug or hardware failure, unless the UDMA is
17049b49cdaSZbigniew Bodek  * working in a mode to ignore RingId (the al_udma_iofic_config() API can be
17149b49cdaSZbigniew Bodek  * used to configure the UDMA to ignore the Ring ID check)
17249b49cdaSZbigniew Bodek  */
17349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_RING_ID		AL_BIT(17)
17449b49cdaSZbigniew Bodek /**
17549b49cdaSZbigniew Bodek  * Prefetch last
17649b49cdaSZbigniew Bodek  * Error in last bit indication of the descriptor
17749b49cdaSZbigniew Bodek  * Descriptor with Last bit asserted is read from the queue to the prefetch
17849b49cdaSZbigniew Bodek  * FIFO when the prefetch engine is not in a middle of packet processing (a
17949b49cdaSZbigniew Bodek  * descriptor with First bit asserted should be read first to indicate start of
18049b49cdaSZbigniew Bodek  * packet)
18149b49cdaSZbigniew Bodek  */
18249b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_LAST		AL_BIT(16)
18349b49cdaSZbigniew Bodek /**
18449b49cdaSZbigniew Bodek  * Prefetch first
18549b49cdaSZbigniew Bodek  * Error in first bit indication of the descriptor
18649b49cdaSZbigniew Bodek  * Descriptor with First bit asserted is read from the queue to the prefetch
18749b49cdaSZbigniew Bodek  * FIFO while the prefetch engine is in a middle of packet processing ( a
18849b49cdaSZbigniew Bodek  * descriptor with Last bit asserted should be read to indicate end of packet
18949b49cdaSZbigniew Bodek  * before starting a new one)
19049b49cdaSZbigniew Bodek  */
19149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_FIRST		AL_BIT(15)
19249b49cdaSZbigniew Bodek /**
19349b49cdaSZbigniew Bodek  * Prefetch max descriptors
19449b49cdaSZbigniew Bodek  * Number of descriptors per packet exceeds the configurable maximum
19549b49cdaSZbigniew Bodek  * descriptors per packet. This could indicate a software bug or a hardware
19649b49cdaSZbigniew Bodek  * failure.  (The al_udma_m2s_max_descs_set() API is used to configure the
19749b49cdaSZbigniew Bodek  * maximum descriptors per packet)
19849b49cdaSZbigniew Bodek  */
19949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_MAX_DESC	AL_BIT(14)
20049b49cdaSZbigniew Bodek /**
20149b49cdaSZbigniew Bodek  * Packet length
20249b49cdaSZbigniew Bodek  * Packet length exceeds the configurable maximum packet size.  The
20349b49cdaSZbigniew Bodek  * al_udma_m2s_packet_size_cfg_set() API is used to configure the maximum
20449b49cdaSZbigniew Bodek  * packet size)
20549b49cdaSZbigniew Bodek  */
20649b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PKT_LEN			AL_BIT(13)
20749b49cdaSZbigniew Bodek /**
20849b49cdaSZbigniew Bodek  * Prefetch AXI timeout
20949b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
21049b49cdaSZbigniew Bodek  */
21149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_TO		AL_BIT(12)
21249b49cdaSZbigniew Bodek /**
21349b49cdaSZbigniew Bodek  * Prefetch AXI response
21449b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
21549b49cdaSZbigniew Bodek  */
21649b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_RESP	AL_BIT(11)
21749b49cdaSZbigniew Bodek /**
21849b49cdaSZbigniew Bodek  * Prefetch AXI parity
21949b49cdaSZbigniew Bodek  * Bus parity error on descriptor being prefetched
22049b49cdaSZbigniew Bodek  */
22149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_PREFETCH_AXI_PARITY	AL_BIT(10)
22249b49cdaSZbigniew Bodek /**
22349b49cdaSZbigniew Bodek  * Data AXI timeout
22449b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
22549b49cdaSZbigniew Bodek  */
22649b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_TO		AL_BIT(9)
22749b49cdaSZbigniew Bodek /**
22849b49cdaSZbigniew Bodek  * Data AXI response
22949b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
23049b49cdaSZbigniew Bodek  */
23149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_RESP		AL_BIT(8)
23249b49cdaSZbigniew Bodek /**
23349b49cdaSZbigniew Bodek  * Data AXI parity
23449b49cdaSZbigniew Bodek  * Bus parity error on data being read
23549b49cdaSZbigniew Bodek  */
23649b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_DATA_AXI_PARITY		AL_BIT(7)
23749b49cdaSZbigniew Bodek /**
23849b49cdaSZbigniew Bodek  * Completion AXI timeout
23949b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
24049b49cdaSZbigniew Bodek  */
24149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_CONPL_AXI_TO		AL_BIT(6)
24249b49cdaSZbigniew Bodek /**
24349b49cdaSZbigniew Bodek  * Completion AXI response
24449b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
24549b49cdaSZbigniew Bodek  */
24649b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_COMPL_AXI_RESP		AL_BIT(5)
24749b49cdaSZbigniew Bodek /**
24849b49cdaSZbigniew Bodek  * Completion AXI parity
24949b49cdaSZbigniew Bodek  * Bus generator internal SRAM parity error
25049b49cdaSZbigniew Bodek  */
25149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_COMP_AXI_PARITY		AL_BIT(4)
25249b49cdaSZbigniew Bodek /**
25349b49cdaSZbigniew Bodek  * Stream timeout
25449b49cdaSZbigniew Bodek  * Application stream interface timeout indicating a failure at the Application
25549b49cdaSZbigniew Bodek  * layer (RAID, Ethernet etc)
25649b49cdaSZbigniew Bodek  */
25749b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_STRM_TO			AL_BIT(3)
25849b49cdaSZbigniew Bodek /**
25949b49cdaSZbigniew Bodek  * Stream response
26049b49cdaSZbigniew Bodek  * Application stream interface response error indicating a failure at the
26149b49cdaSZbigniew Bodek  * Application layer (RAID, Ethernet etc)
26249b49cdaSZbigniew Bodek  */
26349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_STRM_RESP		AL_BIT(2)
26449b49cdaSZbigniew Bodek /**
26549b49cdaSZbigniew Bodek  * Stream parity
26649b49cdaSZbigniew Bodek  * Application stream interface parity error indicating a failure at the
26749b49cdaSZbigniew Bodek  * Application layer (RAID, Ethernet etc)
26849b49cdaSZbigniew Bodek  */
26949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_STRM_PARITY		 AL_BIT(1)
27049b49cdaSZbigniew Bodek /**
27149b49cdaSZbigniew Bodek  * Stream completion mismatch
27249b49cdaSZbigniew Bodek  * Application stream interface, packet serial mismatch error indicating a
27349b49cdaSZbigniew Bodek  * failure at the Application layer (RAID, Ethernet etc)
27449b49cdaSZbigniew Bodek  */
27549b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_A_M2S_STRM_COMPL_MISMATCH	AL_BIT(0)
27649b49cdaSZbigniew Bodek 
27749b49cdaSZbigniew Bodek /*******************************************************************************
27849b49cdaSZbigniew Bodek  * Secondary interrupt Controller, Group B, which holds the RX (S2M) error
27949b49cdaSZbigniew Bodek  * interrupt bits
28049b49cdaSZbigniew Bodek  ******************************************************************************/
28149b49cdaSZbigniew Bodek 
28249b49cdaSZbigniew Bodek /** Prefetch descriptor buffer parity error */
28349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_DESC_PARITY	AL_BIT(30)
28449b49cdaSZbigniew Bodek /** Completion coalescing buffer parity error */
28549b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_COAL_PARITY	AL_BIT(29)
28649b49cdaSZbigniew Bodek /** PRE-UNACK packets buffer parity error */
28749b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PRE_UNACK_PKT_PARITY	AL_BIT(28)
28849b49cdaSZbigniew Bodek /** UNACK packets buffer parity error */
28949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_UNACK_PKT_PARITY		AL_BIT(27)
29049b49cdaSZbigniew Bodek /** Data buffer parity error */
29149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_DATA_PARITY		AL_BIT(26)
29249b49cdaSZbigniew Bodek /** Data header buffer parity error */
29349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_DATA_HDR_PARITY		AL_BIT(25)
29449b49cdaSZbigniew Bodek /**
29549b49cdaSZbigniew Bodek  * Packet length
29649b49cdaSZbigniew Bodek  * Application stream interface, Data counter length mismatch with metadata
29749b49cdaSZbigniew Bodek  * packet length indicating a failure at the Application layer (RAID, Ethernet
29849b49cdaSZbigniew Bodek  * etc)
29949b49cdaSZbigniew Bodek  */
30049b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PKT_LEN			AL_BIT(24)
30149b49cdaSZbigniew Bodek /**
30249b49cdaSZbigniew Bodek  * Stream last
30349b49cdaSZbigniew Bodek  * Application stream interface, error in Last bit indication, this error is
30449b49cdaSZbigniew Bodek  * asserted when a 'last' indication is asserted on the stream interface
30549b49cdaSZbigniew Bodek  * (between the application and the UDMA) when the interface is not in the
30649b49cdaSZbigniew Bodek  * middle of packet, meaning that there was no 'first' indication before. This
30749b49cdaSZbigniew Bodek  * indicates a failure at the application layer.
30849b49cdaSZbigniew Bodek  */
30949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_LAST		AL_BIT(23)
31049b49cdaSZbigniew Bodek /**
31149b49cdaSZbigniew Bodek  * Stream first
31249b49cdaSZbigniew Bodek  * Application stream interface error in first bit indication, this error is
31349b49cdaSZbigniew Bodek  * asserted when a 'first' indication is asserted on the stream interface
31449b49cdaSZbigniew Bodek  * (between the application and the UDMA) when the interface is in the middle
31549b49cdaSZbigniew Bodek  * of packet, meaning that there was a 'first' indication before and the UDMA
31649b49cdaSZbigniew Bodek  * is waiting for a 'last' indication to end the packet. This indicates a
31749b49cdaSZbigniew Bodek  * failure at the application layer.
31849b49cdaSZbigniew Bodek  */
31949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_FIRST		AL_BIT(22)
32049b49cdaSZbigniew Bodek /**
32149b49cdaSZbigniew Bodek  * Stream data
32249b49cdaSZbigniew Bodek  * Application stream interface, error indication during data transaction
32349b49cdaSZbigniew Bodek  */
32449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_DATA		AL_BIT(21)
32549b49cdaSZbigniew Bodek /**
32649b49cdaSZbigniew Bodek  * Stream Data parity
32749b49cdaSZbigniew Bodek  * Application stream interface, parity error during data transaction
32849b49cdaSZbigniew Bodek  */
32949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_DATA_PARITY		AL_BIT(20)
33049b49cdaSZbigniew Bodek /**
33149b49cdaSZbigniew Bodek  * Stream Header error
33249b49cdaSZbigniew Bodek  * Application stream interface, error indication during header transaction
33349b49cdaSZbigniew Bodek  */
33449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_HDR			AL_BIT(19)
33549b49cdaSZbigniew Bodek /**
33649b49cdaSZbigniew Bodek  * Stream Header parity
33749b49cdaSZbigniew Bodek  * Application stream interface, parity error during header transaction
33849b49cdaSZbigniew Bodek  */
33949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_STRM_HDR_PARITY		AL_BIT(18)
34049b49cdaSZbigniew Bodek /**
34149b49cdaSZbigniew Bodek  * Completion UNACK
34249b49cdaSZbigniew Bodek  * Completion write, UNACK timeout due to completion FIFO back pressure
34349b49cdaSZbigniew Bodek  */
34449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_UNACK		AL_BIT(17)
34549b49cdaSZbigniew Bodek /**
34649b49cdaSZbigniew Bodek  * Completion stream
34749b49cdaSZbigniew Bodek  * Completion write, UNACK timeout due to stream ACK FIFO back pressure
34849b49cdaSZbigniew Bodek  */
34949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_STRM		AL_BIT(16)
35049b49cdaSZbigniew Bodek /**
35149b49cdaSZbigniew Bodek  * Completion AXI timeout
35249b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
35349b49cdaSZbigniew Bodek  */
35449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_TO		AL_BIT(15)
35549b49cdaSZbigniew Bodek /**
35649b49cdaSZbigniew Bodek  * Completion AXI response
35749b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
35849b49cdaSZbigniew Bodek  */
35949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_RESP		AL_BIT(14)
36049b49cdaSZbigniew Bodek /**
36149b49cdaSZbigniew Bodek  * Completion AXI parity
36249b49cdaSZbigniew Bodek  * Completion Bus generator internal SRAM parity error
36349b49cdaSZbigniew Bodek  */
36449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_COMPL_AXI_PARITY		AL_BIT(13)
36549b49cdaSZbigniew Bodek /**
36649b49cdaSZbigniew Bodek  * Prefetch saturate
36749b49cdaSZbigniew Bodek  * Prefetch engine, packet length counter saturated (32 bit) , this is caused
36849b49cdaSZbigniew Bodek  * by an error at the application layer which sends packet data without
36949b49cdaSZbigniew Bodek  * 'last'/'first' indication.
37049b49cdaSZbigniew Bodek  */
37149b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_SAT		AL_BIT(12)
37249b49cdaSZbigniew Bodek /**
37349b49cdaSZbigniew Bodek  * Prefetch ring ID
37449b49cdaSZbigniew Bodek  * Prefetch engine, Ring ID is not matching the expected RingID. This could
37549b49cdaSZbigniew Bodek  * indicate a software bug or hardware failure, unless the UDMA is working in a
37649b49cdaSZbigniew Bodek  * mode to ignore RingId  (the al_udma_iofic_config() API can be used to
37749b49cdaSZbigniew Bodek  * configure the UDMA to ignore the Ring ID check)
37849b49cdaSZbigniew Bodek  */
37949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_RING_ID		AL_BIT(11)
38049b49cdaSZbigniew Bodek /**
38149b49cdaSZbigniew Bodek  * Prefetch AXI timeout
38249b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
38349b49cdaSZbigniew Bodek  */
38449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_TO		AL_BIT(10)
38549b49cdaSZbigniew Bodek /**
38649b49cdaSZbigniew Bodek  * Prefetch AXI response
38749b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
38849b49cdaSZbigniew Bodek  */
38949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_RESP	AL_BIT(9)
39049b49cdaSZbigniew Bodek /**
39149b49cdaSZbigniew Bodek  * Prefetch AXI parity
39249b49cdaSZbigniew Bodek  * Bus parity error on descriptor being prefetched
39349b49cdaSZbigniew Bodek  */
39449b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PREFETCH_AXI_PARITY	AL_BIT(8)
39549b49cdaSZbigniew Bodek /**
39649b49cdaSZbigniew Bodek  * No descriptors hint
39749b49cdaSZbigniew Bodek  * Data write, Hint to the SW that there are not enough descriptors in the
39849b49cdaSZbigniew Bodek  * queue for the current received packet. This is considered a hint and not an
39949b49cdaSZbigniew Bodek  * error, as it could be a normal situation in certain application. The S2M
40049b49cdaSZbigniew Bodek  * UDMA behavior when it runs out of Rx Descriptor is controlled by driver
40149b49cdaSZbigniew Bodek  * which can use this hint to add more descriptors to the Rx queue.
40249b49cdaSZbigniew Bodek  */
40349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_NO_DESC_HINT		AL_BIT(7)
40449b49cdaSZbigniew Bodek /**
40549b49cdaSZbigniew Bodek  * No descriptors timeout
40649b49cdaSZbigniew Bodek  * Data write, Timeout indication when there are not enough descriptors for the
40749b49cdaSZbigniew Bodek  * current packet and the timeout expires. The S2M UDMA behavior when it runs
40849b49cdaSZbigniew Bodek  * out of Rx Descriptor is controlled by driver which can use this hint to add
40949b49cdaSZbigniew Bodek  * more descriptors to the Rx queue. The al_udma_s2m_no_desc_cfg_set() is used
41049b49cdaSZbigniew Bodek  * to configure theUDMA S2M timeout and behavior when there are no Rx
41149b49cdaSZbigniew Bodek  * descriptors for the received packet.
41249b49cdaSZbigniew Bodek  */
41349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_NO_DESC_TO		AL_BIT(6)
41449b49cdaSZbigniew Bodek /**
41549b49cdaSZbigniew Bodek  * Promotion indication
41649b49cdaSZbigniew Bodek  * Data write, the data write engine checks the queue number of the two packets
41749b49cdaSZbigniew Bodek  * at the head of the data FIFO, the data write engine notify the prefetch
41849b49cdaSZbigniew Bodek  * engine to promote these queue numbers in the prefetch scheduler to make sure
41949b49cdaSZbigniew Bodek  * that these queue will have RX descriptors for these packets. This error
42049b49cdaSZbigniew Bodek  * indicates that the prefetch promotion didn't work for the second packet in
42149b49cdaSZbigniew Bodek  * the FIFO. This is an indication used for system debug and not an error.
42249b49cdaSZbigniew Bodek  */
42349b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_PROM_IND			AL_BIT(5)
42449b49cdaSZbigniew Bodek /**
42549b49cdaSZbigniew Bodek  * Header split ignored
42649b49cdaSZbigniew Bodek  * Data write, The application requested header split but the buffer descriptor
42749b49cdaSZbigniew Bodek  * doesn't include a second buffer for the header
42849b49cdaSZbigniew Bodek  */
42949b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_HDR_SPLT_IGNORED		AL_BIT(4)
43049b49cdaSZbigniew Bodek /**
43149b49cdaSZbigniew Bodek  * Header split length
43249b49cdaSZbigniew Bodek  * Data write, The application requested header split and the length of the
43349b49cdaSZbigniew Bodek  * second buffer allocated for the header is not enough for the requested
43449b49cdaSZbigniew Bodek  * header length. The remaining of the header is written to buffer 1 (data
43549b49cdaSZbigniew Bodek  * buffer).
43649b49cdaSZbigniew Bodek  */
43749b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_HDR_SPLT_LEN		AL_BIT(3)
43849b49cdaSZbigniew Bodek /**
43949b49cdaSZbigniew Bodek  * Data AXI timeout
44049b49cdaSZbigniew Bodek  * Bus request to I/O Fabric timeout error
44149b49cdaSZbigniew Bodek  */
44249b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_TO		AL_BIT(2)
44349b49cdaSZbigniew Bodek /**
44449b49cdaSZbigniew Bodek  * Data AXI response
44549b49cdaSZbigniew Bodek  * Bus response from I/O Fabric error
44649b49cdaSZbigniew Bodek  */
44749b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_RESP		AL_BIT(1)
44849b49cdaSZbigniew Bodek /**
44949b49cdaSZbigniew Bodek  * Data AXI parity
45049b49cdaSZbigniew Bodek  * Bus parity error on data being read
45149b49cdaSZbigniew Bodek  */
45249b49cdaSZbigniew Bodek #define AL_INT_2ND_GROUP_B_S2M_DATA_AXI_PARITY		AL_BIT(0)
45349b49cdaSZbigniew Bodek 
45449b49cdaSZbigniew Bodek /*******************************************************************************
45549b49cdaSZbigniew Bodek  * Configurations
45649b49cdaSZbigniew Bodek  ******************************************************************************/
45749b49cdaSZbigniew Bodek 
45849b49cdaSZbigniew Bodek /**
45949b49cdaSZbigniew Bodek  * Configure the UDMA interrupt controller registers, interrupts will are kept
46049b49cdaSZbigniew Bodek  * masked.
46149b49cdaSZbigniew Bodek  * This is a static setting that should be called while initialized the
46249b49cdaSZbigniew Bodek  * interrupt controller within a given UDMA, and should not be modified during
46349b49cdaSZbigniew Bodek  * runtime unless the UDMA is completely disabled. The first argument sets the
46449b49cdaSZbigniew Bodek  * interrupt and MSIX modes. The m2s/s2m errors/abort are a set of bit-wise
46549b49cdaSZbigniew Bodek  * masks to define the behaviour of the UDMA once an error happens: The _abort
46649b49cdaSZbigniew Bodek  * will put the UDMA in abort state once an error happens The _error bitmask
46749b49cdaSZbigniew Bodek  * will indicate and error in the secondary cause register but will not abort.
46849b49cdaSZbigniew Bodek  * The bit-mask that the _errors_disable and _aborts_disable are described in
46949b49cdaSZbigniew Bodek  * 'AL_INT_2ND_GROUP_A_*' and 'AL_INT_2ND_GROUP_B_*'
47049b49cdaSZbigniew Bodek  *
47149b49cdaSZbigniew Bodek  * @param regs pointer to unit registers
47249b49cdaSZbigniew Bodek  * @param mode interrupt scheme mode (legacy, MSI-X..)
47349b49cdaSZbigniew Bodek  * @param m2s_errors_disable
47449b49cdaSZbigniew Bodek  * 	  This is a bit-wise mask, to indicate which one of the error causes in
47549b49cdaSZbigniew Bodek  * 	  secondary interrupt group_A should generate an interrupt. When a bit is
47649b49cdaSZbigniew Bodek  * 	  set, the error cause is ignored.
47749b49cdaSZbigniew Bodek  * 	  Recommended value: 0 (enable all errors).
47849b49cdaSZbigniew Bodek  * @param m2s_aborts_disable
47949b49cdaSZbigniew Bodek  * 	  This is a bit-wise mask, to indicate which one of the error causes in
48049b49cdaSZbigniew Bodek  * 	  secondary interrupt group_A should automatically put the UDMA in
48149b49cdaSZbigniew Bodek  * 	  abort state. When a bit is set, the error cause does cause an abort.
48249b49cdaSZbigniew Bodek  * 	  Recommended value: 0 (enable all aborts).
48349b49cdaSZbigniew Bodek  * @param s2m_errors_disable
48449b49cdaSZbigniew Bodek  * 	  This is a bit-wise mask, to indicate which one of the error causes in
48549b49cdaSZbigniew Bodek  * 	  secondary interrupt group_A should generate an interrupt. When a bit is
48649b49cdaSZbigniew Bodek  * 	  set, the error cause is ignored.
48749b49cdaSZbigniew Bodek  * 	  Recommended value: 0xE0 (disable hint errors).
48849b49cdaSZbigniew Bodek  * @param s2m_aborts_disable
48949b49cdaSZbigniew Bodek  * 	  This is a bit-wise mask, to indicate which one of the error causes in
49049b49cdaSZbigniew Bodek  * 	  secondary interrupt group_A should automatically put the UDMA in
49149b49cdaSZbigniew Bodek  * 	  abort state. When a bit is set, the error cause does cause an abort.
49249b49cdaSZbigniew Bodek  * 	  Recommended value: 0xE0 (disable hint aborts).
49349b49cdaSZbigniew Bodek  *
49449b49cdaSZbigniew Bodek  * @return 0 on success. -EINVAL otherwise.
49549b49cdaSZbigniew Bodek  */
49649b49cdaSZbigniew Bodek int al_udma_iofic_config(struct unit_regs __iomem *regs,
49749b49cdaSZbigniew Bodek 			enum al_iofic_mode mode,
49849b49cdaSZbigniew Bodek 			uint32_t	m2s_errors_disable,
49949b49cdaSZbigniew Bodek 			uint32_t	m2s_aborts_disable,
50049b49cdaSZbigniew Bodek 			uint32_t	s2m_errors_disable,
50149b49cdaSZbigniew Bodek 			uint32_t	s2m_aborts_disable);
50249b49cdaSZbigniew Bodek /**
50349b49cdaSZbigniew Bodek  * return the offset of the unmask register for a given group.
50449b49cdaSZbigniew Bodek  * this function can be used when the upper layer wants to directly
50549b49cdaSZbigniew Bodek  * access the unmask regiter and bypass the al_udma_iofic_unmask() API.
50649b49cdaSZbigniew Bodek  *
50749b49cdaSZbigniew Bodek  * @param regs pointer to udma registers
50849b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
50949b49cdaSZbigniew Bodek  * @param group the interrupt group ('AL_INT_GROUP_*')
51049b49cdaSZbigniew Bodek  * @return the offset of the unmask register.
51149b49cdaSZbigniew Bodek  */
51249b49cdaSZbigniew Bodek uint32_t __iomem * al_udma_iofic_unmask_offset_get(
51349b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*regs,
51449b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level,
51549b49cdaSZbigniew Bodek 	int				group);
51649b49cdaSZbigniew Bodek 
51749b49cdaSZbigniew Bodek /**
51849b49cdaSZbigniew Bodek  * Get the interrupt controller base address for either the primary or secondary
51949b49cdaSZbigniew Bodek  * interrupt controller
52049b49cdaSZbigniew Bodek  *
52149b49cdaSZbigniew Bodek  * @param regs pointer to udma unit registers
52249b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
52349b49cdaSZbigniew Bodek  *
52449b49cdaSZbigniew Bodek  * @returns	The interrupt controller base address
52549b49cdaSZbigniew Bodek  *
52649b49cdaSZbigniew Bodek  */
al_udma_iofic_reg_base_get(struct unit_regs __iomem * regs,enum al_udma_iofic_level level)52749b49cdaSZbigniew Bodek static INLINE void __iomem *al_udma_iofic_reg_base_get(
52849b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*regs,
52949b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level)
53049b49cdaSZbigniew Bodek {
53149b49cdaSZbigniew Bodek 	void __iomem *iofic_regs = (level == AL_UDMA_IOFIC_LEVEL_PRIMARY) ?
53249b49cdaSZbigniew Bodek 		(void __iomem *)&regs->gen.interrupt_regs.main_iofic :
53349b49cdaSZbigniew Bodek 		(void __iomem *)&regs->gen.interrupt_regs.secondary_iofic_ctrl;
53449b49cdaSZbigniew Bodek 
53549b49cdaSZbigniew Bodek 	return iofic_regs;
53649b49cdaSZbigniew Bodek }
53749b49cdaSZbigniew Bodek 
53849b49cdaSZbigniew Bodek /**
53949b49cdaSZbigniew Bodek  * Check the interrupt controller level/group validity
54049b49cdaSZbigniew Bodek  *
54149b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
54249b49cdaSZbigniew Bodek  * @param group the interrupt group ('AL_INT_GROUP_*')
54349b49cdaSZbigniew Bodek  *
54449b49cdaSZbigniew Bodek  * @returns	0 - invalid, 1 - valid
54549b49cdaSZbigniew Bodek  *
54649b49cdaSZbigniew Bodek  */
al_udma_iofic_level_and_group_valid(enum al_udma_iofic_level level,int group)54749b49cdaSZbigniew Bodek static INLINE int al_udma_iofic_level_and_group_valid(
54849b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level,
54949b49cdaSZbigniew Bodek 	int				group)
55049b49cdaSZbigniew Bodek {
55149b49cdaSZbigniew Bodek 	if (((level == AL_UDMA_IOFIC_LEVEL_PRIMARY) && (group >= 0) && (group < 4)) ||
55249b49cdaSZbigniew Bodek 		((level == AL_UDMA_IOFIC_LEVEL_SECONDARY) && (group >= 0) && (group < 2)))
55349b49cdaSZbigniew Bodek 		return 1;
55449b49cdaSZbigniew Bodek 
55549b49cdaSZbigniew Bodek 	return 0;
55649b49cdaSZbigniew Bodek }
55749b49cdaSZbigniew Bodek /**
55849b49cdaSZbigniew Bodek  * unmask specific interrupts for a given group
55949b49cdaSZbigniew Bodek  * this functions uses the interrupt mask clear register to guarantee atomicity
56049b49cdaSZbigniew Bodek  * it's safe to call it while the mask is changed by the HW (auto mask) or another cpu.
56149b49cdaSZbigniew Bodek  *
56249b49cdaSZbigniew Bodek  * @param regs pointer to udma unit registers
56349b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
56449b49cdaSZbigniew Bodek  * @param group the interrupt group ('AL_INT_GROUP_*')
56549b49cdaSZbigniew Bodek  * @param mask bitwise of interrupts to unmask, set bits will be unmasked.
56649b49cdaSZbigniew Bodek  */
al_udma_iofic_unmask(struct unit_regs __iomem * regs,enum al_udma_iofic_level level,int group,uint32_t mask)56749b49cdaSZbigniew Bodek static INLINE void al_udma_iofic_unmask(
56849b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*regs,
56949b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level,
57049b49cdaSZbigniew Bodek 	int				group,
57149b49cdaSZbigniew Bodek 	uint32_t			mask)
57249b49cdaSZbigniew Bodek {
57349b49cdaSZbigniew Bodek 	al_assert(al_udma_iofic_level_and_group_valid(level, group));
57449b49cdaSZbigniew Bodek 	al_iofic_unmask(al_udma_iofic_reg_base_get(regs, level), group, mask);
57549b49cdaSZbigniew Bodek }
57649b49cdaSZbigniew Bodek 
57749b49cdaSZbigniew Bodek /**
57849b49cdaSZbigniew Bodek  * mask specific interrupts for a given group
57949b49cdaSZbigniew Bodek  * this functions modifies interrupt mask register, the callee must make sure
58049b49cdaSZbigniew Bodek  * the mask is not changed by another cpu.
58149b49cdaSZbigniew Bodek  *
58249b49cdaSZbigniew Bodek  * @param regs pointer to udma unit registers
58349b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
58449b49cdaSZbigniew Bodek  * @param group the interrupt group ('AL_INT_GROUP_*')
58549b49cdaSZbigniew Bodek  * @param mask bitwise of interrupts to mask, set bits will be masked.
58649b49cdaSZbigniew Bodek  */
al_udma_iofic_mask(struct unit_regs __iomem * regs,enum al_udma_iofic_level level,int group,uint32_t mask)58749b49cdaSZbigniew Bodek static INLINE void al_udma_iofic_mask(
58849b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*regs,
58949b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level,
59049b49cdaSZbigniew Bodek 	int				group,
59149b49cdaSZbigniew Bodek 	uint32_t			mask)
59249b49cdaSZbigniew Bodek {
59349b49cdaSZbigniew Bodek 	al_assert(al_udma_iofic_level_and_group_valid(level, group));
59449b49cdaSZbigniew Bodek 	al_iofic_mask(al_udma_iofic_reg_base_get(regs, level), group, mask);
59549b49cdaSZbigniew Bodek }
59649b49cdaSZbigniew Bodek 
59749b49cdaSZbigniew Bodek /**
59849b49cdaSZbigniew Bodek  * read interrupt cause register for a given group
59949b49cdaSZbigniew Bodek  * this will clear the set bits if the Clear on Read mode enabled.
60049b49cdaSZbigniew Bodek  * @param regs pointer to udma unit registers
60149b49cdaSZbigniew Bodek  * @param level the interrupt controller level (primary / secondary)
60249b49cdaSZbigniew Bodek  * @param group the interrupt group ('AL_INT_GROUP_*')
60349b49cdaSZbigniew Bodek  */
al_udma_iofic_read_cause(struct unit_regs __iomem * regs,enum al_udma_iofic_level level,int group)60449b49cdaSZbigniew Bodek static INLINE uint32_t al_udma_iofic_read_cause(
60549b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*regs,
60649b49cdaSZbigniew Bodek 	enum al_udma_iofic_level	level,
60749b49cdaSZbigniew Bodek 	int				group)
60849b49cdaSZbigniew Bodek {
60949b49cdaSZbigniew Bodek 	al_assert(al_udma_iofic_level_and_group_valid(level, group));
61049b49cdaSZbigniew Bodek 	return al_iofic_read_cause(al_udma_iofic_reg_base_get(regs, level), group);
61149b49cdaSZbigniew Bodek }
61249b49cdaSZbigniew Bodek 
613*3fc36ee0SWojciech Macek /**
614*3fc36ee0SWojciech Macek  * clear bits in the interrupt cause register for a given group
615*3fc36ee0SWojciech Macek  *
616*3fc36ee0SWojciech Macek  * @param regs pointer to udma unit registers
617*3fc36ee0SWojciech Macek  * @param level the interrupt controller level (primary / secondary)
618*3fc36ee0SWojciech Macek  * @param group the interrupt group ('AL_INT_GROUP_*')
619*3fc36ee0SWojciech Macek  * @param mask bitwise of bits to be cleared, set bits will be cleared.
620*3fc36ee0SWojciech Macek  */
al_udma_iofic_clear_cause(struct unit_regs __iomem * regs,enum al_udma_iofic_level level,int group,uint32_t mask)621*3fc36ee0SWojciech Macek static INLINE void al_udma_iofic_clear_cause(
622*3fc36ee0SWojciech Macek 	struct unit_regs __iomem	*regs,
623*3fc36ee0SWojciech Macek 	enum al_udma_iofic_level	level,
624*3fc36ee0SWojciech Macek 	int				group,
625*3fc36ee0SWojciech Macek 	uint32_t		mask)
626*3fc36ee0SWojciech Macek {
627*3fc36ee0SWojciech Macek 	al_assert(al_udma_iofic_level_and_group_valid(level, group));
628*3fc36ee0SWojciech Macek 	al_iofic_clear_cause(al_udma_iofic_reg_base_get(regs, level), group, mask);
629*3fc36ee0SWojciech Macek }
630*3fc36ee0SWojciech Macek 
63149b49cdaSZbigniew Bodek #endif
63249b49cdaSZbigniew Bodek /** @} end of UDMA group */
633