On Thu, 05 Feb 2015 17:38:17 +0200 Marcel Apfelbaum <mar...@redhat.com> wrote:
> On 01/22/2015 04:50 PM, Igor Mammedov wrote: > > Signed-off-by: Igor Mammedov <imamm...@redhat.com> > > --- > > hw/acpi/acpi-build-utils.c | 143 > > +++++++++++++++++++++++++++++++++++++ > > include/hw/acpi/acpi-build-utils.h | 73 +++++++++++++++++++ > > 2 files changed, 216 insertions(+) > > > > diff --git a/hw/acpi/acpi-build-utils.c b/hw/acpi/acpi-build-utils.c > > index 644af1f..b19d370 100644 > > --- a/hw/acpi/acpi-build-utils.c > > +++ b/hw/acpi/acpi-build-utils.c > > @@ -700,3 +700,146 @@ AcpiAml acpi_eisaid(const char *str) > > build_append_value(var.buf, bswap32(id), sizeof(id)); > > return var; > > } > > + > > +/* ACPI 5.0: 6.4.3.5.3 Word Address Space Descriptor */ > > +static AcpiAml > > +acpi_as_desc_header(acpiResourceType type, acpiMinFixed min_fixed, > > + acpiMaxFixed max_fixed, acpiDecode dec, uint8_t > > type_flags) > > +{ > > + uint8_t flags = max_fixed | min_fixed | dec; > > + AcpiAml var = aml_allocate_internal(0, NON_BLOCK); > > + > > + build_append_byte(var.buf, type); > > + build_append_byte(var.buf, flags); > > + build_append_byte(var.buf, type_flags); /* Type Specific Flags */ > > + return var; > > +} > > + > > +/* ACPI 5.0: 6.4.3.5.3 Word Address Space Descriptor */ > > +static AcpiAml acpi_word_as_desc(acpiResourceType type, acpiMinFixed > > min_fixed, > > + acpiMaxFixed max_fixed, acpiDecode dec, > > + uint16_t addr_gran, uint16_t addr_min, > > + uint16_t addr_max, uint16_t addr_trans, > > + uint16_t len, uint8_t type_flags) > > +{ > > + AcpiAml var = aml_allocate_internal(0, NON_BLOCK); > > + > > + build_append_byte(var.buf, 0x88); /* Word Address Space Descriptor */ > > + /* minimum length since we do not encode optional fields */ > > + build_append_byte(var.buf, 0x0D); > > + build_append_byte(var.buf, 0x0); > > + > > + aml_append(&var, > > + acpi_as_desc_header(type, min_fixed, max_fixed, dec, type_flags)); > > + build_append_value(var.buf, addr_gran, sizeof(addr_gran)); > > + build_append_value(var.buf, addr_min, sizeof(addr_min)); > > + build_append_value(var.buf, addr_max, sizeof(addr_max)); > > + build_append_value(var.buf, addr_trans, sizeof(addr_trans)); > > + build_append_value(var.buf, len, sizeof(len)); > > + return var; > > +} > > + > > +/* ACPI 5.0: 6.4.3.5.2 DWord Address Space Descriptor */ > > +static AcpiAml acpi_dword_as_desc(acpiResourceType type, acpiMinFixed > > min_fixed, > > + acpiMaxFixed max_fixed, acpiDecode dec, > > + uint32_t addr_gran, uint32_t addr_min, > > + uint32_t addr_max, uint32_t addr_trans, > > + uint32_t len, uint8_t type_flags) > > +{ > > + AcpiAml var = aml_allocate_internal(0, NON_BLOCK); > > + > > + build_append_byte(var.buf, 0x87); /* DWord Address Space Descriptor */ > > + /* minimum length since we do not encode optional fields */ > > + build_append_byte(var.buf, 23); > > + build_append_byte(var.buf, 0x0); > > + > > + > > + aml_append(&var, > > + acpi_as_desc_header(type, min_fixed, max_fixed, dec, type_flags)); > > + build_append_value(var.buf, addr_gran, sizeof(addr_gran)); > > + build_append_value(var.buf, addr_min, sizeof(addr_min)); > > + build_append_value(var.buf, addr_max, sizeof(addr_max)); > > + build_append_value(var.buf, addr_trans, sizeof(addr_trans)); > > + build_append_value(var.buf, len, sizeof(len)); > > + return var; > > +} > > + > > +/* ACPI 5.0: 6.4.3.5.1 QWord Address Space Descriptor */ > > +static AcpiAml acpi_qword_as_desc(acpiResourceType type, acpiMinFixed > > min_fixed, > > + acpiMaxFixed max_fixed, acpiDecode dec, > > + uint64_t addr_gran, uint64_t addr_min, > > + uint64_t addr_max, uint64_t addr_trans, > > + uint64_t len, uint8_t type_flags) > > +{ > > + AcpiAml var = aml_allocate_internal(0, NON_BLOCK); > > + > > + build_append_byte(var.buf, 0x8A); /* QWord Address Space Descriptor */ > > + /* minimum length since we do not encode optional fields */ > > + build_append_byte(var.buf, 0x2B); > > + build_append_byte(var.buf, 0x0); > > + > > + aml_append(&var, > > + acpi_as_desc_header(type, min_fixed, max_fixed, dec, type_flags)); > > + build_append_value(var.buf, addr_gran, sizeof(addr_gran)); > > + build_append_value(var.buf, addr_min, sizeof(addr_min)); > > + build_append_value(var.buf, addr_max, sizeof(addr_max)); > > + build_append_value(var.buf, addr_trans, sizeof(addr_trans)); > > + build_append_value(var.buf, len, sizeof(len)); > > + return var; > > +} > > + > > +/* > > + * ACPI 5.0: 19.5.141 WordBusNumber (Word Bus Number Resource Descriptor > > Macro) > > + */ > > +AcpiAml acpi_word_bus_number(acpiMinFixed min_fixed, acpiMaxFixed > > max_fixed, > > + acpiDecode dec, uint16_t addr_gran, > > + uint16_t addr_min, uint16_t addr_max, > > + uint16_t addr_trans, uint16_t len) > > + > > +{ > > + return acpi_word_as_desc(acpi_bus_number_range, min_fixed, max_fixed, > > dec, > > + addr_gran, addr_min, addr_max, addr_trans, > > len, 0); > > +} > > + > > +/* ACPI 5.0: 19.5.142 WordIO (Word IO Resource Descriptor Macro) */ > > +AcpiAml acpi_word_io(acpiMinFixed min_fixed, acpiMaxFixed max_fixed, > > + acpiDecode dec, acpiISARanges isa_ranges, > > + uint16_t addr_gran, uint16_t addr_min, > > + uint16_t addr_max, uint16_t addr_trans, > > + uint16_t len) > > + > > +{ > > + return acpi_word_as_desc(acpi_io_range, min_fixed, max_fixed, dec, > > + addr_gran, addr_min, addr_max, addr_trans, > > len, > > + isa_ranges); > > +} > > + > > +/* ACPI 5.0: 19.5.34 DWordMemory (DWord Memory Resource Descriptor Macro) > > */ > > +AcpiAml acpi_dword_memory(acpiDecode dec, acpiMinFixed min_fixed, > > + acpiMaxFixed max_fixed, acpiCacheble cacheable, > > + acpiReadAndWrite read_and_write, > > + uint32_t addr_gran, uint32_t addr_min, > > + uint32_t addr_max, uint32_t addr_trans, > > + uint32_t len) > > +{ > > + uint8_t flags = read_and_write | (cacheable << 1); > > + > > + return acpi_dword_as_desc(acpi_memory_range, min_fixed, max_fixed, > > + dec, addr_gran, addr_min, addr_max, > > + addr_trans, len, flags); > > +} > > + > > +/* ACPI 5.0: 19.5.102 QWordMemory (QWord Memory Resource Descriptor Macro) > > */ > > +AcpiAml acpi_qword_memory(acpiDecode dec, acpiMinFixed min_fixed, > > + acpiMaxFixed max_fixed, acpiCacheble cacheable, > > + acpiReadAndWrite read_and_write, > > + uint64_t addr_gran, uint64_t addr_min, > > + uint64_t addr_max, uint64_t addr_trans, > > + uint64_t len) > > +{ > > + uint8_t flags = read_and_write | (cacheable << 1); > > + > > + return acpi_qword_as_desc(acpi_memory_range, min_fixed, max_fixed, > > + dec, addr_gran, addr_min, addr_max, > > + addr_trans, len, flags); > > +} > > diff --git a/include/hw/acpi/acpi-build-utils.h > > b/include/hw/acpi/acpi-build-utils.h > > index 048ed26..5e8db3d 100644 > > --- a/include/hw/acpi/acpi-build-utils.h > > +++ b/include/hw/acpi/acpi-build-utils.h > > @@ -38,6 +38,58 @@ typedef enum { > > acpi_system_io = 0x01, > > } acpiRegionSpace; > ^^^ > I am sorry for repeating myself, the same for others Thanks, fixed > > Thanks, > Marcel > > > > +typedef enum { > > + acpi_memory_range = 0, > > + acpi_io_range = 1, > > + acpi_bus_number_range = 2, > > +} acpiResourceType; > > + > > +typedef enum { > > + acpi_sub_decode = 1 << 1, > > + acpi_pos_decode = 0 > > +} acpiDecode; > > + > > +typedef enum { > > + acpi_max_fixed = 1 << 3, > > + acpi_max_not_fixed = 0, > > +} acpiMaxFixed; > > + > > +typedef enum { > > + acpi_min_fixed = 1 << 2, > > + acpi_min_not_fixed = 0 > > +} acpiMinFixed; > > + > > +/* > > + * ACPI 5.0: Table 6-185 I/O Resource Flag (Resource Type = 1) Definitions > > + * _RNG field definition > > + */ > > +typedef enum { > > + acpi_isa_only = 1, > > + acpi_non_isa_only = 2, > > + acpi_entire_range = 3, > > +} acpiISARanges; > > + > > +/* > > + * ACPI 5.0: Table 6-184 Memory Resource Flag (Resource Type = 0) > > Definitions > > + * _MEM field definition > > + */ > > +typedef enum { > > + acpi_non_cacheable = 0, > > + acpi_cacheable = 1, > > + acpi_write_combining = 2, > > + acpi_prefetchable = 3, > > +} acpiCacheble; > > + > > +/* > > + * ACPI 5.0: Table 6-184 Memory Resource Flag (Resource Type = 0) > > Definitions > > + * _RW field definition > > + */ > > +typedef enum { > > + acpi_ReadOnly = 0, > > + acpi_ReadWrite = 1, > > +} acpiReadAndWrite; > > + > > + > > void aml_append(AcpiAml *parent_ctx, AcpiAml child); > > > > /* non block ASL object primitives */ > > @@ -71,6 +123,27 @@ AcpiAml GCC_FMT_ATTR(4, 5) > > acpi_processor(uint8_t proc_id, uint32_t pblk_addr, uint8_t pblk_len, > > const char *name_format, ...); > > AcpiAml acpi_eisaid(const char *str); > > +AcpiAml acpi_word_bus_number(acpiMinFixed min_fixed, acpiMaxFixed > > max_fixed, > > + acpiDecode dec, uint16_t addr_gran, > > + uint16_t addr_min, uint16_t addr_max, > > + uint16_t addr_trans, uint16_t len); > > +AcpiAml acpi_word_io(acpiMinFixed min_fixed, acpiMaxFixed max_fixed, > > + acpiDecode dec, acpiISARanges isa_ranges, > > + uint16_t addr_gran, uint16_t addr_min, > > + uint16_t addr_max, uint16_t addr_trans, > > + uint16_t len); > > +AcpiAml acpi_dword_memory(acpiDecode dec, acpiMinFixed min_fixed, > > + acpiMaxFixed max_fixed, acpiCacheble cacheable, > > + acpiReadAndWrite read_and_write, > > + uint32_t addr_gran, uint32_t addr_min, > > + uint32_t addr_max, uint32_t addr_trans, > > + uint32_t len); > > +AcpiAml acpi_qword_memory(acpiDecode dec, acpiMinFixed min_fixed, > > + acpiMaxFixed max_fixed, acpiCacheble cacheable, > > + acpiReadAndWrite read_and_write, > > + uint64_t addr_gran, uint64_t addr_min, > > + uint64_t addr_max, uint64_t addr_trans, > > + uint64_t len); > > > > /* Block ASL object primitives */ > > AcpiAml acpi_if(AcpiAml predicate); > > >