Use the PCI mmconfig base address exported by jailhouse in boot parameters in order to access the memory mapped PCI configuration space.
Signed-off-by: Otavio Pontes <[email protected]> --- arch/x86/include/asm/pci_x86.h | 2 ++ arch/x86/kernel/jailhouse.c | 16 ++++++++++++++++ arch/x86/pci/mmconfig-shared.c | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index d08eacd298c2..114a39efb10c 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h @@ -147,6 +147,8 @@ extern int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, phys_addr_t addr); extern int pci_mmconfig_delete(u16 seg, u8 start, u8 end); extern struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus); +extern struct pci_mmcfg_region *__init pci_mmconfig_add(int segment, int start, + int end, u64 addr); extern struct list_head pci_mmcfg_list; diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c index eedce3f921b4..70a7d7ab0549 100644 --- a/arch/x86/kernel/jailhouse.c +++ b/arch/x86/kernel/jailhouse.c @@ -12,6 +12,7 @@ #include <linux/acpi_pmtmr.h> #include <linux/kernel.h> +#include <linux/pci.h> #include <linux/serial_8250.h> #include <asm/apic.h> #include <asm/cpu.h> @@ -26,11 +27,14 @@ */ struct jailhouse_setup_data { struct setup_data header; + u64 pci_mmconfig_base; u16 pm_timer_address; u16 num_cpus; u8 cpu_ids[255]; }; +static u64 pci_mmconfig_base; + static uint32_t jailhouse_cpuid_base(void) { if (boot_cpu_data.cpuid_level < 0 || @@ -130,6 +134,16 @@ static unsigned int x2apic_get_apic_id(unsigned long id) return id; } +static int jailhouse_pci_init(void) +{ + if (pci_mmconfig_base) { + pci_mmconfig_add(0, 0, 0xff, pci_mmconfig_base); + pci_mmcfg_arch_init(); + } + + return 0; +} + static void __init jailhouse_init_platform(void) { /* @@ -149,6 +163,7 @@ static void __init jailhouse_init_platform(void) x86_init.timers.timer_init = jailhouse_timer_init; x86_init.irqs.pre_vector_init = x86_init_noop; + x86_init.pci.init = jailhouse_pci_init; legacy_pic = &null_legacy_pic; x86_platform.get_wallclock = jailhouse_get_wallclock; @@ -158,6 +173,7 @@ static void __init jailhouse_init_platform(void) data = early_memremap(pa_data, sizeof(*data)); pmtmr_ioport = data->pm_timer_address; printk(KERN_INFO "Jailhouse: PM-Timer IO Port: %#x\n", pmtmr_ioport); + pci_mmconfig_base = data->pci_mmconfig_base; /* * Register x2APIC handlers early. We need them when running diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index dd30b7e08bc2..53ce81d5126d 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c @@ -93,8 +93,8 @@ static struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start, return new; } -static struct pci_mmcfg_region *__init pci_mmconfig_add(int segment, int start, - int end, u64 addr) +struct pci_mmcfg_region *__init pci_mmconfig_add(int segment, int start, + int end, u64 addr) { struct pci_mmcfg_region *new; -- 2.14.3 -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
