mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
acpi: introduce AML composer aml_append()
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> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e0d2be2ad6
commit
0f2707e4e7
2 changed files with 133 additions and 0 deletions
|
@ -5,6 +5,61 @@
|
|||
#include <glib.h>
|
||||
#include "qemu/compiler.h"
|
||||
|
||||
typedef enum {
|
||||
AML_NO_OPCODE = 0,/* has only data */
|
||||
AML_OPCODE, /* has opcode optionally followed by data */
|
||||
AML_PACKAGE, /* has opcode and uses PkgLength for its length */
|
||||
AML_EXT_PACKAGE, /* ame as AML_PACKAGE but also has 'ExOpPrefix' */
|
||||
AML_BUFFER, /* data encoded as 'DefBuffer' */
|
||||
AML_RES_TEMPLATE, /* encoded as ResourceTemplate macro */
|
||||
} AmlBlockFlags;
|
||||
|
||||
struct Aml {
|
||||
GArray *buf;
|
||||
|
||||
/*< private >*/
|
||||
uint8_t op;
|
||||
AmlBlockFlags block_flags;
|
||||
};
|
||||
typedef struct Aml Aml;
|
||||
|
||||
/**
|
||||
* init_aml_allocator:
|
||||
*
|
||||
* Called for initializing API allocator which allow to use
|
||||
* AML API.
|
||||
* Returns: toplevel container which accumulates all other
|
||||
* AML elements for a table.
|
||||
*/
|
||||
Aml *init_aml_allocator(void);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue