Author: bdragon
Date: Wed Sep 23 00:03:35 2020
New Revision: 366035
URL: https://svnweb.freebsd.org/changeset/base/366035

Log:
  [PowerPC64LE] Tell the hypervisor to switch interrupts to LE at CHRP attach.
  
  Since we will need to be able to take traps relatively early in the process,
  ensure that the hypervisor changes our ILE for us as soon as we are ready.
  
  Sponsored by: Tag1 Consulting, Inc.

Modified:
  head/sys/powerpc/pseries/phyp-hvcall.h
  head/sys/powerpc/pseries/platform_chrp.c

Modified: head/sys/powerpc/pseries/phyp-hvcall.h
==============================================================================
--- head/sys/powerpc/pseries/phyp-hvcall.h      Tue Sep 22 23:59:02 2020        
(r366034)
+++ head/sys/powerpc/pseries/phyp-hvcall.h      Wed Sep 23 00:03:35 2020        
(r366035)
@@ -170,6 +170,13 @@
 #define H_PP1 (1UL<<(63-62))
 #define H_PP2 (1UL<<(63-63))
 
+/* H_SET_MODE resource identifiers from 14.5.4.3.5. */
+#define        H_SET_MODE_RSRC_CIABR           0x1     /* All versions */
+#define        H_SET_MODE_RSRC_DAWR0           0x2     /* All versions */
+#define        H_SET_MODE_RSRC_INTR_TRANS_MODE 0x3     /* All versions */
+#define        H_SET_MODE_RSRC_ILE             0x4     /* PAPR 2.8 / ISA 2.07 
*/
+#define        H_SET_MODE_RSRC_DAWR1           0x5     /* ISA 3.1 Future 
support */
+
 /* pSeries hypervisor opcodes. */
 #define H_REMOVE               0x04
 #define H_ENTER                        0x08

Modified: head/sys/powerpc/pseries/platform_chrp.c
==============================================================================
--- head/sys/powerpc/pseries/platform_chrp.c    Tue Sep 22 23:59:02 2020        
(r366034)
+++ head/sys/powerpc/pseries/platform_chrp.c    Wed Sep 23 00:03:35 2020        
(r366035)
@@ -136,6 +136,9 @@ chrp_attach(platform_t plat)
        int quiesce;
 #ifdef __powerpc64__
        int i;
+#if BYTE_ORDER == LITTLE_ENDIAN
+       int result;
+#endif
 
        /* XXX: check for /rtas/ibm,hypertas-functions? */
        if (!(mfmsr() & PSL_HV)) {
@@ -171,6 +174,24 @@ chrp_attach(platform_t plat)
 
                /* Set up hypervisor CPU stuff */
                chrp_smp_ap_init(plat);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+               /*
+                * Ask the hypervisor to update the LPAR ILE bit.
+                *
+                * This involves all processors reentering the hypervisor
+                * so the change appears simultaneously in all processors.
+                * This can take a long time.
+                */
+               for(;;) {
+                       result = phyp_hcall(H_SET_MODE, 1UL,
+                           H_SET_MODE_RSRC_ILE, 0, 0);
+                       if (result == H_SUCCESS)
+                               break;
+                       DELAY(1000);
+               }
+#endif
+
        }
 #endif
        chrp_cpuref_init();
_______________________________________________
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