diff mbox series

acp: nfit: add platform capability according to manit 1831 (ACPI 6.2a)

Message ID 1507673975-24916-1-git-send-email-alex.hung@canonical.com
State Accepted
Headers show
Series acp: nfit: add platform capability according to manit 1831 (ACPI 6.2a) | expand

Commit Message

Alex Hung Oct. 10, 2017, 10:19 p.m. UTC
Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
 src/acpi/nfit/nfit.c        | 31 +++++++++++++++++++++++++++++--
 src/lib/include/fwts_acpi.h | 11 ++++++++++-
 2 files changed, 39 insertions(+), 3 deletions(-)

Comments

Colin Ian King Oct. 11, 2017, 9:59 a.m. UTC | #1
On 10/10/17 23:19, Alex Hung wrote:
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>  src/acpi/nfit/nfit.c        | 31 +++++++++++++++++++++++++++++--
>  src/lib/include/fwts_acpi.h | 11 ++++++++++-
>  2 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/src/acpi/nfit/nfit.c b/src/acpi/nfit/nfit.c
> index e1a4815..b87f040 100644
> --- a/src/acpi/nfit/nfit.c
> +++ b/src/acpi/nfit/nfit.c
> @@ -322,12 +322,39 @@ static int nfit_test1(fwts_framework *fw)
>  			if (reserved != 0)
>  				reserved_passed = reserved;
>  
> +		} else if (entry->type == FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY) {
> +			fwts_acpi_table_nfit_platform_cap *nfit_struct = (fwts_acpi_table_nfit_platform_cap *) entry;
> +			uint32_t reserved1;
> +
> +			reserved1 = (uint32_t) nfit_struct->reserved1[0] + ((uint32_t) nfit_struct->reserved1[1] << 8) +
> +				   ((uint32_t) nfit_struct->reserved1[2] << 16);
> +
> +			fwts_log_info_verbatim(fw, "    Highest Valid Capability:               0x%2.2" PRIx8, nfit_struct->highest_valid_cap);
> +			fwts_log_info_verbatim(fw, "    Reserved1:                              0x%8.8" PRIx32, reserved1);
> +			fwts_log_info_verbatim(fw, "    Capabilities:                           0x%8.8" PRIx32, nfit_struct->cap);
> +			fwts_log_info_verbatim(fw, "    Reserved2:                              0x%8.8" PRIx32, nfit_struct->reserved2);
> +
> +			fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved1", reserved1, sizeof(reserved1), &passed);
> +			fwts_acpi_reserved_bits_check(fw, "NFIT", "Capabilities", nfit_struct->cap, sizeof(nfit_struct->cap), 3, 31, &passed);
> +
> +			if ((nfit_struct->cap & 0x1) && !(nfit_struct->cap & 0x2)) {
> +				passed = false;
> +				fwts_failed(fw, LOG_LEVEL_CRITICAL,
> +					"NFITBadCapabilities",
> +					"NFIT Capabilities[1] must be set and if Capabilities[0] is set, got "
> +					"0x%8.8" PRIx32 " instead", nfit_struct->cap);
> +			}
> +
> +			if (nfit_struct->reserved2 != 0)
> +				reserved_passed = nfit_struct->reserved2;
> +
>  		} else {
>  			passed = false;
>  			fwts_failed(fw, LOG_LEVEL_HIGH,
>  				"NFITBadSubType",
> -				"NFIT Structure supports type 0..6, got "
> -				"0x%4.4" PRIx16 " instead", entry->type);
> +				"NFIT Structure supports type 0..%" PRId8 ", got "
> +				"0x%4.4" PRIx16 " instead", FWTS_ACPI_NFIT_TYPE_RESERVED - 1,
> +				entry->type);
>  		}
>  
>  		fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved", reserved_passed, sizeof(reserved_passed), &passed);
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index d919aa8..e22e1af 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -1166,7 +1166,8 @@ typedef enum {
>  	FWTS_ACPI_NFIT_TYPE_CONTROL_REGION       = 4,
>  	FWTS_ACPI_NFIT_TYPE_DATA_REGION          = 5,
>  	FWTS_ACPI_NFIT_TYPE_FLUSH_ADDRESS        = 6,
> -	FWTS_ACPI_NFIT_TYPE_RESERVED             = 7     /* >= 7 are reserved */
> +	FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY  = 7,
> +	FWTS_ACPI_NFIT_TYPE_RESERVED             = 8     /* >= 8 are reserved */
>  } fwts_acpi_nfit_type;
>  
>  typedef struct {
> @@ -1255,6 +1256,14 @@ typedef struct {
>  	uint64_t	hint_address[];
>  } __attribute__ ((packed)) fwts_acpi_table_nfit_flush_addr;
>  
> +typedef struct {
> +	fwts_acpi_table_nfit_struct_header	header;
> +	uint8_t		highest_valid_cap;
> +	uint8_t		reserved1[3];
> +	uint32_t	cap;
> +	uint32_t	reserved2;
> +} __attribute__ ((packed)) fwts_acpi_table_nfit_platform_cap;
> +
>  /*
>   * ACPI HMAT (Heterogeneous Memory Attribute Table), 5.2.27
>   */
> 
Thanks Alex.

Acked-by: Colin Ian King <colin.king@canonical.com>
Ivan Hu Oct. 11, 2017, 10 a.m. UTC | #2
On 10/11/2017 06:19 AM, Alex Hung wrote:
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>   src/acpi/nfit/nfit.c        | 31 +++++++++++++++++++++++++++++--
>   src/lib/include/fwts_acpi.h | 11 ++++++++++-
>   2 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/src/acpi/nfit/nfit.c b/src/acpi/nfit/nfit.c
> index e1a4815..b87f040 100644
> --- a/src/acpi/nfit/nfit.c
> +++ b/src/acpi/nfit/nfit.c
> @@ -322,12 +322,39 @@ static int nfit_test1(fwts_framework *fw)
>   			if (reserved != 0)
>   				reserved_passed = reserved;
>   
> +		} else if (entry->type == FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY) {
> +			fwts_acpi_table_nfit_platform_cap *nfit_struct = (fwts_acpi_table_nfit_platform_cap *) entry;
> +			uint32_t reserved1;
> +
> +			reserved1 = (uint32_t) nfit_struct->reserved1[0] + ((uint32_t) nfit_struct->reserved1[1] << 8) +
> +				   ((uint32_t) nfit_struct->reserved1[2] << 16);
> +
> +			fwts_log_info_verbatim(fw, "    Highest Valid Capability:               0x%2.2" PRIx8, nfit_struct->highest_valid_cap);
> +			fwts_log_info_verbatim(fw, "    Reserved1:                              0x%8.8" PRIx32, reserved1);
> +			fwts_log_info_verbatim(fw, "    Capabilities:                           0x%8.8" PRIx32, nfit_struct->cap);
> +			fwts_log_info_verbatim(fw, "    Reserved2:                              0x%8.8" PRIx32, nfit_struct->reserved2);
> +
> +			fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved1", reserved1, sizeof(reserved1), &passed);
> +			fwts_acpi_reserved_bits_check(fw, "NFIT", "Capabilities", nfit_struct->cap, sizeof(nfit_struct->cap), 3, 31, &passed);
> +
> +			if ((nfit_struct->cap & 0x1) && !(nfit_struct->cap & 0x2)) {
> +				passed = false;
> +				fwts_failed(fw, LOG_LEVEL_CRITICAL,
> +					"NFITBadCapabilities",
> +					"NFIT Capabilities[1] must be set and if Capabilities[0] is set, got "
> +					"0x%8.8" PRIx32 " instead", nfit_struct->cap);
> +			}
> +
> +			if (nfit_struct->reserved2 != 0)
> +				reserved_passed = nfit_struct->reserved2;
> +
>   		} else {
>   			passed = false;
>   			fwts_failed(fw, LOG_LEVEL_HIGH,
>   				"NFITBadSubType",
> -				"NFIT Structure supports type 0..6, got "
> -				"0x%4.4" PRIx16 " instead", entry->type);
> +				"NFIT Structure supports type 0..%" PRId8 ", got "
> +				"0x%4.4" PRIx16 " instead", FWTS_ACPI_NFIT_TYPE_RESERVED - 1,
> +				entry->type);
>   		}
>   
>   		fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved", reserved_passed, sizeof(reserved_passed), &passed);
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index d919aa8..e22e1af 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -1166,7 +1166,8 @@ typedef enum {
>   	FWTS_ACPI_NFIT_TYPE_CONTROL_REGION       = 4,
>   	FWTS_ACPI_NFIT_TYPE_DATA_REGION          = 5,
>   	FWTS_ACPI_NFIT_TYPE_FLUSH_ADDRESS        = 6,
> -	FWTS_ACPI_NFIT_TYPE_RESERVED             = 7     /* >= 7 are reserved */
> +	FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY  = 7,
> +	FWTS_ACPI_NFIT_TYPE_RESERVED             = 8     /* >= 8 are reserved */
>   } fwts_acpi_nfit_type;
>   
>   typedef struct {
> @@ -1255,6 +1256,14 @@ typedef struct {
>   	uint64_t	hint_address[];
>   } __attribute__ ((packed)) fwts_acpi_table_nfit_flush_addr;
>   
> +typedef struct {
> +	fwts_acpi_table_nfit_struct_header	header;
> +	uint8_t		highest_valid_cap;
> +	uint8_t		reserved1[3];
> +	uint32_t	cap;
> +	uint32_t	reserved2;
> +} __attribute__ ((packed)) fwts_acpi_table_nfit_platform_cap;
> +
>   /*
>    * ACPI HMAT (Heterogeneous Memory Attribute Table), 5.2.27
>    */
> 

Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff mbox series

Patch

diff --git a/src/acpi/nfit/nfit.c b/src/acpi/nfit/nfit.c
index e1a4815..b87f040 100644
--- a/src/acpi/nfit/nfit.c
+++ b/src/acpi/nfit/nfit.c
@@ -322,12 +322,39 @@  static int nfit_test1(fwts_framework *fw)
 			if (reserved != 0)
 				reserved_passed = reserved;
 
+		} else if (entry->type == FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY) {
+			fwts_acpi_table_nfit_platform_cap *nfit_struct = (fwts_acpi_table_nfit_platform_cap *) entry;
+			uint32_t reserved1;
+
+			reserved1 = (uint32_t) nfit_struct->reserved1[0] + ((uint32_t) nfit_struct->reserved1[1] << 8) +
+				   ((uint32_t) nfit_struct->reserved1[2] << 16);
+
+			fwts_log_info_verbatim(fw, "    Highest Valid Capability:               0x%2.2" PRIx8, nfit_struct->highest_valid_cap);
+			fwts_log_info_verbatim(fw, "    Reserved1:                              0x%8.8" PRIx32, reserved1);
+			fwts_log_info_verbatim(fw, "    Capabilities:                           0x%8.8" PRIx32, nfit_struct->cap);
+			fwts_log_info_verbatim(fw, "    Reserved2:                              0x%8.8" PRIx32, nfit_struct->reserved2);
+
+			fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved1", reserved1, sizeof(reserved1), &passed);
+			fwts_acpi_reserved_bits_check(fw, "NFIT", "Capabilities", nfit_struct->cap, sizeof(nfit_struct->cap), 3, 31, &passed);
+
+			if ((nfit_struct->cap & 0x1) && !(nfit_struct->cap & 0x2)) {
+				passed = false;
+				fwts_failed(fw, LOG_LEVEL_CRITICAL,
+					"NFITBadCapabilities",
+					"NFIT Capabilities[1] must be set and if Capabilities[0] is set, got "
+					"0x%8.8" PRIx32 " instead", nfit_struct->cap);
+			}
+
+			if (nfit_struct->reserved2 != 0)
+				reserved_passed = nfit_struct->reserved2;
+
 		} else {
 			passed = false;
 			fwts_failed(fw, LOG_LEVEL_HIGH,
 				"NFITBadSubType",
-				"NFIT Structure supports type 0..6, got "
-				"0x%4.4" PRIx16 " instead", entry->type);
+				"NFIT Structure supports type 0..%" PRId8 ", got "
+				"0x%4.4" PRIx16 " instead", FWTS_ACPI_NFIT_TYPE_RESERVED - 1,
+				entry->type);
 		}
 
 		fwts_acpi_reserved_zero_check(fw, "NFIT", "Reserved", reserved_passed, sizeof(reserved_passed), &passed);
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index d919aa8..e22e1af 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -1166,7 +1166,8 @@  typedef enum {
 	FWTS_ACPI_NFIT_TYPE_CONTROL_REGION       = 4,
 	FWTS_ACPI_NFIT_TYPE_DATA_REGION          = 5,
 	FWTS_ACPI_NFIT_TYPE_FLUSH_ADDRESS        = 6,
-	FWTS_ACPI_NFIT_TYPE_RESERVED             = 7     /* >= 7 are reserved */
+	FWTS_ACPI_NFIT_TYPE_PLATFORM_CAPABILITY  = 7,
+	FWTS_ACPI_NFIT_TYPE_RESERVED             = 8     /* >= 8 are reserved */
 } fwts_acpi_nfit_type;
 
 typedef struct {
@@ -1255,6 +1256,14 @@  typedef struct {
 	uint64_t	hint_address[];
 } __attribute__ ((packed)) fwts_acpi_table_nfit_flush_addr;
 
+typedef struct {
+	fwts_acpi_table_nfit_struct_header	header;
+	uint8_t		highest_valid_cap;
+	uint8_t		reserved1[3];
+	uint32_t	cap;
+	uint32_t	reserved2;
+} __attribute__ ((packed)) fwts_acpi_table_nfit_platform_cap;
+
 /*
  * ACPI HMAT (Heterogeneous Memory Attribute Table), 5.2.27
  */