Re: [PATCH v2 12/12] x86/jailhouse: Initialize PCI support

From: Bjorn Helgaas
Date: Mon Jan 22 2018 - 17:26:23 EST


On Mon, Nov 27, 2017 at 09:11:54AM +0100, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@xxxxxxxxxxx>
>
> With this change, PCI devices can be detected and used inside a non-root
> cell.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx>
> ---
> arch/x86/kernel/jailhouse.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c
> index 8ff21e1534de..70b857d4b1f5 100644
> --- a/arch/x86/kernel/jailhouse.c
> +++ b/arch/x86/kernel/jailhouse.c
> @@ -18,6 +18,7 @@
> #include <asm/hypervisor.h>
> #include <asm/i8259.h>
> #include <asm/irqdomain.h>
> +#include <asm/pci_x86.h>
> #include <asm/reboot.h>
> #include <asm/setup.h>
>
> @@ -108,6 +109,19 @@ static void jailhouse_no_restart(void)
> machine_halt();
> }
>
> +static int __init jailhouse_pci_arch_init(void)
> +{
> + pci_direct_init(1);
> +
> + /*
> + * There are no bridges on the virtual PCI root bus under Jailhouse,
> + * thus no other way to discover all devices than a full scan.
> + */
> + pcibios_last_bus = 0xff;

Can you help me understand the comment here? If the virtual root bus
is bus 00, are you saying the guest might see devices on bus 00 and
bus 01, with no bus 00 bridge that leads to bus 01?

I suspect you mean something different because you say elsewhere that
ARM "just works" because DT provides more configurability. But even
on ARM with DT, we probe the root bus and only probe other buses when
we find bridges leading to them.

So I suspect the purpose of this may be to discover devices that are
below host bridges not exposed by ACPI. For example, my BIOS may
expose one host bridge:

ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-7e])

but the chipset may implement devices on bus 7f even though the BIOS
did not advertise the host bridge leading to that bus. This is a case
of a missing host bridge, not a missing bridge on the root bus.

Can you show an example "lspci -v" output to make this concrete?

> + return 0;
> +}
> +
> static void __init jailhouse_init_platform(void)
> {
> u64 pa_data = boot_params.hdr.setup_data;
> @@ -117,6 +131,7 @@ static void __init jailhouse_init_platform(void)
> x86_init.irqs.pre_vector_init = x86_init_noop;
> x86_init.timers.timer_init = jailhouse_timer_init;
> x86_init.mpparse.get_smp_config = jailhouse_get_smp_config;
> + x86_init.pci.arch_init = jailhouse_pci_arch_init;
>
> x86_platform.calibrate_cpu = jailhouse_get_tsc;
> x86_platform.calibrate_tsc = jailhouse_get_tsc;
> @@ -159,6 +174,8 @@ static void __init jailhouse_init_platform(void)
>
> precalibrated_tsc_khz = setup_data.tsc_khz;
>
> + pci_probe = 0;
> +
> /*
> * Avoid that the kernel complains about missing ACPI tables - there
> * are none in a non-root cell.
> --
> 2.12.3
>