From patchwork Wed Jan 13 20:33:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 1426009 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=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com 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 4DGK0p6GMjz9sVs for ; Thu, 14 Jan 2021 07:34:02 +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 1kzmq6-0002U5-Us; Wed, 13 Jan 2021 20:33:58 +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 1kzmq4-0002Tt-N9 for fwts-devel@lists.ubuntu.com; Wed, 13 Jan 2021 20:33:56 +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 1kzmq4-0000Q2-25; Wed, 13 Jan 2021 20:33:56 +0000 From: Alex Hung To: fwts-devel@lists.ubuntu.com Subject: [PATCH][V3] acpi: method: add a function to check type of sub-package elements Date: Wed, 13 Jan 2021 13:33:53 -0700 Message-Id: <20210113203353.338438-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" The function name is fwts_method_check_element_type Signed-off-by: Alex Hung Acked-by: Colin Ian King Acked-by: Ivan Hu --- src/acpi/method/method.c | 63 +++---------------- src/lib/include/fwts_acpi_object_eval.h | 1 + src/lib/src/fwts_acpi_object_eval.c | 80 +++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 55 deletions(-) diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c index 07916c7f..cf994343 100644 --- a/src/acpi/method/method.c +++ b/src/acpi/method/method.c @@ -698,14 +698,8 @@ static void method_test_DLM_return( continue; } - if (pkg->Package.Elements[0].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_DLMBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element 0 is not a reference.", - name, i); + if (fwts_method_check_element_type(fw, name, pkg, i, 0, ACPI_TYPE_LOCAL_REFERENCE)) failed = true; - } if (pkg->Package.Elements[1].Type != ACPI_TYPE_LOCAL_REFERENCE && pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) { @@ -2371,15 +2365,8 @@ static void method_test_PSD_return( /* Elements in Sub-packages are integers */ for (j = 0; j < 5; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_PSDBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { @@ -4244,15 +4231,8 @@ static void method_test_FPS_return( for (j = 0; j < 5; j++) { /* TODO - field 0 and 1 can be related to other control method */ - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_FPSBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { @@ -4448,27 +4428,14 @@ static void method_test_ART_return( /* First two elements are references, and rests are integers */ for (j = 0; j < 2; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_ARTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "a reference.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) elements_ok = false; - } } for (j = 2; j < 13; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_ARTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } + } if (!elements_ok) { @@ -4525,27 +4492,13 @@ static void method_test_TRT_return( /* First two elements are references, and rests are integers */ for (j = 0; j < 2; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TRTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "a reference.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) elements_ok = false; - } } for (j = 2; j < 8; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TRTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h index 3d611916..472f91a1 100644 --- a/src/lib/include/fwts_acpi_object_eval.h +++ b/src/lib/include/fwts_acpi_object_eval.h @@ -110,6 +110,7 @@ typedef struct { fwts_method_check_type__(fw, name, buf, type, #type) int fwts_method_check_type__(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT_TYPE type, char *type_name); +int fwts_method_check_element_type(fwts_framework *fw, char *name, ACPI_OBJECT *obj, uint32_t subpkg, uint32_t element, ACPI_OBJECT_TYPE type); const char *fwts_method_type_name(const ACPI_OBJECT_TYPE type); void fwts_method_passed_sane(fwts_framework *fw, const char *name, const char *type); void fwts_method_passed_sane_uint64(fwts_framework *fw, const char *name, const uint64_t value); diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c index e822a934..258cca64 100644 --- a/src/lib/src/fwts_acpi_object_eval.c +++ b/src/lib/src/fwts_acpi_object_eval.c @@ -495,6 +495,86 @@ int fwts_method_check_type__( return FWTS_OK; } +/* + * get_object_name() + * get objname from full path nanme + * ex. _BCL from _SB.PCI0.GFX0.LCD0._BCL + */ +static void get_object_name(char *name, char* obj_name) { + /* obj_name must have length of 5 */ + if (name != NULL && strlen(name) > 4) { + memcpy(obj_name, name + strlen(name) - 4, 4); + obj_name[4] = '\0'; + } +} + +/* See references in actypes.h */ +static const char *acpi_object_names[] = { + "Any", + "Integer", + "String", + "Buffer", + "Package", + "Field Unit", + "Device", + "Event", + "Method", + "Mutex", + "Region", + "Power", + "Processor", + "Thermal", + "Buffer Field", + "DDB Handle", + "Debug Object", + "Region Field", + "Bank Field", + "Index Field", + "Reference", + "Alias", + "Method Alias", + "Notify", + "Address Handler", + "Resource", + "Resource Field", + "Scope" +}; + +/* + * fwts_method_check_element_type() + * check a element type of a sub-package + */ +int fwts_method_check_element_type( + fwts_framework *fw, + char *name, + ACPI_OBJECT *obj, + uint32_t subpkg, + uint32_t element, + ACPI_OBJECT_TYPE type) +{ + if (obj->Package.Elements[element].Type != type) { + char obj_name[5] = "_XYZ"; + char tmp[128]; + + get_object_name(name, obj_name); + snprintf(tmp, sizeof(tmp), "Method%sBadSubPackageReturnType", obj_name); + + if (type > FWTS_ARRAY_SIZE(acpi_object_names) - 1) { + fwts_warning(fw, "Unknown ACPI object type detected"); + return FWTS_ERROR; + } + + fwts_failed(fw, LOG_LEVEL_HIGH, tmp, + "%s sub-package %" PRIu32 " element %" PRIu32 " is a %s, " + "expected a %s", name, subpkg, element, + acpi_object_names[obj->Package.Elements[element].Type], + acpi_object_names[type]); + + return FWTS_ERROR; + } + return FWTS_OK; +} + /* * Common types that can be returned. This is not a complete * list but it does cover the types we expect to return from