[SeaBIOS] [PATCH 1/4] pci: add two-pass pci initialization code
Gerd Hoffmann
kraxel at redhat.com
Mon Jul 4 10:28:33 CEST 2011
Hi,
>> +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;
>
> Hrmm - is there an opportunity to define an array of three "region
> types" (io, mem, prefmem) instead? The coreboot PCI assignment code
> does this.
I'll try and see how the code will look like.
Was thinking about that too.
> [...]
>> +static void pci_bios_check_device_in_bus(int bus)
>> +{
>> + struct pci_device *pci;
>> +
>> + dprintf(1, "PCI: check devices bus %d\n", bus);
>> + foreachpci(pci) {
>> + if (pci->rootbus != bus)
>
> rootbus doesn't look correct here - it's an identifier for independent
> root PCI buses - pci_bdf_to_bus(pci->bdf) is likely what you want.
Ok.
>> +static int pci_bios_init_root_regions(void)
>> +{
>> + struct pci_bus *bus =&busses[0];
>> + int h1, h2;
>> +
>> + /* io ports */
>> + bus->io_base = 0xc000;
>> +
>> + /* try to fit all into one memory hole */
>> + for (h1 = mem_holes_count-1; h1>= 0; h1--) {
>> + if (bus->mem_sum< bus->prefmem_sum) {
>
> I'm a bit confused by what this code does.
A little more background:
I had (and still have in another branch) code which creates the
mem_holes array from the e820 table to figure where seabios can allocate
address space for the PCI memory regions. With the piix emulation this
gave us one memory hold, from RamSize to BUILD_IOAPIC_ADDR. With the
q35 emulation this gave us two memory holes, one from RamSize to
0xe0000000 and one from 0xf0000000 to BUILD_IOAPIC_ADDR due to mmconfig
@ 0xe0000000 -> 0xefffffff.
The pci_bios_init_root_regions() function can place one pci memory
region in one memory hole and the other one in the second in case they
are to big to fit into one hole.
So the question is whenever we'll wanna go down the route to have
dynamic i/o regions, with the dsdt changes discussed here recently. Or
whenever we'll just stick with a fixed region and just make it larger
for the q35 emulation. Say allow guest ram up to 0xc0000000, then have
the mmconfig region @ 0xc0000000 -> 0xcfffffff, and have the single hole
0xd0000000 -> BUILD_IOAPIC_ADDR available for pci memory bar
allocations. If we plan for a single memory hole the function can be
simplified alot, basically everything below "if (mem_holes_count <= 1) {
return -1 }" can be zapped then.
cheers,
Gerd
More information about the SeaBIOS
mailing list