From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:adf:a111:0:0:0:0:0 with SMTP id o17-v6csp2038886wro; Sun, 4 Nov 2018 17:56:32 -0800 (PST) X-Google-Smtp-Source: AJdET5f1xJEWt5RJMqPXv4ARx8mkPoyLRtVbUIiRhlohK7V0Re9hdi5+pTVoe352ppLuoXajjpsO X-Received: by 2002:aed:3324:: with SMTP id u33mr10825340qtd.161.1541382991966; Sun, 04 Nov 2018 17:56:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541382991; cv=none; d=google.com; s=arc-20160816; b=PPk0lmTT+k1gRBVxcjKytYE34ScCdOploXXxVLM7wEIiHkAafp/cgV3c0grHWVp0wJ LgKtZTimvePrYAJw9Ixxce60G6kSCwOHrnIXl9g06YR8Bh9IQNK2HkDfFqqiBX+BFhff FemOqq0Bk/TwuZOCRr6DVzQEvmipP7RAGMFqsOYoCzGJxowM2NVtKSrF0c1qckaBbxpX xsBSXdYfXt8pTGGdl/K1FgMeaxIWJvBIm/1YixbAmPEzwlZMpXhTTzcR7ql0OTdxr7p6 FfPRUzJ9dFWwo0fV3dRZMroY9iWM853XoqQCOdJ0F1b9r6z7zwhzobJx3WxYL1+RTRjJ 3MXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from; bh=iOCanNg2ClUSWO52v1z3lnIjz7ASwlVqfOC7IclYm1c=; b=s39nlt6i/P0O+md1JZIU19Vo6a3iE+xGib8sgithwLb2xvXLNhaTYtvQzPVS72tS3G 0YEu58lA2MQFuTVh68+wJkVhqPJwuB7gwbauV7OFNYVwOeGBWTm7VW6PPTPH3I2rEss2 Ln5eQJE95O+YBNjz/WrUsPtOh6trfttVWKVvRTGybyuDCSdFvyJk4ECXVgstvIaLE6ld mIq3ylFVG6+1G8qOCptXhFBEZPEu2gupvkYb3z096LfoeZqh45rKp69CZEg2qxWpNc4N ORmYAp3TmhOw5cywdQHOBEfp0SiRLZ9OxQ+fssp32CVE7wHRaNDo/gRLU3j/EBNAkFVL wG/A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id o63si5474090qka.164.2018.11.04.17.56.31 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 04 Nov 2018 17:56:31 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from localhost ([::1]:60934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJU7z-0005J6-Bs for alex.bennee@linaro.org; Sun, 04 Nov 2018 20:56:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47264) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJTvA-0008Na-40 for qemu-arm@nongnu.org; Sun, 04 Nov 2018 20:43:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gJTv5-0003JW-73 for qemu-arm@nongnu.org; Sun, 04 Nov 2018 20:43:16 -0500 Received: from mga05.intel.com ([192.55.52.43]:26671) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gJTv4-0003Ia-SG; Sun, 04 Nov 2018 20:43:11 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Nov 2018 17:43:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,466,1534834800"; d="scan'208";a="277074475" Received: from emurphy1-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.252.26.250]) by fmsmga005.fm.intel.com with ESMTP; 04 Nov 2018 17:43:04 -0800 From: Samuel Ortiz To: qemu-devel@nongnu.org Date: Mon, 5 Nov 2018 02:40:40 +0100 Message-Id: <20181105014047.26447-18-sameo@linux.intel.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.43 Subject: [Qemu-arm] [PATCH v5 17/24] hw: acpi: Export the PCI hotplug API X-BeenThere: qemu-arm@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Jing Liu , Shannon Zhao , Igor Mammedov , qemu-arm@nongnu.org, Marcel Apfelbaum , Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Sebastien Boeuf , Richard Henderson Errors-To: qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org Sender: "Qemu-arm" X-TUID: IMyIpIzvTzY1 From: Sebastien Boeuf The ACPI hotplug support for PCI devices APIs are not x86 or even machine type specific. In order for future machine types to be able to re-use that code, we export it through the architecture agnostic hw/acpi folder. Reviewed-by: Philippe Mathieu-Daudé Tested-by: Philippe Mathieu-Daudé Signed-off-by: Sebastien Boeuf Signed-off-by: Jing Liu --- include/hw/acpi/aml-build.h | 3 + hw/acpi/aml-build.c | 194 ++++++++++++++++++++++++++++++++++++ hw/i386/acpi-build.c | 192 +---------------------------------- 3 files changed, 199 insertions(+), 190 deletions(-) diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index 64ea371656..6b0a9735c5 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -418,6 +418,9 @@ Aml *build_osc_method(uint32_t value); void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info); Aml *build_gsi_link_dev(const char *name, uint8_t uid, uint8_t gsi); Aml *build_prt(bool is_pci0_prt); +void build_acpi_pcihp(Aml *scope); +void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, + bool pcihp_bridge_en); void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host); Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host); void crs_range_set_init(CrsRangeSet *range_set); diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 2c5446ab23..6112cc2149 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -34,6 +34,7 @@ #include "hw/acpi/tpm.h" #include "qom/qom-qobject.h" #include "qapi/qmp/qnum.h" +#include "hw/acpi/pcihp.h" #define PCI_HOST_BRIDGE_CONFIG_ADDR 0xcf8 #define PCI_HOST_BRIDGE_IO_0_MIN_ADDR 0x0000 @@ -2305,6 +2306,199 @@ Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host) return scope; } +void build_acpi_pcihp(Aml *scope) +{ + Aml *field; + Aml *method; + + aml_append(scope, + aml_operation_region("PCST", AML_SYSTEM_IO, aml_int(0xae00), 0x08)); + field = aml_field("PCST", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("PCIU", 32)); + aml_append(field, aml_named_field("PCID", 32)); + aml_append(scope, field); + + aml_append(scope, + aml_operation_region("SEJ", AML_SYSTEM_IO, aml_int(0xae08), 0x04)); + field = aml_field("SEJ", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("B0EJ", 32)); + aml_append(scope, field); + + aml_append(scope, + aml_operation_region("BNMR", AML_SYSTEM_IO, aml_int(0xae10), 0x04)); + field = aml_field("BNMR", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("BNUM", 32)); + aml_append(scope, field); + + aml_append(scope, aml_mutex("BLCK", 0)); + + method = aml_method("PCEJ", 2, AML_NOTSERIALIZED); + aml_append(method, aml_acquire(aml_name("BLCK"), 0xFFFF)); + aml_append(method, aml_store(aml_arg(0), aml_name("BNUM"))); + aml_append(method, + aml_store(aml_shiftleft(aml_int(1), aml_arg(1)), aml_name("B0EJ"))); + aml_append(method, aml_release(aml_name("BLCK"))); + aml_append(method, aml_return(aml_int(0))); + aml_append(scope, method); +} + +static void build_append_pcihp_notify_entry(Aml *method, int slot) +{ + Aml *if_ctx; + int32_t devfn = PCI_DEVFN(slot, 0); + + if_ctx = aml_if(aml_and(aml_arg(0), aml_int(0x1U << slot), NULL)); + aml_append(if_ctx, aml_notify(aml_name("S%.02X", devfn), aml_arg(1))); + aml_append(method, if_ctx); +} + +void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, + bool pcihp_bridge_en) +{ + Aml *dev, *notify_method = NULL, *method; + QObject *bsel; + PCIBus *sec; + int i; + + bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL); + if (bsel) { + uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); + + aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val))); + notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED); + } + + for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) { + DeviceClass *dc; + PCIDeviceClass *pc; + PCIDevice *pdev = bus->devices[i]; + int slot = PCI_SLOT(i); + bool hotplug_enabled_dev; + bool bridge_in_acpi; + + if (!pdev) { + if (bsel) { /* add hotplug slots for non present devices */ + dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); + aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); + aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); + method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); + aml_append(method, + aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) + ); + aml_append(dev, method); + aml_append(parent_scope, dev); + + build_append_pcihp_notify_entry(notify_method, slot); + } + continue; + } + + pc = PCI_DEVICE_GET_CLASS(pdev); + dc = DEVICE_GET_CLASS(pdev); + + /* When hotplug for bridges is enabled, bridges are + * described in ACPI separately (see build_pci_bus_end). + * In this case they aren't themselves hot-pluggable. + * Hotplugged bridges *are* hot-pluggable. + */ + bridge_in_acpi = pc->is_bridge && pcihp_bridge_en && + !DEVICE(pdev)->hotplugged; + + hotplug_enabled_dev = bsel && dc->hotpluggable && !bridge_in_acpi; + + if (pc->class_id == PCI_CLASS_BRIDGE_ISA) { + continue; + } + + /* start to compose PCI slot descriptor */ + dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); + aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); + + if (pc->class_id == PCI_CLASS_DISPLAY_VGA) { + /* add VGA specific AML methods */ + int s3d; + + if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) { + s3d = 3; + } else { + s3d = 0; + } + + method = aml_method("_S1D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(0))); + aml_append(dev, method); + + method = aml_method("_S2D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(0))); + aml_append(dev, method); + + method = aml_method("_S3D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(s3d))); + aml_append(dev, method); + } else if (hotplug_enabled_dev) { + /* add _SUN/_EJ0 to make slot hotpluggable */ + aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); + + method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); + aml_append(method, + aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) + ); + aml_append(dev, method); + + if (bsel) { + build_append_pcihp_notify_entry(notify_method, slot); + } + } else if (bridge_in_acpi) { + /* + * device is coldplugged bridge, + * add child device descriptions into its scope + */ + PCIBus *sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev)); + + build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en); + } + /* slot descriptor has been composed, add it into parent context */ + aml_append(parent_scope, dev); + } + + if (bsel) { + aml_append(parent_scope, notify_method); + } + + /* Append PCNT method to notify about events on local and child buses. + * Add unconditionally for root since DSDT expects it. + */ + method = aml_method("PCNT", 0, AML_NOTSERIALIZED); + + /* If bus supports hotplug select it and notify about local events */ + if (bsel) { + uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); + + aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM"))); + aml_append(method, + aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */) + ); + aml_append(method, + aml_call2("DVNT", aml_name("PCID"), aml_int(3)/* Eject Request */) + ); + } + + /* Notify about child bus events in any case */ + if (pcihp_bridge_en) { + QLIST_FOREACH(sec, &bus->child, sibling) { + int32_t devfn = sec->parent_dev->devfn; + + if (pci_bus_is_root(sec) || pci_bus_is_express(sec)) { + continue; + } + + aml_append(method, aml_name("^S%.02X.PCNT", devfn)); + } + } + aml_append(parent_scope, method); + qobject_unref(bsel); +} + void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host) { Aml *dev, *pci_scope; diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 673c5dfafc..bef5b23168 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -360,163 +360,6 @@ build_madt(GArray *table_data, BIOSLinker *linker, table_data->len - madt_start, 1, NULL, NULL); } -static void build_append_pcihp_notify_entry(Aml *method, int slot) -{ - Aml *if_ctx; - int32_t devfn = PCI_DEVFN(slot, 0); - - if_ctx = aml_if(aml_and(aml_arg(0), aml_int(0x1U << slot), NULL)); - aml_append(if_ctx, aml_notify(aml_name("S%.02X", devfn), aml_arg(1))); - aml_append(method, if_ctx); -} - -static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, - bool pcihp_bridge_en) -{ - Aml *dev, *notify_method = NULL, *method; - QObject *bsel; - PCIBus *sec; - int i; - - bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL); - if (bsel) { - uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); - - aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val))); - notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED); - } - - for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) { - DeviceClass *dc; - PCIDeviceClass *pc; - PCIDevice *pdev = bus->devices[i]; - int slot = PCI_SLOT(i); - bool hotplug_enabled_dev; - bool bridge_in_acpi; - - if (!pdev) { - if (bsel) { /* add hotplug slots for non present devices */ - dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); - aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); - aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); - method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); - aml_append(method, - aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) - ); - aml_append(dev, method); - aml_append(parent_scope, dev); - - build_append_pcihp_notify_entry(notify_method, slot); - } - continue; - } - - pc = PCI_DEVICE_GET_CLASS(pdev); - dc = DEVICE_GET_CLASS(pdev); - - /* When hotplug for bridges is enabled, bridges are - * described in ACPI separately (see build_pci_bus_end). - * In this case they aren't themselves hot-pluggable. - * Hotplugged bridges *are* hot-pluggable. - */ - bridge_in_acpi = pc->is_bridge && pcihp_bridge_en && - !DEVICE(pdev)->hotplugged; - - hotplug_enabled_dev = bsel && dc->hotpluggable && !bridge_in_acpi; - - if (pc->class_id == PCI_CLASS_BRIDGE_ISA) { - continue; - } - - /* start to compose PCI slot descriptor */ - dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); - aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); - - if (pc->class_id == PCI_CLASS_DISPLAY_VGA) { - /* add VGA specific AML methods */ - int s3d; - - if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) { - s3d = 3; - } else { - s3d = 0; - } - - method = aml_method("_S1D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(0))); - aml_append(dev, method); - - method = aml_method("_S2D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(0))); - aml_append(dev, method); - - method = aml_method("_S3D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(s3d))); - aml_append(dev, method); - } else if (hotplug_enabled_dev) { - /* add _SUN/_EJ0 to make slot hotpluggable */ - aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); - - method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); - aml_append(method, - aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) - ); - aml_append(dev, method); - - if (bsel) { - build_append_pcihp_notify_entry(notify_method, slot); - } - } else if (bridge_in_acpi) { - /* - * device is coldplugged bridge, - * add child device descriptions into its scope - */ - PCIBus *sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev)); - - build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en); - } - /* slot descriptor has been composed, add it into parent context */ - aml_append(parent_scope, dev); - } - - if (bsel) { - aml_append(parent_scope, notify_method); - } - - /* Append PCNT method to notify about events on local and child buses. - * Add unconditionally for root since DSDT expects it. - */ - method = aml_method("PCNT", 0, AML_NOTSERIALIZED); - - /* If bus supports hotplug select it and notify about local events */ - if (bsel) { - uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); - - aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM"))); - aml_append(method, - aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */) - ); - aml_append(method, - aml_call2("DVNT", aml_name("PCID"), aml_int(3)/* Eject Request */) - ); - } - - /* Notify about child bus events in any case */ - if (pcihp_bridge_en) { - QLIST_FOREACH(sec, &bus->child, sibling) { - int32_t devfn = sec->parent_dev->devfn; - - if (pci_bus_is_root(sec) || pci_bus_is_express(sec)) { - continue; - } - - aml_append(method, aml_name("^S%.02X.PCNT", devfn)); - } - } - aml_append(parent_scope, method); - qobject_unref(bsel); -} - static void build_hpet_aml(Aml *table) { Aml *crs; @@ -1212,41 +1055,10 @@ static void build_piix4_isa_bridge(Aml *table) static void build_piix4_pci_hotplug(Aml *table) { Aml *scope; - Aml *field; - Aml *method; - - scope = aml_scope("_SB.PCI0"); - - aml_append(scope, - aml_operation_region("PCST", AML_SYSTEM_IO, aml_int(0xae00), 0x08)); - field = aml_field("PCST", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("PCIU", 32)); - aml_append(field, aml_named_field("PCID", 32)); - aml_append(scope, field); - aml_append(scope, - aml_operation_region("SEJ", AML_SYSTEM_IO, aml_int(0xae08), 0x04)); - field = aml_field("SEJ", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("B0EJ", 32)); - aml_append(scope, field); - - aml_append(scope, - aml_operation_region("BNMR", AML_SYSTEM_IO, aml_int(0xae10), 0x04)); - field = aml_field("BNMR", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("BNUM", 32)); - aml_append(scope, field); - - aml_append(scope, aml_mutex("BLCK", 0)); - - method = aml_method("PCEJ", 2, AML_NOTSERIALIZED); - aml_append(method, aml_acquire(aml_name("BLCK"), 0xFFFF)); - aml_append(method, aml_store(aml_arg(0), aml_name("BNUM"))); - aml_append(method, - aml_store(aml_shiftleft(aml_int(1), aml_arg(1)), aml_name("B0EJ"))); - aml_append(method, aml_release(aml_name("BLCK"))); - aml_append(method, aml_return(aml_int(0))); - aml_append(scope, method); + scope = aml_scope("_SB.PCI0"); + build_acpi_pcihp(scope); aml_append(table, scope); } -- 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Ortiz Subject: [PATCH v5 17/24] hw: acpi: Export the PCI hotplug API Date: Mon, 5 Nov 2018 02:40:40 +0100 Message-ID: <20181105014047.26447-18-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gJTv5-0004J4-UI for xen-devel@lists.xenproject.org; Mon, 05 Nov 2018 01:43:11 +0000 In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: qemu-devel@nongnu.org Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Jing Liu , Shannon Zhao , Igor Mammedov , qemu-arm@nongnu.org, Marcel Apfelbaum , Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Sebastien Boeuf , Richard Henderson List-Id: xen-devel@lists.xenproject.org RnJvbTogU2ViYXN0aWVuIEJvZXVmIDxzZWJhc3RpZW4uYm9ldWZAaW50ZWwuY29tPgoKVGhlIEFD UEkgaG90cGx1ZyBzdXBwb3J0IGZvciBQQ0kgZGV2aWNlcyBBUElzIGFyZSBub3QgeDg2IG9yIGV2 ZW4KbWFjaGluZSB0eXBlIHNwZWNpZmljLiBJbiBvcmRlciBmb3IgZnV0dXJlIG1hY2hpbmUgdHlw ZXMgdG8gYmUgYWJsZSB0bwpyZS11c2UgdGhhdCBjb2RlLCB3ZSBleHBvcnQgaXQgdGhyb3VnaCB0 aGUgYXJjaGl0ZWN0dXJlIGFnbm9zdGljCmh3L2FjcGkgZm9sZGVyLgoKUmV2aWV3ZWQtYnk6IFBo aWxpcHBlIE1hdGhpZXUtRGF1ZMOpIDxwaGlsbWRAcmVkaGF0LmNvbT4KVGVzdGVkLWJ5OiBQaGls aXBwZSBNYXRoaWV1LURhdWTDqSA8cGhpbG1kQHJlZGhhdC5jb20+ClNpZ25lZC1vZmYtYnk6IFNl YmFzdGllbiBCb2V1ZiA8c2ViYXN0aWVuLmJvZXVmQGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTog SmluZyBMaXUgPGppbmcyLmxpdUBsaW51eC5pbnRlbC5jb20+Ci0tLQogaW5jbHVkZS9ody9hY3Bp L2FtbC1idWlsZC5oIHwgICAzICsKIGh3L2FjcGkvYW1sLWJ1aWxkLmMgICAgICAgICB8IDE5NCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGh3L2kzODYvYWNwaS1idWlsZC5j ICAgICAgICB8IDE5MiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMyBmaWxl cyBjaGFuZ2VkLCAxOTkgaW5zZXJ0aW9ucygrKSwgMTkwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2luY2x1ZGUvaHcvYWNwaS9hbWwtYnVpbGQuaCBiL2luY2x1ZGUvaHcvYWNwaS9hbWwtYnVp bGQuaAppbmRleCA2NGVhMzcxNjU2Li42YjBhOTczNWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2h3 L2FjcGkvYW1sLWJ1aWxkLmgKKysrIGIvaW5jbHVkZS9ody9hY3BpL2FtbC1idWlsZC5oCkBAIC00 MTgsNiArNDE4LDkgQEAgQW1sICpidWlsZF9vc2NfbWV0aG9kKHVpbnQzMl90IHZhbHVlKTsKIHZv aWQgYnVpbGRfbWNmZyhHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwgQWNw aU1jZmdJbmZvICppbmZvKTsKIEFtbCAqYnVpbGRfZ3NpX2xpbmtfZGV2KGNvbnN0IGNoYXIgKm5h bWUsIHVpbnQ4X3QgdWlkLCB1aW50OF90IGdzaSk7CiBBbWwgKmJ1aWxkX3BydChib29sIGlzX3Bj aTBfcHJ0KTsKK3ZvaWQgYnVpbGRfYWNwaV9wY2locChBbWwgKnNjb3BlKTsKK3ZvaWQgYnVpbGRf YXBwZW5kX3BjaV9idXNfZGV2aWNlcyhBbWwgKnBhcmVudF9zY29wZSwgUENJQnVzICpidXMsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwY2locF9icmlkZ2VfZW4pOwog dm9pZCBhY3BpX2RzZHRfYWRkX3BjaV9idXMoQW1sICpkc2R0LCBBY3BpUGNpQnVzICpwY2lfaG9z dCk7CiBBbWwgKmJ1aWxkX3BjaV9ob3N0X2JyaWRnZShBbWwgKnRhYmxlLCBBY3BpUGNpQnVzICpw Y2lfaG9zdCk7CiB2b2lkIGNyc19yYW5nZV9zZXRfaW5pdChDcnNSYW5nZVNldCAqcmFuZ2Vfc2V0 KTsKZGlmZiAtLWdpdCBhL2h3L2FjcGkvYW1sLWJ1aWxkLmMgYi9ody9hY3BpL2FtbC1idWlsZC5j CmluZGV4IDJjNTQ0NmFiMjMuLjYxMTJjYzIxNDkgMTAwNjQ0Ci0tLSBhL2h3L2FjcGkvYW1sLWJ1 aWxkLmMKKysrIGIvaHcvYWNwaS9hbWwtYnVpbGQuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1 ZGUgImh3L2FjcGkvdHBtLmgiCiAjaW5jbHVkZSAicW9tL3FvbS1xb2JqZWN0LmgiCiAjaW5jbHVk ZSAicWFwaS9xbXAvcW51bS5oIgorI2luY2x1ZGUgImh3L2FjcGkvcGNpaHAuaCIKIAogI2RlZmlu ZSBQQ0lfSE9TVF9CUklER0VfQ09ORklHX0FERFIgICAgICAgIDB4Y2Y4CiAjZGVmaW5lIFBDSV9I T1NUX0JSSURHRV9JT18wX01JTl9BRERSICAgICAgMHgwMDAwCkBAIC0yMzA1LDYgKzIzMDYsMTk5 IEBAIEFtbCAqYnVpbGRfcGNpX2hvc3RfYnJpZGdlKEFtbCAqdGFibGUsIEFjcGlQY2lCdXMgKnBj aV9ob3N0KQogICAgIHJldHVybiBzY29wZTsKIH0KIAordm9pZCBidWlsZF9hY3BpX3BjaWhwKEFt bCAqc2NvcGUpCit7CisgICAgQW1sICpmaWVsZDsKKyAgICBBbWwgKm1ldGhvZDsKKworICAgIGFt bF9hcHBlbmQoc2NvcGUsCisgICAgICAgIGFtbF9vcGVyYXRpb25fcmVnaW9uKCJQQ1NUIiwgQU1M X1NZU1RFTV9JTywgYW1sX2ludCgweGFlMDApLCAweDA4KSk7CisgICAgZmllbGQgPSBhbWxfZmll bGQoIlBDU1QiLCBBTUxfRFdPUkRfQUNDLCBBTUxfTk9MT0NLLCBBTUxfV1JJVEVfQVNfWkVST1Mp OworICAgIGFtbF9hcHBlbmQoZmllbGQsIGFtbF9uYW1lZF9maWVsZCgiUENJVSIsIDMyKSk7Cisg ICAgYW1sX2FwcGVuZChmaWVsZCwgYW1sX25hbWVkX2ZpZWxkKCJQQ0lEIiwgMzIpKTsKKyAgICBh bWxfYXBwZW5kKHNjb3BlLCBmaWVsZCk7CisKKyAgICBhbWxfYXBwZW5kKHNjb3BlLAorICAgICAg ICBhbWxfb3BlcmF0aW9uX3JlZ2lvbigiU0VKIiwgQU1MX1NZU1RFTV9JTywgYW1sX2ludCgweGFl MDgpLCAweDA0KSk7CisgICAgZmllbGQgPSBhbWxfZmllbGQoIlNFSiIsIEFNTF9EV09SRF9BQ0Ms IEFNTF9OT0xPQ0ssIEFNTF9XUklURV9BU19aRVJPUyk7CisgICAgYW1sX2FwcGVuZChmaWVsZCwg YW1sX25hbWVkX2ZpZWxkKCJCMEVKIiwgMzIpKTsKKyAgICBhbWxfYXBwZW5kKHNjb3BlLCBmaWVs ZCk7CisKKyAgICBhbWxfYXBwZW5kKHNjb3BlLAorICAgICAgICBhbWxfb3BlcmF0aW9uX3JlZ2lv bigiQk5NUiIsIEFNTF9TWVNURU1fSU8sIGFtbF9pbnQoMHhhZTEwKSwgMHgwNCkpOworICAgIGZp ZWxkID0gYW1sX2ZpZWxkKCJCTk1SIiwgQU1MX0RXT1JEX0FDQywgQU1MX05PTE9DSywgQU1MX1dS SVRFX0FTX1pFUk9TKTsKKyAgICBhbWxfYXBwZW5kKGZpZWxkLCBhbWxfbmFtZWRfZmllbGQoIkJO VU0iLCAzMikpOworICAgIGFtbF9hcHBlbmQoc2NvcGUsIGZpZWxkKTsKKworICAgIGFtbF9hcHBl bmQoc2NvcGUsIGFtbF9tdXRleCgiQkxDSyIsIDApKTsKKworICAgIG1ldGhvZCA9IGFtbF9tZXRo b2QoIlBDRUoiLCAyLCBBTUxfTk9UU0VSSUFMSVpFRCk7CisgICAgYW1sX2FwcGVuZChtZXRob2Qs IGFtbF9hY3F1aXJlKGFtbF9uYW1lKCJCTENLIiksIDB4RkZGRikpOworICAgIGFtbF9hcHBlbmQo bWV0aG9kLCBhbWxfc3RvcmUoYW1sX2FyZygwKSwgYW1sX25hbWUoIkJOVU0iKSkpOworICAgIGFt bF9hcHBlbmQobWV0aG9kLAorICAgICAgICBhbWxfc3RvcmUoYW1sX3NoaWZ0bGVmdChhbWxfaW50 KDEpLCBhbWxfYXJnKDEpKSwgYW1sX25hbWUoIkIwRUoiKSkpOworICAgIGFtbF9hcHBlbmQobWV0 aG9kLCBhbWxfcmVsZWFzZShhbWxfbmFtZSgiQkxDSyIpKSk7CisgICAgYW1sX2FwcGVuZChtZXRo b2QsIGFtbF9yZXR1cm4oYW1sX2ludCgwKSkpOworICAgIGFtbF9hcHBlbmQoc2NvcGUsIG1ldGhv ZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2FwcGVuZF9wY2locF9ub3RpZnlfZW50cnkoQW1s ICptZXRob2QsIGludCBzbG90KQoreworICAgIEFtbCAqaWZfY3R4OworICAgIGludDMyX3QgZGV2 Zm4gPSBQQ0lfREVWRk4oc2xvdCwgMCk7CisKKyAgICBpZl9jdHggPSBhbWxfaWYoYW1sX2FuZChh bWxfYXJnKDApLCBhbWxfaW50KDB4MVUgPDwgc2xvdCksIE5VTEwpKTsKKyAgICBhbWxfYXBwZW5k KGlmX2N0eCwgYW1sX25vdGlmeShhbWxfbmFtZSgiUyUuMDJYIiwgZGV2Zm4pLCBhbWxfYXJnKDEp KSk7CisgICAgYW1sX2FwcGVuZChtZXRob2QsIGlmX2N0eCk7Cit9CisKK3ZvaWQgYnVpbGRfYXBw ZW5kX3BjaV9idXNfZGV2aWNlcyhBbWwgKnBhcmVudF9zY29wZSwgUENJQnVzICpidXMsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwY2locF9icmlkZ2VfZW4pCit7Cisg ICAgQW1sICpkZXYsICpub3RpZnlfbWV0aG9kID0gTlVMTCwgKm1ldGhvZDsKKyAgICBRT2JqZWN0 ICpic2VsOworICAgIFBDSUJ1cyAqc2VjOworICAgIGludCBpOworCisgICAgYnNlbCA9IG9iamVj dF9wcm9wZXJ0eV9nZXRfcW9iamVjdChPQkpFQ1QoYnVzKSwgQUNQSV9QQ0lIUF9QUk9QX0JTRUws IE5VTEwpOworICAgIGlmIChic2VsKSB7CisgICAgICAgIHVpbnQ2NF90IGJzZWxfdmFsID0gcW51 bV9nZXRfdWludChxb2JqZWN0X3RvKFFOdW0sIGJzZWwpKTsKKworICAgICAgICBhbWxfYXBwZW5k KHBhcmVudF9zY29wZSwgYW1sX25hbWVfZGVjbCgiQlNFTCIsIGFtbF9pbnQoYnNlbF92YWwpKSk7 CisgICAgICAgIG5vdGlmeV9tZXRob2QgPSBhbWxfbWV0aG9kKCJEVk5UIiwgMiwgQU1MX05PVFNF UklBTElaRUQpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1cy0+ ZGV2aWNlcyk7IGkgKz0gUENJX0ZVTkNfTUFYKSB7CisgICAgICAgIERldmljZUNsYXNzICpkYzsK KyAgICAgICAgUENJRGV2aWNlQ2xhc3MgKnBjOworICAgICAgICBQQ0lEZXZpY2UgKnBkZXYgPSBi dXMtPmRldmljZXNbaV07CisgICAgICAgIGludCBzbG90ID0gUENJX1NMT1QoaSk7CisgICAgICAg IGJvb2wgaG90cGx1Z19lbmFibGVkX2RldjsKKyAgICAgICAgYm9vbCBicmlkZ2VfaW5fYWNwaTsK KworICAgICAgICBpZiAoIXBkZXYpIHsKKyAgICAgICAgICAgIGlmIChic2VsKSB7IC8qIGFkZCBo b3RwbHVnIHNsb3RzIGZvciBub24gcHJlc2VudCBkZXZpY2VzICovCisgICAgICAgICAgICAgICAg ZGV2ID0gYW1sX2RldmljZSgiUyUuMDJYIiwgUENJX0RFVkZOKHNsb3QsIDApKTsKKyAgICAgICAg ICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX1NVTiIsIGFtbF9pbnQoc2xv dCkpKTsKKyAgICAgICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0FE UiIsIGFtbF9pbnQoc2xvdCA8PCAxNikpKTsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBhbWxf bWV0aG9kKCJfRUowIiwgMSwgQU1MX05PVFNFUklBTElaRUQpOworICAgICAgICAgICAgICAgIGFt bF9hcHBlbmQobWV0aG9kLAorICAgICAgICAgICAgICAgICAgICBhbWxfY2FsbDIoIlBDRUoiLCBh bWxfbmFtZSgiQlNFTCIpLCBhbWxfbmFtZSgiX1NVTiIpKQorICAgICAgICAgICAgICAgICk7Cisg ICAgICAgICAgICAgICAgYW1sX2FwcGVuZChkZXYsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAg YW1sX2FwcGVuZChwYXJlbnRfc2NvcGUsIGRldik7CisKKyAgICAgICAgICAgICAgICBidWlsZF9h cHBlbmRfcGNpaHBfbm90aWZ5X2VudHJ5KG5vdGlmeV9tZXRob2QsIHNsb3QpOworICAgICAgICAg ICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwYyA9IFBD SV9ERVZJQ0VfR0VUX0NMQVNTKHBkZXYpOworICAgICAgICBkYyA9IERFVklDRV9HRVRfQ0xBU1Mo cGRldik7CisKKyAgICAgICAgLyogV2hlbiBob3RwbHVnIGZvciBicmlkZ2VzIGlzIGVuYWJsZWQs IGJyaWRnZXMgYXJlCisgICAgICAgICAqIGRlc2NyaWJlZCBpbiBBQ1BJIHNlcGFyYXRlbHkgKHNl ZSBidWlsZF9wY2lfYnVzX2VuZCkuCisgICAgICAgICAqIEluIHRoaXMgY2FzZSB0aGV5IGFyZW4n dCB0aGVtc2VsdmVzIGhvdC1wbHVnZ2FibGUuCisgICAgICAgICAqIEhvdHBsdWdnZWQgYnJpZGdl cyAqYXJlKiBob3QtcGx1Z2dhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgYnJpZGdlX2luX2Fj cGkgPSBwYy0+aXNfYnJpZGdlICYmIHBjaWhwX2JyaWRnZV9lbiAmJgorICAgICAgICAgICAgIURF VklDRShwZGV2KS0+aG90cGx1Z2dlZDsKKworICAgICAgICBob3RwbHVnX2VuYWJsZWRfZGV2ID0g YnNlbCAmJiBkYy0+aG90cGx1Z2dhYmxlICYmICFicmlkZ2VfaW5fYWNwaTsKKworICAgICAgICBp ZiAocGMtPmNsYXNzX2lkID09IFBDSV9DTEFTU19CUklER0VfSVNBKSB7CisgICAgICAgICAgICBj b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0YXJ0IHRvIGNvbXBvc2UgUENJIHNs b3QgZGVzY3JpcHRvciAqLworICAgICAgICBkZXYgPSBhbWxfZGV2aWNlKCJTJS4wMlgiLCBQQ0lf REVWRk4oc2xvdCwgMCkpOworICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgi X0FEUiIsIGFtbF9pbnQoc2xvdCA8PCAxNikpKTsKKworICAgICAgICBpZiAocGMtPmNsYXNzX2lk ID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgeworICAgICAgICAgICAgLyogYWRkIFZHQSBzcGVj aWZpYyBBTUwgbWV0aG9kcyAqLworICAgICAgICAgICAgaW50IHMzZDsKKworICAgICAgICAgICAg aWYgKG9iamVjdF9keW5hbWljX2Nhc3QoT0JKRUNUKHBkZXYpLCAicXhsLXZnYSIpKSB7CisgICAg ICAgICAgICAgICAgczNkID0gMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg ICAgczNkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0aG9kID0gYW1sX21l dGhvZCgiX1MxRCIsIDAsIEFNTF9OT1RTRVJJQUxJWkVEKTsKKyAgICAgICAgICAgIGFtbF9hcHBl bmQobWV0aG9kLCBhbWxfcmV0dXJuKGFtbF9pbnQoMCkpKTsKKyAgICAgICAgICAgIGFtbF9hcHBl bmQoZGV2LCBtZXRob2QpOworCisgICAgICAgICAgICBtZXRob2QgPSBhbWxfbWV0aG9kKCJfUzJE IiwgMCwgQU1MX05PVFNFUklBTElaRUQpOworICAgICAgICAgICAgYW1sX2FwcGVuZChtZXRob2Qs IGFtbF9yZXR1cm4oYW1sX2ludCgwKSkpOworICAgICAgICAgICAgYW1sX2FwcGVuZChkZXYsIG1l dGhvZCk7CisKKyAgICAgICAgICAgIG1ldGhvZCA9IGFtbF9tZXRob2QoIl9TM0QiLCAwLCBBTUxf Tk9UU0VSSUFMSVpFRCk7CisgICAgICAgICAgICBhbWxfYXBwZW5kKG1ldGhvZCwgYW1sX3JldHVy bihhbWxfaW50KHMzZCkpKTsKKyAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBtZXRob2QpOwor ICAgICAgICB9IGVsc2UgaWYgKGhvdHBsdWdfZW5hYmxlZF9kZXYpIHsKKyAgICAgICAgICAgIC8q IGFkZCBfU1VOL19FSjAgdG8gbWFrZSBzbG90IGhvdHBsdWdnYWJsZSAgKi8KKyAgICAgICAgICAg IGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJfU1VOIiwgYW1sX2ludChzbG90KSkpOwor CisgICAgICAgICAgICBtZXRob2QgPSBhbWxfbWV0aG9kKCJfRUowIiwgMSwgQU1MX05PVFNFUklB TElaRUQpOworICAgICAgICAgICAgYW1sX2FwcGVuZChtZXRob2QsCisgICAgICAgICAgICAgICAg YW1sX2NhbGwyKCJQQ0VKIiwgYW1sX25hbWUoIkJTRUwiKSwgYW1sX25hbWUoIl9TVU4iKSkKKyAg ICAgICAgICAgICk7CisgICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgbWV0aG9kKTsKKworICAg ICAgICAgICAgaWYgKGJzZWwpIHsKKyAgICAgICAgICAgICAgICBidWlsZF9hcHBlbmRfcGNpaHBf bm90aWZ5X2VudHJ5KG5vdGlmeV9tZXRob2QsIHNsb3QpOworICAgICAgICAgICAgfQorICAgICAg ICB9IGVsc2UgaWYgKGJyaWRnZV9pbl9hY3BpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAg ICAgICogZGV2aWNlIGlzIGNvbGRwbHVnZ2VkIGJyaWRnZSwKKyAgICAgICAgICAgICAqIGFkZCBj aGlsZCBkZXZpY2UgZGVzY3JpcHRpb25zIGludG8gaXRzIHNjb3BlCisgICAgICAgICAgICAgKi8K KyAgICAgICAgICAgIFBDSUJ1cyAqc2VjX2J1cyA9IHBjaV9icmlkZ2VfZ2V0X3NlY19idXMoUENJ X0JSSURHRShwZGV2KSk7CisKKyAgICAgICAgICAgIGJ1aWxkX2FwcGVuZF9wY2lfYnVzX2Rldmlj ZXMoZGV2LCBzZWNfYnVzLCBwY2locF9icmlkZ2VfZW4pOworICAgICAgICB9CisgICAgICAgIC8q IHNsb3QgZGVzY3JpcHRvciBoYXMgYmVlbiBjb21wb3NlZCwgYWRkIGl0IGludG8gcGFyZW50IGNv bnRleHQgKi8KKyAgICAgICAgYW1sX2FwcGVuZChwYXJlbnRfc2NvcGUsIGRldik7CisgICAgfQor CisgICAgaWYgKGJzZWwpIHsKKyAgICAgICAgYW1sX2FwcGVuZChwYXJlbnRfc2NvcGUsIG5vdGlm eV9tZXRob2QpOworICAgIH0KKworICAgIC8qIEFwcGVuZCBQQ05UIG1ldGhvZCB0byBub3RpZnkg YWJvdXQgZXZlbnRzIG9uIGxvY2FsIGFuZCBjaGlsZCBidXNlcy4KKyAgICAgKiBBZGQgdW5jb25k aXRpb25hbGx5IGZvciByb290IHNpbmNlIERTRFQgZXhwZWN0cyBpdC4KKyAgICAgKi8KKyAgICBt ZXRob2QgPSBhbWxfbWV0aG9kKCJQQ05UIiwgMCwgQU1MX05PVFNFUklBTElaRUQpOworCisgICAg LyogSWYgYnVzIHN1cHBvcnRzIGhvdHBsdWcgc2VsZWN0IGl0IGFuZCBub3RpZnkgYWJvdXQgbG9j YWwgZXZlbnRzICovCisgICAgaWYgKGJzZWwpIHsKKyAgICAgICAgdWludDY0X3QgYnNlbF92YWwg PSBxbnVtX2dldF91aW50KHFvYmplY3RfdG8oUU51bSwgYnNlbCkpOworCisgICAgICAgIGFtbF9h cHBlbmQobWV0aG9kLCBhbWxfc3RvcmUoYW1sX2ludChic2VsX3ZhbCksIGFtbF9uYW1lKCJCTlVN IikpKTsKKyAgICAgICAgYW1sX2FwcGVuZChtZXRob2QsCisgICAgICAgICAgICBhbWxfY2FsbDIo IkRWTlQiLCBhbWxfbmFtZSgiUENJVSIpLCBhbWxfaW50KDEpIC8qIERldmljZSBDaGVjayAqLykK KyAgICAgICAgKTsKKyAgICAgICAgYW1sX2FwcGVuZChtZXRob2QsCisgICAgICAgICAgICBhbWxf Y2FsbDIoIkRWTlQiLCBhbWxfbmFtZSgiUENJRCIpLCBhbWxfaW50KDMpLyogRWplY3QgUmVxdWVz dCAqLykKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKiBOb3RpZnkgYWJvdXQgY2hpbGQgYnVz IGV2ZW50cyBpbiBhbnkgY2FzZSAqLworICAgIGlmIChwY2locF9icmlkZ2VfZW4pIHsKKyAgICAg ICAgUUxJU1RfRk9SRUFDSChzZWMsICZidXMtPmNoaWxkLCBzaWJsaW5nKSB7CisgICAgICAgICAg ICBpbnQzMl90IGRldmZuID0gc2VjLT5wYXJlbnRfZGV2LT5kZXZmbjsKKworICAgICAgICAgICAg aWYgKHBjaV9idXNfaXNfcm9vdChzZWMpIHx8IHBjaV9idXNfaXNfZXhwcmVzcyhzZWMpKSB7Cisg ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFt bF9hcHBlbmQobWV0aG9kLCBhbWxfbmFtZSgiXlMlLjAyWC5QQ05UIiwgZGV2Zm4pKTsKKyAgICAg ICAgfQorICAgIH0KKyAgICBhbWxfYXBwZW5kKHBhcmVudF9zY29wZSwgbWV0aG9kKTsKKyAgICBx b2JqZWN0X3VucmVmKGJzZWwpOworfQorCiB2b2lkIGFjcGlfZHNkdF9hZGRfcGNpX2J1cyhBbWwg KmRzZHQsIEFjcGlQY2lCdXMgKnBjaV9ob3N0KQogewogICAgIEFtbCAqZGV2LCAqcGNpX3Njb3Bl OwpkaWZmIC0tZ2l0IGEvaHcvaTM4Ni9hY3BpLWJ1aWxkLmMgYi9ody9pMzg2L2FjcGktYnVpbGQu YwppbmRleCA2NzNjNWRmYWZjLi5iZWY1YjIzMTY4IDEwMDY0NAotLS0gYS9ody9pMzg2L2FjcGkt YnVpbGQuYworKysgYi9ody9pMzg2L2FjcGktYnVpbGQuYwpAQCAtMzYwLDE2MyArMzYwLDYgQEAg YnVpbGRfbWFkdChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKICAgICAg ICAgICAgICAgICAgdGFibGVfZGF0YS0+bGVuIC0gbWFkdF9zdGFydCwgMSwgTlVMTCwgTlVMTCk7 CiB9CiAKLXN0YXRpYyB2b2lkIGJ1aWxkX2FwcGVuZF9wY2locF9ub3RpZnlfZW50cnkoQW1sICpt ZXRob2QsIGludCBzbG90KQotewotICAgIEFtbCAqaWZfY3R4OwotICAgIGludDMyX3QgZGV2Zm4g PSBQQ0lfREVWRk4oc2xvdCwgMCk7Ci0KLSAgICBpZl9jdHggPSBhbWxfaWYoYW1sX2FuZChhbWxf YXJnKDApLCBhbWxfaW50KDB4MVUgPDwgc2xvdCksIE5VTEwpKTsKLSAgICBhbWxfYXBwZW5kKGlm X2N0eCwgYW1sX25vdGlmeShhbWxfbmFtZSgiUyUuMDJYIiwgZGV2Zm4pLCBhbWxfYXJnKDEpKSk7 Ci0gICAgYW1sX2FwcGVuZChtZXRob2QsIGlmX2N0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1aWxk X2FwcGVuZF9wY2lfYnVzX2RldmljZXMoQW1sICpwYXJlbnRfc2NvcGUsIFBDSUJ1cyAqYnVzLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBjaWhwX2JyaWRn ZV9lbikKLXsKLSAgICBBbWwgKmRldiwgKm5vdGlmeV9tZXRob2QgPSBOVUxMLCAqbWV0aG9kOwot ICAgIFFPYmplY3QgKmJzZWw7Ci0gICAgUENJQnVzICpzZWM7Ci0gICAgaW50IGk7Ci0KLSAgICBi c2VsID0gb2JqZWN0X3Byb3BlcnR5X2dldF9xb2JqZWN0KE9CSkVDVChidXMpLCBBQ1BJX1BDSUhQ X1BST1BfQlNFTCwgTlVMTCk7Ci0gICAgaWYgKGJzZWwpIHsKLSAgICAgICAgdWludDY0X3QgYnNl bF92YWwgPSBxbnVtX2dldF91aW50KHFvYmplY3RfdG8oUU51bSwgYnNlbCkpOwotCi0gICAgICAg IGFtbF9hcHBlbmQocGFyZW50X3Njb3BlLCBhbWxfbmFtZV9kZWNsKCJCU0VMIiwgYW1sX2ludChi c2VsX3ZhbCkpKTsKLSAgICAgICAgbm90aWZ5X21ldGhvZCA9IGFtbF9tZXRob2QoIkRWTlQiLCAy LCBBTUxfTk9UU0VSSUFMSVpFRCk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoYnVzLT5kZXZpY2VzKTsgaSArPSBQQ0lfRlVOQ19NQVgpIHsKLSAgICAgICAgRGV2aWNl Q2xhc3MgKmRjOwotICAgICAgICBQQ0lEZXZpY2VDbGFzcyAqcGM7Ci0gICAgICAgIFBDSURldmlj ZSAqcGRldiA9IGJ1cy0+ZGV2aWNlc1tpXTsKLSAgICAgICAgaW50IHNsb3QgPSBQQ0lfU0xPVChp KTsKLSAgICAgICAgYm9vbCBob3RwbHVnX2VuYWJsZWRfZGV2OwotICAgICAgICBib29sIGJyaWRn ZV9pbl9hY3BpOwotCi0gICAgICAgIGlmICghcGRldikgewotICAgICAgICAgICAgaWYgKGJzZWwp IHsgLyogYWRkIGhvdHBsdWcgc2xvdHMgZm9yIG5vbiBwcmVzZW50IGRldmljZXMgKi8KLSAgICAg ICAgICAgICAgICBkZXYgPSBhbWxfZGV2aWNlKCJTJS4wMlgiLCBQQ0lfREVWRk4oc2xvdCwgMCkp OwotICAgICAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJfU1VOIiwg YW1sX2ludChzbG90KSkpOwotICAgICAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFt ZV9kZWNsKCJfQURSIiwgYW1sX2ludChzbG90IDw8IDE2KSkpOwotICAgICAgICAgICAgICAgIG1l dGhvZCA9IGFtbF9tZXRob2QoIl9FSjAiLCAxLCBBTUxfTk9UU0VSSUFMSVpFRCk7Ci0gICAgICAg ICAgICAgICAgYW1sX2FwcGVuZChtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFtbF9jYWxs MigiUENFSiIsIGFtbF9uYW1lKCJCU0VMIiksIGFtbF9uYW1lKCJfU1VOIikpCi0gICAgICAgICAg ICAgICAgKTsKLSAgICAgICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgbWV0aG9kKTsKLSAgICAg ICAgICAgICAgICBhbWxfYXBwZW5kKHBhcmVudF9zY29wZSwgZGV2KTsKLQotICAgICAgICAgICAg ICAgIGJ1aWxkX2FwcGVuZF9wY2locF9ub3RpZnlfZW50cnkobm90aWZ5X21ldGhvZCwgc2xvdCk7 Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAg ICAgIHBjID0gUENJX0RFVklDRV9HRVRfQ0xBU1MocGRldik7Ci0gICAgICAgIGRjID0gREVWSUNF X0dFVF9DTEFTUyhwZGV2KTsKLQotICAgICAgICAvKiBXaGVuIGhvdHBsdWcgZm9yIGJyaWRnZXMg aXMgZW5hYmxlZCwgYnJpZGdlcyBhcmUKLSAgICAgICAgICogZGVzY3JpYmVkIGluIEFDUEkgc2Vw YXJhdGVseSAoc2VlIGJ1aWxkX3BjaV9idXNfZW5kKS4KLSAgICAgICAgICogSW4gdGhpcyBjYXNl IHRoZXkgYXJlbid0IHRoZW1zZWx2ZXMgaG90LXBsdWdnYWJsZS4KLSAgICAgICAgICogSG90cGx1 Z2dlZCBicmlkZ2VzICphcmUqIGhvdC1wbHVnZ2FibGUuCi0gICAgICAgICAqLwotICAgICAgICBi cmlkZ2VfaW5fYWNwaSA9IHBjLT5pc19icmlkZ2UgJiYgcGNpaHBfYnJpZGdlX2VuICYmCi0gICAg ICAgICAgICAhREVWSUNFKHBkZXYpLT5ob3RwbHVnZ2VkOwotCi0gICAgICAgIGhvdHBsdWdfZW5h YmxlZF9kZXYgPSBic2VsICYmIGRjLT5ob3RwbHVnZ2FibGUgJiYgIWJyaWRnZV9pbl9hY3BpOwot Ci0gICAgICAgIGlmIChwYy0+Y2xhc3NfaWQgPT0gUENJX0NMQVNTX0JSSURHRV9JU0EpIHsKLSAg ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc3RhcnQgdG8gY29t cG9zZSBQQ0kgc2xvdCBkZXNjcmlwdG9yICovCi0gICAgICAgIGRldiA9IGFtbF9kZXZpY2UoIlMl LjAyWCIsIFBDSV9ERVZGTihzbG90LCAwKSk7Ci0gICAgICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxf bmFtZV9kZWNsKCJfQURSIiwgYW1sX2ludChzbG90IDw8IDE2KSkpOwotCi0gICAgICAgIGlmIChw Yy0+Y2xhc3NfaWQgPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKSB7Ci0gICAgICAgICAgICAvKiBh ZGQgVkdBIHNwZWNpZmljIEFNTCBtZXRob2RzICovCi0gICAgICAgICAgICBpbnQgczNkOwotCi0g ICAgICAgICAgICBpZiAob2JqZWN0X2R5bmFtaWNfY2FzdChPQkpFQ1QocGRldiksICJxeGwtdmdh IikpIHsKLSAgICAgICAgICAgICAgICBzM2QgPSAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAg ICAgICAgICAgICAgICBzM2QgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXRo b2QgPSBhbWxfbWV0aG9kKCJfUzFEIiwgMCwgQU1MX05PVFNFUklBTElaRUQpOwotICAgICAgICAg ICAgYW1sX2FwcGVuZChtZXRob2QsIGFtbF9yZXR1cm4oYW1sX2ludCgwKSkpOwotICAgICAgICAg ICAgYW1sX2FwcGVuZChkZXYsIG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIG1ldGhvZCA9IGFtbF9t ZXRob2QoIl9TMkQiLCAwLCBBTUxfTk9UU0VSSUFMSVpFRCk7Ci0gICAgICAgICAgICBhbWxfYXBw ZW5kKG1ldGhvZCwgYW1sX3JldHVybihhbWxfaW50KDApKSk7Ci0gICAgICAgICAgICBhbWxfYXBw ZW5kKGRldiwgbWV0aG9kKTsKLQotICAgICAgICAgICAgbWV0aG9kID0gYW1sX21ldGhvZCgiX1Mz RCIsIDAsIEFNTF9OT1RTRVJJQUxJWkVEKTsKLSAgICAgICAgICAgIGFtbF9hcHBlbmQobWV0aG9k LCBhbWxfcmV0dXJuKGFtbF9pbnQoczNkKSkpOwotICAgICAgICAgICAgYW1sX2FwcGVuZChkZXYs IG1ldGhvZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaG90cGx1Z19lbmFibGVkX2RldikgewotICAg ICAgICAgICAgLyogYWRkIF9TVU4vX0VKMCB0byBtYWtlIHNsb3QgaG90cGx1Z2dhYmxlICAqLwot ICAgICAgICAgICAgYW1sX2FwcGVuZChkZXYsIGFtbF9uYW1lX2RlY2woIl9TVU4iLCBhbWxfaW50 KHNsb3QpKSk7Ci0KLSAgICAgICAgICAgIG1ldGhvZCA9IGFtbF9tZXRob2QoIl9FSjAiLCAxLCBB TUxfTk9UU0VSSUFMSVpFRCk7Ci0gICAgICAgICAgICBhbWxfYXBwZW5kKG1ldGhvZCwKLSAgICAg ICAgICAgICAgICBhbWxfY2FsbDIoIlBDRUoiLCBhbWxfbmFtZSgiQlNFTCIpLCBhbWxfbmFtZSgi X1NVTiIpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBtZXRo b2QpOwotCi0gICAgICAgICAgICBpZiAoYnNlbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkX2Fw cGVuZF9wY2locF9ub3RpZnlfZW50cnkobm90aWZ5X21ldGhvZCwgc2xvdCk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYnJpZGdlX2luX2FjcGkpIHsKLSAgICAgICAgICAgIC8q Ci0gICAgICAgICAgICAgKiBkZXZpY2UgaXMgY29sZHBsdWdnZWQgYnJpZGdlLAotICAgICAgICAg ICAgICogYWRkIGNoaWxkIGRldmljZSBkZXNjcmlwdGlvbnMgaW50byBpdHMgc2NvcGUKLSAgICAg ICAgICAgICAqLwotICAgICAgICAgICAgUENJQnVzICpzZWNfYnVzID0gcGNpX2JyaWRnZV9nZXRf c2VjX2J1cyhQQ0lfQlJJREdFKHBkZXYpKTsKLQotICAgICAgICAgICAgYnVpbGRfYXBwZW5kX3Bj aV9idXNfZGV2aWNlcyhkZXYsIHNlY19idXMsIHBjaWhwX2JyaWRnZV9lbik7Ci0gICAgICAgIH0K LSAgICAgICAgLyogc2xvdCBkZXNjcmlwdG9yIGhhcyBiZWVuIGNvbXBvc2VkLCBhZGQgaXQgaW50 byBwYXJlbnQgY29udGV4dCAqLwotICAgICAgICBhbWxfYXBwZW5kKHBhcmVudF9zY29wZSwgZGV2 KTsKLSAgICB9Ci0KLSAgICBpZiAoYnNlbCkgewotICAgICAgICBhbWxfYXBwZW5kKHBhcmVudF9z Y29wZSwgbm90aWZ5X21ldGhvZCk7Ci0gICAgfQotCi0gICAgLyogQXBwZW5kIFBDTlQgbWV0aG9k IHRvIG5vdGlmeSBhYm91dCBldmVudHMgb24gbG9jYWwgYW5kIGNoaWxkIGJ1c2VzLgotICAgICAq IEFkZCB1bmNvbmRpdGlvbmFsbHkgZm9yIHJvb3Qgc2luY2UgRFNEVCBleHBlY3RzIGl0LgotICAg ICAqLwotICAgIG1ldGhvZCA9IGFtbF9tZXRob2QoIlBDTlQiLCAwLCBBTUxfTk9UU0VSSUFMSVpF RCk7Ci0KLSAgICAvKiBJZiBidXMgc3VwcG9ydHMgaG90cGx1ZyBzZWxlY3QgaXQgYW5kIG5vdGlm eSBhYm91dCBsb2NhbCBldmVudHMgKi8KLSAgICBpZiAoYnNlbCkgewotICAgICAgICB1aW50NjRf dCBic2VsX3ZhbCA9IHFudW1fZ2V0X3VpbnQocW9iamVjdF90byhRTnVtLCBic2VsKSk7Ci0KLSAg ICAgICAgYW1sX2FwcGVuZChtZXRob2QsIGFtbF9zdG9yZShhbWxfaW50KGJzZWxfdmFsKSwgYW1s X25hbWUoIkJOVU0iKSkpOwotICAgICAgICBhbWxfYXBwZW5kKG1ldGhvZCwKLSAgICAgICAgICAg IGFtbF9jYWxsMigiRFZOVCIsIGFtbF9uYW1lKCJQQ0lVIiksIGFtbF9pbnQoMSkgLyogRGV2aWNl IENoZWNrICovKQotICAgICAgICApOwotICAgICAgICBhbWxfYXBwZW5kKG1ldGhvZCwKLSAgICAg ICAgICAgIGFtbF9jYWxsMigiRFZOVCIsIGFtbF9uYW1lKCJQQ0lEIiksIGFtbF9pbnQoMykvKiBF amVjdCBSZXF1ZXN0ICovKQotICAgICAgICApOwotICAgIH0KLQotICAgIC8qIE5vdGlmeSBhYm91 dCBjaGlsZCBidXMgZXZlbnRzIGluIGFueSBjYXNlICovCi0gICAgaWYgKHBjaWhwX2JyaWRnZV9l bikgewotICAgICAgICBRTElTVF9GT1JFQUNIKHNlYywgJmJ1cy0+Y2hpbGQsIHNpYmxpbmcpIHsK LSAgICAgICAgICAgIGludDMyX3QgZGV2Zm4gPSBzZWMtPnBhcmVudF9kZXYtPmRldmZuOwotCi0g ICAgICAgICAgICBpZiAocGNpX2J1c19pc19yb290KHNlYykgfHwgcGNpX2J1c19pc19leHByZXNz KHNlYykpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAg ICAgICAgICAgYW1sX2FwcGVuZChtZXRob2QsIGFtbF9uYW1lKCJeUyUuMDJYLlBDTlQiLCBkZXZm bikpOwotICAgICAgICB9Ci0gICAgfQotICAgIGFtbF9hcHBlbmQocGFyZW50X3Njb3BlLCBtZXRo b2QpOwotICAgIHFvYmplY3RfdW5yZWYoYnNlbCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGJ1aWxkX2hw ZXRfYW1sKEFtbCAqdGFibGUpCiB7CiAgICAgQW1sICpjcnM7CkBAIC0xMjEyLDQxICsxMDU1LDEw IEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3BpaXg0X2lzYV9icmlkZ2UoQW1sICp0YWJsZSkKIHN0YXRp YyB2b2lkIGJ1aWxkX3BpaXg0X3BjaV9ob3RwbHVnKEFtbCAqdGFibGUpCiB7CiAgICAgQW1sICpz Y29wZTsKLSAgICBBbWwgKmZpZWxkOwotICAgIEFtbCAqbWV0aG9kOwotCi0gICAgc2NvcGUgPSAg YW1sX3Njb3BlKCJfU0IuUENJMCIpOwotCi0gICAgYW1sX2FwcGVuZChzY29wZSwKLSAgICAgICAg YW1sX29wZXJhdGlvbl9yZWdpb24oIlBDU1QiLCBBTUxfU1lTVEVNX0lPLCBhbWxfaW50KDB4YWUw MCksIDB4MDgpKTsKLSAgICBmaWVsZCA9IGFtbF9maWVsZCgiUENTVCIsIEFNTF9EV09SRF9BQ0Ms IEFNTF9OT0xPQ0ssIEFNTF9XUklURV9BU19aRVJPUyk7Ci0gICAgYW1sX2FwcGVuZChmaWVsZCwg YW1sX25hbWVkX2ZpZWxkKCJQQ0lVIiwgMzIpKTsKLSAgICBhbWxfYXBwZW5kKGZpZWxkLCBhbWxf bmFtZWRfZmllbGQoIlBDSUQiLCAzMikpOwotICAgIGFtbF9hcHBlbmQoc2NvcGUsIGZpZWxkKTsK IAotICAgIGFtbF9hcHBlbmQoc2NvcGUsCi0gICAgICAgIGFtbF9vcGVyYXRpb25fcmVnaW9uKCJT RUoiLCBBTUxfU1lTVEVNX0lPLCBhbWxfaW50KDB4YWUwOCksIDB4MDQpKTsKLSAgICBmaWVsZCA9 IGFtbF9maWVsZCgiU0VKIiwgQU1MX0RXT1JEX0FDQywgQU1MX05PTE9DSywgQU1MX1dSSVRFX0FT X1pFUk9TKTsKLSAgICBhbWxfYXBwZW5kKGZpZWxkLCBhbWxfbmFtZWRfZmllbGQoIkIwRUoiLCAz MikpOwotICAgIGFtbF9hcHBlbmQoc2NvcGUsIGZpZWxkKTsKLQotICAgIGFtbF9hcHBlbmQoc2Nv cGUsCi0gICAgICAgIGFtbF9vcGVyYXRpb25fcmVnaW9uKCJCTk1SIiwgQU1MX1NZU1RFTV9JTywg YW1sX2ludCgweGFlMTApLCAweDA0KSk7Ci0gICAgZmllbGQgPSBhbWxfZmllbGQoIkJOTVIiLCBB TUxfRFdPUkRfQUNDLCBBTUxfTk9MT0NLLCBBTUxfV1JJVEVfQVNfWkVST1MpOwotICAgIGFtbF9h cHBlbmQoZmllbGQsIGFtbF9uYW1lZF9maWVsZCgiQk5VTSIsIDMyKSk7Ci0gICAgYW1sX2FwcGVu ZChzY29wZSwgZmllbGQpOwotCi0gICAgYW1sX2FwcGVuZChzY29wZSwgYW1sX211dGV4KCJCTENL IiwgMCkpOwotCi0gICAgbWV0aG9kID0gYW1sX21ldGhvZCgiUENFSiIsIDIsIEFNTF9OT1RTRVJJ QUxJWkVEKTsKLSAgICBhbWxfYXBwZW5kKG1ldGhvZCwgYW1sX2FjcXVpcmUoYW1sX25hbWUoIkJM Q0siKSwgMHhGRkZGKSk7Ci0gICAgYW1sX2FwcGVuZChtZXRob2QsIGFtbF9zdG9yZShhbWxfYXJn KDApLCBhbWxfbmFtZSgiQk5VTSIpKSk7Ci0gICAgYW1sX2FwcGVuZChtZXRob2QsCi0gICAgICAg IGFtbF9zdG9yZShhbWxfc2hpZnRsZWZ0KGFtbF9pbnQoMSksIGFtbF9hcmcoMSkpLCBhbWxfbmFt ZSgiQjBFSiIpKSk7Ci0gICAgYW1sX2FwcGVuZChtZXRob2QsIGFtbF9yZWxlYXNlKGFtbF9uYW1l KCJCTENLIikpKTsKLSAgICBhbWxfYXBwZW5kKG1ldGhvZCwgYW1sX3JldHVybihhbWxfaW50KDAp KSk7Ci0gICAgYW1sX2FwcGVuZChzY29wZSwgbWV0aG9kKTsKKyAgICBzY29wZSA9IGFtbF9zY29w ZSgiX1NCLlBDSTAiKTsKIAorICAgIGJ1aWxkX2FjcGlfcGNpaHAoc2NvcGUpOwogICAgIGFtbF9h cHBlbmQodGFibGUsIHNjb3BlKTsKIH0KIAotLSAKMi4xOS4xCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4t ZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9t YWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47328) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJTvJ-0000b2-AD for qemu-devel@nongnu.org; Sun, 04 Nov 2018 20:43:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gJTvD-0003PR-QC for qemu-devel@nongnu.org; Sun, 04 Nov 2018 20:43:22 -0500 From: Samuel Ortiz Date: Mon, 5 Nov 2018 02:40:40 +0100 Message-Id: <20181105014047.26447-18-sameo@linux.intel.com> In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v5 17/24] hw: acpi: Export the PCI hotplug API List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Shannon Zhao , Stefano Stabellini , Anthony Perard , Richard Henderson , Marcel Apfelbaum , xen-devel@lists.xenproject.org, Paolo Bonzini , "Michael S. Tsirkin" , Igor Mammedov , qemu-arm@nongnu.org, Peter Maydell , Eduardo Habkost , Sebastien Boeuf , Jing Liu From: Sebastien Boeuf The ACPI hotplug support for PCI devices APIs are not x86 or even machine type specific. In order for future machine types to be able to re-use that code, we export it through the architecture agnostic hw/acpi folder. Reviewed-by: Philippe Mathieu-Daudé Tested-by: Philippe Mathieu-Daudé Signed-off-by: Sebastien Boeuf Signed-off-by: Jing Liu --- include/hw/acpi/aml-build.h | 3 + hw/acpi/aml-build.c | 194 ++++++++++++++++++++++++++++++++++++ hw/i386/acpi-build.c | 192 +---------------------------------- 3 files changed, 199 insertions(+), 190 deletions(-) diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index 64ea371656..6b0a9735c5 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -418,6 +418,9 @@ Aml *build_osc_method(uint32_t value); void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info); Aml *build_gsi_link_dev(const char *name, uint8_t uid, uint8_t gsi); Aml *build_prt(bool is_pci0_prt); +void build_acpi_pcihp(Aml *scope); +void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, + bool pcihp_bridge_en); void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host); Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host); void crs_range_set_init(CrsRangeSet *range_set); diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 2c5446ab23..6112cc2149 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -34,6 +34,7 @@ #include "hw/acpi/tpm.h" #include "qom/qom-qobject.h" #include "qapi/qmp/qnum.h" +#include "hw/acpi/pcihp.h" #define PCI_HOST_BRIDGE_CONFIG_ADDR 0xcf8 #define PCI_HOST_BRIDGE_IO_0_MIN_ADDR 0x0000 @@ -2305,6 +2306,199 @@ Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host) return scope; } +void build_acpi_pcihp(Aml *scope) +{ + Aml *field; + Aml *method; + + aml_append(scope, + aml_operation_region("PCST", AML_SYSTEM_IO, aml_int(0xae00), 0x08)); + field = aml_field("PCST", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("PCIU", 32)); + aml_append(field, aml_named_field("PCID", 32)); + aml_append(scope, field); + + aml_append(scope, + aml_operation_region("SEJ", AML_SYSTEM_IO, aml_int(0xae08), 0x04)); + field = aml_field("SEJ", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("B0EJ", 32)); + aml_append(scope, field); + + aml_append(scope, + aml_operation_region("BNMR", AML_SYSTEM_IO, aml_int(0xae10), 0x04)); + field = aml_field("BNMR", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); + aml_append(field, aml_named_field("BNUM", 32)); + aml_append(scope, field); + + aml_append(scope, aml_mutex("BLCK", 0)); + + method = aml_method("PCEJ", 2, AML_NOTSERIALIZED); + aml_append(method, aml_acquire(aml_name("BLCK"), 0xFFFF)); + aml_append(method, aml_store(aml_arg(0), aml_name("BNUM"))); + aml_append(method, + aml_store(aml_shiftleft(aml_int(1), aml_arg(1)), aml_name("B0EJ"))); + aml_append(method, aml_release(aml_name("BLCK"))); + aml_append(method, aml_return(aml_int(0))); + aml_append(scope, method); +} + +static void build_append_pcihp_notify_entry(Aml *method, int slot) +{ + Aml *if_ctx; + int32_t devfn = PCI_DEVFN(slot, 0); + + if_ctx = aml_if(aml_and(aml_arg(0), aml_int(0x1U << slot), NULL)); + aml_append(if_ctx, aml_notify(aml_name("S%.02X", devfn), aml_arg(1))); + aml_append(method, if_ctx); +} + +void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, + bool pcihp_bridge_en) +{ + Aml *dev, *notify_method = NULL, *method; + QObject *bsel; + PCIBus *sec; + int i; + + bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL); + if (bsel) { + uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); + + aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val))); + notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED); + } + + for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) { + DeviceClass *dc; + PCIDeviceClass *pc; + PCIDevice *pdev = bus->devices[i]; + int slot = PCI_SLOT(i); + bool hotplug_enabled_dev; + bool bridge_in_acpi; + + if (!pdev) { + if (bsel) { /* add hotplug slots for non present devices */ + dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); + aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); + aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); + method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); + aml_append(method, + aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) + ); + aml_append(dev, method); + aml_append(parent_scope, dev); + + build_append_pcihp_notify_entry(notify_method, slot); + } + continue; + } + + pc = PCI_DEVICE_GET_CLASS(pdev); + dc = DEVICE_GET_CLASS(pdev); + + /* When hotplug for bridges is enabled, bridges are + * described in ACPI separately (see build_pci_bus_end). + * In this case they aren't themselves hot-pluggable. + * Hotplugged bridges *are* hot-pluggable. + */ + bridge_in_acpi = pc->is_bridge && pcihp_bridge_en && + !DEVICE(pdev)->hotplugged; + + hotplug_enabled_dev = bsel && dc->hotpluggable && !bridge_in_acpi; + + if (pc->class_id == PCI_CLASS_BRIDGE_ISA) { + continue; + } + + /* start to compose PCI slot descriptor */ + dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); + aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); + + if (pc->class_id == PCI_CLASS_DISPLAY_VGA) { + /* add VGA specific AML methods */ + int s3d; + + if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) { + s3d = 3; + } else { + s3d = 0; + } + + method = aml_method("_S1D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(0))); + aml_append(dev, method); + + method = aml_method("_S2D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(0))); + aml_append(dev, method); + + method = aml_method("_S3D", 0, AML_NOTSERIALIZED); + aml_append(method, aml_return(aml_int(s3d))); + aml_append(dev, method); + } else if (hotplug_enabled_dev) { + /* add _SUN/_EJ0 to make slot hotpluggable */ + aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); + + method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); + aml_append(method, + aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) + ); + aml_append(dev, method); + + if (bsel) { + build_append_pcihp_notify_entry(notify_method, slot); + } + } else if (bridge_in_acpi) { + /* + * device is coldplugged bridge, + * add child device descriptions into its scope + */ + PCIBus *sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev)); + + build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en); + } + /* slot descriptor has been composed, add it into parent context */ + aml_append(parent_scope, dev); + } + + if (bsel) { + aml_append(parent_scope, notify_method); + } + + /* Append PCNT method to notify about events on local and child buses. + * Add unconditionally for root since DSDT expects it. + */ + method = aml_method("PCNT", 0, AML_NOTSERIALIZED); + + /* If bus supports hotplug select it and notify about local events */ + if (bsel) { + uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); + + aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM"))); + aml_append(method, + aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */) + ); + aml_append(method, + aml_call2("DVNT", aml_name("PCID"), aml_int(3)/* Eject Request */) + ); + } + + /* Notify about child bus events in any case */ + if (pcihp_bridge_en) { + QLIST_FOREACH(sec, &bus->child, sibling) { + int32_t devfn = sec->parent_dev->devfn; + + if (pci_bus_is_root(sec) || pci_bus_is_express(sec)) { + continue; + } + + aml_append(method, aml_name("^S%.02X.PCNT", devfn)); + } + } + aml_append(parent_scope, method); + qobject_unref(bsel); +} + void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host) { Aml *dev, *pci_scope; diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 673c5dfafc..bef5b23168 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -360,163 +360,6 @@ build_madt(GArray *table_data, BIOSLinker *linker, table_data->len - madt_start, 1, NULL, NULL); } -static void build_append_pcihp_notify_entry(Aml *method, int slot) -{ - Aml *if_ctx; - int32_t devfn = PCI_DEVFN(slot, 0); - - if_ctx = aml_if(aml_and(aml_arg(0), aml_int(0x1U << slot), NULL)); - aml_append(if_ctx, aml_notify(aml_name("S%.02X", devfn), aml_arg(1))); - aml_append(method, if_ctx); -} - -static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus, - bool pcihp_bridge_en) -{ - Aml *dev, *notify_method = NULL, *method; - QObject *bsel; - PCIBus *sec; - int i; - - bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL); - if (bsel) { - uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); - - aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val))); - notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED); - } - - for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) { - DeviceClass *dc; - PCIDeviceClass *pc; - PCIDevice *pdev = bus->devices[i]; - int slot = PCI_SLOT(i); - bool hotplug_enabled_dev; - bool bridge_in_acpi; - - if (!pdev) { - if (bsel) { /* add hotplug slots for non present devices */ - dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); - aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); - aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); - method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); - aml_append(method, - aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) - ); - aml_append(dev, method); - aml_append(parent_scope, dev); - - build_append_pcihp_notify_entry(notify_method, slot); - } - continue; - } - - pc = PCI_DEVICE_GET_CLASS(pdev); - dc = DEVICE_GET_CLASS(pdev); - - /* When hotplug for bridges is enabled, bridges are - * described in ACPI separately (see build_pci_bus_end). - * In this case they aren't themselves hot-pluggable. - * Hotplugged bridges *are* hot-pluggable. - */ - bridge_in_acpi = pc->is_bridge && pcihp_bridge_en && - !DEVICE(pdev)->hotplugged; - - hotplug_enabled_dev = bsel && dc->hotpluggable && !bridge_in_acpi; - - if (pc->class_id == PCI_CLASS_BRIDGE_ISA) { - continue; - } - - /* start to compose PCI slot descriptor */ - dev = aml_device("S%.02X", PCI_DEVFN(slot, 0)); - aml_append(dev, aml_name_decl("_ADR", aml_int(slot << 16))); - - if (pc->class_id == PCI_CLASS_DISPLAY_VGA) { - /* add VGA specific AML methods */ - int s3d; - - if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) { - s3d = 3; - } else { - s3d = 0; - } - - method = aml_method("_S1D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(0))); - aml_append(dev, method); - - method = aml_method("_S2D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(0))); - aml_append(dev, method); - - method = aml_method("_S3D", 0, AML_NOTSERIALIZED); - aml_append(method, aml_return(aml_int(s3d))); - aml_append(dev, method); - } else if (hotplug_enabled_dev) { - /* add _SUN/_EJ0 to make slot hotpluggable */ - aml_append(dev, aml_name_decl("_SUN", aml_int(slot))); - - method = aml_method("_EJ0", 1, AML_NOTSERIALIZED); - aml_append(method, - aml_call2("PCEJ", aml_name("BSEL"), aml_name("_SUN")) - ); - aml_append(dev, method); - - if (bsel) { - build_append_pcihp_notify_entry(notify_method, slot); - } - } else if (bridge_in_acpi) { - /* - * device is coldplugged bridge, - * add child device descriptions into its scope - */ - PCIBus *sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev)); - - build_append_pci_bus_devices(dev, sec_bus, pcihp_bridge_en); - } - /* slot descriptor has been composed, add it into parent context */ - aml_append(parent_scope, dev); - } - - if (bsel) { - aml_append(parent_scope, notify_method); - } - - /* Append PCNT method to notify about events on local and child buses. - * Add unconditionally for root since DSDT expects it. - */ - method = aml_method("PCNT", 0, AML_NOTSERIALIZED); - - /* If bus supports hotplug select it and notify about local events */ - if (bsel) { - uint64_t bsel_val = qnum_get_uint(qobject_to(QNum, bsel)); - - aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM"))); - aml_append(method, - aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */) - ); - aml_append(method, - aml_call2("DVNT", aml_name("PCID"), aml_int(3)/* Eject Request */) - ); - } - - /* Notify about child bus events in any case */ - if (pcihp_bridge_en) { - QLIST_FOREACH(sec, &bus->child, sibling) { - int32_t devfn = sec->parent_dev->devfn; - - if (pci_bus_is_root(sec) || pci_bus_is_express(sec)) { - continue; - } - - aml_append(method, aml_name("^S%.02X.PCNT", devfn)); - } - } - aml_append(parent_scope, method); - qobject_unref(bsel); -} - static void build_hpet_aml(Aml *table) { Aml *crs; @@ -1212,41 +1055,10 @@ static void build_piix4_isa_bridge(Aml *table) static void build_piix4_pci_hotplug(Aml *table) { Aml *scope; - Aml *field; - Aml *method; - - scope = aml_scope("_SB.PCI0"); - - aml_append(scope, - aml_operation_region("PCST", AML_SYSTEM_IO, aml_int(0xae00), 0x08)); - field = aml_field("PCST", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("PCIU", 32)); - aml_append(field, aml_named_field("PCID", 32)); - aml_append(scope, field); - aml_append(scope, - aml_operation_region("SEJ", AML_SYSTEM_IO, aml_int(0xae08), 0x04)); - field = aml_field("SEJ", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("B0EJ", 32)); - aml_append(scope, field); - - aml_append(scope, - aml_operation_region("BNMR", AML_SYSTEM_IO, aml_int(0xae10), 0x04)); - field = aml_field("BNMR", AML_DWORD_ACC, AML_NOLOCK, AML_WRITE_AS_ZEROS); - aml_append(field, aml_named_field("BNUM", 32)); - aml_append(scope, field); - - aml_append(scope, aml_mutex("BLCK", 0)); - - method = aml_method("PCEJ", 2, AML_NOTSERIALIZED); - aml_append(method, aml_acquire(aml_name("BLCK"), 0xFFFF)); - aml_append(method, aml_store(aml_arg(0), aml_name("BNUM"))); - aml_append(method, - aml_store(aml_shiftleft(aml_int(1), aml_arg(1)), aml_name("B0EJ"))); - aml_append(method, aml_release(aml_name("BLCK"))); - aml_append(method, aml_return(aml_int(0))); - aml_append(scope, method); + scope = aml_scope("_SB.PCI0"); + build_acpi_pcihp(scope); aml_append(table, scope); } -- 2.19.1