diff mbox series

[1/2] acpi: srat: add new Generic Port structure for srat tests (mantis 2236)

Message ID 20231226080920.115233-1-ivan.hu@canonical.com
State Accepted
Headers show
Series [1/2] acpi: srat: add new Generic Port structure for srat tests (mantis 2236) | expand

Commit Message

Ivan Hu Dec. 26, 2023, 8:09 a.m. UTC
BugLink: https://bugs.launchpad.net/fwts/+bug/2047212
The new structure(Generic Port Structure 6) was add in ACPI 6.5

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/acpi/srat/srat.c        | 67 +++++++++++++++++++++++++++++++++++++
 src/lib/include/fwts_acpi.h | 11 ++++++
 2 files changed, 78 insertions(+)
diff mbox series

Patch

diff --git a/src/acpi/srat/srat.c b/src/acpi/srat/srat.c
index 848d0bf6..7c98bed5 100644
--- a/src/acpi/srat/srat.c
+++ b/src/acpi/srat/srat.c
@@ -337,6 +337,70 @@  done:
 	*data += sizeof(fwts_acpi_table_initiator_affinity);
 }
 
+static void srat_check_port_affinity(
+	fwts_framework *fw,
+	ssize_t		*length,
+	uint8_t		**data,
+	bool		*passed)
+{
+	uint32_t h_reserved = 0;
+
+	fwts_acpi_table_port_affinity *affinity =
+		(fwts_acpi_table_port_affinity *)*data;
+
+	if ((ssize_t)sizeof(fwts_acpi_table_port_affinity) > *length) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"SRATPortAffinityShort",
+			"SRAT Port Affinity structure too short, got "
+			"%zu bytes, expecting %zu bytes",
+			*length, sizeof(fwts_acpi_table_port_affinity));
+		*passed = false;
+		goto done;
+	}
+
+	if (!fwts_acpi_structure_length(fw, "SRAT", affinity->type,
+	    affinity->length, sizeof(fwts_acpi_table_port_affinity))) {
+		*passed = false;
+		goto done;
+	}
+
+	fwts_log_info_verbatim(fw, "SRAT Port Affinity Structure:");
+	fwts_log_info_simp_int(fw, "  Type:                     ", affinity->type);
+	fwts_log_info_simp_int(fw, "  Length:                   ", affinity->length);
+	fwts_log_info_simp_int(fw, "  Reserved:                 ", affinity->reserved1);
+	fwts_log_info_simp_int(fw, "  Device Handle Type:       ", affinity->device_handle_type);
+	fwts_log_info_simp_int(fw, "  Proximity Domain:         ", affinity->proximity_domain);
+
+	fwts_acpi_reserved_zero("SRAT", "Port Affinity Reserved", affinity->reserved1, passed);
+	fwts_acpi_reserved_bits("SRAT", "Port Affinity Device Handle Type", affinity->device_handle_type, 1, 7, passed);
+
+	fwts_log_info_verbatim(fw, "  Device Handle:");
+	if (affinity->device_handle_type == 0) {
+		fwts_log_info_simp_int(fw, "    ACPI _HID:              ", *(uint64_t *)(affinity->device_handle));
+		fwts_log_info_simp_int(fw, "    ACPI _UID:              ", *(uint32_t *)(affinity->device_handle + 8));
+		h_reserved = *(uint32_t *)(affinity->device_handle + 12);
+		fwts_log_info_simp_int(fw, "    Reserved:               ", *(uint32_t *)(affinity->device_handle + 12));
+		fwts_acpi_reserved_zero("SRAT", "Port Affinity Device Handle Reserved", h_reserved, passed);
+	} else if (affinity->device_handle_type == 1) {
+		fwts_log_info_simp_int(fw, "    PCI Segment:            ", *(uint16_t *)(affinity->device_handle));
+		fwts_log_info_simp_int(fw, "    PCI BDF Number:         ", *(uint16_t *)(affinity->device_handle + 2));
+		fwts_log_info_verbatim(fw, "    Reserved:");
+		fwts_hexdump_data_prefix_all(fw, affinity->device_handle + 4, "      ", 12);
+		fwts_acpi_reserved_zero_array(fw, "SRAT", "  Port Affinity Device Handle Reserved", affinity->device_handle + 4, 12, passed);
+	}
+	fwts_log_info_simp_int(fw, "  Flags:                    ", affinity->flags);
+	fwts_log_info_simp_int(fw, "  Reserved:                 ", affinity->reserved2);
+	fwts_log_nl(fw);
+
+	fwts_acpi_reserved_bits("SRAT", "Port Affinity Flags", affinity->flags, 2, 31, passed);
+	fwts_acpi_reserved_zero("SRAT", "Port Affinity Reserved", affinity->reserved2, passed);
+
+done:
+	*length -= sizeof(fwts_acpi_table_port_affinity);
+	*data += sizeof(fwts_acpi_table_port_affinity);
+}
+
+
 /*
  *  See ACPI 6.0, Section 5.2.16
  */
@@ -372,6 +436,9 @@  static int srat_test1(fwts_framework *fw)
 		case 0x05:
 			srat_check_initiator_affinity(fw, &length, &data, &passed);
 			break;
+		case 0x06:
+			srat_check_port_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 b4671b06..6b8ecefa 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -447,6 +447,17 @@  typedef struct {
 	uint32_t	reserved2;
 } __attribute__ ((packed)) fwts_acpi_table_initiator_affinity;
 
+typedef struct {
+	uint8_t		type;
+	uint8_t		length;
+	uint8_t		reserved1;
+	uint8_t		device_handle_type;
+	uint32_t	proximity_domain;
+	uint8_t		device_handle[16];
+	uint32_t	flags;
+	uint32_t	reserved2;
+} __attribute__ ((packed)) fwts_acpi_table_port_affinity;
+
 /*
  * ACPI HPET (HPET IA-PC High Precision Event Timer Table),
  *    3.2.4 The ACPI 2.0 HPET Description Table (HPET)