summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2024-10-22 09:00:43 +0200
committerLean Sheng Tan <sheng.tan@9elements.com>2024-11-08 07:34:47 +0000
commit352d06451b24b8d9d99b07ebbb2b41af21a29607 (patch)
treea44d7ee625551bb32fd893d9cbd16c3fb6ce5306 /src
parent6cdcd3f07d9fa0b6464c9fd274b345f02c5c84b3 (diff)
soc/intel/xeon_sp: Reduce stack usage by 18KiB
Reduce stack usage of acpi_fill_srat_memory() by 18KiB. Directly write the SRAT table entries instead of using a temporary buffer on the stack. FIXES: Crash on ocp/tiogapass when writing SRAT table TEST: Still boots on intel/archercity_crb Change-Id: I91a6787ade8b465da7837b241c0aab00251f7de4 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/84832 Reviewed-by: Shuo Liu <shuo.liu@intel.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r--src/soc/intel/xeon_sp/include/soc/acpi.h1
-rw-r--r--src/soc/intel/xeon_sp/uncore_acpi.c136
2 files changed, 65 insertions, 72 deletions
diff --git a/src/soc/intel/xeon_sp/include/soc/acpi.h b/src/soc/intel/xeon_sp/include/soc/acpi.h
index 061814790c..0e93dc2bd2 100644
--- a/src/soc/intel/xeon_sp/include/soc/acpi.h
+++ b/src/soc/intel/xeon_sp/include/soc/acpi.h
@@ -6,7 +6,6 @@
#include <acpi/acpi.h>
#define MAX_SRAT_MEM_ENTRIES_PER_IMC 8
-#define MAX_ACPI_MEMORY_AFFINITY_COUNT 256
/**
Select C-state map set in config cstate_states
diff --git a/src/soc/intel/xeon_sp/uncore_acpi.c b/src/soc/intel/xeon_sp/uncore_acpi.c
index 099b235614..949c88bb09 100644
--- a/src/soc/intel/xeon_sp/uncore_acpi.c
+++ b/src/soc/intel/xeon_sp/uncore_acpi.c
@@ -74,90 +74,84 @@ unsigned long acpi_create_srat_lapics(unsigned long current)
return current;
}
-static unsigned int get_srat_memory_entries(acpi_srat_mem_t *srat_mem)
+static void acpi_fill_srat_memory(int *cnt, acpi_srat_mem_t *current,
+ const struct SystemMemoryMapElement *e)
{
- const struct SystemMemoryMapHob *memory_map;
- unsigned int mmap_index;
-
- memory_map = get_system_memory_map();
- assert(memory_map);
- printk(BIOS_DEBUG, "memory_map: %p\n", memory_map);
-
- mmap_index = 0;
- for (int e = 0; e < memory_map->numberEntries; ++e) {
- const struct SystemMemoryMapElement *mem_element = &memory_map->Element[e];
- uint64_t addr =
- (uint64_t)((uint64_t)mem_element->BaseAddress <<
- MEM_ADDR_64MB_SHIFT_BITS);
- uint64_t size =
- (uint64_t)((uint64_t)mem_element->ElementSize <<
- MEM_ADDR_64MB_SHIFT_BITS);
-
- printk(BIOS_DEBUG, "memory_map %d addr: 0x%llx, BaseAddress: 0x%x, size: 0x%llx, "
- "ElementSize: 0x%x, type: %d, reserved: %d\n",
- e, addr, mem_element->BaseAddress, size,
- mem_element->ElementSize, mem_element->Type,
- is_memtype_reserved(mem_element->Type));
-
- assert(mmap_index < MAX_ACPI_MEMORY_AFFINITY_COUNT);
-
- /* skip reserved memory region */
- if (is_memtype_reserved(mem_element->Type))
- continue;
- /* skip all non processor attached memory regions */
- if (CONFIG(SOC_INTEL_HAS_CXL) &&
- (!is_memtype_processor_attached(mem_element->Type)))
- continue;
-
- /* skip if this address is already added */
- bool skip = false;
- for (int idx = 0; idx < mmap_index; ++idx) {
- uint64_t base_addr = ((uint64_t)srat_mem[idx].base_address_high << 32) +
- srat_mem[idx].base_address_low;
- if (addr == base_addr) {
- skip = true;
- break;
- }
+ acpi_srat_mem_t srat;
+ uint64_t addr, size;
+
+ addr = ((uint64_t)e->BaseAddress << MEM_ADDR_64MB_SHIFT_BITS);
+ size = ((uint64_t)e->ElementSize << MEM_ADDR_64MB_SHIFT_BITS);
+
+ printk(BIOS_DEBUG, "SRAT: sysmemmap addr: 0x%llx, BaseAddress: 0x%x, size: 0x%llx, "
+ "ElementSize: 0x%x, type: %d, reserved: %d\n", addr, e->BaseAddress,
+ size, e->ElementSize, e->Type, is_memtype_reserved(e->Type));
+
+ /* skip reserved memory region */
+ if (is_memtype_reserved(e->Type))
+ return;
+
+ /* skip all non processor attached memory regions */
+ if (CONFIG(SOC_INTEL_HAS_CXL) &&
+ (!is_memtype_processor_attached(e->Type)))
+ return;
+
+ /* Prepare ACPI table entry */
+ memset(&srat, 0, sizeof(acpi_srat_mem_t));
+
+ srat.type = 1; /* Memory affinity structure */
+ srat.length = sizeof(acpi_srat_mem_t);
+ srat.base_address_low = (uint32_t)(addr & 0xffffffff);
+ srat.base_address_high = (uint32_t)(addr >> 32);
+ srat.length_low = (uint32_t)(size & 0xffffffff);
+ srat.length_high = (uint32_t)(size >> 32);
+ srat.proximity_domain = memory_to_pd(e);
+ srat.flags = ACPI_SRAT_MEMORY_ENABLED;
+ if (is_memtype_non_volatile(e->Type))
+ srat.flags |= ACPI_SRAT_MEMORY_NONVOLATILE;
+
+ /* skip if this address is already added */
+ bool skip = false;
+ for (int i = 0; i < *cnt; i++) {
+ if ((srat.base_address_high == current[-i].base_address_high) &&
+ (srat.base_address_low == current[-i].base_address_low)) {
+ skip = true;
+ break;
}
- if (skip)
- continue;
-
- srat_mem[mmap_index].type = 1; /* Memory affinity structure */
- srat_mem[mmap_index].length = sizeof(acpi_srat_mem_t);
- srat_mem[mmap_index].base_address_low = (uint32_t)(addr & 0xffffffff);
- srat_mem[mmap_index].base_address_high = (uint32_t)(addr >> 32);
- srat_mem[mmap_index].length_low = (uint32_t)(size & 0xffffffff);
- srat_mem[mmap_index].length_high = (uint32_t)(size >> 32);
- srat_mem[mmap_index].proximity_domain = memory_to_pd(mem_element);
- srat_mem[mmap_index].flags = ACPI_SRAT_MEMORY_ENABLED;
- if (is_memtype_non_volatile(mem_element->Type))
- srat_mem[mmap_index].flags |= ACPI_SRAT_MEMORY_NONVOLATILE;
- ++mmap_index;
}
- return mmap_index;
+ if (!skip) {
+ printk(BIOS_DEBUG, "SRAT: adding memory %d entry length: %d, addr: 0x%x%x, "
+ "length: 0x%x%x, proximity_domain: %d, flags: %x\n",
+ *cnt, srat.length, srat.base_address_high, srat.base_address_low,
+ srat.length_high, srat.length_low, srat.proximity_domain, srat.flags);
+
+ memcpy(current, &srat, sizeof(acpi_srat_mem_t));
+ (*cnt)++;
+ }
}
static unsigned long acpi_fill_srat(unsigned long current)
{
- acpi_srat_mem_t srat_mem[MAX_ACPI_MEMORY_AFFINITY_COUNT];
- unsigned int mem_count;
+ const struct SystemMemoryMapHob *memory_map;
+ acpi_srat_mem_t *acpi_srat;
+ int cnt = 0;
+
+ memory_map = get_system_memory_map();
+ assert(memory_map);
+ printk(BIOS_DEBUG, "SRAT: memory_map: %p\n", memory_map);
/* create all subtables for processors */
current = acpi_create_srat_lapics(current);
+ acpi_srat = (acpi_srat_mem_t *)current;
- memset(srat_mem, 0, sizeof(srat_mem));
- mem_count = get_srat_memory_entries(srat_mem);
- for (int i = 0; i < mem_count; ++i) {
- printk(BIOS_DEBUG, "adding srat memory %d entry length: %d, addr: 0x%x%x, "
- "length: 0x%x%x, proximity_domain: %d, flags: %x\n",
- i, srat_mem[i].length,
- srat_mem[i].base_address_high, srat_mem[i].base_address_low,
- srat_mem[i].length_high, srat_mem[i].length_low,
- srat_mem[i].proximity_domain, srat_mem[i].flags);
- memcpy((acpi_srat_mem_t *)current, &srat_mem[i], sizeof(srat_mem[i]));
- current += srat_mem[i].length;
+ for (int i = 0; i < memory_map->numberEntries; ++i) {
+ const struct SystemMemoryMapElement *e = &memory_map->Element[i];
+ acpi_fill_srat_memory(&cnt, &acpi_srat[cnt], e);
}
+ printk(BIOS_DEBUG, "SRAT: Added %d memory entries\n", cnt);
+
+ current = (unsigned long)&acpi_srat[cnt];
if (CONFIG(SOC_INTEL_HAS_CXL))
current = cxl_fill_srat(current);