diff options
author | Shuo Liu <shuo.liu@intel.com> | 2024-05-15 04:32:08 +0800 |
---|---|---|
committer | Lean Sheng Tan <sheng.tan@9elements.com> | 2024-06-28 11:27:34 +0000 |
commit | 0a6f5188e80d888529e2067d02add19f65cb013c (patch) | |
tree | 05b052963e295911fa67fc0b41169d0393317fb2 /src/soc/intel/xeon_sp/uncore.c | |
parent | bcd247376633b0fb4f1dbfbf8c2e02d2c926adec (diff) |
soc/intel/xeon_sp: Reserve MMIO range for VTd BAR dynamically
vtd_probe_bar_size is used to decide the BAR size.
TEST=Build and boot on intel/archercity CRB
Change-Id: Ie45dd29e386cbfcb136ce2152aba2ec67757ee3c
Signed-off-by: Shuo Liu <shuo.liu@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/82431
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel/xeon_sp/uncore.c')
-rw-r--r-- | src/soc/intel/xeon_sp/uncore.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/soc/intel/xeon_sp/uncore.c b/src/soc/intel/xeon_sp/uncore.c index d2d46220a2..96451913fd 100644 --- a/src/soc/intel/xeon_sp/uncore.c +++ b/src/soc/intel/xeon_sp/uncore.c @@ -51,6 +51,20 @@ enum { NUM_MAP_ENTRIES }; +size_t vtd_probe_bar_size(struct device *dev) +{ + uint32_t id = pci_read_config32(dev, PCI_VENDOR_ID); + assert(id == (PCI_VID_INTEL | (MMAP_VTD_CFG_REG_DEVID << 16))); + + uint32_t val = pci_read_config32(dev, VTD_BAR_CSR); + pci_write_config32(dev, VTD_BAR_CSR, (uint32_t)(-4 * KiB)); + size_t size = (~(pci_read_config32(dev, VTD_BAR_CSR) & ((uint32_t)(-4 * KiB)))) + 1; + assert(size != 0); + pci_write_config32(dev, VTD_BAR_CSR, val); + + return size; +} + static struct map_entry memory_map[NUM_MAP_ENTRIES] = { [TOHM_REG] = MAP_ENTRY_LIMIT_64(VTD_TOHM_CSR, 26, "TOHM"), [MMIOL_REG] = MAP_ENTRY_BASE_32(VTD_MMIOL_CSR, "MMIOL"), @@ -211,7 +225,8 @@ static void mc_add_dram_resources(struct device *dev, int *res_count) mc_report_map_entries(dev, &mc_values[0]); if (mc_values[VTDBAR_REG]) { - res = mmio_range(dev, VTD_BAR_CSR, mc_values[VTDBAR_REG], 8 * KiB); + res = mmio_range(dev, VTD_BAR_CSR, mc_values[VTDBAR_REG], + vtd_probe_bar_size(dev)); LOG_RESOURCE("vtd_bar", dev, res); } |