From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46701) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJOVj-0008El-G2 for qemu-devel@nongnu.org; Thu, 05 Feb 2015 10:38:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJOVg-0000kr-7m for qemu-devel@nongnu.org; Thu, 05 Feb 2015 10:38:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42200) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJOVf-0000kg-US for qemu-devel@nongnu.org; Thu, 05 Feb 2015 10:38:28 -0500 Message-ID: <54D38E69.2080409@redhat.com> Date: Thu, 05 Feb 2015 17:38:17 +0200 From: Marcel Apfelbaum MIME-Version: 1.0 References: <1421938231-25698-1-git-send-email-imammedo@redhat.com> <1421938231-25698-39-git-send-email-imammedo@redhat.com> In-Reply-To: <1421938231-25698-39-git-send-email-imammedo@redhat.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [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: Igor Mammedov , qemu-devel@nongnu.org Cc: pbonzini@redhat.com, drjones@redhat.com, marcel.a@redhat.com, claudio.fontana@huawei.com, mst@redhat.com On 01/22/2015 04:50 PM, Igor Mammedov wrote: > 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; ^^^ I am sorry for repeating myself, the same for others 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); >