From 45eaf8ccb4fa6a18b9de684ae0753bf84080ba6f Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 2 Feb 2012 11:22:19 -0600 Subject: LEON3: CPU index intialization moved to bspstart.c 2009/bsps All LEON3/4 systems have a CPU-id, if on a single-CPU system the ID is always zero. On a multicore system it ranges from 0 to 15. The CPU index should always by updated even in a non-MP RTEMS OS since the CPU running RTEMS may not always be CPU0. For example when RTEMS runs on CPU1 and Linux on CPU0 in a mixed ASMP system. The old code executed within the IRQ controller initialization code makes no sense since the ASR register is a CPU register, it has nothing to do with AMBA initialization either. Signed-off-by: Daniel Hellstrom --- c/src/lib/libbsp/sparc/leon3/amba/amba.c | 18 ------------------ c/src/lib/libbsp/sparc/leon3/startup/bspstart.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c b/c/src/lib/libbsp/sparc/leon3/amba/amba.c index 6f86e27ded..b0a43f9c19 100644 --- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c +++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c @@ -21,8 +21,6 @@ amba_confarea_type amba_conf; /* Pointers to Interrupt Controller configuration registers */ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; -int LEON3_Cpu_Index = 0; - /* * amba_initialize * @@ -33,16 +31,6 @@ int LEON3_Cpu_Index = 0; * amba_ahb_masters, amba_ahb_slaves and amba. */ -unsigned int getasr17(void); - -asm(" .text \n" - "getasr17: \n" - "retl \n" - "mov %asr17, %o0\n" -); - - -extern rtems_configuration_table Configuration; extern int scan_uarts(void); void amba_initialize(void) @@ -58,12 +46,6 @@ void amba_initialize(void) if ( i > 0 ){ /* Found APB IRQ_MP Interrupt Controller */ LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *) dev.start; -#if defined(RTEMS_MULTIPROCESSING) - if (rtems_configuration_get_user_multiprocessing_table() != NULL) { - unsigned int tmp = getasr17(); - LEON3_Cpu_Index = (tmp >> 28) & 3; - } -#endif } /* find GP Timer */ diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c index fbe6b876ed..65a159c641 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c +++ b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c @@ -27,6 +27,9 @@ */ int CPU_SPARC_HAS_SNOOPING; +/* Index of CPU, in an AMP system CPU-index may be non-zero */ +int LEON3_Cpu_Index = 0; + extern void amba_initialize(void); /* @@ -48,6 +51,14 @@ static inline int set_snooping(void) return (tmp >> 27) & 1; } +/* ASM-function used to get the CPU-Index on calling LEON3 CPUs */ +static inline unsigned int get_asr17(void) +{ + unsigned int reg; + __asm__ (" mov %%asr17, %0 " : "=r"(reg) :); + return reg; +} + /* * bsp_start * @@ -57,6 +68,13 @@ void bsp_start( void ) { CPU_SPARC_HAS_SNOOPING = set_snooping(); + /* Get the LEON3 CPU index, normally 0, but for MP systems we do + * _not_ assume that this is CPU0. One may run another OS on CPU0 + * and RTEMS on this CPU, and AMP system with mixed operating + * systems + */ + LEON3_Cpu_Index = (get_asr17() >> 28) & 3; + /* Find UARTs */ amba_initialize(); } -- cgit v1.2.3