Attention is currently required from: Arthur Heymans, Christian Walter, Cliff Huang, Johnny Lin, Lance Zhao, Tim Chu, Tim Wawrzynczak.
Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/80258?usp=email )
Change subject: acpi/acpi: Pass struct device to acpi_create_srat_gia_pci ......................................................................
acpi/acpi: Pass struct device to acpi_create_srat_gia_pci
Instead of S:B:D:F numbers pass the struct device to acpi_create_srat_gia_pci and let it extract the information needed.
This also adds support for PCI multi segment groups.
Change-Id: Iafe32e98f0c85f14347695ccaa0225e43fad99e7 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/acpi/acpi.c M src/include/acpi/acpi.h M src/soc/intel/xeon_sp/uncore_acpi_cxl.c 3 files changed, 15 insertions(+), 15 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/58/80258/1
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c index 6bf452e..98c8ecd 100644 --- a/src/acpi/acpi.c +++ b/src/acpi/acpi.c @@ -352,17 +352,22 @@ }
int acpi_create_srat_gia_pci(acpi_srat_gia_t *gia, u32 proximity_domain, - u16 seg, u8 bus, u8 dev, u8 func, u32 flags) + struct device *dev, u32 flags) { + /* Only handle PCI devices. */ + if (dev->path.type != DEVICE_PATH_PCI) + return 0; + gia->type = ACPI_SRAT_STRUCTURE_GIA; gia->length = sizeof(acpi_srat_gia_t); gia->proximity_domain = proximity_domain; gia->dev_handle_type = ACPI_SRAT_GIA_DEV_HANDLE_PCI; /* First two bytes has segment number */ - memcpy(gia->dev_handle, &seg, 2); - gia->dev_handle[2] = bus; /* Byte 2 has bus number */ + gia->dev_handle[0] = dev->upstream->segment_group; + gia->dev_handle[1] = 0; + gia->dev_handle[2] = dev->upstream->secondary; /* Byte 2 has bus number */ /* Byte 3 has bits 7:3 for dev, bits 2:0 for func */ - gia->dev_handle[3] = PCI_SLOT(dev) | PCI_FUNC(func); + gia->dev_handle[3] = dev->path.pci.devfn; gia->flags = flags;
return gia->length; diff --git a/src/include/acpi/acpi.h b/src/include/acpi/acpi.h index d5f4008..c39683e 100644 --- a/src/include/acpi/acpi.h +++ b/src/include/acpi/acpi.h @@ -1782,7 +1782,7 @@ * and flag, create Generic Initiator Affinity structure in SRAT. */ int acpi_create_srat_gia_pci(acpi_srat_gia_t *gia, u32 proximity_domain, - u16 seg, u8 bus, u8 dev, u8 func, u32 flags); + struct device *dev, u32 flags); unsigned long acpi_create_srat_lapics(unsigned long current); void acpi_create_srat(acpi_srat_t *srat, unsigned long (*acpi_fill_srat)(unsigned long current)); diff --git a/src/soc/intel/xeon_sp/uncore_acpi_cxl.c b/src/soc/intel/xeon_sp/uncore_acpi_cxl.c index 6785937..40a5f12 100644 --- a/src/soc/intel/xeon_sp/uncore_acpi_cxl.c +++ b/src/soc/intel/xeon_sp/uncore_acpi_cxl.c @@ -12,19 +12,14 @@ * In the pds (Proximity Domains structure), Generic Initiator domains * are after processor domains. */ - uint16_t seg = 0; - uint8_t bus, dev, func; uint32_t base, size; for (uint8_t i = soc_get_num_cpus(); i < pds.num_pds; i++) { - bus = PCI_BDF(pds.pds[i].dev) >> 20; - dev = (PCI_BDF(pds.pds[i].dev) >> 15) & 0x1f; - func = (PCI_BDF(pds.pds[i].dev) >> 12) & 0x07; - printk(BIOS_DEBUG, - "adding srat GIA ID: %d, seg: 0x%x, bus: 0x%x, dev: 0x%x, func: 0x%x\n", - i, seg, bus, dev, func); + if (!pds.pds[i].dev) + continue; + + printk(BIOS_DEBUG, "adding srat GIA ID: %d, dev: %s\n", i, dev_path(pds.pds[i].dev)); /* flags: 1 (enabled) */ - current += acpi_create_srat_gia_pci((acpi_srat_gia_t *)current, i, seg, bus, - dev, func, 1); + current += acpi_create_srat_gia_pci((acpi_srat_gia_t *)current, i, pds.pds[i].dev, 1); base = pds.pds[i].base << 16; size = pds.pds[i].size << 16; printk(BIOS_DEBUG,