Re: [PATCH] dt-bindings: stm32: convert mlahb to json-schema

From: Arnaud POULIQUEN
Date: Mon Dec 16 2019 - 03:44:34 EST


Hello Rob,

On 12/13/19 10:39 PM, Rob Herring wrote:
> On Thu, Nov 28, 2019 at 04:46:03PM +0100, Arnaud Pouliquen wrote:
>> Convert the ML-AHB bus bindings to DT schema format using json-schema
>>
>> Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@xxxxxx>
>> ---
>> Notice that this patch requests an update of the simple-bus schema to add
>> the support of the "dma-ranges" property.
>> A Pull request has been sent in parallel to the dt-schema github repo:
>> https://github.com/devicetree-org/dt-schema/pull/30
>>
>> To remind the topic around the use of "dma-ranges" please
>> refer to following discussion: https://lkml.org/lkml/2019/4/3/1261
>> ---
>> .../devicetree/bindings/arm/stm32/mlahb.txt | 37 ----------
>> .../bindings/arm/stm32/st,mlahb.yaml | 69 +++++++++++++++++++
>> 2 files changed, 69 insertions(+), 37 deletions(-)
>> delete mode 100644 Documentation/devicetree/bindings/arm/stm32/mlahb.txt
>> create mode 100644 Documentation/devicetree/bindings/arm/stm32/st,mlahb.yaml
>>
>> diff --git a/Documentation/devicetree/bindings/arm/stm32/mlahb.txt b/Documentation/devicetree/bindings/arm/stm32/mlahb.txt
>> deleted file mode 100644
>> index 25307aa1eb9b..000000000000
>> --- a/Documentation/devicetree/bindings/arm/stm32/mlahb.txt
>> +++ /dev/null
>> @@ -1,37 +0,0 @@
>> -ML-AHB interconnect bindings
>> -
>> -These bindings describe the STM32 SoCs ML-AHB interconnect bus which connects
>> -a Cortex-M subsystem with dedicated memories.
>> -The MCU SRAM and RETRAM memory parts can be accessed through different addresses
>> -(see "RAM aliases" in [1]) using different buses (see [2]) : balancing the
>> -Cortex-M firmware accesses among those ports allows to tune the system
>> -performance.
>> -
>> -[1]: https://www.st.com/resource/en/reference_manual/dm00327659.pdf
>> -[2]: https://wiki.st.com/stm32mpu/wiki/STM32MP15_RAM_mapping
>> -
>> -Required properties:
>> -- compatible: should be "simple-bus"
>> -- dma-ranges: describes memory addresses translation between the local CPU and
>> - the remote Cortex-M processor. Each memory region, is declared with
>> - 3 parameters:
>> - - param 1: device base address (Cortex-M processor address)
>> - - param 2: physical base address (local CPU address)
>> - - param 3: size of the memory region.
>> -
>> -The Cortex-M remote processor accessed via the mlahb interconnect is described
>> -by a child node.
>> -
>> -Example:
>> -mlahb {
>> - compatible = "simple-bus";
>> - #address-cells = <1>;
>> - #size-cells = <1>;
>> - dma-ranges = <0x00000000 0x38000000 0x10000>,
>> - <0x10000000 0x10000000 0x60000>,
>> - <0x30000000 0x30000000 0x60000>;
>> -
>> - m4_rproc: m4@10000000 {
>> - ...
>> - };
>> -};
>> diff --git a/Documentation/devicetree/bindings/arm/stm32/st,mlahb.yaml b/Documentation/devicetree/bindings/arm/stm32/st,mlahb.yaml
>> new file mode 100644
>> index 000000000000..8ad3f7c7f9ab
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/arm/stm32/st,mlahb.yaml
>> @@ -0,0 +1,69 @@
>> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: "http://devicetree.org/schemas/arm/stm32/st,mlahb.yaml#";
>> +$schema: "http://devicetree.org/meta-schemas/core.yaml#";
>> +
>> +title: STMicroelectronics STM32 ML-AHB interconnect bindings
>> +
>> +maintainers:
>> + - Fabien Dessenne <fabien.dessenne@xxxxxx>
>> + - Arnaud Pouliquen <arnaud.pouliquen@xxxxxx>
>> +
>> +description: |
>> + These bindings describe the STM32 SoCs ML-AHB interconnect bus which connects
>> + a Cortex-M subsystem with dedicated memories. The MCU SRAM and RETRAM memory
>> + parts can be accessed through different addresses (see "RAM aliases" in [1])
>> + using different buses (see [2]): balancing the Cortex-M firmware accesses
>> + among those ports allows to tune the system performance.
>> + [1]: https://www.st.com/resource/en/reference_manual/dm00327659.pdf
>> + [2]: https://wiki.st.com/stm32mpu/wiki/STM32MP15_RAM_mapping
>> +
>> +allOf:
>> + - $ref: /schemas/simple-bus.yaml#
>> +
>> +properties:
>> + compatible:
>> + contains:
>> + enum:
>> + - st,mlahb
>> +
>> + dma-ranges:
>> + description: |
>> + Describe memory addresses translation between the local CPU and the
>> + remote Cortex-M processor. Each memory region, is declared with
>> + 3 parameters:
>> + - param 1: device base address (Cortex-M processor address)
>> + - param 2: physical base address (local CPU address)
>> + - param 3: size of the memory region.
>> + maxItems: 3
>> +
>> + '#address-cells':
>> + const: 1
>> +
>> + '#size-cells':
>> + const: 1
>> +
>> +required:
>> + - compatible
>> + - '#address-cells'
>> + - '#size-cells'
>> + - dma-ranges
>> +
>> +examples:
>> + - |
>> + mlahb: ahb {
>> + compatible = "st,mlahb", "simple-bus";
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + reg = <0x10000000 0x40000>;
>> + dma-ranges = <0x00000000 0x38000000 0x10000>,
>> + <0x10000000 0x10000000 0x60000>,
>> + <0x30000000 0x30000000 0x60000>;
>> +
>
> Fails to build:
>
> builds/robherring/linux-dt-review/Documentation/devicetree/bindings/arm/stm32/st,mlahb.example.dt.yaml:
> ahb: 'ranges' is a required property
>
> Run 'make dt_binding_check'

Yes, that why i posted in parallel the PR on the tool:
https://github.com/devicetree-org/dt-schema/pull/30.

I don't know if you saw my answer on this post so i copy/paste it here:

How to describe the stm32mp1 coprocessor mapping and translations based on this "ranges" requirement?

On stm32mp1 we have 2 RAM memories accessible by the Cortex-A7 running Linux and used by the Cortex-M4 coprocessor to run its code. Each Cortex has a specific mapping of the memories. Some memory translations are needed by:

- rproc driver to load the Cortex-M4 firmware in RAMs
- rpmsg & virtio frameworks for shared memory

Here is the memory mapping:

- RETRAM (64 kB);
- Cortex-A7 @ : 0x38000000
- Cortex-M4 @: 0x00000000
- MCUSRAM (up to 384 kB)
- Cortex-A7 @ : 0x30000000 or 0x10000000 ( 2 addresses for the same memory)
- Cortex-M4 @: 0x30000000 or 0x10000000 ( 2 addresses for the same memory)
=>addresses used on both side depend on the MCURAM access optimization

Today our upstreamed solution is based on dma-range only (https://lkml.org/lkml/2019/4/3/1261)

What about adding an "unused" ranges property in DT to match the requirement?

mlahb {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x38000000 0x10000>,
<1 0x10000000 0x60000>,
<2 0x30000000 0x60000>;
dma-ranges = <0x00000000 0x38000000 0x10000>,
<0x10000000 0x10000000 0x60000>,
<0x30000000 0x30000000 0x60000>;

m4_rproc: m4@10000000 {
---
};
};

Thanks in advance for your feedback.
Regards,
Arnaud

>
>> + m4_rproc: m4@10000000 {
>> + reg = <0x10000000 0x40000>;
>> + };
>> + };
>> +
>> +...
>> --
>> 2.17.1
>>