Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 04 Feb 2010 21:42:47 +0200
From:      Andriy Gapon <avg@icyb.net.ua>
To:        freebsd-acpi@FreeBSD.org
Cc:        Rui Paulo <rpaulo@FreeBSD.org>, John Baldwin <jhb@FreeBSD.org>
Subject:   Re: acpi_cpu: _PDC vs _OSC
Message-ID:  <4B6B2337.8070404@icyb.net.ua>
In-Reply-To: <4B69E0BA.4080104@root.org>
References:  <4B698DD8.4010404@icyb.net.ua> <4B69E0BA.4080104@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help

Below is the patch that I have.
_PDC is evaluated only if _OSC evaluation fails.
_OSC status returned by AML is reported if not zero.
Small changes in comments.

BTW, 'if (sc->cpu_features)' check could probably be dropped, because we
initialize cpu_features with non-zero value and then only bit-or to it.

Index: sys/dev/acpica/acpi_cpu.c
===================================================================
--- sys/dev/acpica/acpi_cpu.c	(revision 203497)
+++ sys/dev/acpica/acpi_cpu.c	(working copy)
@@ -345,26 +345,13 @@
     }

     /*
-     * CPU capabilities are specified as a buffer of 32-bit integers:
-     * revision, count, and one or more capabilities.  The revision of
-     * "1" is not specified anywhere but seems to match Linux.
+     * CPU capabilities are specified in
+     * Intel Processor Vendor-Specific ACPI Interface Specification.
      */
     if (sc->cpu_features) {
-	arglist.Pointer = arg;
-	arglist.Count = 1;
-	arg[0].Type = ACPI_TYPE_BUFFER;
-	arg[0].Buffer.Length = sizeof(cap_set);
-	arg[0].Buffer.Pointer = (uint8_t *)cap_set;
-	cap_set[0] = 1; /* revision */
-	cap_set[1] = 1; /* number of capabilities integers */
-	cap_set[2] = sc->cpu_features;
-	AcpiEvaluateObject(sc->cpu_handle, "_PDC", &arglist, NULL);
-
 	/*
-	 * On some systems we need to evaluate _OSC so that the ASL
-	 * loads the _PSS and/or _PDC methods at runtime.
-	 *
-	 * TODO: evaluate failure of _OSC.
+	 * On some systems evaluation of _OSC/_PDC dynamically
+	 * loads the _PSS and other methods.
 	 */
 	arglist.Pointer = arg;
 	arglist.Count = 4;
@@ -380,7 +367,22 @@
 	arg[3].Buffer.Pointer = (uint8_t *)cap_set;
 	cap_set[0] = 0;				/* status */
 	cap_set[1] = sc->cpu_features;
-	AcpiEvaluateObject(sc->cpu_handle, "_OSC", &arglist, NULL);
+	status = AcpiEvaluateObject(sc->cpu_handle, "_OSC", &arglist, NULL);
+	if (ACPI_SUCCESS(status)) {
+	    if (cap_set[0] != 0)
+		device_printf(dev, "_OSC returned status %#x\n", cap_set[0]);
+	}
+	else {
+	    arglist.Pointer = arg;
+	    arglist.Count = 1;
+	    arg[0].Type = ACPI_TYPE_BUFFER;
+	    arg[0].Buffer.Length = sizeof(cap_set);
+	    arg[0].Buffer.Pointer = (uint8_t *)cap_set;
+	    cap_set[0] = 1; /* revision */
+	    cap_set[1] = 1; /* number of capabilities integers */
+	    cap_set[2] = sc->cpu_features;
+	    AcpiEvaluateObject(sc->cpu_handle, "_PDC", &arglist, NULL);
+	}
     }

     /* Probe for Cx state support. */


-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4B6B2337.8070404>