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>