[OpenBIOS] [PATCH v4] arch/ppc/qemu: Add a node for the other (empty) PCI bus to the device tree

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Fri Jun 29 19:22:20 CEST 2018


On 20/11/16 18:04, BALATON Zoltan wrote:

> QEMU emulates two of the three PCI buses found on real hardware because
> some clients seem to need both and fail with only one present, but
> OpenBIOS only handles a single PCI bus and initialises and puts in the
> device tree only one of these: the second one which is where devices are
> connected and also marks it bus 0. However, clients getting info from the
> device tree may not know about this and thinking there is only one PCI
> bus they erroneously use the address of the first bus to access PCI
> config registers for devices on the second bus which silently fails as
> these requests will go to the other empty bus emulated and return invalid
> values. Devices mapped via MMIO still appear to work but they may not be
> correctly initialised and some cards are not detected because of this.
> 
> Until support for multiple PCI buses is implemented add an empty node in
> the device tree for the uninitialised bus to let clients know about it.
> This is still not entirely correct as bus-range property does not match
> real hardware but this fixes detecting PCI devices (such as USB) under
> MorphOS and may also fix enabling the bus master bit needed with some
> network cards and allow the workarund for this to be reverted.
> 
> Signed-off-by: BALATON Zoltan <balaton at eik.bme.hu>
> ---
> v4: Rebased to latest master
> v3: See:
> https://mail.coreboot.org/pipermail/openbios/2017-January/009867.html
> 
>   arch/ppc/qemu/init.c | 43 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 43 insertions(+)
> 
> diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
> index af15682..d362b0e 100644
> --- a/arch/ppc/qemu/init.c
> +++ b/arch/ppc/qemu/init.c
> @@ -716,6 +716,48 @@ static void kvm_of_init(void)
>       fword("finish-device");
>   }
>   
> +static void empty_pci_bus_init(void)
> +{
> +    if (machine_id == ARCH_MAC99) {
> +        /* Add empty node for first pci bus */
> +        /* Remove this when pci driver is fixed to handle multiple buses */
> +        activate_device("/");
> +        fword("new-device");
> +        push_str("pci");
> +        fword("device-name");
> +        push_str("pci");
> +        fword("device-type");
> +        PUSH(0xf0000000);
> +        fword("encode-int");
> +        PUSH(0x02000000);
> +        fword("encode-int");
> +        fword("encode+");
> +        push_str("reg");
> +        fword("property");
> +        PUSH(3);
> +        fword("encode-int");
> +        push_str("#address-cells");
> +        fword("property");
> +        PUSH(2);
> +        fword("encode-int");
> +        push_str("#size-cells");
> +        fword("property");
> +        PUSH(1);
> +        fword("encode-int");
> +        push_str("#interrupt-cells");
> +        fword("property");
> +        PUSH(0);
> +        fword("encode-int");
> +        PUSH(0);
> +        fword("encode-int");
> +        fword("encode+");
> +        push_str("bus-range");
> +        fword("property");
> +        fword("finish-device");
> +        device_end();
> +    }
> +}
> +
>   /*
>    *  filll        ( addr bytes quad -- )
>    */
> @@ -857,6 +899,7 @@ arch_of_init(void)
>       feval("['] ppc-dma-sync to (dma-sync)");
>   
>   #ifdef CONFIG_DRIVER_PCI
> +    empty_pci_bus_init();
>       ob_pci_init();
>   #endif

I'm still not a great fan of this patch, although now with my latest 
uninorth rework at least there is actually a PCI bus present at 
0xf0000000 so if OSs scan the device tree and locate the bus, accesses 
there won't fail.

Having thought about it though, I do have a better idea: if the issue is 
simply that "bus-range" needs to be set to different starting value then 
my work on adding PCI bridge support to OpenBIOS has just about solved this.

How about changing ob_pci_init() to take a single bus_num int which is 
the starting bus number and then passing that down into 
ob_configure_pci_device()? That will allow you to set the correct 
bus_num for the 0xf2000000 PCI bus which should solve your problem, and 
also get OpenBIOS a small step closer to multiple PCI bus support.


ATB,

Mark.



More information about the OpenBIOS mailing list