Module Name: src Committed By: jruoho Date: Sun Jul 25 17:44:01 UTC 2010
Modified Files: src/sys/dev/acpi: acpi_cpu.c acpi_cpu_cstate.c Log Message: Improve comments. Move the #ifdef around. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/dev/acpi/acpi_cpu.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/acpi/acpi_cpu_cstate.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/dev/acpi/acpi_cpu.c diff -u src/sys/dev/acpi/acpi_cpu.c:1.6 src/sys/dev/acpi/acpi_cpu.c:1.7 --- src/sys/dev/acpi/acpi_cpu.c:1.6 Sat Jul 24 22:44:00 2010 +++ src/sys/dev/acpi/acpi_cpu.c Sun Jul 25 17:44:01 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu.c,v 1.6 2010/07/24 22:44:00 jruoho Exp $ */ +/* $NetBSD: acpi_cpu.c,v 1.7 2010/07/25 17:44:01 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.c,v 1.6 2010/07/24 22:44:00 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu.c,v 1.7 2010/07/25 17:44:01 jruoho Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -141,10 +141,7 @@ /* * We should claim the bus space. However, we do this only - * to announce that the space is in use. This is unnecessary - * if system I/O type C-states are not used. Many systems also - * report invalid values in the processor object. Finally, this - * is known to conflict with other devices. But as is noted in + * to announce that the space is in use. As is noted in * ichlpcib(4), we can continue our I/O without bus_space(9). */ if (sc->sc_object.ao_pblklen == 6 && sc->sc_object.ao_pblkaddr != 0) { Index: src/sys/dev/acpi/acpi_cpu_cstate.c diff -u src/sys/dev/acpi/acpi_cpu_cstate.c:1.9 src/sys/dev/acpi/acpi_cpu_cstate.c:1.10 --- src/sys/dev/acpi/acpi_cpu_cstate.c:1.9 Sat Jul 24 22:44:00 2010 +++ src/sys/dev/acpi/acpi_cpu_cstate.c Sun Jul 25 17:44:01 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_cstate.c,v 1.9 2010/07/24 22:44:00 jruoho Exp $ */ +/* $NetBSD: acpi_cpu_cstate.c,v 1.10 2010/07/25 17:44:01 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_cstate.c,v 1.9 2010/07/24 22:44:00 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.10 2010/07/25 17:44:01 jruoho Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -79,6 +79,16 @@ extern struct acpicpu_softc **acpicpu_sc; extern int acpi_suspended; +/* + * XXX: The local APIC timer (as well as TSC) is typically + * stopped in C3. For now, we cannot but disable C3. + */ +#ifdef ACPICPU_ENABLE_C3 +static int cs_state_max = ACPI_STATE_C3; +#else +static int cs_state_max = ACPI_STATE_C2; +#endif + void acpicpu_cstate_attach(device_t self) { @@ -399,13 +409,6 @@ goto out; } - /* - * "When specifically directed by the CPU manufacturer, the - * system firmware may define an interface as functional - * fixed hardware by supplying a special address space - * identifier, FfixedHW (0x7F), in the address space ID - * field for register definitions (ACPI 3.0, p. 46)". - */ reg = (struct acpicpu_reg *)obj->Buffer.Pointer; switch (reg->reg_spaceid) { @@ -463,6 +466,8 @@ /* * The _CST FFH GAS encoding may contain * additional hints on Intel processors. + * Use these to determine whether we can + * avoid the bus master activity check. */ if ((reg->reg_accesssize & ACPICPU_PDC_GAS_BM) == 0) state.cs_flags &= ~ACPICPU_FLAG_C_BM_STS; @@ -480,19 +485,6 @@ goto out; } -#ifndef ACPICPU_ENABLE_C3 - /* - * XXX: The local APIC timer (as well as TSC) is typically - * stopped in C3, causing the timer interrupt to fire - * haphazardly, depending on how long the system slept. - * For now, we disable the C3 state unconditionally. - */ - if (type == ACPI_STATE_C3) { - sc->sc_flags |= ACPICPU_FLAG_C_NOC3; - goto out; - } -#endif - cs[type].cs_addr = state.cs_addr; cs[type].cs_power = state.cs_power; cs[type].cs_flags = state.cs_flags; @@ -623,11 +615,6 @@ if (AcpiGbl_FADT.C3Latency > ACPICPU_C_C3_LATENCY_MAX) cs[ACPI_STATE_C3].cs_method = 0; - -#ifndef ACPICPU_ENABLE_C3 - cs[ACPI_STATE_C3].cs_method = 0; - sc->sc_flags |= ACPICPU_FLAG_C_NOC3; /* XXX. */ -#endif } static void @@ -638,7 +625,9 @@ struct pci_attach_args pa; /* - * Check bus master arbitration. + * 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) sc->sc_flags |= ACPICPU_FLAG_C_ARB; @@ -650,12 +639,13 @@ sc->sc_flags |= ACPICPU_FLAG_C_NOC3; else { /* - * If WBINVD is present, but not functioning - * properly according to FADT, flush all CPU - * caches before entering the C3 state. + * 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; } } @@ -690,7 +680,7 @@ struct acpicpu_cstate *cs; int i; - for (i = ACPI_STATE_C3; i > 0; i--) { + for (i = cs_state_max; i > 0; i--) { cs = &sc->sc_cstate[i]; @@ -773,8 +763,8 @@ ACPI_FLUSH_CPU_CACHE(); /* - * Some chipsets may not return back to C0 - * from C3 if bus master wake is not enabled. + * Allow the bus master to request that any given + * CPU should return immediately to C0 from C3. */ if ((sc->sc_flags & ACPICPU_FLAG_C_BM) != 0) (void)AcpiWriteBitRegister(ACPI_BITREG_BUS_MASTER_RLD, 1);