[SeaBIOS] [PATCH] seabios: call pci_init_device on resume

Michael S. Tsirkin mst at redhat.com
Thu Dec 19 19:40:23 CET 2013

On Thu, Dec 19, 2013 at 12:04:25PM -0500, Kevin O'Connor wrote:
> On Thu, Dec 19, 2013 at 01:49:02PM +0200, Michael S. Tsirkin wrote:
> > PIIX spec says that most its registers are reset on suspend.
> > However, QEMU didn't reset most of them properly.
> > Now that it started doing that, resume is broken.
> > Fix it up by probing system devices on bus 0 and re-initializing them.
> Thanks.  This patch runs part of the "pciinit" code and not all of it.
> What's the reasoning behind which code to run and which code not to
> run?  Re-running parts of pciinit on resume is a change in behaviour
> and I'm concerned about unintended consequences.  Is this definitely
> what should be setup for PCI on resume - nothing more should be done
> and nothing less?

I'm not sure about nothing less. It is possible that there are
some registers here that we don't need to touch.

Nothing more, I am pretty sure.

We must not touch anything that OS might have changed,
or there will be a conflict.
This is why we don't touch interrupt registers and
BARs - OS can change these and it must put them back exactly the way
they were, if we enable some BARs there will be a conflict.

> Also, we were just about to release SeaBIOS v1.7.4.  I don't think
> this behaviour change would be good to add so late in the release
> cycle.  (As a side note, the patch would not be correct for coreboot
> and CSM users.)

Interesting. Why won't it?

> That means either delaying the release, or
> implementing this change as part of a future stable release.

You decide :)

> Finally, if the issue is just on the PIIX PM device, would a more
> targeted change be more appropriate?  For example, something like:
> void
> qemu_piix_resume_fixup(void)
> {
>     if (!CONFIG_QEMU)
>         return;
>     int bdf;
>     foreachbdf(bdf, 0) {
>         u32 vendev = pci_config_readl(bdf, PCI_VENDOR_ID);
>         u16 vendor = vendev & 0xffff, device = vendev >> 16;
>         if (vendor == PCI_VENDOR_ID_INTEL
>             && device == PCI_DEVICE_ID_INTEL_82371AB_3) {
>             pci_config_writeb(bdf, 0x80, 0x01);

IMO this is definitely not enough. E.g. I'm pretty sure we should set the IO
address before we enable IO.

>             ...
>             return;
>         }
>     }
> }
> -Kevin

More information about the SeaBIOS mailing list