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();