diff options
author | Yang Zhong <yang.zhong@intel.com> | 2017-03-30 18:32:53 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2017-03-30 10:47:29 +0200 |
commit | ac9488f26528394856b94bda0797f5bd9c69a26a (patch) | |
tree | b014a3d8bb551b6c63f9e6954e76500fe1508448 /hwsetup.c | |
parent | ea7d0e304775e81c07269e22b4412d328c3fb2fa (diff) | |
download | qboot-ac9488f26528394856b94bda0797f5bd9c69a26a.zip qboot-ac9488f26528394856b94bda0797f5bd9c69a26a.tar.gz qboot-ac9488f26528394856b94bda0797f5bd9c69a26a.tar.bz2 |
qboot: enable mmconfig
Need to enable mmconfig in qboot and also need to reserve
mmconfig space in bios.
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
Message-Id: <1490869973-4562-1-git-send-email-yang.zhong@intel.com>
[Do not affect e820 memory map on i440FX chipset. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hwsetup.c')
-rw-r--r-- | hwsetup.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -127,3 +127,31 @@ void setup_hw(void) setup_pic(); } + +#define Q35_HOST_BRIDGE_PCIEXBAREN 1 +#define Q35_HOST_BRIDGE_PCIEXBAR 0x60 + +static void setup_q35_mmconfig(void) +{ + const int bdf = 0; + uint64_t addr = PCIE_MMCONFIG_BASE; + uint32_t upper = addr >> 32; + uint32_t lower = (addr & 0xffffffff) | Q35_HOST_BRIDGE_PCIEXBAREN; + + pci_config_writel(bdf, Q35_HOST_BRIDGE_PCIEXBAR, 0); + pci_config_writel(bdf, Q35_HOST_BRIDGE_PCIEXBAR + 4, upper); + pci_config_writel(bdf, Q35_HOST_BRIDGE_PCIEXBAR, lower); +} + +bool setup_mmconfig(void) +{ + const int bdf = 0; + uint32_t id = pci_config_readl(bdf, 0); + + if (id == (PCI_VENDOR_ID_INTEL | (PCI_DEVICE_ID_INTEL_Q35_MCH << 16))) { + setup_q35_mmconfig(); + return true; + } + + return false; +} |