From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57085) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YfrNL-0007Pb-Nj for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:54:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YfrNH-00073X-Lt for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:54:43 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:60793 helo=socrates.bennee.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YfrNH-000727-Fw for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:54:39 -0400 References: <1428055432-12120-1-git-send-email-zhaoshenglong@huawei.com> <1428055432-12120-5-git-send-email-zhaoshenglong@huawei.com> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1428055432-12120-5-git-send-email-zhaoshenglong@huawei.com> Date: Wed, 08 Apr 2015 15:54:45 +0100 Message-ID: <871tju4qmi.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v4 04/20] hw/acpi/aml-build: Add aml_memory32_fixed() term List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Shannon Zhao Cc: peter.maydell@linaro.org, hangaohuai@huawei.com, mst@redhat.com, a.spyridakis@virtualopensystems.com, msalter@redhat.com, claudio.fontana@huawei.com, qemu-devel@nongnu.org, peter.huangpeng@huawei.com, hanjun.guo@linaro.org, imammedo@redhat.com, pbonzini@redhat.com, lersek@redhat.com, christoffer.dall@linaro.org, shannon.zhao@linaro.org Shannon Zhao writes: > From: Shannon Zhao > > Add aml_memory32_fixed() for describing device mmio region in resource template. > These can be used to generating DSDT table for ACPI on ARM. > > Signed-off-by: Shannon Zhao > Signed-off-by: Shannon Zhao > --- > hw/acpi/aml-build.c | 22 ++++++++++++++++++++++ > include/hw/acpi/aml-build.h | 1 + > 2 files changed, 23 insertions(+) > > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index 8d01959..fefe7c7 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -505,6 +505,28 @@ Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4) > return var; > } > > +/* > + * ACPI 1.0: 6.4.3.4 Memory32Fixed (Memory Resource Descriptor Macro) > + */ > +Aml *aml_memory32_fixed(uint64_t addr, uint64_t size, uint8_t rw_flag) > +{ > + Aml *var = aml_alloc(); This is more aimed at the ACPI maintainers but I wonder if there should be an aml_alloc_sized that pre-allocates the GArray? Otherwise we spend a lot of time realloc'ing while building these entries up. Or even a varidac build_append_bytes? > + build_append_byte(var->buf, 0x86); /* Memory32Fixed Resource Descriptor */ > + build_append_byte(var->buf, 9); /* Length, bits[7:0] value = 9 */ > + build_append_byte(var->buf, 0); /* Length, bits[15:8] value = 0 */ > + build_append_byte(var->buf, rw_flag); /* Write status, 1 rw 0 ro */ > + build_append_byte(var->buf, addr & 0xff); /* Range base address bits[7:0] */ > + build_append_byte(var->buf, (addr >> 8) & 0xff); /* Range base address bits[15:8] */ > + build_append_byte(var->buf, (addr >> 16) & 0xff); /* Range base address bits[23:16] */ > + build_append_byte(var->buf, (addr >> 24) & 0xff); /* Range base > address bits[31:24] */ I'm should point out we have handy utility functions for bit fiddling: build_append_byte(var->buf, extract64(addr, 8, 8)); /* Range base address bits[15:8] */ > + > + build_append_byte(var->buf, size & 0xff); /* Range length bits[7:0] */ > + build_append_byte(var->buf, (size >> 8) & 0xff); /* Range length bits[15:8] */ > + build_append_byte(var->buf, (size >> 16) & 0xff); /* Range length bits[23:16] */ > + build_append_byte(var->buf, (size >> 24) & 0xff); /* Range length > bits[31:24] */ Hmm we seem to have two 64 bit inputs which we only use 32 bits worth of. Maybe the prototype should be fixed to avoid accidents of accidentally passing in 64 bit values. > + return var; > +} > + > /* ACPI 1.0b: 6.4.2.5 I/O Port Descriptor */ > Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base, > uint8_t aln, uint8_t len) > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index 1705001..baa0652 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -162,6 +162,7 @@ Aml *aml_call1(const char *method, Aml *arg1); > Aml *aml_call2(const char *method, Aml *arg1, Aml *arg2); > Aml *aml_call3(const char *method, Aml *arg1, Aml *arg2, Aml *arg3); > Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4); > +Aml *aml_memory32_fixed(uint64_t addr, uint64_t size, uint8_t rw_flag); > Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base, > uint8_t aln, uint8_t len); > Aml *aml_operation_region(const char *name, AmlRegionSpace rs, -- Alex Bennée