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)

Reply via email to