Dear Kumar Gala,

In message <1253307595-28655-5-git-send-email-ga...@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 <ga...@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: w...@denx.de
"Pull the wool over your own eyes!"                - J.R. "Bob" Dobbs
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to