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 <nwhiteh...@freebsd.org <mailto:nwhiteh...@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 <p...@semihalf.com
        <mailto:p...@semihalf.com>>
           Submitted by:          Wojciech Macek <w...@semihalf.com
        <mailto:w...@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




_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to