[PATCH] lib: add new large resource data type for _CRS methods

Alex Hung alex.hung at canonical.com
Wed Oct 18 22:38:17 UTC 2017


Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/lib/src/fwts_acpi_object_eval.c | 78 +++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c
index 1846718..d980fd6 100644
--- a/src/lib/src/fwts_acpi_object_eval.c
+++ b/src/lib/src/fwts_acpi_object_eval.c
@@ -1165,6 +1165,8 @@ void fwts_method_test_CRS_small_resource_items(
 	*tag = types[tag_item];
 }
 
+
+
 void fwts_method_test_CRS_large_size(
 	fwts_framework *fw,
 	const char *name,
@@ -1390,6 +1392,10 @@ void fwts_method_test_CRS_large_resource_items(
 		"GPIO Connection Descriptor",
 		"Reserved",
 		"Generic Serial Bus Connection Descriptor",
+		"Pin Configuration Descriptor",
+		"Pin Group Descriptor",
+		"Pin Group Function Descriptor",
+		"Pin Group Configuration Descriptor",
 		"Reserved",
 	};
 
@@ -1578,10 +1584,82 @@ void fwts_method_test_CRS_large_resource_items(
 				"specification.");
 		}
 		break;
+	case 0xd: /* 6.4.3.9 Pin Function Descriptors */
+		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 17, 65535, passed);
+		if (!*passed)	/* Too short, abort */
+			break;
+		fwts_acpi_reserved_bits_check(fw, "_CRS", "Flags[low]", data[4], sizeof(data[4]), 1, 7, passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Flags[high]", data[5], sizeof(data[5]), passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Resource Source Index", data[11], sizeof(data[11]), passed);
+		break;
 	case 0xe: /* 6.4.3.8.2 Serial Bus Connection Descriptors */
 		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 11, 65535, passed);
 		/* Don't care */
 		break;
+	case 0xf: /* 6.4.3.10 Pin Configuration Descriptors */
+		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 19, 65535, passed);
+		if (!*passed)	/* Too short, abort */
+			break;
+
+		fwts_acpi_reserved_bits_check(fw, "_CRS", "Flags[low]", data[4], sizeof(data[4]), 2, 7, passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Flags[high]", data[5], sizeof(data[5]), passed);
+
+		if (data[6] > 0xd && data[6] < 0x80) {
+			*passed = false;
+			snprintf(tmp, sizeof(tmp), "Method%sPinConfigTypeInvalid", objname);
+			fwts_failed(fw, LOG_LEVEL_MEDIUM, tmp,
+				"%s Pin Configuration Descriptor has an invalid "
+				"Type 0x%" PRIx8 ".", name, data[6]);
+			fwts_advice(fw,
+				"The Pin Configuration type is "
+				"not recognised. It should be either in "
+				"range of 0..0x0D or 0x80..0xFF. See "
+				"section 6.4.3.10 of the ACPI spec.");
+		}
+
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Resource Source Index", data[13], sizeof(data[13]), passed);
+		break;
+	case 0x10: /* 6.4.3.11 Pin Group Descriptors */
+		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 13, 65535, passed);
+		if (!*passed)	/* Too short, abort */
+			break;
+
+		fwts_acpi_reserved_bits_check(fw, "_CRS", "Flags[low]", data[4], sizeof(data[4]), 1, 7, passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Flags[high]", data[5], sizeof(data[5]), passed);
+
+		break;
+	case 0x11: /* 6.4.3.12 Pin Group Function Descriptors */
+		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 16, 65535, passed);
+		if (!*passed)	/* Too short, abort */
+			break;
+
+		fwts_acpi_reserved_bits_check(fw, "_CRS", "Flags[low]", data[4], sizeof(data[4]), 2, 7, passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Flags[high]", data[5], sizeof(data[5]), passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Resource Source Index", data[8], sizeof(data[8]), passed);
+		break;
+	case 0x12: /* 6.4.3.13 Pin Group Configuration Descriptor */
+		fwts_method_test_CRS_large_size(fw, name, objname, data, length, 19, 65535, passed);
+		if (!*passed)	/* Too short, abort */
+			break;
+
+		fwts_acpi_reserved_bits_check(fw, "_CRS", "Flags[low]", data[4], sizeof(data[4]), 2, 7, passed);
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Flags[high]", data[5], sizeof(data[5]), passed);
+
+		if (data[6] > 0xd && data[6] < 0x80) {
+			*passed = false;
+			snprintf(tmp, sizeof(tmp), "Method%sPinConfigTypeInvalid", objname);
+			fwts_failed(fw, LOG_LEVEL_MEDIUM, tmp,
+				"%s Pin Group Configuration Descriptor has an invalid "
+				"Type 0x%" PRIx8 ".", name, data[6]);
+			fwts_advice(fw,
+				"The Pin Group Configuration type is "
+				"not recognised. It should be either in "
+				"range of 0..0x0D or 0x80..0xFF. See "
+				"section 6.4.3.10 of the ACPI spec.");
+		}
+
+		fwts_acpi_reserved_zero_check(fw, "_CRS", "Resource Source Index", data[11], sizeof(data[11]), passed);
+		break;
 	default:
 		snprintf(tmp, sizeof(tmp), "Method%sUnkownLargeResourceItem", objname);
 		fwts_failed(fw, LOG_LEVEL_HIGH, tmp,
-- 
2.7.4




More information about the fwts-devel mailing list