changeset 4872:d29c11d096f3

6589662 Error messages from cpu_acpi on install boot w/snv_70 6589155 assertion failed: domp, file: ../../common/io/ppm/ppm.c
author mh27603
date Wed, 15 Aug 2007 18:20:22 -0700
parents 617ab0770307
children 015132a02239
files usr/src/uts/i86pc/io/cpu_acpi.c usr/src/uts/i86pc/io/ppm_plat.c usr/src/uts/i86pc/os/cpupm.c
diffstat 3 files changed, 45 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/i86pc/io/cpu_acpi.c	Wed Aug 15 15:11:46 2007 -0700
+++ b/usr/src/uts/i86pc/io/cpu_acpi.c	Wed Aug 15 18:20:22 2007 -0700
@@ -58,7 +58,7 @@
 		if (CPU_ACPI_PSTATES(handle) != NULL)
 			kmem_free(CPU_ACPI_PSTATES(handle),
 			    CPU_ACPI_PSTATES_SIZE(
-				CPU_ACPI_PSTATES_COUNT(handle)));
+			    CPU_ACPI_PSTATES_COUNT(handle)));
 		kmem_free(handle->cs_pstates, sizeof (cpu_acpi_pstates_t));
 	}
 	kmem_free(handle, sizeof (cpu_acpi_state_t));
@@ -98,7 +98,7 @@
 
 	obj = abuf.Pointer;
 	if (obj->Package.Count != 2) {
-		cmn_err(CE_NOTE, "cpu_acpi: _PCT package bad count %d.",
+		cmn_err(CE_NOTE, "!cpu_acpi: _PCT package bad count %d.",
 		    obj->Package.Count);
 		goto out;
 	}
@@ -108,7 +108,7 @@
 	 */
 	for (i = 0; i < obj->Package.Count; i++) {
 		if (obj->Package.Elements[i].Type != ACPI_TYPE_BUFFER) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "Unexpected data in _PCT package.");
 			goto out;
 		}
@@ -117,20 +117,20 @@
 		    obj->Package.Elements[i].Buffer.Pointer;
 		if (greg->DescriptorType !=
 		    ACPI_RESOURCE_NAME_GENERIC_REGISTER) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "_PCT package has format error.");
 			goto out;
 		}
 		if (greg->ResourceLength !=
 		    ACPI_AML_SIZE_LARGE(AML_RESOURCE_GENERIC_REGISTER)) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "_PCT package not right size.");
 			goto out;
 		}
 		if (greg->AddressSpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE &&
 		    greg->AddressSpaceId != ACPI_ADR_SPACE_SYSTEM_IO) {
-			cmn_err(CE_NOTE, "cpu_apci: _PCT contains unsupported "
-				"address space type %x", greg->AddressSpaceId);
+			cmn_err(CE_NOTE, "!cpu_apci: _PCT contains unsupported "
+			    "address space type %x", greg->AddressSpaceId);
 			goto out;
 		}
 	}
@@ -182,19 +182,19 @@
 
 	pkg = abuf.Pointer;
 	if (pkg->Package.Count != 1) {
-		cmn_err(CE_NOTE, "cpu_acpi: _PSD unsupported package "
+		cmn_err(CE_NOTE, "!cpu_acpi: _PSD unsupported package "
 		    "count %d.", pkg->Package.Count);
 		goto out;
 	}
 
 	if (pkg->Package.Elements[0].Type != ACPI_TYPE_PACKAGE ||
 	    pkg->Package.Elements[0].Package.Count != 5) {
-		cmn_err(CE_NOTE, "cpu_acpi: Unexpected data in _PSD package.");
+		cmn_err(CE_NOTE, "!cpu_acpi: Unexpected data in _PSD package.");
 		goto out;
 	}
 	elements = pkg->Package.Elements[0].Package.Elements;
 	if (elements[0].Integer.Value != 5 || elements[1].Integer.Value != 0) {
-		cmn_err(CE_NOTE, "cpu_acpi: Unexpected _PSD revision.");
+		cmn_err(CE_NOTE, "!cpu_acpi: Unexpected _PSD revision.");
 		goto out;
 	}
 	psd = &CPU_ACPI_PSD(handle);
@@ -238,12 +238,12 @@
 	abuf.Pointer = NULL;
 	if (ACPI_FAILURE(AcpiEvaluateObjectTyped(handle->cs_handle, "_PSS",
 	    NULL, &abuf, ACPI_TYPE_PACKAGE))) {
-		cmn_err(CE_NOTE, "cpu_acpi: _PSS package not found.");
+		cmn_err(CE_NOTE, "!cpu_acpi: _PSS package not found.");
 		return (1);
 	}
 	obj = abuf.Pointer;
 	if (obj->Package.Count < 2) {
-		cmn_err(CE_NOTE, "cpu_acpi: _PSS package bad count %d.",
+		cmn_err(CE_NOTE, "!cpu_acpi: _PSS package bad count %d.",
 		    obj->Package.Count);
 		goto out;
 	}
@@ -256,8 +256,8 @@
 	for (i = 0; i < obj->Package.Count; i++) {
 		if (obj->Package.Elements[i].Type != ACPI_TYPE_PACKAGE ||
 		    obj->Package.Elements[i].Package.Count !=
-			CPU_ACPI_PSS_SIZE) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+		    CPU_ACPI_PSS_SIZE) {
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "Unexpected data in _PSS package.");
 			goto out;
 		}
@@ -265,7 +265,7 @@
 		q = obj->Package.Elements[i].Package.Elements;
 		for (j = 0; j < CPU_ACPI_PSS_SIZE; j++) {
 			if (q[j].Type != ACPI_TYPE_INTEGER) {
-				cmn_err(CE_NOTE, "cpu_acpi: "
+				cmn_err(CE_NOTE, "!cpu_acpi: "
 				    "_PSS element invalid (type)");
 				goto out;
 			}
@@ -290,7 +290,7 @@
 		 * of the end-of-table entries above.
 		 */
 		if (eot) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "Unexpected data in _PSS package after eot.");
 			goto out;
 		}
@@ -299,7 +299,7 @@
 		 * pstates must be defined in order from highest to lowest.
 		 */
 		if (l != NULL && l[0].Integer.Value < q[0].Integer.Value) {
-			cmn_err(CE_NOTE, "cpu_acpi: "
+			cmn_err(CE_NOTE, "!cpu_acpi: "
 			    "_PSS package pstate definitions out of order.");
 			goto out;
 		}
@@ -375,19 +375,19 @@
 cpu_acpi_cache_data(cpu_acpi_handle_t handle)
 {
 	if (cpu_acpi_cache_pct(handle) < 0) {
-		cmn_err(CE_WARN, "cpu_acpi: error parsing _PCT for "
+		cmn_err(CE_WARN, "!cpu_acpi: error parsing _PCT for "
 		    "CPU instance %d", ddi_get_instance(handle->cs_dip));
 		return (-1);
 	}
 
 	if (cpu_acpi_cache_pstates(handle) != 0) {
-		cmn_err(CE_WARN, "cpu_acpi: error parsing _PSS for "
+		cmn_err(CE_WARN, "!cpu_acpi: error parsing _PSS for "
 		    "CPU instance %d", ddi_get_instance(handle->cs_dip));
 		return (-1);
 	}
 
 	if (cpu_acpi_cache_psd(handle) < 0) {
-		cmn_err(CE_WARN, "cpu_acpi: error parsing _PSD for "
+		cmn_err(CE_WARN, "!cpu_acpi: error parsing _PSD for "
 		    "CPU instance %d", ddi_get_instance(handle->cs_dip));
 		return (-1);
 	}
@@ -408,7 +408,7 @@
 	char path[MAXNAMELEN];
 	if (ACPI_FAILURE(AcpiInstallNotifyHandler(handle->cs_handle,
 	    ACPI_DEVICE_NOTIFY, handler, dip)))
-		cmn_err(CE_NOTE, "cpu_acpi: Unable to register _PPC "
+		cmn_err(CE_NOTE, "!cpu_acpi: Unable to register _PPC "
 		    "notify handler for %s", ddi_pathname(dip, path));
 }
 
@@ -459,7 +459,7 @@
 {
 	if (ACPI_FAILURE(AcpiOsWritePort(address, value, width))) {
 		cmn_err(CE_NOTE, "cpu_acpi: error writing system IO port "
-			"%lx.", (long)address);
+		    "%lx.", (long)address);
 		return (-1);
 	}
 	return (0);
@@ -473,7 +473,7 @@
 {
 	if (ACPI_FAILURE(AcpiOsReadPort(address, value, width))) {
 		cmn_err(CE_NOTE, "cpu_acpi: error reading system IO port "
-			"%lx.", (long)address);
+		    "%lx.", (long)address);
 		return (-1);
 	}
 	return (0);
--- a/usr/src/uts/i86pc/io/ppm_plat.c	Wed Aug 15 15:11:46 2007 -0700
+++ b/usr/src/uts/i86pc/io/ppm_plat.c	Wed Aug 15 18:20:22 2007 -0700
@@ -97,13 +97,12 @@
 	/*
 	 * Get the CPU dependencies as determined by the CPU driver. If
 	 * the CPU driver didn't create a valid set of dependencies, then
-	 * default to all CPUs in one domain.
+	 * leave the domain as it is (which is unmanageable since
+	 * PPM_CPU_READY is off).
 	 */
 	dep = cpupm_get_cpu_dependencies();
 	if (dep == NULL) {
-		cmn_err(CE_WARN, "%s: Could not retrieve CPU dependency info!",
-		    str);
-		domp_old->dflags |= PPMD_CPU_READY;
+		PPMD(D_CPU, ("%s: No CPU dependency info!\n", str));
 		return;
 	}
 
@@ -117,7 +116,7 @@
 		domp = kmem_zalloc(sizeof (*domp), KM_SLEEP);
 		domp->name =  kmem_zalloc(MAXNAMELEN, KM_SLEEP);
 		(void) snprintf(domp->name, MAXNAMELEN, "acpi_cpu_domain_%d",
-			dep_next->cd_dependency_id);
+		    dep_next->cd_dependency_id);
 		mutex_init(&domp->lock, NULL, MUTEX_DRIVER, NULL);
 		mutex_enter(&domp->lock);
 		domp->dflags = domit_p->dflags | PPMD_CPU_READY;
--- a/usr/src/uts/i86pc/os/cpupm.c	Wed Aug 15 15:11:46 2007 -0700
+++ b/usr/src/uts/i86pc/os/cpupm.c	Wed Aug 15 18:20:22 2007 -0700
@@ -85,7 +85,7 @@
 static boolean_t cpupm_enabled = B_TRUE;
 
 /*
- * Until all CPUs have succesfully attached, we do no allow
+ * Until all CPUs have succesfully attached, we do not allow
  * power management.
  */
 static boolean_t cpupm_ready = B_FALSE;
@@ -132,10 +132,9 @@
 	cpupm_cpu_node_t *nptr;
 
 	if (!cpupm_dependencies_valid)
-	    return;
+		return;
 
 	if (cpu_dependency == -1) {
-		cpupm_dependencies_valid = B_FALSE;
 		cpupm_free_cpu_dependencies();
 		return;
 	}
@@ -170,6 +169,7 @@
 	cpupm_cpu_dependency_t *this_dependency, *next_dependency;
 	cpupm_cpu_node_t *this_node, *next_node;
 
+	cpupm_dependencies_valid = B_FALSE;
 	this_dependency = cpupm_cpu_dependencies;
 	while (this_dependency != NULL) {
 		next_dependency = this_dependency->cd_next;
@@ -186,6 +186,7 @@
 		    sizeof (cpupm_cpu_dependency_t));
 		this_dependency = next_dependency;
 	}
+	cpupm_cpu_dependencies = NULL;
 }
 
 /*
@@ -207,6 +208,8 @@
 void
 cpupm_enable(boolean_t enable)
 {
+	if (!enable)
+		cpupm_free_cpu_dependencies();
 	cpupm_enabled = enable;
 }
 
@@ -217,9 +220,21 @@
 void
 cpupm_post_startup()
 {
+	/*
+	 * The CPU domain built by the PPM during CPUs attaching
+	 * should be rebuilt with the information retrieved from
+	 * ACPI.
+	 */
 	if (cpupm_rebuild_cpu_domains != NULL)
 		(*cpupm_rebuild_cpu_domains)();
 
+	/*
+	 * If CPU power management was disabled, then there
+	 * is nothing to do.
+	 */
+	if (!cpupm_enabled)
+		return;
+
 	cpupm_ready = B_TRUE;
 
 	if (cpupm_init_topspeed != NULL)