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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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();