From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:a5d:6844:0:0:0:0:0 with SMTP id o4-v6csp5563255wrw; Wed, 14 Nov 2018 02:56:00 -0800 (PST) X-Google-Smtp-Source: AJdET5cVlXpZjxW1LGiYDplVhrGCX0cAUe7v6rqAVXINd69LMTsvJxKtZPPKwo1A0qnizaeswd4g X-Received: by 2002:a0c:c16b:: with SMTP id i40mr1276296qvh.28.1542192960536; Wed, 14 Nov 2018 02:56:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542192960; cv=none; d=google.com; s=arc-20160816; b=kwgZ5vNTl1hR/kcNZKmcY51HxRJIO2+KYX2fKEgk6RIV7YMlm+u0x38CErJ8aWiDF4 Q+R+n6dQYqY4n1p3oSroOPyXA1fzT8LUHkoyXcaoJXtf0iTNTwQFlvo+ziKKPj8p7rrO VhQDiCzVYcY3dLln6OQDpYhPVr/bcSSl1dNsmw/kjdg12wbnmPaGSkCQ6+CXLZnbxEzm KWwFy4k01eBTH5yqseAHclinBva/LIk/OO+XN3uQAcgch+lhPb7VVJHHYip/QSoCPmrz U9xGeYGXlKUCIUdtLudRI9LSrnxyRbkUQHECrLkPM1oij4X//rvC8pHjFqZhfKIXgaP9 rPQg== 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:to:from:date; bh=S549RWQMJTWf8zueHSUKUCeXPFL6KB3TMo63G5HBafM=; b=WaqVd8uX6B9qGuwqHHY2Tqq5tqyQYCfO1FB5x45scLNow0XtxRawTzdcK2UJgj4pS5 v7jBFNFiJFbp0zw7iiZBqFTMFQb6381XfDPXm3IcDotN5FqCQ/Yj4B34QNfOGhjO2Ky8 ZUaBTaeck+glblMEeTfjcKJpf7sJNEr6TL26mYSvIx1o2zzJPXCY2KrlHvTxi1MXAhr1 AOGupBszliLiSTV5iWd0hSX7cBilXj8skTAwBbaJsbTzsLi8eTLShZ4ag3BJHDXXQDxv pBTyH8cDVMR0s+2et8MI7IQ6WQ4mmkol8PXnUPlSwJTwuujpnworoHjezVDjRP5rZUac nfLQ== 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=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id l82si2150997qki.89.2018.11.14.02.56.00 for (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 14 Nov 2018 02:56:00 -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=redhat.com Received: from localhost ([::1]:59445 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gMspz-0002YJ-Nu for alex.bennee@linaro.org; Wed, 14 Nov 2018 05:55:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gMspr-0002Y2-OR for qemu-arm@nongnu.org; Wed, 14 Nov 2018 05:55:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gMspp-0007ao-Ay for qemu-arm@nongnu.org; Wed, 14 Nov 2018 05:55:51 -0500 Received: from mx1.redhat.com ([209.132.183.28]:15511) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gMspp-0007aW-2I; Wed, 14 Nov 2018 05:55:49 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 28DD8653CD; Wed, 14 Nov 2018 10:55:48 +0000 (UTC) Received: from localhost (unknown [10.43.2.182]) by smtp.corp.redhat.com (Postfix) with ESMTP id A2DB95D985; Wed, 14 Nov 2018 10:55:39 +0000 (UTC) Date: Wed, 14 Nov 2018 11:55:37 +0100 From: Igor Mammedov To: Samuel Ortiz , Marcel Apfelbaum Message-ID: <20181114115537.3357921b@redhat.com> In-Reply-To: <20181105014047.26447-12-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-12-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Wed, 14 Nov 2018 10:55:48 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: Re: [Qemu-arm] [PATCH v5 11/24] hw: acpi: Export and generalize the PCI host AML 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: Yang Zhong , Peter Maydell , Stefano Stabellini , Eduardo Habkost , Rob Bradford , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Shannon Zhao , qemu-arm@nongnu.org, Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Richard Henderson Errors-To: qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org Sender: "Qemu-arm" X-TUID: RCQ+RHL35Wdv On Mon, 5 Nov 2018 02:40:34 +0100 Samuel Ortiz wrote: > From: Yang Zhong > > The AML build routines for the PCI host bridge and the corresponding > DSDT addition are neither x86 nor PC machine type specific. > We can move them to the architecture agnostic hw/acpi folder, and by > carrying all the needed information through a new AcpiPciBus structure, > we can make them PC machine type independent. I'm don't know anything about PCI, but functional changes doesn't look correct to me. See more detailed comments below. Marcel, could you take a look on this patch (in particular main csr changes), pls? > > Signed-off-by: Yang Zhong > Signed-off-by: Rob Bradford > Signed-off-by: Samuel Ortiz > --- > include/hw/acpi/aml-build.h | 8 ++ > hw/acpi/aml-build.c | 157 ++++++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 115 ++------------------------ > 3 files changed, 173 insertions(+), 107 deletions(-) > > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index fde2785b9a..1861e37ebf 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -229,6 +229,12 @@ typedef struct AcpiMcfgInfo { > uint32_t mcfg_size; > } AcpiMcfgInfo; > > +typedef struct AcpiPciBus { > + PCIBus *pci_bus; > + Range *pci_hole; > + Range *pci_hole64; > +} AcpiPciBus; Again, this and all below is not aml-build material. Consider adding/using pci specific acpi file for it. Also even though pci AML in arm/virt is to a large degree a subset of x86 target and it would be much better to unify ARM part with x86, it probably will be to big/complex of a change if we take on it in one go. So not to derail you from the goal too much, we probably should generalize this a little bit less, limiting refactoring to x86 target for now. For example, move generic x86 pci parts to hw/i386/acpi-pci.[hc], and structure it so that building blocks in acpi-pci.c could be reused for x86 reduced profile later. Once it's been done, it might be easier and less complex to unify a bit more generic code in i386/acpi-pci.c with corresponding ARM code. Patch is too big and should be split into smaller logical chunks and you should separate code movement vs functional changes you're a making here. Once you split patch properly, it should be easier to assess changes. > typedef struct CrsRangeEntry { > uint64_t base; > uint64_t limit; > @@ -411,6 +417,8 @@ 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 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); > Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set); > void crs_replace_with_free_ranges(GPtrArray *ranges, > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index b8e32f15f7..869ed70db3 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -29,6 +29,19 @@ > #include "hw/pci/pci_bus.h" > #include "qemu/range.h" > #include "hw/pci/pci_bridge.h" > +#include "hw/i386/pc.h" > +#include "sysemu/tpm.h" > +#include "hw/acpi/tpm.h" > + > +#define PCI_HOST_BRIDGE_CONFIG_ADDR 0xcf8 > +#define PCI_HOST_BRIDGE_IO_0_MIN_ADDR 0x0000 > +#define PCI_HOST_BRIDGE_IO_0_MAX_ADDR 0x0cf7 > +#define PCI_HOST_BRIDGE_IO_1_MIN_ADDR 0x0d00 > +#define PCI_HOST_BRIDGE_IO_1_MAX_ADDR 0xffff > +#define PCI_VGA_MEM_BASE_ADDR 0x000a0000 > +#define PCI_VGA_MEM_MAX_ADDR 0x000bffff > +#define IO_0_LEN 0xcf8 > +#define VGA_MEM_LEN 0x20000 > > static GArray *build_alloc_array(void) > { > @@ -2142,6 +2155,150 @@ Aml *build_prt(bool is_pci0_prt) > return method; > } > > +Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host) name doesn't reflect exactly what function does, it builds device descriptions for expander buses (including their csr) and then it builds csr for for main pci host but not pci device description. I'd suggest to split out expander buses part into separate function that returns an expander bus device description, updates crs_range_set and let the caller to enumerate buses and add descriptions to dsdt. Then after it we could do a generic csr generation function for the main pci host if it's possible at all (main pci host csr seems heavily board depended) Instead of taking table and adding stuff directly in to it it should be cleaner to take as argument empty csr (crs = aml_resource_template();) add stuff to it and let the caller to add/extend csr as/where necessary. > +{ > + CrsRangeEntry *entry; > + Aml *scope, *dev, *crs; > + CrsRangeSet crs_range_set; > + Range *pci_hole = NULL; > + Range *pci_hole64 = NULL; > + PCIBus *bus = NULL; > + int root_bus_limit = 0xFF; > + int i; > + > + bus = pci_host->pci_bus; > + assert(bus); > + pci_hole = pci_host->pci_hole; > + pci_hole64 = pci_host->pci_hole64; > + > + crs_range_set_init(&crs_range_set); > + QLIST_FOREACH(bus, &bus->child, sibling) { > + uint8_t bus_num = pci_bus_num(bus); > + uint8_t numa_node = pci_bus_numa_node(bus); > + > + /* look only for expander root buses */ > + if (!pci_bus_is_root(bus)) { > + continue; > + } > + > + if (bus_num < root_bus_limit) { > + root_bus_limit = bus_num - 1; > + } > + > + scope = aml_scope("\\_SB"); > + dev = aml_device("PC%.02X", bus_num); > + aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); > + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); > + aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); > + if (pci_bus_is_express(bus)) { > + aml_append(dev, aml_name_decl("SUPP", aml_int(0))); > + aml_append(dev, aml_name_decl("CTRL", aml_int(0))); > + aml_append(dev, build_osc_method(0x1F)); > + } > + if (numa_node != NUMA_NODE_UNASSIGNED) { > + aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node))); > + } > + > + aml_append(dev, build_prt(false)); > + crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent), &crs_range_set); > + aml_append(dev, aml_name_decl("_CRS", crs)); > + aml_append(scope, dev); > + aml_append(table, scope); > + } > + scope = aml_scope("\\_SB.PCI0"); > + /* build PCI0._CRS */ > + crs = aml_resource_template(); > + /* set the pcie bus num */ > + aml_append(crs, > + aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, > + 0x0000, 0x0, root_bus_limit, > + 0x0000, root_bus_limit + 1)); vvvv > + aml_append(crs, aml_io(AML_DECODE16, PCI_HOST_BRIDGE_CONFIG_ADDR, > + PCI_HOST_BRIDGE_CONFIG_ADDR, 0x01, 0x08)); > + /* set the io region 0 in pci host bridge */ > + aml_append(crs, > + aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > + AML_POS_DECODE, AML_ENTIRE_RANGE, > + 0x0000, PCI_HOST_BRIDGE_IO_0_MIN_ADDR, > + PCI_HOST_BRIDGE_IO_0_MAX_ADDR, 0x0000, IO_0_LEN)); > + > + /* set the io region 1 in pci host bridge */ > + crs_replace_with_free_ranges(crs_range_set.io_ranges, > + PCI_HOST_BRIDGE_IO_1_MIN_ADDR, > + PCI_HOST_BRIDGE_IO_1_MAX_ADDR); above code doesn't look as just a movement, it's something totally new, so it should be in it's own patch with a justification why it's ok to replace concrete addresses with some kind of window. > + for (i = 0; i < crs_range_set.io_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.io_ranges, i); > + aml_append(crs, > + aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > + AML_POS_DECODE, AML_ENTIRE_RANGE, > + 0x0000, entry->base, entry->limit, > + 0x0000, entry->limit - entry->base + 1)); > + } > + > + /* set the vga mem region(0) in pci host bridge */ > + aml_append(crs, > + aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > + AML_CACHEABLE, AML_READ_WRITE, > + 0, PCI_VGA_MEM_BASE_ADDR, PCI_VGA_MEM_MAX_ADDR, > + 0, VGA_MEM_LEN)); this part doesn't look generic enough. I'd assume new shiny i386/virt won't have VGA and assuming one day we would reuse this code for ARM it probably doesn't make sense to put it in generic code. > + > + /* set the mem region 1 in pci host bridge */ > + crs_replace_with_free_ranges(crs_range_set.mem_ranges, > + range_lob(pci_hole), > + range_upb(pci_hole)); > + for (i = 0; i < crs_range_set.mem_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.mem_ranges, i); > + aml_append(crs, > + aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > + AML_NON_CACHEABLE, AML_READ_WRITE, > + 0, entry->base, entry->limit, > + 0, entry->limit - entry->base + 1)); > + } > + > + /* set the mem region 2 in pci host bridge */ > + if (!range_is_empty(pci_hole64)) { > + crs_replace_with_free_ranges(crs_range_set.mem_64bit_ranges, > + range_lob(pci_hole64), > + range_upb(pci_hole64)); > + for (i = 0; i < crs_range_set.mem_64bit_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.mem_64bit_ranges, i); > + aml_append(crs, > + aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, > + AML_MAX_FIXED, > + AML_CACHEABLE, AML_READ_WRITE, > + 0, entry->base, entry->limit, > + 0, entry->limit - entry->base + 1)); > + } > + } > + > + if (TPM_IS_TIS(tpm_find())) { > + aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, > + TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); ditto, board depended and not generic enough to go here > + } > + > + aml_append(scope, aml_name_decl("_CRS", crs)); > + crs_range_set_free(&crs_range_set); > + return scope; > +} > + > +void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host) not used in this patch, drop it for now. > +{ > + Aml *dev, *pci_scope; > + > + dev = aml_device("\\_SB.PCI0"); > + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A08"))); > + aml_append(dev, aml_name_decl("_CID", aml_eisaid("PNP0A03"))); > + aml_append(dev, aml_name_decl("_ADR", aml_int(0))); > + aml_append(dev, aml_name_decl("_UID", aml_int(1))); > + aml_append(dev, aml_name_decl("SUPP", aml_int(0))); > + aml_append(dev, aml_name_decl("CTRL", aml_int(0))); > + aml_append(dev, build_osc_method(0x1F)); Does above description applicable to all boards (pc/q35/future i386/virt)? current code builds PCI differently depending on board. > + aml_append(dsdt, dev); it would be better to return PCI dev and let caller to add it to dsdt. > + > + pci_scope = build_pci_host_bridge(dsdt, pci_host); > + aml_append(dsdt, pci_scope); > +} > + > /* Build rsdt table */ > void > build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index a5f5f83500..14e2624d14 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1253,16 +1253,11 @@ static void build_piix4_pci_hotplug(Aml *table) > static void > build_dsdt(GArray *table_data, BIOSLinker *linker, > AcpiPmInfo *pm, AcpiMiscInfo *misc, > - Range *pci_hole, Range *pci_hole64, > + AcpiPciBus *pci_host, > MachineState *machine, AcpiConfiguration *acpi_conf) > { > - CrsRangeEntry *entry; > Aml *dsdt, *sb_scope, *scope, *dev, *method, *field, *pkg, *crs; > - CrsRangeSet crs_range_set; > uint32_t nr_mem = machine->ram_slots; > - int root_bus_limit = 0xFF; > - PCIBus *bus = NULL; > - int i; > > dsdt = init_aml_allocator(); > > @@ -1337,104 +1332,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > } > aml_append(dsdt, scope); > > - crs_range_set_init(&crs_range_set); > - bus = PC_MACHINE(machine)->bus; > - if (bus) { > - QLIST_FOREACH(bus, &bus->child, sibling) { > - uint8_t bus_num = pci_bus_num(bus); > - uint8_t numa_node = pci_bus_numa_node(bus); > - > - /* look only for expander root buses */ > - if (!pci_bus_is_root(bus)) { > - continue; > - } > - > - if (bus_num < root_bus_limit) { > - root_bus_limit = bus_num - 1; > - } > - > - scope = aml_scope("\\_SB"); > - dev = aml_device("PC%.02X", bus_num); > - aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); > - aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); > - aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); > - if (pci_bus_is_express(bus)) { > - aml_append(dev, build_osc_method(ACPI_OSC_CTRL_PCI_ALL)); > - } > - > - if (numa_node != NUMA_NODE_UNASSIGNED) { > - aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node))); > - } > - > - aml_append(dev, build_prt(false)); > - crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent), &crs_range_set); > - aml_append(dev, aml_name_decl("_CRS", crs)); > - aml_append(scope, dev); > - aml_append(dsdt, scope); > - } > - } > - > - scope = aml_scope("\\_SB.PCI0"); > - /* build PCI0._CRS */ > - crs = aml_resource_template(); > - aml_append(crs, > - aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, > - 0x0000, 0x0, root_bus_limit, > - 0x0000, root_bus_limit + 1)); > - aml_append(crs, aml_io(AML_DECODE16, 0x0CF8, 0x0CF8, 0x01, 0x08)); > - > - aml_append(crs, > - aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > - AML_POS_DECODE, AML_ENTIRE_RANGE, > - 0x0000, 0x0000, 0x0CF7, 0x0000, 0x0CF8)); > - > - crs_replace_with_free_ranges(crs_range_set.io_ranges, 0x0D00, 0xFFFF); > - for (i = 0; i < crs_range_set.io_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.io_ranges, i); > - aml_append(crs, > - aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > - AML_POS_DECODE, AML_ENTIRE_RANGE, > - 0x0000, entry->base, entry->limit, > - 0x0000, entry->limit - entry->base + 1)); > - } > - > - aml_append(crs, > - aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > - AML_CACHEABLE, AML_READ_WRITE, > - 0, 0x000A0000, 0x000BFFFF, 0, 0x00020000)); > - > - crs_replace_with_free_ranges(crs_range_set.mem_ranges, > - range_lob(pci_hole), > - range_upb(pci_hole)); > - for (i = 0; i < crs_range_set.mem_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.mem_ranges, i); > - aml_append(crs, > - aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > - AML_NON_CACHEABLE, AML_READ_WRITE, > - 0, entry->base, entry->limit, > - 0, entry->limit - entry->base + 1)); > - } > - > - if (!range_is_empty(pci_hole64)) { > - crs_replace_with_free_ranges(crs_range_set.mem_64bit_ranges, > - range_lob(pci_hole64), > - range_upb(pci_hole64)); > - for (i = 0; i < crs_range_set.mem_64bit_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.mem_64bit_ranges, i); > - aml_append(crs, > - aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, > - AML_MAX_FIXED, > - AML_CACHEABLE, AML_READ_WRITE, > - 0, entry->base, entry->limit, > - 0, entry->limit - entry->base + 1)); > - } > - } > - > - if (TPM_IS_TIS(tpm_find())) { > - aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, > - TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); > - } > - aml_append(scope, aml_name_decl("_CRS", crs)); > + scope = build_pci_host_bridge(dsdt, pci_host); > > /* reserve GPE0 block resources */ > dev = aml_device("GPE0"); > @@ -1454,8 +1352,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > aml_append(dev, aml_name_decl("_CRS", crs)); > aml_append(scope, dev); > > - crs_range_set_free(&crs_range_set); > - > /* reserve PCIHP resources */ > if (pm->pcihp_io_len) { > dev = aml_device("PHPR"); > @@ -2012,6 +1908,11 @@ void acpi_build(AcpiBuildTables *tables, > 64 /* Ensure FACS is aligned */, > false /* high memory */); > > + AcpiPciBus pci_host = { > + .pci_bus = PC_MACHINE(machine)->bus, > + .pci_hole = &pci_hole, > + .pci_hole64 = &pci_hole64, > + }; > /* > * FACS is pointed to by FADT. > * We place it first since it's the only table that has alignment > @@ -2023,7 +1924,7 @@ void acpi_build(AcpiBuildTables *tables, > /* DSDT is pointed to by FADT */ > dsdt = tables_blob->len; > build_dsdt(tables_blob, tables->linker, &pm, &misc, > - &pci_hole, &pci_hole64, machine, acpi_conf); > + &pci_host, machine, acpi_conf); > > /* Count the size of the DSDT and SSDT, we will need it for legacy > * sizing of ACPI tables. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Igor Mammedov Subject: Re: [PATCH v5 11/24] hw: acpi: Export and generalize the PCI host AML API Date: Wed, 14 Nov 2018 11:55:37 +0100 Message-ID: <20181114115537.3357921b@redhat.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-12-sameo@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gMspq-000058-IH for xen-devel@lists.xenproject.org; Wed, 14 Nov 2018 10:55:50 +0000 In-Reply-To: <20181105014047.26447-12-sameo@linux.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Samuel Ortiz , Marcel Apfelbaum Cc: Yang Zhong , Peter Maydell , Stefano Stabellini , Eduardo Habkost , Rob Bradford , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Shannon Zhao , qemu-arm@nongnu.org, Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Richard Henderson List-Id: xen-devel@lists.xenproject.org T24gTW9uLCAgNSBOb3YgMjAxOCAwMjo0MDozNCArMDEwMApTYW11ZWwgT3J0aXogPHNhbWVvQGxp bnV4LmludGVsLmNvbT4gd3JvdGU6Cgo+IEZyb206IFlhbmcgWmhvbmcgPHlhbmcuemhvbmdAaW50 ZWwuY29tPgo+IAo+IFRoZSBBTUwgYnVpbGQgcm91dGluZXMgZm9yIHRoZSBQQ0kgaG9zdCBicmlk Z2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nCj4gRFNEVCBhZGRpdGlvbiBhcmUgbmVpdGhlciB4ODYg bm9yIFBDIG1hY2hpbmUgdHlwZSBzcGVjaWZpYy4KPiBXZSBjYW4gbW92ZSB0aGVtIHRvIHRoZSBh cmNoaXRlY3R1cmUgYWdub3N0aWMgaHcvYWNwaSBmb2xkZXIsIGFuZCBieQo+IGNhcnJ5aW5nIGFs bCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIHRocm91Z2ggYSBuZXcgQWNwaVBjaUJ1cyBzdHJ1Y3R1 cmUsCj4gd2UgY2FuIG1ha2UgdGhlbSBQQyBtYWNoaW5lIHR5cGUgaW5kZXBlbmRlbnQuCgpJJ20g ZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCBQQ0ksIGJ1dCBmdW5jdGlvbmFsIGNoYW5nZXMgZG9l c24ndCBsb29rCmNvcnJlY3QgdG8gbWUuIFNlZSBtb3JlIGRldGFpbGVkIGNvbW1lbnRzIGJlbG93 LgoKTWFyY2VsLApjb3VsZCB5b3UgdGFrZSBhIGxvb2sgb24gdGhpcyBwYXRjaCAoaW4gcGFydGlj dWxhciBtYWluIGNzciBjaGFuZ2VzKSwgcGxzPwoKPiAKPiBTaWduZWQtb2ZmLWJ5OiBZYW5nIFpo b25nIDx5YW5nLnpob25nQGludGVsLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBSb2IgQnJhZGZvcmQg PHJvYmVydC5icmFkZm9yZEBpbnRlbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogU2FtdWVsIE9ydGl6 IDxzYW1lb0BsaW51eC5pbnRlbC5jb20+Cj4gLS0tCj4gIGluY2x1ZGUvaHcvYWNwaS9hbWwtYnVp bGQuaCB8ICAgOCArKwo+ICBody9hY3BpL2FtbC1idWlsZC5jICAgICAgICAgfCAxNTcgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIGh3L2kzODYvYWNwaS1idWlsZC5jICAg ICAgICB8IDExNSArKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAzIGZpbGVzIGNoYW5nZWQs IDE3MyBpbnNlcnRpb25zKCspLCAxMDcgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvaHcvYWNwaS9hbWwtYnVpbGQuaCBiL2luY2x1ZGUvaHcvYWNwaS9hbWwtYnVpbGQuaAo+ IGluZGV4IGZkZTI3ODViOWEuLjE4NjFlMzdlYmYgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9ody9h Y3BpL2FtbC1idWlsZC5oCj4gKysrIGIvaW5jbHVkZS9ody9hY3BpL2FtbC1idWlsZC5oCj4gQEAg LTIyOSw2ICsyMjksMTIgQEAgdHlwZWRlZiBzdHJ1Y3QgQWNwaU1jZmdJbmZvIHsKPiAgICAgIHVp bnQzMl90IG1jZmdfc2l6ZTsKPiAgfSBBY3BpTWNmZ0luZm87Cj4gIAo+ICt0eXBlZGVmIHN0cnVj dCBBY3BpUGNpQnVzIHsKPiArICAgIFBDSUJ1cyAqcGNpX2J1czsKPiArICAgIFJhbmdlICpwY2lf aG9sZTsKPiArICAgIFJhbmdlICpwY2lfaG9sZTY0Owo+ICt9IEFjcGlQY2lCdXM7CkFnYWluLCB0 aGlzIGFuZCBhbGwgYmVsb3cgaXMgbm90IGFtbC1idWlsZCBtYXRlcmlhbC4KQ29uc2lkZXIgYWRk aW5nL3VzaW5nIHBjaSBzcGVjaWZpYyBhY3BpIGZpbGUgZm9yIGl0LgoKQWxzbyBldmVuIHRob3Vn aCBwY2kgQU1MIGluIGFybS92aXJ0IGlzIHRvIGEgbGFyZ2UgZGVncmVlIGEgc3Vic2V0Cm9mIHg4 NiB0YXJnZXQgYW5kIGl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIHVuaWZ5IEFSTSBwYXJ0IHdp dGggeDg2LAppdCBwcm9iYWJseSB3aWxsIGJlIHRvIGJpZy9jb21wbGV4IG9mIGEgY2hhbmdlIGlm IHdlIHRha2Ugb24gaXQgaW4Kb25lIGdvLgoKU28gbm90IHRvIGRlcmFpbCB5b3UgZnJvbSB0aGUg Z29hbCB0b28gbXVjaCwgd2UgcHJvYmFibHkgc2hvdWxkCmdlbmVyYWxpemUgdGhpcyBhIGxpdHRs ZSBiaXQgbGVzcywgbGltaXRpbmcgcmVmYWN0b3JpbmcgdG8geDg2CnRhcmdldCBmb3Igbm93LgoK Rm9yIGV4YW1wbGUsIG1vdmUgZ2VuZXJpYyB4ODYgcGNpIHBhcnRzIHRvIGh3L2kzODYvYWNwaS1w Y2kuW2hjXSwKYW5kIHN0cnVjdHVyZSBpdCBzbyB0aGF0IGJ1aWxkaW5nIGJsb2NrcyBpbiBhY3Bp LXBjaS5jIGNvdWxkIGJlCnJldXNlZCBmb3IgeDg2IHJlZHVjZWQgcHJvZmlsZSBsYXRlci4KT25j ZSBpdCdzIGJlZW4gZG9uZSwgaXQgbWlnaHQgYmUgZWFzaWVyIGFuZCBsZXNzIGNvbXBsZXggdG8K dW5pZnkgYSBiaXQgbW9yZSBnZW5lcmljIGNvZGUgaW4gaTM4Ni9hY3BpLXBjaS5jIHdpdGggY29y cmVzcG9uZGluZwpBUk0gY29kZS4KClBhdGNoIGlzIHRvbyBiaWcgYW5kIHNob3VsZCBiZSBzcGxp dCBpbnRvIHNtYWxsZXIgbG9naWNhbCBjaHVua3MKYW5kIHlvdSBzaG91bGQgc2VwYXJhdGUgY29k ZSBtb3ZlbWVudCB2cyBmdW5jdGlvbmFsIGNoYW5nZXMgeW91J3JlCmEgbWFraW5nIGhlcmUuCgpP bmNlIHlvdSBzcGxpdCBwYXRjaCBwcm9wZXJseSwgaXQgc2hvdWxkIGJlIGVhc2llciB0byBhc3Nl c3MKY2hhbmdlcy4KCj4gIHR5cGVkZWYgc3RydWN0IENyc1JhbmdlRW50cnkgewo+ICAgICAgdWlu dDY0X3QgYmFzZTsKPiAgICAgIHVpbnQ2NF90IGxpbWl0Owo+IEBAIC00MTEsNiArNDE3LDggQEAg QW1sICpidWlsZF9vc2NfbWV0aG9kKHVpbnQzMl90IHZhbHVlKTsKPiAgdm9pZCBidWlsZF9tY2Zn KEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLCBBY3BpTWNmZ0luZm8gKmlu Zm8pOwo+ICBBbWwgKmJ1aWxkX2dzaV9saW5rX2Rldihjb25zdCBjaGFyICpuYW1lLCB1aW50OF90 IHVpZCwgdWludDhfdCBnc2kpOwo+ICBBbWwgKmJ1aWxkX3BydChib29sIGlzX3BjaTBfcHJ0KTsK PiArdm9pZCBhY3BpX2RzZHRfYWRkX3BjaV9idXMoQW1sICpkc2R0LCBBY3BpUGNpQnVzICpwY2lf aG9zdCk7Cj4gK0FtbCAqYnVpbGRfcGNpX2hvc3RfYnJpZGdlKEFtbCAqdGFibGUsIEFjcGlQY2lC dXMgKnBjaV9ob3N0KTsKPiAgdm9pZCBjcnNfcmFuZ2Vfc2V0X2luaXQoQ3JzUmFuZ2VTZXQgKnJh bmdlX3NldCk7Cj4gIEFtbCAqYnVpbGRfY3JzKFBDSUhvc3RTdGF0ZSAqaG9zdCwgQ3JzUmFuZ2VT ZXQgKnJhbmdlX3NldCk7Cj4gIHZvaWQgY3JzX3JlcGxhY2Vfd2l0aF9mcmVlX3JhbmdlcyhHUHRy QXJyYXkgKnJhbmdlcywKPiBkaWZmIC0tZ2l0IGEvaHcvYWNwaS9hbWwtYnVpbGQuYyBiL2h3L2Fj cGkvYW1sLWJ1aWxkLmMKPiBpbmRleCBiOGUzMmYxNWY3Li44NjllZDcwZGIzIDEwMDY0NAo+IC0t LSBhL2h3L2FjcGkvYW1sLWJ1aWxkLmMKPiArKysgYi9ody9hY3BpL2FtbC1idWlsZC5jCj4gQEAg LTI5LDYgKzI5LDE5IEBACj4gICNpbmNsdWRlICJody9wY2kvcGNpX2J1cy5oIgo+ICAjaW5jbHVk ZSAicWVtdS9yYW5nZS5oIgo+ICAjaW5jbHVkZSAiaHcvcGNpL3BjaV9icmlkZ2UuaCIKPiArI2lu Y2x1ZGUgImh3L2kzODYvcGMuaCIKPiArI2luY2x1ZGUgInN5c2VtdS90cG0uaCIKPiArI2luY2x1 ZGUgImh3L2FjcGkvdHBtLmgiCj4gKwo+ICsjZGVmaW5lIFBDSV9IT1NUX0JSSURHRV9DT05GSUdf QUREUiAgICAgICAgMHhjZjgKPiArI2RlZmluZSBQQ0lfSE9TVF9CUklER0VfSU9fMF9NSU5fQURE UiAgICAgIDB4MDAwMAo+ICsjZGVmaW5lIFBDSV9IT1NUX0JSSURHRV9JT18wX01BWF9BRERSICAg ICAgMHgwY2Y3Cj4gKyNkZWZpbmUgUENJX0hPU1RfQlJJREdFX0lPXzFfTUlOX0FERFIgICAgICAw eDBkMDAKPiArI2RlZmluZSBQQ0lfSE9TVF9CUklER0VfSU9fMV9NQVhfQUREUiAgICAgIDB4ZmZm Zgo+ICsjZGVmaW5lIFBDSV9WR0FfTUVNX0JBU0VfQUREUiAgICAgICAgICAgICAgMHgwMDBhMDAw MAo+ICsjZGVmaW5lIFBDSV9WR0FfTUVNX01BWF9BRERSICAgICAgICAgICAgICAgMHgwMDBiZmZm Zgo+ICsjZGVmaW5lIElPXzBfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjZjgKPiAr I2RlZmluZSBWR0FfTUVNX0xFTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAKPiAgCj4g IHN0YXRpYyBHQXJyYXkgKmJ1aWxkX2FsbG9jX2FycmF5KHZvaWQpCj4gIHsKPiBAQCAtMjE0Miw2 ICsyMTU1LDE1MCBAQCBBbWwgKmJ1aWxkX3BydChib29sIGlzX3BjaTBfcHJ0KQo+ICAgICAgcmV0 dXJuIG1ldGhvZDsKPiAgfQo+ICAKPiArQW1sICpidWlsZF9wY2lfaG9zdF9icmlkZ2UoQW1sICp0 YWJsZSwgQWNwaVBjaUJ1cyAqcGNpX2hvc3QpCm5hbWUgZG9lc24ndCByZWZsZWN0IGV4YWN0bHkg d2hhdCBmdW5jdGlvbiBkb2VzLAppdCBidWlsZHMgZGV2aWNlIGRlc2NyaXB0aW9ucyBmb3IgZXhw YW5kZXIgYnVzZXMgKGluY2x1ZGluZyB0aGVpciBjc3IpCmFuZCB0aGVuIGl0IGJ1aWxkcyBjc3Ig Zm9yIGZvciBtYWluIHBjaSBob3N0IGJ1dCBub3QgcGNpIGRldmljZSBkZXNjcmlwdGlvbi4KCkkn ZCBzdWdnZXN0IHRvIHNwbGl0IG91dCBleHBhbmRlciBidXNlcyBwYXJ0IGludG8gc2VwYXJhdGUg ZnVuY3Rpb24KdGhhdCByZXR1cm5zIGFuIGV4cGFuZGVyIGJ1cyBkZXZpY2UgZGVzY3JpcHRpb24s IHVwZGF0ZXMgY3JzX3JhbmdlX3NldAphbmQgbGV0IHRoZSBjYWxsZXIgdG8gZW51bWVyYXRlIGJ1 c2VzIGFuZCBhZGQgZGVzY3JpcHRpb25zIHRvIGRzZHQuCgpUaGVuIGFmdGVyIGl0IHdlIGNvdWxk IGRvIGEgZ2VuZXJpYyBjc3IgZ2VuZXJhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1haW4gcGNpIGhv c3QKaWYgaXQncyBwb3NzaWJsZSBhdCBhbGwgKG1haW4gcGNpIGhvc3QgY3NyIHNlZW1zIGhlYXZp bHkgYm9hcmQgZGVwZW5kZWQpCgpJbnN0ZWFkIG9mIHRha2luZyB0YWJsZSBhbmQgYWRkaW5nIHN0 dWZmIGRpcmVjdGx5IGluIHRvIGl0Cml0IHNob3VsZCBiZSBjbGVhbmVyIHRvIHRha2UgYXMgYXJn dW1lbnQgZW1wdHkgY3NyIChjcnMgPSBhbWxfcmVzb3VyY2VfdGVtcGxhdGUoKTspCmFkZCBzdHVm ZiB0byBpdCBhbmQgbGV0IHRoZSBjYWxsZXIgdG8gYWRkL2V4dGVuZCBjc3IgYXMvd2hlcmUgbmVj ZXNzYXJ5LgoKPiArewo+ICsgICAgQ3JzUmFuZ2VFbnRyeSAqZW50cnk7Cj4gKyAgICBBbWwgKnNj b3BlLCAqZGV2LCAqY3JzOwo+ICsgICAgQ3JzUmFuZ2VTZXQgY3JzX3JhbmdlX3NldDsKPiArICAg IFJhbmdlICpwY2lfaG9sZSA9IE5VTEw7Cj4gKyAgICBSYW5nZSAqcGNpX2hvbGU2NCA9IE5VTEw7 Cj4gKyAgICBQQ0lCdXMgKmJ1cyA9IE5VTEw7Cj4gKyAgICBpbnQgcm9vdF9idXNfbGltaXQgPSAw eEZGOwo+ICsgICAgaW50IGk7Cj4gKwo+ICsgICAgYnVzID0gcGNpX2hvc3QtPnBjaV9idXM7Cj4g KyAgICBhc3NlcnQoYnVzKTsKPiArICAgIHBjaV9ob2xlID0gcGNpX2hvc3QtPnBjaV9ob2xlOwo+ ICsgICAgcGNpX2hvbGU2NCA9IHBjaV9ob3N0LT5wY2lfaG9sZTY0Owo+ICsKPiArICAgIGNyc19y YW5nZV9zZXRfaW5pdCgmY3JzX3JhbmdlX3NldCk7Cj4gKyAgICBRTElTVF9GT1JFQUNIKGJ1cywg JmJ1cy0+Y2hpbGQsIHNpYmxpbmcpIHsKPiArICAgICAgICB1aW50OF90IGJ1c19udW0gPSBwY2lf YnVzX251bShidXMpOwo+ICsgICAgICAgIHVpbnQ4X3QgbnVtYV9ub2RlID0gcGNpX2J1c19udW1h X25vZGUoYnVzKTsKPiArCj4gKyAgICAgICAgLyogbG9vayBvbmx5IGZvciBleHBhbmRlciByb290 IGJ1c2VzICovCj4gKyAgICAgICAgaWYgKCFwY2lfYnVzX2lzX3Jvb3QoYnVzKSkgewo+ICsgICAg ICAgICAgICBjb250aW51ZTsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIGlmIChidXNfbnVt IDwgcm9vdF9idXNfbGltaXQpIHsKPiArICAgICAgICAgICAgcm9vdF9idXNfbGltaXQgPSBidXNf bnVtIC0gMTsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIHNjb3BlID0gYW1sX3Njb3BlKCJc XF9TQiIpOwo+ICsgICAgICAgIGRldiA9IGFtbF9kZXZpY2UoIlBDJS4wMlgiLCBidXNfbnVtKTsK PiArICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX1VJRCIsIGFtbF9pbnQo YnVzX251bSkpKTsKPiArICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0hJ RCIsIGFtbF9laXNhaWQoIlBOUDBBMDMiKSkpOwo+ICsgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBh bWxfbmFtZV9kZWNsKCJfQkJOIiwgYW1sX2ludChidXNfbnVtKSkpOwo+ICsgICAgICAgIGlmIChw Y2lfYnVzX2lzX2V4cHJlc3MoYnVzKSkgewo+ICsgICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwg YW1sX25hbWVfZGVjbCgiU1VQUCIsIGFtbF9pbnQoMCkpKTsKPiArICAgICAgICAgICAgYW1sX2Fw cGVuZChkZXYsIGFtbF9uYW1lX2RlY2woIkNUUkwiLCBhbWxfaW50KDApKSk7Cj4gKyAgICAgICAg ICAgIGFtbF9hcHBlbmQoZGV2LCBidWlsZF9vc2NfbWV0aG9kKDB4MUYpKTsKPiArICAgICAgICB9 Cj4gKyAgICAgICAgaWYgKG51bWFfbm9kZSAhPSBOVU1BX05PREVfVU5BU1NJR05FRCkgewo+ICsg ICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX1BYTSIsIGFtbF9pbnQo bnVtYV9ub2RlKSkpOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgICAgYW1sX2FwcGVuZChkZXYs IGJ1aWxkX3BydChmYWxzZSkpOwo+ICsgICAgICAgIGNycyA9IGJ1aWxkX2NycyhQQ0lfSE9TVF9C UklER0UoQlVTKGJ1cyktPnBhcmVudCksICZjcnNfcmFuZ2Vfc2V0KTsKPiArICAgICAgICBhbWxf YXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0NSUyIsIGNycykpOwo+ICsgICAgICAgIGFtbF9h cHBlbmQoc2NvcGUsIGRldik7Cj4gKyAgICAgICAgYW1sX2FwcGVuZCh0YWJsZSwgc2NvcGUpOwo+ ICsgICAgfQo+ICsgICAgc2NvcGUgPSBhbWxfc2NvcGUoIlxcX1NCLlBDSTAiKTsKPiArICAgIC8q IGJ1aWxkIFBDSTAuX0NSUyAqLwo+ICsgICAgY3JzID0gYW1sX3Jlc291cmNlX3RlbXBsYXRlKCk7 Cj4gKyAgICAvKiBzZXQgdGhlIHBjaWUgYnVzIG51bSAqLwo+ICsgICAgYW1sX2FwcGVuZChjcnMs Cj4gKyAgICAgICAgYW1sX3dvcmRfYnVzX251bWJlcihBTUxfTUlOX0ZJWEVELCBBTUxfTUFYX0ZJ WEVELCBBTUxfUE9TX0RFQ09ERSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAw MCwgMHgwLCByb290X2J1c19saW1pdCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4 MDAwMCwgcm9vdF9idXNfbGltaXQgKyAxKSk7Cgp2dnZ2Cj4gKyAgICBhbWxfYXBwZW5kKGNycywg YW1sX2lvKEFNTF9ERUNPREUxNiwgUENJX0hPU1RfQlJJREdFX0NPTkZJR19BRERSLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICBQQ0lfSE9TVF9CUklER0VfQ09ORklHX0FERFIsIDB4MDEs IDB4MDgpKTsKPiArICAgIC8qIHNldCB0aGUgaW8gcmVnaW9uIDAgaW4gcGNpIGhvc3QgYnJpZGdl ICovCj4gKyAgICBhbWxfYXBwZW5kKGNycywKPiArICAgICAgICBhbWxfd29yZF9pbyhBTUxfTUlO X0ZJWEVELCBBTUxfTUFYX0ZJWEVELAo+ICsgICAgICAgICAgICAgICAgICAgIEFNTF9QT1NfREVD T0RFLCBBTUxfRU5USVJFX1JBTkdFLAo+ICsgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgUENJ X0hPU1RfQlJJREdFX0lPXzBfTUlOX0FERFIsCj4gKyAgICAgICAgICAgICAgICAgICAgUENJX0hP U1RfQlJJREdFX0lPXzBfTUFYX0FERFIsIDB4MDAwMCwgSU9fMF9MRU4pKTsKPiArCj4gKyAgICAv KiBzZXQgdGhlIGlvIHJlZ2lvbiAxIGluIHBjaSBob3N0IGJyaWRnZSAqLwo+ICsgICAgY3JzX3Jl cGxhY2Vfd2l0aF9mcmVlX3JhbmdlcyhjcnNfcmFuZ2Vfc2V0LmlvX3JhbmdlcywKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0hPU1RfQlJJREdFX0lPXzFfTUlOX0FERFIs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9IT1NUX0JSSURHRV9JT18x X01BWF9BRERSKTsKYWJvdmUgY29kZSBkb2Vzbid0IGxvb2sgYXMganVzdCBhIG1vdmVtZW50LCBp dCdzIHNvbWV0aGluZyB0b3RhbGx5IG5ldywKc28gaXQgc2hvdWxkIGJlIGluIGl0J3Mgb3duIHBh dGNoIHdpdGggYSBqdXN0aWZpY2F0aW9uIHdoeSBpdCdzIG9rCnRvIHJlcGxhY2UgY29uY3JldGUg YWRkcmVzc2VzIHdpdGggc29tZSBraW5kIG9mIHdpbmRvdy4KCgo+ICsgICAgZm9yIChpID0gMDsg aSA8IGNyc19yYW5nZV9zZXQuaW9fcmFuZ2VzLT5sZW47IGkrKykgewo+ICsgICAgICAgIGVudHJ5 ID0gZ19wdHJfYXJyYXlfaW5kZXgoY3JzX3JhbmdlX3NldC5pb19yYW5nZXMsIGkpOwo+ICsgICAg ICAgIGFtbF9hcHBlbmQoY3JzLAo+ICsgICAgICAgICAgICBhbWxfd29yZF9pbyhBTUxfTUlOX0ZJ WEVELCBBTUxfTUFYX0ZJWEVELAo+ICsgICAgICAgICAgICAgICAgICAgICAgICBBTUxfUE9TX0RF Q09ERSwgQU1MX0VOVElSRV9SQU5HRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAw LCBlbnRyeS0+YmFzZSwgZW50cnktPmxpbWl0LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAw eDAwMDAsIGVudHJ5LT5saW1pdCAtIGVudHJ5LT5iYXNlICsgMSkpOwo+ICsgICAgfQo+ICsKCj4g KyAgICAvKiBzZXQgdGhlIHZnYSBtZW0gcmVnaW9uKDApIGluIHBjaSBob3N0IGJyaWRnZSAqLwo+ ICsgICAgYW1sX2FwcGVuZChjcnMsCj4gKyAgICAgICAgYW1sX2R3b3JkX21lbW9yeShBTUxfUE9T X0RFQ09ERSwgQU1MX01JTl9GSVhFRCwgQU1MX01BWF9GSVhFRCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgIEFNTF9DQUNIRUFCTEUsIEFNTF9SRUFEX1dSSVRFLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgMCwgUENJX1ZHQV9NRU1fQkFTRV9BRERSLCBQQ0lfVkdBX01FTV9NQVhfQURE UiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFZHQV9NRU1fTEVOKSk7CnRoaXMgcGFy dCBkb2Vzbid0IGxvb2sgZ2VuZXJpYyBlbm91Z2guCkknZCBhc3N1bWUgbmV3IHNoaW55IGkzODYv dmlydCB3b24ndCBoYXZlIFZHQSBhbmQKYXNzdW1pbmcgb25lIGRheSB3ZSB3b3VsZCByZXVzZSB0 aGlzIGNvZGUgZm9yIEFSTSBpdCBwcm9iYWJseSBkb2Vzbid0Cm1ha2Ugc2Vuc2UgdG8gcHV0IGl0 IGluIGdlbmVyaWMgY29kZS4KCj4gKwo+ICsgICAgLyogc2V0IHRoZSBtZW0gcmVnaW9uIDEgaW4g cGNpIGhvc3QgYnJpZGdlICovCj4gKyAgICBjcnNfcmVwbGFjZV93aXRoX2ZyZWVfcmFuZ2VzKGNy c19yYW5nZV9zZXQubWVtX3JhbmdlcywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmFuZ2VfbG9iKHBjaV9ob2xlKSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmFuZ2VfdXBiKHBjaV9ob2xlKSk7Cj4gKyAgICBmb3IgKGkgPSAwOyBpIDwgY3JzX3Jhbmdl X3NldC5tZW1fcmFuZ2VzLT5sZW47IGkrKykgewo+ICsgICAgICAgIGVudHJ5ID0gZ19wdHJfYXJy YXlfaW5kZXgoY3JzX3JhbmdlX3NldC5tZW1fcmFuZ2VzLCBpKTsKPiArICAgICAgICBhbWxfYXBw ZW5kKGNycywKPiArICAgICAgICAgICAgYW1sX2R3b3JkX21lbW9yeShBTUxfUE9TX0RFQ09ERSwg QU1MX01JTl9GSVhFRCwgQU1MX01BWF9GSVhFRCwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBBTUxfTk9OX0NBQ0hFQUJMRSwgQU1MX1JFQURfV1JJVEUsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMCwgZW50cnktPmJhc2UsIGVudHJ5LT5saW1pdCwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAwLCBlbnRyeS0+bGltaXQgLSBlbnRyeS0+YmFzZSArIDEpKTsK PiArICAgIH0KPiArCj4gKyAgICAvKiBzZXQgdGhlIG1lbSByZWdpb24gMiBpbiBwY2kgaG9zdCBi cmlkZ2UgKi8KPiArICAgIGlmICghcmFuZ2VfaXNfZW1wdHkocGNpX2hvbGU2NCkpIHsKPiArICAg ICAgICBjcnNfcmVwbGFjZV93aXRoX2ZyZWVfcmFuZ2VzKGNyc19yYW5nZV9zZXQubWVtXzY0Yml0 X3JhbmdlcywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xv YihwY2lfaG9sZTY0KSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJh bmdlX3VwYihwY2lfaG9sZTY0KSk7Cj4gKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNyc19yYW5n ZV9zZXQubWVtXzY0Yml0X3Jhbmdlcy0+bGVuOyBpKyspIHsKPiArICAgICAgICAgICAgZW50cnkg PSBnX3B0cl9hcnJheV9pbmRleChjcnNfcmFuZ2Vfc2V0Lm1lbV82NGJpdF9yYW5nZXMsIGkpOwo+ ICsgICAgICAgICAgICBhbWxfYXBwZW5kKGNycywKPiArICAgICAgICAgICAgICAgICAgICAgICBh bWxfcXdvcmRfbWVtb3J5KEFNTF9QT1NfREVDT0RFLCBBTUxfTUlOX0ZJWEVELAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1MX01BWF9GSVhFRCwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTF9DQUNIRUFCTEUsIEFNTF9SRUFE X1dSSVRFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZW50 cnktPmJhc2UsIGVudHJ5LT5saW1pdCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDAsIGVudHJ5LT5saW1pdCAtIGVudHJ5LT5iYXNlICsgMSkpOwo+ICsgICAgICAg IH0KPiArICAgIH0KPiArCj4gKyAgICBpZiAoVFBNX0lTX1RJUyh0cG1fZmluZCgpKSkgewo+ICsg ICAgICAgIGFtbF9hcHBlbmQoY3JzLCBhbWxfbWVtb3J5MzJfZml4ZWQoVFBNX1RJU19BRERSX0JB U0UsCj4gKyAgICAgICAgICAgICAgICAgICBUUE1fVElTX0FERFJfU0laRSwgQU1MX1JFQURfV1JJ VEUpKTsKZGl0dG8sIGJvYXJkIGRlcGVuZGVkIGFuZCBub3QgZ2VuZXJpYyBlbm91Z2ggdG8gZ28g aGVyZQoKPiArICAgIH0KPiArCj4gKyAgICBhbWxfYXBwZW5kKHNjb3BlLCBhbWxfbmFtZV9kZWNs KCJfQ1JTIiwgY3JzKSk7Cj4gKyAgICBjcnNfcmFuZ2Vfc2V0X2ZyZWUoJmNyc19yYW5nZV9zZXQp Owo+ICsgICAgcmV0dXJuIHNjb3BlOwo+ICt9Cj4gKwo+ICt2b2lkIGFjcGlfZHNkdF9hZGRfcGNp X2J1cyhBbWwgKmRzZHQsIEFjcGlQY2lCdXMgKnBjaV9ob3N0KQpub3QgdXNlZCBpbiB0aGlzIHBh dGNoLCBkcm9wIGl0IGZvciBub3cuCgo+ICt7Cj4gKyAgICBBbWwgKmRldiwgKnBjaV9zY29wZTsK PiArCj4gKyAgICBkZXYgPSBhbWxfZGV2aWNlKCJcXF9TQi5QQ0kwIik7Cj4gKyAgICBhbWxfYXBw ZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0hJRCIsIGFtbF9laXNhaWQoIlBOUDBBMDgiKSkpOwo+ ICsgICAgYW1sX2FwcGVuZChkZXYsIGFtbF9uYW1lX2RlY2woIl9DSUQiLCBhbWxfZWlzYWlkKCJQ TlAwQTAzIikpKTsKPiArICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJfQURSIiwg YW1sX2ludCgwKSkpOwo+ICsgICAgYW1sX2FwcGVuZChkZXYsIGFtbF9uYW1lX2RlY2woIl9VSUQi LCBhbWxfaW50KDEpKSk7Cj4gKyAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiU1VQ UCIsIGFtbF9pbnQoMCkpKTsKPiArICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJD VFJMIiwgYW1sX2ludCgwKSkpOwo+ICsgICAgYW1sX2FwcGVuZChkZXYsIGJ1aWxkX29zY19tZXRo b2QoMHgxRikpOwpEb2VzIGFib3ZlIGRlc2NyaXB0aW9uIGFwcGxpY2FibGUgdG8gYWxsIGJvYXJk cyAocGMvcTM1L2Z1dHVyZSBpMzg2L3ZpcnQpPwpjdXJyZW50IGNvZGUgYnVpbGRzIFBDSSBkaWZm ZXJlbnRseSBkZXBlbmRpbmcgb24gYm9hcmQuCgo+ICsgICAgYW1sX2FwcGVuZChkc2R0LCBkZXYp OwppdCB3b3VsZCBiZSBiZXR0ZXIgdG8gcmV0dXJuIFBDSSBkZXYgYW5kIGxldCBjYWxsZXIgdG8g YWRkIGl0IHRvIGRzZHQuCgo+ICsKPiArICAgIHBjaV9zY29wZSA9IGJ1aWxkX3BjaV9ob3N0X2Jy aWRnZShkc2R0LCBwY2lfaG9zdCk7Cj4gKyAgICBhbWxfYXBwZW5kKGRzZHQsIHBjaV9zY29wZSk7 Cj4gK30KPiArCj4gIC8qIEJ1aWxkIHJzZHQgdGFibGUgKi8KPiAgdm9pZAo+ICBidWlsZF9yc2R0 KEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLCBHQXJyYXkgKnRhYmxlX29m ZnNldHMsCj4gZGlmZiAtLWdpdCBhL2h3L2kzODYvYWNwaS1idWlsZC5jIGIvaHcvaTM4Ni9hY3Bp LWJ1aWxkLmMKPiBpbmRleCBhNWY1ZjgzNTAwLi4xNGUyNjI0ZDE0IDEwMDY0NAo+IC0tLSBhL2h3 L2kzODYvYWNwaS1idWlsZC5jCj4gKysrIGIvaHcvaTM4Ni9hY3BpLWJ1aWxkLmMKPiBAQCAtMTI1 MywxNiArMTI1MywxMSBAQCBzdGF0aWMgdm9pZCBidWlsZF9waWl4NF9wY2lfaG90cGx1ZyhBbWwg KnRhYmxlKQo+ICBzdGF0aWMgdm9pZAo+ICBidWlsZF9kc2R0KEdBcnJheSAqdGFibGVfZGF0YSwg QklPU0xpbmtlciAqbGlua2VyLAo+ICAgICAgICAgICAgIEFjcGlQbUluZm8gKnBtLCBBY3BpTWlz Y0luZm8gKm1pc2MsCj4gLSAgICAgICAgICAgUmFuZ2UgKnBjaV9ob2xlLCBSYW5nZSAqcGNpX2hv bGU2NCwKPiArICAgICAgICAgICBBY3BpUGNpQnVzICpwY2lfaG9zdCwKPiAgICAgICAgICAgICBN YWNoaW5lU3RhdGUgKm1hY2hpbmUsIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYpCj4gIHsK PiAtICAgIENyc1JhbmdlRW50cnkgKmVudHJ5Owo+ICAgICAgQW1sICpkc2R0LCAqc2Jfc2NvcGUs ICpzY29wZSwgKmRldiwgKm1ldGhvZCwgKmZpZWxkLCAqcGtnLCAqY3JzOwo+IC0gICAgQ3JzUmFu Z2VTZXQgY3JzX3JhbmdlX3NldDsKPiAgICAgIHVpbnQzMl90IG5yX21lbSA9IG1hY2hpbmUtPnJh bV9zbG90czsKPiAtICAgIGludCByb290X2J1c19saW1pdCA9IDB4RkY7Cj4gLSAgICBQQ0lCdXMg KmJ1cyA9IE5VTEw7Cj4gLSAgICBpbnQgaTsKPiAgCj4gICAgICBkc2R0ID0gaW5pdF9hbWxfYWxs b2NhdG9yKCk7Cj4gIAo+IEBAIC0xMzM3LDEwNCArMTMzMiw3IEBAIGJ1aWxkX2RzZHQoR0FycmF5 ICp0YWJsZV9kYXRhLCBCSU9TTGlua2VyICpsaW5rZXIsCj4gICAgICB9Cj4gICAgICBhbWxfYXBw ZW5kKGRzZHQsIHNjb3BlKTsKPiAgCj4gLSAgICBjcnNfcmFuZ2Vfc2V0X2luaXQoJmNyc19yYW5n ZV9zZXQpOwo+IC0gICAgYnVzID0gUENfTUFDSElORShtYWNoaW5lKS0+YnVzOwo+IC0gICAgaWYg KGJ1cykgewo+IC0gICAgICAgIFFMSVNUX0ZPUkVBQ0goYnVzLCAmYnVzLT5jaGlsZCwgc2libGlu Zykgewo+IC0gICAgICAgICAgICB1aW50OF90IGJ1c19udW0gPSBwY2lfYnVzX251bShidXMpOwo+ IC0gICAgICAgICAgICB1aW50OF90IG51bWFfbm9kZSA9IHBjaV9idXNfbnVtYV9ub2RlKGJ1cyk7 Cj4gLQo+IC0gICAgICAgICAgICAvKiBsb29rIG9ubHkgZm9yIGV4cGFuZGVyIHJvb3QgYnVzZXMg Ki8KPiAtICAgICAgICAgICAgaWYgKCFwY2lfYnVzX2lzX3Jvb3QoYnVzKSkgewo+IC0gICAgICAg ICAgICAgICAgY29udGludWU7Cj4gLSAgICAgICAgICAgIH0KPiAtCj4gLSAgICAgICAgICAgIGlm IChidXNfbnVtIDwgcm9vdF9idXNfbGltaXQpIHsKPiAtICAgICAgICAgICAgICAgIHJvb3RfYnVz X2xpbWl0ID0gYnVzX251bSAtIDE7Cj4gLSAgICAgICAgICAgIH0KPiAtCj4gLSAgICAgICAgICAg IHNjb3BlID0gYW1sX3Njb3BlKCJcXF9TQiIpOwo+IC0gICAgICAgICAgICBkZXYgPSBhbWxfZGV2 aWNlKCJQQyUuMDJYIiwgYnVzX251bSk7Cj4gLSAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBh bWxfbmFtZV9kZWNsKCJfVUlEIiwgYW1sX2ludChidXNfbnVtKSkpOwo+IC0gICAgICAgICAgICBh bWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0hJRCIsIGFtbF9laXNhaWQoIlBOUDBBMDMi KSkpOwo+IC0gICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgYW1sX25hbWVfZGVjbCgiX0JCTiIs IGFtbF9pbnQoYnVzX251bSkpKTsKPiAtICAgICAgICAgICAgaWYgKHBjaV9idXNfaXNfZXhwcmVz cyhidXMpKSB7Cj4gLSAgICAgICAgICAgICAgICBhbWxfYXBwZW5kKGRldiwgYnVpbGRfb3NjX21l dGhvZChBQ1BJX09TQ19DVFJMX1BDSV9BTEwpKTsKPiAtICAgICAgICAgICAgfQo+IC0KPiAtICAg ICAgICAgICAgaWYgKG51bWFfbm9kZSAhPSBOVU1BX05PREVfVU5BU1NJR05FRCkgewo+IC0gICAg ICAgICAgICAgICAgYW1sX2FwcGVuZChkZXYsIGFtbF9uYW1lX2RlY2woIl9QWE0iLCBhbWxfaW50 KG51bWFfbm9kZSkpKTsKPiAtICAgICAgICAgICAgfQo+IC0KPiAtICAgICAgICAgICAgYW1sX2Fw cGVuZChkZXYsIGJ1aWxkX3BydChmYWxzZSkpOwo+IC0gICAgICAgICAgICBjcnMgPSBidWlsZF9j cnMoUENJX0hPU1RfQlJJREdFKEJVUyhidXMpLT5wYXJlbnQpLCAmY3JzX3JhbmdlX3NldCk7Cj4g LSAgICAgICAgICAgIGFtbF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJfQ1JTIiwgY3JzKSk7 Cj4gLSAgICAgICAgICAgIGFtbF9hcHBlbmQoc2NvcGUsIGRldik7Cj4gLSAgICAgICAgICAgIGFt bF9hcHBlbmQoZHNkdCwgc2NvcGUpOwo+IC0gICAgICAgIH0KPiAtICAgIH0KPiAtCj4gLSAgICBz Y29wZSA9IGFtbF9zY29wZSgiXFxfU0IuUENJMCIpOwo+IC0gICAgLyogYnVpbGQgUENJMC5fQ1JT ICovCj4gLSAgICBjcnMgPSBhbWxfcmVzb3VyY2VfdGVtcGxhdGUoKTsKPiAtICAgIGFtbF9hcHBl bmQoY3JzLAo+IC0gICAgICAgIGFtbF93b3JkX2J1c19udW1iZXIoQU1MX01JTl9GSVhFRCwgQU1M X01BWF9GSVhFRCwgQU1MX1BPU19ERUNPREUsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAweDAwMDAsIDB4MCwgcm9vdF9idXNfbGltaXQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAweDAwMDAsIHJvb3RfYnVzX2xpbWl0ICsgMSkpOwo+IC0gICAgYW1sX2FwcGVuZChjcnMs IGFtbF9pbyhBTUxfREVDT0RFMTYsIDB4MENGOCwgMHgwQ0Y4LCAweDAxLCAweDA4KSk7Cj4gLQo+ IC0gICAgYW1sX2FwcGVuZChjcnMsCj4gLSAgICAgICAgYW1sX3dvcmRfaW8oQU1MX01JTl9GSVhF RCwgQU1MX01BWF9GSVhFRCwKPiAtICAgICAgICAgICAgICAgICAgICBBTUxfUE9TX0RFQ09ERSwg QU1MX0VOVElSRV9SQU5HRSwKPiAtICAgICAgICAgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwg MHgwQ0Y3LCAweDAwMDAsIDB4MENGOCkpOwo+IC0KPiAtICAgIGNyc19yZXBsYWNlX3dpdGhfZnJl ZV9yYW5nZXMoY3JzX3JhbmdlX3NldC5pb19yYW5nZXMsIDB4MEQwMCwgMHhGRkZGKTsKPiAtICAg IGZvciAoaSA9IDA7IGkgPCBjcnNfcmFuZ2Vfc2V0LmlvX3Jhbmdlcy0+bGVuOyBpKyspIHsKPiAt ICAgICAgICBlbnRyeSA9IGdfcHRyX2FycmF5X2luZGV4KGNyc19yYW5nZV9zZXQuaW9fcmFuZ2Vz LCBpKTsKPiAtICAgICAgICBhbWxfYXBwZW5kKGNycywKPiAtICAgICAgICAgICAgYW1sX3dvcmRf aW8oQU1MX01JTl9GSVhFRCwgQU1MX01BWF9GSVhFRCwKPiAtICAgICAgICAgICAgICAgICAgICAg ICAgQU1MX1BPU19ERUNPREUsIEFNTF9FTlRJUkVfUkFOR0UsCj4gLSAgICAgICAgICAgICAgICAg ICAgICAgIDB4MDAwMCwgZW50cnktPmJhc2UsIGVudHJ5LT5saW1pdCwKPiAtICAgICAgICAgICAg ICAgICAgICAgICAgMHgwMDAwLCBlbnRyeS0+bGltaXQgLSBlbnRyeS0+YmFzZSArIDEpKTsKPiAt ICAgIH0KPiAtCj4gLSAgICBhbWxfYXBwZW5kKGNycywKPiAtICAgICAgICBhbWxfZHdvcmRfbWVt b3J5KEFNTF9QT1NfREVDT0RFLCBBTUxfTUlOX0ZJWEVELCBBTUxfTUFYX0ZJWEVELAo+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgQU1MX0NBQ0hFQUJMRSwgQU1MX1JFQURfV1JJVEUsCj4gLSAg ICAgICAgICAgICAgICAgICAgICAgICAwLCAweDAwMEEwMDAwLCAweDAwMEJGRkZGLCAwLCAweDAw MDIwMDAwKSk7Cj4gLQo+IC0gICAgY3JzX3JlcGxhY2Vfd2l0aF9mcmVlX3JhbmdlcyhjcnNfcmFu Z2Vfc2V0Lm1lbV9yYW5nZXMsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJh bmdlX2xvYihwY2lfaG9sZSksCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJh bmdlX3VwYihwY2lfaG9sZSkpOwo+IC0gICAgZm9yIChpID0gMDsgaSA8IGNyc19yYW5nZV9zZXQu bWVtX3Jhbmdlcy0+bGVuOyBpKyspIHsKPiAtICAgICAgICBlbnRyeSA9IGdfcHRyX2FycmF5X2lu ZGV4KGNyc19yYW5nZV9zZXQubWVtX3JhbmdlcywgaSk7Cj4gLSAgICAgICAgYW1sX2FwcGVuZChj cnMsCj4gLSAgICAgICAgICAgIGFtbF9kd29yZF9tZW1vcnkoQU1MX1BPU19ERUNPREUsIEFNTF9N SU5fRklYRUQsIEFNTF9NQVhfRklYRUQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg QU1MX05PTl9DQUNIRUFCTEUsIEFNTF9SRUFEX1dSSVRFLAo+IC0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDAsIGVudHJ5LT5iYXNlLCBlbnRyeS0+bGltaXQsCj4gLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMCwgZW50cnktPmxpbWl0IC0gZW50cnktPmJhc2UgKyAxKSk7Cj4gLSAg ICB9Cj4gLQo+IC0gICAgaWYgKCFyYW5nZV9pc19lbXB0eShwY2lfaG9sZTY0KSkgewo+IC0gICAg ICAgIGNyc19yZXBsYWNlX3dpdGhfZnJlZV9yYW5nZXMoY3JzX3JhbmdlX3NldC5tZW1fNjRiaXRf cmFuZ2VzLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbG9i KHBjaV9ob2xlNjQpLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFu Z2VfdXBiKHBjaV9ob2xlNjQpKTsKPiAtICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3JzX3Jhbmdl X3NldC5tZW1fNjRiaXRfcmFuZ2VzLT5sZW47IGkrKykgewo+IC0gICAgICAgICAgICBlbnRyeSA9 IGdfcHRyX2FycmF5X2luZGV4KGNyc19yYW5nZV9zZXQubWVtXzY0Yml0X3JhbmdlcywgaSk7Cj4g LSAgICAgICAgICAgIGFtbF9hcHBlbmQoY3JzLAo+IC0gICAgICAgICAgICAgICAgICAgICAgIGFt bF9xd29yZF9tZW1vcnkoQU1MX1BPU19ERUNPREUsIEFNTF9NSU5fRklYRUQsCj4gLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUxfTUFYX0ZJWEVELAo+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1MX0NBQ0hFQUJMRSwgQU1MX1JFQURf V1JJVEUsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBlbnRy eS0+YmFzZSwgZW50cnktPmxpbWl0LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMCwgZW50cnktPmxpbWl0IC0gZW50cnktPmJhc2UgKyAxKSk7Cj4gLSAgICAgICAg fQo+IC0gICAgfQo+IC0KPiAtICAgIGlmIChUUE1fSVNfVElTKHRwbV9maW5kKCkpKSB7Cj4gLSAg ICAgICAgYW1sX2FwcGVuZChjcnMsIGFtbF9tZW1vcnkzMl9maXhlZChUUE1fVElTX0FERFJfQkFT RSwKPiAtICAgICAgICAgICAgICAgICAgIFRQTV9USVNfQUREUl9TSVpFLCBBTUxfUkVBRF9XUklU RSkpOwo+IC0gICAgfQo+IC0gICAgYW1sX2FwcGVuZChzY29wZSwgYW1sX25hbWVfZGVjbCgiX0NS UyIsIGNycykpOwo+ICsgICAgc2NvcGUgPSBidWlsZF9wY2lfaG9zdF9icmlkZ2UoZHNkdCwgcGNp X2hvc3QpOwo+ICAKPiAgICAgIC8qIHJlc2VydmUgR1BFMCBibG9jayByZXNvdXJjZXMgKi8KPiAg ICAgIGRldiA9IGFtbF9kZXZpY2UoIkdQRTAiKTsKPiBAQCAtMTQ1NCw4ICsxMzUyLDYgQEAgYnVp bGRfZHNkdChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiAgICAgIGFt bF9hcHBlbmQoZGV2LCBhbWxfbmFtZV9kZWNsKCJfQ1JTIiwgY3JzKSk7Cj4gICAgICBhbWxfYXBw ZW5kKHNjb3BlLCBkZXYpOwo+ICAKPiAtICAgIGNyc19yYW5nZV9zZXRfZnJlZSgmY3JzX3Jhbmdl X3NldCk7Cj4gLQo+ICAgICAgLyogcmVzZXJ2ZSBQQ0lIUCByZXNvdXJjZXMgKi8KPiAgICAgIGlm IChwbS0+cGNpaHBfaW9fbGVuKSB7Cj4gICAgICAgICAgZGV2ID0gYW1sX2RldmljZSgiUEhQUiIp Owo+IEBAIC0yMDEyLDYgKzE5MDgsMTEgQEAgdm9pZCBhY3BpX2J1aWxkKEFjcGlCdWlsZFRhYmxl cyAqdGFibGVzLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0IC8qIEVuc3VyZSBG QUNTIGlzIGFsaWduZWQgKi8sCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2Ug LyogaGlnaCBtZW1vcnkgKi8pOwo+ICAKPiArICAgIEFjcGlQY2lCdXMgcGNpX2hvc3QgPSB7Cj4g KyAgICAgICAgLnBjaV9idXMgICAgPSBQQ19NQUNISU5FKG1hY2hpbmUpLT5idXMsCj4gKyAgICAg ICAgLnBjaV9ob2xlICAgPSAmcGNpX2hvbGUsCj4gKyAgICAgICAgLnBjaV9ob2xlNjQgPSAmcGNp X2hvbGU2NCwKPiArICAgIH07Cj4gICAgICAvKgo+ICAgICAgICogRkFDUyBpcyBwb2ludGVkIHRv IGJ5IEZBRFQuCj4gICAgICAgKiBXZSBwbGFjZSBpdCBmaXJzdCBzaW5jZSBpdCdzIHRoZSBvbmx5 IHRhYmxlIHRoYXQgaGFzIGFsaWdubWVudAo+IEBAIC0yMDIzLDcgKzE5MjQsNyBAQCB2b2lkIGFj cGlfYnVpbGQoQWNwaUJ1aWxkVGFibGVzICp0YWJsZXMsCj4gICAgICAvKiBEU0RUIGlzIHBvaW50 ZWQgdG8gYnkgRkFEVCAqLwo+ICAgICAgZHNkdCA9IHRhYmxlc19ibG9iLT5sZW47Cj4gICAgICBi dWlsZF9kc2R0KHRhYmxlc19ibG9iLCB0YWJsZXMtPmxpbmtlciwgJnBtLCAmbWlzYywKPiAtICAg ICAgICAgICAgICAgJnBjaV9ob2xlLCAmcGNpX2hvbGU2NCwgbWFjaGluZSwgYWNwaV9jb25mKTsK PiArICAgICAgICAgICAgICAgJnBjaV9ob3N0LCBtYWNoaW5lLCBhY3BpX2NvbmYpOwo+ICAKPiAg ICAgIC8qIENvdW50IHRoZSBzaXplIG9mIHRoZSBEU0RUIGFuZCBTU0RULCB3ZSB3aWxsIG5lZWQg aXQgZm9yIGxlZ2FjeQo+ICAgICAgICogc2l6aW5nIG9mIEFDUEkgdGFibGVzLgoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5n IGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJv amVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32986) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gMspw-0002ZJ-ON for qemu-devel@nongnu.org; Wed, 14 Nov 2018 05:55:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gMspu-0007cM-Jy for qemu-devel@nongnu.org; Wed, 14 Nov 2018 05:55:56 -0500 Date: Wed, 14 Nov 2018 11:55:37 +0100 From: Igor Mammedov Message-ID: <20181114115537.3357921b@redhat.com> In-Reply-To: <20181105014047.26447-12-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-12-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v5 11/24] hw: acpi: Export and generalize the PCI host AML API List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Samuel Ortiz , Marcel Apfelbaum Cc: qemu-devel@nongnu.org, Shannon Zhao , Stefano Stabellini , Anthony Perard , Richard Henderson , xen-devel@lists.xenproject.org, Paolo Bonzini , "Michael S. Tsirkin" , qemu-arm@nongnu.org, Peter Maydell , Eduardo Habkost , Yang Zhong , Rob Bradford On Mon, 5 Nov 2018 02:40:34 +0100 Samuel Ortiz wrote: > From: Yang Zhong > > The AML build routines for the PCI host bridge and the corresponding > DSDT addition are neither x86 nor PC machine type specific. > We can move them to the architecture agnostic hw/acpi folder, and by > carrying all the needed information through a new AcpiPciBus structure, > we can make them PC machine type independent. I'm don't know anything about PCI, but functional changes doesn't look correct to me. See more detailed comments below. Marcel, could you take a look on this patch (in particular main csr changes), pls? > > Signed-off-by: Yang Zhong > Signed-off-by: Rob Bradford > Signed-off-by: Samuel Ortiz > --- > include/hw/acpi/aml-build.h | 8 ++ > hw/acpi/aml-build.c | 157 ++++++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 115 ++------------------------ > 3 files changed, 173 insertions(+), 107 deletions(-) > > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index fde2785b9a..1861e37ebf 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -229,6 +229,12 @@ typedef struct AcpiMcfgInfo { > uint32_t mcfg_size; > } AcpiMcfgInfo; > > +typedef struct AcpiPciBus { > + PCIBus *pci_bus; > + Range *pci_hole; > + Range *pci_hole64; > +} AcpiPciBus; Again, this and all below is not aml-build material. Consider adding/using pci specific acpi file for it. Also even though pci AML in arm/virt is to a large degree a subset of x86 target and it would be much better to unify ARM part with x86, it probably will be to big/complex of a change if we take on it in one go. So not to derail you from the goal too much, we probably should generalize this a little bit less, limiting refactoring to x86 target for now. For example, move generic x86 pci parts to hw/i386/acpi-pci.[hc], and structure it so that building blocks in acpi-pci.c could be reused for x86 reduced profile later. Once it's been done, it might be easier and less complex to unify a bit more generic code in i386/acpi-pci.c with corresponding ARM code. Patch is too big and should be split into smaller logical chunks and you should separate code movement vs functional changes you're a making here. Once you split patch properly, it should be easier to assess changes. > typedef struct CrsRangeEntry { > uint64_t base; > uint64_t limit; > @@ -411,6 +417,8 @@ 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 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); > Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set); > void crs_replace_with_free_ranges(GPtrArray *ranges, > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index b8e32f15f7..869ed70db3 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -29,6 +29,19 @@ > #include "hw/pci/pci_bus.h" > #include "qemu/range.h" > #include "hw/pci/pci_bridge.h" > +#include "hw/i386/pc.h" > +#include "sysemu/tpm.h" > +#include "hw/acpi/tpm.h" > + > +#define PCI_HOST_BRIDGE_CONFIG_ADDR 0xcf8 > +#define PCI_HOST_BRIDGE_IO_0_MIN_ADDR 0x0000 > +#define PCI_HOST_BRIDGE_IO_0_MAX_ADDR 0x0cf7 > +#define PCI_HOST_BRIDGE_IO_1_MIN_ADDR 0x0d00 > +#define PCI_HOST_BRIDGE_IO_1_MAX_ADDR 0xffff > +#define PCI_VGA_MEM_BASE_ADDR 0x000a0000 > +#define PCI_VGA_MEM_MAX_ADDR 0x000bffff > +#define IO_0_LEN 0xcf8 > +#define VGA_MEM_LEN 0x20000 > > static GArray *build_alloc_array(void) > { > @@ -2142,6 +2155,150 @@ Aml *build_prt(bool is_pci0_prt) > return method; > } > > +Aml *build_pci_host_bridge(Aml *table, AcpiPciBus *pci_host) name doesn't reflect exactly what function does, it builds device descriptions for expander buses (including their csr) and then it builds csr for for main pci host but not pci device description. I'd suggest to split out expander buses part into separate function that returns an expander bus device description, updates crs_range_set and let the caller to enumerate buses and add descriptions to dsdt. Then after it we could do a generic csr generation function for the main pci host if it's possible at all (main pci host csr seems heavily board depended) Instead of taking table and adding stuff directly in to it it should be cleaner to take as argument empty csr (crs = aml_resource_template();) add stuff to it and let the caller to add/extend csr as/where necessary. > +{ > + CrsRangeEntry *entry; > + Aml *scope, *dev, *crs; > + CrsRangeSet crs_range_set; > + Range *pci_hole = NULL; > + Range *pci_hole64 = NULL; > + PCIBus *bus = NULL; > + int root_bus_limit = 0xFF; > + int i; > + > + bus = pci_host->pci_bus; > + assert(bus); > + pci_hole = pci_host->pci_hole; > + pci_hole64 = pci_host->pci_hole64; > + > + crs_range_set_init(&crs_range_set); > + QLIST_FOREACH(bus, &bus->child, sibling) { > + uint8_t bus_num = pci_bus_num(bus); > + uint8_t numa_node = pci_bus_numa_node(bus); > + > + /* look only for expander root buses */ > + if (!pci_bus_is_root(bus)) { > + continue; > + } > + > + if (bus_num < root_bus_limit) { > + root_bus_limit = bus_num - 1; > + } > + > + scope = aml_scope("\\_SB"); > + dev = aml_device("PC%.02X", bus_num); > + aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); > + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); > + aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); > + if (pci_bus_is_express(bus)) { > + aml_append(dev, aml_name_decl("SUPP", aml_int(0))); > + aml_append(dev, aml_name_decl("CTRL", aml_int(0))); > + aml_append(dev, build_osc_method(0x1F)); > + } > + if (numa_node != NUMA_NODE_UNASSIGNED) { > + aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node))); > + } > + > + aml_append(dev, build_prt(false)); > + crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent), &crs_range_set); > + aml_append(dev, aml_name_decl("_CRS", crs)); > + aml_append(scope, dev); > + aml_append(table, scope); > + } > + scope = aml_scope("\\_SB.PCI0"); > + /* build PCI0._CRS */ > + crs = aml_resource_template(); > + /* set the pcie bus num */ > + aml_append(crs, > + aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, > + 0x0000, 0x0, root_bus_limit, > + 0x0000, root_bus_limit + 1)); vvvv > + aml_append(crs, aml_io(AML_DECODE16, PCI_HOST_BRIDGE_CONFIG_ADDR, > + PCI_HOST_BRIDGE_CONFIG_ADDR, 0x01, 0x08)); > + /* set the io region 0 in pci host bridge */ > + aml_append(crs, > + aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > + AML_POS_DECODE, AML_ENTIRE_RANGE, > + 0x0000, PCI_HOST_BRIDGE_IO_0_MIN_ADDR, > + PCI_HOST_BRIDGE_IO_0_MAX_ADDR, 0x0000, IO_0_LEN)); > + > + /* set the io region 1 in pci host bridge */ > + crs_replace_with_free_ranges(crs_range_set.io_ranges, > + PCI_HOST_BRIDGE_IO_1_MIN_ADDR, > + PCI_HOST_BRIDGE_IO_1_MAX_ADDR); above code doesn't look as just a movement, it's something totally new, so it should be in it's own patch with a justification why it's ok to replace concrete addresses with some kind of window. > + for (i = 0; i < crs_range_set.io_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.io_ranges, i); > + aml_append(crs, > + aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > + AML_POS_DECODE, AML_ENTIRE_RANGE, > + 0x0000, entry->base, entry->limit, > + 0x0000, entry->limit - entry->base + 1)); > + } > + > + /* set the vga mem region(0) in pci host bridge */ > + aml_append(crs, > + aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > + AML_CACHEABLE, AML_READ_WRITE, > + 0, PCI_VGA_MEM_BASE_ADDR, PCI_VGA_MEM_MAX_ADDR, > + 0, VGA_MEM_LEN)); this part doesn't look generic enough. I'd assume new shiny i386/virt won't have VGA and assuming one day we would reuse this code for ARM it probably doesn't make sense to put it in generic code. > + > + /* set the mem region 1 in pci host bridge */ > + crs_replace_with_free_ranges(crs_range_set.mem_ranges, > + range_lob(pci_hole), > + range_upb(pci_hole)); > + for (i = 0; i < crs_range_set.mem_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.mem_ranges, i); > + aml_append(crs, > + aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > + AML_NON_CACHEABLE, AML_READ_WRITE, > + 0, entry->base, entry->limit, > + 0, entry->limit - entry->base + 1)); > + } > + > + /* set the mem region 2 in pci host bridge */ > + if (!range_is_empty(pci_hole64)) { > + crs_replace_with_free_ranges(crs_range_set.mem_64bit_ranges, > + range_lob(pci_hole64), > + range_upb(pci_hole64)); > + for (i = 0; i < crs_range_set.mem_64bit_ranges->len; i++) { > + entry = g_ptr_array_index(crs_range_set.mem_64bit_ranges, i); > + aml_append(crs, > + aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, > + AML_MAX_FIXED, > + AML_CACHEABLE, AML_READ_WRITE, > + 0, entry->base, entry->limit, > + 0, entry->limit - entry->base + 1)); > + } > + } > + > + if (TPM_IS_TIS(tpm_find())) { > + aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, > + TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); ditto, board depended and not generic enough to go here > + } > + > + aml_append(scope, aml_name_decl("_CRS", crs)); > + crs_range_set_free(&crs_range_set); > + return scope; > +} > + > +void acpi_dsdt_add_pci_bus(Aml *dsdt, AcpiPciBus *pci_host) not used in this patch, drop it for now. > +{ > + Aml *dev, *pci_scope; > + > + dev = aml_device("\\_SB.PCI0"); > + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A08"))); > + aml_append(dev, aml_name_decl("_CID", aml_eisaid("PNP0A03"))); > + aml_append(dev, aml_name_decl("_ADR", aml_int(0))); > + aml_append(dev, aml_name_decl("_UID", aml_int(1))); > + aml_append(dev, aml_name_decl("SUPP", aml_int(0))); > + aml_append(dev, aml_name_decl("CTRL", aml_int(0))); > + aml_append(dev, build_osc_method(0x1F)); Does above description applicable to all boards (pc/q35/future i386/virt)? current code builds PCI differently depending on board. > + aml_append(dsdt, dev); it would be better to return PCI dev and let caller to add it to dsdt. > + > + pci_scope = build_pci_host_bridge(dsdt, pci_host); > + aml_append(dsdt, pci_scope); > +} > + > /* Build rsdt table */ > void > build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index a5f5f83500..14e2624d14 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1253,16 +1253,11 @@ static void build_piix4_pci_hotplug(Aml *table) > static void > build_dsdt(GArray *table_data, BIOSLinker *linker, > AcpiPmInfo *pm, AcpiMiscInfo *misc, > - Range *pci_hole, Range *pci_hole64, > + AcpiPciBus *pci_host, > MachineState *machine, AcpiConfiguration *acpi_conf) > { > - CrsRangeEntry *entry; > Aml *dsdt, *sb_scope, *scope, *dev, *method, *field, *pkg, *crs; > - CrsRangeSet crs_range_set; > uint32_t nr_mem = machine->ram_slots; > - int root_bus_limit = 0xFF; > - PCIBus *bus = NULL; > - int i; > > dsdt = init_aml_allocator(); > > @@ -1337,104 +1332,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > } > aml_append(dsdt, scope); > > - crs_range_set_init(&crs_range_set); > - bus = PC_MACHINE(machine)->bus; > - if (bus) { > - QLIST_FOREACH(bus, &bus->child, sibling) { > - uint8_t bus_num = pci_bus_num(bus); > - uint8_t numa_node = pci_bus_numa_node(bus); > - > - /* look only for expander root buses */ > - if (!pci_bus_is_root(bus)) { > - continue; > - } > - > - if (bus_num < root_bus_limit) { > - root_bus_limit = bus_num - 1; > - } > - > - scope = aml_scope("\\_SB"); > - dev = aml_device("PC%.02X", bus_num); > - aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); > - aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); > - aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); > - if (pci_bus_is_express(bus)) { > - aml_append(dev, build_osc_method(ACPI_OSC_CTRL_PCI_ALL)); > - } > - > - if (numa_node != NUMA_NODE_UNASSIGNED) { > - aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node))); > - } > - > - aml_append(dev, build_prt(false)); > - crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent), &crs_range_set); > - aml_append(dev, aml_name_decl("_CRS", crs)); > - aml_append(scope, dev); > - aml_append(dsdt, scope); > - } > - } > - > - scope = aml_scope("\\_SB.PCI0"); > - /* build PCI0._CRS */ > - crs = aml_resource_template(); > - aml_append(crs, > - aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, > - 0x0000, 0x0, root_bus_limit, > - 0x0000, root_bus_limit + 1)); > - aml_append(crs, aml_io(AML_DECODE16, 0x0CF8, 0x0CF8, 0x01, 0x08)); > - > - aml_append(crs, > - aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > - AML_POS_DECODE, AML_ENTIRE_RANGE, > - 0x0000, 0x0000, 0x0CF7, 0x0000, 0x0CF8)); > - > - crs_replace_with_free_ranges(crs_range_set.io_ranges, 0x0D00, 0xFFFF); > - for (i = 0; i < crs_range_set.io_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.io_ranges, i); > - aml_append(crs, > - aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, > - AML_POS_DECODE, AML_ENTIRE_RANGE, > - 0x0000, entry->base, entry->limit, > - 0x0000, entry->limit - entry->base + 1)); > - } > - > - aml_append(crs, > - aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > - AML_CACHEABLE, AML_READ_WRITE, > - 0, 0x000A0000, 0x000BFFFF, 0, 0x00020000)); > - > - crs_replace_with_free_ranges(crs_range_set.mem_ranges, > - range_lob(pci_hole), > - range_upb(pci_hole)); > - for (i = 0; i < crs_range_set.mem_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.mem_ranges, i); > - aml_append(crs, > - aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, > - AML_NON_CACHEABLE, AML_READ_WRITE, > - 0, entry->base, entry->limit, > - 0, entry->limit - entry->base + 1)); > - } > - > - if (!range_is_empty(pci_hole64)) { > - crs_replace_with_free_ranges(crs_range_set.mem_64bit_ranges, > - range_lob(pci_hole64), > - range_upb(pci_hole64)); > - for (i = 0; i < crs_range_set.mem_64bit_ranges->len; i++) { > - entry = g_ptr_array_index(crs_range_set.mem_64bit_ranges, i); > - aml_append(crs, > - aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, > - AML_MAX_FIXED, > - AML_CACHEABLE, AML_READ_WRITE, > - 0, entry->base, entry->limit, > - 0, entry->limit - entry->base + 1)); > - } > - } > - > - if (TPM_IS_TIS(tpm_find())) { > - aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, > - TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); > - } > - aml_append(scope, aml_name_decl("_CRS", crs)); > + scope = build_pci_host_bridge(dsdt, pci_host); > > /* reserve GPE0 block resources */ > dev = aml_device("GPE0"); > @@ -1454,8 +1352,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > aml_append(dev, aml_name_decl("_CRS", crs)); > aml_append(scope, dev); > > - crs_range_set_free(&crs_range_set); > - > /* reserve PCIHP resources */ > if (pm->pcihp_io_len) { > dev = aml_device("PHPR"); > @@ -2012,6 +1908,11 @@ void acpi_build(AcpiBuildTables *tables, > 64 /* Ensure FACS is aligned */, > false /* high memory */); > > + AcpiPciBus pci_host = { > + .pci_bus = PC_MACHINE(machine)->bus, > + .pci_hole = &pci_hole, > + .pci_hole64 = &pci_hole64, > + }; > /* > * FACS is pointed to by FADT. > * We place it first since it's the only table that has alignment > @@ -2023,7 +1924,7 @@ void acpi_build(AcpiBuildTables *tables, > /* DSDT is pointed to by FADT */ > dsdt = tables_blob->len; > build_dsdt(tables_blob, tables->linker, &pm, &misc, > - &pci_hole, &pci_hole64, machine, acpi_conf); > + &pci_host, machine, acpi_conf); > > /* Count the size of the DSDT and SSDT, we will need it for legacy > * sizing of ACPI tables.