[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