[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 38/42] pc: acpi-build: create PCI0._CRS dynam
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH v4 38/42] pc: acpi-build: create PCI0._CRS dynamically |
Date: |
Wed, 18 Feb 2015 21:25:39 +0100 |
On Wed, Feb 18, 2015 at 07:14:51PM +0000, Igor Mammedov wrote:
> Replace template patching and runtime
> calculation in _CRS() method with static _CRS
> defined in SSDT.
>
> It also drops manual hole patching for reserved
> PCI/MEM/CPU hoptlug MMIO resources and utilizes
> the fact that MMIO resources are reserved by
> respective child /i.e. PHPR, MHPD, PRES/ containers.
>
> Signed-off-by: Igor Mammedov <address@hidden>
This should be split.
Can we have
patch 1 replace ASL with C
patch 2 simplify ranges
?
I seem to remember reserving ranges like that caused
problems in the past, and even if not, it's cleaner
not to mix code rework and functional changes.
> ---
> hw/i386/acpi-build.c | 69 ++++++++++++++++----------------
> hw/i386/acpi-dsdt-pci-crs.dsl | 92
> -------------------------------------------
> hw/i386/acpi-dsdt.dsl | 45 ---------------------
> hw/i386/q35-acpi-dsdt.dsl | 18 ---------
> hw/i386/ssdt-misc.dsl | 19 ---------
> 5 files changed, 33 insertions(+), 210 deletions(-)
> delete mode 100644 hw/i386/acpi-dsdt-pci-crs.dsl
>
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 4d5d7e3..ee254df 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -346,24 +346,6 @@ static void acpi_align_size(GArray *blob, unsigned align)
> g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align));
> }
>
> -/* Set a value within table in a safe manner */
> -#define ACPI_BUILD_SET_LE(table, size, off, bits, val) \
> - do { \
> - uint64_t ACPI_BUILD_SET_LE_val = cpu_to_le64(val); \
> - memcpy(acpi_data_get_ptr(table, size, off, \
> - (bits) / BITS_PER_BYTE), \
> - &ACPI_BUILD_SET_LE_val, \
> - (bits) / BITS_PER_BYTE); \
> - } while (0)
> -
> -static inline void *acpi_data_get_ptr(uint8_t *table_data, unsigned
> table_size,
> - unsigned off, unsigned size)
> -{
> - assert(off + size > off);
> - assert(off + size <= table_size);
> - return table_data + off;
> -}
> -
> static inline void acpi_add_table(GArray *table_offsets, GArray *table_data)
> {
> uint32_t offset = cpu_to_le32(table_data->len);
> @@ -860,22 +842,6 @@ static void build_pci_bus_end(PCIBus *bus, void
> *bus_state)
> g_free(child);
> }
>
> -static void patch_pci_windows(PcPciInfo *pci, uint8_t *start, unsigned size)
> -{
> - ACPI_BUILD_SET_LE(start, size, acpi_pci32_start[0], 32, pci->w32.begin);
> -
> - ACPI_BUILD_SET_LE(start, size, acpi_pci32_end[0], 32, pci->w32.end - 1);
> -
> - if (pci->w64.end || pci->w64.begin) {
> - ACPI_BUILD_SET_LE(start, size, acpi_pci64_valid[0], 8, 1);
> - ACPI_BUILD_SET_LE(start, size, acpi_pci64_start[0], 64,
> pci->w64.begin);
> - ACPI_BUILD_SET_LE(start, size, acpi_pci64_end[0], 64, pci->w64.end -
> 1);
> - ACPI_BUILD_SET_LE(start, size, acpi_pci64_length[0], 64,
> pci->w64.end - pci->w64.begin);
> - } else {
> - ACPI_BUILD_SET_LE(start, size, acpi_pci64_valid[0], 8, 0);
> - }
> -}
> -
> static void
> build_ssdt(GArray *table_data, GArray *linker,
> AcpiCpuInfo *cpu, AcpiPmInfo *pm, AcpiMiscInfo *misc,
> @@ -898,9 +864,40 @@ build_ssdt(GArray *table_data, GArray *linker,
> ssdt_ptr = acpi_data_push(ssdt->buf, sizeof(ssdp_misc_aml));
> memcpy(ssdt_ptr, ssdp_misc_aml, sizeof(ssdp_misc_aml));
>
> - patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml));
> -
> 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, 0x0000, 0x00FF, 0x0000, 0x0100));
> + 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));
> + aml_append(crs,
> + aml_word_io(aml_min_fixed, aml_max_fixed,
> + aml_pos_decode, aml_entire_range,
> + 0x0000, 0x0D00, 0xFFFF, 0x0000, 0xF300));
> + aml_append(crs,
> + aml_dword_memory(aml_pos_decode, aml_min_fixed, aml_max_fixed,
> + aml_cacheable, aml_ReadWrite,
> + 0, 0x000A0000, 0x000BFFFF, 0, 0x00020000));
> + aml_append(crs,
> + aml_dword_memory(aml_pos_decode, aml_min_fixed, aml_max_fixed,
> + aml_non_cacheable, aml_ReadWrite,
> + 0, pci->w32.begin, pci->w32.end - 1, 0,
> + pci->w32.end - pci->w32.begin));
> + if (pci->w64.begin) {
> + aml_append(crs,
> + aml_qword_memory(aml_pos_decode, aml_min_fixed, aml_max_fixed,
> + aml_cacheable, aml_ReadWrite,
> + 0, pci->w64.begin, pci->w64.end - 1, 0,
> + pci->w64.end - pci->w64.begin));
> + }
> + aml_append(scope, aml_name_decl("_CRS", crs));
> +
> /* reserve PCIHP resources */
> if (pm->pcihp_io_len) {
> dev = aml_device("PHPR");
> diff --git a/hw/i386/acpi-dsdt-pci-crs.dsl b/hw/i386/acpi-dsdt-pci-crs.dsl
> deleted file mode 100644
> index 4648e90..0000000
> --- a/hw/i386/acpi-dsdt-pci-crs.dsl
> +++ /dev/null
> @@ -1,92 +0,0 @@
> -/*
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> -
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> -
> - * You should have received a copy of the GNU General Public License along
> - * with this program; if not, see <http://www.gnu.org/licenses/>.
> - */
> -
> -/* PCI CRS (current resources) definition. */
> -Scope(\_SB.PCI0) {
> -
> - Name(CRES, ResourceTemplate() {
> - WordBusNumber(ResourceProducer, MinFixed, MaxFixed, PosDecode,
> - 0x0000, // Address Space Granularity
> - 0x0000, // Address Range Minimum
> - 0x00FF, // Address Range Maximum
> - 0x0000, // Address Translation Offset
> - 0x0100, // Address Length
> - ,, )
> - IO(Decode16,
> - 0x0CF8, // Address Range Minimum
> - 0x0CF8, // Address Range Maximum
> - 0x01, // Address Alignment
> - 0x08, // Address Length
> - )
> - BOARD_SPECIFIC_PCI_RESOURSES
> - DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
> Cacheable, ReadWrite,
> - 0x00000000, // Address Space Granularity
> - 0x000A0000, // Address Range Minimum
> - 0x000BFFFF, // Address Range Maximum
> - 0x00000000, // Address Translation Offset
> - 0x00020000, // Address Length
> - ,, , AddressRangeMemory, TypeStatic)
> - DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
> NonCacheable, ReadWrite,
> - 0x00000000, // Address Space Granularity
> - 0xE0000000, // Address Range Minimum
> - 0xFEBFFFFF, // Address Range Maximum
> - 0x00000000, // Address Translation Offset
> - 0x1EC00000, // Address Length
> - ,, PW32, AddressRangeMemory, TypeStatic)
> - })
> -
> - Name(CR64, ResourceTemplate() {
> - QWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed,
> Cacheable, ReadWrite,
> - 0x00000000, // Address Space Granularity
> - 0x8000000000, // Address Range Minimum
> - 0xFFFFFFFFFF, // Address Range Maximum
> - 0x00000000, // Address Translation Offset
> - 0x8000000000, // Address Length
> - ,, PW64, AddressRangeMemory, TypeStatic)
> - })
> -
> - Method(_CRS, 0) {
> - /* Fields provided by dynamically created ssdt */
> - External(P0S, IntObj)
> - External(P0E, IntObj)
> - External(P1V, IntObj)
> - External(P1S, BuffObj)
> - External(P1E, BuffObj)
> - External(P1L, BuffObj)
> -
> - /* fixup 32bit pci io window */
> - CreateDWordField(CRES, \_SB.PCI0.PW32._MIN, PS32)
> - CreateDWordField(CRES, \_SB.PCI0.PW32._MAX, PE32)
> - CreateDWordField(CRES, \_SB.PCI0.PW32._LEN, PL32)
> - Store(P0S, PS32)
> - Store(P0E, PE32)
> - Store(Add(Subtract(P0E, P0S), 1), PL32)
> -
> - If (LEqual(P1V, Zero)) {
> - Return (CRES)
> - }
> -
> - /* fixup 64bit pci io window */
> - CreateQWordField(CR64, \_SB.PCI0.PW64._MIN, PS64)
> - CreateQWordField(CR64, \_SB.PCI0.PW64._MAX, PE64)
> - CreateQWordField(CR64, \_SB.PCI0.PW64._LEN, PL64)
> - Store(P1S, PS64)
> - Store(P1E, PE64)
> - Store(P1L, PL64)
> - /* add window and return result */
> - ConcatenateResTemplate(CRES, CR64, Local0)
> - Return (Local0)
> - }
> -}
> diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
> index a611e07..09b68f0 100644
> --- a/hw/i386/acpi-dsdt.dsl
> +++ b/hw/i386/acpi-dsdt.dsl
> @@ -31,50 +31,6 @@ DefinitionBlock (
>
> #include "acpi-dsdt-dbug.dsl"
>
> -
> -/****************************************************************
> - * PCI Bus definition
> - ****************************************************************/
> -#define BOARD_SPECIFIC_PCI_RESOURSES \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0x0000, \
> - 0x0CF7, \
> - 0x0000, \
> - 0x0CF8, \
> - ,, , TypeStatic) \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0x0D00, \
> - 0xADFF, \
> - 0x0000, \
> - 0xA100, \
> - ,, , TypeStatic) \
> - /* 0xae00-0xae0e hole for PCI hotplug, hw/acpi/piix4.c:PCI_HOTPLUG_ADDR
> */ \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0xAE0F, \
> - 0xAEFF, \
> - 0x0000, \
> - 0x00F1, \
> - ,, , TypeStatic) \
> - /* 0xaf00-0xaf1f hole for CPU hotplug, hw/acpi/piix4.c:PIIX4_PROC_BASE
> */ \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0xAF20, \
> - 0xAFDF, \
> - 0x0000, \
> - 0x00C0, \
> - ,, , TypeStatic) \
> - /* 0xafe0-0xafe3 hole for ACPI.GPE0, hw/acpi/piix4.c:GPE_BASE */ \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0xAFE4, \
> - 0xFFFF, \
> - 0x0000, \
> - 0x501C, \
> - ,, , TypeStatic)
> -
> Scope(\_SB) {
> Device(PCI0) {
> Name(_HID, EisaId("PNP0A03"))
> @@ -85,7 +41,6 @@ DefinitionBlock (
> }
> }
>
> -#include "acpi-dsdt-pci-crs.dsl"
> #include "acpi-dsdt-hpet.dsl"
>
>
> diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
> index e1cee5d..3fb4b2f 100644
> --- a/hw/i386/q35-acpi-dsdt.dsl
> +++ b/hw/i386/q35-acpi-dsdt.dsl
> @@ -48,23 +48,6 @@ DefinitionBlock (
> /****************************************************************
> * PCI Bus definition
> ****************************************************************/
> -#define BOARD_SPECIFIC_PCI_RESOURSES \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0x0000, \
> - 0x0CD7, \
> - 0x0000, \
> - 0x0CD8, \
> - ,, , TypeStatic) \
> - /* 0xcd8-0xcf7 hole for CPU hotplug, hw/acpi/ich9.c:ICH9_PROC_BASE */ \
> - WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, \
> - 0x0000, \
> - 0x0D00, \
> - 0xFFFF, \
> - 0x0000, \
> - 0xF300, \
> - ,, , TypeStatic)
> -
> Scope(\_SB) {
> Device(PCI0) {
> Name(_HID, EisaId("PNP0A08"))
> @@ -131,7 +114,6 @@ DefinitionBlock (
> }
> }
>
> -#include "acpi-dsdt-pci-crs.dsl"
> #include "acpi-dsdt-hpet.dsl"
>
>
> diff --git a/hw/i386/ssdt-misc.dsl b/hw/i386/ssdt-misc.dsl
> index 2588e30..8d61f21 100644
> --- a/hw/i386/ssdt-misc.dsl
> +++ b/hw/i386/ssdt-misc.dsl
> @@ -18,23 +18,4 @@ ACPI_EXTRACT_ALL_CODE ssdp_misc_aml
>
> DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1)
> {
> -
> -/****************************************************************
> - * PCI memory ranges
> - ****************************************************************/
> -
> - Scope(\) {
> - ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_start
> - Name(P0S, 0x12345678)
> - ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_end
> - Name(P0E, 0x12345678)
> - ACPI_EXTRACT_NAME_BYTE_CONST acpi_pci64_valid
> - Name(P1V, 0x12)
> - ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_start
> - Name(P1S, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
> - ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_end
> - Name(P1E, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
> - ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_length
> - Name(P1L, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
> - }
> }
> --
> 1.8.3.1
- [Qemu-devel] [PATCH v4 32/42] acpi: add aml_reserved_field() term, (continued)
- [Qemu-devel] [PATCH v4 32/42] acpi: add aml_reserved_field() term, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 29/42] acpi: add aml_eisaid() term, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 33/42] pc: acpi-build: drop template patching and memory hotplug objects dynamically, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 35/42] acpi: add aml_word_bus_number(), aml_word_io(), aml_dword_memory(), aml_qword_memory() terms, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 31/42] pc: acpi-build: create CPU hotplug IO region dynamically, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 40/42] acpi: add acpi_irq_no_flags() term, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 34/42] pc: acpi-build: create memory hotplug IO region dynamically, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 41/42] pc: export applesmc IO port/len, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 42/42] pc: acpi-build: drop template patching and create Device(SMC) dynamically, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 38/42] pc: acpi-build: create PCI0._CRS dynamically, Igor Mammedov, 2015/02/18
- Re: [Qemu-devel] [PATCH v4 38/42] pc: acpi-build: create PCI0._CRS dynamically,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCH v4 36/42] pc: pcihp: expose MMIO base and len as properties, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 39/42] pc: acpi-build: drop remaining ssdt_misc template, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 37/42] pc: acpi-build: reserve PCIHP MMIO resources, Igor Mammedov, 2015/02/18
- [Qemu-devel] [PATCH v4 30/42] pc: acpi-build: drop template patching and CPU hotplug objects dynamically, Igor Mammedov, 2015/02/18