552c4d74c63f5af2db1ba729157598a4c8cfae1f
[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"
40 #define CORTEXR5_CPSR_INTERRUPTS_BITS (XREG_CPSR_IRQ_ENABLE | XREG_CPSR_FIQ_ENABLE)
42 /* This macro writes the current program status register (CPSR - all fields) */
43 #define ARM_AR_CPSR_CXSF_WRITE(cpsr_cxsf_value) \
44         { \
45                 asm volatile("    MSR     CPSR_cxsf, %0" \
46                         : /* No outputs */ \
47                         : "r" (cpsr_cxsf_value) ); \
48         }
50 /* This macro sets the interrupt related bits in the status register / control
51  register to the specified value. */
52 #define ARM_AR_INT_BITS_SET(set_bits) \
53         { \
54                 int     tmp_val; \
55                 tmp_val = mfcpsr(); \
56                 tmp_val &= ~((unsigned int)CORTEXR5_CPSR_INTERRUPTS_BITS); \
57                 tmp_val |= set_bits; \
58                 ARM_AR_CPSR_CXSF_WRITE(tmp_val); \
59         }
61 /* This macro gets the interrupt related bits from the status register / control
62  register. */
63 #define ARM_AR_INT_BITS_GET(get_bits_ptr) \
64         { \
65                 int     tmp_val; \
66                 tmp_val = mfcpsr(); \
67                 tmp_val &= CORTEXR5_CPSR_INTERRUPTS_BITS; \
68                 *get_bits_ptr = tmp_val; \
69         }
71 int platform_interrupt_enable(unsigned int vector, unsigned int polarity,
72                               unsigned int priority)
73 {
74         XScuGic_EnableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
75         return (vector);
76 }
78 int platform_interrupt_disable(unsigned int vector)
79 {
80         XScuGic_DisableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
81         return (vector);
82 }
84 void platform_dcache_all_flush()
85 {
86         Xil_DCacheFlush();
87 }
89 void platform_cache_all_flush_invalidate()
90 {
91         Xil_DCacheFlush();
92         Xil_DCacheInvalidate();
93         Xil_ICacheInvalidate();
94 }
96 void platform_cache_disable()
97 {
98         Xil_DCacheDisable();
99         Xil_ICacheDisable();
102 void platform_map_mem_region(unsigned int va, unsigned int pa,
103                              unsigned int size, unsigned int flags)
105         unsigned int r5_flags;
107         /* Assume DEVICE_SHARED if nothing indicates this is memory.  */
108         r5_flags = DEVICE_SHARED;
109         if (flags & SHARED_MEM) {
110                 r5_flags = NORM_SHARED_NCACHE;
111                 if (flags & WB_CACHE) {
112                         r5_flags = NORM_SHARED_WB_WA;
113                 } else if (flags & WT_CACHE) {
114                         r5_flags = NORM_SHARED_WT_NWA;
115                 }
116         } else if (flags & MEM_MAPPED) {
117                 r5_flags = NORM_NSHARED_NCACHE;
118                 if (flags & WB_CACHE) {
119                         r5_flags = NORM_NSHARED_WB_WA;
120                 } else if (flags & WT_CACHE) {
121                         r5_flags = NORM_NSHARED_WT_NWA;
122                 }
123         }
125         Xil_SetMPURegion(pa, size, r5_flags | PRIV_RW_USER_RW);
126         return;
129 unsigned long platform_vatopa(void *addr)
131         return ((unsigned long)addr);
134 void *platform_patova(unsigned long addr)
136         return ((void *)addr);
139 unsigned int old_value = 0;
141 void restore_global_interrupts()
144         ARM_AR_INT_BITS_SET(old_value);
148 void disable_global_interrupts()
151         unsigned int value = 0;
153         ARM_AR_INT_BITS_GET(&value);
155         if (value != old_value) {
157                 ARM_AR_INT_BITS_SET(CORTEXR5_CPSR_INTERRUPTS_BITS);
159                 old_value = value;
161         }
165 /*==================================================================*/
166 /* The function definitions below are provided to prevent the build */
167 /* warnings for missing I/O function stubs in case of unhosted libs */
168 /*==================================================================*/
170 #include            <sys/stat.h>
172 /**
173  * _fstat
174  *
175  * Status of an open file. For consistency with other minimal
176  * implementations in these examples, all files are regarded
177  * as character special devices.
178  *
179  * @param file    - Unused.
180  * @param st      - Status structure.
181  *
182  *
183  *       A constant value of 0.
184  *
185  **/
186 __attribute__ ((weak))
187 int _fstat(int file, struct stat *st)
189         return (0);
192 /**
193  *  isatty
194  *
195  *
196  * Query whether output stream is a terminal. For consistency
197  * with the other minimal implementations, which only support
198  * output to stdout, this minimal implementation is suggested
199  *
200  * @param file    - Unused
201  *
202  * @return s - A constant value of 1.
203  *
204  */
205 __attribute__ ((weak))
206 int _isatty(int file)
208         return (1);
211 /**
212  *_lseek
213  *
214  * Set position in a file. Minimal implementation.
216  *
217  * @param file    - Unused
218  *
219  * @param ptr     - Unused
220  *
221  * @param dir     - Unused
222  *
223  * @return - A constant value of 0.
224  *
225  */
226 __attribute__ ((weak))
227 int _lseek(int file, int ptr, int dir)
229         return (0);
232 #if (RTL_RPC == 0)
233 /**
234  *  _open
235  *
236  * Open a file.  Minimal implementation
237  *
238  * @param filename    - Unused
239  * @param flags       - Unused
240  * @param mode        - Unused
241  *
242  * return -  A constant value of 1.
243  *
244  */
245 __attribute__ ((weak))
246 int _open(const char *filename, int flags, int mode)
248         /* Any number will work. */
249         return (1);
252 /**
253  *  _close
254  *
255  * Close a file.  Minimal implementation.
256  *
257  *
258  * @param file    - Unused
259  *
260  *
261  * return A constant value of -1.
262  *
263  */
264 __attribute__ ((weak))
265 int _close(int file)
267         return (-1);
270 /**
271  * _read
272  *
273  *  Low level function to redirect IO to serial.
274  *
275  * @param fd          - Unused
276  * @param buffer      - Buffer where read data will be placed.
277  * @param buflen      - Size (in bytes) of buffer.
278  *
279  * return -  A constant value of 1.
280  *
281  */
282 __attribute__ ((weak))
283 int _read(int fd, char *buffer, int buflen)
285         return -1;
288 /**
289  * _write
290  *
291  * Low level function to redirect IO to serial.
292  *
293  *
294  * @param file                          - Unused
295  * @param CHAR *ptr                         - String to output
296  * @param len                           - Length of the string
297  *
298  * return len                            - The length of the string
299  *
300  */
301 __attribute__ ((weak))
302 int _write(int file, const char *ptr, int len)
304         return 0;
306 #endif