[OpenBIOS] [PATCH] pci: fix BAR setup
Artyom Tarasenko
atar4qemu at gmail.com
Thu Apr 19 21:06:02 CEST 2012
On Sun, Mar 11, 2012 at 11:59 AM, Blue Swirl <blauwirbel at gmail.com> wrote:
> A change in QEMU on how PCI bridges are setup revealed
> a bug in OpenBIOS PCI setup. On Sparc64, the BARs just
> happened to get somewhat correct values by accident before
> the commit but not after the change.
>
> Don't use arch->io_base for PCI I/O port BARs.
>
> Fix Sparc64 PCI memory base.
Could it be that the ranges property needs to be adjusted to look as
it did before the patch?
This patch breaks HelenOS-0.4.3/sparc boot. But if I modify the ranges
property to the old value, HelenOS boots.
0 > cd /pci at 1fe,0 ok
0 > .properties
[...]
ranges -- 54 : 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 fe 01 00 00 00 00 00 00 00 02 00 00 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 01 fe 02 00 00 00 00 00 00 00 00 01 00 00 02 00
00 00 00 00 00 00 00 10 00 00 00 00 01 ff 00 00 00 00 00 00 00 00 10
00 00 00
Not sure about the best formatting. If I reformat it like this:
00000000 00000000 00000000 000001fe 01000000 00000000 02000000
01000000 00000000 00000000 000001fe 02000000 00000000 00010000
02000000 00000000 00100000 000001ff 00000000 00000000 10000000
^^^^ this one (the third) used to be 0
> Signed-off-by: Blue Swirl <blauwirbel at gmail.com>
> ---
>
> I removed the bridge setup code, it's not really valid for Sparc64 APB
> bridges anyway and currently no devices exist behind the bridges (but
> that's where they really should be).
>
> Tested Sparc64 and PPC.
>
> ---
> arch/sparc64/openbios.c | 2 +-
> drivers/pci.c | 11 +++++++++--
> 2 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/arch/sparc64/openbios.c b/arch/sparc64/openbios.c
> index ac709fe..ab32a8f 100644
> --- a/arch/sparc64/openbios.c
> +++ b/arch/sparc64/openbios.c
> @@ -64,7 +64,7 @@ static const struct hwdef hwdefs[] = {
> .cfg_base = APB_SPECIAL_BASE,
> .cfg_len = 0x2000000,
> .host_mem_base = APB_MEM_BASE,
> - .pci_mem_base = 0,
> + .pci_mem_base = 0x100000, /* avoid VGA at 0xa0000 */
> .mem_len = 0x10000000,
> .io_base = APB_SPECIAL_BASE + 0x2000000ULL, // PCI Bus I/O space
> .io_len = 0x10000,
> diff --git a/drivers/pci.c b/drivers/pci.c
> index f8c6414..e270a73 100644
> --- a/drivers/pci.c
> +++ b/drivers/pci.c
> @@ -931,6 +931,7 @@ static void ob_pci_configure_bar(pci_addr addr,
> pci_config_t *config,
>
> if ((*p_omask & 0x0000000f) == 0x4) {
> /* 64 bits memory mapping */
> + PCI_DPRINTF("Skipping 64 bit BARs for %s\n", config->path);
> return;
> }
>
> @@ -966,11 +967,17 @@ static void ob_pci_configure_bar(pci_addr addr,
> pci_config_t *config,
> size = min_align;
> reloc = (reloc + size -1) & ~(size - 1);
> if (*io_base == base) {
> + PCI_DPRINTF("changing io_base from 0x%lx to 0x%x\n",
> + *io_base, reloc + size);
> *io_base = reloc + size;
> - reloc -= arch->io_base;
> } else {
> + PCI_DPRINTF("changing mem_base from 0x%lx to 0x%x\n",
> + *mem_base, reloc + size);
> *mem_base = reloc + size;
> }
> + PCI_DPRINTF("Configuring BARs for %s: reloc 0x%x omask 0x%x "
> + "io_base 0x%lx mem_base 0x%lx size 0x%x\n",
> + config->path, reloc, *p_omask, *io_base, *mem_base, size);
> pci_config_write32(addr, config_addr, reloc | *p_omask);
> config->assigned[reg] = reloc | *p_omask;
> }
> @@ -1260,7 +1267,7 @@ int ob_pci_init(void)
> mem_base = arch->pci_mem_base;
> /* I/O ports under 0x400 are used by devices mapped at fixed
> location. */
> - io_base = arch->io_base + 0x400;
> + io_base = 0x400;
>
> bus = 0;
>
> --
> 1.7.9
>
> --
> OpenBIOS http://openbios.org/
> Mailinglist: http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you
--
Regards,
Artyom Tarasenko
solaris/sparc under qemu blog: http://tyom.blogspot.com/search/label/qemu
More information about the OpenBIOS
mailing list