[PATCH 1/2] lib: create helper functions for device identification objects
Alex Hung
alex.hung at canonical.com
Mon Apr 23 07:33:53 UTC 2018
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
--
2.7.4
More information about the fwts-devel
mailing list