bsp: a9: added support for openamp slave application in BSP

Signed-off-by: Kinjal Pravinbhai Patel <patelki@xilinx.com>
Acked-by: Anirudha Sarangi <anirudh@xilinx.com>
This commit is contained in:
Kinjal Pravinbhai Patel 2015-10-08 14:40:17 +05:30 committed by Nava kishore Manne
parent 20f9a33b64
commit 516c7af2cb
8 changed files with 63 additions and 11 deletions

View file

@ -238,4 +238,12 @@
* 5.2 pkp 23/07/15 Modified cortexa9/gcc/Makefile to keep a correct check of a compiler * 5.2 pkp 23/07/15 Modified cortexa9/gcc/Makefile to keep a correct check of a compiler
* to update ECC_FLAGS to fix a bug introduced during new version creation * to update ECC_FLAGS to fix a bug introduced during new version creation
* of BSP. * of BSP.
* 5.3 pkp 10/07/15 Modified cortexa9/xil_cache.c file to change cache API so that L2 Cache
* functionalities are avoided for the OpenAMP slave application(when
* USE_AMP flag is defined for BSP) as master CPU would be utilizing L2
* cache for its operation. Also file operations such as read, write,
* close, open are also avoided for OpenAMP support(when USE_AMP flag is
* defined for BSP) because XilOpenAMP library contains own file operation.
* The xil-crt0.S file is modified for not initializing global timer for
* OpenAMP application as it might be already in use by master CPU
*****************************************************************************************/ *****************************************************************************************/

View file

@ -29,7 +29,7 @@
* this Software without prior written authorization from Xilinx. * this Software without prior written authorization from Xilinx.
* *
******************************************************************************/ ******************************************************************************/
#ifndef USE_AMP
#include <errno.h> #include <errno.h>
#include "xil_types.h" #include "xil_types.h"
@ -51,3 +51,4 @@ __attribute__((weak)) s32 _open(const char8 *buf, s32 flags, s32 mode)
errno = EIO; errno = EIO;
return (-1); return (-1);
} }
#endif

View file

@ -29,6 +29,7 @@
* this Software without prior written authorization from Xilinx. * this Software without prior written authorization from Xilinx.
* *
******************************************************************************/ ******************************************************************************/
#ifndef USE_AMP
#include "xil_types.h" #include "xil_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -45,3 +46,4 @@ __attribute__((weak)) s32 _close(s32 fd)
(void)fd; (void)fd;
return (0); return (0);
} }
#endif

View file

@ -29,7 +29,7 @@
* this Software without prior written authorization from Xilinx. * this Software without prior written authorization from Xilinx.
* *
******************************************************************************/ ******************************************************************************/
#ifndef USE_AMP
#include <errno.h> #include <errno.h>
#include "xil_types.h" #include "xil_types.h"
@ -50,3 +50,4 @@ __attribute__((weak)) s32 open(char8 *buf, s32 flags, s32 mode)
errno = EIO; errno = EIO;
return (-1); return (-1);
} }
#endif

View file

@ -32,7 +32,7 @@
/* read.c -- read bytes from a input device. /* read.c -- read bytes from a input device.
*/ */
#ifndef USE_AMP
#include "xil_printf.h" #include "xil_printf.h"
#include "xparameters.h" #include "xparameters.h"
@ -109,3 +109,4 @@ _read (s32 fd, char8* buf, s32 nbytes)
return 0; return 0;
#endif #endif
} }
#endif

View file

@ -32,7 +32,7 @@
/* write.c -- write bytes to an output device. /* write.c -- write bytes to an output device.
*/ */
#ifndef USE_AMP
#include "xil_printf.h" #include "xil_printf.h"
#include "xparameters.h" #include "xparameters.h"
@ -109,3 +109,4 @@ _write (sint32 fd, char8* buf, sint32 nbytes)
return 0; return 0;
#endif #endif
} }
#endif

View file

@ -46,6 +46,8 @@
* 3.07a sgd 10/19/12 SMC NOR and SRAM initialization with build option * 3.07a sgd 10/19/12 SMC NOR and SRAM initialization with build option
* 4.2 pkp 08/04/14 Removed PEEP board related code which contained * 4.2 pkp 08/04/14 Removed PEEP board related code which contained
* initialization of uart smc nor and sram * initialization of uart smc nor and sram
* 5.3 pkp 10/07/15 Added support for OpenAMP by not initializing global
* timer when USE_AMP flag is defined
* </pre> * </pre>
* *
* @note * @note
@ -110,7 +112,10 @@ _start:
/* Reset and start Global Timer */ /* Reset and start Global Timer */
mov r0, #0x0 mov r0, #0x0
mov r1, #0x0 mov r1, #0x0
#if USE_AMP != 1
bl XTime_SetTime bl XTime_SetTime
#endif
#ifdef PROFILING /* defined in Makefile */ #ifdef PROFILING /* defined in Makefile */
/* Setup profiling stuff */ /* Setup profiling stuff */

View file

@ -89,6 +89,9 @@
* added into Xil_L2CacheInvalidateRange API. Xil_L1DCacheInvalidate * added into Xil_L2CacheInvalidateRange API. Xil_L1DCacheInvalidate
* and Xil_L2CacheInvalidate APIs are modified to flush the complete * and Xil_L2CacheInvalidate APIs are modified to flush the complete
* stack instead of just System Stack * stack instead of just System Stack
* 5.03 pkp 10/07/15 L2 Cache functionalities are avoided for the OpenAMP slave
* application(when USE_AMP flag is defined for BSP) as master CPU
* would be utilizing L2 cache for its operation
* *
* </pre> * </pre>
* *
@ -117,6 +120,7 @@
extern s32 __undef_stack; extern s32 __undef_stack;
#endif #endif
#ifndef USE_AMP
/**************************************************************************** /****************************************************************************
* *
* Access L2 Debug Control Register. * Access L2 Debug Control Register.
@ -164,7 +168,7 @@ static void Xil_L2CacheSync(void)
Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_SYNC_OFFSET, 0x0U); Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_SYNC_OFFSET, 0x0U);
#endif #endif
} }
#endif
/**************************************************************************** /****************************************************************************
* *
* Enable the Data cache. * Enable the Data cache.
@ -179,7 +183,9 @@ static void Xil_L2CacheSync(void)
void Xil_DCacheEnable(void) void Xil_DCacheEnable(void)
{ {
Xil_L1DCacheEnable(); Xil_L1DCacheEnable();
#ifndef USE_AMP
Xil_L2CacheEnable(); Xil_L2CacheEnable();
#endif
} }
/**************************************************************************** /****************************************************************************
@ -195,7 +201,9 @@ void Xil_DCacheEnable(void)
****************************************************************************/ ****************************************************************************/
void Xil_DCacheDisable(void) void Xil_DCacheDisable(void)
{ {
#ifndef USE_AMP
Xil_L2CacheDisable(); Xil_L2CacheDisable();
#endif
Xil_L1DCacheDisable(); Xil_L1DCacheDisable();
} }
@ -216,8 +224,9 @@ void Xil_DCacheInvalidate(void)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
#ifndef USE_AMP
Xil_L2CacheInvalidate(); Xil_L2CacheInvalidate();
#endif
Xil_L1DCacheInvalidate(); Xil_L1DCacheInvalidate();
mtcpsr(currmask); mtcpsr(currmask);
@ -244,8 +253,9 @@ void Xil_DCacheInvalidateLine(u32 adr)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
#ifndef USE_AMP
Xil_L2CacheInvalidateLine(adr); Xil_L2CacheInvalidateLine(adr);
#endif
Xil_L1DCacheInvalidateLine(adr); Xil_L1DCacheInvalidateLine(adr);
mtcpsr(currmask); mtcpsr(currmask);
@ -335,30 +345,36 @@ void Xil_DCacheInvalidateRange(INTPTR adr, u32 len)
tempadr &= (~(cacheline - 1U)); tempadr &= (~(cacheline - 1U));
Xil_L1DCacheFlushLine(tempadr); Xil_L1DCacheFlushLine(tempadr);
#ifndef USE_AMP
/* Disable Write-back and line fills */ /* Disable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x3U); Xil_L2WriteDebugCtrl(0x3U);
Xil_L2CacheFlushLine(tempadr); Xil_L2CacheFlushLine(tempadr);
/* Enable Write-back and line fills */ /* Enable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x0U); Xil_L2WriteDebugCtrl(0x0U);
Xil_L2CacheSync(); Xil_L2CacheSync();
#endif
tempadr += cacheline; tempadr += cacheline;
} }
if ((tempend & (cacheline-1U)) != 0U) { if ((tempend & (cacheline-1U)) != 0U) {
tempend &= (~(cacheline - 1U)); tempend &= (~(cacheline - 1U));
Xil_L1DCacheFlushLine(tempend); Xil_L1DCacheFlushLine(tempend);
#ifndef USE_AMP
/* Disable Write-back and line fills */ /* Disable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x3U); Xil_L2WriteDebugCtrl(0x3U);
Xil_L2CacheFlushLine(tempend); Xil_L2CacheFlushLine(tempend);
/* Enable Write-back and line fills */ /* Enable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x0U); Xil_L2WriteDebugCtrl(0x0U);
Xil_L2CacheSync(); Xil_L2CacheSync();
#endif
} }
while (tempadr < tempend) { while (tempadr < tempend) {
#ifndef USE_AMP
/* Invalidate L2 cache line */ /* Invalidate L2 cache line */
*L2CCOffset = tempadr; *L2CCOffset = tempadr;
Xil_L2CacheSync(); Xil_L2CacheSync();
#endif
#ifdef __GNUC__ #ifdef __GNUC__
/* Invalidate L1 Data cache line */ /* Invalidate L1 Data cache line */
__asm__ __volatile__("mcr " \ __asm__ __volatile__("mcr " \
@ -397,8 +413,9 @@ void Xil_DCacheFlush(void)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
Xil_L1DCacheFlush(); Xil_L1DCacheFlush();
#ifndef USE_AMP
Xil_L2CacheFlush(); Xil_L2CacheFlush();
#endif
mtcpsr(currmask); mtcpsr(currmask);
} }
@ -424,7 +441,7 @@ void Xil_DCacheFlushLine(u32 adr)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
Xil_L1DCacheFlushLine(adr); Xil_L1DCacheFlushLine(adr);
#ifndef USE_AMP
/* Disable Write-back and line fills */ /* Disable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x3U); Xil_L2WriteDebugCtrl(0x3U);
@ -433,6 +450,7 @@ void Xil_DCacheFlushLine(u32 adr)
/* Enable Write-back and line fills */ /* Enable Write-back and line fills */
Xil_L2WriteDebugCtrl(0x0U); Xil_L2WriteDebugCtrl(0x0U);
Xil_L2CacheSync(); Xil_L2CacheSync();
#endif
mtcpsr(currmask); mtcpsr(currmask);
} }
@ -483,9 +501,11 @@ void Xil_DCacheFlushRange(INTPTR adr, u32 len)
__asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC); __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC);
Reg = LocalAddr; } Reg = LocalAddr; }
#endif #endif
#ifndef USE_AMP
/* Flush L2 cache line */ /* Flush L2 cache line */
*L2CCOffset = LocalAddr; *L2CCOffset = LocalAddr;
Xil_L2CacheSync(); Xil_L2CacheSync();
#endif
LocalAddr += cacheline; LocalAddr += cacheline;
} }
} }
@ -515,7 +535,9 @@ void Xil_DCacheStoreLine(u32 adr)
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
Xil_L1DCacheStoreLine(adr); Xil_L1DCacheStoreLine(adr);
#ifndef USE_AMP
Xil_L2CacheStoreLine(adr); Xil_L2CacheStoreLine(adr);
#endif
mtcpsr(currmask); mtcpsr(currmask);
} }
@ -533,7 +555,9 @@ void Xil_DCacheStoreLine(u32 adr)
void Xil_ICacheEnable(void) void Xil_ICacheEnable(void)
{ {
Xil_L1ICacheEnable(); Xil_L1ICacheEnable();
#ifndef USE_AMP
Xil_L2CacheEnable(); Xil_L2CacheEnable();
#endif
} }
/**************************************************************************** /****************************************************************************
@ -549,7 +573,9 @@ void Xil_ICacheEnable(void)
****************************************************************************/ ****************************************************************************/
void Xil_ICacheDisable(void) void Xil_ICacheDisable(void)
{ {
#ifndef USE_AMP
Xil_L2CacheDisable(); Xil_L2CacheDisable();
#endif
Xil_L1ICacheDisable(); Xil_L1ICacheDisable();
} }
@ -570,8 +596,9 @@ void Xil_ICacheInvalidate(void)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
#ifndef USE_AMP
Xil_L2CacheInvalidate(); Xil_L2CacheInvalidate();
#endif
Xil_L1ICacheInvalidate(); Xil_L1ICacheInvalidate();
mtcpsr(currmask); mtcpsr(currmask);
@ -596,7 +623,9 @@ void Xil_ICacheInvalidateLine(u32 adr)
currmask = mfcpsr(); currmask = mfcpsr();
mtcpsr(currmask | IRQ_FIQ_MASK); mtcpsr(currmask | IRQ_FIQ_MASK);
#ifndef USE_AMP
Xil_L2CacheInvalidateLine(adr); Xil_L2CacheInvalidateLine(adr);
#endif
Xil_L1ICacheInvalidateLine(adr); Xil_L1ICacheInvalidateLine(adr);
mtcpsr(currmask); mtcpsr(currmask);
} }
@ -640,9 +669,11 @@ void Xil_ICacheInvalidateRange(INTPTR adr, u32 len)
mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U); mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U);
while (LocalAddr < end) { while (LocalAddr < end) {
#ifndef USE_AMP
/* Invalidate L2 cache line */ /* Invalidate L2 cache line */
*L2CCOffset = LocalAddr; *L2CCOffset = LocalAddr;
dsb(); dsb();
#endif
#ifdef __GNUC__ #ifdef __GNUC__
/* Invalidate L1 I-cache line */ /* Invalidate L1 I-cache line */
__asm__ __volatile__("mcr " \ __asm__ __volatile__("mcr " \
@ -1265,6 +1296,7 @@ void Xil_L1ICacheInvalidateRange(u32 adr, u32 len)
mtcpsr(currmask); mtcpsr(currmask);
} }
#ifndef USE_AMP
/**************************************************************************** /****************************************************************************
* *
* Enable the L2 cache. * Enable the L2 cache.
@ -1609,3 +1641,4 @@ void Xil_L2CacheStoreLine(u32 adr)
/* synchronize the processor */ /* synchronize the processor */
dsb(); dsb();
} }
#endif