Lean Sheng Tan has submitted this change. ( https://review.coreboot.org/c/coreboot/+/80092?usp=email )
(
3 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: soc/intel/xeon_sp: Find VTD devices by PCI DEV ID ......................................................................
soc/intel/xeon_sp: Find VTD devices by PCI DEV ID
Instead of manually crafting S:B:D:F numbers for every VTD device loop over the entire devicetree by PCI DEV IDs.
This adds PCI multi-segment support without any further code modifications, since the correct PCI segment will be stored in the devicetree.
Change-Id: I1c24d26e105c3dcbd9cca0e7197ab1362344aa96 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/80092 Reviewed-by: Arthur Heymans arthur@aheymans.xyz Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Shuo Liu shuo.liu@intel.com --- M src/soc/intel/xeon_sp/memmap.c 1 file changed, 10 insertions(+), 26 deletions(-)
Approvals: Shuo Liu: Looks good to me, but someone else must approve build bot (Jenkins): Verified Arthur Heymans: Looks good to me, approved
diff --git a/src/soc/intel/xeon_sp/memmap.c b/src/soc/intel/xeon_sp/memmap.c index a9236a9..8fe21e8 100644 --- a/src/soc/intel/xeon_sp/memmap.c +++ b/src/soc/intel/xeon_sp/memmap.c @@ -4,6 +4,7 @@ #include <cbmem.h> #include <console/console.h> #include <device/pci_ops.h> +#include <device/pci_ids.h> #include <cpu/x86/smm.h> #include <soc/soc_util.h> #include <soc/pci_devs.h> @@ -53,7 +54,6 @@ #if !defined(__SIMPLE_DEVICE__) union dpr_register txt_get_chipset_dpr(void) { - const IIO_UDS *hob = get_iio_uds(); union dpr_register dpr; struct device *dev = VTD_DEV(0);
@@ -66,31 +66,15 @@
dpr.raw = pci_read_config32(dev, VTD_LTDPR);
- /* Compare the LTDPR register on all iio stacks */ - for (int socket = 0, iio = 0; iio < hob->PlatformData.numofIIO; ++socket) { - if (!soc_cpu_is_enabled(socket)) - continue; - iio++; - for (int stack = 0; stack < MAX_IIO_STACK; ++stack) { - const STACK_RES *ri = - &hob->PlatformData.IIO_resource[socket].StackRes[stack]; - if (ri->VtdBarAddress == 0) - continue; - uint8_t bus = ri->BusBase; - dev = VTD_DEV(bus); - - if (!dev) { - printk(BIOS_ERR, "BUS %x: Unable to find VTD PCI dev\n", bus); - dpr.raw = 0; - return dpr; - } - - union dpr_register test_dpr = { .raw = pci_read_config32(dev, VTD_LTDPR) }; - if (dpr.raw != test_dpr.raw) { - printk(BIOS_ERR, "LTDPR not the same on all IIO's"); - dpr.raw = 0; - return dpr; - } + dev = NULL; + /* Look for VTD devices on all sockets */ + while ((dev = dev_find_device(PCI_VID_INTEL, MMAP_VTD_STACK_CFG_REG_DEVID, dev))) { + /* Compare the LTDPR register on all iio stacks */ + union dpr_register test_dpr = { .raw = pci_read_config32(dev, VTD_LTDPR) }; + if (dpr.raw != test_dpr.raw) { + printk(BIOS_ERR, "LTDPR not the same on all IIO's"); + dpr.raw = 0; + return dpr; } } return dpr;