[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 02/23] acpi/hvmloader: Allow acpi_build_tables() callers specify acpi_info values
By doing this we can move hvmloader-private interfaces (such as uart_exists(), lpt_exists() etc.) out of the ACPI builder. This will help us with allowing to call the builder from places other than hvmloader. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- v2: * Keep struct acpi_info private to build.c and instead pass information necessary to set its fields via acpi_config's flags. tools/firmware/hvmloader/acpi/acpi2_0.h | 9 ----- tools/firmware/hvmloader/acpi/build.c | 34 +++++++++--------- tools/firmware/hvmloader/acpi/libacpi.h | 63 +++++++++++++++++++++++++++++++++ tools/firmware/hvmloader/ovmf.c | 2 +- tools/firmware/hvmloader/seabios.c | 1 + tools/firmware/hvmloader/util.c | 26 +++++++++++++- 6 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 tools/firmware/hvmloader/acpi/libacpi.h diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h b/tools/firmware/hvmloader/acpi/acpi2_0.h index 6fa3452..775eb7a 100644 --- a/tools/firmware/hvmloader/acpi/acpi2_0.h +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h @@ -448,15 +448,6 @@ struct acpi_20_slit { #pragma pack () -struct acpi_config { - unsigned char *dsdt_anycpu; - int dsdt_anycpu_len; - unsigned char *dsdt_15cpu; - int dsdt_15cpu_len; -}; - -void acpi_build_tables(struct acpi_config *config, unsigned int physical); - #endif /* _ACPI_2_0_H_ */ /* diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index 8be9b90..f251c05 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -14,6 +14,7 @@ */ #include "acpi2_0.h" +#include "libacpi.h" #include "ssdt_s3.h" #include "ssdt_s4.h" #include "ssdt_tpm.h" @@ -356,7 +357,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, } /* HPET. */ - if ( hpet_exists(ACPI_HPET_ADDRESS) ) + if ( info->hpet_present ) { hpet = construct_hpet(); if (!hpet) return -1; @@ -491,7 +492,7 @@ static int new_vm_gid(struct acpi_info *acpi_info) return 1; } -void acpi_build_tables(struct acpi_config *config, unsigned int physical) +void acpi_build_tables(struct acpi_config *config) { struct acpi_info *acpi_info; struct acpi_20_rsdp *rsdp; @@ -504,10 +505,19 @@ void acpi_build_tables(struct acpi_config *config, unsigned int physical) unsigned long secondary_tables[ACPI_MAX_SECONDARY_TABLES]; int nr_secondaries, i; - /* Allocate and initialise the acpi info area. */ - mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); - acpi_info = (struct acpi_info *)ACPI_INFO_PHYSICAL_ADDRESS; + acpi_info = (struct acpi_info *)config->infop; memset(acpi_info, 0, sizeof(*acpi_info)); + acpi_info->com1_present = !!(config->table_flags & ACPI_HAS_COM1); + acpi_info->com2_present = !!(config->table_flags & ACPI_HAS_COM2); + acpi_info->lpt1_present = !!(config->table_flags & ACPI_HAS_LPT1); + acpi_info->hpet_present = !!(config->table_flags & ACPI_HAS_HPET); + acpi_info->pci_min = config->pci_start; + acpi_info->pci_len = config->pci_len; + if ( config->pci_hi_len ) + { + acpi_info->pci_hi_min = config->pci_hi_start; + acpi_info->pci_hi_len = config->pci_hi_len; + } /* * Fill in high-memory data structures, starting at @buf. @@ -601,7 +611,7 @@ void acpi_build_tables(struct acpi_config *config, unsigned int physical) /* * Fill in low-memory data structures: acpi_info and RSDP. */ - rsdp = (struct acpi_20_rsdp *)physical; + rsdp = (struct acpi_20_rsdp *)config->rsdp; memcpy(rsdp, &Rsdp, sizeof(struct acpi_20_rsdp)); rsdp->rsdt_address = (unsigned long)rsdt; @@ -616,18 +626,6 @@ void acpi_build_tables(struct acpi_config *config, unsigned int physical) if ( !new_vm_gid(acpi_info) ) goto oom; - acpi_info->com1_present = uart_exists(0x3f8); - acpi_info->com2_present = uart_exists(0x2f8); - acpi_info->lpt1_present = lpt_exists(0x378); - acpi_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS); - acpi_info->pci_min = pci_mem_start; - acpi_info->pci_len = pci_mem_end - pci_mem_start; - if ( pci_hi_mem_end > pci_hi_mem_start ) - { - acpi_info->pci_hi_min = pci_hi_mem_start; - acpi_info->pci_hi_len = pci_hi_mem_end - pci_hi_mem_start; - } - return; oom: diff --git a/tools/firmware/hvmloader/acpi/libacpi.h b/tools/firmware/hvmloader/acpi/libacpi.h new file mode 100644 index 0000000..5e0f400 --- /dev/null +++ b/tools/firmware/hvmloader/acpi/libacpi.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * libacpi.h + * + * libacpi interfaces + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * 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 Lesser General Public License for more details. + * + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + */ + + +#ifndef __LIBACPI_H__ +#define __LIBACPI_H__ + +#define ACPI_HAS_COM1 (1<<0) +#define ACPI_HAS_COM2 (1<<1) +#define ACPI_HAS_LPT1 (1<<2) +#define ACPI_HAS_HPET (1<<3) + +struct acpi_config { + const unsigned char *dsdt_anycpu; + unsigned int dsdt_anycpu_len; + const unsigned char *dsdt_15cpu; + unsigned int dsdt_15cpu_len; + + /* PCI I/O hole */ + uint32_t pci_start, pci_len; + uint64_t pci_hi_start, pci_hi_len; + + uint32_t table_flags; + + /* + * Address where acpi_info should be placed. + * This must match the OperationRegion(BIOS, SystemMemory, ....) + * definition in the DSDT + */ + unsigned int infop; + + /* RSDP address */ + unsigned int rsdp; +}; + +void acpi_build_tables(struct acpi_config *config); + +#endif /* __LIBACPI_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 1c8a71b..b4bcc93 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -23,7 +23,7 @@ #include "config.h" #include "smbios_types.h" -#include "acpi/acpi2_0.h" +#include "acpi/libacpi.h" #include "apic_regs.h" #include "../rombios/config.h" #include "util.h" diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c index 3d046fd..5c9a351 100644 --- a/tools/firmware/hvmloader/seabios.c +++ b/tools/firmware/hvmloader/seabios.c @@ -26,6 +26,7 @@ #include "smbios_types.h" #include "acpi/acpi2_0.h" +#include "acpi/libacpi.h" extern unsigned char dsdt_anycpu_qemu_xen[]; extern int dsdt_anycpu_qemu_xen_len; diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 9af29b1..7de2fb6 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -22,6 +22,7 @@ #include "hypercall.h" #include "ctype.h" #include "acpi/acpi2_0.h" +#include "acpi/libacpi.h" #include <stdint.h> #include <xen/xen.h> #include <xen/memory.h> @@ -860,7 +861,30 @@ int hpet_exists(unsigned long hpet_base) void hvmloader_acpi_build_tables(struct acpi_config *config, unsigned int physical) { - acpi_build_tables(config, physical); + /* Allocate and initialise the acpi info area. */ + mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); + + if ( uart_exists(0x3f8) ) + config->table_flags |= ACPI_HAS_COM1; + if ( uart_exists(0x2f8) ) + config->table_flags |= ACPI_HAS_COM2; + if ( lpt_exists(0x378) ) + config->table_flags |= ACPI_HAS_LPT1; + if ( hpet_exists(ACPI_HPET_ADDRESS) ) + config->table_flags |= ACPI_HAS_HPET; + + config->pci_start = pci_mem_start; + config->pci_len = pci_mem_end - pci_mem_start; + if ( pci_hi_mem_end > pci_hi_mem_start ) + { + config->pci_hi_start = pci_hi_mem_start; + config->pci_hi_len = pci_hi_mem_end - pci_hi_mem_start; + } + + config->rsdp = physical; + config->infop = ACPI_INFO_PHYSICAL_ADDRESS; + + acpi_build_tables(config); } /* -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |