From: "Michael S. Tsirkin" <mst@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: drjones@redhat.com, zhaoshenglong@huawei.com,
claudio.fontana@huawei.com, qemu-devel@nongnu.org,
marcel.a@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3 01/52] acpi: introduce AML composer aml_append()
Date: Tue, 17 Feb 2015 20:12:16 +0100 [thread overview]
Message-ID: <20150217191216.GA29473@redhat.com> (raw)
In-Reply-To: <20150217185011.437bf89d@nial.brq.redhat.com>
On Tue, Feb 17, 2015 at 06:50:11PM +0100, Igor Mammedov wrote:
> On Tue, 17 Feb 2015 17:26:16 +0100
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
>
> > On Mon, Feb 09, 2015 at 10:53:23AM +0000, Igor Mammedov wrote:
> > > Adds for dynamic AML creation, which will be used
> > > for piecing ASL/AML primitives together and hiding
> > > from user/caller details about how nested context
> > > should be closed/packed leaving less space for
> > > mistakes and necessity to know how AML should be
> > > encoded, allowing user to concentrate on ASL
> > > representation instead.
> > >
> > > For example it will allow to create AML like this:
> > >
> > > init_aml_allocator();
> > > ...
> > > Aml *scope = aml_scope("PCI0")
> > > Aml *dev = aml_device("PM")
> > > aml_append(dev, aml_name_decl("_ADR", aml_int(addr)))
> > > aml_append(scope, dev);
> > > ...
> > > free_aml_allocator();
> > >
> > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > ---
> > > hw/acpi/aml-build.c | 91 +++++++++++++++++++++++++++++++++++++++++++++
> > > hw/i386/acpi-build.c | 1 -
> > > include/hw/acpi/aml-build.h | 61 ++++++++++++++++++++++++++++++
> > > 3 files changed, 152 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> > > index bcb288e..096f347 100644
> > > --- a/hw/acpi/aml-build.c
> > > +++ b/hw/acpi/aml-build.c
> > > @@ -25,6 +25,8 @@
> > > #include <stdbool.h>
> > > #include <string.h>
> > > #include "hw/acpi/aml-build.h"
> > > +#include "qemu/bswap.h"
> > > +#include "hw/acpi/bios-linker-loader.h"
> > >
> > > GArray *build_alloc_array(void)
> > > {
> > > @@ -257,3 +259,92 @@ void build_append_int(GArray *table, uint32_t value)
> > > build_append_value(table, value, 4);
> > > }
> > > }
> > > +
> > > +static GPtrArray *alloc_list;
> > > +
> > > +static Aml *aml_alloc(void)
> > > +{
> > > + Aml *var = g_new0(typeof(*var), 1);
> > > +
> > > + g_ptr_array_add(alloc_list, var);
> > > + var->block_flags = AML_HELPER;
> > > + var->buf = build_alloc_array();
> > > + return var;
> > > +}
> > > +
> > > +static void aml_free(gpointer data)
> > > +{
> > > + Aml *var = data;
> > > + build_free_array(var->buf);
> > > +}
> > > +
> > > +Aml *init_aml_allocator(GArray *linker)
> > > +{
> > > + Aml *var;
> > > +
> > > + assert(!alloc_list);
> > > + alloc_list = g_ptr_array_new_with_free_func(aml_free);
> > > + var = aml_alloc();
> > > + var->linker = linker;
> > > + return var;
> > > +}
> > > +
> > > +void free_aml_allocator(void)
> > > +{
> > > + g_ptr_array_free(alloc_list, true);
> > > + alloc_list = 0;
> > > +}
> > > +
> > > +static void build_buffer(GArray *array, uint8_t op)
> > > +{
> > > + GArray *data = build_alloc_array();
> > > +
> > > + build_append_int(data, array->len);
> > > + g_array_prepend_vals(array, data->data, data->len);
> > > + build_free_array(data);
> > > + build_package(array, op);
> > > +}
> > > +
> > > +void aml_append(Aml *parent_ctx, Aml *child)
> > > +{
> > > + switch (child->block_flags) {
> > > + case AML_NON_BLOCK:
> > > + build_append_byte(parent_ctx->buf, child->op);
> > > + break;
> > > + case AML_EXT_PACKAGE:
> > > + build_extop_package(child->buf, child->op);
> > > + break;
> > > + case AML_PACKAGE:
> > > + build_package(child->buf, child->op);
> > > + break;
> > > + case AML_RES_TEMPLATE:
> > > + build_append_byte(child->buf, 0x79); /* EndTag */
> > > + /*
> > > + * checksum operations is treated as succeeded if checksum
> > > + * field is zero. [ACPI Spec 5.0, 6.4.2.9 End Tag]
> > > + */
> > > + build_append_byte(child->buf, 0);
> > > + /* fall through, to pack resources in buffer */
> > > + case AML_BUFFER:
> > > + build_buffer(child->buf, child->op);
> > > + break;
> > > + case AML_DEF_BLOCK: {
> >
> > This one is inelegant.
> > It's not a definition block, and the patching and
> it's definition block according to spec.
definition block is not an AML thing, is it?
It's an ASL construct I think.
AML calls them tables, e.g.:
20.2.1 Table and Table Header Encoding
> > manual offset calculation are scary.
> it's the same thing as every user of build_header does every time,
> so it's less scary compared to build_header and done only in one
> place so user won't ever have to care about offsets.
We have different definitions of scary.
C structures is the standard way to lay out memory.
> >
> > > + uint8_t *start = (uint8_t *)parent_ctx->buf->data +
> > > + parent_ctx->buf->len;
> > > + uint32_t le32_len = cpu_to_le32(child->buf->len);
> > > +
> > > + /* create linker entry for the DefinitionBlock */
> > > + bios_linker_loader_add_checksum(parent_ctx->linker,
> > > + ACPI_BUILD_TABLE_FILE,
> >
> > Hard-coding file name here is very ugly.
> > All this does not belong in this file, this
> > is fw cfg interface.
> It's but, it's the only one file and so far we don't have
> plans to extend it and it does the same thing as build_header()
So just call build_header.
>
> >
> >
> > > + parent_ctx->buf->data,
> > > + start, child->buf->len, start + 9 /* checksum offset */);
> > > +
> > > + /* set DefinitionBlock length at TableLength offset*/
> > > + memcpy(child->buf->data + 4, &le32_len, sizeof le32_len);
> >
> >
> > This make no sense.
> > In AML, there are no objects which are higher level
> > than the table.
> >
> > So for now, please just leave this alone:
> > drop linker completely, keep table_data
> > a simple GArray, not AML, and reuse build_header
> > to fill in headers.
> >
> > This way this file just deals with AML and ACPI spec.
> Using build_header() is problematic for 2 reasons:
> 1. it has to be done backwards,
> i.e. one has to reserve space for header first,
> than add content and then call build_header
> to patch header with current length and table definition data
>
> 2. when using build_header() user has to calculate offsets and lengths
> manually every time.
It's not easy to use, but it's not too hard either.
As there's a single instance now,
let's merge the rest, we'll work on a cleaner interface
for build_header.
this is not it.
> While using aml_def_block() process is quite straightforward
> and follows the declarative flow as it is in ASL,
> which less confusing and error-prone, like:
>
> ssdt = aml_def_block(...);
> // add content to ssdt
> aml_append(tables_blob, ssdt);
>
> so hiding linker from user in this case makes usage simpler
> and more harder to screw up, which is the whole point of
> introducing this API.
>
> I have a further plans to make other tables use
> aml_def_block and get rid of acpi_add_table() which is also
> confusing and simplify RSDT building doing it transparently
> for user.
>
> That way both ARM and i386 targets would reuse the same code
> /API instead of re-implementing it in every target.
> User will just get complete tables blob from API and
> put it in respective fw_cfg file.
> I also wish that we have had only one file for ACPI tables
> (including RSDP) but ship already went away, maybe we can do
> it for ARM though.
Unlikely.
> PS:
> My secret goal is to bury linker and use it only when one
> have to do so :), seriously.
You are doing too many things at once.
We need a minimal patchset to start merging your work.
so drop this part please, just use build_header.
> >
> >
> > > + break;
> > > + }
> > > + default:
> >
> > This should assert.
> sure
>
> >
> > > + break;
> > > + }
> > > + build_append_array(parent_ctx->buf, child->buf);
> > > +}
> > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > > index 6d84f38..237080f 100644
> > > --- a/hw/i386/acpi-build.c
> > > +++ b/hw/i386/acpi-build.c
> > > @@ -258,7 +258,6 @@ static void acpi_get_pci_info(PcPciInfo *info)
> > > #define ACPI_BUILD_APPNAME6 "BOCHS "
> > > #define ACPI_BUILD_APPNAME4 "BXPC"
> > >
> > > -#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
> > > #define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp"
> > > #define ACPI_BUILD_TPMLOG_FILE "etc/tpm/log"
> > >
> > > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> > > index 199f003..4033796 100644
> > > --- a/include/hw/acpi/aml-build.h
> > > +++ b/include/hw/acpi/aml-build.h
> > > @@ -5,6 +5,67 @@
> > > #include <glib.h>
> > > #include "qemu/compiler.h"
> > >
> > > +#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
> > > +
> > > +typedef enum {
> > > + AML_HELPER = 0,
> > > + AML_NON_BLOCK,
> > > + AML_PACKAGE,
> > > + AML_EXT_PACKAGE,
> > > + AML_BUFFER,
> > > + AML_RES_TEMPLATE,
> > > + AML_DEF_BLOCK,
> > > +} AmlBlockFlags;
> > > +
> > > +struct Aml {
> > > + GArray *buf;
> > > +
> > > + /*< private >*/
> > > + uint8_t op;
> > > + AmlBlockFlags block_flags;
> > > + GArray *linker;
> > > +};
> > > +typedef struct Aml Aml;
> > > +
> > > +/**
> > > + * init_aml_allocator:
> > > + * @linker: linker that used by API for registering ACPI tables
> > > + * with linker firmware interfac
> > > + *
> > > + * Called for initializing API allocator which allow to use
> > > + * AML API.
> > > + * Returns: toplevel container which accumulates all other
> > > + * ACPI tables.
> > > + */
> > > +Aml *init_aml_allocator(GArray *linker);
> > > +
> > > +/**
> > > + * free_aml_allocator:
> > > + *
> > > + * Releases all elements used by AML API, frees associated memory
> > > + * and invalidates AML allocator. After this call @init_aml_allocator
> > > + * should be called again if AML API is to be used again.
> > > + */
> > > +void free_aml_allocator(void);
> > > +
> > > +/**
> > > + * aml_append:
> > > + * @parent_ctx: context to which @child element is added
> > > + * @child: element that is copied into @parent_ctx context
> > > + *
> > > + * Joins Aml elements together and helps to construct AML tables
> > > + * Examle of usage:
> > > + * Aml *table = aml_def_block("SSDT", ...);
> > > + * Aml *sb = aml_scope("\_SB");
> > > + * Aml *dev = aml_device("PCI0");
> > > + *
> > > + * aml_append(dev, aml_name_decl("HID", aml_eisaid("PNP0A03")));
> > > + * aml_append(sb, dev);
> > > + * aml_append(table, sb);
> > > + */
> > > +void aml_append(Aml *parent_ctx, Aml *child);
> > > +
> > > +/* other helpers */
> > > GArray *build_alloc_array(void);
> > > void build_free_array(GArray *array);
> > > void build_prepend_byte(GArray *array, uint8_t val);
> > > --
> > > 1.8.3.1
> >
next prev parent reply other threads:[~2015-02-17 19:12 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-09 10:53 [Qemu-devel] [PATCH v3 00/52] ACPI refactoring: replace template patching with C AML API Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 01/52] acpi: introduce AML composer aml_append() Igor Mammedov
2015-02-17 16:26 ` Michael S. Tsirkin
2015-02-17 17:50 ` Igor Mammedov
2015-02-17 19:12 ` Michael S. Tsirkin [this message]
2015-02-17 19:46 ` Michael S. Tsirkin
2015-02-18 8:50 ` Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 02/52] pc: acpi: use local var for accessing ACPI tables blob in acpi_build() Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 03/52] pc: acpi: make top level ACPI tables blob Aml* Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 04/52] acpi: factor out ACPI const int packing out of build_append_value() Igor Mammedov
2015-02-17 19:53 ` Michael S. Tsirkin
2015-02-18 9:41 ` Igor Mammedov
2015-02-18 13:51 ` Michael S. Tsirkin
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 05/52] acpi: add aml_def_block() term Igor Mammedov
2015-02-17 16:35 ` Michael S. Tsirkin
2015-02-17 16:47 ` Igor Mammedov
2015-02-17 19:03 ` Michael S. Tsirkin
2015-02-18 10:47 ` Igor Mammedov
2015-02-18 11:36 ` Michael S. Tsirkin
2015-02-17 19:15 ` Michael S. Tsirkin
2015-02-18 9:50 ` Igor Mammedov
2015-02-18 11:35 ` Michael S. Tsirkin
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 06/52] pc: acpi-build: use aml_def_block() for declaring SSDT table Igor Mammedov
2015-02-17 16:42 ` Michael S. Tsirkin
2015-02-18 9:57 ` Igor Mammedov
2015-02-18 11:39 ` Michael S. Tsirkin
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 07/52] acpi: add aml_scope() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 08/52] pc: acpi-build: use aml_scope() for \_SB scope Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 09/52] acpi: add aml_device() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 10/52] acpi: add aml_method() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 11/52] acpi: add aml_if() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 12/52] acpi: add aml_name() & aml_name_decl() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 13/52] acpi: extend build_append_{value|int}() to support 64-bit values Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 14/52] acpi: add aml_int() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 15/52] acpi: add aml_return() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 16/52] acpi: add aml_arg() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 17/52] acpi: add aml_store() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 18/52] acpi: add aml_and() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 19/52] acpi: add aml_notify() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 20/52] acpi: add aml_call1(), aml_call2(), aml_call3(), aml_call4() helpers Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 21/52] pc: acpi-build: drop template patching and create PCI bus tree dynamically Igor Mammedov
2015-02-17 19:39 ` Michael S. Tsirkin
2015-02-18 10:00 ` Igor Mammedov
2015-02-18 10:42 ` Igor Mammedov
2015-02-18 11:38 ` Michael S. Tsirkin
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 22/52] acpi: add aml_package() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 23/52] pc: acpi-build: drop unsupported PM1b_CNT.SLP_TYP Igor Mammedov
2015-02-17 16:41 ` Michael S. Tsirkin
2015-02-18 10:03 ` Igor Mammedov
2015-02-18 12:41 ` Michael S. Tsirkin
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 24/52] pc: acpi-build: generate _S[345] packages dynamically Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 25/52] acpi: add aml_buffer() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 26/52] acpi: add aml_resource_template() helper Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 27/52] acpi: add aml_io() helper Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 28/52] acpi: include PkgLength size only when requested Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 29/52] acpi: add aml_operation_region() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 30/52] acpi: add aml_field() & aml_named_field() terms Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 31/52] acpi: add aml_local() term Igor Mammedov
2015-02-17 12:18 ` Michael S. Tsirkin
2015-02-17 14:06 ` Igor Mammedov
2015-02-17 14:24 ` [Qemu-devel] [PATCH v3 31/52] fixup! " Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 32/52] acpi: add aml_string() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 33/52] pc: acpi-build: generate pvpanic device description dynamically Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 34/52] acpi: add aml_varpackage() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 35/52] acpi: add aml_equal() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 36/52] acpi: add aml_processor() term Igor Mammedov
2015-02-09 10:53 ` [Qemu-devel] [PATCH v3 37/52] acpi: add aml_eisaid() term Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 38/52] pc: acpi-build: drop template patching and CPU hotplug objects dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 39/52] pc: acpi-build: create CPU hotplug IO region dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 40/52] acpi: add aml_reserved_field() term Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 41/52] pc: acpi-build: drop template patching and memory hotplug objects dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 42/52] pc: acpi-build: create memory hotplug IO region dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 43/52] acpi: add aml_word_bus_number(), aml_word_io(), aml_dword_memory(), aml_qword_memory() terms Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 44/52] pc: pcihp: expose MMIO base and len as properties Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 45/52] pc: acpi-build: reserve PCIHP MMIO resources Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 46/52] pc: acpi-build: create PCI0._CRS dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 47/52] pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block() Igor Mammedov
2015-02-17 16:44 ` Michael S. Tsirkin
2015-02-18 10:09 ` Igor Mammedov
2015-02-18 13:13 ` Michael S. Tsirkin
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 48/52] acpi: add acpi_irq_no_flags() term Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 49/52] pc: export applesmc IO port/len Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 50/52] pc: acpi-build: drop template patching and create Device(SMC) dynamically Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 51/52] pc: acpi-build: update [q35-]acpi-dsdt.hex.generated due to moved SMC Igor Mammedov
2015-02-09 10:54 ` [Qemu-devel] [PATCH v3 52/52] acpi: make build_*() routines static to aml-build.c Igor Mammedov
2015-02-17 16:47 ` [Qemu-devel] [PATCH v3 00/52] ACPI refactoring: replace template patching with C AML API Michael S. Tsirkin
2015-02-17 17:51 ` Igor Mammedov
2015-02-17 19:14 ` Michael S. Tsirkin
2015-02-18 10:35 ` Igor Mammedov
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=20150217191216.GA29473@redhat.com \
--to=mst@redhat.com \
--cc=claudio.fontana@huawei.com \
--cc=drjones@redhat.com \
--cc=imammedo@redhat.com \
--cc=marcel.a@redhat.com \
--cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).