From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YgS22-0007Mn-8R for qemu-devel@nongnu.org; Fri, 10 Apr 2015 02:03:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YgS1y-0004Ol-6l for qemu-devel@nongnu.org; Fri, 10 Apr 2015 02:03:10 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:65018) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YgS1x-0004Nu-KR for qemu-devel@nongnu.org; Fri, 10 Apr 2015 02:03:06 -0400 Message-ID: <55276724.4050005@huawei.com> Date: Fri, 10 Apr 2015 14:01:08 +0800 From: Shannon Zhao MIME-Version: 1.0 References: <1428055432-12120-1-git-send-email-zhaoshenglong@huawei.com> <1428055432-12120-10-git-send-email-zhaoshenglong@huawei.com> <878ue11niu.fsf@linaro.org> In-Reply-To: <878ue11niu.fsf@linaro.org> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v4 09/20] hw/arm/virt-acpi-build: Generate GTDT table List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?QWxleCBCZW5uw6ll?= 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 On 2015/4/9 20:42, Alex Bennée wrote: > > Shannon Zhao writes: > >> From: Shannon Zhao >> >> ACPI v5.1 defines GTDT for ARM devices as a place to describe timer >> related information in the system. The Arch Timer interrupts must >> be provided for GTDT. >> >> Signed-off-by: Shannon Zhao >> Signed-off-by: Shannon Zhao >> --- >> hw/arm/virt-acpi-build.c | 30 ++++++++++++++++++++++++++++++ >> include/hw/acpi/acpi-defs.h | 37 +++++++++++++++++++++++++++++++++++++ >> 2 files changed, 67 insertions(+) >> >> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c >> index c8245ef..a7aba75 100644 >> --- a/hw/arm/virt-acpi-build.c >> +++ b/hw/arm/virt-acpi-build.c >> @@ -176,6 +176,33 @@ static void acpi_dsdt_add_virtio(Aml *scope, const hwaddr *mmio_addrs, >> } >> } >> >> +/* GTDT */ >> +static void >> +build_gtdt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info) >> +{ >> + int gtdt_start = table_data->len; >> + const struct acpi_gtdt_info *info = guest_info->gtdt_info; >> + AcpiGenericTimerTable *gtdt; >> + >> + gtdt = acpi_data_push(table_data, sizeof *gtdt); >> + /* The interrupt values are the same with the device tree when adding 16 */ >> + gtdt->secure_el1_interrupt = info->timer_s_el1; >> + gtdt->secure_el1_flags = ACPI_EDGE_SENSITIVE; >> + >> + gtdt->non_secure_el1_interrupt = info->timer_ns_el1; >> + gtdt->non_secure_el1_flags = ACPI_EDGE_SENSITIVE; >> + >> + gtdt->virtual_timer_interrupt = info->timer_virt; >> + gtdt->virtual_timer_flags = ACPI_EDGE_SENSITIVE; >> + >> + gtdt->non_secure_el2_interrupt = info->timer_ns_el2; >> + gtdt->non_secure_el2_flags = ACPI_EDGE_SENSITIVE; >> + >> + build_header(linker, table_data, >> + (void *)(table_data->data + gtdt_start), "GTDT", >> + table_data->len - gtdt_start, 1); >> +} >> + >> /* MADT */ >> static void >> build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info, >> @@ -318,6 +345,9 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) >> acpi_add_table(table_offsets, tables_blob); >> build_madt(tables_blob, tables->linker, guest_info, &cpuinfo); >> >> + acpi_add_table(table_offsets, tables_blob); >> + build_gtdt(tables_blob, tables->linker, guest_info); >> + >> /* Cleanup memory that's no longer used. */ >> g_array_free(table_offsets, true); >> } >> diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h >> index e343728..ee40a5e 100644 >> --- a/include/hw/acpi/acpi-defs.h >> +++ b/include/hw/acpi/acpi-defs.h >> @@ -318,6 +318,43 @@ struct AcpiMadtGenericDistributor { >> typedef struct AcpiMadtGenericDistributor AcpiMadtGenericDistributor; >> >> /* >> + * Generic Timer Description Table (GTDT) >> + */ >> + >> +#define ACPI_GTDT_INTERRUPT_MODE (1) > > (1 << 0) would be consistent > Ok >> +#define ACPI_GTDT_INTERRUPT_POLARITY (1<<1) >> +#define ACPI_GTDT_ALWAYS_ON (1<<2) > > Also spaces (n << m) > will fix. >> + >> +/* Triggering */ >> + >> +#define ACPI_LEVEL_SENSITIVE (uint8_t) 0x00 >> +#define ACPI_EDGE_SENSITIVE (uint8_t) 0x01 >> + >> +/* Polarity */ >> + >> +#define ACPI_ACTIVE_HIGH (uint8_t) 0x00 >> +#define ACPI_ACTIVE_LOW (uint8_t) 0x01 >> +#define ACPI_ACTIVE_BOTH (uint8_t) 0x02 > > I'd wrap those cast defines, e.g: > > #define ACPI_ACTIVE_BOTH ((uint8_t) 0x02) > Ok, will fix. Thanks. >> + >> +struct AcpiGenericTimerTable { >> + ACPI_TABLE_HEADER_DEF >> + uint64_t counter_block_addresss; >> + uint32_t reserved; >> + uint32_t secure_el1_interrupt; >> + uint32_t secure_el1_flags; >> + uint32_t non_secure_el1_interrupt; >> + uint32_t non_secure_el1_flags; >> + uint32_t virtual_timer_interrupt; >> + uint32_t virtual_timer_flags; >> + uint32_t non_secure_el2_interrupt; >> + uint32_t non_secure_el2_flags; >> + uint64_t counter_read_block_address; >> + uint32_t platform_timer_count; >> + uint32_t platform_timer_offset; >> +} QEMU_PACKED; >> +typedef struct AcpiGenericTimerTable AcpiGenericTimerTable; >> + >> +/* >> * HPET Description Table >> */ >> struct Acpi20Hpet { >