[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