From mboxrd@z Thu Jan 1 00:00:00 1970 From: Amos Kong Subject: [SeaBIOS PATCH v2] hotplug: Add device per func in ACPI DSDT tables Date: Tue, 20 Sep 2011 06:45:57 -0400 (EDT) Message-ID: <353319ea-047c-4637-89a0-94523a10348a@zmail05.collab.prod.int.phx2.redhat.com> References: <20110919190830.GB9062@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: Gleb Natapov , kvm@vger.kernel.org, jasowang@redhat.com, alex williamson , Marcelo Tosatti To: "Michael S. Tsirkin" , seabios@seabios.org Return-path: Received: from mx3-phx2.redhat.com ([209.132.183.24]:43016 "EHLO mx3-phx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753957Ab1ITKqH (ORCPT ); Tue, 20 Sep 2011 06:46:07 -0400 In-Reply-To: <20110919190830.GB9062@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: >>From 48ea1c9188334b89a60b4f9e853e86fc04fda4a5 Mon Sep 17 00:00:00 2001 From: Amos Kong 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 Signed-off-by: Michael S. Tsirkin --- 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() Return (0x01) - } Method(_L02) { // CPU hotplug event -- 1.7.6.1