From 1f0e85dcbd742829f1bf7455b589b4110025928e Mon Sep 17 00:00:00 2001 From: jruoho Date: Sat, 14 Aug 2010 05:13:20 +0000 Subject: [PATCH] Move the PIIX4-quirk to the MD file and disable T-states for PIIX4. --- sys/arch/x86/acpi/acpi_cpu_md.c | 38 +++++++++++++++-- sys/dev/acpi/acpi_cpu.h | 15 +++---- sys/dev/acpi/acpi_cpu_cstate.c | 72 +++++++++++---------------------- sys/dev/acpi/acpi_cpu_tstate.c | 10 ++++- 4 files changed, 74 insertions(+), 61 deletions(-) diff --git a/sys/arch/x86/acpi/acpi_cpu_md.c b/sys/arch/x86/acpi/acpi_cpu_md.c index 6103b1542ca9..651ad3ab3a45 100644 --- a/sys/arch/x86/acpi/acpi_cpu_md.c +++ b/sys/arch/x86/acpi/acpi_cpu_md.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_md.c,v 1.11 2010/08/13 18:44:24 jruoho Exp $ */ +/* $NetBSD: acpi_cpu_md.c,v 1.12 2010/08/14 05:13:20 jruoho Exp $ */ /*- * Copyright (c) 2010 Jukka Ruohonen @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.11 2010/08/13 18:44:24 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.12 2010/08/14 05:13:20 jruoho Exp $"); #include #include @@ -45,10 +45,14 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.11 2010/08/13 18:44:24 jruoho Exp #include #include +#include +#include + static char native_idle_text[16]; void (*native_idle)(void) = NULL; void (*native_cpu_freq_init)(int) = NULL; +static int acpicpu_md_quirks_piix4(struct pci_attach_args *); static int acpicpu_md_pstate_sysctl_get(SYSCTLFN_PROTO); static int acpicpu_md_pstate_sysctl_set(SYSCTLFN_PROTO); static int acpicpu_md_pstate_sysctl_all(SYSCTLFN_PROTO); @@ -94,6 +98,7 @@ uint32_t acpicpu_md_quirks(void) { struct cpu_info *ci = curcpu(); + struct pci_attach_args pa; uint32_t val = 0; if (acpicpu_md_cpus_running() == 1) @@ -106,14 +111,14 @@ acpicpu_md_quirks(void) case CPUVENDOR_INTEL: - val |= ACPICPU_FLAG_C_BM | ACPICPU_FLAG_C_ARB; - if ((ci->ci_feat_val[1] & CPUID2_EST) != 0) val |= ACPICPU_FLAG_P_FFH; if ((ci->ci_feat_val[0] & CPUID_ACPI) != 0) val |= ACPICPU_FLAG_T_FFH; + val |= ACPICPU_FLAG_C_BM | ACPICPU_FLAG_C_ARB; + /* * Bus master arbitration is not * needed on some recent Intel CPUs. @@ -135,9 +140,34 @@ acpicpu_md_quirks(void) break; } + /* + * There are several erratums for PIIX4. + */ + if (pci_find_device(&pa, acpicpu_md_quirks_piix4) != 0) + val |= ACPICPU_FLAG_PIIX4; + return val; } +static int +acpicpu_md_quirks_piix4(struct pci_attach_args *pa) +{ + + /* + * XXX: The pci_find_device(9) function only + * deals with attached devices. Change this + * to use something like pci_device_foreach(). + */ + if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL) + return 0; + + if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82371AB_ISA || + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82440MX_PMC) + return 1; + + return 0; +} + uint32_t acpicpu_md_cpus_running(void) { diff --git a/sys/dev/acpi/acpi_cpu.h b/sys/dev/acpi/acpi_cpu.h index d121d14043c8..32290716cad5 100644 --- a/sys/dev/acpi/acpi_cpu.h +++ b/sys/dev/acpi/acpi_cpu.h @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu.h,v 1.14 2010/08/13 16:21:50 jruoho Exp $ */ +/* $NetBSD: acpi_cpu.h,v 1.15 2010/08/14 05:13:21 jruoho Exp $ */ /*- * Copyright (c) 2010 Jukka Ruohonen @@ -93,12 +93,13 @@ #define ACPICPU_FLAG_P __BIT(1) /* P-states supported */ #define ACPICPU_FLAG_T __BIT(2) /* T-states supported */ -#define ACPICPU_FLAG_C_FFH __BIT(3) /* Native C-states */ -#define ACPICPU_FLAG_C_FADT __BIT(4) /* C-states with FADT */ -#define ACPICPU_FLAG_C_BM __BIT(5) /* Bus master control */ -#define ACPICPU_FLAG_C_BM_STS __BIT(6) /* Bus master check required */ -#define ACPICPU_FLAG_C_ARB __BIT(7) /* Bus master arbitration */ -#define ACPICPU_FLAG_C_NOC3 __BIT(8) /* C3 disabled (quirk) */ +#define ACPICPU_FLAG_PIIX4 __BIT(3) /* Broken (quirk) */ + +#define ACPICPU_FLAG_C_FFH __BIT(4) /* Native C-states */ +#define ACPICPU_FLAG_C_FADT __BIT(5) /* C-states with FADT */ +#define ACPICPU_FLAG_C_BM __BIT(6) /* Bus master control */ +#define ACPICPU_FLAG_C_BM_STS __BIT(7) /* Bus master check required */ +#define ACPICPU_FLAG_C_ARB __BIT(8) /* Bus master arbitration */ #define ACPICPU_FLAG_C_C1E __BIT(9) /* AMD C1E detected */ #define ACPICPU_FLAG_P_FFH __BIT(10) /* Native P-states */ diff --git a/sys/dev/acpi/acpi_cpu_cstate.c b/sys/dev/acpi/acpi_cpu_cstate.c index f693bcd773f4..6f4f27552e9c 100644 --- a/sys/dev/acpi/acpi_cpu_cstate.c +++ b/sys/dev/acpi/acpi_cpu_cstate.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_cstate.c,v 1.24 2010/08/13 16:21:50 jruoho Exp $ */ +/* $NetBSD: acpi_cpu_cstate.c,v 1.25 2010/08/14 05:13:21 jruoho Exp $ */ /*- * Copyright (c) 2010 Jukka Ruohonen @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.24 2010/08/13 16:21:50 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.25 2010/08/14 05:13:21 jruoho Exp $"); #include #include @@ -38,9 +38,6 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.24 2010/08/13 16:21:50 jruoho #include #include -#include -#include - #include #include #include @@ -61,7 +58,6 @@ static void acpicpu_cstate_cst_bios(void); static void acpicpu_cstate_memset(struct acpicpu_softc *); static void acpicpu_cstate_fadt(struct acpicpu_softc *); static void acpicpu_cstate_quirks(struct acpicpu_softc *); -static int acpicpu_cstate_quirks_piix4(struct pci_attach_args *); static int acpicpu_cstate_latency(struct acpicpu_softc *); static bool acpicpu_cstate_bm_check(void); static void acpicpu_cstate_idle_enter(struct acpicpu_softc *,int); @@ -596,60 +592,40 @@ acpicpu_cstate_quirks(struct acpicpu_softc *sc) { const uint32_t reg = AcpiGbl_FADT.Pm2ControlBlock; const uint32_t len = AcpiGbl_FADT.Pm2ControlLength; - struct pci_attach_args pa; + + /* + * Disable C3 for PIIX4. + */ + if ((sc->sc_flags & ACPICPU_FLAG_PIIX4) != 0) { + sc->sc_cstate[ACPI_STATE_C3].cs_method = 0; + return; + } /* * Check bus master arbitration. If ARB_DIS * is not available, processor caches must be * flushed before C3 (ACPI 4.0, section 8.2). */ - if (reg != 0 && len != 0) + if (reg != 0 && len != 0) { sc->sc_flags |= ACPICPU_FLAG_C_ARB; - else { - /* - * Disable C3 entirely if WBINVD is not present. - */ - if ((AcpiGbl_FADT.Flags & ACPI_FADT_WBINVD) == 0) - sc->sc_flags |= ACPICPU_FLAG_C_NOC3; - else { - /* - * If WBINVD is present and functioning properly, - * flush all processor caches before entering C3. - */ - if ((AcpiGbl_FADT.Flags & ACPI_FADT_WBINVD_FLUSH) == 0) - sc->sc_flags &= ~ACPICPU_FLAG_C_BM; - else - sc->sc_flags |= ACPICPU_FLAG_C_NOC3; - } + return; } /* - * There are several erratums for PIIX4. + * Disable C3 entirely if WBINVD is not present. */ - if (pci_find_device(&pa, acpicpu_cstate_quirks_piix4) != 0) - sc->sc_flags |= ACPICPU_FLAG_C_NOC3; - - if ((sc->sc_flags & ACPICPU_FLAG_C_NOC3) != 0) + if ((AcpiGbl_FADT.Flags & ACPI_FADT_WBINVD) == 0) sc->sc_cstate[ACPI_STATE_C3].cs_method = 0; -} - -static int -acpicpu_cstate_quirks_piix4(struct pci_attach_args *pa) -{ - - /* - * XXX: The pci_find_device(9) function only deals with - * attached devices. Change this to use something like - * pci_device_foreach(), and implement it for IA-64. - */ - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL) - return 0; - - if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82371AB_ISA || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82440MX_PMC) - return 1; - - return 0; + else { + /* + * If WBINVD is present and functioning properly, + * flush all processor caches before entering C3. + */ + if ((AcpiGbl_FADT.Flags & ACPI_FADT_WBINVD_FLUSH) == 0) + sc->sc_flags &= ~ACPICPU_FLAG_C_BM; + else + sc->sc_cstate[ACPI_STATE_C3].cs_method = 0; + } } static int diff --git a/sys/dev/acpi/acpi_cpu_tstate.c b/sys/dev/acpi/acpi_cpu_tstate.c index 3b3bb62f6db4..234e6e328127 100644 --- a/sys/dev/acpi/acpi_cpu_tstate.c +++ b/sys/dev/acpi/acpi_cpu_tstate.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_tstate.c,v 1.4 2010/08/13 19:51:54 jruoho Exp $ */ +/* $NetBSD: acpi_cpu_tstate.c,v 1.5 2010/08/14 05:13:21 jruoho Exp $ */ /*- * Copyright (c) 2010 Jukka Ruohonen @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_tstate.c,v 1.4 2010/08/13 19:51:54 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_tstate.c,v 1.5 2010/08/14 05:13:21 jruoho Exp $"); #include #include @@ -59,6 +59,12 @@ acpicpu_tstate_attach(device_t self) const char *str; ACPI_STATUS rv; + /* + * Disable T-states for PIIX4. + */ + if ((sc->sc_flags & ACPICPU_FLAG_PIIX4) != 0) + return; + /* * If either _TSS, _PTC, or _TPC is not * available, we have to resort to FADT.