From patchwork Tue Nov 17 09:40:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shannon Zhao X-Patchwork-Id: 56753 Delivered-To: patch@linaro.org Received: by 10.112.155.196 with SMTP id vy4csp1828052lbb; Tue, 17 Nov 2015 01:50:17 -0800 (PST) X-Received: by 10.31.179.85 with SMTP id c82mr2644326vkf.25.1447753816648; Tue, 17 Nov 2015 01:50:16 -0800 (PST) Return-Path: Received: from lists.xen.org (lists.xenproject.org. [50.57.142.19]) by mx.google.com with ESMTPS id j84si2033239vki.23.2015.11.17.01.50.16 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 17 Nov 2015 01:50:16 -0800 (PST) Received-SPF: neutral (google.com: 50.57.142.19 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=50.57.142.19; Authentication-Results: mx.google.com; spf=neutral (google.com: 50.57.142.19 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dkim=neutral (body hash did not verify) header.i=@linaro-org.20150623.gappssmtp.com Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Zycsl-0008FS-3W; Tue, 17 Nov 2015 09:48:59 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Zycsi-0008Cc-Ou for xen-devel@lists.xen.org; Tue, 17 Nov 2015 09:48:57 +0000 Received: from [85.158.137.68] by server-15.bemta-3.messagelabs.com id 7C/08-12946-708FA465; Tue, 17 Nov 2015 09:48:55 +0000 X-Env-Sender: shannon.zhao@linaro.org X-Msg-Ref: server-11.tower-31.messagelabs.com!1447753735!3662820!1 X-Originating-IP: [74.125.82.53] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 7.19.2; banners=-,-,- X-VirusChecked: Checked Received: (qmail 29215 invoked from network); 17 Nov 2015 09:48:55 -0000 Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com) (74.125.82.53) by server-11.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 17 Nov 2015 09:48:55 -0000 Received: by wmec201 with SMTP id c201so218148452wme.0 for ; Tue, 17 Nov 2015 01:48:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/roq5rhWG7KQ6dMDkUl+yugwO8HhNFPIYrHZCqatLk8=; b=dzaozNFxwYN2RyRfvxM9fIFJN8qk8KF3drunKuWuvyd9eJUskBMBKBCdU567RU1UVy Ej3L+YNXefHeMkS2fAPvl4KKHnz1sBccFzvJGefPNiqcBLhzSfRSCOMdDTbsARN70A6j 6zUANDUYGMJx8IwSkDLfFVTj0NFvtA/64R/9CRJpY8AtDI1UGVTpDBg13dOLmOMJHGN/ MB3PzGTITwHUU4a2IeZad0y8sO1qYERhDLKKtSxqhyA/8XcfPBlwFHBiF9wEVkWYjZnR Qxk2AB5cIcnzg2VH1o8CPv6+hy+rk6+rLIG/yr3QVNpIzfPO36P41+cB5njx0+Rsdkod 2t3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/roq5rhWG7KQ6dMDkUl+yugwO8HhNFPIYrHZCqatLk8=; b=l/i9D2otPOu76BxTCbK+lmQoCm0Q21QS6KDc50U1fFZkC0qd85dNExseis7cuIvVdV AE9SF9oI7AbJJUhwkL5U+GyS1RHqq4Cl/vUtQQn3hdOyuopwVEW9C0B/r2x1IMK2UtJP lakQ2aMkl0Ov0OlVySlmE1JjZrcVkgoHNf/FDd+T3upsRkAdjfCBoGvccUmsDsu3437b m8bIm2ZfIDT9NxIk/r+PE1xlb9Rcml2jIfTXCZKk25tjwLYlFfCvoBOCQBQCI0cOdRtQ ws20f8fHOxIm/oY7N0SlpVd0t9XhVURIAMxzj7trk7LYIuDrpYqqd9R01ZiXTZ1vO0xF l83Q== X-Gm-Message-State: ALoCoQm/dcTw6gjhgUVeTYTUyH6+3DvsnjFKg9CT5G9kXF8JnV4/BTrPxbgdTSbS/vJznGFcRm8T X-Received: by 10.28.17.7 with SMTP id 7mr1390953wmr.45.1447753735021; Tue, 17 Nov 2015 01:48:55 -0800 (PST) Received: from localhost ([78.129.251.54]) by smtp.gmail.com with ESMTPSA id h67sm22957610wmf.17.2015.11.17.01.48.52 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 17 Nov 2015 01:48:54 -0800 (PST) From: shannon.zhao@linaro.org To: ian.campbell@citrix.com, stefano.stabellini@citrix.com, keir@xen.org, jbeulich@suse.com, andrew.cooper3@citrix.com, julien.grall@citrix.com, xen-devel@lists.xen.org Date: Tue, 17 Nov 2015 17:40:53 +0800 Message-Id: <1447753261-7552-55-git-send-email-shannon.zhao@linaro.org> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1447753261-7552-1-git-send-email-shannon.zhao@linaro.org> References: <1447753261-7552-1-git-send-email-shannon.zhao@linaro.org> Cc: mark.rutland@arm.com, hangaohuai@huawei.com, ard.biesheuvel@linaro.org, shannon.zhao@linaro.org, christoffer.dall@linaro.org, peter.huangpeng@huawei.com, david.vrabel@citrix.com, zhaoshenglong@huawei.com, linux-arm-kernel@lists.infradead.org, roger.pau@citrix.com Subject: [Xen-devel] [PATCH v3 54/62] arm/acpi: Create min DT stub for Dom0 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org From: Shannon Zhao Create a DT for Dom0 for ACPI-case only. DT contains minimal required informations such as Dom0 bootargs, initrd, efi description table and address of uefi memory table. Signed-off-by: Naresh Bhat Signed-off-by: Parth Dixit Signed-off-by: Shannon Zhao --- xen/arch/arm/domain_build.c | 142 ++++++++++++++++++++++++++++++++++++++++++++ xen/common/efi/boot.c | 47 +++++++++++++++ xen/include/asm-arm/setup.h | 2 + 3 files changed, 191 insertions(+) -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 55f85b4..6d8536b 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1358,6 +1358,144 @@ static int prepare_dtb(struct domain *d, struct kernel_info *kinfo) #ifdef CONFIG_ACPI #define XEN_HYPERVISOR_ID 0x000058656E564D4D /* "XenVMM" */ +#define ACPI_DOM0_FDT_MIN_SIZE 4096 + +static int make_chosen_node(const struct kernel_info *kinfo, + struct membank tbl_add[]) +{ + int res; + const char *bootargs = NULL; + const struct bootmodule *mod = kinfo->kernel_bootmodule; + void *fdt = kinfo->fdt; + + DPRINT("Create chosen node\n"); + res = fdt_begin_node(fdt, "chosen"); + if ( res ) + return res; + + if ( mod && mod->cmdline[0] ) + { + bootargs = &mod->cmdline[0]; + res = fdt_property(fdt, "bootargs", bootargs, strlen(bootargs) + 1); + if ( res ) + return res; + } + + /* + * If the bootloader provides an initrd, we must create a placeholder + * for the initrd properties. The values will be replaced later. + */ + if ( mod && mod->size ) + { + u64 a = 0; + res = fdt_property(kinfo->fdt, "linux,initrd-start", &a, sizeof(a)); + if ( res ) + return res; + + res = fdt_property(kinfo->fdt, "linux,initrd-end", &a, sizeof(a)); + if ( res ) + return res; + } + + res = fdt_end_node(fdt); + + return res; +} + +static int acpi_make_hypervisor_node(const struct kernel_info *kinfo, + struct membank tbl_add[]) +{ + const char compat[] = + "xen,xen-"__stringify(XEN_VERSION)"."__stringify(XEN_SUBVERSION)"\0" + "xen,xen"; + int res; + /* Convenience alias */ + void *fdt = kinfo->fdt; + + DPRINT("Create hypervisor node\n"); + + /* See linux Documentation/devicetree/bindings/arm/xen.txt */ + res = fdt_begin_node(fdt, "hypervisor"); + if ( res ) + return res; + + /* Cannot use fdt_property_string due to embedded nulls */ + res = fdt_property(fdt, "compatible", compat, sizeof(compat)); + if ( res ) + return res; + + res = arm_acpi_make_efi_nodes(fdt, tbl_add); + if ( res ) + return res; + + res = fdt_end_node(fdt); + + return res; +} + +/* + * Prepare a minimal DTB for Dom0 which contains bootargs, initrd, memory + * information, EFI table. + */ +static int create_acpi_dtb(struct kernel_info *kinfo, struct membank tbl_add[]) +{ + int new_size; + int ret; + + DPRINT("Prepare a min DTB for DOM0\n"); + + /* Allocate min size for DT */ + new_size = ACPI_DOM0_FDT_MIN_SIZE; + kinfo->fdt = xmalloc_bytes(new_size); + + if ( kinfo->fdt == NULL ) + return -ENOMEM; + + /* Create a new empty DT for DOM0 */ + ret = fdt_create(kinfo->fdt, new_size); + if ( ret < 0 ) + goto err; + + ret = fdt_finish_reservemap(kinfo->fdt); + if ( ret < 0 ) + goto err; + + ret = fdt_begin_node(kinfo->fdt, "/"); + if ( ret < 0 ) + goto err; + + ret = fdt_property_cell(kinfo->fdt, "#address-cells", 2); + if ( ret ) + return ret; + + ret = fdt_property_cell(kinfo->fdt, "#size-cells", 1); + if ( ret ) + return ret; + + /* Create a chosen node for DOM0 */ + ret = make_chosen_node(kinfo, tbl_add); + if ( ret ) + goto err; + + ret = acpi_make_hypervisor_node(kinfo, tbl_add); + if ( ret ) + goto err; + + ret = fdt_end_node(kinfo->fdt); + if ( ret < 0 ) + goto err; + + ret = fdt_finish(kinfo->fdt); + if ( ret < 0 ) + goto err; + + return 0; + + err: + printk("Device tree generation failed (%d).\n", ret); + xfree(kinfo->fdt); + return -EINVAL; +} static void acpi_map_rest_tables(struct domain *d) { @@ -1755,6 +1893,10 @@ static int prepare_acpi(struct domain *d, struct kernel_info *kinfo) return rc; } + rc = create_acpi_dtb(kinfo, tbl_add); + if ( rc != 0 ) + return rc; + return 0; } #else diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index ff2faed..d233cef 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -1304,6 +1304,53 @@ void __init acpi_create_efi_mmap_table(paddr_t paddr, void *efi_acpi_table, memory_map[offset].Attribute = EFI_MEMORY_WB; } } + +/* Create place holder for efi values. */ +int __init arm_acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]) +{ + u64 fdt_val64; + u32 fdt_val32; + int desc_ver = mdesc_ver; + int res; + + res = fdt_begin_node(fdt, "uefi"); + if ( res ) + return res; + + fdt_val64 = cpu_to_fdt64(tbl_add[TBL_EFIT].start); + res = fdt_property(fdt, "xen,uefi-system-table", + &fdt_val64, sizeof(fdt_val64)); + if ( res ) + return res; + + fdt_val64 = cpu_to_fdt64(tbl_add[TBL_MMAP].start); + res = fdt_property(fdt, "xen,uefi-mmap-start", + &fdt_val64, sizeof(fdt_val64)); + if ( res ) + return res; + + fdt_val32 = cpu_to_fdt32(tbl_add[TBL_MMAP].size); + res = fdt_property(fdt, "xen,uefi-mmap-size", + &fdt_val32, sizeof(fdt_val32)); + if ( res ) + return res; + + fdt_val32 = cpu_to_fdt32(sizeof(EFI_MEMORY_DESCRIPTOR)); + res = fdt_property(fdt, "xen,uefi-mmap-desc-size", + &fdt_val32, sizeof(fdt_val32)); + if ( res ) + return res; + + fdt_val32 = cpu_to_fdt32(desc_ver); + res = fdt_property(fdt, "xen,uefi-mmap-desc-ver", + &fdt_val32, sizeof(fdt_val32)); + if ( res ) + return res; + + res = fdt_end_node(fdt); + + return res; +} #endif #ifndef CONFIG_ARM /* TODO - runtime service support */ diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index 35447ee..c4cf5ea 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -60,6 +60,8 @@ void acpi_create_efi_mmap_table(paddr_t paddr, void *efi_acpi_table, const struct meminfo *mem, struct membank tbl_add[]); +int arm_acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]); + int construct_dom0(struct domain *d); void discard_initial_modules(void);