From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xen.org
Cc: julien.grall@linaro.org, tim@xen.org,
Ian Campbell <ian.campbell@citrix.com>,
stefano.stabellini@eu.citrix.com
Subject: [PATCH v5 06/19] xen: arm: move dom0 gic and timer device tree nodes under /xen/
Date: Wed, 13 Nov 2013 18:11:12 +0000 [thread overview]
Message-ID: <1384366285-29277-6-git-send-email-ian.campbell@citrix.com> (raw)
In-Reply-To: <1384366234.29080.8.camel@kazak.uk.xensource.com>
Julien observed that we were relying on the provided host DTB supplying
suitable #address-cells and #size-cells values to allow us to represent these
addresses, which may not reliably be the case. Moving these under our own
known (somewhat analogous to the use of /soc/ or /motherboard/ on some
platforms) allows us to control these sizes.
Since the xen node is created out of thin air it does not have a corresponding
struct dt_device_node and therefore we cannot use dt_n_addr_cells or
dt_n_size_cells, we can use hardcoded constants instead. For the same reason
we define and use set_xen_range instead of dt_set_range.
The hypervisor, cpus and psci node all either defined #foo-cells for their
children or do not contain reg properties and therefore can remain at the top
level.
The logging in make_gic_node was inconsistent. Fix it.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
v5: New patch
---
xen/arch/arm/domain_build.c | 76 ++++++++++++++++++++++++++++++++++---------
1 file changed, 61 insertions(+), 15 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 186746c..8645aa1 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -48,6 +48,24 @@ custom_param("dom0_mem", parse_dom0_mem);
*/
#define DOM0_FDT_EXTRA_SIZE (128 + sizeof(struct fdt_reserve_entry))
+/*
+ * Number of cells used for addresses and sizes under the /xen/
+ * node.
+ *
+ * We don't have a struct dt_device_node we can reference as a parent
+ * to get these values, so use these constants instead.
+ */
+#define XEN_FDT_NODE_ADDRESS_CELLS 2
+#define XEN_FDT_NODE_SIZE_CELLS 2
+#define XEN_FDT_NODE_REG_SIZE \
+ dt_cells_to_size(XEN_FDT_NODE_ADDRESS_CELLS + XEN_FDT_NODE_SIZE_CELLS)
+
+static void set_xen_range(__be32 **cellp, u64 address, u64 size)
+{
+ dt_set_cell(cellp, XEN_FDT_NODE_ADDRESS_CELLS, address);
+ dt_set_cell(cellp, XEN_FDT_NODE_SIZE_CELLS, size);
+}
+
struct vcpu *__init alloc_dom0_vcpu0(void)
{
if ( opt_dom0_max_vcpus == 0 )
@@ -477,8 +495,7 @@ static int make_cpus_node(const struct domain *d, void *fdt,
return res;
}
-static int make_gic_node(const struct domain *d, void *fdt,
- const struct dt_device_node *parent)
+static int make_gic_node(const struct domain *d, void *fdt)
{
const struct dt_device_node *gic = dt_interrupt_controller;
const void *compatible = NULL;
@@ -512,20 +529,19 @@ static int make_gic_node(const struct domain *d, void *fdt,
if ( res )
return res;
- len = dt_cells_to_size(dt_n_addr_cells(parent) + dt_n_size_cells(parent));
- len *= 2;
- new_cells = xzalloc_bytes(dt_cells_to_size(len));
+ len = XEN_FDT_NODE_REG_SIZE * 2;
+ new_cells = xzalloc_bytes(len);
if ( new_cells == NULL )
return -FDT_ERR_XEN(ENOMEM);
tmp = new_cells;
DPRINT(" Set Distributor Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n",
d->arch.vgic.dbase, d->arch.vgic.dbase + PAGE_SIZE - 1);
- dt_set_range(&tmp, parent, d->arch.vgic.dbase, PAGE_SIZE);
+ set_xen_range(&tmp, d->arch.vgic.dbase, PAGE_SIZE);
- DPRINT(" Set Cpu Base 0x%"PRIpaddr" size = 0x%"PRIpaddr"\n",
+ DPRINT(" Set Cpu Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n",
d->arch.vgic.cbase, d->arch.vgic.cbase + (PAGE_SIZE * 2) - 1);
- dt_set_range(&tmp, parent, d->arch.vgic.cbase, PAGE_SIZE * 2);
+ set_xen_range(&tmp, d->arch.vgic.cbase, PAGE_SIZE * 2);
res = fdt_property(fdt, "reg", new_cells, len);
xfree(new_cells);
@@ -550,8 +566,7 @@ static int make_gic_node(const struct domain *d, void *fdt,
return res;
}
-static int make_timer_node(const struct domain *d, void *fdt,
- const struct dt_device_node *parent)
+static int make_timer_node(const struct domain *d, void *fdt)
{
static const struct dt_device_match timer_ids[] __initconst =
{
@@ -611,6 +626,41 @@ static int make_timer_node(const struct domain *d, void *fdt,
return res;
}
+static int make_xen_node(const struct domain *d, void *fdt,
+ const struct dt_device_node *parent)
+{
+ int res;
+
+ res = fdt_begin_node(fdt, "xen");
+ if ( res )
+ return res;
+
+ res = fdt_property_cell(fdt, "#address-cells",
+ XEN_FDT_NODE_ADDRESS_CELLS);
+ if ( res )
+ return res;
+
+ res = fdt_property_cell(fdt, "#size-cells",
+ XEN_FDT_NODE_SIZE_CELLS);
+ if ( res )
+ return res;
+
+ res = fdt_property(fdt, "ranges", NULL, 0);
+ if ( res )
+ return res;
+
+ res = make_gic_node(d, fdt);
+ if ( res )
+ return res;
+
+ res = make_timer_node(d, fdt);
+ if ( res )
+ return res;
+
+ res = fdt_end_node(fdt);
+ return res;
+}
+
/* Map the device in the domain */
static int map_device(struct domain *d, const struct dt_device_node *dev)
{
@@ -776,11 +826,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
if ( res )
return res;
- res = make_gic_node(d, kinfo->fdt, np);
- if ( res )
- return res;
-
- res = make_timer_node(d, kinfo->fdt, np);
+ res = make_xen_node(d, kinfo->fdt, np);
if ( res )
return res;
}
--
1.7.10.4
next prev parent reply other threads:[~2013-11-13 18:11 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-13 18:10 [PATCH v5 00/17] xen: arm: 64-bit guest support and domU FDT autogeneration Ian Campbell
2013-11-13 18:11 ` [PATCH v5 01/19] HACK Ian Campbell
2013-11-13 18:15 ` Julien Grall
2013-11-13 20:15 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 02/19] xen: arm: drop LDFLAGS_DIRECT emulation specification Ian Campbell
2013-11-13 21:26 ` Julien Grall
2013-11-14 8:16 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 03/19] xen: update config.{sub, guess} for arm64 Ian Campbell
2013-11-13 18:11 ` [PATCH v5 04/19] xen: arm: Report aarch64 capability Ian Campbell
2013-11-13 18:11 ` [PATCH v5 05/19] xen: arm: Add comment regard arm64 zImage v0 vs v1 Ian Campbell
2013-11-13 18:11 ` Ian Campbell [this message]
2013-11-13 18:28 ` [PATCH v5 06/19] xen: arm: move dom0 gic and timer device tree nodes under /xen/ Stefano Stabellini
2013-11-13 20:18 ` Ian Campbell
2013-11-14 12:22 ` Stefano Stabellini
2013-11-19 9:52 ` Ian Campbell
2013-11-13 21:31 ` Julien Grall
2013-11-14 8:18 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 07/19] xen: arm: allocate dom0 memory separately from preparing the dtb Ian Campbell
2013-11-13 19:21 ` Stefano Stabellini
2013-11-13 20:18 ` Ian Campbell
2013-11-14 12:22 ` Stefano Stabellini
2013-11-13 21:34 ` Julien Grall
2013-11-14 8:23 ` Ian Campbell
2013-11-14 0:52 ` Julien Grall
2013-11-14 8:25 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 08/19] xen: arm: add enable-method to cpu nodes for arm64 guests Ian Campbell
2013-11-13 18:11 ` [PATCH v5 09/19] xen: arm: include header for for arch_do_{sys, dom}ctl prototype Ian Campbell
2013-11-13 18:11 ` [PATCH v5 10/19] xen: arm: implement XEN_DOMCTL_set_address_size Ian Campbell
2013-11-13 18:11 ` [PATCH v5 11/19] xen: arm: implement arch_set_info_guest for 64-bit vcpus Ian Campbell
2013-11-13 18:11 ` [PATCH v5 12/19] tools: check for libfdt when building for ARM Ian Campbell
2013-11-13 18:11 ` [PATCH v5 13/19] xen: arm: define guest virtual platform in API headers Ian Campbell
2013-11-13 18:11 ` [PATCH v5 14/19] libxc: arm: rename various bits of zimage load with 32 suffix Ian Campbell
2013-11-13 18:11 ` [PATCH v5 15/19] libxc: allow caller to specify guest rambase rather than hardcoding Ian Campbell
2013-11-13 18:11 ` [PATCH v5 16/19] libxc: arm: allow passing a device tree blob to the guest Ian Campbell
2013-11-14 0:47 ` Julien Grall
2013-11-19 12:36 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 17/19] libxc: support for arm64 Image format Ian Campbell
2013-11-14 1:17 ` Julien Grall
2013-11-19 12:39 ` Ian Campbell
2013-11-13 18:11 ` [PATCH v5 18/19] libxc: arm64 vcpu initialisation Ian Campbell
2013-11-13 18:11 ` [PATCH v5 19/19] libxl: build a device tree for ARM guests Ian Campbell
2013-11-13 18:19 ` Stefano Stabellini
2013-11-14 1:04 ` Julien Grall
2013-11-14 8:28 ` Ian Campbell
2013-11-14 12:17 ` Julien Grall
2013-11-14 11:50 ` Ian Jackson
2013-11-14 12:17 ` Stefano Stabellini
2013-11-14 12:24 ` Julien Grall
2013-11-14 12:45 ` Ian Campbell
2013-11-14 14:01 ` Stefano Stabellini
2013-11-19 10:30 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1384366285-29277-6-git-send-email-ian.campbell@citrix.com \
--to=ian.campbell@citrix.com \
--cc=julien.grall@linaro.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).