From: Stefano Stabellini <sstabellini@kernel.org>
To: julien.grall@arm.com
Cc: Stefano Stabellini <stefanos@xilinx.com>,
sstabellini@kernel.org, andrii_anisov@epam.com,
xen-devel@lists.xen.org
Subject: [PATCH v2 14/21] xen/arm: generate a simple device tree for domUs
Date: Fri, 6 Jul 2018 16:12:09 -0700 [thread overview]
Message-ID: <1530918736-13965-14-git-send-email-sstabellini@kernel.org> (raw)
In-Reply-To: <alpine.DEB.2.10.1807061523160.13502@sstabellini-ThinkPad-X260>
Introduce functions to generate a basic domU device tree, similar to the
existing functions in tools/libxl/libxl_arm.c.
Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
---
Changes in v2:
- move prepare_dtb rename to previous patch
- use switch for the gic version
- use arm,gic-400 instead of arm,cortex-a15-gic
- add @unit-address in the gic node name
- add comment on DOMU_DTB_SIZE
---
xen/arch/arm/domain_build.c | 213 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 213 insertions(+)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index a4bc8fd..48a91ad 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1392,6 +1392,215 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo,
return res;
}
+static int make_gic_domU_node(const struct domain *d, void *fdt, int addrcells, int sizecells)
+{
+ int res = 0;
+ int reg_size = addrcells + sizecells;
+ int nr_cells = reg_size * 2;
+ __be32 reg[nr_cells];
+ __be32 *cells;
+
+ switch ( gic_hw_version() )
+ {
+ case GIC_V3:
+ res = fdt_begin_node(fdt, "interrupt-controller@"__stringify(GUEST_GICV3_GICD_BASE));
+ break;
+ case GIC_V2:
+ res = fdt_begin_node(fdt, "interrupt-controller@"__stringify(GUEST_GICD_BASE));
+ break;
+ default:
+ panic("Unsupported GIC version");
+ }
+
+ if ( res )
+ return res;
+
+ res = fdt_property_cell(fdt, "#address-cells", 0);
+ if ( res )
+ return res;
+
+ res = fdt_property_cell(fdt, "#interrupt-cells", 3);
+ if ( res )
+ return res;
+
+ res = fdt_property(fdt, "interrupt-controller", NULL, 0);
+ if ( res )
+ return res;
+
+ switch ( gic_hw_version() )
+ {
+ case GIC_V3:
+ {
+ const uint64_t gicd_base = GUEST_GICV3_GICD_BASE;
+ const uint64_t gicd_size = GUEST_GICV3_GICD_SIZE;
+ const uint64_t gicr0_base = GUEST_GICV3_GICR0_BASE;
+ const uint64_t gicr0_size = GUEST_GICV3_GICR0_SIZE;
+
+ res = fdt_property_string(fdt, "compatible", "arm,gic-v3");
+ if ( res )
+ return res;
+
+ cells = ®[0];
+ dt_child_set_range(&cells, addrcells, sizecells, gicd_base, gicd_size);
+ dt_child_set_range(&cells, addrcells, sizecells, gicr0_base, gicr0_size);
+ res = fdt_property(fdt, "reg", reg, sizeof(reg));
+ break;
+ }
+ case GIC_V2:
+ {
+ const uint64_t gicd_base = GUEST_GICD_BASE;
+ const uint64_t gicd_size = GUEST_GICD_SIZE;
+ const uint64_t gicc_base = GUEST_GICC_BASE;
+ const uint64_t gicc_size = GUEST_GICC_SIZE;
+
+ res = fdt_property_string(fdt, "compatible", "arm,gic-400");
+ if ( res )
+ return res;
+
+ cells = ®[0];
+ dt_child_set_range(&cells, addrcells, sizecells, gicd_base, gicd_size);
+ dt_child_set_range(&cells, addrcells, sizecells, gicc_base, gicc_size);
+ break;
+ }
+ default:
+ break;
+ }
+
+ res = fdt_property(fdt, "reg", reg, sizeof(reg));
+ if (res)
+ return res;
+
+ res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
+ if (res)
+ return res;
+
+ res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
+ if (res)
+ return res;
+
+ res = fdt_end_node(fdt);
+
+ return res;
+}
+
+static int make_timer_domU_node(const struct domain *d, void *fdt)
+{
+ int res;
+ gic_interrupt_t intrs[3];
+
+ res = fdt_begin_node(fdt, "timer");
+ if ( res )
+ return res;
+
+ if (!is_64bit_domain(d))
+ {
+ res = fdt_property_string(fdt, "compatible", "arm,armv7-timer");
+ if ( res )
+ return res;
+ } else {
+ res = fdt_property_string(fdt, "compatible", "arm,armv8-timer");
+ if ( res )
+ return res;
+ }
+
+ set_interrupt_ppi(intrs[0], GUEST_TIMER_PHYS_S_PPI, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intrs[1], GUEST_TIMER_PHYS_NS_PPI, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intrs[2], GUEST_TIMER_VIRT_PPI, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
+
+ res = fdt_property(fdt, "interrupts", intrs, sizeof (intrs[0]) * 3);
+ if ( res )
+ return res;
+
+ res = fdt_property_cell(fdt, "interrupt-parent",
+ GUEST_PHANDLE_GIC);
+ if (res)
+ return res;
+
+ res = fdt_end_node(fdt);
+ return res;
+}
+
+/*
+ * The max size for DT is 2MB. However, the generated DT is small, 4KB
+ * are enough for now, but we might have to increase it in the feature.
+ */
+#define DOMU_DTB_SIZE 4096
+static int prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
+{
+ int addrcells, sizecells;
+ int ret;
+
+ addrcells = dt_child_n_addr_cells(dt_host);
+ sizecells = dt_child_n_size_cells(dt_host);
+
+ kinfo->fdt = xmalloc_bytes(DOMU_DTB_SIZE);
+ if ( kinfo->fdt == NULL )
+ return -ENOMEM;
+
+ ret = fdt_create(kinfo->fdt, DOMU_DTB_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", addrcells);
+ if ( ret )
+ goto err;
+
+ ret = fdt_property_cell(kinfo->fdt, "#size-cells", sizecells);
+ if ( ret )
+ goto err;
+
+ ret = make_chosen_node(kinfo);
+ if ( ret )
+ goto err;
+
+ ret = make_hypervisor_node(d, kinfo, addrcells, sizecells);
+ if ( ret )
+ goto err;
+
+ ret = make_psci_node(kinfo->fdt, NULL);
+ if ( ret )
+ goto err;
+
+ ret = make_cpus_node(d, kinfo->fdt, NULL);
+ if ( ret )
+ goto err;
+
+ ret = make_memory_node(d, kinfo->fdt, addrcells, sizecells, kinfo);
+ if ( ret )
+ goto err;
+
+ ret = make_gic_domU_node(d, kinfo->fdt, addrcells, sizecells);
+ if ( ret )
+ goto err;
+
+ ret = make_timer_domU_node(d, kinfo->fdt);
+ 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 int prepare_dtb_hwdom(struct domain *d, struct kernel_info *kinfo)
{
const p2m_type_t default_p2mt = p2m_mmio_direct_c;
@@ -2258,6 +2467,10 @@ static int __init construct_domU(struct domain *d, struct dt_device_node *node)
d->arch.type = kinfo.type;
allocate_memory(d, &kinfo);
+ rc = prepare_dtb_domU(d, &kinfo);
+ if ( rc < 0 )
+ return rc;
+
return __construct_domain(d, &kinfo);
}
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-07-06 23:12 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-06 23:11 [PATCH v2 00/21] dom0less step1: boot multiple domains from device tree Stefano Stabellini
2018-07-06 23:11 ` [PATCH v2 01/21] xen/arm: rename get_11_allocation_size to get_allocation_size Stefano Stabellini
2018-07-09 12:55 ` Julien Grall
2018-07-11 20:09 ` Stefano Stabellini
2018-07-06 23:11 ` [PATCH v2 02/21] xen/arm: make allocate_memory work for non 1:1 mapped guests Stefano Stabellini
2018-07-09 13:43 ` Julien Grall
2018-07-09 23:02 ` Stefano Stabellini
2018-07-10 17:57 ` Julien Grall
2018-07-11 21:42 ` Stefano Stabellini
2018-07-09 13:58 ` Julien Grall
2018-07-09 23:10 ` Stefano Stabellini
2018-07-23 18:01 ` Andrii Anisov
2018-07-23 18:32 ` Stefano Stabellini
2018-07-24 12:09 ` Andrii Anisov
2018-07-06 23:11 ` [PATCH v2 03/21] xen: allow console_io hypercalls from certain DomUs Stefano Stabellini
2018-07-09 13:48 ` Julien Grall
2018-07-17 20:05 ` Stefano Stabellini
2018-07-17 20:26 ` Julien Grall
2018-07-18 17:10 ` Stefano Stabellini
2018-07-19 9:19 ` Julien Grall
2018-08-17 19:41 ` Daniel De Graaf
2018-07-06 23:11 ` [PATCH v2 04/21] xen/arm: move a few DT related defines to public/device_tree_defs.h Stefano Stabellini
2018-07-09 13:59 ` Julien Grall
2018-07-06 23:12 ` [PATCH v2 05/21] xen/arm: extend device tree based multiboot protocol Stefano Stabellini
2018-07-09 14:07 ` Julien Grall
2018-07-13 22:41 ` Stefano Stabellini
2018-07-16 14:14 ` Julien Grall
2018-07-16 22:02 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 06/21] xen/arm: do not pass dt_host to make_memory_node and make_hypervisor_node Stefano Stabellini
2018-07-09 14:11 ` Julien Grall
2018-07-09 21:51 ` Stefano Stabellini
2018-07-10 17:28 ` Julien Grall
2018-07-11 20:33 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 07/21] xen/arm: rename acpi_make_chosen_node to make_chosen_node Stefano Stabellini
2018-07-09 14:12 ` Julien Grall
2018-07-06 23:12 ` [PATCH v2 08/21] xen/arm: increase MAX_MODULES Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 09/21] xen/arm: move cmdline out of boot_modules Stefano Stabellini
2018-07-09 14:53 ` Julien Grall
2018-07-10 0:00 ` Stefano Stabellini
2018-07-10 21:11 ` Julien Grall
2018-07-13 0:04 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 10/21] xen/arm: don't add duplicate boot modules Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 11/21] xen/arm: probe domU kernels and initrds Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 12/21] xen/arm: refactor construct_dom0 Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 13/21] xen/arm: introduce construct_domU Stefano Stabellini
2018-07-06 23:12 ` Stefano Stabellini [this message]
2018-07-06 23:12 ` [PATCH v2 15/21] xen/arm: generate vpl011 node on device tree for domU Stefano Stabellini
2018-07-12 18:14 ` Julien Grall
2018-07-13 21:24 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 16/21] xen/arm: introduce a union in vpl011 Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 17/21] xen/arm: refactor vpl011_data_avail Stefano Stabellini
2018-07-24 9:58 ` Julien Grall
2018-07-27 22:37 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 18/21] xen/arm: Allow vpl011 to be used by DomU Stefano Stabellini
2018-07-24 11:00 ` Julien Grall
2018-07-27 0:10 ` Stefano Stabellini
2018-07-27 11:00 ` Julien Grall
2018-07-27 21:42 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 19/21] xen/arm: introduce create_domUs Stefano Stabellini
2018-07-16 16:10 ` Jan Beulich
2018-07-16 21:44 ` Stefano Stabellini
2018-07-24 13:53 ` Julien Grall
2018-07-28 2:42 ` Stefano Stabellini
2018-07-30 10:26 ` Julien Grall
2018-07-30 18:15 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 20/21] xen: support console_switching between Dom0 and DomUs on ARM Stefano Stabellini
2018-07-16 16:19 ` Jan Beulich
2018-07-16 21:55 ` Stefano Stabellini
2018-07-17 6:37 ` Jan Beulich
2018-07-17 16:43 ` Stefano Stabellini
2018-07-18 6:41 ` Jan Beulich
2018-07-18 16:51 ` Stefano Stabellini
2018-07-17 8:40 ` Jan Beulich
2018-07-17 16:33 ` Stefano Stabellini
2018-07-17 20:29 ` Julien Grall
2018-07-18 7:12 ` Jan Beulich
2018-07-18 16:59 ` Julien Grall
2018-07-19 6:10 ` Jan Beulich
2018-07-19 17:18 ` Stefano Stabellini
2018-07-18 17:01 ` Stefano Stabellini
2018-07-18 20:37 ` George Dunlap
2018-07-17 20:34 ` Julien Grall
2018-07-18 17:31 ` Stefano Stabellini
2018-07-06 23:12 ` [PATCH v2 21/21] xen/arm: split domain_build.c Stefano Stabellini
2018-07-12 18:18 ` [PATCH v2 00/21] dom0less step1: boot multiple domains from device tree Julien Grall
2018-07-13 20:54 ` Stefano Stabellini
2018-07-18 16:48 ` Julien Grall
2018-07-18 17:48 ` Stefano Stabellini
2018-07-23 17:13 ` Julien Grall
2018-07-23 17:52 ` Stefano Stabellini
2018-07-23 17:14 ` Andrii Anisov
2018-07-23 17:55 ` Stefano Stabellini
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=1530918736-13965-14-git-send-email-sstabellini@kernel.org \
--to=sstabellini@kernel.org \
--cc=andrii_anisov@epam.com \
--cc=julien.grall@arm.com \
--cc=stefanos@xilinx.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.