]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_R5_UltraScale_MPSoC/RTOSDemo_R5_bsp/psu_cortexr5_0/libsrc/scugic_v3_5/src/xscugic.h
Update BSP source files for UltraScale Cortex-A53 and Cortex-R5 and Microblaze to...
[freertos] / FreeRTOS / Demo / CORTEX_R5_UltraScale_MPSoC / RTOSDemo_R5_bsp / psu_cortexr5_0 / libsrc / scugic_v3_5 / src / xscugic.h
1 /******************************************************************************
2 *
3 * Copyright (C) 2010 - 2015 Xilinx, Inc.  All rights reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 *
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
30 *
31 ******************************************************************************/
32 /*****************************************************************************/
33 /**
34 *
35 * @file xscugic.h
36 * @addtogroup scugic_v3_1
37 * @{
38 * @details
39 *
40 * The generic interrupt controller driver component.
41 *
42 * The interrupt controller driver uses the idea of priority for the various
43 * handlers. Priority is an integer within the range of 1 and 31 inclusive with
44 * default of 1 being the highest priority interrupt source. The priorities
45 * of the various sources can be dynamically altered as needed through
46 * hardware configuration.
47 *
48 * The generic interrupt controller supports the following
49 * features:
50 *
51 *   - specific individual interrupt enabling/disabling
52 *   - specific individual interrupt acknowledging
53 *   - attaching specific callback function to handle interrupt source
54 *   - assigning desired priority to interrupt source if default is not
55 *     acceptable.
56 *
57 * Details about connecting the interrupt handler of the driver are contained
58 * in the source file specific to interrupt processing, xscugic_intr.c.
59 *
60 * This driver is intended to be RTOS and processor independent.  It works with
61 * physical addresses only.  Any needs for dynamic memory management, threads
62 * or thread mutual exclusion, virtual memory, or cache control must be
63 * satisfied by the layer above this driver.
64 *
65 * <b>Interrupt Vector Tables</b>
66 *
67 * The device ID of the interrupt controller device is used by the driver as a
68 * direct index into the configuration data table. The user should populate the
69 * vector table with handlers and callbacks at run-time using the
70 * XScuGic_Connect() and XScuGic_Disconnect() functions.
71 *
72 * Each vector table entry corresponds to a device that can generate an
73 * interrupt. Each entry contains an interrupt handler function and an
74 * argument to be passed to the handler when an interrupt occurs.  The
75 * user must use XScuGic_Connect() when the interrupt handler takes an
76 * argument other than the base address.
77 *
78 * <b>Nested Interrupts Processing</b>
79 *
80 * Nested interrupts are not supported by this driver.
81 *
82 * NOTE:
83 * The generic interrupt controller is not a part of the snoop control unit
84 * as indicated by the prefix "scu" in the name of the driver.
85 * It is an independent module in APU.
86 *
87 * <pre>
88 * MODIFICATION HISTORY:
89 *
90 * Ver   Who  Date     Changes
91 * ----- ---- -------- ---------------------------------------------------------
92 * 1.00a drg  01/19/00 First release
93 * 1.01a sdm  11/09/11 The XScuGic and XScuGic_Config structures have changed.
94 *                     The HandlerTable (of type XScuGic_VectorTableEntry) is
95 *                     moved to XScuGic_Config structure from XScuGic structure.
96 *
97 *                     The "Config" entry in XScuGic structure is made as
98 *                     pointer for better efficiency.
99 *
100 *                     A new file named as xscugic_hw.c is now added. It is
101 *                     to implement low level driver routines without using
102 *                     any xscugic instance pointer. They are useful when the
103 *                     user wants to use xscugic through device id or
104 *                     base address. The driver routines provided are explained
105 *                     below.
106 *                     XScuGic_DeviceInitialize that takes device id as
107 *                     argument and initializes the device (without calling
108 *                     XScuGic_CfgInitialize).
109 *                     XScuGic_DeviceInterruptHandler that takes device id
110 *                     as argument and calls appropriate handlers from the
111 *                     HandlerTable.
112 *                     XScuGic_RegisterHandler that registers a new handler
113 *                     by taking xscugic hardware base address as argument.
114 *                     LookupConfigByBaseAddress is used to return the
115 *                     corresponding config structure from XScuGic_ConfigTable
116 *                     based on the scugic base address passed.
117 * 1.02a sdm  12/20/11 Removed AckBeforeService from the XScuGic_Config
118 *                     structure.
119 * 1.03a srt  02/27/13 Moved Offset calculation macros from *.c and *_hw.c to
120 *                     *_hw.h
121 *                     Added APIs
122 *                       - XScuGic_SetPriTrigTypeByDistAddr()
123 *                       - XScuGic_GetPriTrigTypeByDistAddr()
124 *                     (CR 702687)
125 *                       Added support to direct interrupts to the appropriate CPU. Earlier
126 *                         interrupts were directed to CPU1 (hard coded). Now depending
127 *                         upon the CPU selected by the user (xparameters.h), interrupts
128 *                         will be directed to the relevant CPU. This fixes CR 699688.
129 * 1.04a hk   05/04/13 Assigned EffectiveAddr to CpuBaseAddress in
130 *                         XScuGic_CfgInitialize. Fix for CR#704400 to remove warnings.
131 *                         Moved functions XScuGic_SetPriTrigTypeByDistAddr and
132 *             XScuGic_GetPriTrigTypeByDistAddr to xscugic_hw.c.
133 *                         This is fix for CR#705621.
134 * 1.05a hk   06/26/13 Modified tcl to export external interrupts correctly to
135 *                     xparameters.h. Fix for CR's 690505, 708928 & 719359.
136 * 2.0   adk  12/10/13 Updated as per the New Tcl API's
137 * 2.1   adk  25/04/14 Fixed the CR:789373 changes are made in the driver tcl file.
138 * 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
139 * 3.2   asa  02/29/16 Modified DistributorInit function for Zynq AMP case. The
140 *                         distributor is left uninitialized for Zynq AMP. It is assumed
141 *             that the distributor will be initialized by Linux master. However
142 *             for CortexR5 case, the earlier code is left unchanged where the
143 *             the interrupt processor target registers in the distributor is
144 *             initialized with the corresponding CPU ID on which the application
145 *             built over the scugic driver runs.
146 *             These changes fix CR#937243.
147 *
148 * 3.4   asa  04/07/16 Created a new static function DoDistributorInit to simplify
149 *            the flow and avoid code duplication. Changes are made for
150 *            USE_AMP use case for R5. In a scenario (in R5 split mode) when
151 *            one R5 is operating with A53 in open amp config and other
152 *            R5 running baremetal app, the existing code
153 *            had the potential to stop the whole AMP solution to work (if
154 *            for some reason the R5 running the baremetal app tasked to
155 *            initialize the Distributor hangs or crashes before initializing).
156 *            Changes are made so that the R5 under AMP first checks if
157 *            the distributor is enabled or not and if not, it does the
158 *            standard Distributor initialization.
159 *            This fixes the CR#952962.
160 *
161 * </pre>
162 *
163 ******************************************************************************/
164
165 #ifndef XSCUGIC_H /* prevent circular inclusions */
166 #define XSCUGIC_H /* by using protection macros */
167
168 #ifdef __cplusplus
169 extern "C" {
170 #endif
171
172
173 /***************************** Include Files *********************************/
174
175 #include "xstatus.h"
176 #include "xil_io.h"
177 #include "xscugic_hw.h"
178 #include "xil_exception.h"
179
180 /************************** Constant Definitions *****************************/
181
182 #define EFUSE_STATUS_OFFSET   0x10
183 #define EFUSE_STATUS_CPU_MASK 0x80
184
185 #if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32)
186 #define ARMA9
187 #endif
188 /**************************** Type Definitions *******************************/
189
190 /* The following data type defines each entry in an interrupt vector table.
191  * The callback reference is the base address of the interrupting device
192  * for the low level driver and an instance pointer for the high level driver.
193  */
194 typedef struct
195 {
196         Xil_InterruptHandler Handler;
197         void *CallBackRef;
198 } XScuGic_VectorTableEntry;
199
200 /**
201  * This typedef contains configuration information for the device.
202  */
203 typedef struct
204 {
205         u16 DeviceId;           /**< Unique ID  of device */
206         u32 CpuBaseAddress;     /**< CPU Interface Register base address */
207         u32 DistBaseAddress;    /**< Distributor Register base address */
208         XScuGic_VectorTableEntry HandlerTable[XSCUGIC_MAX_NUM_INTR_INPUTS];/**<
209                                  Vector table of interrupt handlers */
210 } XScuGic_Config;
211
212 /**
213  * The XScuGic driver instance data. The user is required to allocate a
214  * variable of this type for every intc device in the system. A pointer
215  * to a variable of this type is then passed to the driver API functions.
216  */
217 typedef struct
218 {
219         XScuGic_Config *Config;  /**< Configuration table entry */
220         u32 IsReady;             /**< Device is initialized and ready */
221         u32 UnhandledInterrupts; /**< Intc Statistics */
222 } XScuGic;
223
224 /***************** Macros (Inline Functions) Definitions *********************/
225
226 /****************************************************************************/
227 /**
228 *
229 * Write the given CPU Interface register
230 *
231 * @param    InstancePtr is a pointer to the instance to be worked on.
232 * @param    RegOffset is the register offset to be written
233 * @param    Data is the 32-bit value to write to the register
234 *
235 * @return   None.
236 *
237 * @note
238 * C-style signature:
239 *    void XScuGic_CPUWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data)
240 *
241 *****************************************************************************/
242 #define XScuGic_CPUWriteReg(InstancePtr, RegOffset, Data) \
243 (XScuGic_WriteReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset), \
244                                         ((u32)(Data))))
245
246 /****************************************************************************/
247 /**
248 *
249 * Read the given CPU Interface register
250 *
251 * @param    InstancePtr is a pointer to the instance to be worked on.
252 * @param    RegOffset is the register offset to be read
253 *
254 * @return   The 32-bit value of the register
255 *
256 * @note
257 * C-style signature:
258 *    u32 XScuGic_CPUReadReg(XScuGic *InstancePtr, u32 RegOffset)
259 *
260 *****************************************************************************/
261 #define XScuGic_CPUReadReg(InstancePtr, RegOffset) \
262         (XScuGic_ReadReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset)))
263
264 /****************************************************************************/
265 /**
266 *
267 * Write the given Distributor Interface register
268 *
269 * @param    InstancePtr is a pointer to the instance to be worked on.
270 * @param    RegOffset is the register offset to be written
271 * @param    Data is the 32-bit value to write to the register
272 *
273 * @return   None.
274 *
275 * @note
276 * C-style signature:
277 *    void XScuGic_DistWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data)
278 *
279 *****************************************************************************/
280 #define XScuGic_DistWriteReg(InstancePtr, RegOffset, Data) \
281 (XScuGic_WriteReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset), \
282                                         ((u32)(Data))))
283
284 /****************************************************************************/
285 /**
286 *
287 * Read the given Distributor Interface register
288 *
289 * @param    InstancePtr is a pointer to the instance to be worked on.
290 * @param    RegOffset is the register offset to be read
291 *
292 * @return   The 32-bit value of the register
293 *
294 * @note
295 * C-style signature:
296 *    u32 XScuGic_DistReadReg(XScuGic *InstancePtr, u32 RegOffset)
297 *
298 *****************************************************************************/
299 #define XScuGic_DistReadReg(InstancePtr, RegOffset) \
300 (XScuGic_ReadReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset)))
301
302 /************************** Function Prototypes ******************************/
303
304 /*
305  * Required functions in xscugic.c
306  */
307
308 s32  XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id,
309                         Xil_InterruptHandler Handler, void *CallBackRef);
310 void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id);
311
312 void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id);
313 void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id);
314
315 s32  XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr,
316                                                         u32 EffectiveAddr);
317
318 s32  XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id);
319
320 void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,
321                                         u8 *Priority, u8 *Trigger);
322 void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,
323                                         u8 Priority, u8 Trigger);
324 void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id);
325 /*
326  * Initialization functions in xscugic_sinit.c
327  */
328 XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId);
329
330 /*
331  * Interrupt functions in xscugic_intr.c
332  */
333 void XScuGic_InterruptHandler(XScuGic *InstancePtr);
334
335 /*
336  * Self-test functions in xscugic_selftest.c
337  */
338 s32  XScuGic_SelfTest(XScuGic *InstancePtr);
339
340 #ifdef __cplusplus
341 }
342 #endif
343
344 #endif            /* end of protection macro */
345 /** @} */