soc/intel/xeon_sp: Add IIO resources via SSDT

There is no need to inject this code in DSDT. Just generating a _CRS
Name in SSDT containing a resource template works well and reduces the
need to sync up on names being used to return _CRS names in DSDT.

TEST=intel/archercity CRB

Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Change-Id: I691d7497dceb89619652e5523a29ea30a7b0fab8
Reviewed-on: https://review.coreboot.org/c/coreboot/+/78333
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
diff --git a/src/soc/intel/xeon_sp/acpi/iiostack.asl b/src/soc/intel/xeon_sp/acpi/iiostack.asl
index e5e6bdc..d2b2296 100644
--- a/src/soc/intel/xeon_sp/acpi/iiostack.asl
+++ b/src/soc/intel/xeon_sp/acpi/iiostack.asl
@@ -14,11 +14,6 @@
 			}						\
 			Return (\_SB_.PR##rt)				\
 		}							\
-		External(\_SB.RT##id)					\
-		Method (_CRS, 0, NotSerialized)				\
-		{							\
-			Return (\_SB.RT##id)				\
-		}							\
 		Name (SUPP, 0x00)					\
 		Name (CTRL, 0x00)					\
 		Name (_PXM, 0x00)  /* _PXM: Device Proximity */		\
diff --git a/src/soc/intel/xeon_sp/cpx/soc_acpi.c b/src/soc/intel/xeon_sp/cpx/soc_acpi.c
index 07c6a17..2c19ed1 100644
--- a/src/soc/intel/xeon_sp/cpx/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/cpx/soc_acpi.c
@@ -41,7 +41,7 @@
 	fadt->flags &=  ~(ACPI_FADT_SEALED_CASE | ACPI_FADT_S4_RTC_WAKE);
 }
 
-void uncore_inject_dsdt(const struct device *device)
+void uncore_fill_ssdt(const struct device *device)
 {
 	struct iiostack_resource stack_info = {0};
 
@@ -51,15 +51,14 @@
 
 	get_iiostack_info(&stack_info);
 
-	acpigen_write_scope("\\_SB");
-
 	for (uint8_t stack = 0; stack < stack_info.no_of_stacks; ++stack) {
 		const STACK_RES *ri = &stack_info.res[stack];
 		char rtname[16];
 
-		snprintf(rtname, sizeof(rtname), "RT%02x", stack);
+		snprintf(rtname, sizeof(rtname), "\\_SB.PC%02x", stack);
+		acpigen_write_scope(rtname);
 
-		acpigen_write_name(rtname);
+		acpigen_write_name("_CRS");
 		printk(BIOS_DEBUG, "\tCreating ResourceTemplate %s for stack: %d\n",
 			rtname, stack);
 
@@ -106,8 +105,10 @@
 			(ri->PciResourceMem64Limit - ri->PciResourceMem64Base + 1));
 
 		acpigen_write_resourcetemplate_footer();
+
+		/* Scope */
+		acpigen_pop_len();
 	}
-	acpigen_pop_len();
 }
 
 /* TODO: See if we can use the common generate_p_state_entries */
diff --git a/src/soc/intel/xeon_sp/include/soc/acpi.h b/src/soc/intel/xeon_sp/include/soc/acpi.h
index 1c0afd3..f9c55ab 100644
--- a/src/soc/intel/xeon_sp/include/soc/acpi.h
+++ b/src/soc/intel/xeon_sp/include/soc/acpi.h
@@ -20,7 +20,7 @@
 
 unsigned long northbridge_write_acpi_tables(const struct device *device,
 	unsigned long current, struct acpi_rsdp *rsdp);
-void uncore_inject_dsdt(const struct device *device);
+void uncore_fill_ssdt(const struct device *device);
 unsigned long xeonsp_acpi_create_madt_lapics(unsigned long current);
 unsigned long acpi_fill_cedt(unsigned long current);
 unsigned long acpi_fill_hmat(unsigned long current);
diff --git a/src/soc/intel/xeon_sp/skx/soc_acpi.c b/src/soc/intel/xeon_sp/skx/soc_acpi.c
index 35e3ea1..dfbd878 100644
--- a/src/soc/intel/xeon_sp/skx/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/skx/soc_acpi.c
@@ -54,7 +54,7 @@
 	fill_fadt_extended_pm_io(fadt);
 }
 
-void uncore_inject_dsdt(const struct device *device)
+void uncore_fill_ssdt(const struct device *device)
 {
 	const IIO_UDS *hob = get_iio_uds();
 
@@ -62,7 +62,6 @@
 	if (device->bus->secondary != 0)
 		return;
 
-	acpigen_write_scope("\\_SB");
 	for (int socket = 0, iio = 0; iio < hob->PlatformData.numofIIO; ++socket) {
 		if (!soc_cpu_is_enabled(socket))
 			continue;
@@ -72,10 +71,12 @@
 		for (int stack = 0; stack <= PSTACK2; ++stack) {
 			const STACK_RES *ri = &iio_resource.StackRes[stack];
 			char rtname[16];
-			snprintf(rtname, sizeof(rtname), "RT%02x",
-				(socket*MAX_IIO_STACK)+stack);
 
-			acpigen_write_name(rtname);
+			snprintf(rtname, sizeof(rtname), "\\_SB.PC%02x", socket * MAX_IIO_STACK + stack);
+			acpigen_write_scope(rtname);
+
+			acpigen_write_name("_CRS");
+
 			printk(BIOS_DEBUG, "\tCreating ResourceTemplate %s for socket: %d, stack: %d\n",
 				rtname, socket, stack);
 
@@ -126,9 +127,11 @@
 				(ri->PciResourceMem64Limit - ri->PciResourceMem64Base + 1));
 
 			acpigen_write_resourcetemplate_footer();
+
+			/* Scope */
+			acpigen_pop_len();
 		}
 	}
-	acpigen_pop_len();
 }
 
 void soc_power_states_generation(int core, int cores_per_package)
diff --git a/src/soc/intel/xeon_sp/spr/acpi/cxl_resource.asl b/src/soc/intel/xeon_sp/spr/acpi/cxl_resource.asl
index 3644e87..80b3da2 100644
--- a/src/soc/intel/xeon_sp/spr/acpi/cxl_resource.asl
+++ b/src/soc/intel/xeon_sp/spr/acpi/cxl_resource.asl
@@ -26,11 +26,6 @@
 	{
 		Return (\_SB.PRTID)
 	}
-	External (\_SB.IIO_DEVICE_NAME(RESPREFIX, SOCKET, STACK))
-	Method (_CRS, 0, NotSerialized)
-	{
-		Return (\_SB.IIO_DEVICE_NAME(RESPREFIX, SOCKET, STACK))
-	}
 	Name (SUPP, 0x00) // PCI _OSC Support Field Value
 	Name (CTRL, 0x00) // PCI _OSC Control Field Value
 	Name (SUPC, 0x00) // CXL _OSC Support Field Value
diff --git a/src/soc/intel/xeon_sp/spr/acpi/dino_resource.asl b/src/soc/intel/xeon_sp/spr/acpi/dino_resource.asl
index 606c074..fb8f811 100644
--- a/src/soc/intel/xeon_sp/spr/acpi/dino_resource.asl
+++ b/src/soc/intel/xeon_sp/spr/acpi/dino_resource.asl
@@ -5,30 +5,20 @@
 
 #undef DEVPREFIX
 #define DEVPREFIX  DI
-#undef RESPREFIX
-#define RESPREFIX  DT
 #include "pci_resource.asl"
 
 #undef DEVPREFIX
 #define DEVPREFIX  PM
-#undef RESPREFIX
-#define RESPREFIX  MT
 #include "pci_resource.asl"
 
 #undef DEVPREFIX
 #define DEVPREFIX  HQ
-#undef RESPREFIX
-#define RESPREFIX  HT
 #include "pci_resource.asl"
 
 #undef DEVPREFIX
 #define DEVPREFIX  PN
-#undef RESPREFIX
-#define RESPREFIX  MU
 #include "pci_resource.asl"
 
 #undef DEVPREFIX
 #define DEVPREFIX  HR
-#undef RESPREFIX
-#define RESPREFIX  HU
 #include "pci_resource.asl"
diff --git a/src/soc/intel/xeon_sp/spr/acpi/iiostack.asl b/src/soc/intel/xeon_sp/spr/acpi/iiostack.asl
index bf70bbc..552f4c0 100644
--- a/src/soc/intel/xeon_sp/spr/acpi/iiostack.asl
+++ b/src/soc/intel/xeon_sp/spr/acpi/iiostack.asl
@@ -3,8 +3,6 @@
 /* ***** PCI Stacks **** */
 #undef DEVPREFIX
 #define DEVPREFIX  PC
-#undef RESPREFIX
-#define RESPREFIX  PT
 #undef STPREFIX
 #define STPREFIX   ST
 
@@ -39,8 +37,6 @@
 /* ***** CXL Stacks **** */
 #undef DEVPREFIX
 #define DEVPREFIX  CX
-#undef RESPREFIX
-#define RESPREFIX  CT
 
 #undef STACK
 #define STACK 1
diff --git a/src/soc/intel/xeon_sp/spr/acpi/pci_resource.asl b/src/soc/intel/xeon_sp/spr/acpi/pci_resource.asl
index a369b11..c65b699 100644
--- a/src/soc/intel/xeon_sp/spr/acpi/pci_resource.asl
+++ b/src/soc/intel/xeon_sp/spr/acpi/pci_resource.asl
@@ -22,11 +22,6 @@
 	{
 		Return (\_SB.PRTID)
 	}
-	External (\_SB.IIO_DEVICE_NAME(RESPREFIX, SOCKET, STACK))
-	Method (_CRS, 0, NotSerialized)
-	{
-		Return (\_SB.IIO_DEVICE_NAME(RESPREFIX, SOCKET, STACK))
-	}
 	Name (SUPP, 0x00)
 	Name (CTRL, 0x00)
 	Name (_PXM, SOCKET)  /* _PXM: Device Proximity */
diff --git a/src/soc/intel/xeon_sp/spr/acpi/ubox_resource.asl b/src/soc/intel/xeon_sp/spr/acpi/ubox_resource.asl
index 416150f..b18fbe8 100644
--- a/src/soc/intel/xeon_sp/spr/acpi/ubox_resource.asl
+++ b/src/soc/intel/xeon_sp/spr/acpi/ubox_resource.asl
@@ -5,8 +5,6 @@
 
 #undef DEVPREFIX
 #define DEVPREFIX  UC
-#undef RESPREFIX
-#define RESPREFIX  UT
 #include "pci_resource.asl"
 
 #undef PRTID
@@ -14,6 +12,4 @@
 
 #undef DEVPREFIX
 #define DEVPREFIX  UD
-#undef RESPREFIX
-#define RESPREFIX  UU
 #include "pci_resource.asl"
diff --git a/src/soc/intel/xeon_sp/spr/soc_acpi.c b/src/soc/intel/xeon_sp/spr/soc_acpi.c
index e7ce5e3..9d2df2c 100644
--- a/src/soc/intel/xeon_sp/spr/soc_acpi.c
+++ b/src/soc/intel/xeon_sp/spr/soc_acpi.c
@@ -62,11 +62,11 @@
 	   Stacks 1 .. 5 (TYPE_UBOX_IIO)
 		Scope: PC<socket><stack>, ResourceTemplate: RBRS
 	*/
-
-	/* Write ResourceTemplate resource name */
+	/* write _CRS scope */
 	char tres[16];
-	snprintf(tres, sizeof(tres), "PT%d%X", socket, stack);
-	acpigen_write_name(tres);
+	snprintf(tres, sizeof(tres), "\\_SB.PC%d%X", socket, stack);
+	acpigen_write_scope(tres);
+	acpigen_write_name("_CRS");
 
 	printk(BIOS_DEBUG, "\tCreating ResourceTemplate %s for socket: %d, stack: %d\n", tres,
 	       socket, stack);
@@ -133,6 +133,7 @@
 	}
 
 	acpigen_write_resourcetemplate_footer();
+	acpigen_pop_len();
 }
 
 static void create_dsdt_iou_cxl_resource(uint8_t socket, uint8_t stack, const STACK_RES *ri, bool stack_enabled)
@@ -141,10 +142,11 @@
 	   Stacks 1 .. 5 (TYPE_UBOX_IIO)
 		Scope: CX<socket><stack>, ResourceTemplate: RBRS
 	*/
-	/* write ResourceTemplate resource name */
+	/* write _CRS scope */
 	char tres[16];
-	snprintf(tres, sizeof(tres), "CT%d%X", socket, stack);
-	acpigen_write_name(tres);
+	snprintf(tres, sizeof(tres), "\\_SB.CX%d%X", socket, stack);
+	acpigen_write_scope(tres);
+	acpigen_write_name("_CRS");
 
 	printk(BIOS_DEBUG, "\tCreating ResourceTemplate %s for socket: %d, stack: %d\n", tres,
 	       socket, stack);
@@ -184,6 +186,7 @@
 	}
 
 	acpigen_write_resourcetemplate_footer();
+	acpigen_pop_len();
 }
 
 static void create_dsdt_dino_resource(uint8_t socket, uint8_t stack, const STACK_RES *ri, bool stack_enabled)
@@ -222,32 +225,32 @@
 			mem64_base = ri->PciResourceMem64Base + CPM_MMIO_SIZE + HQM_MMIO_SIZE
 				     + CPM_MMIO_SIZE + HQM_MMIO_SIZE;
 			mem64_limit = ri->PciResourceMem64Limit;
-			snprintf(tres, sizeof(tres), "DT%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.DI%d%X", socket, stack);
 		} else if (rlist[i] == DSDT_CPM) {
 			bus_base = ri->BusBase + CPM_BUS_OFFSET;
 			bus_limit = bus_base + CPM_RESERVED_BUS;
 			mem64_base = ri->PciResourceMem64Base;
 			mem64_limit = mem64_base + CPM_MMIO_SIZE - 1;
-			snprintf(tres, sizeof(tres), "MT%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.PM%d%X", socket, stack);
 		} else if (rlist[i] == DSDT_HQM) {
 			bus_base = ri->BusBase + HQM_BUS_OFFSET;
 			bus_limit = bus_base + HQM_RESERVED_BUS;
 			mem64_base = ri->PciResourceMem64Base + CPM_MMIO_SIZE;
 			mem64_limit = mem64_base + HQM_MMIO_SIZE - 1;
-			snprintf(tres, sizeof(tres), "HT%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.HQ%d%X", socket, stack);
 		} else if (rlist[i] == DSDT_CPM1) {
 			bus_base = ri->BusBase + CPM1_BUS_OFFSET;
 			bus_limit = bus_base + CPM_RESERVED_BUS;
 			mem64_base = ri->PciResourceMem64Base + CPM_MMIO_SIZE + HQM_MMIO_SIZE;
 			mem64_limit = mem64_base + CPM_MMIO_SIZE - 1;
-			snprintf(tres, sizeof(tres), "MU%d%X", socket, stack);
-		} else { // DSDT_HQM1
+			snprintf(tres, sizeof(tres), "\\_SB.PN%d%X", socket, stack);
+		} else {
 			bus_base = ri->BusBase + HQM1_BUS_OFFSET;
 			bus_limit = bus_base + HQM_RESERVED_BUS;
 			mem64_base = ri->PciResourceMem64Base + CPM_MMIO_SIZE + HQM_MMIO_SIZE
 				     + CPM_MMIO_SIZE;
 			mem64_limit = mem64_base + HQM_MMIO_SIZE - 1;
-			snprintf(tres, sizeof(tres), "HU%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.HR%d%X", socket, stack);
 		}
 
 		/* Note, some SKU doesn't provide CPM1 and HQM1 and owns smaller bus ranges
@@ -260,7 +263,8 @@
 		       "stack: %d\n bus_base:0x%x, bus_limit:0x%x\n",
 		       tres, socket, stack, bus_base, bus_limit);
 
-		acpigen_write_name(tres);
+		acpigen_write_scope(tres);
+		acpigen_write_name("_CRS");
 		acpigen_write_resourcetemplate_header();
 
 		acpigen_resource_word(2, 0xc, 0, 0, bus_base, bus_limit, 0x0,
@@ -278,6 +282,7 @@
 			(mem64_limit - mem64_base + 1));
 
 		acpigen_write_resourcetemplate_footer();
+		acpigen_pop_len();
 	}
 }
 
@@ -287,19 +292,19 @@
 	   Stacks D .. E (TYPE_UBOX)
 		Scope: UC/UD<socket><0..1> for UBOX[1-2], ResourceTemplate: UT/UU
 	*/
-
 	for (int i = 0; i < 2; ++i) {
 		char tres[16];
-		/* write ResourceTemplate resource name */
+		/* write _CRS scope */
 		if (i == 0)
-			snprintf(tres, sizeof(tres), "UT%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.UC%d%X", socket, stack);
 		else
-			snprintf(tres, sizeof(tres), "UU%d%X", socket, stack);
+			snprintf(tres, sizeof(tres), "\\_SB.UD%d%X", socket, stack);
 
 		printk(BIOS_DEBUG, "\tCreating ResourceTemplate %s for socket: %d, stack: %d\n",
 		       tres, socket, stack);
 
-		acpigen_write_name(tres);
+		acpigen_write_scope(tres);
+		acpigen_write_name("_CRS");
 		acpigen_write_resourcetemplate_header();
 
 		if (!stack_enabled)
@@ -311,6 +316,7 @@
 					      0x0, 1);
 
 		acpigen_write_resourcetemplate_footer();
+		acpigen_pop_len();
 	}
 }
 
@@ -330,7 +336,7 @@
 		acpigen_write_name_integer(stack_sta, ACPI_STATUS_DEVICE_ALL_ON);
 }
 
-void uncore_inject_dsdt(const struct device *device)
+void uncore_fill_ssdt(const struct device *device)
 {
 	bool stack_enabled;
 
@@ -354,8 +360,6 @@
 
 	printk(BIOS_DEBUG, "%s device: %s\n", __func__, dev_path(device));
 
-	acpigen_write_scope("\\_SB");
-
 	/* The _CSR generation must match SPR iiostack.asl. */
 	const IIO_UDS *hob = get_iio_uds();
 	/* Iterate over CONFIG_MAX_SOCKET to keep ASL templates and DSDT injection in sync */
@@ -383,8 +387,6 @@
 			}
 		}
 	}
-
-	acpigen_pop_len();
 }
 
 /* TODO: See if we can use the common generate_p_state_entries */
diff --git a/src/soc/intel/xeon_sp/uncore.c b/src/soc/intel/xeon_sp/uncore.c
index c8e1c36..1b232ea 100644
--- a/src/soc/intel/xeon_sp/uncore.c
+++ b/src/soc/intel/xeon_sp/uncore.c
@@ -349,7 +349,7 @@
 	.init              = mmapvtd_init,
 	.ops_pci           = &soc_pci_ops,
 #if CONFIG(HAVE_ACPI_TABLES)
-	.acpi_inject_dsdt  = uncore_inject_dsdt,
+	.acpi_fill_ssdt  = uncore_fill_ssdt,
 #endif
 };