On Apr 1, 2009, at 11:06 AM, Kumar Gala wrote:

> * Use CONFIG_MP instead of CONFIG_NUM_CPUS to match 85xx
> * Introduce determine_mp_bootpg() helper.  We'll need this to  
> address a
>  bug introduced in v2009.03 with 86xx MP booting.  We have to make  
> sure
>  to reserve the region of memory used for the MP bootpg() so other
>  u-boot code doesn't use it.
> * Added dummy versions of cpu_status() & cpu_release() to allow  
> cmd_mp.c
>  to build and work.  In the future we should look at implementing
>  cpu_release().  This could be common w/85xx if we use spin tables on
>  86xx.
>
> Signed-off-by: Kumar Gala <ga...@kernel.crashing.org>
> ---
> * removed change to 85xx code
> * added comments about cpu_status() & cpu_release()

Acked-by: Becky Bruce <bec...@kernel.crashing.org>

>
>
> board/freescale/mpc8641hpcn/mpc8641hpcn.c |    2 +-
> board/sbc8641d/sbc8641d.c                 |    2 +-
> cpu/mpc86xx/Makefile                      |    7 ++--
> cpu/mpc86xx/fdt.c                         |   12 ++-----
> cpu/mpc86xx/mp.c                          |   50 ++++++++++++++++++ 
> +----------
> cpu/mpc86xx/mp.h                          |    1 +
> cpu/mpc86xx/release.S                     |    2 -
> include/configs/MPC8641HPCN.h             |    1 +
> include/configs/sbc8641d.h                |    1 +
> 9 files changed, 44 insertions(+), 34 deletions(-)
>
> diff --git a/board/freescale/mpc8641hpcn/mpc8641hpcn.c b/board/ 
> freescale/mpc8641hpcn/mpc8641hpcn.c
> index 1e35dfa..ef0095a 100644
> --- a/board/freescale/mpc8641hpcn/mpc8641hpcn.c
> +++ b/board/freescale/mpc8641hpcn/mpc8641hpcn.c
> @@ -375,7 +375,7 @@ void board_reset(void)
>               ;
> }
>
> -#if (CONFIG_NUM_CPUS > 1)
> +#ifdef CONFIG_MP
> extern void cpu_mp_lmb_reserve(struct lmb *lmb);
>
> void board_lmb_reserve(struct lmb *lmb)
> diff --git a/board/sbc8641d/sbc8641d.c b/board/sbc8641d/sbc8641d.c
> index fc1f07d..9f69638 100644
> --- a/board/sbc8641d/sbc8641d.c
> +++ b/board/sbc8641d/sbc8641d.c
> @@ -414,7 +414,7 @@ void board_reset(void)
> #endif
> }
>
> -#if (CONFIG_NUM_CPUS > 1)
> +#ifdef CONFIG_MP
> extern void cpu_mp_lmb_reserve(struct lmb *lmb);
>
> void board_lmb_reserve(struct lmb *lmb)
> diff --git a/cpu/mpc86xx/Makefile b/cpu/mpc86xx/Makefile
> index 34a9755..f1af64e 100644
> --- a/cpu/mpc86xx/Makefile
> +++ b/cpu/mpc86xx/Makefile
> @@ -31,10 +31,9 @@ LIB        = $(obj)lib$(CPU).a
> START = start.o
> SOBJS = cache.o
>
> -ifneq ($(CONFIG_NUM_CPUS),1)
> -COBJS-y += mp.o
> -SOBJS += release.o
> -endif
> +SOBJS-$(CONFIG_MP) += release.o
> +SOBJS        += $(SOBJS-y)
> +COBJS-$(CONFIG_MP) += mp.o
> COBJS-y       += traps.o
> COBJS-y       += cpu.o
> COBJS-y       += cpu_init.o
> diff --git a/cpu/mpc86xx/fdt.c b/cpu/mpc86xx/fdt.c
> index 383b06b..ee2eb0b 100644
> --- a/cpu/mpc86xx/fdt.c
> +++ b/cpu/mpc86xx/fdt.c
> @@ -15,9 +15,9 @@ DECLARE_GLOBAL_DATA_PTR;
>
> void ft_cpu_setup(void *blob, bd_t *bd)
> {
> -#if (CONFIG_NUM_CPUS > 1)
> +#ifdef CONFIG_MP
>       int off;
> -     u32 bootpg;
> +     u32 bootpg = determine_mp_bootpg();
> #endif
>
>       do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
> @@ -48,13 +48,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
>                              "clock-frequency", CONFIG_SYS_NS16550_CLK, 1);
> #endif
>
> -#if (CONFIG_NUM_CPUS > 1)
> -     /* if we have 4G or more of memory, put the boot page at 4Gb-1M */
> -     if (gd->ram_size > 0xfffff000)
> -             bootpg = 0xfff00000;
> -     else
> -             bootpg = gd->ram_size - (1024 * 1024);
> -
> +#ifdef CONFIG_MP
>       /* Reserve the boot page so OSes dont use it */
>       off = fdt_add_mem_rsv(blob, bootpg, (u64)4096);
>       if (off < 0)
> diff --git a/cpu/mpc86xx/mp.c b/cpu/mpc86xx/mp.c
> index 5014401..e17f5e1 100644
> --- a/cpu/mpc86xx/mp.c
> +++ b/cpu/mpc86xx/mp.c
> @@ -8,16 +8,42 @@
>
> DECLARE_GLOBAL_DATA_PTR;
>
> -#if (CONFIG_NUM_CPUS > 1)
> -void cpu_mp_lmb_reserve(struct lmb *lmb)
> +int cpu_reset(int nr)
> +{
> +     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
> +     volatile ccsr_pic_t *pic = &immr->im_pic;
> +     out_be32(&pic->pir, 1 << nr);
> +     (void)in_be32(&pic->pir);
> +     out_be32(&pic->pir, 0x0);
> +
> +     return 0;
> +}
> +
> +int cpu_status(int nr)
> +{
> +     /* dummy function so common/cmd_mp.c will build */
> +     return 0;
> +}
> +
> +int cpu_release(int nr, int argc, char *argv[])
> {
> -     u32 bootpg;
> +     /* dummy function so common/cmd_mp.c will build
> +      * should be implemented in the future */
> +     return 1;
> +}
>
> +u32 determine_mp_bootpg(void)
> +{
>       /* if we have 4G or more of memory, put the boot page at 4Gb-1M */
>       if ((u64)gd->ram_size > 0xfffff000)
> -             bootpg = 0xfff00000;
> -     else
> -             bootpg = gd->ram_size - (1024 * 1024);
> +             return (0xfff00000);
> +
> +     return (gd->ram_size - (1024 * 1024));
> +}
> +
> +void cpu_mp_lmb_reserve(struct lmb *lmb)
> +{
> +     u32 bootpg = determine_mp_bootpg();
>
>       /* tell u-boot we stole a page */
>       lmb_reserve(lmb, bootpg, 4096);
> @@ -31,18 +57,9 @@ void setup_mp(void)
> {
>       extern ulong __secondary_start_page;
>       ulong fixup = (ulong)&__secondary_start_page;
> -     u32 bootpg;
> +     u32 bootpg = determine_mp_bootpg();
>       u32 bootpg_va;
>
> -     /*
> -      * If we have 4G or more of memory, put the boot page at 4Gb-1M.
> -      * Otherwise, put it at the very end of RAM.
> -      */
> -     if (gd->ram_size > 0xfffff000)
> -             bootpg = 0xfff00000;
> -     else
> -             bootpg = gd->ram_size - (1024 * 1024);
> -
>       if (bootpg >= CONFIG_SYS_MAX_DDR_BAT_SIZE) {
>               /* We're not covered by the DDR mapping, set up BAT  */
>               write_bat(DBAT7, CONFIG_SYS_SCRATCH_VA | BATU_BL_128K |
> @@ -65,4 +82,3 @@ void setup_mp(void)
>               out_be32((uint *)(CONFIG_SYS_CCSRBAR + 0x20), 0x80000000 |
>                        (bootpg >> 12));
> }
> -#endif
> diff --git a/cpu/mpc86xx/mp.h b/cpu/mpc86xx/mp.h
> index 886e0c8..5471ef7 100644
> --- a/cpu/mpc86xx/mp.h
> +++ b/cpu/mpc86xx/mp.h
> @@ -3,5 +3,6 @@
>
> void setup_mp(void);
> void cpu_mp_lmb_reserve(struct lmb *lmb);
> +u32 determine_mp_bootpg(void);
>
> #endif
> diff --git a/cpu/mpc86xx/release.S b/cpu/mpc86xx/release.S
> index 95efbb4..67a6f2b 100644
> --- a/cpu/mpc86xx/release.S
> +++ b/cpu/mpc86xx/release.S
> @@ -41,7 +41,6 @@
>  * Core 0 must copy this to a 1M aligned region and set BPTR
>  * to point to it.
>  */
> -#if (CONFIG_NUM_CPUS > 1)
>       .align 12
> .globl __secondary_start_page
> __secondary_start_page:
> @@ -166,4 +165,3 @@ invl2:
>       blr
>
>       /* Never Returns, Running in Linux Now */
> -#endif
> diff --git a/include/configs/MPC8641HPCN.h b/include/configs/ 
> MPC8641HPCN.h
> index 9d66101..d8042fb 100644
> --- a/include/configs/MPC8641HPCN.h
> +++ b/include/configs/MPC8641HPCN.h
> @@ -36,6 +36,7 @@
> #define CONFIG_MPC86xx                1       /* MPC86xx */
> #define CONFIG_MPC8641                1       /* MPC8641 specific */
> #define CONFIG_MPC8641HPCN    1       /* MPC8641HPCN board specific */
> +#define CONFIG_MP            1       /* support multiple processors */
> #define CONFIG_NUM_CPUS               2       /* Number of CPUs in the system 
> */
> #define CONFIG_LINUX_RESET_VEC        0x100   /* Reset vector used by Linux */
> /*#define CONFIG_PHYS_64BIT   1*/     /* Place devices in 36-bit space */
> diff --git a/include/configs/sbc8641d.h b/include/configs/sbc8641d.h
> index 1008812..ef0f627 100644
> --- a/include/configs/sbc8641d.h
> +++ b/include/configs/sbc8641d.h
> @@ -40,6 +40,7 @@
> #define CONFIG_MPC86xx                1       /* MPC86xx */
> #define CONFIG_MPC8641                1       /* MPC8641 specific */
> #define CONFIG_SBC8641D               1       /* SBC8641D board specific */
> +#define CONFIG_MP            1       /* support multiple processors */
> #define CONFIG_NUM_CPUS         2       /* Number of CPUs in the  
> system */
> #define CONFIG_LINUX_RESET_VEC  0x100   /* Reset vector used by  
> Linux */
>
> -- 
> 1.5.6.6
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to