From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48779) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YEJ6o-0003uE-FT for qemu-devel@nongnu.org; Thu, 22 Jan 2015 09:51:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YEJ6j-0003mB-6M for qemu-devel@nongnu.org; Thu, 22 Jan 2015 09:51:46 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54828) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YEJ6i-0003ly-V1 for qemu-devel@nongnu.org; Thu, 22 Jan 2015 09:51:41 -0500 From: Igor Mammedov Date: Thu, 22 Jan 2015 14:50:22 +0000 Message-Id: <1421938231-25698-39-git-send-email-imammedo@redhat.com> In-Reply-To: <1421938231-25698-1-git-send-email-imammedo@redhat.com> References: <1421938231-25698-1-git-send-email-imammedo@redhat.com> Subject: [Qemu-devel] [PATCH v2 38/47] acpi: add acpi_word_bus_number(), acpi_word_io(), acpi_dword_memory(), acpi_qword_memory() terms List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, drjones@redhat.com, marcel.a@redhat.com, claudio.fontana@huawei.com, mst@redhat.com Signed-off-by: Igor Mammedov --- 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; +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); -- 1.8.3.1