diff mbox series

lib: add new large resource data type for _CRS methods

Message ID 1508366297-27274-1-git-send-email-alex.hung@canonical.com
State Accepted
Headers show
Series lib: add new large resource data type for _CRS methods | expand

Commit Message

Alex Hung Oct. 18, 2017, 10:38 p.m. UTC
Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
 src/lib/src/fwts_acpi_object_eval.c | 78 +++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

Comments

Ivan Hu Oct. 25, 2017, 6:39 a.m. UTC | #1
On 10/19/2017 06:38 AM, Alex Hung wrote:
> Signed-off-by: Alex Hung <alex.hung@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,
> 

Acked-by: Ivan Hu <ivan.hu@canonical.com>
Colin Ian King Oct. 26, 2017, 8:40 a.m. UTC | #2
On 19/10/17 00:38, Alex Hung wrote:
> Signed-off-by: Alex Hung <alex.hung@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);

Minor nitpick, typo: "Unkown" -> "Unknown", perhaps that can be fixed up
before applying rather than send a V2 of the patch.

>  		fwts_failed(fw, LOG_LEVEL_HIGH, tmp,
> 

Acked-by: Colin Ian King <colin.king@canonical.com>
diff mbox series

Patch

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,