From patchwork Fri Apr 3 10:03:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shannon Zhao X-Patchwork-Id: 46751 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f71.google.com (mail-wg0-f71.google.com [74.125.82.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id CF918216D1 for ; Fri, 3 Apr 2015 10:11:51 +0000 (UTC) Received: by wgiv13 with SMTP id v13sf10314338wgi.3 for ; Fri, 03 Apr 2015 03:11:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:mime-version:content-type:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list; bh=jZ8oJ3wAXC5tA2fl9oTXF8LMklS+x7nQqy6Ri1TzbS4=; b=GFRCD4DsPdqPL61w7duosHwWdfzjjVZEpfqYf9MLvwkxYulbc81uWIP16T+qpl2MNE bjXrRArgej2NrRvtuH93z69I2Ns+xBwQ/UALtjiO0B66JdaIlr65BNvgitWa9TjkalN+ zh23BRgUzmiHNkdy1S6nMjdRki+8qXFJL/V//8LtNKDu+K25uStz6CKcGF5hbNDtN+5N JSt5s76RMZM6HjnPySVUxMppRJqbWLYXeDPbSXB7jU2XVSpUZrzpmanZl7XM42/8VyMj XpaxJoAoYF21cX1Etm/CrcXJrLA5xVc7HxIScTzqWu9cFxKFY+nzUYoc6szcgYdMCjc0 yk/A== X-Gm-Message-State: ALoCoQnqvrui1iMm66uEt+6xEBT1qByqnz7Na1+lIZWik8klHAxTmddWz3Uuno4pA9hRC69lw4c6 X-Received: by 10.180.150.115 with SMTP id uh19mr4157874wib.7.1428055911167; Fri, 03 Apr 2015 03:11:51 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.207.4 with SMTP id ls4ls314483lac.73.gmail; Fri, 03 Apr 2015 03:11:51 -0700 (PDT) X-Received: by 10.112.10.197 with SMTP id k5mr1559219lbb.86.1428055911005; Fri, 03 Apr 2015 03:11:51 -0700 (PDT) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com. [209.85.217.169]) by mx.google.com with ESMTPS id yj9si6339443lbb.100.2015.04.03.03.11.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Apr 2015 03:11:50 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.169 as permitted sender) client-ip=209.85.217.169; Received: by lboc7 with SMTP id c7so76356506lbo.1 for ; Fri, 03 Apr 2015 03:11:50 -0700 (PDT) X-Received: by 10.112.218.5 with SMTP id pc5mr1611392lbc.32.1428055910873; Fri, 03 Apr 2015 03:11:50 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.57.201 with SMTP id k9csp1860540lbq; Fri, 3 Apr 2015 03:11:50 -0700 (PDT) X-Received: by 10.140.234.142 with SMTP id f136mr1817951qhc.13.1428055909547; Fri, 03 Apr 2015 03:11:49 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id q104si7675180qgq.109.2015.04.03.03.11.48 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 03 Apr 2015 03:11:49 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Received: from localhost ([::1]:33320 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YdyZo-0002Cr-IU for patch@linaro.org; Fri, 03 Apr 2015 06:11:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38224) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YdyUU-0001eZ-5a for qemu-devel@nongnu.org; Fri, 03 Apr 2015 06:06:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YdyUP-000606-0J for qemu-devel@nongnu.org; Fri, 03 Apr 2015 06:06:18 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:9542) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YdyUO-0005iw-6R for qemu-devel@nongnu.org; Fri, 03 Apr 2015 06:06:12 -0400 Received: from 172.24.2.119 (EHLO szxeml425-hub.china.huawei.com) ([172.24.2.119]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id BDZ47786; Fri, 03 Apr 2015 18:05:50 +0800 (CST) Received: from HGHY1Z002260041.china.huawei.com (10.177.16.142) by szxeml425-hub.china.huawei.com (10.82.67.180) with Microsoft SMTP Server id 14.3.158.1; Fri, 3 Apr 2015 18:05:42 +0800 From: Shannon Zhao To: , , , , , , , , , , Date: Fri, 3 Apr 2015 18:03:38 +0800 Message-ID: <1428055432-12120-7-git-send-email-zhaoshenglong@huawei.com> X-Mailer: git-send-email 1.9.0.msysgit.0 In-Reply-To: <1428055432-12120-1-git-send-email-zhaoshenglong@huawei.com> References: <1428055432-12120-1-git-send-email-zhaoshenglong@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.16.142] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.551E65FE.00FC, ss=1, re=0.001, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 53b3ac5a7c844240cc5c1c769ee7d78f X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Cc: hangaohuai@huawei.com, shannon.zhao@linaro.org, peter.huangpeng@huawei.com, zhaoshenglong@huawei.com Subject: [Qemu-devel] [PATCH v4 06/20] hw/arm/virt-acpi-build: Generation of DSDT table for virt devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: patch@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.169 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 From: Shannon Zhao DSDT consists of the usual common table header plus a definition block in AML encoding which describes all devices in the platform. After initializing DSDT with header information the namespace is created which is followed by the device encodings. The devices are described using the Resource Template for the 32-Bit Fixed Memory Range and the Extended Interrupt Descriptors. Signed-off-by: Shannon Zhao Signed-off-by: Shannon Zhao --- hw/arm/virt-acpi-build.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 388838a..516c1d0 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -57,6 +57,139 @@ #define ACPI_BUILD_DPRINTF(fmt, ...) #endif +static void acpi_dsdt_add_cpus(Aml *scope, int max_cpus) +{ + Aml *dev, *crs; + int i; + char name[5]; + for (i = 0; i < max_cpus; i++) { + snprintf(name, 5, "CPU%u", i); + dev = aml_device("%s", name); + aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007"))); + aml_append(dev, aml_name_decl("_UID", aml_int(i))); + crs = aml_resource_template(); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); + } +} + +static void acpi_dsdt_add_uart(Aml *scope, const hwaddr *uart_addr, + const int *uart_irq) +{ + Aml *dev, *crs; + + dev = aml_device("COM0"); + aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0011"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0))); + + crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(uart_addr[0], uart_addr[1], 0x01)); + aml_append(crs, + aml_interrupt(0x01, *uart_irq + 32)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + +static void acpi_dsdt_add_rtc(Aml *scope, const hwaddr *rtc_addr, + const int *rtc_irq) +{ + Aml *dev, *crs; + + dev = aml_device("RTC0"); + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0013"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0))); + + crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(rtc_addr[0], rtc_addr[1], 0x01)); + aml_append(crs, + aml_interrupt(0x01, *rtc_irq + 32)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + +static void acpi_dsdt_add_flash(Aml *scope, const hwaddr *flash_addr) +{ + Aml *dev, *crs; + hwaddr base = flash_addr[0]; + hwaddr size = flash_addr[1]; + + dev = aml_device("FLS0"); + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0015"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0))); + + crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(base, size, 0x01)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); + + dev = aml_device("FLS1"); + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0015"))); + aml_append(dev, aml_name_decl("_UID", aml_int(1))); + crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(base + size, size, 0x01)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + +static void acpi_dsdt_add_virtio(Aml *scope, const hwaddr *mmio_addrs, + const int *mmio_irq, int num) +{ + Aml *dev, *crs; + hwaddr base = mmio_addrs[0]; + hwaddr size = mmio_addrs[1]; + int irq = *mmio_irq + 32; + int i; + char name[5]; + + for (i = 0; i < num; i++) { + snprintf(name, 5, "VR%02u", i); + dev = aml_device("%s", name); + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0005"))); + aml_append(dev, aml_name_decl("_UID", aml_int(i))); + + crs = aml_resource_template(); + aml_append(crs, + aml_memory32_fixed(base, size, 0x01)); + aml_append(crs, + aml_interrupt(0x01, irq + i)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); + base += size; + } +} + +/* DSDT */ +static void +build_dsdt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info) +{ + Aml *scope, *dsdt; + acpi_dsdt_info *info = guest_info->dsdt_info; + + dsdt = init_aml_allocator(); + /* Reserve space for header */ + acpi_data_push(dsdt->buf, sizeof(AcpiTableHeader)); + + scope = aml_scope("\\_SB"); + acpi_dsdt_add_cpus(scope, guest_info->max_cpus); + acpi_dsdt_add_uart(scope, info->uart_addr, info->uart_irq); + acpi_dsdt_add_rtc(scope, info->rtc_addr, info->rtc_irq); + acpi_dsdt_add_flash(scope, info->flash_addr); + acpi_dsdt_add_virtio(scope, info->virtio_mmio_addr, + info->virtio_mmio_irq, info->virtio_mmio_num); + + aml_append(dsdt, scope); + /* copy AML table into ACPI tables blob and patch header there */ + g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); + build_header(linker, table_data, + (void *)(table_data->data + table_data->len - dsdt->buf->len), + "DSDT", dsdt->buf->len, 1); + free_aml_allocator(); +} + typedef struct AcpiBuildState { /* Copy of table in RAM (for patching). */ @@ -72,6 +205,7 @@ static void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) { GArray *table_offsets; + GArray *tables_blob = tables->table_data; table_offsets = g_array_new(false, true /* clear */, sizeof(uint32_t)); @@ -89,6 +223,9 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) * DSDT */ + /* DSDT is pointed to by FADT */ + build_dsdt(tables_blob, tables->linker, guest_info); + /* Cleanup memory that's no longer used. */ g_array_free(table_offsets, true); }