[SeaBIOS] [RfC PATCH 1/2] pci: move to two-pass pci initialization

Kevin O'Connor kevin at koconnor.net
Mon May 30 17:29:15 CEST 2011


On Tue, May 24, 2011 at 11:05:32AM +0200, Gerd Hoffmann wrote:
> This patch adds a second device scan to the pci initialization, which
> counts the memory bars of the various sizes and types.  Then it
> calculates the sizes and the packing of the prefetchable and
> non-prefetchable pci memory windows and prints the results.

Thanks Gerd.  In general, I'm okay with this approach.

Some random comments..

> +static struct pci_bus {
> +    /* pci region stats */
> +    u32 io_count[16 - PCI_IO_INDEX_SHIFT];
> +    u32 mem_count[32 - PCI_MEM_INDEX_SHIFT];
> +    u32 prefmem_count[32 - PCI_MEM_INDEX_SHIFT];
> +    u32 io_sum, io_max;
> +    u32 mem_sum, mem_max;
> +    u32 prefmem_sum, prefmem_max;
> +    /* seconday bus region sizes */
> +    u32 io_size, mem_size, prefmem_size;
> +    /* pci region assignments */
> +    u32 io_bases[16 - PCI_IO_INDEX_SHIFT];
> +    u32 mem_bases[32 - PCI_MEM_INDEX_SHIFT];
> +    u32 prefmem_bases[32 - PCI_MEM_INDEX_SHIFT];
> +    u32 io_base, mem_base, prefmem_base;
> +} busses[32];

The size of the seabios rom grows with every static variable, so this
should be dynamically allocated.

Speaking of dynamic allocation - it would be great if seabios had a
"struct pcidevice" for every found device - then most cases of
foreachpci() could instead just walk through this list of pci devices.
The lack of this has already lead to hacks like
pci.c:pci_path_setup().

> +static int pci_size_to_index(u32 size, int shift)
> +{
> +    int index = 0;
> +
> +    while (size > (1 << index)) {
> +        index++;
> +    }

util.h:__fls()

> +static void pci_bios_check_device(struct pci_bus *bus, u16 bdf)
> +{
[...]
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        u32 val, size;
> +        pci_bios_bus_get_bar(bus, bdf, i, &val, &size);
> +        if (val == 0) {
> +            continue;
> +        }
> +        pci_bios_bus_reserve(bus, val, size);

If I read this correctly, the code reserves unique space for each ROM
bar - this shouldn't be necessary as I believe it's safe to assume
only one ROM will be mapped at a given time.

-Kevin



More information about the SeaBIOS mailing list