[PR 05] LEON3: CPU index intialization moved to bspstart.c
Gedare Bloom
gedare at rtems.org
Thu Feb 2 15:45:12 UTC 2012
On Thu, Feb 2, 2012 at 9:46 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
> 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 <daniel at gaisler.com>
> ---
> 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 1932cee..b0a43f9 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 a4b9ffa..82054e8 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;
> +}
Might get_asr17 make sense as a function defined by
cpukit/score/cpu/sparc/rtems/score/sparc.h? Or is it really only
useful for getting the cpu index as used below?
> +
> /*
> * 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;
Would it make sense to also define something like
sparc_get_cpu_index()? Or does it only ever need to be done during bsp
initialization?
> +
> /* Find UARTs */
> amba_initialize();
> }
> --
> 1.7.0.4
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list