From patchwork Tue Aug 20 15:21:10 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 19356 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f198.google.com (mail-vc0-f198.google.com [209.85.220.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 9278C25E11 for ; Tue, 20 Aug 2013 15:22:25 +0000 (UTC) Received: by mail-vc0-f198.google.com with SMTP id ht10sf527180vcb.9 for ; Tue, 20 Aug 2013 08:22:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-gm-message-state:delivered-to:from:to:cc:subject :date:message-id:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-unsubscribe; bh=GzGbqwnwc0rf2Ohy2b+ykfpCawe6LVJlbpxVb3IL45E=; b=HL44+rQFinS98GQHZU08EOv+frZIQQ2QfoyzkyR1i4Rhj1JY6Gr/wIJKd+i1bKKc8A 3ZY7rNAQ3lD33mL4fgIH2S+voOox2ICsMKtT98pm13SDn1wcxUWjRz8gnPIwmjkx0cDp ZgRWwhGtHJOAfLVQw/OuOSg70Y2PRWXtsIfxVvOxCpKpp9bZj4j4Hsl/P+80yMXoczX9 7OqMFG8caeoJt4cigdmbLqYIGhEUDMd7I2AfYyCcsQOKycsVtYgwvkpX/midMar3WETm I5z3eLISHs2hoafyi7TSPppzyrZGNMCJhJbdnC2en9yK6coDGjUC3n5bpLf8nQBSD3fe Nv3w== X-Received: by 10.236.2.5 with SMTP id 5mr736525yhe.23.1377012145169; Tue, 20 Aug 2013 08:22:25 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.71.83 with SMTP id s19ls214287qeu.7.gmail; Tue, 20 Aug 2013 08:22:25 -0700 (PDT) X-Received: by 10.52.180.229 with SMTP id dr5mr1459653vdc.20.1377012144986; Tue, 20 Aug 2013 08:22:24 -0700 (PDT) Received: from mail-vc0-f179.google.com (mail-vc0-f179.google.com [209.85.220.179]) by mx.google.com with ESMTPS id jf10si485789vdb.128.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 20 Aug 2013 08:22:24 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.179 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.179; Received: by mail-vc0-f179.google.com with SMTP id ht10so397595vcb.10 for ; Tue, 20 Aug 2013 08:22:24 -0700 (PDT) X-Gm-Message-State: ALoCoQl8tI7UM/tDDbKfvkEexxX5qTIYXtDaZMbrg7TuB4Y+zyDwU8Omt9DNRplJx87cCwJ70zj3 X-Received: by 10.58.127.202 with SMTP id ni10mr854912veb.27.1377012143819; Tue, 20 Aug 2013 08:22:23 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.174.196 with SMTP id u4csp162507vcz; Tue, 20 Aug 2013 08:22:23 -0700 (PDT) X-Received: by 10.60.95.99 with SMTP id dj3mr1562328oeb.94.1377012143130; Tue, 20 Aug 2013 08:22:23 -0700 (PDT) Received: from mail-oa0-f48.google.com (mail-oa0-f48.google.com [209.85.219.48]) by mx.google.com with ESMTPS id l9si1510910obv.109.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 20 Aug 2013 08:22:23 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.219.48 is neither permitted nor denied by best guess record for domain of andre.przywara@linaro.org) client-ip=209.85.219.48; Received: by mail-oa0-f48.google.com with SMTP id o17so1032690oag.35 for ; Tue, 20 Aug 2013 08:22:22 -0700 (PDT) X-Received: by 10.50.3.3 with SMTP id 3mr176156igy.54.1377012142342; Tue, 20 Aug 2013 08:22:22 -0700 (PDT) Received: from slackpad.drs.calxeda.com (f053082144.adsl.alicedsl.de. [78.53.82.144]) by mx.google.com with ESMTPSA id b16sm695246igd.7.1969.12.31.16.00.00 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 20 Aug 2013 08:22:21 -0700 (PDT) From: Andre Przywara To: Ian.Campbell@citrix.com, julien.grall@linaro.org Cc: stefano.stabellini@eu.citrix.com, xen-devel@lists.xen.org, patches@linaro.org, Andre Przywara Subject: [PATCH v3] ARM: parse separate DT properties for different commandlines Date: Tue, 20 Aug 2013 17:21:10 +0200 Message-Id: <1377012070-22967-1-git-send-email-andre.przywara@linaro.org> X-Mailer: git-send-email 1.7.12.1 X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: andre.przywara@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.179 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Currently we use the chosen/bootargs property as the Xen commandline and rely on xen,dom0-bootargs for Dom0. However this brings issues with bootloaders, which usually build bootargs by bootscripts for a Linux kernel - and not for the entirely different Xen hypervisor. Introduce a new possible device tree property "xen,xen-bootargs" explicitly for the Xen hypervisor and make the selection of which to use more fine grained: - If xen,xen-bootargs is present, it will be used for Xen. - If xen,dom0-bootargs is present, it will be used for Dom0. - If xen,xen-bootargs is _not_ present, but xen,dom0-bootargs is, bootargs will be used for Xen. Like the current situation. - If no Xen specific properties are present, bootargs is for Dom0. - If xen,xen-bootargs is present, but xen,dom0-bootargs is missing, bootargs will be used for Dom0. The aim is to allow common bootscripts to boot both Xen and native Linux with the same device tree blob. If needed, one could hard-code the Xen commandline into the DTB, leaving bootargs for Dom0 to be set by the (non Xen-aware) bootloader. I will send out a appropriate u-boot patch, which writes the content of the "xen_bootargs" environment variable into the xen,xen-bootargs dtb property. v1 .. v2: - fix whitespace issues v2 .. v3: - add documentation Signed-off-by: Andre Przywara Reviewed-by: Julien Grall --- docs/misc/arm/device-tree/booting.txt | 28 +++++++++++++++++++++++++++- xen/arch/arm/domain_build.c | 15 +++++++++++---- xen/common/device_tree.c | 7 ++++++- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/docs/misc/arm/device-tree/booting.txt b/docs/misc/arm/device-tree/booting.txt index 94cd3f1..08ed775 100644 --- a/docs/misc/arm/device-tree/booting.txt +++ b/docs/misc/arm/device-tree/booting.txt @@ -1,3 +1,6 @@ +Dom0 kernel and ramdisk modules +================================ + Xen is passed the dom0 kernel and initrd via a reference in the /chosen node of the device tree. @@ -22,4 +25,27 @@ properties: - bootargs (optional) - Command line associated with this module + Command line associated with this module. This is deprecated and should + be replaced by the bootargs variations described below. + + +Command lines +============= + +Xen also checks for properties directly under /chosen to find suitable command +lines for Xen and Dom0. The logic is the following: + + - If xen,xen-bootargs is present, it will be used for Xen. + - If xen,dom0-bootargs is present, it will be used for Dom0. + - If xen,xen-bootargs is _not_ present, but xen,dom0-bootargs is, + bootargs will be used for Xen. + - If no Xen specific properties are present, bootargs is for Dom0. + - If xen,xen-bootargs is present, but xen,dom0-bootargs is missing, + bootargs will be used for Dom0. + +Most of these cases is to make booting with Xen-unaware bootloaders easier. +For those you would hardcode the Xen commandline in the DTB under +/chosen/xen,xen-bootargs and would let the bootloader set the Dom0 command +line by writing bootargs (as for native Linux). +A Xen-aware bootloader would set xen,xen-bootargs for Xen, xen,dom0-bootargs +for Dom0 and bootargs for native Linux. diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 01492bb..c82ece1 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -140,6 +140,7 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo, u32 address_cells, u32 size_cells) { const char *bootargs = NULL; + int had_dom0_bootargs = 0; int prop; if ( early_info.modules.nr_mods >= 1 && @@ -166,15 +167,21 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo, * * * remember xen,dom0-bootargs if we don't already have * bootargs (from module #1, above). - * * remove bootargs and xen,dom0-bootargs. + * * remove bootargs, xen,dom0-bootargs and xen,xen-bootargs. */ if ( device_tree_node_matches(fdt, node, "chosen") ) { - if ( strcmp(prop_name, "bootargs") == 0 ) + if ( strcmp(prop_name, "xen,xen-bootargs") == 0 ) + continue; + if ( strcmp(prop_name, "xen,dom0-bootargs") == 0 ) + { + had_dom0_bootargs = 1; + bootargs = prop_data; continue; - else if ( strcmp(prop_name, "xen,dom0-bootargs") == 0 ) + } + if ( strcmp(prop_name, "bootargs") == 0 ) { - if ( !bootargs ) + if ( !bootargs && !had_dom0_bootargs ) bootargs = prop_data; continue; } diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 84d704d..e22bd22 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -325,7 +325,12 @@ const char *device_tree_bootargs(const void *fdt) if ( node < 0 ) return NULL; - prop = fdt_get_property(fdt, node, "bootargs", NULL); + prop = fdt_get_property(fdt, node, "xen,xen-bootargs", NULL); + if ( prop == NULL ) + { + if (fdt_get_property(fdt, node, "xen,dom0-bootargs", NULL)) + prop = fdt_get_property(fdt, node, "bootargs", NULL); + } if ( prop == NULL ) return NULL;