[SeaBIOS] [SeaBIOS PATCH v3] hotplug: Add device per func in ACPI DSDT tables

Amos Kong akong at redhat.com
Wed Dec 7 01:32:55 CET 2011


----- Original Message -----
> On Tue, Dec 06, 2011 at 01:39:35PM +0800, Amos Kong wrote:
> > Only func 0 is registered to guest driver (we can
> > only found func 0 in slot->funcs list of driver),
> > the other functions could not be cleaned when
> > hot-removing the whole slot. This patch adds
> > device per function in ACPI DSDT tables.
> > Notify only when func0 is added and removed.
> > 
> > Have tested with linux/winxp/win7, hot-adding/hot-remving,
> > single/multiple function device, they are all fine(all
> > added devices can be removed).
> > 
> > Changes from v2:
> >  update patch based on latest seabios tree
> > 
> > Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
> > Signed-off-by: Amos Kong <akong at redhat.com>
> 
> This includes some bits I wrote but this is not an ack
> of the patch yet :)
> 
> I find it surprising that this works: a function
> has _EJ0 so would not guest expect that ejecting
> a single one will only remove it, and not all functions?

Removing single func is not supported by specific, and current code
(qemu/kernel pci driver) process hot-remove with the whole slot.
We could not hot-remove single func with/without this patch.

Register _EJ0() for each func, then all the funcs will be record
into the function list of the slot.

Thanks, Amos

> > ---
> > 
> >  src/ssdt-pcihp.dsl |   17
> >  src/ssdt-pcihp.hex | 9225
> >  ++++++++++++++++++++++++++++++++++++++++++++++++++--
> >  2 files changed, 8959 insertions(+), 283 deletions(-)
> > 
> > diff --git a/src/ssdt-pcihp.dsl b/src/ssdt-pcihp.dsl
> > index 4b435b8..2a3c326 100644
> > --- a/src/ssdt-pcihp.dsl
> > +++ b/src/ssdt-pcihp.dsl
> > @@ -17,14 +17,23 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT",
> > 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
> >          // at runtime, if the slot is detected to not support
> >          hotplug.
> >          // Extract the offset of the address dword and the
> >          // _EJ0 name to allow this patching.
> > -#define hotplug_slot(slot)                              \
> > -        Device (S##slot) {                              \
> > +#define hotplug_func(slot, fn)                          \
> > +        Device (S##slot##fn) {                          \
> >             ACPI_EXTRACT_NAME_DWORD_CONST aml_adr_dword  \
> > -           Name (_ADR, 0x##slot##0000)                  \
> > +           Name (_ADR, 0x##slot##000##fn)               \
> >             ACPI_EXTRACT_METHOD_STRING aml_ej0_name      \
> >             Method (_EJ0, 1) { Return(PCEJ(0x##slot)) }  \
> >             Name (_SUN, 0x##slot)                        \
> >          }
> > +#define hotplug_slot(slot)     \
> > +        hotplug_func(slot, 0)  \
> > +        hotplug_func(slot, 1)  \
> > +        hotplug_func(slot, 2)  \
> > +        hotplug_func(slot, 3)  \
> > +        hotplug_func(slot, 4)  \
> > +        hotplug_func(slot, 5)  \
> > +        hotplug_func(slot, 6)  \
> > +        hotplug_func(slot, 7)
> >  
> >          hotplug_slot(01)
> >          hotplug_slot(02)
> > @@ -59,7 +68,7 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01,
> > "BXPC", "BXSSDTPCIHP", 0x1)
> >          hotplug_slot(1f)
> >  
> >  #define gen_pci_hotplug(slot)   \
> > -            If (LEqual(Arg0, 0x##slot)) { Notify(S##slot, Arg1) }
> > +            If (LEqual(Arg0, 0x##slot)) { Notify(S##slot##0, Arg1)
> > }
> >  
> >          Method(PCNT, 2) {
> >              gen_pci_hotplug(01)
> > diff --git a/src/ssdt-pcihp.hex b/src/ssdt-pcihp.hex
> > index b15ad5a..4c9b5df 100644
> > --- a/src/ssdt-pcihp.hex
> > +++ b/src/ssdt-pcihp.hex
> > @@ -1,80 +1,514 @@
> >  static unsigned short aml_adr_dword[] = {
> > -0x3e,
> > -0x62,
> > -0x88,
> > -0xae,
> > -0xd4,
> > -0xfa,
> > -0x120,

...



More information about the SeaBIOS mailing list