aboutsummaryrefslogtreecommitdiff
path: root/hwsetup.c
diff options
context:
space:
mode:
authorYang Zhong <yang.zhong@intel.com>2017-03-30 18:32:53 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2017-03-30 10:47:29 +0200
commitac9488f26528394856b94bda0797f5bd9c69a26a (patch)
treeb014a3d8bb551b6c63f9e6954e76500fe1508448 /hwsetup.c
parentea7d0e304775e81c07269e22b4412d328c3fb2fa (diff)
downloadqboot-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.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/hwsetup.c b/hwsetup.c
index 0e186eb..e8a452e 100644
--- a/hwsetup.c
+++ b/hwsetup.c
@@ -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;
+}