Module Name: src Committed By: jruoho Date: Tue Jul 27 05:11:33 UTC 2010
Modified Files: src/sys/dev/acpi: acpi_cpu.h acpi_cpu_cstate.c Log Message: Move the GAS definition to the header so it can be shared. Make a basic sanity check before casting to the GAS. Rename the _CSD structure; the optional "cross logical processor dependency information" is almost identical in C, P, and T states. Add some comments to the header. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/acpi/acpi_cpu.h cvs rdiff -u -r1.10 -r1.11 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.h diff -u src/sys/dev/acpi/acpi_cpu.h:1.5 src/sys/dev/acpi/acpi_cpu.h:1.6 --- src/sys/dev/acpi/acpi_cpu.h:1.5 Fri Jul 23 08:11:49 2010 +++ src/sys/dev/acpi/acpi_cpu.h Tue Jul 27 05:11:32 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu.h,v 1.5 2010/07/23 08:11:49 jruoho Exp $ */ +/* $NetBSD: acpi_cpu.h,v 1.6 2010/07/27 05:11:32 jruoho Exp $ */ /*- * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi> @@ -52,11 +52,8 @@ #define ACPICPU_PDC_C_C2C3_FFH __BIT(9) /* SMP C2 and C2 native */ #define ACPICPU_PDC_P_HW __BIT(11) /* Px hardware coordination */ -/* - * See ibid., table 4. - */ -#define ACPICPU_PDC_GAS_HW __BIT(0) /* hw-coordinated state */ -#define ACPICPU_PDC_GAS_BM __BIT(1) /* bus master check required */ +#define ACPICPU_PDC_GAS_HW __BIT(0) /* HW-coordinated state */ +#define ACPICPU_PDC_GAS_BM __BIT(1) /* Bus master check required */ /* * Notify values. @@ -71,25 +68,32 @@ #define ACPICPU_C_C2_LATENCY_MAX 100 /* us */ #define ACPICPU_C_C3_LATENCY_MAX 1000 /* us */ -#define ACPICPU_C_CSD_SW_ALL 0xFC -#define ACPICPU_C_CSD_SW_ANY 0xFD -#define ACPICPU_C_CSD_HW_ALL 0xFE - #define ACPICPU_C_STATE_HALT 0x01 #define ACPICPU_C_STATE_FFH 0x02 #define ACPICPU_C_STATE_SYSIO 0x03 -#define ACPICPU_FLAG_C __BIT(0) -#define ACPICPU_FLAG_P __BIT(1) -#define ACPICPU_FLAG_T __BIT(2) -#define ACPICPU_FLAG_C_CST __BIT(3) -#define ACPICPU_FLAG_C_FADT __BIT(4) -#define ACPICPU_FLAG_C_BM __BIT(5) -#define ACPICPU_FLAG_C_BM_STS __BIT(6) -#define ACPICPU_FLAG_C_ARB __BIT(7) -#define ACPICPU_FLAG_C_NOC3 __BIT(8) -#define ACPICPU_FLAG_C_MWAIT __BIT(9) -#define ACPICPU_FLAG_C_C1E __BIT(10) +/* + * Cross-CPU dependency coordination. + */ +#define ACPICPU_DEP_SW_ALL 0xFC +#define ACPICPU_DEP_SW_ANY 0xFD +#define ACPICPU_DEP_HW_ALL 0xFE + +/* + * Flags. + */ +#define ACPICPU_FLAG_C __BIT(0) /* C-states supported */ +#define ACPICPU_FLAG_P __BIT(1) /* P-states supported */ +#define ACPICPU_FLAG_T __BIT(2) /* T-states supported */ + +#define ACPICPU_FLAG_C_CST __BIT(3) /* C-states with _CST */ +#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_C_MWAIT __BIT(9) /* MONITOR/MWAIT supported */ +#define ACPICPU_FLAG_C_C1E __BIT(10) /* AMD C1E detected */ struct acpicpu_cstate { uint64_t cs_stat; @@ -100,11 +104,11 @@ int cs_flags; }; -struct acpicpu_csd { - uint32_t csd_domain; - uint32_t csd_coord; - uint32_t csd_ncpu; - uint32_t csd_index; +struct acpicpu_dep { + uint32_t dep_domain; + uint32_t dep_coord; + uint32_t dep_ncpu; + uint32_t dep_index; }; struct acpicpu_object { @@ -126,6 +130,20 @@ uint32_t sc_flags; }; +/* + * This is AML_RESOURCE_GENERIC_REGISTER, + * included here separately for convenience. + */ +struct acpicpu_reg { + uint8_t reg_desc; + uint16_t reg_reslen; + uint8_t reg_spaceid; + uint8_t reg_bitwidth; + uint8_t reg_bitoffset; + uint8_t reg_accesssize; + uint64_t reg_addr; +} __packed; + void acpicpu_cstate_attach(device_t); int acpicpu_cstate_detach(device_t); int acpicpu_cstate_start(device_t); Index: src/sys/dev/acpi/acpi_cpu_cstate.c diff -u src/sys/dev/acpi/acpi_cpu_cstate.c:1.10 src/sys/dev/acpi/acpi_cpu_cstate.c:1.11 --- src/sys/dev/acpi/acpi_cpu_cstate.c:1.10 Sun Jul 25 17:44:01 2010 +++ src/sys/dev/acpi/acpi_cpu_cstate.c Tue Jul 27 05:11:33 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_cstate.c,v 1.10 2010/07/25 17:44:01 jruoho Exp $ */ +/* $NetBSD: acpi_cpu_cstate.c,v 1.11 2010/07/27 05:11:33 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.10 2010/07/25 17:44:01 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.11 2010/07/27 05:11:33 jruoho Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -49,26 +49,12 @@ #define _COMPONENT ACPI_BUS_COMPONENT ACPI_MODULE_NAME ("acpi_cpu_cstate") -/* - * This is AML_RESOURCE_GENERIC_REGISTER, - * included here separately for convenience. - */ -struct acpicpu_reg { - uint8_t reg_desc; - uint16_t reg_reslen; - uint8_t reg_spaceid; - uint8_t reg_bitwidth; - uint8_t reg_bitoffset; - uint8_t reg_accesssize; - uint64_t reg_addr; -} __packed; - static void acpicpu_cstate_attach_print(struct acpicpu_softc *); static ACPI_STATUS acpicpu_cstate_cst(struct acpicpu_softc *); static ACPI_STATUS acpicpu_cstate_cst_add(struct acpicpu_softc *, ACPI_OBJECT *); static void acpicpu_cstate_cst_bios(void); -static ACPI_STATUS acpicpu_cstate_csd(ACPI_HANDLE, struct acpicpu_csd *); +static ACPI_STATUS acpicpu_cstate_csd(ACPI_HANDLE, struct acpicpu_dep *); 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 *); @@ -121,20 +107,20 @@ acpicpu_cstate_attach_print(struct acpicpu_softc *sc) { struct acpicpu_cstate *cs; - struct acpicpu_csd csd; + struct acpicpu_dep dep; const char *method; ACPI_STATUS rv; int i; - (void)memset(&csd, 0, sizeof(struct acpicpu_csd)); + (void)memset(&dep, 0, sizeof(struct acpicpu_dep)); - rv = acpicpu_cstate_csd(sc->sc_node->ad_handle, &csd); + rv = acpicpu_cstate_csd(sc->sc_node->ad_handle, &dep); if (ACPI_SUCCESS(rv)) { aprint_debug_dev(sc->sc_dev, "C%u: _CSD, " "domain 0x%02x / 0x%02x, type 0x%02x\n", - csd.csd_index, csd.csd_domain, - csd.csd_ncpu, csd.csd_coord); + dep.dep_index, dep.dep_domain, + dep.dep_ncpu, dep.dep_coord); } aprint_debug_dev(sc->sc_dev, "Cx: %5s", @@ -409,6 +395,13 @@ goto out; } + CTASSERT(sizeof(struct acpicpu_reg) == 15); + + if (obj->Buffer.Length < sizeof(struct acpicpu_reg)) { + rv = AE_LIMIT; + goto out; + } + reg = (struct acpicpu_reg *)obj->Buffer.Pointer; switch (reg->reg_spaceid) { @@ -512,7 +505,7 @@ } static ACPI_STATUS -acpicpu_cstate_csd(ACPI_HANDLE hdl, struct acpicpu_csd *csd) +acpicpu_cstate_csd(ACPI_HANDLE hdl, struct acpicpu_dep *dep) { ACPI_OBJECT *elm, *obj; ACPI_BUFFER buf; @@ -558,10 +551,10 @@ goto out; } - csd->csd_domain = elm[2].Integer.Value; - csd->csd_coord = elm[3].Integer.Value; - csd->csd_ncpu = elm[4].Integer.Value; - csd->csd_index = elm[5].Integer.Value; + dep->dep_domain = elm[2].Integer.Value; + dep->dep_coord = elm[3].Integer.Value; + dep->dep_ncpu = elm[4].Integer.Value; + dep->dep_index = elm[5].Integer.Value; out: if (buf.Pointer != NULL)