[U-Boot] [PATCH 4/7] ppc/p4080: CoreNet platfrom style secondary core release
Kumar Gala
galak at kernel.crashing.org
Wed Sep 23 19:03:11 CEST 2009
On Sep 22, 2009, at 3:07 PM, Wolfgang Denk wrote:
> 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?
Is this a general comment or specific to this patch?
In general I would say no. In this specific case we only have two
#ifdef's. I can remove the one at the call site by naming the
functions the same thing if desired.
- k
- k
More information about the U-Boot
mailing list