[OpenBIOS] [PATCH 3/4 v2] 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 Jan 27 21:30:29 CET 2017


On 11/01/17 23:08, 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 workaround for this to be reverted.
> 
> Signed-off-by: BALATON Zoltan <balaton at eik.bme.hu>
> ---
>  arch/ppc/qemu/init.c | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
> 
> v2: Move to init.c from tree.fs and only add it for mac99
> Patches 1 and 2 from original series
> https://www.coreboot.org/pipermail/openbios/2016-November/009825.html
> https://www.coreboot.org/pipermail/openbios/2016-November/009824.html
> are still valid and needed, patch 4 was already applied so only this
> one (3/4) is resent but 1 and 2 should be applied as well with this.
> 
> diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
> index ffbf08d..629d71b 100644
> --- a/arch/ppc/qemu/init.c
> +++ b/arch/ppc/qemu/init.c
> @@ -755,6 +755,44 @@ arch_of_init(void)
>      openbios_init();
>      modules_init();
>      setup_timers();
> +    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();
> +    }
>  #ifdef CONFIG_DRIVER_PCI
>      ob_pci_init();
>  #endif

I'd say this is quite invasive for a hack - any chance that it can moved
into a separate static function with an NEWWORLD(...) wrapper so it's
easier to pull out when multi-bus PCI can be implemented?

Also does this do anything to address the extra warnings I noticed under
openSUSE or is it still the same patch but converted to C?


ATB,

Mark.




More information about the OpenBIOS mailing list