Author: jhibbits
Date: Wed Jun 20 13:30:35 2018
New Revision: 335442
URL: https://svnweb.freebsd.org/changeset/base/335442

Log:
  Attach dev.cpu nodes on powerpc SMT cores, using only the first found thread
  
  Summary: In order to use cpufreq(4), a dev.cpu attachment must be created.  If
  the IBM property is found denoting SMT, attach only to the first thread setup,
  so that a cpufreq device can bind.
  
  Reviewed by:  nwhitehorn
  Differential Revision: https://reviews.freebsd.org/D15921

Modified:
  head/sys/dev/ofw/ofw_cpu.c

Modified: head/sys/dev/ofw/ofw_cpu.c
==============================================================================
--- head/sys/dev/ofw/ofw_cpu.c  Wed Jun 20 11:42:06 2018        (r335441)
+++ head/sys/dev/ofw/ofw_cpu.c  Wed Jun 20 13:30:35 2018        (r335442)
@@ -191,10 +191,6 @@ ofw_cpu_probe(device_t dev)
        if (type == NULL || strcmp(type, "cpu") != 0)
                return (ENXIO);
 
-       /* Skip SMT CPUs, which we can't reasonably represent with this code */
-       if (OF_hasprop(ofw_bus_get_node(dev), "ibm,ppc-interrupt-server#s"))
-               return (ENXIO);
-
        device_set_desc(dev, "Open Firmware CPU");
        return (0);
 }
@@ -233,6 +229,43 @@ ofw_cpu_attach(device_t dev)
        } else
                sc->sc_reg_valid = true;
 
+#ifdef __powerpc__
+       /*
+        * On powerpc, "interrupt-servers" denotes a SMT CPU.  Look for any
+        * thread on this CPU, and assign that.
+        */
+       if (OF_hasprop(node, "ibm,ppc-interrupt-server#s")) {
+               struct cpuref cpuref;
+               cell_t *servers;
+               int i, nservers, rv;
+               
+               if ((nservers = OF_getencprop_alloc(node, 
+                   "ibm,ppc-interrupt-server#s", (void **)&servers)) < 0)
+                       return (ENXIO);
+               nservers /= sizeof(cell_t);
+               for (i = 0; i < nservers; i++) {
+                       for (rv = platform_smp_first_cpu(&cpuref); rv == 0;
+                           rv = platform_smp_next_cpu(&cpuref)) {
+                               if (cpuref.cr_hwref == servers[i]) {
+                                       sc->sc_cpu_pcpu =
+                                           pcpu_find(cpuref.cr_cpuid);
+                                       if (sc->sc_cpu_pcpu == NULL) {
+                                               OF_prop_free(servers);
+                                               return (ENXIO);
+                                       }
+                                       break;
+                               }
+                       }
+                       if (rv != ENOENT)
+                               break;
+               }
+               OF_prop_free(servers);
+               if (sc->sc_cpu_pcpu == NULL) {
+                       device_printf(dev, "No CPU found for this device.\n");
+                       return (ENXIO);
+               }
+       } else
+#endif
        sc->sc_cpu_pcpu = pcpu_find(device_get_unit(dev));
 
        if (OF_getencprop(node, "clock-frequency", &cell, sizeof(cell)) < 0) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to