[U-Boot] [PATCH 4/7] ppc/p4080: CoreNet platfrom style secondary core release

Wolfgang Denk wd at denx.de
Wed Sep 23 00:07:56 CEST 2009


Dear Kumar Gala,

In message <1253307595-28655-5-git-send-email-galak at kernel.crashing.org> you wrote:
> The CoreNet platform style of bringing secondary cores out of reset is
> a bit different that the PQ3 style.  Mostly the registers that we use
> to setup boot translation, enable time bases, and boot release the cores
> have moved around.
> 
> Signed-off-by: Kumar Gala <galak at kernel.crashing.org>
> ---
>  cpu/mpc85xx/mp.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 67 insertions(+), 1 deletions(-)
> 
> diff --git a/cpu/mpc85xx/mp.c b/cpu/mpc85xx/mp.c
> index fa65bed..b474218 100644
> --- a/cpu/mpc85xx/mp.c
> +++ b/cpu/mpc85xx/mp.c
> @@ -26,6 +26,7 @@
>  #include <lmb.h>
>  #include <asm/io.h>
>  #include <asm/mmu.h>
> +#include <asm/fsl_law.h>
>  #include "mp.h"
>  
>  DECLARE_GLOBAL_DATA_PTR;
> @@ -135,6 +136,66 @@ ulong get_spin_addr(void)
>  	return addr;
>  }
>  
> +#ifdef CONFIG_FSL_CORENET
> +static void corenet_mp_up(unsigned long bootpg)
> +{
> +	u32 up, cpu_up_mask, whoami;
> +	u32 *table = (u32 *)get_spin_addr();
> +	volatile ccsr_gur_t *gur;
> +	volatile ccsr_local_t *ccm;
> +	volatile ccsr_rcpm_t *rcpm;
> +	volatile ccsr_pic_t *pic;
> +	int timeout = 10;
> +	u32 nr_cpus;
> +	struct law_entry e;
> +
> +	gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +	ccm = (void *)(CONFIG_SYS_FSL_CORENET_CCM_ADDR);
> +	rcpm = (void *)(CONFIG_SYS_FSL_CORENET_RCPM_ADDR);
> +	pic = (void *)(CONFIG_SYS_MPC85xx_PIC_ADDR);
> +
> +	nr_cpus = ((in_be32(&pic->frr) >> 8) & 0xff) + 1;
> +
> +	whoami = in_be32(&pic->whoami);
> +	cpu_up_mask = 1 << whoami;
> +	out_be32(&ccm->bstrl, bootpg);
> +
> +	e = find_law(bootpg);
> +	out_be32(&ccm->bstrar, LAWAR_EN | e.trgt_id << 20 | LAWAR_SIZE_4K);
> +
> +	/* disable time base at the platform */
> +	out_be32(&rcpm->ctbenrl, cpu_up_mask);
> +
> +	/* release the hounds */
> +	up = ((1 << nr_cpus) - 1);
> +	out_be32(&gur->brrl, up);
> +
> +	/* wait for everyone */
> +	while (timeout) {
> +		int i;
> +		for (i = 0; i < nr_cpus; i++) {
> +			if (table[i * NUM_BOOT_ENTRY + BOOT_ENTRY_ADDR_LOWER])
> +				cpu_up_mask |= (1 << i);
> +		};
> +
> +		if ((cpu_up_mask & up) == up)
> +			break;
> +
> +		udelay(100);
> +		timeout--;
> +	}
> +
> +	if (timeout == 0)
> +		printf("CPU up timeout. CPU up mask is %x should be %x\n",
> +			cpu_up_mask, up);
> +
> +	/* enable time base at the platform */
> +	out_be32(&rcpm->ctbenrl, 0);
> +	mtspr(SPRN_TBWU, 0);
> +	mtspr(SPRN_TBWL, 0);
> +	out_be32(&rcpm->ctbenrl, (1 << nr_cpus) - 1);
> +}
> +#else
>  static void pq3_mp_up(unsigned long bootpg)
>  {
>  	u32 up, cpu_up_mask, whoami;
> @@ -196,6 +257,7 @@ static void pq3_mp_up(unsigned long bootpg)
>  	devdisr &= ~(MPC85xx_DEVDISR_TB0 | MPC85xx_DEVDISR_TB1);
>  	out_be32(&gur->devdisr, devdisr);
>  }
> +#endif

This is becoming a terrible mess of #ifdef's.  Would it not make sense
to move the new code into separate files?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"Pull the wool over your own eyes!"                - J.R. "Bob" Dobbs


More information about the U-Boot mailing list