On Fri, Aug 09, 2013 at 12:13:06AM -0400, Kevin O'Connor wrote:
> On Thu, Aug 08, 2013 at 04:56:55PM +0200, Gerd Hoffmann wrote:
> > On 08/08/13 16:13, Michael S. Tsirkin wrote:
> > > On Thu, Aug 08, 2013 at 12:21:32PM +0200, Gerd Hoffmann wrote:
> > >> On 08/08/13 11:52, Michael S. Tsirkin wrote:
> > >>> On Thu, Aug 08, 2013 at 10:57:44AM +0200, Gerd Hoffmann wrote:
> > >>>> On 08/08/13 10:37, Michael S. Tsirkin wrote:
> > >>>>> On Thu, Aug 08, 2013 at 09:57:39AM +0200, Gerd Hoffmann wrote:
> > >>>>>> Also coreboot and seabios use different values for pmbase.  coreboot 
> > >>>>>> on
> > >>>>>> q35 maps the pmbase below 0x1000.  Which surely makes sense.  When we
> > >>>>>> don't place chipset stuff at 0xb000 we can assign the 0xb000->0xbfff
> > >>>>>> window to a pci bridge instead.
> > > 
> > > Re-reading this - if this has value, can't we generalize it
> > > and make all firmware behave the same, getting values from QEMU?
> > 
> > pmbase is a compile-time constant (aka #define) in both seabios and
> > coreboot, and making this runtime-configurable is non-trivial.  See
> > src/smm.c in seabios for one reason why.
> 
> I don't think SeaBIOS should modify tables provided by QEMU.  That
> leads to confusion on the source of the data and mixed
> responsibilities which results in greater complexity in both QEMU and
> SeaBIOS.
> 
> SeaBIOS doesn't have any info that QEMU doesn't have.  So, I think
> it's safe for QEMU to be the sole authority for the table content.
> 
> Converting src/smm.c to use a runtime value isn't hard - just change
> the assembler from: "mov $" __stringify(PORT_ACPI_PM_BASE) " + 0x04,
> %dx\n" to: "mov 4(my_acpi_base), %dx\n" and make sure to define the
> global variable my_acpi_base as VARFSEG.
> 
> > >> Yes, the address ranges used for pci devices (aka 32bit + 64bit pci
> > >> window) need to be there.  Well, placing in SSDT, then referencing from
> > >> DSDT works too, and this is what seabios does today to dynamically
> > >> adjust stuff.  Fixing up the SSDT using the linker is probably easier as
> > >> we generate it anyway.
> > >>
> > > Yes but as I said, this makes things messy, since AML encoding for
> > > numbers isn't fixed width.
> > 
> > In seabios we have fixed 32bit / 64bit width today, from acpi.c:
> > 
> >     // store pci io windows
> >     *(u32*)&ssdt_ptr[acpi_pci32_start[0]] = cpu_to_le32(pcimem_start);
> >     *(u32*)&ssdt_ptr[acpi_pci32_end[0]] = cpu_to_le32(pcimem_end - 1);
> >     if (pcimem64_start) {
> >         ssdt_ptr[acpi_pci64_valid[0]] = 1;
> >         *(u64*)&ssdt_ptr[acpi_pci64_start[0]] = cpu_to_le64(pcimem64_start);
> >         *(u64*)&ssdt_ptr[acpi_pci64_end[0]] = cpu_to_le64(pcimem64_end - 1);
> >         *(u64*)&ssdt_ptr[acpi_pci64_length[0]] = cpu_to_le64(
> >             pcimem64_end - pcimem64_start);
> >     } else {
> >         ssdt_ptr[acpi_pci64_valid[0]] = 0;
> >     }
> > 
> > Storing fixup instructions for these fields in the linker script
> > shouldn't be hard I think.
> 
> I don't think SeaBIOS should continue to do the above once the tables
> are moved to QEMU.  QEMU has all the info SeaBIOS has, so it can
> generate the tables correctly on its own.
> 
> In all practical situations, the PCI window should be at least an
> order of magnatude greater than the sum of the PCI bars in the system.
> If the bars are actually bigger than the window, then things are going
> to fail - the best the firmware can do is try to fail gracefully.  I
> don't think it's worth the complexity to design mixed ownership and
> advanced interfaces just so we can fail slightly better.
> 
> If this is a real worry, QEMU can sum all the PCI bars and warn the
> user if they don't fit.
> 
> -Kevin

If we make it a rule that PCI is`setup before ACPI tables
are read, then QEMU can do the patching itself when
it detects BIOS reading the tables.

Gerd, Laszlo,others,  does this rule work for alternative firmwares?


_______________________________________________
SeaBIOS mailing list
[email protected]
http://www.seabios.org/mailman/listinfo/seabios

Reply via email to