zynqmp: drivers use platform_isr instead of hil_isr
[processor-sdk/open-amp.git] / lib / system / generic / machine / zynqmp_r5 / machine_system.c
1 /*
2  * Copyright (c) 2015 Xilinx, Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  *    this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright notice,
10  *    this list of conditions and the following disclaimer in the documentation
11  *    and/or other materials provided with the distribution.
12  * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
13  *    may be used to endorse or promote products derived from this software
14  *    without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 #include <stdio.h>
29 #include <string.h>
30 #include "xparameters.h"
31 #include "xil_exception.h"
32 #include "xscugic.h"
33 #include "xil_cache.h"
34 #include "xil_mmu.h"
35 #include "xil_mpu.h"
36 #include "machine.h"
37 #include "machine_system.h"
38 #include "openamp/env.h"
39 #include "openamp/hil.h"
41 #define CORTEXR5_CPSR_INTERRUPTS_BITS (XREG_CPSR_IRQ_ENABLE | XREG_CPSR_FIQ_ENABLE)
43 /* This macro writes the current program status register (CPSR - all fields) */
44 #define ARM_AR_CPSR_CXSF_WRITE(cpsr_cxsf_value) \
45         { \
46                 asm volatile("    MSR     CPSR_cxsf, %0" \
47                         : /* No outputs */ \
48                         : "r" (cpsr_cxsf_value) ); \
49         }
51 /* This macro sets the interrupt related bits in the status register / control
52  register to the specified value. */
53 #define ARM_AR_INT_BITS_SET(set_bits) \
54         { \
55                 int     tmp_val; \
56                 tmp_val = mfcpsr(); \
57                 tmp_val &= ~((unsigned int)CORTEXR5_CPSR_INTERRUPTS_BITS); \
58                 tmp_val |= set_bits; \
59                 ARM_AR_CPSR_CXSF_WRITE(tmp_val); \
60         }
62 /* This macro gets the interrupt related bits from the status register / control
63  register. */
64 #define ARM_AR_INT_BITS_GET(get_bits_ptr) \
65         { \
66                 int     tmp_val; \
67                 tmp_val = mfcpsr(); \
68                 tmp_val &= CORTEXR5_CPSR_INTERRUPTS_BITS; \
69                 *get_bits_ptr = tmp_val; \
70         }
72 int platform_interrupt_enable(unsigned int vector, unsigned int polarity,
73                               unsigned int priority)
74 {
75         XScuGic_EnableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
76         return (vector);
77 }
79 int platform_interrupt_disable(unsigned int vector)
80 {
81         XScuGic_DisableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
82         return (vector);
83 }
85 void platform_dcache_all_flush()
86 {
87         Xil_DCacheFlush();
88 }
90 void platform_cache_all_flush_invalidate()
91 {
92         Xil_DCacheFlush();
93         Xil_DCacheInvalidate();
94         Xil_ICacheInvalidate();
95 }
97 void platform_cache_disable()
98 {
99         Xil_DCacheDisable();
100         Xil_ICacheDisable();
103 void platform_map_mem_region(unsigned int va, unsigned int pa,
104                              unsigned int size, unsigned int flags)
106         unsigned int r5_flags;
108         /* Assume DEVICE_SHARED if nothing indicates this is memory.  */
109         r5_flags = DEVICE_SHARED;
110         if (flags & SHARED_MEM) {
111                 r5_flags = NORM_SHARED_NCACHE;
112                 if (flags & WB_CACHE) {
113                         r5_flags = NORM_SHARED_WB_WA;
114                 } else if (flags & WT_CACHE) {
115                         r5_flags = NORM_SHARED_WT_NWA;
116                 }
117         } else if (flags & MEM_MAPPED) {
118                 r5_flags = NORM_NSHARED_NCACHE;
119                 if (flags & WB_CACHE) {
120                         r5_flags = NORM_NSHARED_WB_WA;
121                 } else if (flags & WT_CACHE) {
122                         r5_flags = NORM_NSHARED_WT_NWA;
123                 }
124         }
126         Xil_SetMPURegion(pa, size, r5_flags | PRIV_RW_USER_RW);
127         return;
130 unsigned long platform_vatopa(void *addr)
132         return ((unsigned long)addr);
135 void *platform_patova(unsigned long addr)
137         return ((void *)addr);
140 unsigned int old_value = 0;
142 void restore_global_interrupts()
145         ARM_AR_INT_BITS_SET(old_value);
149 void disable_global_interrupts()
152         unsigned int value = 0;
154         ARM_AR_INT_BITS_GET(&value);
156         if (value != old_value) {
158                 ARM_AR_INT_BITS_SET(CORTEXR5_CPSR_INTERRUPTS_BITS);
160                 old_value = value;
162         }
166 void platform_isr(int vect_id, void * data)
168     (void)vect_id;
169     hil_isr(((struct proc_vring *)data));
172 /*==================================================================*/
173 /* The function definitions below are provided to prevent the build */
174 /* warnings for missing I/O function stubs in case of unhosted libs */
175 /*==================================================================*/
177 #include            <sys/stat.h>
179 /**
180  * _fstat
181  *
182  * Status of an open file. For consistency with other minimal
183  * implementations in these examples, all files are regarded
184  * as character special devices.
185  *
186  * @param file    - Unused.
187  * @param st      - Status structure.
188  *
189  *
190  *       A constant value of 0.
191  *
192  **/
193 __attribute__ ((weak))
194 int _fstat(int file, struct stat *st)
196         return (0);
199 /**
200  *  isatty
201  *
202  *
203  * Query whether output stream is a terminal. For consistency
204  * with the other minimal implementations, which only support
205  * output to stdout, this minimal implementation is suggested
206  *
207  * @param file    - Unused
208  *
209  * @return s - A constant value of 1.
210  *
211  */
212 __attribute__ ((weak))
213 int _isatty(int file)
215         return (1);
218 /**
219  *_lseek
220  *
221  * Set position in a file. Minimal implementation.
223  *
224  * @param file    - Unused
225  *
226  * @param ptr     - Unused
227  *
228  * @param dir     - Unused
229  *
230  * @return - A constant value of 0.
231  *
232  */
233 __attribute__ ((weak))
234 int _lseek(int file, int ptr, int dir)
236         return (0);
239 #if (RTL_RPC == 0)
240 /**
241  *  _open
242  *
243  * Open a file.  Minimal implementation
244  *
245  * @param filename    - Unused
246  * @param flags       - Unused
247  * @param mode        - Unused
248  *
249  * return -  A constant value of 1.
250  *
251  */
252 __attribute__ ((weak))
253 int _open(const char *filename, int flags, int mode)
255         /* Any number will work. */
256         return (1);
259 /**
260  *  _close
261  *
262  * Close a file.  Minimal implementation.
263  *
264  *
265  * @param file    - Unused
266  *
267  *
268  * return A constant value of -1.
269  *
270  */
271 __attribute__ ((weak))
272 int _close(int file)
274         return (-1);
277 /**
278  * _read
279  *
280  *  Low level function to redirect IO to serial.
281  *
282  * @param fd          - Unused
283  * @param buffer      - Buffer where read data will be placed.
284  * @param buflen      - Size (in bytes) of buffer.
285  *
286  * return -  A constant value of 1.
287  *
288  */
289 __attribute__ ((weak))
290 int _read(int fd, char *buffer, int buflen)
292         return -1;
295 /**
296  * _write
297  *
298  * Low level function to redirect IO to serial.
299  *
300  *
301  * @param file                          - Unused
302  * @param CHAR *ptr                         - String to output
303  * @param len                           - Length of the string
304  *
305  * return len                            - The length of the string
306  *
307  */
308 __attribute__ ((weak))
309 int _write(int file, const char *ptr, int len)
311         return 0;
313 #endif