svn commit: r328537 - in head/sys/powerpc: aim powernv

Wojciech Macek wma at semihalf.com
Tue Jan 30 09:04:43 UTC 2018


The LPCR register must be set very early. The best is to do it in
cpudep_bootstrap as this is the first function being run on the AP after
start.
As soon as the AP completes pmap_cpu_bootstrap, we must guarantee that DSI
exceptions are working fine. We can't do this with LPCR set incorrectly,
this it contains a base addres of an exception table.

The code from powernv_smp_ap_init was moved to attach, as we don't set LPCR
twice during AP startup - it's not an error of course, but I like to have
this in one place only.

I can revert this patch if you insist, but to fix non-powernv boards we can
just add "if (mfmsr() & PSL_HV)" check to early_bootstrap. What do you
think?


Regards,
Wojtek

2018-01-29 16:46 GMT+01:00 Nathan Whitehorn <nwhitehorn at freebsd.org>:

> Can you explain why this is necessary? Both functions are run in the same
> context and this way of doing things breaks important abstraction barriers.
>
> Since it also breaks booting on pHyp systems, I would appreciate it if you
> could revert this pending review.
> -Nathan
>
>
> On 01/29/18 01:27, Wojciech Macek wrote:
>
>> Author: wma
>> Date: Mon Jan 29 09:27:02 2018
>> New Revision: 328537
>> URL: https://svnweb.freebsd.org/changeset/base/328537
>>
>> Log:
>>    PowerNV: move LPCR and LPID altering to cpudep_ap_early_bootstrap
>>       It turns out that under some circumstances we can get DSI or DSE
>> before we set
>>    LPCR and LPID so we should set it as early as possible.
>>       Authored by:           Patryk Duda <pdk at semihalf.com>
>>    Submitted by:          Wojciech Macek <wma at semihalf.com>
>>    Obtained from:         Semihalf
>>    Sponsored by:          IBM, QCM Technologies
>>
>> Modified:
>>    head/sys/powerpc/aim/mp_cpudep.c
>>    head/sys/powerpc/powernv/platform_powernv.c
>>
>> Modified: head/sys/powerpc/aim/mp_cpudep.c
>> ============================================================
>> ==================
>> --- head/sys/powerpc/aim/mp_cpudep.c    Mon Jan 29 09:24:28 2018
>> (r328536)
>> +++ head/sys/powerpc/aim/mp_cpudep.c    Mon Jan 29 09:27:02 2018
>> (r328537)
>> @@ -64,9 +64,6 @@ cpudep_ap_early_bootstrap(void)
>>         register_t reg;
>>   #endif
>>   -     __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu));
>> -       powerpc_sync();
>> -
>>         switch (mfpvr() >> 16) {
>>         case IBM970:
>>         case IBM970FX:
>> @@ -86,7 +83,20 @@ cpudep_ap_early_bootstrap(void)
>>   #endif
>>                 powerpc_sync();
>>                 break;
>> +       case IBMPOWER8:
>> +       case IBMPOWER8E:
>> +               isync();
>> +               /* Direct interrupts to SRR instead of HSRR and reset
>> LPCR otherwise */
>> +               mtspr(SPR_LPID, 0);
>> +               isync();
>> +
>> +               mtspr(SPR_LPCR, LPCR_LPES);
>> +               isync();
>> +               break;
>>         }
>> +
>> +       __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu));
>> +       powerpc_sync();
>>   }
>>     uintptr_t
>>
>> Modified: head/sys/powerpc/powernv/platform_powernv.c
>> ============================================================
>> ==================
>> --- head/sys/powerpc/powernv/platform_powernv.c Mon Jan 29 09:24:28
>> 2018        (r328536)
>> +++ head/sys/powerpc/powernv/platform_powernv.c Mon Jan 29 09:27:02
>> 2018        (r328537)
>> @@ -128,6 +128,7 @@ powernv_attach(platform_t plat)
>>         pcell_t prop;
>>         phandle_t cpu;
>>         int res, len, node, idx;
>> +       register_t msr;
>>         /* Ping OPAL again just to make sure */
>>         opal_check();
>> @@ -141,6 +142,19 @@ powernv_attach(platform_t plat)
>>         cpu_idle_hook = powernv_cpu_idle;
>>         powernv_boot_pir = mfspr(SPR_PIR);
>>   +     /* LPID must not be altered when PSL_DR or PSL_IR is set */
>> +       msr = mfmsr();
>> +       mtmsr(msr & ~(PSL_DR | PSL_IR));
>> +
>> +       /* Direct interrupts to SRR instead of HSRR and reset LPCR
>> otherwise */
>> +       mtspr(SPR_LPID, 0);
>> +       isync();
>> +
>> +       mtmsr(msr);
>> +
>> +       mtspr(SPR_LPCR, LPCR_LPES);
>> +       isync();
>> +
>>         /* Init CPU bits */
>>         powernv_smp_ap_init(plat);
>>   @@ -444,21 +458,6 @@ powernv_reset(platform_t platform)
>>   static void
>>   powernv_smp_ap_init(platform_t platform)
>>   {
>> -       register_t msr;
>> -
>> -       /* LPID must not be altered when PSL_DR or PSL_IR is set */
>> -       msr = mfmsr();
>> -       mtmsr(msr & ~(PSL_DR | PSL_IR));
>> -
>> -       isync();
>> -       /* Direct interrupts to SRR instead of HSRR and reset LPCR
>> otherwise */
>> -       mtspr(SPR_LPID, 0);
>> -       isync();
>> -
>> -       mtmsr(msr);
>> -
>> -       mtspr(SPR_LPCR, LPCR_LPES);
>> -       isync();
>>   }
>>     static void
>>
>>
>


More information about the svn-src-all mailing list