[PATCH v3 6/6] arm64: dts: cix: Describe the Sky1 DMA-350 bus integration
Conor Dooley
conor at kernel.org
Mon Oct 12 12:07:48 PDT 2026
On Mon, Oct 12, 2026 at 04:41:55PM +0800, Jelly Jia wrote:
> The FCH DMA-350 controller sits behind an interconnect window, so the
> addresses its DMA master uses differ from the CPU physical addresses.
> Describe the integration as a bus node carrying the dma-ranges of that
> window, with the controller itself as a child, and give the controller
> the SoC compatible and the clock feeding it.
>
> The AUDSS DMA-350 controller is described the same way, with its clock
> and reset. It has no consumer in the SoC dtsi yet: the audio controllers
> that use it are not described upstream.
>
> The bus nodes are address domains, not devices: they have no reg, so
> they carry no unit-address in their node names.
>
> v1 -> v2:
> - The DMA-350 nodes are no longer wrappers with the generic controller
> as a child: each Sky1 DMA-350 is a single device node with the
> "cix,sky1-dma350", "arm,dma-350" compatible, its real MMIO region and
> the integration resources (clock, reset) that v1 kept on the wrapper.
> The integration and the block are one device, and the MMIO is the same
> as the generic node it replaces.
> - The FCH and AUDSS DMA-350 masters sit behind SoC interconnect windows
> in a static DMA address domain: the AUDSS masters see the audio
> register and FIFO block at 0x20000000 and the DRAM window at
> 0x30000000, which the CPU sees at 0x07010000 and 0xc0000000, and the
> FCH masters see the 0x040b0000 window at 0x040a0000. Their DMA view of
> the address space is not the CPU physical view.
> - The windows are static hardware configuration, set up before Linux
> starts by the boot firmware / secure world: they are not programmable
> from Linux and must not be reconfigured by it. There is nothing for a
> Linux interconnect provider to manage here, so the translation cannot
> be modeled as one; it is a fixed property of the bus.
> - It is described the standard devicetree way instead: a generic
> "simple-bus" parent with an identity "ranges;" and the "dma-ranges" of
> the window. This is not the rejected v1 wrapper and not a separate DMA
> wrapper/integration device: the parent has no device-specific or
> vendor wrapper compatible, only the generic "simple-bus" compatible,
> no reg, no clocks, no resets, no driver and no private address
> translation. Its only job is to carry the static translation, so it is
> only a generic bus/address-domain node.
> - The "dma-ranges" have to sit on that parent for the OF core to build
> dev->dma_range_map: of_dma_configure_id() starts the lookup at the
> device's parent (bus_np = __of_get_dma_parent(np) in
> drivers/of/device.c), so a "dma-ranges" on the controller node itself
> would be ignored. The translation is applied by the DMA API, not by
> driver code: the driver maps slave resources with dma_map_resource()
> and contains no address parser.
> - Mainline has similar bus nodes: the Agilex5 DMA bus (dma-bus at 10db0000,
> a simple-bus with dma-ranges whose controller carries
> "altr,agilex5-axi-dma", "snps,axi-dma-1.01a") and the Marvell AC5
> buses (bus at 80500000 with "ranges;" and "dma-ranges", and
> behind-32bit-controller at 7f000000, whose only purpose is the DMA
> mapping of the devices below it).
>
> v2 -> v3:
> - The AUDSS interrupt gate is set up by the boot firmware and is not
> configured by Linux, so the cix,irq-router property is gone.
> - The bus nodes carry no unit-address in their names: they have no reg,
> which made dtc warn (unit_address_vs_reg).
None of this should be in the commit message.
>
> Assisted-by: LLM checkpatch sparse dt_binding_check dtbs_check
> Signed-off-by: Jelly Jia <Jelly.Jia at cixtech.com>
> ---
> arch/arm64/boot/dts/cix/sky1.dtsi | 68 +++++++++++++++++++++++++------
> 1 file changed, 56 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sky1.dtsi
> index 0a820f45feb9..1262f34794d2 100644
> --- a/arch/arm64/boot/dts/cix/sky1.dtsi
> +++ b/arch/arm64/boot/dts/cix/sky1.dtsi
> @@ -518,18 +518,33 @@ iomuxc: pinctrl at 4170000 {
> reg = <0x0 0x04170000 0x0 0x1000>;
> };
>
> - fch_dmac: dma-controller at 4190000 {
> - compatible = "arm,dma-350";
> - reg = <0x0 0x4190000 0x0 0x10000>;
> - interrupts = <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> - <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>;
> - #dma-cells = <1>;
> + /*
> + * The FCH DMA-350 master sits behind an interconnect window;
> + * the dma-ranges below are its view of the address space.
> + */
> + fch-dma-bus {
> + compatible = "simple-bus";
> + #address-cells = <2>;
> + #size-cells = <2>;
> + ranges;
> + dma-ranges = <0x0 0x040a0000 0x0 0x040b0000 0x0 0x00040000>,
> + <0x0 0x80000000 0x0 0x80000000 0x8 0x00000000>,
> + <0x80 0x00000000 0x80 0x00000000 0x80 0x00000000>;
> +
> + fch_dmac: dma-controller at 4190000 {
> + compatible = "cix,sky1-dma350", "arm,dma-350";
> + reg = <0x0 0x04190000 0x0 0x10000>;
> + clocks = <&scmi_clk CLK_TREE_FCH_DMA_ACLK>;
> + interrupts = <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH 0>;
As I said on v2 an hour or so ago, I don't think this is correct, and
you should put an interrupt-map node into the syscon that contains the
irq routing registers, and have the syscon be the interrupt parent for
this node.
Thanks,
Conor.
> + #dma-cells = <1>;
> + };
> };
>
> mbox_ap2se: mailbox at 5060000 {
> @@ -576,6 +591,35 @@ mbox_pm2ap: mailbox at 65a0080 {
> cix,mbox-dir = "rx";
> };
>
> + /*
> + * The AUDSS DMA-350 master sits behind an interconnect window;
> + * the dma-ranges below are its view of the address space.
> + */
> + audss-dma-bus {
> + compatible = "simple-bus";
> + #address-cells = <2>;
> + #size-cells = <2>;
> + ranges;
> + dma-ranges = <0x0 0x20000000 0x0 0x07010000 0x0 0x00100000>,
> + <0x0 0x30000000 0x0 0xc0000000 0x0 0x20000000>;
> +
> + audss_dmac: dma-controller at 7010000 {
> + compatible = "cix,sky1-dma350", "arm,dma-350";
> + reg = <0x0 0x07010000 0x0 0x10000>;
> + clocks = <&audss_cru CLK_DMAC_AXI>;
> + resets = <&audss_cru AUDSS_DMAC_SW_RST>;
> + interrupts = <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>,
> + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH 0>;
> + #dma-cells = <1>;
> + };
> + };
> +
> audss_cru: clock-controller at 7110000 {
> compatible = "cix,sky1-audss-cru";
> reg = <0x0 0x07110000 0x0 0x10000>;
> --
> 2.54.0
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20261012/34694c1f/attachment-0001.sig>
More information about the linux-arm-kernel
mailing list