Update CMake files to compile OpenAMP for Linux
[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         (void)polarity;
76         (void)priority;
78         XScuGic_EnableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
79         return (int)vector;
80 }
82 int platform_interrupt_disable(unsigned int vector)
83 {
84         XScuGic_DisableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
85         return (int)vector;
86 }
88 void platform_dcache_all_flush()
89 {
90         Xil_DCacheFlush();
91 }
93 void platform_cache_all_flush_invalidate()
94 {
95         Xil_DCacheFlush();
96         Xil_DCacheInvalidate();
97         Xil_ICacheInvalidate();
98 }
100 void platform_cache_disable()
102         Xil_DCacheDisable();
103         Xil_ICacheDisable();
106 void platform_map_mem_region(unsigned int va, unsigned int pa,
107                              unsigned int size, unsigned int flags)
109         unsigned int r5_flags;
111         (void)va; 
113         /* Assume DEVICE_SHARED if nothing indicates this is memory.  */
114         r5_flags = DEVICE_SHARED;
115         if (flags & SHARED_MEM) {
116                 r5_flags = NORM_SHARED_NCACHE;
117                 if (flags & WB_CACHE) {
118                         r5_flags = NORM_SHARED_WB_WA;
119                 } else if (flags & WT_CACHE) {
120                         r5_flags = NORM_SHARED_WT_NWA;
121                 }
122         } else if (flags & MEM_MAPPED) {
123                 r5_flags = NORM_NSHARED_NCACHE;
124                 if (flags & WB_CACHE) {
125                         r5_flags = NORM_NSHARED_WB_WA;
126                 } else if (flags & WT_CACHE) {
127                         r5_flags = NORM_NSHARED_WT_NWA;
128                 }
129         }
131         Xil_SetMPURegion(pa, size, r5_flags | PRIV_RW_USER_RW);
132         return;
135 unsigned long platform_vatopa(void *addr)
137         return ((unsigned long)addr);
140 void *platform_patova(unsigned long addr)
142         return ((void *)addr);
145 unsigned int old_value = 0;
147 void restore_global_interrupts()
150         ARM_AR_INT_BITS_SET(old_value);
154 void disable_global_interrupts()
157         unsigned int value = 0;
159         ARM_AR_INT_BITS_GET(&value);
161         if (value != old_value) {
163                 ARM_AR_INT_BITS_SET(CORTEXR5_CPSR_INTERRUPTS_BITS);
165                 old_value = value;
167         }
171 void platform_isr(int vect_id, void * data)
173     (void)vect_id;
174     hil_isr(((struct proc_vring *)data));
177 /*==================================================================*/
178 /* The function definitions below are provided to prevent the build */
179 /* warnings for missing I/O function stubs in case of unhosted libs */
180 /*==================================================================*/
182 #include            <sys/stat.h>
184 /**
185  * _fstat
186  *
187  * Status of an open file. For consistency with other minimal
188  * implementations in these examples, all files are regarded
189  * as character special devices.
190  *
191  * @param file    - Unused.
192  * @param st      - Status structure.
193  *
194  *
195  *       A constant value of 0.
196  *
197  **/
198 __attribute__ ((weak))
199 int _fstat(int file, struct stat *st)
201         (void)file;
202         (void)st;
204         return (0);
207 /**
208  *  isatty
209  *
210  *
211  * Query whether output stream is a terminal. For consistency
212  * with the other minimal implementations, which only support
213  * output to stdout, this minimal implementation is suggested
214  *
215  * @param file    - Unused
216  *
217  * @return s - A constant value of 1.
218  *
219  */
220 __attribute__ ((weak))
221 int _isatty(int file)
223         (void)file;
225         return (1);
228 /**
229  *_lseek
230  *
231  * Set position in a file. Minimal implementation.
233  *
234  * @param file    - Unused
235  *
236  * @param ptr     - Unused
237  *
238  * @param dir     - Unused
239  *
240  * @return - A constant value of 0.
241  *
242  */
243 __attribute__ ((weak))
244 int _lseek(int file, int ptr, int dir)
246         (void)file;
247         (void)ptr;
248         (void)dir;
250         return (0);
253 #if (RTL_RPC == 0)
254 /**
255  *  _open
256  *
257  * Open a file.  Minimal implementation
258  *
259  * @param filename    - Unused
260  * @param flags       - Unused
261  * @param mode        - Unused
262  *
263  * return -  A constant value of 1.
264  *
265  */
266 __attribute__ ((weak))
267 int _open(const char *filename, int flags, int mode)
269         (void)filename;
270         (void)flags;
271         (void)mode;
273         /* Any number will work. */
274         return (1);
277 /**
278  *  _close
279  *
280  * Close a file.  Minimal implementation.
281  *
282  *
283  * @param file    - Unused
284  *
285  *
286  * return A constant value of -1.
287  *
288  */
289 __attribute__ ((weak))
290 int _close(int file)
292         (void)file;
294         return (-1);
297 /**
298  * _read
299  *
300  *  Low level function to redirect IO to serial.
301  *
302  * @param fd          - Unused
303  * @param buffer      - Buffer where read data will be placed.
304  * @param buflen      - Size (in bytes) of buffer.
305  *
306  * return -  A constant value of 1.
307  *
308  */
309 __attribute__ ((weak))
310 int _read(int fd, char *buffer, int buflen)
312         (void)fd;
313         (void)buffer;
314         (void)buflen;
316         return -1;
319 /**
320  * _write
321  *
322  * Low level function to redirect IO to serial.
323  *
324  *
325  * @param file                          - Unused
326  * @param CHAR *ptr                         - String to output
327  * @param len                           - Length of the string
328  *
329  * return len                            - The length of the string
330  *
331  */
332 __attribute__ ((weak))
333 int _write(int file, const char *ptr, int len)
335         (void)file;
336         (void)ptr;
337         (void)len;
339         return 0;
341 #endif