From: "Alejandro Vallejo" <alejandro.garciavallejo@amd.com>
To: "Baptiste Le Duc" <baptiste.le-duc@vates.tech>,
<xen-devel@lists.xenproject.org>
Cc: "Doug Goldstein" <cardoe@cardoe.com>,
"Stefano Stabellini" <sstabellini@kernel.org>
Subject: Re: [PATCH v2 2/6] automation/qtb: add jinja2 device trees for riscv64 smoke tests
Date: Mon, 21 Sep 2026 16:08:26 +0200 [thread overview]
Message-ID: <DLL1XT72ENNK.1JVZY0R4A671X@amd.com> (raw)
In-Reply-To: <1787823788.8631fc262581453bbf619ec5b2062170.1a0429a1050000c4f3@vates.tech>
On Thu Aug 27, 2026 at 11:42 AM CEST, Baptiste Le Duc wrote:
> The dom0less RISC-V smoke tests need a host device tree describing the
> platform (CPUs, APLIC/IMSIC, uart). It varies per machine (hart count, MMU
> type), so a single static .dts cannot cover the test matrix.
>
> Add dts/qemu-host.dts.j2, a template of the QEMU virt platform in
> aia=aplic-imsic mode: per-hart cpu/cpu-intc nodes, the M- and S-mode APLIC
> and IMSIC pairs, CLINT and the ns16550a uart. It takes ncpus, mmu_type and
> xen_bootargs as arguments.
Alternatively, why not query it from qemu itself? See
"-machine dumpdtb=dump.dtb" in "qemu-smoke-dom0less-arm64.sh"
Then you can use fdtput to add nodes as needed, with all hardware being
consistent with QEMU without undue magic replacements. Having a
configurable .dts seems like a silent mistake about to happen.
Check out that file of arm automation for DTB manipulation. I think it's
best if all DTB ports behave the same way.
Cheers,
Alejandro
>
> Values QEMU hardcodes are set as named constants matching their source
> symbols (QEMU_UART0_IRQ, QEMU_IRQCHIP_NUM_SOURCES, ...) rather than
> open-coded, so a QEMU-side change is easy to trace.
>
> The template is inert on its own: the generated dtb will be used in next
> patch.
>
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Baptiste Le Duc <baptiste.le-duc@vates.tech>
> ---
> .../scripts/qtb/riscv/dts/qemu-host.dts.j2 | 160 ++++++++++++++++++
> 1 file changed, 160 insertions(+)
> create mode 100644 automation/scripts/qtb/riscv/dts/qemu-host.dts.j2
>
> diff --git a/automation/scripts/qtb/riscv/dts/qemu-host.dts.j2 b/automation/scripts/qtb/riscv/dts/qemu-host.dts.j2
> new file mode 100644
> index 0000000000..13a8e983ce
> --- /dev/null
> +++ b/automation/scripts/qtb/riscv/dts/qemu-host.dts.j2
> @@ -0,0 +1,160 @@
> +/dts-v1/;
> +
> +{#-
> + * Jinja2 QEMU "virt" platform device tree for Xen RISC-V tests.
> + *
> + * Interrupt controller: APLIC in MSI mode + IMSIC
> + * (QEMU -M virt,aia=aplic-imsic).
> + *
> + * Rendered by xen_dt.py.
> + *
> + * Variables:
> + * ncpus - number of physical harts (int, >= 1)
> + * mmu_type - Xen host MMU type, e.g. "sv39" (string)
> + * xen_bootargs - Xen command line (string)
> + *
> + * Per-hart nodes are labelled cpu<i> / cpu<i>_intc and referenced with &label.
> + *
> + * No `aia-guests=N`, so no VS-mode guest files: IMSIC reg size is
> + * ncpus * page size.
> +-#}
> +{#- Values QEMU hardcodes, need to be described to Xen -#}
> +{%- set QEMU_TIMEBASE_FREQUENCY = 10000000 %} {#- RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ -#}
> +{%- set QEMU_IRQCHIP_NUM_SOURCES = 96 %} {#- VIRT_IRQCHIP_NUM_SOURCES (virt.h) -#}
> +{%- set QEMU_IRQCHIP_NUM_MSIS = 255 %} {#- VIRT_IRQCHIP_NUM_MSIS -#}
> +{%- set QEMU_UART_CLOCK_FREQUENCY = 3686400 %} {#- create_fdt_uart() -#}
> +{%- set QEMU_UART0_IRQ = 10 %} {#- UART0_IRQ -#}
> +{%- set QEMU_IMSIC_PAGE_SZ = 0x1000 %} {#- IMSIC_MMIO_PAGE_SZ -#}
> +
> +{%- set IRQ_TYPE_LEVEL_HIGH = 4 %}
> +{%- set APLIC_IRQ_CELLS = 2 %}
> +
> +{%- set IRQ_M_SOFT = 3 %}
> +{%- set IRQ_M_TIMER = 7 %}
> +{%- set IRQ_S_EXT = 9 %}
> +{%- set IRQ_M_EXT = 11 %}
> +
> +/ {
> + #address-cells = <0x02>;
> + #size-cells = <0x02>;
> + compatible = "riscv-virtio";
> + model = "riscv-virtio,qemu";
> +
> + memory@80000000 {
> + device_type = "memory";
> + reg = <0x00 0x80000000 0x00 0x80000000>;
> + };
> +
> + cpus {
> + #address-cells = <0x01>;
> + #size-cells = <0x00>;
> + timebase-frequency = <{{ QEMU_TIMEBASE_FREQUENCY }}>;
> +{% for i in range(ncpus) %}
> + cpu{{ i }}: cpu@{{ i }} {
> + device_type = "cpu";
> + reg = <0x{{ '%x' % i }}>;
> + status = "okay";
> + compatible = "riscv";
> + riscv,cbop-block-size = <0x40>;
> + riscv,cboz-block-size = <0x40>;
> + riscv,cbom-block-size = <0x40>;
> + riscv,isa = "rv64imafdch_zicntr_zicsr_zifencei_zihintpause_zihpm_zba_zbb_zbs_smstateen_svpbmt_smaia_ssaia";
> + mmu-type = "riscv,{{ mmu_type }}";
> +
> + cpu{{ i }}_intc: interrupt-controller@{{ i }} {
> + #interrupt-cells = <0x01>;
> + interrupt-controller;
> + compatible = "riscv,cpu-intc";
> + };
> + };
> +{% endfor %}
> + cpu-map {
> +
> + cluster0 {
> +{% for i in range(ncpus) %}
> + core{{ i }} {
> + cpu = <&cpu{{ i }}>;
> + };
> +{% endfor %}
> + };
> + };
> + };
> +
> + soc {
> + #address-cells = <0x02>;
> + #size-cells = <0x02>;
> + compatible = "simple-bus";
> + ranges;
> +
> + serial@10000000 {
> + interrupts = <{{ QEMU_UART0_IRQ }} {{ IRQ_TYPE_LEVEL_HIGH }}>;
> + interrupt-parent = <&aplic_s>;
> + clock-frequency = <{{ QEMU_UART_CLOCK_FREQUENCY }}>;
> + reg = <0x00 0x10000000 0x00 0x100>;
> + compatible = "ns16550a";
> + };
> +
> + aplic_s: aplic@d000000 {
> + riscv,num-sources = <{{ QEMU_IRQCHIP_NUM_SOURCES }}>;
> + reg = <0x00 0xd000000 0x00 0x8000>;
> + msi-parent = <&imsic_s>;
> + interrupt-controller;
> + #interrupt-cells = <{{ APLIC_IRQ_CELLS }}>;
> + compatible = "riscv,aplic";
> + };
> +
> + aplic@c000000 {
> + riscv,delegate = <&aplic_s 0x01 {{ QEMU_IRQCHIP_NUM_SOURCES }}>;
> + riscv,children = <&aplic_s>;
> + riscv,num-sources = <{{ QEMU_IRQCHIP_NUM_SOURCES }}>;
> + reg = <0x00 0xc000000 0x00 0x8000>;
> + msi-parent = <&imsic_m>;
> + interrupt-controller;
> + #interrupt-cells = <{{ APLIC_IRQ_CELLS }}>;
> + compatible = "riscv,aplic";
> + };
> +
> + imsic_s: imsics@28000000 {
> + riscv,num-ids = <{{ QEMU_IRQCHIP_NUM_MSIS }}>;
> + reg = <0x00 0x28000000 0x00 0x{{ '%x' % (ncpus * QEMU_IMSIC_PAGE_SZ) }}>;
> + interrupts-extended = <
> + {%- for i in range(ncpus) %}
> + &cpu{{ i }}_intc {{ IRQ_S_EXT }}
> + {%- endfor %}
> + >;
> + msi-controller;
> + interrupt-controller;
> + #interrupt-cells = <0x00>;
> + compatible = "riscv,imsics";
> + };
> +
> + imsic_m: imsics@24000000 {
> + riscv,num-ids = <{{ QEMU_IRQCHIP_NUM_MSIS }}>;
> + reg = <0x00 0x24000000 0x00 0x{{ '%x' % (ncpus * QEMU_IMSIC_PAGE_SZ) }}>;
> + interrupts-extended = <
> + {%- for i in range(ncpus) %}
> + &cpu{{ i }}_intc {{ IRQ_M_EXT }}
> + {%- endfor %}
> + >;
> + msi-controller;
> + interrupt-controller;
> + #interrupt-cells = <0x00>;
> + compatible = "riscv,imsics";
> + };
> +
> + clint@2000000 {
> + interrupts-extended = <
> + {%- for i in range(ncpus) %}
> + &cpu{{ i }}_intc {{ IRQ_M_SOFT }} &cpu{{ i }}_intc {{ IRQ_M_TIMER }}
> + {%- endfor %}
> + >;
> + reg = <0x00 0x2000000 0x00 0x10000>;
> + compatible = "sifive,clint0", "riscv,clint0";
> + };
> + };
> +
> + chosen {
> + stdout-path = "/soc/serial@10000000";
> + xen,xen-bootargs = "{{ xen_bootargs }}";
> + };
> +};
next prev parent reply other threads:[~2026-09-21 14:09 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-27 9:35 [PATCH v2 0/6] automation: add QTB test framework for riscv64 smoke tests Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 1/6] Add a QTB container to run the Xen riscv64 tests Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 2/6] automation/qtb: add jinja2 device trees for riscv64 smoke tests Baptiste Le Duc
2026-09-10 10:00 ` Zhang Zheng
2026-09-10 11:28 ` Baptiste Le Duc
2026-09-21 14:08 ` Alejandro Vallejo [this message]
2026-09-22 11:13 ` Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 3/6] automation/qtb: add Python QTB framework with the console-test type Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 4/6] automation/qtb: add unit tests for the QTB framework Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 5/6] automation/qtb: add QTB framework README Baptiste Le Duc
2026-08-27 9:42 ` [PATCH v2 6/6] CI: run the riscv64 smoke test via QTB framework console-test Baptiste Le Duc
2026-09-21 14:37 ` Alejandro Vallejo
2026-09-22 9:34 ` Baptiste Le Duc
[not found] ` <20260827094301.338069-6-baptiste.le-duc@vates.tech>
2026-09-15 20:29 ` Baptiste Le Duc
2026-09-21 14:39 ` [PATCH v2 0/6] automation: add QTB test framework for riscv64 smoke tests Alejandro Vallejo
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=DLL1XT72ENNK.1JVZY0R4A671X@amd.com \
--to=alejandro.garciavallejo@amd.com \
--cc=baptiste.le-duc@vates.tech \
--cc=cardoe@cardoe.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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.