From 6dd89c1f27ebc7623a6116dde8b58b25eb5bd99f Mon Sep 17 00:00:00 2001
From: Igor Mammedov <imammedo@redhat.com>
Date: Tue, 27 Mar 2012 16:35:41 +0200
Subject: [PATCH 2/2] Fix pci hotplug to generate level triggered interrupt.

RH-Author: Igor Mammedov <imammedo@redhat.com>
Message-id: <1332866141-17049-3-git-send-email-imammedo@redhat.com>
Patchwork-id: 39007
O-Subject: [RHEL-6.3 qemu-kvm PATCH 2/2] Fix pci hotplug to generate level triggered interrupt.
Bugzilla: 805362
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
RH-Acked-by: Gleb Natapov <gleb@redhat.com>

BZ#805362
Upstream qemu-kvm commit: 633aa0acfe2c4d3
Brew: http://brewweb.devel.redhat.com/brew/taskinfo?taskID=4198808

SCI is level triggered. pci hotplug should behave appropriately.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

Signed-off-by: Michal Novotny <mignov@gmail.com>
---
 hw/acpi.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/hw/acpi.c b/hw/acpi.c
index 4788526..43d45d6 100644
--- a/hw/acpi.c
+++ b/hw/acpi.c
@@ -135,7 +135,8 @@ static void pm_update_sci(PIIX4PMState *s)
     pmsts = get_pmsts(s);
     sci_level = (((pmsts & s->pmen) &
                   (RTC_EN | PWRBTN_EN | GBL_EN | TMROF_EN)) != 0) ||
-        (((s->gpe.sts & s->gpe.en) & PIIX4_CPU_HOTPLUG_STATUS) != 0);
+        (((s->gpe.sts & s->gpe.en) &
+          (PIIX4_CPU_HOTPLUG_STATUS | PIIX4_PCI_HOTPLUG_STATUS)) != 0);
 
     qemu_set_irq(s->irq, sci_level);
     /* schedule a timer interruption if needed */
@@ -784,7 +785,9 @@ static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val)
             break;
         default:
             break;
-   }
+    }
+
+    pm_update_sci(pm_state);
 
 #if defined(DEBUG)
     printf("gpe write %x <== %d\n", addr, val);
@@ -979,10 +982,9 @@ static int piix4_device_hotplug(PCIDevice *dev, int state)
         enable_device(&pm_state->pci0_status, &pm_state->gpe, slot);
     else
         disable_device(&pm_state->pci0_status, &pm_state->gpe, slot);
-    if (pm_state->gpe.en & 2) {
-        qemu_set_irq(pm_state->irq, 1);
-        qemu_set_irq(pm_state->irq, 0);
-    }
+
+    pm_update_sci(pm_state);
+
     return 0;
 }
 
-- 
1.7.7.6

