diff mbox series

acpi: fix incorrect parameter to fwts_acpi_reserved_bits_check

Message ID 20201219035144.456865-1-alex.hung@canonical.com
State Accepted
Headers show
Series acpi: fix incorrect parameter to fwts_acpi_reserved_bits_check | expand

Commit Message

Alex Hung Dec. 19, 2020, 3:51 a.m. UTC
Last parameter should be "passed" but "failed" was past in some cases in
method.c.

Moving common functions used in both method.c and nvdimm.c to library
while fixing fwts_acpi_reserved_bits_check too.

Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
 src/acpi/devices/nvdimm/nvdimm.c        | 173 +-----------------
 src/acpi/method/method.c                | 225 ++----------------------
 src/lib/include/fwts_acpi_object_eval.h |   6 +
 src/lib/src/fwts_acpi_object_eval.c     | 203 +++++++++++++++++++++
 4 files changed, 228 insertions(+), 379 deletions(-)

Comments

Ivan Hu Dec. 21, 2020, 7:54 a.m. UTC | #1
On 12/19/20 11:51 AM, Alex Hung wrote:
> Last parameter should be "passed" but "failed" was past in some cases in
> method.c.
> 
> Moving common functions used in both method.c and nvdimm.c to library
> while fixing fwts_acpi_reserved_bits_check too.
> 
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>  src/acpi/devices/nvdimm/nvdimm.c        | 173 +-----------------
>  src/acpi/method/method.c                | 225 ++----------------------
>  src/lib/include/fwts_acpi_object_eval.h |   6 +
>  src/lib/src/fwts_acpi_object_eval.c     | 203 +++++++++++++++++++++
>  4 files changed, 228 insertions(+), 379 deletions(-)
> 
> diff --git a/src/acpi/devices/nvdimm/nvdimm.c b/src/acpi/devices/nvdimm/nvdimm.c
> index 26c42d6c..c76b6452 100644
> --- a/src/acpi/devices/nvdimm/nvdimm.c
> +++ b/src/acpi/devices/nvdimm/nvdimm.c
> @@ -77,190 +77,34 @@ static int acpi_nvdimm_init(fwts_framework *fw)
>  	return FWTS_OK;
>  }
>  
> -static void check_nvdimm_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t status,
> -	bool *failed)
> -{
> -	if (status > 6) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadStatus",
> -			"%s: Expected Status to be 0..6, got %" PRIx16,
> -			name, status);
> -	}
> -}
> -
> -static void check_nvdimm_extended_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t ext_status,
> -	uint16_t expected,
> -	bool *failed)
> -{
> -	if (ext_status != expected) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadExtendedStatus",
> -			"%s: Expected Extended Status to be %" PRIx16
> -			", got %" PRIx16, name, expected, ext_status);
> -	}
> -}
> -
> -static void method_test_NCH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nch_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nch_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> -		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NCH(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NCH", NULL, 0, method_test_NCH_return, NULL);
> -}
> -
> -static void method_test_NBS_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nbs_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nbs_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
>  }
>  
>  static int method_test_NBS(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NBS", NULL, 0, method_test_NBS_return, NULL);
> -}
> -
> -static void method_test_NIC_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nic_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nic_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -
> -	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
>  }
>  
>  static int method_test_NIC(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NIC", NULL, 0, method_test_NIC_return, NULL);
> +		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
>  }
>  
> -
> -static void method_test_NIH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> +static int method_test_NIH(fwts_framework *fw)
>  {
> -	bool failed = false;
> -	nih_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nih_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> +		"_NIH", NULL, 0, fwts_method_test_NIH_return, NULL);
>  }
>  
> -static int method_test_NIH(fwts_framework *fw)
> +static int method_test_NIG(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NIH", NULL, 0, method_test_NIH_return, NULL);
> +		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
>  }
>  
>  /* Evaluate Device Identification Objects - all are optional */
> @@ -275,6 +119,7 @@ static fwts_framework_minor_test acpi_nvdimm_tests[] = {
>  	{ method_test_NBS, "Test _NBS (NVDIMM Boot Status)." },
>  	{ method_test_NIC, "Test _NIC (NVDIMM Health Error Injection Capabilities)." },
>  	{ method_test_NIH, "Test _NIH (NVDIMM Inject/Clear Health Errors)." },
> +	{ method_test_NIG, "Test _NIG (NVDIMM Inject Health Error Status)." },
>  	/* Device Identification Objects - all are optional */
>  	{ method_test_HID, "Test _HID (Hardware ID)." },
>  	{ NULL, NULL }
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index b34c4afe..1e84d92e 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -1183,7 +1183,7 @@ static void method_test_STA_return(
>  	ACPI_OBJECT *obj,
>  	void *private)
>  {
> -	bool failed = false;
> +	bool passed = true;
>  
>  	FWTS_UNUSED(private);
>  
> @@ -1195,17 +1195,12 @@ static void method_test_STA_return(
>  			"Method_STAEnabledNotPresent",
>  			"%s indicates that the device is enabled "
>  			"but not present, which is impossible.", name);
> -		failed = true;
> -	}
> -	if ((obj->Integer.Value & ~0x1f) != 0) {
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"Method_STAReservedBitsSet",
> -			"%s is returning non-zero reserved "
> -			"bits 5-31. These should be zero.", name);
> -		failed = true;
> +		passed = false;
>  	}
> +	fwts_acpi_reserved_bits_check(fw, "_STA", "Reserved Bits",
> +		obj->Integer.Value, sizeof(uint32_t), 5, 31, &passed);
>  
> -	if (!failed)
> +	if (passed)
>  		fwts_method_passed_sane_uint64(fw, name, obj->Integer.Value);
>  }
>  
> @@ -3388,183 +3383,22 @@ static int method_test_TIV(fwts_framework *fw)
>  /*
>   * Section 9.20 NVDIMM Devices
>   */
> -static void check_nvdimm_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t status,
> -	bool *failed)
> -{
> -	if (status > 6) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadStatus",
> -			"%s: Expected Status to be 0..6, got %" PRIx16,
> -			name, status);
> -	}
> -}
> -
> -static void check_nvdimm_extended_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t ext_status,
> -	uint16_t expected,
> -	bool *failed)
> -{
> -	if (ext_status != expected) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadExtendedStatus",
> -			"%s: Expected Extended Status to be %" PRIx16
> -			", got %" PRIx16, name, expected, ext_status);
> -	}
> -}
> -
> -static void method_test_NBS_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nbs_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nbs_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NBS(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NBS", NULL, 0, method_test_NBS_return, NULL);
> -}
> -
> -static void method_test_NCH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nch_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nch_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> -		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
>  }
>  
>  static int method_test_NCH(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NCH", NULL, 0, method_test_NCH_return, NULL);
> -}
> -
> -static void method_test_NIC_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nic_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nic_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -
> -	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
>  }
>  
>  static int method_test_NIC(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NIC", NULL, 0, method_test_NIC_return, NULL);
> -}
> -
> -static void method_test_NIH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nih_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nih_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
>  }
>  
>  static int method_test_NIH(fwts_framework *fw)
> @@ -3590,7 +3424,7 @@ static int method_test_NIH(fwts_framework *fw)
>  			data[8] = j;
>  
>  			result = method_evaluate_method(fw, METHOD_OPTIONAL,
> -				"_NIH", &arg0, 1, method_test_NIH_return, NULL);
> +				"_NIH", &arg0, 1, fwts_method_test_NIH_return, NULL);
>  
>  			if (result != FWTS_OK)
>  				return result;
> @@ -3600,49 +3434,10 @@ static int method_test_NIH(fwts_framework *fw)
>  	return FWTS_OK;
>  }
>  
> -static void method_test_NIG_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nig_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nig_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NIG(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NIG", NULL, 0, method_test_NIG_return, NULL);
> +		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
>  }
>  
>  /*
> diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h
> index 0687562f..af738354 100644
> --- a/src/lib/include/fwts_acpi_object_eval.h
> +++ b/src/lib/include/fwts_acpi_object_eval.h
> @@ -167,4 +167,10 @@ void fwts_method_test_PLD_return(fwts_framework *fw, char *name, ACPI_BUFFER *bu
>  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);
>  
> +void fwts_method_test_NBS_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NCH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIC_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIG_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 e8b2e8d5..af21f132 100644
> --- a/src/lib/src/fwts_acpi_object_eval.c
> +++ b/src/lib/src/fwts_acpi_object_eval.c
> @@ -2335,4 +2335,207 @@ void fwts_method_test_BMD_return(
>  		fwts_method_passed_sane(fw, name, "package");
>  }
>  
> +/*
> + * Section 9.20 NVDIMM Devices
> + */
> +static void check_nvdimm_status(
> +	fwts_framework *fw,
> +	char *name,
> +	uint16_t status,
> +	bool *passed)
> +{
> +	if (status > 6) {
> +		*passed = false;
> +		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> +			"MethodBadStatus",
> +			"%s: Expected Status to be 0..6, got %" PRIx16,
> +			name, status);
> +	}
> +}
> +
> +static void check_nvdimm_extended_status(
> +	fwts_framework *fw,
> +	char *name,
> +	uint16_t ext_status,
> +	uint16_t expected,
> +	bool *passed)
> +{
> +	if (ext_status != expected) {
> +		*passed = false;
> +		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> +			"MethodBadExtendedStatus",
> +			"%s: Expected Extended Status to be %" PRIx16
> +			", got %" PRIx16, name, expected, ext_status);
> +	}
> +}
> +
> +void fwts_method_test_NBS_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nbs_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nbs_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> +		ret->validation_flags, sizeof(uint16_t), 1, 15, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NCH_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nch_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nch_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> +		ret->extended_status, sizeof(uint16_t), 2, 15, &passed);
> +
> +	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIC_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nic_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nic_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +
> +	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIH_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nih_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nih_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIG_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nig_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nig_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
> +		ret->validation_flags, sizeof(uint16_t), 2, 15, &passed);
> +
> +	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
>  #endif
> 

Acked-by: Ivan Hu <ivan.hu@canonical.com>
Colin Ian King Jan. 7, 2021, 9:34 a.m. UTC | #2
On 19/12/2020 03:51, Alex Hung wrote:
> Last parameter should be "passed" but "failed" was past in some cases in
> method.c.
> 
> Moving common functions used in both method.c and nvdimm.c to library
> while fixing fwts_acpi_reserved_bits_check too.
> 
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>  src/acpi/devices/nvdimm/nvdimm.c        | 173 +-----------------
>  src/acpi/method/method.c                | 225 ++----------------------
>  src/lib/include/fwts_acpi_object_eval.h |   6 +
>  src/lib/src/fwts_acpi_object_eval.c     | 203 +++++++++++++++++++++
>  4 files changed, 228 insertions(+), 379 deletions(-)
> 
> diff --git a/src/acpi/devices/nvdimm/nvdimm.c b/src/acpi/devices/nvdimm/nvdimm.c
> index 26c42d6c..c76b6452 100644
> --- a/src/acpi/devices/nvdimm/nvdimm.c
> +++ b/src/acpi/devices/nvdimm/nvdimm.c
> @@ -77,190 +77,34 @@ static int acpi_nvdimm_init(fwts_framework *fw)
>  	return FWTS_OK;
>  }
>  
> -static void check_nvdimm_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t status,
> -	bool *failed)
> -{
> -	if (status > 6) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadStatus",
> -			"%s: Expected Status to be 0..6, got %" PRIx16,
> -			name, status);
> -	}
> -}
> -
> -static void check_nvdimm_extended_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t ext_status,
> -	uint16_t expected,
> -	bool *failed)
> -{
> -	if (ext_status != expected) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadExtendedStatus",
> -			"%s: Expected Extended Status to be %" PRIx16
> -			", got %" PRIx16, name, expected, ext_status);
> -	}
> -}
> -
> -static void method_test_NCH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nch_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nch_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> -		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NCH(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NCH", NULL, 0, method_test_NCH_return, NULL);
> -}
> -
> -static void method_test_NBS_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nbs_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nbs_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
>  }
>  
>  static int method_test_NBS(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NBS", NULL, 0, method_test_NBS_return, NULL);
> -}
> -
> -static void method_test_NIC_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nic_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nic_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -
> -	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
>  }
>  
>  static int method_test_NIC(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NIC", NULL, 0, method_test_NIC_return, NULL);
> +		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
>  }
>  
> -
> -static void method_test_NIH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> +static int method_test_NIH(fwts_framework *fw)
>  {
> -	bool failed = false;
> -	nih_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nih_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> +		"_NIH", NULL, 0, fwts_method_test_NIH_return, NULL);
>  }
>  
> -static int method_test_NIH(fwts_framework *fw)
> +static int method_test_NIG(fwts_framework *fw)
>  {
>  	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
> -		"_NIH", NULL, 0, method_test_NIH_return, NULL);
> +		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
>  }
>  
>  /* Evaluate Device Identification Objects - all are optional */
> @@ -275,6 +119,7 @@ static fwts_framework_minor_test acpi_nvdimm_tests[] = {
>  	{ method_test_NBS, "Test _NBS (NVDIMM Boot Status)." },
>  	{ method_test_NIC, "Test _NIC (NVDIMM Health Error Injection Capabilities)." },
>  	{ method_test_NIH, "Test _NIH (NVDIMM Inject/Clear Health Errors)." },
> +	{ method_test_NIG, "Test _NIG (NVDIMM Inject Health Error Status)." },
>  	/* Device Identification Objects - all are optional */
>  	{ method_test_HID, "Test _HID (Hardware ID)." },
>  	{ NULL, NULL }
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index b34c4afe..1e84d92e 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -1183,7 +1183,7 @@ static void method_test_STA_return(
>  	ACPI_OBJECT *obj,
>  	void *private)
>  {
> -	bool failed = false;
> +	bool passed = true;
>  
>  	FWTS_UNUSED(private);
>  
> @@ -1195,17 +1195,12 @@ static void method_test_STA_return(
>  			"Method_STAEnabledNotPresent",
>  			"%s indicates that the device is enabled "
>  			"but not present, which is impossible.", name);
> -		failed = true;
> -	}
> -	if ((obj->Integer.Value & ~0x1f) != 0) {
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"Method_STAReservedBitsSet",
> -			"%s is returning non-zero reserved "
> -			"bits 5-31. These should be zero.", name);
> -		failed = true;
> +		passed = false;
>  	}
> +	fwts_acpi_reserved_bits_check(fw, "_STA", "Reserved Bits",
> +		obj->Integer.Value, sizeof(uint32_t), 5, 31, &passed);
>  
> -	if (!failed)
> +	if (passed)
>  		fwts_method_passed_sane_uint64(fw, name, obj->Integer.Value);
>  }
>  
> @@ -3388,183 +3383,22 @@ static int method_test_TIV(fwts_framework *fw)
>  /*
>   * Section 9.20 NVDIMM Devices
>   */
> -static void check_nvdimm_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t status,
> -	bool *failed)
> -{
> -	if (status > 6) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadStatus",
> -			"%s: Expected Status to be 0..6, got %" PRIx16,
> -			name, status);
> -	}
> -}
> -
> -static void check_nvdimm_extended_status(
> -	fwts_framework *fw,
> -	char *name,
> -	uint16_t ext_status,
> -	uint16_t expected,
> -	bool *failed)
> -{
> -	if (ext_status != expected) {
> -		*failed = true;
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			"MethodBadExtendedStatus",
> -			"%s: Expected Extended Status to be %" PRIx16
> -			", got %" PRIx16, name, expected, ext_status);
> -	}
> -}
> -
> -static void method_test_NBS_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nbs_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nbs_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NBS(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NBS", NULL, 0, method_test_NBS_return, NULL);
> -}
> -
> -static void method_test_NCH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nch_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nch_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> -		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> -		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
>  }
>  
>  static int method_test_NCH(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NCH", NULL, 0, method_test_NCH_return, NULL);
> -}
> -
> -static void method_test_NIC_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nic_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nic_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
> -
> -	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> -		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
>  }
>  
>  static int method_test_NIC(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NIC", NULL, 0, method_test_NIC_return, NULL);
> -}
> -
> -static void method_test_NIH_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nih_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nih_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> +		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
>  }
>  
>  static int method_test_NIH(fwts_framework *fw)
> @@ -3590,7 +3424,7 @@ static int method_test_NIH(fwts_framework *fw)
>  			data[8] = j;
>  
>  			result = method_evaluate_method(fw, METHOD_OPTIONAL,
> -				"_NIH", &arg0, 1, method_test_NIH_return, NULL);
> +				"_NIH", &arg0, 1, fwts_method_test_NIH_return, NULL);
>  
>  			if (result != FWTS_OK)
>  				return result;
> @@ -3600,49 +3434,10 @@ static int method_test_NIH(fwts_framework *fw)
>  	return FWTS_OK;
>  }
>  
> -static void method_test_NIG_return(
> -	fwts_framework *fw,
> -	char *name,
> -	ACPI_BUFFER *buf,
> -	ACPI_OBJECT *obj,
> -	void *private)
> -{
> -	bool failed = false;
> -	nig_return_t *ret;
> -
> -	FWTS_UNUSED(private);
> -
> -	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> -		return;
> -
> -	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> -		failed = true;
> -
> -	ret = (nig_return_t *) obj->Buffer.Pointer;
> -	check_nvdimm_status(fw, name, ret->status, &failed);
> -	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
> -		ret->validation_flags, sizeof(uint16_t), 2, 15, &failed);
> -
> -	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 2, 7, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 11, 15, &failed);
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> -		ret->health_status_errors, sizeof(uint32_t), 19, 31, &failed);
> -
> -	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
> -		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
> -
> -	if (!failed)
> -		fwts_method_passed_sane(fw, name, "buffer");
> -}
> -
>  static int method_test_NIG(fwts_framework *fw)
>  {
>  	return method_evaluate_method(fw, METHOD_OPTIONAL,
> -		"_NIG", NULL, 0, method_test_NIG_return, NULL);
> +		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
>  }
>  
>  /*
> diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h
> index 0687562f..af738354 100644
> --- a/src/lib/include/fwts_acpi_object_eval.h
> +++ b/src/lib/include/fwts_acpi_object_eval.h
> @@ -167,4 +167,10 @@ void fwts_method_test_PLD_return(fwts_framework *fw, char *name, ACPI_BUFFER *bu
>  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);
>  
> +void fwts_method_test_NBS_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NCH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIC_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
> +void fwts_method_test_NIG_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 e8b2e8d5..af21f132 100644
> --- a/src/lib/src/fwts_acpi_object_eval.c
> +++ b/src/lib/src/fwts_acpi_object_eval.c
> @@ -2335,4 +2335,207 @@ void fwts_method_test_BMD_return(
>  		fwts_method_passed_sane(fw, name, "package");
>  }
>  
> +/*
> + * Section 9.20 NVDIMM Devices
> + */
> +static void check_nvdimm_status(
> +	fwts_framework *fw,
> +	char *name,
> +	uint16_t status,
> +	bool *passed)
> +{
> +	if (status > 6) {
> +		*passed = false;
> +		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> +			"MethodBadStatus",
> +			"%s: Expected Status to be 0..6, got %" PRIx16,
> +			name, status);
> +	}
> +}
> +
> +static void check_nvdimm_extended_status(
> +	fwts_framework *fw,
> +	char *name,
> +	uint16_t ext_status,
> +	uint16_t expected,
> +	bool *passed)
> +{
> +	if (ext_status != expected) {
> +		*passed = false;
> +		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> +			"MethodBadExtendedStatus",
> +			"%s: Expected Extended Status to be %" PRIx16
> +			", got %" PRIx16, name, expected, ext_status);
> +	}
> +}
> +
> +void fwts_method_test_NBS_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nbs_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nbs_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
> +		ret->validation_flags, sizeof(uint16_t), 1, 15, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NCH_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nch_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nch_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
> +		ret->extended_status, sizeof(uint16_t), 2, 15, &passed);
> +
> +	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
> +		ret->health_status_flags, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIC_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nic_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nic_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
> +
> +	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
> +		ret->health_error_injection, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIH_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nih_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nih_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
> +void fwts_method_test_NIG_return(
> +	fwts_framework *fw,
> +	char *name,
> +	ACPI_BUFFER *buf,
> +	ACPI_OBJECT *obj,
> +	void *private)
> +{
> +	bool passed = true;
> +	nig_return_t *ret;
> +
> +	FWTS_UNUSED(private);
> +
> +	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
> +		return;
> +
> +	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
> +		passed = false;
> +
> +	ret = (nig_return_t *) obj->Buffer.Pointer;
> +	check_nvdimm_status(fw, name, ret->status, &passed);
> +	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
> +		ret->validation_flags, sizeof(uint16_t), 2, 15, &passed);
> +
> +	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 2, 7, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 11, 15, &passed);
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
> +		ret->health_status_errors, sizeof(uint32_t), 19, 31, &passed);
> +
> +	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
> +		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
> +
> +	if (passed)
> +		fwts_method_passed_sane(fw, name, "buffer");
> +}
> +
>  #endif
> 

Looks good to me. Thanks.

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

Patch

diff --git a/src/acpi/devices/nvdimm/nvdimm.c b/src/acpi/devices/nvdimm/nvdimm.c
index 26c42d6c..c76b6452 100644
--- a/src/acpi/devices/nvdimm/nvdimm.c
+++ b/src/acpi/devices/nvdimm/nvdimm.c
@@ -77,190 +77,34 @@  static int acpi_nvdimm_init(fwts_framework *fw)
 	return FWTS_OK;
 }
 
-static void check_nvdimm_status(
-	fwts_framework *fw,
-	char *name,
-	uint16_t status,
-	bool *failed)
-{
-	if (status > 6) {
-		*failed = true;
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			"MethodBadStatus",
-			"%s: Expected Status to be 0..6, got %" PRIx16,
-			name, status);
-	}
-}
-
-static void check_nvdimm_extended_status(
-	fwts_framework *fw,
-	char *name,
-	uint16_t ext_status,
-	uint16_t expected,
-	bool *failed)
-{
-	if (ext_status != expected) {
-		*failed = true;
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			"MethodBadExtendedStatus",
-			"%s: Expected Extended Status to be %" PRIx16
-			", got %" PRIx16, name, expected, ext_status);
-	}
-}
-
-static void method_test_NCH_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nch_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nch_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
-		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
-
-	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
-
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
-		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
-}
-
 static int method_test_NCH(fwts_framework *fw)
 {
 	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
-		"_NCH", NULL, 0, method_test_NCH_return, NULL);
-}
-
-static void method_test_NBS_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nbs_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nbs_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
-		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
 }
 
 static int method_test_NBS(fwts_framework *fw)
 {
 	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
-		"_NBS", NULL, 0, method_test_NBS_return, NULL);
-}
-
-static void method_test_NIC_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nic_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nic_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-
-	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
-
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
-		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
 }
 
 static int method_test_NIC(fwts_framework *fw)
 {
 	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
-		"_NIC", NULL, 0, method_test_NIC_return, NULL);
+		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
 }
 
-
-static void method_test_NIH_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
+static int method_test_NIH(fwts_framework *fw)
 {
-	bool failed = false;
-	nih_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nih_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
+		"_NIH", NULL, 0, fwts_method_test_NIH_return, NULL);
 }
 
-static int method_test_NIH(fwts_framework *fw)
+static int method_test_NIG(fwts_framework *fw)
 {
 	return fwts_evaluate_method(fw, METHOD_MANDATORY, &device,
-		"_NIH", NULL, 0, method_test_NIH_return, NULL);
+		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
 }
 
 /* Evaluate Device Identification Objects - all are optional */
@@ -275,6 +119,7 @@  static fwts_framework_minor_test acpi_nvdimm_tests[] = {
 	{ method_test_NBS, "Test _NBS (NVDIMM Boot Status)." },
 	{ method_test_NIC, "Test _NIC (NVDIMM Health Error Injection Capabilities)." },
 	{ method_test_NIH, "Test _NIH (NVDIMM Inject/Clear Health Errors)." },
+	{ method_test_NIG, "Test _NIG (NVDIMM Inject Health Error Status)." },
 	/* Device Identification Objects - all are optional */
 	{ method_test_HID, "Test _HID (Hardware ID)." },
 	{ NULL, NULL }
diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index b34c4afe..1e84d92e 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -1183,7 +1183,7 @@  static void method_test_STA_return(
 	ACPI_OBJECT *obj,
 	void *private)
 {
-	bool failed = false;
+	bool passed = true;
 
 	FWTS_UNUSED(private);
 
@@ -1195,17 +1195,12 @@  static void method_test_STA_return(
 			"Method_STAEnabledNotPresent",
 			"%s indicates that the device is enabled "
 			"but not present, which is impossible.", name);
-		failed = true;
-	}
-	if ((obj->Integer.Value & ~0x1f) != 0) {
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			"Method_STAReservedBitsSet",
-			"%s is returning non-zero reserved "
-			"bits 5-31. These should be zero.", name);
-		failed = true;
+		passed = false;
 	}
+	fwts_acpi_reserved_bits_check(fw, "_STA", "Reserved Bits",
+		obj->Integer.Value, sizeof(uint32_t), 5, 31, &passed);
 
-	if (!failed)
+	if (passed)
 		fwts_method_passed_sane_uint64(fw, name, obj->Integer.Value);
 }
 
@@ -3388,183 +3383,22 @@  static int method_test_TIV(fwts_framework *fw)
 /*
  * Section 9.20 NVDIMM Devices
  */
-static void check_nvdimm_status(
-	fwts_framework *fw,
-	char *name,
-	uint16_t status,
-	bool *failed)
-{
-	if (status > 6) {
-		*failed = true;
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			"MethodBadStatus",
-			"%s: Expected Status to be 0..6, got %" PRIx16,
-			name, status);
-	}
-}
-
-static void check_nvdimm_extended_status(
-	fwts_framework *fw,
-	char *name,
-	uint16_t ext_status,
-	uint16_t expected,
-	bool *failed)
-{
-	if (ext_status != expected) {
-		*failed = true;
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			"MethodBadExtendedStatus",
-			"%s: Expected Extended Status to be %" PRIx16
-			", got %" PRIx16, name, expected, ext_status);
-	}
-}
-
-static void method_test_NBS_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nbs_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nbs_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
-		ret->validation_flags, sizeof(uint16_t), 1, 15, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
-}
-
 static int method_test_NBS(fwts_framework *fw)
 {
 	return method_evaluate_method(fw, METHOD_OPTIONAL,
-		"_NBS", NULL, 0, method_test_NBS_return, NULL);
-}
-
-static void method_test_NCH_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nch_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nch_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
-		ret->extended_status, sizeof(uint16_t), 2, 15, &failed);
-
-	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 2, 7, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 11, 15, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
-		ret->health_status_flags, sizeof(uint32_t), 19, 31, &failed);
-
-	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
-		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+		"_NBS", NULL, 0, fwts_method_test_NBS_return, NULL);
 }
 
 static int method_test_NCH(fwts_framework *fw)
 {
 	return method_evaluate_method(fw, METHOD_OPTIONAL,
-		"_NCH", NULL, 0, method_test_NCH_return, NULL);
-}
-
-static void method_test_NIC_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nic_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nic_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &failed);
-
-	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 2, 7, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 11, 15, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
-		ret->health_error_injection, sizeof(uint32_t), 19, 31, &failed);
-
-	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
-		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+		"_NCH", NULL, 0, fwts_method_test_NCH_return, NULL);
 }
 
 static int method_test_NIC(fwts_framework *fw)
 {
 	return method_evaluate_method(fw, METHOD_OPTIONAL,
-		"_NIC", NULL, 0, method_test_NIC_return, NULL);
-}
-
-static void method_test_NIH_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nih_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nih_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
+		"_NIC", NULL, 0, fwts_method_test_NIC_return, NULL);
 }
 
 static int method_test_NIH(fwts_framework *fw)
@@ -3590,7 +3424,7 @@  static int method_test_NIH(fwts_framework *fw)
 			data[8] = j;
 
 			result = method_evaluate_method(fw, METHOD_OPTIONAL,
-				"_NIH", &arg0, 1, method_test_NIH_return, NULL);
+				"_NIH", &arg0, 1, fwts_method_test_NIH_return, NULL);
 
 			if (result != FWTS_OK)
 				return result;
@@ -3600,49 +3434,10 @@  static int method_test_NIH(fwts_framework *fw)
 	return FWTS_OK;
 }
 
-static void method_test_NIG_return(
-	fwts_framework *fw,
-	char *name,
-	ACPI_BUFFER *buf,
-	ACPI_OBJECT *obj,
-	void *private)
-{
-	bool failed = false;
-	nig_return_t *ret;
-
-	FWTS_UNUSED(private);
-
-	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
-		return;
-
-	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
-		failed = true;
-
-	ret = (nig_return_t *) obj->Buffer.Pointer;
-	check_nvdimm_status(fw, name, ret->status, &failed);
-	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
-		ret->validation_flags, sizeof(uint16_t), 2, 15, &failed);
-
-	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
-	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
-		ret->health_status_errors, sizeof(uint32_t), 2, 7, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
-		ret->health_status_errors, sizeof(uint32_t), 11, 15, &failed);
-	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
-		ret->health_status_errors, sizeof(uint32_t), 19, 31, &failed);
-
-	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
-		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &failed);
-
-	if (!failed)
-		fwts_method_passed_sane(fw, name, "buffer");
-}
-
 static int method_test_NIG(fwts_framework *fw)
 {
 	return method_evaluate_method(fw, METHOD_OPTIONAL,
-		"_NIG", NULL, 0, method_test_NIG_return, NULL);
+		"_NIG", NULL, 0, fwts_method_test_NIG_return, NULL);
 }
 
 /*
diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h
index 0687562f..af738354 100644
--- a/src/lib/include/fwts_acpi_object_eval.h
+++ b/src/lib/include/fwts_acpi_object_eval.h
@@ -167,4 +167,10 @@  void fwts_method_test_PLD_return(fwts_framework *fw, char *name, ACPI_BUFFER *bu
 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);
 
+void fwts_method_test_NBS_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
+void fwts_method_test_NCH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
+void fwts_method_test_NIC_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
+void fwts_method_test_NIH_return(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT *obj, void *private);
+void fwts_method_test_NIG_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 e8b2e8d5..af21f132 100644
--- a/src/lib/src/fwts_acpi_object_eval.c
+++ b/src/lib/src/fwts_acpi_object_eval.c
@@ -2335,4 +2335,207 @@  void fwts_method_test_BMD_return(
 		fwts_method_passed_sane(fw, name, "package");
 }
 
+/*
+ * Section 9.20 NVDIMM Devices
+ */
+static void check_nvdimm_status(
+	fwts_framework *fw,
+	char *name,
+	uint16_t status,
+	bool *passed)
+{
+	if (status > 6) {
+		*passed = false;
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"MethodBadStatus",
+			"%s: Expected Status to be 0..6, got %" PRIx16,
+			name, status);
+	}
+}
+
+static void check_nvdimm_extended_status(
+	fwts_framework *fw,
+	char *name,
+	uint16_t ext_status,
+	uint16_t expected,
+	bool *passed)
+{
+	if (ext_status != expected) {
+		*passed = false;
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"MethodBadExtendedStatus",
+			"%s: Expected Extended Status to be %" PRIx16
+			", got %" PRIx16, name, expected, ext_status);
+	}
+}
+
+void fwts_method_test_NBS_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	bool passed = true;
+	nbs_return_t *ret;
+
+	FWTS_UNUSED(private);
+
+	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
+		return;
+
+	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
+		passed = false;
+
+	ret = (nbs_return_t *) obj->Buffer.Pointer;
+	check_nvdimm_status(fw, name, ret->status, &passed);
+	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NBS", "Validation Flags",
+		ret->validation_flags, sizeof(uint16_t), 1, 15, &passed);
+
+	if (passed)
+		fwts_method_passed_sane(fw, name, "buffer");
+}
+
+void fwts_method_test_NCH_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	bool passed = true;
+	nch_return_t *ret;
+
+	FWTS_UNUSED(private);
+
+	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
+		return;
+
+	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
+		passed = false;
+
+	ret = (nch_return_t *) obj->Buffer.Pointer;
+	check_nvdimm_status(fw, name, ret->status, &passed);
+	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NCH", "Validation Flags",
+		ret->extended_status, sizeof(uint16_t), 2, 15, &passed);
+
+	/* Health Status Flags [2..7], [11.15], [19..31] are reserved */
+	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
+		ret->health_status_flags, sizeof(uint32_t), 2, 7, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
+		ret->health_status_flags, sizeof(uint32_t), 11, 15, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Flags",
+		ret->health_status_flags, sizeof(uint32_t), 19, 31, &passed);
+
+	fwts_acpi_reserved_bits_check(fw, "_NCH", "Health Status Attributes",
+		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
+
+	if (passed)
+		fwts_method_passed_sane(fw, name, "buffer");
+}
+
+void fwts_method_test_NIC_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	bool passed = true;
+	nic_return_t *ret;
+
+	FWTS_UNUSED(private);
+
+	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
+		return;
+
+	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
+		passed = false;
+
+	ret = (nic_return_t *) obj->Buffer.Pointer;
+	check_nvdimm_status(fw, name, ret->status, &passed);
+	check_nvdimm_extended_status(fw, name, ret->extended_status, 0, &passed);
+
+	/* Health Error Injection Capabilities [2..7], [11.15], [19..31] are reserved */
+	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
+		ret->health_error_injection, sizeof(uint32_t), 2, 7, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
+		ret->health_error_injection, sizeof(uint32_t), 11, 15, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Error Injection Capabilities",
+		ret->health_error_injection, sizeof(uint32_t), 19, 31, &passed);
+
+	fwts_acpi_reserved_bits_check(fw, "_NIC", "Health Status Attributes Capabilities",
+		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
+
+	if (passed)
+		fwts_method_passed_sane(fw, name, "buffer");
+}
+
+void fwts_method_test_NIH_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	bool passed = true;
+	nih_return_t *ret;
+
+	FWTS_UNUSED(private);
+
+	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
+		return;
+
+	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
+		passed = false;
+
+	ret = (nih_return_t *) obj->Buffer.Pointer;
+	check_nvdimm_status(fw, name, ret->status, &passed);
+	check_nvdimm_extended_status(fw, name, ret->extended_status, 1, &passed);
+
+	if (passed)
+		fwts_method_passed_sane(fw, name, "buffer");
+}
+
+void fwts_method_test_NIG_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	bool passed = true;
+	nig_return_t *ret;
+
+	FWTS_UNUSED(private);
+
+	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_BUFFER) != FWTS_OK)
+		return;
+
+	if (fwts_method_buffer_size(fw, name, obj, 64) != FWTS_OK)
+		passed = false;
+
+	ret = (nig_return_t *) obj->Buffer.Pointer;
+	check_nvdimm_status(fw, name, ret->status, &passed);
+	check_nvdimm_extended_status(fw, name,  ret->extended_status, 0, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NIG", "Validation Flags",
+		ret->validation_flags, sizeof(uint16_t), 2, 15, &passed);
+
+	/* Injected Health Status Errors [2..7], [11.15], [19..31] are reserved */
+	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
+		ret->health_status_errors, sizeof(uint32_t), 2, 7, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
+		ret->health_status_errors, sizeof(uint32_t), 11, 15, &passed);
+	fwts_acpi_reserved_bits_check(fw, "_NIG", "Injected Health Status Errors",
+		ret->health_status_errors, sizeof(uint32_t), 19, 31, &passed);
+
+	fwts_acpi_reserved_bits_check(fw, "_NIG", "Health Status Attributes of Injected Errors",
+		ret->health_status_attributes, sizeof(uint32_t), 1, 31, &passed);
+
+	if (passed)
+		fwts_method_passed_sane(fw, name, "buffer");
+}
+
 #endif