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

Amos Kong akong at redhat.com
Wed Sep 21 07:39:22 CEST 2011


----- Original Message -----
> On Tue, Sep 20, 2011 at 06:45:57AM -0400, Amos Kong wrote:
> > From 48ea1c9188334b89a60b4f9e853e86fc04fda4a5 Mon Sep 17 00:00:00
> > 2001
> > From: Amos Kong <akong at redhat.com>
> > Date: Tue, 20 Sep 2011 15:38:43 +0800
> > Subject: [SeaBIOS PATCH v2] hotplug: Add device per func in ACPI
> > DSDT tables
> > 
> > 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.
> > 
> > Have tested with linux/winxp/win7, hot-adding/hot-remving,
> > single/multiple function device, they are all fine.
> > ---
> > Changes from v1:
> > - cleanup the macros, bios.bin gets back to 128K
> > - notify only when func0 is added and removed
> 
> How about moving code into functions so that it isn't duplicated for
> each PCI device.  See the patch below as an example (100% untested).

Tested, it works as my original patch-v2.

> The CPU hotplug stuff works this way, except it run-time generates
> the
> equivalent of "Device(S???)" and "PCNT".  (It may make sense to
> run-time generate the PCI hotplug as well - it consumes about 10K of
> space to statically generate the 31 devices.)

I'm ok with the new version.

Acked-by: Amos Kong <akong at redhat.com>

> -Kevin
> 
> 
> diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
> index 08412e2..31ac5eb 100644
> --- a/src/acpi-dsdt.dsl
> +++ b/src/acpi-dsdt.dsl
> @@ -128,48 +128,6 @@ DefinitionBlock (
>                  PCRM, 32,
>              }
>  
> -#define hotplug_slot(name, nr) \
> -            Device (S##name) {                    \
> -               Name (_ADR, nr##0000)              \
> -               Method (_EJ0,1) {                  \
> -                    Store(ShiftLeft(1, nr), B0EJ) \
> -                    Return (0x0)                  \
> -               }                                  \
> -               Name (_SUN, name)                  \
> -            }
> -
> -	    hotplug_slot(1, 0x0001)
> -	    hotplug_slot(2, 0x0002)
> -	    hotplug_slot(3, 0x0003)
> -	    hotplug_slot(4, 0x0004)
> -	    hotplug_slot(5, 0x0005)
> -	    hotplug_slot(6, 0x0006)
> -	    hotplug_slot(7, 0x0007)
> -	    hotplug_slot(8, 0x0008)
> -	    hotplug_slot(9, 0x0009)
> -	    hotplug_slot(10, 0x000a)
> -	    hotplug_slot(11, 0x000b)
> -	    hotplug_slot(12, 0x000c)
> -	    hotplug_slot(13, 0x000d)
> -	    hotplug_slot(14, 0x000e)
> -	    hotplug_slot(15, 0x000f)
> -	    hotplug_slot(16, 0x0010)
> -	    hotplug_slot(17, 0x0011)
> -	    hotplug_slot(18, 0x0012)
> -	    hotplug_slot(19, 0x0013)
> -	    hotplug_slot(20, 0x0014)
> -	    hotplug_slot(21, 0x0015)
> -	    hotplug_slot(22, 0x0016)
> -	    hotplug_slot(23, 0x0017)
> -	    hotplug_slot(24, 0x0018)
> -	    hotplug_slot(25, 0x0019)
> -	    hotplug_slot(26, 0x001a)
> -	    hotplug_slot(27, 0x001b)
> -	    hotplug_slot(28, 0x001c)
> -	    hotplug_slot(29, 0x001d)
> -	    hotplug_slot(30, 0x001e)
> -	    hotplug_slot(31, 0x001f)
> -
>              Name (_CRS, ResourceTemplate ()
>              {
>                  WordBusNumber (ResourceProducer, MinFixed, MaxFixed,
>                  PosDecode,
> @@ -762,6 +720,119 @@ DefinitionBlock (
>          Zero   /* reserved */
>      })
>  
> +    /* PCI hotplug */
> +    Scope(\_SB.PCI0) {
> +        /* Methods called by bulk generated PCI devices below */
> +        Method (PCEJ, 1, NotSerialized) {
> +            // _EJ0 method - eject callback
> +            Store(ShiftLeft(1, Arg0), B0EJ)
> +            Return (0x0)
> +        }
> +
> +        /* Bulk generated PCI hotplug devices */
> +#define hotplug_func(nr, fn)                            \
> +        Device (S##nr##fn) {                            \
> +            Name (_ADR, 0x##nr##000##fn)                \
> +            Method (_EJ0, 1) { Return(PCEJ(0x##nr)) }   \
> +            Name (_SUN, 0x##nr)                         \
> +        }
> +
> +#define hotplug_slot(nr) \
> +            hotplug_func(nr, 0)  \
> +            hotplug_func(nr, 1)  \
> +            hotplug_func(nr, 2)  \
> +            hotplug_func(nr, 3)  \
> +            hotplug_func(nr, 4)  \
> +            hotplug_func(nr, 5)  \
> +            hotplug_func(nr, 6)  \
> +            hotplug_func(nr, 7)
> +
> +	hotplug_slot(01)
> +	hotplug_slot(02)
> +	hotplug_slot(03)
> +	hotplug_slot(04)
> +	hotplug_slot(05)
> +	hotplug_slot(06)
> +	hotplug_slot(07)
> +	hotplug_slot(08)
> +	hotplug_slot(09)
> +	hotplug_slot(0a)
> +	hotplug_slot(0b)
> +	hotplug_slot(0c)
> +	hotplug_slot(0d)
> +	hotplug_slot(0e)
> +	hotplug_slot(0f)
> +	hotplug_slot(10)
> +	hotplug_slot(11)
> +	hotplug_slot(12)
> +	hotplug_slot(13)
> +	hotplug_slot(14)
> +	hotplug_slot(15)
> +	hotplug_slot(16)
> +	hotplug_slot(17)
> +	hotplug_slot(18)
> +	hotplug_slot(19)
> +	hotplug_slot(1a)
> +	hotplug_slot(1b)
> +	hotplug_slot(1c)
> +	hotplug_slot(1d)
> +	hotplug_slot(1e)
> +	hotplug_slot(1f)
> +
> +        /* PCI hotplug notify method */
> +        Method(PCNF, 0) {
> +            // Local0 = iterator
> +            Store (Zero, Local0)
> +            While (LLess(Local0, 31)) {
> +                Increment(Local0)
> +                If (And(PCIU, ShiftLeft(1, Local0))) {
> +                    PCNT(Local0, 1)
> +                }
> +                If (And(PCID, ShiftLeft(1, Local0))) {
> +                    PCNT(Local0, 3)
> +                }
> +            }
> +            Return(One)
> +        }
> +
> +#define hotplug_notify(nr) \
> +            If (LEqual(Arg0, 0x##nr)) {Notify(S##nr##0, Arg1)}
> +
> +        Method(PCNT, 2) {
> +            hotplug_notify(01)
> +            hotplug_notify(02)
> +            hotplug_notify(03)
> +            hotplug_notify(04)
> +            hotplug_notify(05)
> +            hotplug_notify(06)
> +            hotplug_notify(07)
> +            hotplug_notify(08)
> +            hotplug_notify(09)
> +            hotplug_notify(0a)
> +            hotplug_notify(0b)
> +            hotplug_notify(0c)
> +            hotplug_notify(0d)
> +            hotplug_notify(0e)
> +            hotplug_notify(0f)
> +            hotplug_notify(10)
> +            hotplug_notify(11)
> +            hotplug_notify(12)
> +            hotplug_notify(13)
> +            hotplug_notify(14)
> +            hotplug_notify(15)
> +            hotplug_notify(16)
> +            hotplug_notify(17)
> +            hotplug_notify(18)
> +            hotplug_notify(19)
> +            hotplug_notify(1a)
> +            hotplug_notify(1b)
> +            hotplug_notify(1c)
> +            hotplug_notify(1d)
> +            hotplug_notify(1e)
> +            hotplug_notify(1f)
> +        }
> +    }
> +
>      /* CPU hotplug */
>      Scope(\_SB) {
>          /* Objects filled in by run-time generated SSDT */
> @@ -842,49 +913,9 @@ DefinitionBlock (
>              Return(0x01)
>          }
>  
> -#define gen_pci_hotplug(nr)                                       \
> -            If (And(\_SB.PCI0.PCIU, ShiftLeft(1, nr))) {          \
> -                Notify(\_SB.PCI0.S##nr, 1)                        \
> -            }                                                     \
> -            If (And(\_SB.PCI0.PCID, ShiftLeft(1, nr))) {          \
> -                Notify(\_SB.PCI0.S##nr, 3)                        \
> -            }
> -
>          Method(_L01) {
> -            gen_pci_hotplug(1)
> -            gen_pci_hotplug(2)
> -            gen_pci_hotplug(3)
> -            gen_pci_hotplug(4)
> -            gen_pci_hotplug(5)
> -            gen_pci_hotplug(6)
> -            gen_pci_hotplug(7)
> -            gen_pci_hotplug(8)
> -            gen_pci_hotplug(9)
> -            gen_pci_hotplug(10)
> -            gen_pci_hotplug(11)
> -            gen_pci_hotplug(12)
> -            gen_pci_hotplug(13)
> -            gen_pci_hotplug(14)
> -            gen_pci_hotplug(15)
> -            gen_pci_hotplug(16)
> -            gen_pci_hotplug(17)
> -            gen_pci_hotplug(18)
> -            gen_pci_hotplug(19)
> -            gen_pci_hotplug(20)
> -            gen_pci_hotplug(21)
> -            gen_pci_hotplug(22)
> -            gen_pci_hotplug(23)
> -            gen_pci_hotplug(24)
> -            gen_pci_hotplug(25)
> -            gen_pci_hotplug(26)
> -            gen_pci_hotplug(27)
> -            gen_pci_hotplug(28)
> -            gen_pci_hotplug(29)
> -            gen_pci_hotplug(30)
> -            gen_pci_hotplug(31)
> -
> -            Return (0x01)
> -
> +            // PCI hotplug event
> +            Return(\_SB.PCI0.PCNF())
>          }
>          Method(_L02) {
>              // CPU hotplug event
> 



More information about the SeaBIOS mailing list