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

Marcelo Tosatti mtosatti at redhat.com
Tue Sep 20 13:47:18 CEST 2011


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
> 
> Signed-off-by: Amos Kong <akong at redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
> ---
>  src/acpi-dsdt.dsl |  106 ++++++++++++++++++++++++++++++----------------------
>  1 files changed, 61 insertions(+), 45 deletions(-)
> 
> diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
> index 08412e2..707c3d6 100644
> --- a/src/acpi-dsdt.dsl
> +++ b/src/acpi-dsdt.dsl
> @@ -128,9 +128,9 @@ DefinitionBlock (
>                  PCRM, 32,
>              }
>  
> -#define hotplug_slot(name, nr) \
> -            Device (S##name) {                    \
> -               Name (_ADR, nr##0000)              \
> +#define hotplug_func(name, nr, adr, fn) \
> +            Device (S##name##fn) {                \
> +               Name (_ADR, adr)                    \
>                 Method (_EJ0,1) {                  \
>                      Store(ShiftLeft(1, nr), B0EJ) \
>                      Return (0x0)                  \
> @@ -138,6 +138,16 @@ DefinitionBlock (
>                 Name (_SUN, name)                  \
>              }
>  
> +#define hotplug_slot(name, nr) \
> +	    hotplug_func(name, nr, nr##0000, 0)  \
> +	    hotplug_func(name, nr, nr##0001, 1)  \
> +	    hotplug_func(name, nr, nr##0002, 2)  \
> +	    hotplug_func(name, nr, nr##0003, 3)  \
> +	    hotplug_func(name, nr, nr##0004, 4)  \
> +	    hotplug_func(name, nr, nr##0005, 5)  \
> +	    hotplug_func(name, nr, nr##0006, 6)  \
> +	    hotplug_func(name, nr, nr##0007, 7)
> +
>  	    hotplug_slot(1, 0x0001)
>  	    hotplug_slot(2, 0x0002)
>  	    hotplug_slot(3, 0x0003)
> @@ -460,7 +470,7 @@ DefinitionBlock (
>  	    }
>  	}
>  
> -#define gen_pci_device(name, nr)                                \
> +#define gen_pci_device(name, nr) \
>          Device(SL##name) {                                      \
>              Name (_ADR, nr##0000)                               \
>              Method (_RMV) {                                     \
> @@ -502,6 +512,52 @@ DefinitionBlock (
>  	gen_pci_device(29, 0x001d)
>  	gen_pci_device(30, 0x001e)
>  	gen_pci_device(31, 0x001f)
> +
> +#define gen_pci_hotplug(nr) \
> +            If (And(PCIU, ShiftLeft(1, nr))) {     \
> +                Notify(S##nr##0, 1)                \
> +            }                                      \
> +            If (And(PCID, ShiftLeft(1, nr))) {     \
> +                Notify(S##nr##0, 3)                \
> +            }
> +
> +        Method(HPLG) {
> +            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 IRQs */
> @@ -842,49 +898,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)
> -
> +            \_SB.PCI0.HPLG()

What is the point of this new method?




More information about the SeaBIOS mailing list