Author: jhibbits
Date: Thu Oct 10 03:35:30 2013
New Revision: 256250
URL: http://svnweb.freebsd.org/changeset/base/256250

Log:
  MFC r252115,255378
  
  Cache the Open Firmware CPU properties at attach time, so we don't always
  enter it at runtime to get static data.

Modified:
  stable/9/sys/powerpc/ofw/ofw_cpu.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/powerpc/ofw/ofw_cpu.c
==============================================================================
--- stable/9/sys/powerpc/ofw/ofw_cpu.c  Thu Oct 10 01:20:18 2013        
(r256249)
+++ stable/9/sys/powerpc/ofw/ofw_cpu.c  Thu Oct 10 03:35:30 2013        
(r256250)
@@ -133,6 +133,11 @@ static int ofw_cpu_attach(device_t);
 static int     ofw_cpu_read_ivar(device_t dev, device_t child, int index,
     uintptr_t *result);
 
+struct ofw_cpu_softc {
+       struct pcpu     *sc_cpu_pcpu;
+       uint32_t         sc_nominal_mhz;
+};
+
 static device_method_t ofw_cpu_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         ofw_cpu_probe),
@@ -153,7 +158,7 @@ static device_method_t ofw_cpu_methods[]
 static driver_t ofw_cpu_driver = {
        "cpu",
        ofw_cpu_methods,
-       0
+       sizeof(struct ofw_cpu_softc)
 };
 
 static devclass_t ofw_cpu_devclass;
@@ -175,6 +180,15 @@ ofw_cpu_probe(device_t dev)
 static int
 ofw_cpu_attach(device_t dev)
 {
+       struct ofw_cpu_softc *sc;
+       uint32_t cell;
+
+       sc = device_get_softc(dev);
+       OF_getprop(ofw_bus_get_node(dev), "reg", &cell, sizeof(cell));
+       sc->sc_cpu_pcpu = pcpu_find(cell);
+       OF_getprop(ofw_bus_get_node(dev), "clock-frequency", &cell, 
sizeof(cell));
+       sc->sc_nominal_mhz = cell / 1000000; /* convert to MHz */
+
        bus_generic_probe(dev);
        return (bus_generic_attach(dev));
 }
@@ -182,19 +196,16 @@ ofw_cpu_attach(device_t dev)
 static int
 ofw_cpu_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
 {
-       uint32_t cell;
+       struct ofw_cpu_softc *sc;
+
+       sc = device_get_softc(dev);
 
        switch (index) {
        case CPU_IVAR_PCPU:
-               OF_getprop(ofw_bus_get_node(dev), "reg", &cell, sizeof(cell));
-               *result = (uintptr_t)(pcpu_find(cell));
+               *result = (uintptr_t)sc->sc_cpu_pcpu;
                return (0);
        case CPU_IVAR_NOMINAL_MHZ:
-               cell = 0;
-               OF_getprop(ofw_bus_get_node(dev), "clock-frequency",
-                   &cell, sizeof(cell));
-               cell /= 1000000; /* convert to MHz */
-               *result = (uintptr_t)(cell);
+               *result = (uintptr_t)sc->sc_nominal_mhz;
                return (0);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to