qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Igor Mammedov <imammedo@redhat.com>,
	Marcel Apfelbaum <marcel@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PULL 38/59] pc: acpi: piix4: move PCI0._PRT() into SSDT
Date: Fri, 8 Jan 2016 16:20:26 +0200	[thread overview]
Message-ID: <1452262668-31244-39-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1452262668-31244-1-git-send-email-mst@redhat.com>

From: Igor Mammedov <imammedo@redhat.com>

PCI routing table for expander buses is build with help
of build_prt() using AML API. And it's almost the same
as PRT for PCI0 bus except of power-management device.
So make existing build_prt() build PRT table for PCI0
bus as well.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/acpi-build.c  | 55 +++++++++++++++++++++++++++++++++++++++-------
 hw/i386/acpi-dsdt.dsl | 60 ---------------------------------------------------
 2 files changed, 47 insertions(+), 68 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 9ae34df..5dd25e1 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -623,6 +623,23 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
     qobject_decref(bsel);
 }
 
+/**
+ * build_prt_entry:
+ * @link_name: link name for PCI route entry
+ *
+ * build AML package containing a PCI route entry for @link_name
+ */
+static Aml *build_prt_entry(const char *link_name)
+{
+    Aml *a_zero = aml_int(0);
+    Aml *pkg = aml_package(4);
+    aml_append(pkg, a_zero);
+    aml_append(pkg, a_zero);
+    aml_append(pkg, aml_name("%s", link_name));
+    aml_append(pkg, a_zero);
+    return pkg;
+}
+
 /*
  * initialize_route - Initialize the interrupt routing rule
  * through a specific LINK:
@@ -633,12 +650,8 @@ static Aml *initialize_route(Aml *route, const char *link_name,
                              Aml *lnk_idx, int idx)
 {
     Aml *if_ctx = aml_if(aml_equal(lnk_idx, aml_int(idx)));
-    Aml *pkg = aml_package(4);
+    Aml *pkg = build_prt_entry(link_name);
 
-    aml_append(pkg, aml_int(0));
-    aml_append(pkg, aml_int(0));
-    aml_append(pkg, aml_name("%s", link_name));
-    aml_append(pkg, aml_int(0));
     aml_append(if_ctx, aml_store(pkg, route));
 
     return if_ctx;
@@ -654,7 +667,7 @@ static Aml *initialize_route(Aml *route, const char *link_name,
  * The hash function is  (slot + pin) & 3 -> "LNK[D|A|B|C]".
  *
  */
-static Aml *build_prt(void)
+static Aml *build_prt(bool is_pci0_prt)
 {
     Aml *method, *while_ctx, *pin, *res;
 
@@ -681,7 +694,29 @@ static Aml *build_prt(void)
 
         /* route[2] = "LNK[D|A|B|C]", selection based on pin % 3  */
         aml_append(while_ctx, initialize_route(route, "LNKD", lnk_idx, 0));
-        aml_append(while_ctx, initialize_route(route, "LNKA", lnk_idx, 1));
+        if (is_pci0_prt) {
+            Aml *if_device_1, *if_pin_4, *else_pin_4;
+
+            /* device 1 is the power-management device, needs SCI */
+            if_device_1 = aml_if(aml_equal(lnk_idx, aml_int(1)));
+            {
+                if_pin_4 = aml_if(aml_equal(pin, aml_int(4)));
+                {
+                    aml_append(if_pin_4,
+                        aml_store(build_prt_entry("LNKS"), route));
+                }
+                aml_append(if_device_1, if_pin_4);
+                else_pin_4 = aml_else();
+                {
+                    aml_append(else_pin_4,
+                        aml_store(build_prt_entry("LNKA"), route));
+                }
+                aml_append(if_device_1, else_pin_4);
+            }
+            aml_append(while_ctx, if_device_1);
+        } else {
+            aml_append(while_ctx, initialize_route(route, "LNKA", lnk_idx, 1));
+        }
         aml_append(while_ctx, initialize_route(route, "LNKB", lnk_idx, 2));
         aml_append(while_ctx, initialize_route(route, "LNKC", lnk_idx, 3));
 
@@ -1474,6 +1509,10 @@ static void build_piix4_pci0_int(Aml *table)
     Aml *method;
     uint32_t irqs;
     Aml *sb_scope = aml_scope("_SB");
+    Aml *pci0_scope = aml_scope("PCI0");
+
+    aml_append(pci0_scope, build_prt(true));
+    aml_append(sb_scope, pci0_scope);
 
     field = aml_field("PCI0.ISA.P40C", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE);
     aml_append(field, aml_named_field("PRQ0", 8));
@@ -1698,7 +1737,7 @@ build_ssdt(GArray *table_data, GArray *linker,
                 aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node)));
             }
 
-            aml_append(dev, build_prt());
+            aml_append(dev, build_prt(false));
             crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent),
                             io_ranges, mem_ranges);
             aml_append(dev, aml_name_decl("_CRS", crs));
diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
index bc6bd45..5d741dd 100644
--- a/hw/i386/acpi-dsdt.dsl
+++ b/hw/i386/acpi-dsdt.dsl
@@ -78,64 +78,4 @@ DefinitionBlock (
         /* Hotplug notification method supplied by SSDT */
         External(\_SB.PCI0.PCNT, MethodObj)
     }
-
-
-/****************************************************************
- * PCI IRQs
- ****************************************************************/
-
-    Scope(\_SB) {
-        Scope(PCI0) {
-            Method (_PRT, 0) {
-                Store(Package(128) {}, Local0)
-                Store(Zero, Local1)
-                While(LLess(Local1, 128)) {
-                    // slot = pin >> 2
-                    Store(ShiftRight(Local1, 2), Local2)
-
-                    // lnk = (slot + pin) & 3
-                    Store(And(Add(Local1, Local2), 3), Local3)
-                    If (LEqual(Local3, 0)) {
-                        Store(Package(4) { Zero, Zero, LNKD, Zero }, Local4)
-                    }
-                    If (LEqual(Local3, 1)) {
-                        // device 1 is the power-management device, needs SCI
-                        If (LEqual(Local1, 4)) {
-                            Store(Package(4) { Zero, Zero, LNKS, Zero }, Local4)
-                        } Else {
-                            Store(Package(4) { Zero, Zero, LNKA, Zero }, Local4)
-                        }
-                    }
-                    If (LEqual(Local3, 2)) {
-                        Store(Package(4) { Zero, Zero, LNKB, Zero }, Local4)
-                    }
-                    If (LEqual(Local3, 3)) {
-                        Store(Package(4) { Zero, Zero, LNKC, Zero }, Local4)
-                    }
-
-                    // Complete the interrupt routing entry:
-                    //    Package(4) { 0x[slot]FFFF, [pin], [link], 0) }
-
-                    Store(Or(ShiftLeft(Local2, 16), 0xFFFF), Index(Local4, 0))
-                    Store(And(Local1, 3),                    Index(Local4, 1))
-                    Store(Local4,                            Index(Local0, Local1))
-
-                    Increment(Local1)
-                }
-
-                Return(Local0)
-            }
-        }
-
-
-        External(PRQ0, FieldUnitObj)
-        External(PRQ1, FieldUnitObj)
-        External(PRQ2, FieldUnitObj)
-        External(PRQ3, FieldUnitObj)
-        External(LNKA, DeviceObj)
-        External(LNKB, DeviceObj)
-        External(LNKC, DeviceObj)
-        External(LNKD, DeviceObj)
-        External(LNKS, DeviceObj)
-    }
 }
-- 
MST

  parent reply	other threads:[~2016-01-08 14:20 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-08 15:08 [Qemu-devel] [PULL 00/59] acpi dsdt rework, misc fixes Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 04/59] tests: acpi: print ASL diff in verbose mode Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 05/59] pc: acpi: memhp: prepare context in SSDT for moving memhp DSDT code Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 06/59] pc: acpi: memhp: move MHPD._STA method into SSDT Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 07/59] pc: acpi: memhp: move MHPD.MLCK mutex " Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 08/59] pc: acpi: memhp: move MHPD.MSCN method " Michael S. Tsirkin
2016-01-08 14:18 ` [Qemu-devel] [PULL 09/59] pc: acpi: memhp: move MHPD.MRST " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 10/59] pc: acpi: memhp: move MHPD.MPXM " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 11/59] pc: acpi: memhp: move MHPD.MOST " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 12/59] pc: acpi: memhp: move MHPD.MEJ0 " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 13/59] pc: acpi: memhp: move MHPD.MCRS " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 14/59] pc: acpi: memhp: move MHPD Device " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 15/59] pc: acpi: factor out memhp code from build_ssdt() into separate function Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 16/59] pc: acpi: memhp: move \_GPE._E03 into SSDT Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 17/59] pc: acpi: memhp: drop not needed stringify(MEMORY_foo) usage Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 18/59] pc: acpi: drop unused CPU_STATUS_LEN from DSDT Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 19/59] pc: acpi: cpuhp: move CPEJ() method to SSDT Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 20/59] pc: acpi: cpuhp: move CPMA() method into SSDT Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 21/59] pc: acpi: cpuhp: move CPST() " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 22/59] pc: acpi: cpuhp: move PRSC() " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 23/59] pc: acpi: cpuhp: move \_GPE._E02() " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 24/59] pc: acpi: factor out cpu hotplug code from build_ssdt() into separate function Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 25/59] pc: acpi: move HPET from DSDT to SSDT Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 26/59] pc: acpi: move DBUG() " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 27/59] pc: acpi: move RTC device " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 28/59] pc: acpi: move KBD " Michael S. Tsirkin
2016-01-08 14:19 ` [Qemu-devel] [PULL 29/59] pc: acpi: move MOU " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 30/59] pc: acpi: move FDC0 " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 31/59] pc: acpi: move LPT " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 32/59] pc: acpi: move COM devices " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 33/59] pc: acpi: move PIIX4 isa-bridge and pm devices into SSDT Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 34/59] pc: acpi: move remaining GPE handlers " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 35/59] pc: acpi: pci: move link devices " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 36/59] pc: acpi: piix4: move IQCR() " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 37/59] pc: acpi: piix4: move IQST() " Michael S. Tsirkin
2016-01-08 14:20 ` Michael S. Tsirkin [this message]
2016-01-08 14:20 ` [Qemu-devel] [PULL 39/59] pc: acpi: piix4: move remaining PCI hotplug bits " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 40/59] pc: acpi: piix4: acpi move PCI0 device to SSDT Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 41/59] pc: acpi: q35: move GSI links " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 42/59] pc: acpi: q35: move link devices " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 43/59] pc: acpi: q35: move IQCR() into SSDT Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 44/59] pc: acpi: q35: move IQST() " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 45/59] pc: acpi: q35: move ISA bridge " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 46/59] pc: acpi: q35: move _PRT() " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 47/59] pc: acpi: q35: move PRTA routing table " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 48/59] pc: acpi: q35: move PRTP " Michael S. Tsirkin
2016-01-08 14:20 ` [Qemu-devel] [PULL 49/59] pc: acpi: q35: move _PIC() method " Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 50/59] pc: acpi: q35: move PCI0._OSC() " Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 51/59] pc: acpi: q35: move PCI0 device definition " Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 52/59] pc: acpi: q35: PCST, PCSB opregions and PCIB field " Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 53/59] pc: acpi: switch to AML API composed DSDT Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 54/59] pc: acpi: remove unused ASL templates and related blobs/utils Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 55/59] i386/pc: expose identifying the floppy controller Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 56/59] Add VMSTATE_STRUCT_VARRAY_KNOWN Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 57/59] migration/virtio: Remove simple .get/.put use Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 58/59] ivshmem: Store file descriptor for vhost-user negotiation Michael S. Tsirkin
2016-01-08 14:21 ` [Qemu-devel] [PULL 59/59] virtio: fix error message for number of queues Michael S. Tsirkin
2016-01-08 15:08 ` [Qemu-devel] [PULL 01/59] nvdimm: fix header pointer in nvdimm_build_nfit() Michael S. Tsirkin
2016-01-08 15:08 ` [Qemu-devel] [PULL 02/59] igd-passthrough: fix use of host_pci_config_read Michael S. Tsirkin
2016-01-08 15:08 ` [Qemu-devel] [PULL 03/59] hw/i386: fill in the CENTURY field of the FADT (FACP) ACPI table Michael S. Tsirkin
2016-01-08 16:21 ` [Qemu-devel] [PULL 00/59] acpi dsdt rework, misc fixes Peter Maydell
2016-01-08 17:34   ` [Qemu-devel] [PATCH] pc: acpi: fix build fail on w32 Igor Mammedov
2016-01-09 21:18     ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452262668-31244-39-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=marcel@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).