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

Nathan Whitehorn nwhitehorn at freebsd.org
Tue Jan 30 15:53:11 UTC 2018



On 01/30/18 01:04, Wojciech Macek wrote:
> 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.

Hmm, yes. I had forgotten this ran after pmap_cpu_bootstrap(). Thanks 
for the explanation!

> 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?

Let's just add the PSL_HV check. We could add another platform_early() 
method, but I don't see much point in it here.
-Nathan

>
> Regards,
> Wojtek
>
> 2018-01-29 16:46 GMT+01:00 Nathan Whitehorn <nwhitehorn at freebsd.org 
> <mailto: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
>         <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
>         <mailto:pdk at semihalf.com>>
>            Submitted by:          Wojciech Macek <wma at semihalf.com
>         <mailto: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-head mailing list