[PATCH 2/3] acpi: method: add _PRT test
Alex Hung
alex.hung at canonical.com
Wed Jan 13 14:33:03 UTC 2016
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/acpi/method/method.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 90 insertions(+), 1 deletion(-)
diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index de49eefd..1fb0728 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -163,7 +163,7 @@
* _PRL 10.3.4 Y
* _PRR 7.3.26 Y
* _PRS 6.2.11 Y
- * _PRT 6.2.12 N
+ * _PRT 6.2.12 Y
* _PRW 7.2.11 Y
* _PS0 7.2.2 Y
* _PS1 7.2.3 Y
@@ -2249,6 +2249,94 @@ static int method_test_PRS(fwts_framework *fw)
"_PRS", NULL, 0, method_test_CRS_return, "_PRS");
}
+static void method_test_PRT_return(
+ fwts_framework *fw,
+ char *name,
+ ACPI_BUFFER *buf,
+ ACPI_OBJECT *obj,
+ void *private)
+{
+ uint32_t i, j;
+ bool failed = false;
+
+ FWTS_UNUSED(private);
+
+ if (method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
+ return;
+
+ if (method_package_elements_all_type(fw, name, "_PRT", obj, ACPI_TYPE_PACKAGE) != FWTS_OK)
+ return;
+
+ for (i = 0; i < obj->Package.Count; i++) {
+ ACPI_OBJECT *pkg;
+ ACPI_OBJECT *element;
+ pkg = &obj->Package.Elements[i];
+
+ /* check size of sub-packages */
+ if (pkg->Package.Count != 4) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "Method_PRTSubPackageElementCount",
+ "%s sub-package %" PRIu32 " was expected to have 4"
+ "elements, got %" PRIu32 " elements instead.",
+ name, i, pkg->Package.Count);
+ failed = true;
+ continue;
+ }
+
+ /* check types of sub-packages' elements */
+ for (j = 0; j < 4; j++) {
+ element = &pkg->Package.Elements[j];
+
+ if (j == 2) {
+ if (element->Type != ACPI_TYPE_INTEGER && element->Type != ACPI_TYPE_LOCAL_REFERENCE) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "Method_PRTBadSubElementType",
+ "%s element %" PRIu32 " is not an integer or a NamePath.", name, j);
+ failed = true;
+ }
+ continue;
+ }
+
+ if (element->Type != ACPI_TYPE_INTEGER) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "Method_PRTBadSubElementType",
+ "%s element %" PRIu32 " is not an integer.", name, j);
+ failed = true;
+ }
+ }
+
+ /* check sub-packages's PCI address */
+ element = &pkg->Package.Elements[0];
+ if ((element->Integer.Value & 0xFFFF) != 0xFFFF) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "Method_PRTBadSubElement",
+ "%s element 0 is expected to end with 0xFFFF, got 0x%" PRIx32 ".",
+ name, (uint32_t) element->Integer.Value);
+ failed = true;
+ }
+
+ /* check sub-packages's PCI pin number */
+ element = &pkg->Package.Elements[1];
+ if (element->Integer.Value > 3) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "Method_PRTBadSubElement",
+ "%s element 1 is expected to be 0..3, got 0x%" PRIx32 ".",
+ name, (uint32_t) element->Integer.Value);
+ failed = true;
+ }
+ }
+
+ if (!failed)
+ method_passed_sane(fw, name, "package");
+}
+
+static int method_test_PRT(fwts_framework *fw)
+{
+ /* Re-use the _CRS checking on the returned buffer */
+ return method_evaluate_method(fw, METHOD_OPTIONAL,
+ "_PRT", NULL, 0, method_test_PRT_return, "_PRT");
+}
+
static int method_test_DMA(fwts_framework *fw)
{
return method_evaluate_method(fw, METHOD_OPTIONAL,
@@ -6652,6 +6740,7 @@ static fwts_framework_minor_test method_tests[] = {
/* { method_test_HPX, "Test _HPX (Hot Plug Extensions)." }, */
/* { method_test_MAT, "Test _MAT (Multiple APIC Table Entry)." }, */
{ method_test_PRS, "Test _PRS (Possible Resource Settings)." },
+ { method_test_PRT, "Test _PRT (PCI Routing Table)." },
{ method_test_PXM, "Test _PXM (Proximity)." },
/* { method_test_SLI, "Test _SLI (System Locality Information)." }, */
/* { method_test_SRS, "Test _SRS (Set Resource Settings)." }, */
--
2.5.0
More information about the fwts-devel
mailing list