Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Feb 2015 12:47:49 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r278998 - in head/sys: dev/ofw sys
Message-ID:  <201502191247.t1JClnx7051034@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Thu Feb 19 12:47:48 2015
New Revision: 278998
URL: https://svnweb.freebsd.org/changeset/base/278998

Log:
  Add support to get the cpu ID from its device driver in a generic way.
  This will be needed by arm64 to find the value to pass to the psci (Power
  State Coordination Interface) driver, among other things, used to enable
  cores.
  
  Differential Revision:	https://reviews.freebsd.org/D1824
  Reviewed by:	imp
  Sponsored by:	The FreeBSD Foundation

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

Modified: head/sys/dev/ofw/ofw_cpu.c
==============================================================================
--- head/sys/dev/ofw/ofw_cpu.c	Thu Feb 19 12:20:21 2015	(r278997)
+++ head/sys/dev/ofw/ofw_cpu.c	Thu Feb 19 12:47:48 2015	(r278998)
@@ -244,6 +244,7 @@ ofw_cpu_attach(device_t dev)
 static int
 ofw_cpu_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
 {
+	struct ofw_cpulist_softc *psc;
 	struct ofw_cpu_softc *sc;
 
 	sc = device_get_softc(dev);
@@ -258,6 +259,16 @@ ofw_cpu_read_ivar(device_t dev, device_t
 			return (0);
 		}
 		break;
+	case CPU_IVAR_CPUID_SIZE:
+		psc = device_get_softc(device_get_parent(dev));
+		*result = psc->sc_addr_cells;
+		return (0);
+	case CPU_IVAR_CPUID:
+		if (sc->sc_reg_valid) {
+			*result = (uintptr_t)sc->sc_reg;
+			return (0);
+		}
+		break;
 	}
 
 	return (ENOENT);

Modified: head/sys/sys/cpu.h
==============================================================================
--- head/sys/sys/cpu.h	Thu Feb 19 12:20:21 2015	(r278997)
+++ head/sys/sys/cpu.h	Thu Feb 19 12:47:48 2015	(r278998)
@@ -37,6 +37,8 @@
 
 #define CPU_IVAR_PCPU		1
 #define CPU_IVAR_NOMINAL_MHZ	2
+#define CPU_IVAR_CPUID_SIZE	3
+#define CPU_IVAR_CPUID		4
 
 static __inline struct pcpu *cpu_get_pcpu(device_t dev)
 {
@@ -54,6 +56,20 @@ static __inline int32_t cpu_get_nominal_
 	return ((int32_t)v);
 }
 
+static __inline const uint32_t *cpu_get_cpuid(device_t dev, size_t *count)
+{
+	uintptr_t v = 0;
+	if (BUS_READ_IVAR(device_get_parent(dev), dev,
+	    CPU_IVAR_CPUID_SIZE, &v) != 0)
+		return (NULL);
+	*count = (size_t)v;
+
+	if (BUS_READ_IVAR(device_get_parent(dev), dev,
+	    CPU_IVAR_CPUID, &v) != 0)
+		return (NULL);
+	return ((const uint32_t *)v);
+}
+
 /*
  * CPU frequency control interface.
  */



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