[SeaBIOS] [PATCH] Replace level gpe event with edge gpe event for hot-plug handlers

Michael S. Tsirkin mst at redhat.com
Wed Apr 4 08:26:11 CEST 2012


On Tue, Apr 03, 2012 at 11:48:44PM +0200, Igor Mammedov wrote:
> in current code, pci hot-plug gpe event handler is defined as
> a level one "_L01"
> 
> 1. hw adds device, sets GPE.1 bit and sends SCI
> 2. OSPM gets SCI, reads GPE00.sts and masks GPE.1 bit in GPE00.en
> 3. OSPM executes _L01
> 4. hw adds second device and sets GPE.1 bit but SCI is not asserted
>     since GPE00.en masks event
> 5. OSPM resets GPE.1 bit in GPE00.sts and umasks it in GPE00.en
> 
> as result event for step 4 is lost because step 5 clears it and OS
> will not see added second device.
> 
> ACPI 50 spec: 5.6.4 General-Purpose Event Handling
> defines GPE event handling as following:
> 
> 1. Disables the interrupt source (GPEx_BLK EN bit).
> 2. If an edge event, clears the status bit.
> 3. Performs one of the following:
> * Dispatches to an ACPI-aware device driver.
> * Queues the matching control method for execution.
> * Manages a wake event using device _PRW objects.
> 4. If a level event, clears the status bit.
> 5. Enables the interrupt source.
> 
> Switching from level to edge event handler reduces chances to
> hit race window.
> 
> Same applies to cpu-hotplug, so switch it to edge handler as well.
> 
> Tested with RHEL6, 3.3.+ kernel, winxp, and w2008r2, and I wasn't
> able to trigger race after using edge event handler.
> 
> Signed-off-by: Igor Mammedov <imammedo at redhat.com>

Acked-by: Michael S. Tsirkin <mst at redhat.com>

> ---
>  src/acpi-dsdt.dsl |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
> index 4e04c48..4bdc268 100644
> --- a/src/acpi-dsdt.dsl
> +++ b/src/acpi-dsdt.dsl
> @@ -723,11 +723,11 @@ DefinitionBlock (
>          Method(_L00) {
>              Return(0x01)
>          }
> -        Method(_L01) {
> +        Method(_E01) {
>              // PCI hotplug event
>              Return(\_SB.PCI0.PCNF())
>          }
> -        Method(_L02) {
> +        Method(_E02) {
>              // CPU hotplug event
>              Return(\_SB.PRSC())
>          }
> -- 
> 1.7.7.6



More information about the SeaBIOS mailing list