From: "Alex Bennée" <alex.bennee@linaro.org>
To: Shannon Zhao <zhaoshenglong@huawei.com>
Cc: peter.maydell@linaro.org, hangaohuai@huawei.com, mst@redhat.com,
a.spyridakis@virtualopensystems.com, claudio.fontana@huawei.com,
qemu-devel@nongnu.org, peter.huangpeng@huawei.com,
hanjun.guo@linaro.org, imammedo@redhat.com, pbonzini@redhat.com,
lersek@redhat.com, christoffer.dall@linaro.org,
shannon.zhao@linaro.org
Subject: Re: [Qemu-devel] [PATCH v6 03/22] hw/arm/virt-acpi-build: Basic framework for building ACPI tables on ARM
Date: Thu, 07 May 2015 11:50:18 +0100 [thread overview]
Message-ID: <871tisek5x.fsf@linaro.org> (raw)
In-Reply-To: <1430990964-10528-4-git-send-email-zhaoshenglong@huawei.com>
Shannon Zhao <zhaoshenglong@huawei.com> writes:
> From: Shannon Zhao <shannon.zhao@linaro.org>
>
> Introduce a preliminary framework in virt-acpi-build.c with the main
> ACPI build functions. It exposes the generated ACPI contents to
> guest over fw_cfg.
>
> The required ACPI v5.1 tables for ARM are:
> - RSDP: Initial table that points to XSDT
> - RSDT: Points to FADT GTDT MADT tables
> - FADT: Generic information about the machine
> - GTDT: Generic timer description table
> - MADT: Multiple APIC description table
> - DSDT: Holds all information about system devices/peripherals, pointed by FADT
>
> Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> ---
> hw/arm/Makefile.objs | 1 +
> hw/arm/virt-acpi-build.c | 184 +++++++++++++++++++++++++++++++++++++++
> include/hw/arm/virt-acpi-build.h | 70 +++++++++++++++
> qemu-options.hx | 2 +-
> trace-events | 3 +
> 5 files changed, 259 insertions(+), 1 deletion(-)
> create mode 100644 hw/arm/virt-acpi-build.c
> create mode 100644 include/hw/arm/virt-acpi-build.h
>
> diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
> index 2577f68..a1bfb19 100644
> --- a/hw/arm/Makefile.objs
> +++ b/hw/arm/Makefile.objs
> @@ -3,6 +3,7 @@ obj-$(CONFIG_DIGIC) += digic_boards.o
> obj-y += integratorcp.o kzm.o mainstone.o musicpal.o nseries.o
> obj-y += omap_sx1.o palm.o realview.o spitz.o stellaris.o
> obj-y += tosa.o versatilepb.o vexpress.o virt.o xilinx_zynq.o z2.o
> +obj-$(CONFIG_ACPI) += virt-acpi-build.o
> obj-y += netduino2.o
>
> obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> new file mode 100644
> index 0000000..960206d
> --- /dev/null
> +++ b/hw/arm/virt-acpi-build.c
> @@ -0,0 +1,184 @@
> +/* Support for generating ACPI tables and passing them to Guests
> + *
> + * ARM virt ACPI generation
> + *
> + * Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
> + * Copyright (C) 2006 Fabrice Bellard
> + * Copyright (C) 2013 Red Hat Inc
> + *
> + * Author: Michael S. Tsirkin <mst@redhat.com>
> + *
> + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD.
> + *
> + * Author: Shannon Zhao <zhaoshenglong@huawei.com>
> + *
> + * 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/>.
> + */
> +
> +#include "hw/arm/virt-acpi-build.h"
> +#include <stddef.h>
> +#include <glib.h>
> +#include "qemu-common.h"
> +#include "qemu/bitmap.h"
> +#include "trace.h"
> +#include "qom/cpu.h"
> +#include "target-arm/cpu.h"
> +#include "hw/acpi/acpi-defs.h"
> +#include "hw/acpi/acpi.h"
> +#include "hw/nvram/fw_cfg.h"
> +#include "hw/acpi/bios-linker-loader.h"
> +#include "hw/loader.h"
> +#include "hw/hw.h"
> +#include "hw/acpi/aml-build.h"
> +
> +typedef
> +struct AcpiBuildState {
> + /* Copy of table in RAM (for patching). */
> + MemoryRegion *table_mr;
> + MemoryRegion *rsdp_mr;
> + MemoryRegion *linker_mr;
> + /* Is table patched? */
> + uint8_t patched;
I missed this last time but a uint8_t seems excessive if a bool will do
(using true/false and VMSTATE_BOOL later on).
Otherwise:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> + VirtGuestInfo *guest_info;
> +} AcpiBuildState;
> +
> +static
> +void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
> +{
> + GArray *table_offsets;
> +
> + table_offsets = g_array_new(false, true /* clear */,
> + sizeof(uint32_t));
> +
> + bios_linker_loader_alloc(tables->linker, ACPI_BUILD_TABLE_FILE,
> + 64, false /* high memory */);
> +
> + /*
> + * The ACPI v5.1 tables for Hardware-reduced ACPI platform are:
> + * RSDP
> + * RSDT
> + * FADT
> + * GTDT
> + * MADT
> + * DSDT
> + */
> +
> + /* Cleanup memory that's no longer used. */
> + g_array_free(table_offsets, true);
> +}
> +
> +static void acpi_ram_update(MemoryRegion *mr, GArray *data)
> +{
> + uint32_t size = acpi_data_len(data);
> +
> + /* Make sure RAM size is correct - in case it got changed
> + * e.g. by migration */
> + memory_region_ram_resize(mr, size, &error_abort);
> +
> + memcpy(memory_region_get_ram_ptr(mr), data->data, size);
> + memory_region_set_dirty(mr, 0, size);
> +}
> +
> +static void virt_acpi_build_update(void *build_opaque, uint32_t offset)
> +{
> + AcpiBuildState *build_state = build_opaque;
> + AcpiBuildTables tables;
> +
> + /* No state to update or already patched? Nothing to do. */
> + if (!build_state || build_state->patched) {
> + return;
> + }
> + build_state->patched = 1;
> +
> + acpi_build_tables_init(&tables);
> +
> + virt_acpi_build(build_state->guest_info, &tables);
> +
> + acpi_ram_update(build_state->table_mr, tables.table_data);
> + acpi_ram_update(build_state->rsdp_mr, tables.rsdp);
> + acpi_ram_update(build_state->linker_mr, tables.linker);
> +
> +
> + acpi_build_tables_cleanup(&tables, true);
> +}
> +
> +static void virt_acpi_build_reset(void *build_opaque)
> +{
> + AcpiBuildState *build_state = build_opaque;
> + build_state->patched = 0;
> +}
> +
> +static MemoryRegion *acpi_add_rom_blob(AcpiBuildState *build_state,
> + GArray *blob, const char *name,
> + uint64_t max_size)
> +{
> + return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1,
> + name, virt_acpi_build_update, build_state);
> +}
> +
> +static const VMStateDescription vmstate_virt_acpi_build = {
> + .name = "virt_acpi_build",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .fields = (VMStateField[]) {
> + VMSTATE_UINT8(patched, AcpiBuildState),
> + VMSTATE_END_OF_LIST()
> + },
> +};
> +
> +void virt_acpi_setup(VirtGuestInfo *guest_info)
> +{
> + AcpiBuildTables tables;
> + AcpiBuildState *build_state;
> +
> + if (!guest_info->fw_cfg) {
> + trace_virt_acpi_setup();
> + return;
> + }
> +
> + if (!acpi_enabled) {
> + trace_virt_acpi_setup();
> + return;
> + }
> +
> + build_state = g_malloc0(sizeof *build_state);
> + build_state->guest_info = guest_info;
> +
> + acpi_build_tables_init(&tables);
> + virt_acpi_build(build_state->guest_info, &tables);
> +
> + /* Now expose it all to Guest */
> + build_state->table_mr = acpi_add_rom_blob(build_state, tables.table_data,
> + ACPI_BUILD_TABLE_FILE,
> + ACPI_BUILD_TABLE_MAX_SIZE);
> + assert(build_state->table_mr != NULL);
> +
> + build_state->linker_mr =
> + acpi_add_rom_blob(build_state, tables.linker, "etc/table-loader", 0);
> +
> + fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
> + tables.tcpalog->data, acpi_data_len(tables.tcpalog));
> +
> + build_state->rsdp_mr = acpi_add_rom_blob(build_state, tables.rsdp,
> + ACPI_BUILD_RSDP_FILE, 0);
> +
> + qemu_register_reset(virt_acpi_build_reset, build_state);
> + virt_acpi_build_reset(build_state);
> + vmstate_register(NULL, 0, &vmstate_virt_acpi_build, build_state);
> +
> + /* Cleanup tables but don't free the memory: we track it
> + * in build_state.
> + */
> + acpi_build_tables_cleanup(&tables, false);
> +}
> diff --git a/include/hw/arm/virt-acpi-build.h b/include/hw/arm/virt-acpi-build.h
> new file mode 100644
> index 0000000..ece67a2
> --- /dev/null
> +++ b/include/hw/arm/virt-acpi-build.h
> @@ -0,0 +1,70 @@
> +/*
> + *
> + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD.
> + *
> + * Author: Shannon Zhao <zhaoshenglong@huawei.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2 or later, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope 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/>.
> + */
> +
> +#ifndef QEMU_VIRT_ACPI_BUILD_H
> +#define QEMU_VIRT_ACPI_BUILD_H
> +
> +#include "qemu-common.h"
> +
> +typedef struct MemMap {
> + hwaddr addr;
> + hwaddr size;
> +} MemMap;
> +
> +typedef struct AcpiGtdtInfo {
> + uint32_t timer_virt;
> + uint32_t timer_s_el1;
> + uint32_t timer_ns_el1;
> + uint32_t timer_ns_el2;
> +} AcpiGtdtInfo;
> +
> +typedef struct AcpiMadtInfo {
> + const MemMap *gic_cpu_memmap;
> + const MemMap *gic_dist_memmap;
> +} AcpiMadtInfo;
> +
> +typedef struct AcpiDsdtInfo {
> + const MemMap *uart_memmap;
> + const int *uart_irq;
> + const MemMap *virtio_mmio_memmap;
> + const int *virtio_mmio_irq;
> + int virtio_mmio_num;
> + const MemMap *rtc_memmap;
> + const int *rtc_irq;
> + const MemMap *flash_memmap;
> +} AcpiDsdtInfo;
> +
> +typedef struct VirtGuestInfo {
> + int smp_cpus;
> + int max_cpus;
> + FWCfgState *fw_cfg;
> + AcpiMadtInfo *madt_info;
> + AcpiDsdtInfo *dsdt_info;
> + AcpiGtdtInfo *gtdt_info;
> +} VirtGuestInfo;
> +
> +
> +typedef struct VirtGuestInfoState {
> + VirtGuestInfo info;
> + Notifier machine_done;
> +} VirtGuestInfoState;
> +
> +void virt_acpi_setup(VirtGuestInfo *guest_info);
> +
> +#endif
> diff --git a/qemu-options.hx b/qemu-options.hx
> index ec356f6..030c14f 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1352,7 +1352,7 @@ be needed to boot from old floppy disks.
> ETEXI
>
> DEF("no-acpi", 0, QEMU_OPTION_no_acpi,
> - "-no-acpi disable ACPI\n", QEMU_ARCH_I386)
> + "-no-acpi disable ACPI\n", QEMU_ARCH_I386 | QEMU_ARCH_ARM)
> STEXI
> @item -no-acpi
> @findex -no-acpi
> diff --git a/trace-events b/trace-events
> index 30eba92..0c7d2ff 100644
> --- a/trace-events
> +++ b/trace-events
> @@ -1590,3 +1590,6 @@ i8257_unregistered_dma(int nchan, int dma_pos, int dma_len) "unregistered DMA ch
> cpu_set_state(int cpu_index, uint8_t state) "setting cpu %d state to %" PRIu8
> cpu_halt(int cpu_index) "halting cpu %d"
> cpu_unhalt(int cpu_index) "unhalting cpu %d"
> +
> +# hw/arm/virt-acpi-build.c
> +virt_acpi_setup(void) "No fw cfg or ACPI disabled. Bailing out."
--
Alex Bennée
next prev parent reply other threads:[~2015-05-07 10:49 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-07 9:29 [Qemu-devel] [PATCH v6 00/22] Generate ACPI v5.1 tables and expose them to guest over fw_cfg on ARM Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 01/22] hw/i386: Move ACPI header definitions in an arch-independent location Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 02/22] hw/i386/acpi-build: move generic acpi building helpers into dedictated file Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 03/22] hw/arm/virt-acpi-build: Basic framework for building ACPI tables on ARM Shannon Zhao
2015-05-07 10:50 ` Alex Bennée [this message]
2015-05-08 1:51 ` Shannon Zhao
2015-05-07 15:44 ` Peter Maydell
2015-05-08 1:46 ` Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 04/22] hw/acpi/aml-build: Add aml_memory32_fixed() term Shannon Zhao
2015-05-07 12:18 ` Alex Bennée
2015-05-15 12:15 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 05/22] hw/acpi/aml-build: Add aml_interrupt() term Shannon Zhao
2015-05-07 15:51 ` Peter Maydell
2015-05-08 2:24 ` Shannon Zhao
2015-05-15 12:14 ` Igor Mammedov
2015-05-18 4:05 ` Shannon Zhao
2015-05-18 10:33 ` Michael S. Tsirkin
2015-05-19 12:02 ` Igor Mammedov
2015-05-15 12:45 ` Igor Mammedov
2015-05-18 4:00 ` Shannon Zhao
2015-05-18 10:34 ` Michael S. Tsirkin
2015-05-19 12:09 ` Igor Mammedov
2015-05-20 4:09 ` Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 06/22] hw/arm/virt-acpi-build: Generation of DSDT table for virt devices Shannon Zhao
2015-05-18 8:09 ` Alex Bennée
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 07/22] hw/arm/virt-acpi-build: Generate FADT table and update ACPI headers Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 08/22] hw/arm/virt-acpi-build: Generate MADT table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 09/22] hw/arm/virt-acpi-build: Generate GTDT table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 10/22] hw/arm/virt-acpi-build: Generate RSDT table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 11/22] hw/arm/virt-acpi-build: Generate RSDP table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 12/22] hw/arm/virt-acpi-build: Add PCIe info and generate MCFG table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 13/22] hw/acpi/aml-build: Make aml_buffer() definition consistent with the spec Shannon Zhao
2015-05-15 13:08 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 14/22] hw/acpi/aml-build: Add ToUUID macro Shannon Zhao
2015-05-15 13:19 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 15/22] hw/acpi/aml-build: Add aml_or() term Shannon Zhao
2015-05-15 13:23 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 16/22] hw/acpi/aml-build: Add aml_lnot() term Shannon Zhao
2015-05-15 13:24 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 17/22] hw/acpi/aml-build: Add aml_else() term Shannon Zhao
2015-05-15 13:26 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 18/22] hw/acpi/aml-build: Add aml_create_dword_field() term Shannon Zhao
2015-05-15 13:30 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 19/22] hw/acpi/aml-build: Add aml_dword_io() term Shannon Zhao
2015-05-15 13:43 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 20/22] hw/acpi/aml-build: Add Unicode macro Shannon Zhao
2015-05-15 14:13 ` Igor Mammedov
2015-05-18 6:05 ` Shannon Zhao
2015-05-19 12:19 ` Igor Mammedov
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 21/22] hw/arm/virt-acpi-build: Add PCIe controller in ACPI DSDT table Shannon Zhao
2015-05-07 9:29 ` [Qemu-devel] [PATCH v6 22/22] hw/arm/virt: Enable dynamic generation of ACPI v5.1 tables Shannon Zhao
2015-05-07 16:09 ` Peter Maydell
2015-05-08 8:21 ` Shannon Zhao
2015-05-07 16:34 ` [Qemu-devel] [PATCH v6 00/22] Generate ACPI v5.1 tables and expose them to guest over fw_cfg on ARM Peter Maydell
2015-05-08 9:48 ` Shannon Zhao
2015-05-08 15:39 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871tisek5x.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=a.spyridakis@virtualopensystems.com \
--cc=christoffer.dall@linaro.org \
--cc=claudio.fontana@huawei.com \
--cc=hangaohuai@huawei.com \
--cc=hanjun.guo@linaro.org \
--cc=imammedo@redhat.com \
--cc=lersek@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.huangpeng@huawei.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=shannon.zhao@linaro.org \
--cc=zhaoshenglong@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.