From patchwork Thu Jan 21 05:34:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 1429636 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=fwts-devel-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DLrgD2Tpnz9sW4 for ; Thu, 21 Jan 2021 16:34:32 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1l2Sc0-0007Mw-Vg; Thu, 21 Jan 2021 05:34:28 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1l2Sby-0007Mq-64 for fwts-devel@lists.ubuntu.com; Thu, 21 Jan 2021 05:34:26 +0000 Received: from 1.general.alexhung.us.vpn ([10.172.65.254] helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1l2Sbx-0002rf-E0; Thu, 21 Jan 2021 05:34:25 +0000 From: Alex Hung To: fwts-devel@lists.ubuntu.com Subject: [PATCH] acpi: method: merge and refine _CSD, _PSD and _TSD return tests Date: Wed, 20 Jan 2021 22:34:22 -0700 Message-Id: <20210121053422.190799-1-alex.hung@canonical.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: "fwts-devel" _PSD and _TSD have the same definition are are similar to _CSD Signed-off-by: Alex Hung Acked-by: Colin Ian King Acked-by: Ivan Hu --- src/acpi/method/method.c | 271 +++++++++------------------------------ 1 file changed, 63 insertions(+), 208 deletions(-) diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c index b018b733..9372623f 100644 --- a/src/acpi/method/method.c +++ b/src/acpi/method/method.c @@ -1823,81 +1823,92 @@ static int method_test_CPC(fwts_framework *fw) 0, method_test_CPC_return, NULL); } -static void method_test_CSD_return( +static void method_test_xSD_return( fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private) { - uint32_t i; + char *objname = (char*) private; + uint64_t element_size; bool failed = false; + bool is_csd = false; + uint32_t i; - FWTS_UNUSED(private); + static const fwts_package_element c_elements[] = { + { ACPI_TYPE_INTEGER, "NumEntries" }, + { ACPI_TYPE_INTEGER, "Revision" }, + { ACPI_TYPE_INTEGER, "Domain" }, + { ACPI_TYPE_INTEGER, "CoordType" }, + { ACPI_TYPE_INTEGER, "NumProcessors" }, + { ACPI_TYPE_INTEGER, "Index" }, + }; + + static const fwts_package_element tp_elements[] = { + { ACPI_TYPE_INTEGER, "NumEntries" }, + { ACPI_TYPE_INTEGER, "Revision" }, + { ACPI_TYPE_INTEGER, "Domain" }, + { ACPI_TYPE_INTEGER, "CoordType" }, + { ACPI_TYPE_INTEGER, "NumProcessors" }, + }; if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK) return; - /* Something is really wrong if we don't have any elements in _CSD */ - if (fwts_method_package_count_min(fw, name, obj, 1) != FWTS_OK) + if (objname != NULL && !strncmp("_CSD", objname, strlen("_CSD"))) { + is_csd = true; + element_size = FWTS_ARRAY_SIZE(c_elements); + if (fwts_method_package_count_min(fw, name, obj, 1) != FWTS_OK) + return; + } else { /* for _PSD & _TSD */ + element_size = FWTS_ARRAY_SIZE(tp_elements); + if (fwts_get_acpi_version(fw) >= FWTS_ACPI_VERSION_62) { + if (fwts_method_package_count_equal(fw, name, obj, 1) != FWTS_OK) + return; + } else + if (fwts_method_package_count_min(fw, name, obj, 1) != FWTS_OK) + return; + } + + if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_PACKAGE) != FWTS_OK) return; - /* Could be one or more packages */ for (i = 0; i < obj->Package.Count; i++) { ACPI_OBJECT *pkg; - uint32_t j; - bool elements_ok = true; - - if (fwts_method_package_elements_all_type(fw, name, - obj, ACPI_TYPE_PACKAGE) != FWTS_OK) { - failed = true; - continue; /* Skip processing sub-package */ - } + char tmp[128]; + int elements_ok; pkg = &obj->Package.Elements[i]; - /* - * Currently we expect a package of 6 integers. - */ - if (fwts_method_subpackage_count_equal(fw, name, pkg, i, 6) != FWTS_OK) { - failed = true; - continue; - } - for (j = 0; j < 6; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_CSDSubPackageElementCount", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); - elements_ok = false; - } - } + if (is_csd) + elements_ok = fwts_method_package_elements_type(fw, name, pkg, c_elements); + else + elements_ok = fwts_method_package_elements_type(fw, name, pkg, tp_elements); - if (!elements_ok) { + if (elements_ok != FWTS_OK) { failed = true; continue; } - /* Element 0 must equal the number elements in the package */ - if (pkg->Package.Elements[0].Integer.Value != pkg->Package.Count) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_CSDSubPackageElement0", - "%s sub-package %d element 0 (NumEntries) " - "was expected to have value 0x%" PRIx64 ".", - name, i, - (uint64_t)pkg->Package.Elements[0].Integer.Value); + snprintf(tmp, sizeof(tmp), "Method%sSubPackageElement", objname); + if (pkg->Package.Elements[0].Integer.Value != element_size) { + fwts_failed(fw, LOG_LEVEL_HIGH, + tmp, "%s sub-package %" PRIu32 + " element 0 (NumEntries) " + "was expected to be %" PRIu64 ", " + "got %" PRIu64 " instead.", + name, i, element_size, + pkg->Package.Elements[0].Integer.Value); failed = true; } - /* Element 1 should contain zero */ + if (pkg->Package.Elements[1].Integer.Value != 0) { fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_CSDSubPackageElement1", - "%s sub-package %d element 1 (Revision) " - "was expected to have value 1, instead it " - "was 0x%" PRIx64 ".", - name, i, + tmp, "%s sub-package %" PRIu32 + " element 1 (Revision) " + "was expected to have value 0, instead it " + "was 0x%" PRIx64 ".", name, i, (uint64_t)pkg->Package.Elements[1].Integer.Value); failed = true; } @@ -1906,8 +1917,8 @@ static void method_test_CSD_return( (pkg->Package.Elements[3].Integer.Value != 0xfd) && (pkg->Package.Elements[3].Integer.Value != 0xfe)) { fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_CSDSubPackageElement1", - "%s sub-package %d element 3 (CoordType) " + tmp, "%s sub-package %" PRIu32 + " element 3 (CoordType) " "was expected to have value 0xfc (SW_ALL), " "0xfd (SW_ANY) or 0xfe (HW_ALL), instead it " "was 0x%" PRIx64 ".", @@ -1915,8 +1926,6 @@ static void method_test_CSD_return( (uint64_t)pkg->Package.Elements[3].Integer.Value); failed = true; } - /* Element 4 number of processors, skip check */ - /* Element 5 index, check */ } if (!failed) @@ -1926,7 +1935,7 @@ static void method_test_CSD_return( static int method_test_CSD(fwts_framework *fw) { return method_evaluate_method(fw, METHOD_OPTIONAL, - "_CSD", NULL, 0, method_test_CSD_return, NULL); + "_CSD", NULL, 0, method_test_xSD_return, "_CSD"); } static void method_test_CST_return( @@ -2301,59 +2310,10 @@ static int method_test_PPE(fwts_framework *fw) "_PPE", NULL, 0, fwts_method_test_integer_return, NULL); } -static void method_test_PSD_return( - fwts_framework *fw, - char *name, - ACPI_BUFFER *buf, - ACPI_OBJECT *obj, - void *private) -{ - uint32_t i; - bool failed = false; - - FWTS_UNUSED(private); - - if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK) - return; - - if (fwts_method_package_count_equal(fw, name, obj, 1) != FWTS_OK) - return; - - if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_PACKAGE) != FWTS_OK) - return; - - /* Could be one or more packages */ - for (i = 0; i < obj->Package.Count; i++) { - ACPI_OBJECT *pkg; - uint32_t j; - bool elements_ok = true; - - pkg = &obj->Package.Elements[i]; - if (fwts_method_subpackage_count_equal(fw, name, pkg, i, 5) != FWTS_OK) { - failed = true; - continue; - } - - /* Elements in Sub-packages are integers */ - for (j = 0; j < 5; j++) { - if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) - elements_ok = false; - } - - if (!elements_ok) { - failed = true; - continue; - } - } - - if (!failed) - fwts_method_passed_sane(fw, name, "package"); -} - static int method_test_PSD(fwts_framework *fw) { return method_evaluate_method(fw, METHOD_OPTIONAL, - "_PSD", NULL, 0, method_test_PSD_return, NULL); + "_PSD", NULL, 0, method_test_xSD_return, "_PSD"); } static int method_test_PDL(fwts_framework *fw) @@ -2429,115 +2389,10 @@ static int method_test_TPC(fwts_framework *fw) "_TPC", NULL, 0, fwts_method_test_integer_return, NULL); } -static void method_test_TSD_return( - fwts_framework *fw, - char *name, - ACPI_BUFFER *buf, - ACPI_OBJECT *obj, - void *private) -{ - uint32_t i; - bool failed = false; - - FWTS_UNUSED(private); - - if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK) - return; - - if (fwts_get_acpi_version(fw) >= FWTS_ACPI_VERSION_62) { - if (fwts_method_package_count_equal(fw, name, obj, 1) != FWTS_OK) - return; - } - - /* Could be one or more packages */ - for (i = 0; i < obj->Package.Count; i++) { - ACPI_OBJECT *pkg; - uint32_t j; - bool elements_ok = true; - - if (obj->Package.Elements[i].Type != ACPI_TYPE_PACKAGE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TSDElementType", - "%s package element %" PRIu32 - " was not a package.", name, i); - failed = true; - continue; /* Skip processing sub-package */ - } - - pkg = &obj->Package.Elements[i]; - /* - * Currently we expect a package of 5 integers. - */ - if (fwts_method_subpackage_count_equal(fw, name, pkg, i, 5) != FWTS_OK) { - failed = true; - continue; - } - - for (j = 0; j < 5; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TSDSubPackageElementCount", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", name, i, j); - elements_ok = false; - } - } - - if (!elements_ok) { - failed = true; - continue; - } - - /* Element 0 must equal the number elements in the package */ - if (pkg->Package.Elements[0].Integer.Value != pkg->Package.Count) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TSDSubPackageElement0", - "%s sub-package %" PRIu32 - " element 0 (NumEntries) " - "was expected to have value 0x%" PRIx64 ".", - name, i, - (uint64_t)pkg->Package.Elements[0].Integer.Value); - failed = true; - } - /* Element 1 should contain zero */ - if (pkg->Package.Elements[1].Integer.Value != 0) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TSDSubPackageElement1", - "%s sub-package %" PRIu32 - " element 1 (Revision) " - "was expected to have value 1, instead it " - "was 0x%" PRIx64 ".", - name, i, - (uint64_t)pkg->Package.Elements[1].Integer.Value); - failed = true; - } - /* Element 3 should contain 0xfc..0xfe */ - if ((pkg->Package.Elements[3].Integer.Value != 0xfc) && - (pkg->Package.Elements[3].Integer.Value != 0xfd) && - (pkg->Package.Elements[3].Integer.Value != 0xfe)) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TSDSubPackageElement1", - "%s sub-package %" PRIu32 - " element 3 (CoordType) " - "was expected to have value 0xfc (SW_ALL), " - "0xfd (SW_ANY) or 0xfe (HW_ALL), instead it " - "was 0x%" PRIx64 ".", - name, i, - (uint64_t)pkg->Package.Elements[3].Integer.Value); - failed = true; - } - /* Element 4 number of processors, skip check */ - } - - if (!failed) - fwts_method_passed_sane(fw, name, "package"); -} - static int method_test_TSD(fwts_framework *fw) { return method_evaluate_method(fw, METHOD_OPTIONAL, - "_TSD", NULL, 0, method_test_TSD_return, NULL); + "_TSD", NULL, 0, method_test_xSD_return, "_TSD"); } static void method_test_TSS_return(