Module Name:    src
Committed By:   jruoho
Date:           Wed Aug 18 18:32:21 UTC 2010

Modified Files:
        src/sys/arch/x86/acpi: acpi_cpu_md.c
        src/sys/dev/acpi: acpi_cpu.h acpi_cpu_pstate.c

Log Message:
Use the idea from cegger@ and fill the (X)PSS structure during initialization.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/x86/acpi/acpi_cpu_md.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/acpi/acpi_cpu.h
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/acpi/acpi_cpu_pstate.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/acpi/acpi_cpu_md.c
diff -u src/sys/arch/x86/acpi/acpi_cpu_md.c:1.14 src/sys/arch/x86/acpi/acpi_cpu_md.c:1.15
--- src/sys/arch/x86/acpi/acpi_cpu_md.c:1.14	Wed Aug 18 16:08:50 2010
+++ src/sys/arch/x86/acpi/acpi_cpu_md.c	Wed Aug 18 18:32:20 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_md.c,v 1.14 2010/08/18 16:08:50 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_md.c,v 1.15 2010/08/18 18:32:20 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.14 2010/08/18 16:08:50 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.15 2010/08/18 18:32:20 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -452,33 +452,26 @@
 }
 
 int
-acpicpu_md_pstate_get(struct acpicpu_softc *sc, uint32_t *freq)
+acpicpu_md_pstate_pss(struct acpicpu_softc *sc)
 {
-	struct acpicpu_pstate *ps = NULL;
-	uint64_t val;
-	uint32_t i;
-
-	for (i = 0; i < sc->sc_pstate_count; i++) {
-
-		ps = &sc->sc_pstate[i];
+	struct acpicpu_pstate *ps, msr;
+	uint32_t i = 0;
 
-		if (ps->ps_freq != 0)
-			break;
-	}
-
-	if (__predict_false(ps == NULL))
-		return EINVAL;
+	(void)memset(&msr, 0, sizeof(struct acpicpu_pstate));
 
 	switch (cpu_vendor) {
 
 	case CPUVENDOR_INTEL:
-		ps->ps_status_addr = MSR_PERF_STATUS;
-		ps->ps_status_mask = __BITS(0, 15);
+		msr.ps_control_addr = MSR_PERF_CTL;
+		msr.ps_control_mask = __BITS(0, 15);
+
+		msr.ps_status_addr  = MSR_PERF_STATUS;
+		msr.ps_status_mask  = __BITS(0, 15);
 		break;
 
 	case CPUVENDOR_AMD:
 
-		if ((ps->ps_flags & ACPICPU_FLAG_P_XPSS) == 0)
+		if ((sc->sc_flags & ACPICPU_FLAG_P_XPSS) == 0)
 			return EOPNOTSUPP;
 
 		break;
@@ -487,6 +480,46 @@
 		return ENODEV;
 	}
 
+	while (i < sc->sc_pstate_count) {
+
+		ps = &sc->sc_pstate[i];
+
+		if (ps->ps_status_addr == 0)
+			ps->ps_status_addr = msr.ps_status_addr;
+
+		if (ps->ps_status_mask == 0)
+			ps->ps_status_mask = msr.ps_status_mask;
+
+		if (ps->ps_control_addr == 0)
+			ps->ps_control_addr = msr.ps_control_addr;
+
+		if (ps->ps_control_mask == 0)
+			ps->ps_control_mask = msr.ps_control_mask;
+
+		i++;
+	}
+
+	return 0;
+}
+
+int
+acpicpu_md_pstate_get(struct acpicpu_softc *sc, uint32_t *freq)
+{
+	struct acpicpu_pstate *ps = NULL;
+	uint64_t val;
+	uint32_t i;
+
+	for (i = 0; i < sc->sc_pstate_count; i++) {
+
+		ps = &sc->sc_pstate[i];
+
+		if (ps->ps_freq != 0)
+			break;
+	}
+
+	if (__predict_false(ps == NULL))
+		return EINVAL;
+
 	if (ps->ps_status_addr == 0)
 		return EINVAL;
 
@@ -518,27 +551,6 @@
 	uint64_t xc;
 	int rv = 0;
 
-	switch (cpu_vendor) {
-
-	case CPUVENDOR_INTEL:
-		ps->ps_control_addr = MSR_PERF_CTL;
-		ps->ps_control_mask = __BITS(0, 15);
-
-		ps->ps_status_addr  = MSR_PERF_STATUS;
-		ps->ps_status_mask  = __BITS(0, 15);
-		break;
-
-	case CPUVENDOR_AMD:
-
-		if ((ps->ps_flags & ACPICPU_FLAG_P_XPSS) == 0)
-			return EOPNOTSUPP;
-
-		break;
-
-	default:
-		return ENODEV;
-	}
-
 	msr.msr_read  = false;
 	msr.msr_type  = ps->ps_control_addr;
 	msr.msr_value = ps->ps_control;

Index: src/sys/dev/acpi/acpi_cpu.h
diff -u src/sys/dev/acpi/acpi_cpu.h:1.18 src/sys/dev/acpi/acpi_cpu.h:1.19
--- src/sys/dev/acpi/acpi_cpu.h:1.18	Tue Aug 17 10:17:52 2010
+++ src/sys/dev/acpi/acpi_cpu.h	Wed Aug 18 18:32:20 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu.h,v 1.18 2010/08/17 10:17:52 jruoho Exp $ */
+/* $NetBSD: acpi_cpu.h,v 1.19 2010/08/18 18:32:20 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi>
@@ -241,6 +241,7 @@
 void		acpicpu_md_idle_enter(int, int);
 int		acpicpu_md_pstate_start(void);
 int		acpicpu_md_pstate_stop(void);
+int		acpicpu_md_pstate_pss(struct acpicpu_softc *);
 int		acpicpu_md_pstate_get(struct acpicpu_softc *, uint32_t *);
 int		acpicpu_md_pstate_set(struct acpicpu_pstate *);
 int		acpicpu_md_tstate_get(struct acpicpu_softc *, uint32_t *);

Index: src/sys/dev/acpi/acpi_cpu_pstate.c
diff -u src/sys/dev/acpi/acpi_cpu_pstate.c:1.29 src/sys/dev/acpi/acpi_cpu_pstate.c:1.30
--- src/sys/dev/acpi/acpi_cpu_pstate.c:1.29	Tue Aug 17 10:57:30 2010
+++ src/sys/dev/acpi/acpi_cpu_pstate.c	Wed Aug 18 18:32:20 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_pstate.c,v 1.29 2010/08/17 10:57:30 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_pstate.c,v 1.30 2010/08/18 18:32:20 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_pstate.c,v 1.29 2010/08/17 10:57:30 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_pstate.c,v 1.30 2010/08/18 18:32:20 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/evcnt.h>
@@ -112,6 +112,17 @@
 	if (ACPI_FAILURE(rv))
 		aprint_debug_dev(self, "_PPC missing\n");
 
+	/*
+	 * Employ the XPSS structure by filling
+	 * it with MD information required for FFH.
+	 */
+	rv = acpicpu_md_pstate_pss(sc);
+
+	if (rv != 0) {
+		rv = AE_SUPPORT;
+		goto fail;
+	}
+
 	sc->sc_flags |= ACPICPU_FLAG_P;
 
 	acpicpu_pstate_bios();

Reply via email to