[PATCH 1/2] lib: create helper functions for device identification objects
Alex Hung
alex.hung at canonical.com
Mon Apr 23 08:43:06 UTC 2018
On Mon, Apr 23, 2018 at 1:35 AM, Colin Ian King
<colin.king at canonical.com> wrote:
> On 23/04/18 08:33, Alex Hung wrote:
>> A number of objects are common for all ACPI devices, according to
>> Section 6.1 in ACPI 6.2. Some of the functions are renamed and moved
>> from method.c.
>>
>> The refactoring allows device identification objects to be used in tests
>> in acpi/devices/*.
>>
>> Signed-off-by: Alex Hung <alex.hung at canonical.com>
>> ---
>> src/acpi/method/method.c | 357 +---------------------------
>> src/lib/include/fwts_acpi_object_eval.h | 24 ++
>> src/lib/src/fwts_acpi_object_eval.c | 406 ++++++++++++++++++++++++++++++++
>> 3 files changed, 442 insertions(+), 345 deletions(-)
>>
>> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
>> index 9cc7501..997a617 100644
>> --- a/src/acpi/method/method.c
>> +++ b/src/acpi/method/method.c
>> @@ -502,24 +502,6 @@ static int method_name_check(fwts_framework *fw)
>> return FWTS_OK;
>> }
>>
>> -/*
>> - * method_test_buffer_return
>> - * check if a buffer object was returned
>> - */
>> -static void method_test_buffer_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - FWTS_UNUSED(private);
>> -
>> - if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) == FWTS_OK)
>> - fwts_passed(fw, "%s correctly returned a buffer of %" PRIu32 " elements.",
>> - name, obj->Buffer.Length);
>> -}
>> -
>> /****************************************************************************/
>>
>> /*
>> @@ -765,31 +747,10 @@ static int method_test_PIC(fwts_framework *fw)
>> /*
>> * Section 6.1 Device Identification Objects
>> */
>> -static void method_test_CLS_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - 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, "_CLS", obj, 3) != FWTS_OK)
>> - return;
>> -
>> - if (fwts_method_package_elements_all_type(fw, name, "_CLS", obj, ACPI_TYPE_INTEGER) != FWTS_OK)
>> - return;
>> -
>> - fwts_method_passed_sane(fw, name, "package");
>> -}
>> -
>> static int method_test_CLS(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_CLS", NULL, 0, method_test_CLS_return, NULL);
>> + "_CLS", NULL, 0, fwts_method_test_CLS_return, NULL);
>> }
>>
>> static int method_test_DDN(fwts_framework *fw)
>> @@ -798,223 +759,26 @@ static int method_test_DDN(fwts_framework *fw)
>> "_DDN", NULL, 0, fwts_method_test_string_return, NULL);
>> }
>>
>> -static void method_test_HID_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - char tmp[8];
>> -
>> - FWTS_UNUSED(buf);
>> - FWTS_UNUSED(private);
>> -
>> - if (obj == NULL) {
>> - fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> - return;
>> - }
>> -
>> - switch (obj->Type) {
>> - case ACPI_TYPE_STRING:
>> - if (obj->String.Pointer) {
>> - if (fwts_method_valid_HID_string(obj->String.Pointer))
>> - fwts_passed(fw,
>> - "%s returned a string '%s' "
>> - "as expected.",
>> - name, obj->String.Pointer);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "MethodHIDInvalidString",
>> - "%s returned a string '%s' "
>> - "but it was not a valid PNP ID or a "
>> - "valid ACPI ID.",
>> - name, obj->String.Pointer);
>> - } else {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_HIDNullString",
>> - "%s returned a NULL string.", name);
>> - }
>> - break;
>> - case ACPI_TYPE_INTEGER:
>> - if (fwts_method_valid_EISA_ID((uint32_t)obj->Integer.Value,
>> - tmp, sizeof(tmp)))
>> - fwts_passed(fw, "%s returned an integer "
>> - "0x%8.8" PRIx64 " (EISA ID %s).",
>> - name, (uint64_t)obj->Integer.Value, tmp);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "MethodHIDInvalidInteger",
>> - "%s returned a integer 0x%8.8" PRIx64 " "
>> - "(EISA ID %s) but this is not a valid "
>> - "EISA ID encoded PNP ID.",
>> - name, (uint64_t)obj->Integer.Value, tmp);
>> - break;
>> - default:
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_HIDBadReturnType",
>> - "%s did not return a string or an integer.", name);
>> - break;
>> - }
>> -}
>> -
>> static int method_test_HID(fwts_framework *fw)
>> {
>> if (fw->flags & FWTS_FLAG_TEST_SBBR)
>> return method_evaluate_method(fw, METHOD_MANDATORY,
>> - "_HID", NULL, 0, method_test_HID_return, NULL);
>> + "_HID", NULL, 0, fwts_method_test_HID_return, NULL);
>> else
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_HID", NULL, 0, method_test_HID_return, NULL);
>> -}
>> -
>> -static void method_valid_CID_Type(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_OBJECT *obj)
>> -{
>> - char tmp[8];
>> -
>> - switch (obj->Type) {
>> - case ACPI_TYPE_STRING:
>> - if (obj->String.Pointer) {
>> - if (fwts_method_valid_HID_string(obj->String.Pointer))
>> - fwts_passed(fw,
>> - "%s returned a string '%s' "
>> - "as expected.",
>> - name, obj->String.Pointer);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "MethodCIDInvalidString",
>> - "%s returned a string '%s' "
>> - "but it was not a valid PNP ID or a "
>> - "valid ACPI ID.",
>> - name, obj->String.Pointer);
>> - } else {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_CIDNullString",
>> - "%s returned a NULL string.", name);
>> - }
>> - break;
>> - case ACPI_TYPE_INTEGER:
>> - if (fwts_method_valid_EISA_ID((uint32_t)obj->Integer.Value,
>> - tmp, sizeof(tmp)))
>> - fwts_passed(fw, "%s returned an integer "
>> - "0x%8.8" PRIx64 " (EISA ID %s).",
>> - name, (uint64_t)obj->Integer.Value, tmp);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "MethodCIDInvalidInteger",
>> - "%s returned a integer 0x%8.8" PRIx64 " "
>> - "(EISA ID %s) but this is not a valid "
>> - "EISA ID encoded PNP ID.",
>> - name, (uint64_t)obj->Integer.Value, tmp);
>> - break;
>> - }
>> -}
>> -
>> -static void method_test_CID_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - uint32_t i;
>> -
>> - FWTS_UNUSED(buf);
>> - FWTS_UNUSED(private);
>> -
>> - if (obj == NULL) {
>> - fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> - return;
>> - }
>> -
>> - switch (obj->Type) {
>> - case ACPI_TYPE_STRING:
>> - case ACPI_TYPE_INTEGER:
>> - method_valid_CID_Type(fw, name, obj);
>> - break;
>> - case ACPI_TYPE_PACKAGE:
>> - if (fwts_method_package_count_min(fw, name, "_CID", obj, 1) != FWTS_OK)
>> - return;
>> -
>> - for (i = 0; i < obj->Package.Count; i++){
>> - ACPI_OBJECT *pkg = &obj->Package.Elements[i];
>> - method_valid_CID_Type(fw, name, pkg);
>> - }
>> - break;
>> - default:
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_CIDBadReturnType",
>> - "%s did not return a string or an integer.", name);
>> - break;
>> - }
>> + "_HID", NULL, 0, fwts_method_test_HID_return, NULL);
>> }
>>
>> static int method_test_CID(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_CID", NULL, 0, method_test_CID_return, NULL);
>> -}
>> -
>> -static void method_test_MLS_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_elements_all_type(fw, name, "_MLS", obj, ACPI_TYPE_PACKAGE) != FWTS_OK)
>> - return;
>> -
>> - /* Could be one or more packages */
>> - for (i = 0; i < obj->Package.Count; i++) {
>> - ACPI_OBJECT *pkg = &obj->Package.Elements[i];
>> -
>> - if (pkg->Package.Count != 2) {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_MLSSubPackageElementCount",
>> - "%s sub-package %" PRIu32 " was expected to "
>> - "have 2 elements, got %" PRIu32 " elements instead.",
>> - name, i, pkg->Package.Count);
>> - failed = true;
>> - continue;
>> - }
>> -
>> - if (pkg->Package.Elements[0].Type != ACPI_TYPE_STRING) {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_MLSBadSubPackageReturnType",
>> - "%s sub-package %" PRIu32
>> - " element 0 is not a string.",
>> - name, i);
>> - failed = true;
>> - }
>> -
>> - if (pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_MLSBadSubPackageReturnType",
>> - "%s sub-package %" PRIu32
>> - " element 1 is not a buffer.",
>> - name, i);
>> - failed = true;
>> - }
>> - }
>> -
>> - if (!failed)
>> - fwts_method_passed_sane(fw, name, "package");
>> + "_CID", NULL, 0, fwts_method_test_CID_return, NULL);
>> }
>>
>> static int method_test_MLS(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_MLS", NULL, 0, method_test_MLS_return, NULL);
>> + "_MLS", NULL, 0, fwts_method_test_MLS_return, NULL);
>> }
>> static int method_test_HRV(fwts_framework *fw)
>> {
>> @@ -1025,79 +789,19 @@ static int method_test_HRV(fwts_framework *fw)
>> static int method_test_STR(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_STR", NULL, 0, method_test_buffer_return, NULL);
>> -}
>> -
>> -static void method_test_PLD_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - FWTS_UNUSED(private);
>> -
>> - if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
>> - return;
>> -
>> - /* All elements in the package must be buffers */
>> - if (fwts_method_package_elements_all_type(fw, name, "_PLD", obj, ACPI_TYPE_BUFFER) != FWTS_OK)
>> - return;
>> -
>> - fwts_method_passed_sane(fw, name, "package");
>> + "_STR", NULL, 0, fwts_method_test_buffer_return, NULL);
>> }
>>
>> static int method_test_PLD(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_PLD", NULL, 0, method_test_PLD_return, NULL);
>> -}
>> -
>> -static void method_test_SUB_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - FWTS_UNUSED(buf);
>> - FWTS_UNUSED(private);
>> -
>> - if (obj == NULL) {
>> - fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> - return;
>> - }
>> -
>> - if (obj->Type == ACPI_TYPE_STRING)
>> - if (obj->String.Pointer) {
>> - if (fwts_method_valid_HID_string(obj->String.Pointer))
>> - fwts_passed(fw,
>> - "%s returned a string '%s' "
>> - "as expected.",
>> - name, obj->String.Pointer);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "MethodSUBInvalidString",
>> - "%s returned a string '%s' "
>> - "but it was not a valid PNP ID or a "
>> - "valid ACPI ID.",
>> - name, obj->String.Pointer);
>> - } else {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_SUBNullString",
>> - "%s returned a NULL string.", name);
>> - }
>> - else {
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_SUBBadReturnType",
>> - "Method _SUB did not return a string or an integer.");
>> - }
>> + "_PLD", NULL, 0, fwts_method_test_PLD_return, NULL);
>> }
>>
>> -
>> static int method_test_SUB(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_SUB", NULL, 0, method_test_SUB_return, NULL);
>> + "_SUB", NULL, 0, fwts_method_test_SUB_return, NULL);
>> }
>>
>> static int method_test_SUN(fwts_framework *fw)
>> @@ -1106,53 +810,16 @@ static int method_test_SUN(fwts_framework *fw)
>> "_SUN", NULL, 0, fwts_method_test_integer_return, NULL);
>> }
>>
>> -static void method_test_UID_return(
>> - fwts_framework *fw,
>> - char *name,
>> - ACPI_BUFFER *buf,
>> - ACPI_OBJECT *obj,
>> - void *private)
>> -{
>> - FWTS_UNUSED(buf);
>> - FWTS_UNUSED(private);
>> -
>> - if (obj == NULL) {
>> - fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> - return;
>> - }
>> -
>> - switch (obj->Type) {
>> - case ACPI_TYPE_STRING:
>> - if (obj->String.Pointer)
>> - fwts_passed(fw,
>> - "%s returned a string '%s' as expected.",
>> - name, obj->String.Pointer);
>> - else
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> - "Method_UIDNullString",
>> - "%s returned a NULL string.", name);
>> - break;
>> - case ACPI_TYPE_INTEGER:
>> - fwts_method_passed_sane_uint64(fw, name, obj->Integer.Value);
>> - break;
>> - default:
>> - fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_UIDBadReturnType",
>> - "Method %s did not return a string or an integer.", name);
>> - break;
>> - }
>> -}
>> -
>> static int method_test_UID(fwts_framework *fw)
>> {
>> if (fw->flags & FWTS_FLAG_TEST_SBBR)
>> return method_evaluate_method(fw, METHOD_MANDATORY,
>> - "_UID", NULL, 0, method_test_UID_return, NULL);
>> + "_UID", NULL, 0, fwts_method_test_UID_return, NULL);
>> else
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_UID", NULL, 0, method_test_UID_return, NULL);
>> + "_UID", NULL, 0, fwts_method_test_UID_return, NULL);
>> }
>>
>> -
>> void method_test_CRS_return(
>> fwts_framework *fw,
>> char *name,
>> @@ -1298,7 +965,7 @@ static int method_test_PRT(fwts_framework *fw)
>> static int method_test_DMA(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_DMA", NULL, 0, method_test_buffer_return, NULL);
>> + "_DMA", NULL, 0, fwts_method_test_buffer_return, NULL);
>> }
>>
>> static void method_test_FIX_return(
>> @@ -1614,7 +1281,7 @@ static int method_test_DEP(fwts_framework *fw)
>> static int method_test_FIT(fwts_framework *fw)
>> {
>> return method_evaluate_method(fw, METHOD_OPTIONAL,
>> - "_FIT", NULL, 0, method_test_buffer_return, NULL);
>> + "_FIT", NULL, 0, fwts_method_test_buffer_return, NULL);
>> }
>>
>> static void method_test_LSI_return(
>> diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h
>> index 321b03b..8050779 100644
>> --- a/src/lib/include/fwts_acpi_object_eval.h
>> +++ b/src/lib/include/fwts_acpi_object_eval.h
>> @@ -84,6 +84,7 @@ void fwts_method_test_integer_return(fwts_framework *fw, char *name, ACPI_BUFFER
>> void fwts_method_test_string_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> void fwts_method_test_reference_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> void fwts_method_test_NULL_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_buffer_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj,void *private);
>> void fwts_method_test_passed_failed_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> void fwts_method_test_polling_return( fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>>
>> @@ -97,4 +98,27 @@ void fwts_method_test_CRS_large_size( fwts_framework *fw, const char *name, cons
>> void fwts_method_test_CRS_large_resource_items(fwts_framework *fw, const char *name, const char *objname, const uint8_t *data, const uint64_t length, bool *passed, const char **tag);
>> void fwts_method_test_CRS_small_resource_items(fwts_framework *fw, const char *name, const char *objname, const uint8_t *data, const size_t length, bool *passed, const char **tag) ;
>>
>> +/* Device Identification Objects - see Section 6 Device Configuration */
>> +int fwts_method_test_ADR(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_CID(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_CLS(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_DDN(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_HID(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_HRV(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_MLS(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_PLD(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_SUB(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_SUN(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_STR(fwts_framework *fw, ACPI_HANDLE *device);
>> +int fwts_method_test_UID(fwts_framework *fw, ACPI_HANDLE *device);
>> +
>> +void fwts_method_valid_CID_Type(fwts_framework *fw, char *name, ACPI_OBJECT *obj);
>> +void fwts_method_test_CID_return(fwts_framework *fw, char *name,ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_CLS_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_HID_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_MLS_return( fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_PLD_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_SUB_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +void fwts_method_test_UID_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
>> +
>> #endif
>> diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c
>> index 448566e..7ff7b6a 100644
>> --- a/src/lib/src/fwts_acpi_object_eval.c
>> +++ b/src/lib/src/fwts_acpi_object_eval.c
>> @@ -784,6 +784,24 @@ void fwts_method_test_NULL_return(
>> }
>>
>> /*
>> + * fwts_method_test_buffer_return
>> + * check if a buffer object was returned
>> + */
>> +void fwts_method_test_buffer_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + FWTS_UNUSED(private);
>> +
>> + if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) == FWTS_OK)
>> + fwts_passed(fw, "%s correctly returned a buffer of %" PRIu32 " elements.",
>> + name, obj->Buffer.Length);
>> +}
>> +
>> +/*
>> * fwts_method_test_passed_failed_return
>> * check if 0 or 1 (false/true) integer is returned
>> */
>> @@ -1737,5 +1755,393 @@ void fwts_method_test_CRS_large_resource_items(
>> *tag = types[tag_item < 16 ? tag_item : 0];
>> }
>>
>> +/*
>> + * Device Identification Objects - see Section 6 Device Configuration
>> + */
>> +
>> +int fwts_method_test_ADR(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_ADR", NULL, 0, fwts_method_test_integer_return, NULL);
>> +}
>> +
>> +void fwts_method_valid_CID_Type(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_OBJECT *obj)
>> +{
>> + char tmp[8];
>> +
>> + switch (obj->Type) {
>> + case ACPI_TYPE_STRING:
>> + if (obj->String.Pointer) {
>> + if (fwts_method_valid_HID_string(obj->String.Pointer))
>> + fwts_passed(fw,
>> + "%s returned a string '%s' "
>> + "as expected.",
>> + name, obj->String.Pointer);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "MethodCIDInvalidString",
>> + "%s returned a string '%s' "
>> + "but it was not a valid PNP ID or a "
>> + "valid ACPI ID.",
>> + name, obj->String.Pointer);
>> + } else {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_CIDNullString",
>> + "%s returned a NULL string.", name);
>> + }
>> + break;
>> + case ACPI_TYPE_INTEGER:
>> + if (fwts_method_valid_EISA_ID((uint32_t)obj->Integer.Value,
>> + tmp, sizeof(tmp)))
>> + fwts_passed(fw, "%s returned an integer "
>> + "0x%8.8" PRIx64 " (EISA ID %s).",
>> + name, (uint64_t)obj->Integer.Value, tmp);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "MethodCIDInvalidInteger",
>> + "%s returned a integer 0x%8.8" PRIx64 " "
>> + "(EISA ID %s) but this is not a valid "
>> + "EISA ID encoded PNP ID.",
>> + name, (uint64_t)obj->Integer.Value, tmp);
>> + break;
>> + }
>> +}
>> +
>> +void fwts_method_test_CID_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + uint32_t i;
>> +
>> + FWTS_UNUSED(buf);
>> + FWTS_UNUSED(private);
>> +
>> + if (obj == NULL) {
>> + fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> + return;
>> + }
>> +
>> + switch (obj->Type) {
>> + case ACPI_TYPE_STRING:
>> + case ACPI_TYPE_INTEGER:
>> + fwts_method_valid_CID_Type(fw, name, obj);
>> + break;
>> + case ACPI_TYPE_PACKAGE:
>> + if (fwts_method_package_count_min(fw, name, "_CID", obj, 1) != FWTS_OK)
>> + return;
>> +
>> + for (i = 0; i < obj->Package.Count; i++){
>> + ACPI_OBJECT *pkg = &obj->Package.Elements[i];
>> + fwts_method_valid_CID_Type(fw, name, pkg);
>> + }
>> + break;
>> + default:
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_CIDBadReturnType",
>> + "%s did not return a string or an integer.", name);
>> + break;
>> + }
>> +}
>> +
>> +int fwts_method_test_CID(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_CID", NULL, 0, fwts_method_test_CID_return, NULL);
>> +}
>> +
>> +void fwts_method_test_CLS_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + 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, "_CLS", obj, 3) != FWTS_OK)
>> + return;
>> +
>> + if (fwts_method_package_elements_all_type(fw, name, "_CLS", obj, ACPI_TYPE_INTEGER) != FWTS_OK)
>> + return;
>> +
>> + fwts_method_passed_sane(fw, name, "package");
>> +}
>> +
>> +int fwts_method_test_CLS(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_CLS", NULL, 0, fwts_method_test_CLS_return, NULL);
>> +}
>> +
>> +int fwts_method_test_DDN(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_DDN", NULL, 0, fwts_method_test_string_return, NULL);
>> +}
>> +
>> +void fwts_method_test_HID_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + char tmp[8];
>> +
>> + FWTS_UNUSED(buf);
>> + FWTS_UNUSED(private);
>> +
>> + if (obj == NULL) {
>> + fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> + return;
>> + }
>> +
>> + switch (obj->Type) {
>> + case ACPI_TYPE_STRING:
>> + if (obj->String.Pointer) {
>> + if (fwts_method_valid_HID_string(obj->String.Pointer))
>> + fwts_passed(fw,
>> + "%s returned a string '%s' "
>> + "as expected.",
>> + name, obj->String.Pointer);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "MethodHIDInvalidString",
>> + "%s returned a string '%s' "
>> + "but it was not a valid PNP ID or a "
>> + "valid ACPI ID.",
>> + name, obj->String.Pointer);
>> + } else {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_HIDNullString",
>> + "%s returned a NULL string.", name);
>> + }
>> + break;
>> + case ACPI_TYPE_INTEGER:
>> + if (fwts_method_valid_EISA_ID((uint32_t)obj->Integer.Value,
>> + tmp, sizeof(tmp)))
>> + fwts_passed(fw, "%s returned an integer "
>> + "0x%8.8" PRIx64 " (EISA ID %s).",
>> + name, (uint64_t)obj->Integer.Value, tmp);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "MethodHIDInvalidInteger",
>> + "%s returned a integer 0x%8.8" PRIx64 " "
>> + "(EISA ID %s) but this is not a valid "
>> + "EISA ID encoded PNP ID.",
>> + name, (uint64_t)obj->Integer.Value, tmp);
>> + break;
>> + default:
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_HIDBadReturnType",
>> + "%s did not return a string or an integer.", name);
>> + break;
>> + }
>> +}
>> +
>> +int fwts_method_test_HID(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_HID", NULL, 0, fwts_method_test_HID_return, NULL);
>> +}
>> +
>> +int fwts_method_test_HRV(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_HRV", NULL, 0, fwts_method_test_integer_return, NULL);
>> +}
>> +
>> +void fwts_method_test_MLS_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_elements_all_type(fw, name, "_MLS", obj, ACPI_TYPE_PACKAGE) != FWTS_OK)
>> + return;
>> +
>> + /* Could be one or more packages */
>> + for (i = 0; i < obj->Package.Count; i++) {
>> + ACPI_OBJECT *pkg = &obj->Package.Elements[i];
>> +
>> + if (pkg->Package.Count != 2) {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_MLSSubPackageElementCount",
>> + "%s sub-package %" PRIu32 " was expected to "
>> + "have 2 elements, got %" PRIu32 " elements instead.",
>> + name, i, pkg->Package.Count);
>> + failed = true;
>> + continue;
>> + }
>> +
>> + if (pkg->Package.Elements[0].Type != ACPI_TYPE_STRING) {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_MLSBadSubPackageReturnType",
>> + "%s sub-package %" PRIu32
>> + " element 0 is not a string.",
>> + name, i);
>> + failed = true;
>> + }
>> +
>> + if (pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_MLSBadSubPackageReturnType",
>> + "%s sub-package %" PRIu32
>> + " element 1 is not a buffer.",
>> + name, i);
>> + failed = true;
>> + }
>> + }
>> +
>> + if (!failed)
>> + fwts_method_passed_sane(fw, name, "package");
>> +}
>> +
>> +int fwts_method_test_MLS(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_MLS", NULL, 0, fwts_method_test_MLS_return, NULL);
>> +}
>> +
>> +void fwts_method_test_PLD_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + FWTS_UNUSED(private);
>> +
>> + if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
>> + return;
>> +
>> + /* All elements in the package must be buffers */
>> + if (fwts_method_package_elements_all_type(fw, name, "_PLD", obj, ACPI_TYPE_BUFFER) != FWTS_OK)
>> + return;
>> +
>> + fwts_method_passed_sane(fw, name, "package");
>> +}
>> +
>> +int fwts_method_test_PLD(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_PLD", NULL, 0, fwts_method_test_PLD_return, NULL);
>> +}
>> +
>> +void fwts_method_test_SUB_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + FWTS_UNUSED(buf);
>> + FWTS_UNUSED(private);
>> +
>> + if (obj == NULL) {
>> + fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> + return;
>> + }
>> +
>> + if (obj->Type == ACPI_TYPE_STRING)
>> + if (obj->String.Pointer) {
>> + if (fwts_method_valid_HID_string(obj->String.Pointer))
>> + fwts_passed(fw,
>> + "%s returned a string '%s' "
>> + "as expected.",
>> + name, obj->String.Pointer);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "MethodSUBInvalidString",
>> + "%s returned a string '%s' "
>> + "but it was not a valid PNP ID or a "
>> + "valid ACPI ID.",
>> + name, obj->String.Pointer);
>> + } else {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_SUBNullString",
>> + "%s returned a NULL string.", name);
>> + }
>> + else {
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_SUBBadReturnType",
>> + "Method _SUB did not return a string or an integer.");
>> + }
>> +}
>> +
>> +int fwts_method_test_SUB(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_SUB", NULL, 0, fwts_method_test_SUB_return, NULL);
>> +}
>> +
>> +int fwts_method_test_SUN(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_SUN", NULL, 0, fwts_method_test_integer_return, NULL);
>> +}
>> +
>> +int fwts_method_test_STR(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_STR", NULL, 0, fwts_method_test_buffer_return, NULL);
>> +}
>> +
>> +void fwts_method_test_UID_return(
>> + fwts_framework *fw,
>> + char *name,
>> + ACPI_BUFFER *buf,
>> + ACPI_OBJECT *obj,
>> + void *private)
>> +{
>> + FWTS_UNUSED(buf);
>> + FWTS_UNUSED(private);
>> +
>> + if (obj == NULL) {
>> + fwts_method_failed_null_object(fw, name, "a buffer or integer");
>> + return;
>> + }
>> +
>> + switch (obj->Type) {
>> + case ACPI_TYPE_STRING:
>> + if (obj->String.Pointer)
>> + fwts_passed(fw,
>> + "%s returned a string '%s' as expected.",
>> + name, obj->String.Pointer);
>> + else
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
>> + "Method_UIDNullString",
>> + "%s returned a NULL string.", name);
>> + break;
>> + case ACPI_TYPE_INTEGER:
>> + fwts_method_passed_sane_uint64(fw, name, obj->Integer.Value);
>> + break;
>> + default:
>> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_UIDBadReturnType",
>> + "Method %s did not return a string or an integer.", name);
>> + break;
>> + }
>> +}
>> +
>> +int fwts_method_test_UID(fwts_framework *fw, ACPI_HANDLE *device)
>> +{
>> + return fwts_evaluate_method(fw, METHOD_OPTIONAL, device,
>> + "_UID", NULL, 0, fwts_method_test_UID_return, NULL);
>> +}
>>
>> #endif
>>
>
> Hrm. I can't get this to apply. Perhaps my repo is out of sync. Can we
This requires two patches - http://patchwork.ozlabs.org/patch/900576/
& http://patchwork.ozlabs.org/patch/901655/
> apply the backlog of ack'd patches so the repo is upto date and then I
> can work from a clone of the repo.
Certainly. I am waiting for acks for previous patches too, and I can
upload them to fwts repo.
>
> Colin
--
Cheers,
Alex Hung
More information about the fwts-devel
mailing list