Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Jun 2013 14:20:54 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r252115 - head/sys/powerpc/ofw
Message-ID:  <201306231420.r5NEKsQg063995@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Sun Jun 23 14:20:54 2013
New Revision: 252115
URL: http://svnweb.freebsd.org/changeset/base/252115

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

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

Modified: head/sys/powerpc/ofw/ofw_cpu.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_cpu.c	Sun Jun 23 13:27:37 2013	(r252114)
+++ head/sys/powerpc/ofw/ofw_cpu.c	Sun Jun 23 14:20:54 2013	(r252115)
@@ -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),
@@ -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);
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306231420.r5NEKsQg063995>