[PATCH 5/5] acpi: srat: add new type 4 according to ACPI 6.2 (mantis 1656)
Alex Hung
alex.hung at canonical.com
Tue Jun 20 01:39:13 UTC 2017
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/acpi/srat/srat.c | 56 ++++++++++++++++++++++++++++++++++++++++++++-
src/lib/include/fwts_acpi.h | 8 +++++++
2 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/src/acpi/srat/srat.c b/src/acpi/srat/srat.c
index 33890bc..aee49f8 100644
--- a/src/acpi/srat/srat.c
+++ b/src/acpi/srat/srat.c
@@ -266,7 +266,7 @@ static void srat_check_gicc_affinity(
fwts_log_info_verbatim(fw, "SRAT GICC Affinity Structure:");
fwts_log_info_verbatim(fw, " Type: 0x%2.2" PRIx8, affinity->type);
fwts_log_info_verbatim(fw, " Length: 0x%2.2" PRIx8, affinity->length);
- fwts_log_info_verbatim(fw, " Proximity Domain: 0x%4.4" PRIx32, affinity->proximity_domain);
+ fwts_log_info_verbatim(fw, " Proximity Domain: 0x%8.8" PRIx32, affinity->proximity_domain);
fwts_log_info_verbatim(fw, " ACPI Processor UID: 0x%8.8" PRIx32, affinity->acpi_processor_uid);
fwts_log_info_verbatim(fw, " Flags: 0x%8.8" PRIx32, affinity->flags);
fwts_log_info_verbatim(fw, " Clock Domain 0x%8.8" PRIx32, affinity->clock_domain);
@@ -290,6 +290,57 @@ done:
*data += sizeof(fwts_acpi_table_gicc_affinity);
}
+static void srat_check_its_affinity(
+ fwts_framework *fw,
+ ssize_t *length,
+ uint8_t **data,
+ bool *passed)
+{
+ fwts_acpi_table_its_affinity *affinity =
+ (fwts_acpi_table_its_affinity *)*data;
+
+ if ((ssize_t)sizeof(fwts_acpi_table_its_affinity) > *length) {
+ fwts_failed(fw, LOG_LEVEL_MEDIUM,
+ "SRATITSAffinityShort",
+ "SRAT ITS Affinity structure too short, got "
+ "%zu bytes, expecting %zu bytes",
+ *length, sizeof(fwts_acpi_table_its_affinity));
+ *passed = false;
+ goto done;
+ }
+
+ if (affinity->length != sizeof(fwts_acpi_table_its_affinity)) {
+ fwts_failed(fw, LOG_LEVEL_MEDIUM,
+ "SRATITSAffinityLength",
+ "SRAT ITS Affinity Length incorrect, got "
+ "%" PRIu8 ", expecting %zu",
+ affinity->length, sizeof(fwts_acpi_table_its_affinity));
+ *passed = false;
+ goto done;
+ }
+
+ fwts_log_info_verbatim(fw, "SRAT ITS Affinity Structure:");
+ fwts_log_info_verbatim(fw, " Type: 0x%2.2" PRIx8, affinity->type);
+ fwts_log_info_verbatim(fw, " Length: 0x%2.2" PRIx8, affinity->length);
+ fwts_log_info_verbatim(fw, " Proximity Domain: 0x%8.8" PRIx32, affinity->proximity_domain);
+ fwts_log_info_verbatim(fw, " Reserved: 0x%4.4" PRIx16, affinity->reserved);
+ fwts_log_info_verbatim(fw, " ITS ID 0x%8.8" PRIx32, affinity->its_id);
+ fwts_log_nl(fw);
+
+ if (affinity->reserved) {
+ fwts_failed(fw, LOG_LEVEL_MEDIUM,
+ "SRATITSBadReserved",
+ "ITS Affinity Reserved field should be zero, got "
+ "0x%" PRIx16,
+ affinity->reserved);
+ *passed = false;
+ }
+
+done:
+ *length -= sizeof(fwts_acpi_table_its_affinity);
+ *data += sizeof(fwts_acpi_table_its_affinity);
+}
+
/*
* See ACPI 6.0, Section 5.2.16
*/
@@ -325,6 +376,9 @@ static int srat_test1(fwts_framework *fw)
case 0x03:
srat_check_gicc_affinity(fw, &length, &data, &passed);
break;
+ case 0x04:
+ srat_check_its_affinity(fw, &length, &data, &passed);
+ break;
default:
fwts_failed(fw, LOG_LEVEL_HIGH,
"SRATInvalidType",
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index d22f1f4..f04d37a 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -410,6 +410,14 @@ typedef struct {
uint32_t clock_domain;
} __attribute__ ((packed)) fwts_acpi_table_gicc_affinity;
+typedef struct {
+ uint8_t type;
+ uint8_t length;
+ uint32_t proximity_domain;
+ uint16_t reserved;
+ uint32_t its_id;
+} __attribute__ ((packed)) fwts_acpi_table_its_affinity;
+
/*
* ACPI HPET (HPET IA-PC High Precision Event Timer Table),
* 3.2.4 The ACPI 2.0 HPET Description Table (HPET)
--
2.7.4
More information about the fwts-devel
mailing list