All of lore.kernel.org
 help / color / mirror / Atom feed
From: Becky Bruce <beckyb@kernel.crashing.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 1/3] 86xx: Cleanup MP support
Date: Wed, 1 Apr 2009 13:34:43 -0500	[thread overview]
Message-ID: <ADE523AA-1F43-48A0-A7B0-CD4D78728E31@kernel.crashing.org> (raw)
In-Reply-To: <1238601989-6251-1-git-send-email-galak@kernel.crashing.org>


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 <galak@kernel.crashing.org>
> ---
> * removed change to 85xx code
> * added comments about cpu_status() & cpu_release()

Acked-by: Becky Bruce <beckyb@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 at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

  parent reply	other threads:[~2009-04-01 18:34 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-01 16:06 [U-Boot] [PATCH v2 1/3] 86xx: Cleanup MP support Kumar Gala
2009-04-01 16:06 ` [U-Boot] [PATCH 2/3] 85xx: Introduce determine_mp_bootpg() helper Kumar Gala
2009-04-01 16:06   ` [U-Boot] [PATCH 3/3] 85xx/86xx: Ensure MP boot page is not used Kumar Gala
2009-04-01 19:00     ` Wolfgang Denk
2009-04-01 18:35   ` [U-Boot] [PATCH 2/3] 85xx: Introduce determine_mp_bootpg() helper Becky Bruce
2009-04-01 18:34 ` Becky Bruce [this message]
2009-04-01 19:00 ` [U-Boot] [PATCH v2 1/3] 86xx: Cleanup MP support Wolfgang Denk
2009-04-01 20:11 ` Kim Phillips
2009-04-01 20:15   ` Kumar Gala

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ADE523AA-1F43-48A0-A7B0-CD4D78728E31@kernel.crashing.org \
    --to=beckyb@kernel.crashing.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.