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> Reviewed-on: https://review.coreboot.org/c/coreboot/+/80258 Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-by: Shuo Liu <shuo.liu@intel.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
f25d58c9a5
commit
344ebf1f81
@ -352,17 +352,22 @@ int acpi_create_srat_mem(acpi_srat_mem_t *mem, u8 node, u32 basek, u32 sizek,
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -1782,7 +1782,7 @@ int acpi_create_srat_mem(acpi_srat_mem_t *mem, u8 node, u32 basek, u32 sizek,
|
||||
* 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));
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include <device/pci_ops.h>
|
||||
#include <soc/acpi.h>
|
||||
#include <soc/numa.h>
|
||||
#include <soc/util.h>
|
||||
@ -13,19 +12,14 @@ unsigned long cxl_fill_srat(unsigned long current)
|
||||
* 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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user