[PATCH v16 09/16] riscv: Update Canaan Kendryte K210 device tree

Rob Herring robh at kernel.org
Mon Feb 8 14:49:56 EST 2021


On Fri, Feb 5, 2021 at 4:52 PM Sean Anderson <seanga2 at gmail.com> wrote:
>
> On 2/5/21 3:25 PM, Rob Herring wrote:
> > On Fri, Feb 05, 2021 at 03:58:20PM +0900, Damien Le Moal wrote:
> >> Update the Canaan Kendryte K210 base device tree k210.dtsi to define
> >> all peripherals of the SoC, their clocks and reset lines. The device
> >> tree file k210.dts is renamed to k210_generic.dts and becomes the
> >> default value selection of the SOC_CANAAN_K210_DTB_BUILTIN_SOURCE
> >> configuration option. No device beside the serial console is defined by
> >> this device tree. This makes this generic device tree suitable for use
> >> with a builtin initramfs with all known K210 based boards.
> >>
> >> These changes result in the K210_CLK_ACLK clock ID to be unused and
> >> removed from the dt-bindings k210-clk.h header file.
> >>
> >> Most updates to the k210.dtsi file come from Sean Anderson's work on
> >> U-Boot support for the K210.
> >>
> >> Cc: Rob Herring <robh at kernel.org>
> >> Cc: devicetree at vger.kernel.org
> >> Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
> >> ---
> >>   arch/riscv/Kconfig.socs                     |   2 +-
> >>   arch/riscv/boot/dts/canaan/k210.dts         |  23 -
> >>   arch/riscv/boot/dts/canaan/k210.dtsi        | 535 +++++++++++++++++++-
> >>   arch/riscv/boot/dts/canaan/k210_generic.dts |  46 ++
> >>   include/dt-bindings/clock/k210-clk.h        |   1 -
> >>   5 files changed, 554 insertions(+), 53 deletions(-)
> >>   delete mode 100644 arch/riscv/boot/dts/canaan/k210.dts
> >>   create mode 100644 arch/riscv/boot/dts/canaan/k210_generic.dts
> >>
> >> diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs
> >> index 6402746c68f3..7efcece8896c 100644
> >> --- a/arch/riscv/Kconfig.socs
> >> +++ b/arch/riscv/Kconfig.socs
> >> @@ -51,7 +51,7 @@ config SOC_CANAAN_K210_DTB_SOURCE
> >>      string "Source file for the Canaan Kendryte K210 builtin DTB"
> >>      depends on SOC_CANAAN
> >>      depends on SOC_CANAAN_K210_DTB_BUILTIN
> >> -    default "k210"
> >> +    default "k210_generic"
> >>      help
> >>        Base name (without suffix, relative to arch/riscv/boot/dts/canaan)
> >>        for the DTS file that will be used to produce the DTB linked into the
> >> diff --git a/arch/riscv/boot/dts/canaan/k210.dts b/arch/riscv/boot/dts/canaan/k210.dts
> >> deleted file mode 100644
> >> index 0d1f28fce6b2..000000000000
> >> --- a/arch/riscv/boot/dts/canaan/k210.dts
> >> +++ /dev/null
> >> @@ -1,23 +0,0 @@
> >> -// SPDX-License-Identifier: GPL-2.0+
> >> -/*
> >> - * Copyright (C) 2020 Western Digital Corporation or its affiliates.
> >> - */
> >> -
> >> -/dts-v1/;
> >> -
> >> -#include "k210.dtsi"
> >> -
> >> -/ {
> >> -    model = "Kendryte K210 generic";
> >> -    compatible = "kendryte,k210";
> >> -
> >> -    chosen {
> >> -            bootargs = "earlycon console=ttySIF0";
> >> -            stdout-path = "serial0";
> >> -    };
> >> -};
> >> -
> >> -&uarths0 {
> >> -    status = "okay";
> >> -};
> >> -
> >> diff --git a/arch/riscv/boot/dts/canaan/k210.dtsi b/arch/riscv/boot/dts/canaan/k210.dtsi
> >> index 354b263195a3..63c1f4c98d6c 100644
> >> --- a/arch/riscv/boot/dts/canaan/k210.dtsi
> >> +++ b/arch/riscv/boot/dts/canaan/k210.dtsi
> >> @@ -1,9 +1,11 @@
> >>   // SPDX-License-Identifier: GPL-2.0+
> >>   /*
> >> - * Copyright (C) 2019 Sean Anderson <seanga2 at gmail.com>
> >> + * Copyright (C) 2019-20 Sean Anderson <seanga2 at gmail.com>
> >>    * Copyright (C) 2020 Western Digital Corporation or its affiliates.
> >>    */
> >>   #include <dt-bindings/clock/k210-clk.h>
> >> +#include <dt-bindings/pinctrl/k210-fpioa.h>
> >> +#include <dt-bindings/reset/k210-rst.h>
> >>
> >>   / {
> >>      /*
> >> @@ -12,14 +14,33 @@ / {
> >>       */
> >>      #address-cells = <1>;
> >>      #size-cells = <1>;
> >> -    compatible = "kendryte,k210";
> >> +    compatible = "canaan,kendryte-k210";
> >>
> >>      aliases {
> >> +            cpu0 = &cpu0;
> >> +            cpu1 = &cpu1;
> >> +            dma0 = &dmac0;
> >> +            gpio0 = &gpio0;
> >> +            gpio1 = &gpio1_0;
> >> +            i2c0 = &i2c0;
> >> +            i2c1 = &i2c1;
> >> +            i2c2 = &i2c2;
> >> +            pinctrl0 = &fpioa;
> >>              serial0 = &uarths0;
> >> +            serial1 = &uart1;
> >> +            serial2 = &uart2;
> >> +            serial3 = &uart3;
> >> +            spi0 = &spi0;
> >> +            spi1 = &spi1;
> >> +            spi2 = &spi2;
> >> +            spi3 = &spi3;
> >> +            timer0 = &timer0;
> >> +            timer1 = &timer1;
> >> +            timer2 = &timer2;
> >
> > Don't add random aliases. Really, only the serialN ones should be here.
> > cpu, dma, pinctrl, timer are definitely non-standard.
>
>
> All of these except for cpu and dma are already found in the kernel.
> They were primarily added for U-Boot.
>
> >
> >>      };
> >>
> >>      /*
> >> -     * The K210 has an sv39 MMU following the priviledge specification v1.9.
> >> +     * The K210 has an sv39 MMU following the privileged specification v1.9.
> >>       * Since this is a non-ratified draft specification, the kernel does not
> >>       * support it and the K210 support enabled only for the !MMU case.
> >>       * Be consistent with this by setting the CPUs MMU type to "none".
> >> @@ -30,14 +51,14 @@ cpus {
> >>              timebase-frequency = <7800000>;
> >>              cpu0: cpu at 0 {
> >>                      device_type = "cpu";
> >> +                    compatible = "canaan,k210", "riscv";
> >>                      reg = <0>;
> >> -                    compatible = "kendryte,k210", "sifive,rocket0", "riscv";
> >>                      riscv,isa = "rv64imafdc";
> >> -                    mmu-type = "none";
> >> -                    i-cache-size = <0x8000>;
> >> +                    mmu-type = "riscv,none";
> >>                      i-cache-block-size = <64>;
> >> -                    d-cache-size = <0x8000>;
> >> +                    i-cache-size = <0x8000>;
> >>                      d-cache-block-size = <64>;
> >> +                    d-cache-size = <0x8000>;
> >>                      cpu0_intc: interrupt-controller {
> >>                              #interrupt-cells = <1>;
> >>                              interrupt-controller;
> >> @@ -46,14 +67,14 @@ cpu0_intc: interrupt-controller {
> >>              };
> >>              cpu1: cpu at 1 {
> >>                      device_type = "cpu";
> >> +                    compatible = "canaan,k210", "riscv";
> >>                      reg = <1>;
> >> -                    compatible = "kendryte,k210", "sifive,rocket0", "riscv";
> >>                      riscv,isa = "rv64imafdc";
> >> -                    mmu-type = "none";
> >> -                    i-cache-size = <0x8000>;
> >> +                    mmu-type = "riscv,none";
> >>                      i-cache-block-size = <64>;
> >> -                    d-cache-size = <0x8000>;
> >> +                    i-cache-size = <0x8000>;
> >>                      d-cache-block-size = <64>;
> >> +                    d-cache-size = <0x8000>;
> >>                      cpu1_intc: interrupt-controller {
> >>                              #interrupt-cells = <1>;
> >>                              interrupt-controller;
> >> @@ -64,10 +85,15 @@ cpu1_intc: interrupt-controller {
> >>
> >>      sram: memory at 80000000 {
> >>              device_type = "memory";
> >> +            compatible = "canaan,k210-sram";
> >>              reg = <0x80000000 0x400000>,
> >>                    <0x80400000 0x200000>,
> >>                    <0x80600000 0x200000>;
> >>              reg-names = "sram0", "sram1", "aisram";
> >> +            clocks = <&sysclk K210_CLK_SRAM0>,
> >> +                     <&sysclk K210_CLK_SRAM1>,
> >> +                     <&sysclk K210_CLK_AI>;
> >> +            clock-names = "sram0", "sram1", "aisram";
> >>      };
> >>
> >>      clocks {
> >> @@ -81,40 +107,493 @@ in0: oscillator {
> >>      soc {
> >>              #address-cells = <1>;
> >>              #size-cells = <1>;
> >> -            compatible = "kendryte,k210-soc", "simple-bus";
> >> +            compatible = "simple-bus";
> >>              ranges;
> >>              interrupt-parent = <&plic0>;
> >>
> >> -            sysctl: sysctl at 50440000 {
> >> -                    compatible = "kendryte,k210-sysctl", "simple-mfd";
> >> -                    reg = <0x50440000 0x1000>;
> >> -                    #clock-cells = <1>;
> >> +            debug0: debug at 0 {
> >> +                    compatible = "canaan,k210-debug", "riscv,debug";
> >
> > Not documented.
>
> On 1/14/21 7:06 PM, Sean Anderson wrote:
> > Here it's because "riscv,debug" doesn't exist. This is the "debug"
> > device as described in the debug spec. AFAIK Linux never needs to
> > configure this device. It could probably be removed.
>
> No objections here.
>
> >
> >> +                    reg = <0x0 0x1000>;
> >> +                    status = "disabled";
> >> +            };
> >> +
> >> +            rom0: nvmem at 1000 {
> >> +                    reg = <0x1000 0x1000>;
> >> +                    read-only;
> >> +                    status = "disabled";
> >>              };
> >>
> >>              clint0: clint at 2000000 {
> >
> > interrupt-controller at ...
>
> Yes, this should be changed.
>
> >
> >> -                    #interrupt-cells = <1>;
> >> -                    compatible = "riscv,clint0";
> >> +                    compatible = "canaan,k210-clint", "sifive,clint0";
> >>                      reg = <0x2000000 0xC000>;
> >> -                    interrupts-extended =  <&cpu0_intc 3 &cpu0_intc 7
> >> -                                            &cpu1_intc 3 &cpu1_intc 7>;
> >> +                    interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
> >> +                                          &cpu1_intc 3 &cpu1_intc 7>;
> >>              };
> >>
> >> -            plic0: interrupt-controller at c000000 {
> >> +            plic0: interrupt-controller at C000000 {
> >
> > No, lowercase hex in unit-addresses was correct.
>
> Do you have any authoritative source for this? When I was creating this
> tree, I didn't see anything about what case the addresses should be in
> (and a quick grep for lower-case in Documentation/devicetree doesn't
> have any relevant results).

It's ultimately up to the bus definition, but the DT spec may say
something. I don't recall offhand. For most bus definitions we have a
schema enforcement and dtc has some checks. (Though I just noticed the
simple-bus schema allows uppercase which is an error. dtc does not.)
This case doesn't get caught because there's not a bus definition for
root node. IMO, it should be same as 'simple-bus', but there was some
debate about that when I added the dtc checks.

The other cases should have been flagged by simple-pm-bus.yaml. You
all did run 'make dtbs_check' on this, right?

> >> +                    otp0: nvmem at 50420000 {
> >> +                            #address-cells = <1>;
> >> +                            #size-cells = <1>;
> >> +                            compatible = "canaan,k210-otp";
> >> +                            reg = <0x50420000 0x100>,
> >> +                                  <0x88000000 0x20000>;
> >> +                            reg-names = "reg", "mem";
> >> +                            clocks = <&sysclk K210_CLK_ROM>;
> >> +                            resets = <&sysrst K210_RST_ROM>;
> >> +                            read-only;
> >> +                            status = "disabled";
> >
> > Your disabled nodes seem a bit excessive. A device should really only be
> > disabled if it's a board level decision to use or not. I'd assume the
> > OTP is always there and usable.
>
> It's disabled because there is no driver for it (yet). Though see below
> for the reasoning behind this.

No driver is not really a reason to disable. Why force a DT change
when there is a driver?

> >> +
> >> +                            /* Bootloader */
> >> +                            firmware at 00000 {
> >
> > Drop leading 0s.
> >
> > Is this memory mapped? If so, you are missing 'ranges' in the parent to
> > make it translateable.
>
> Yes, there should be ranges.
>
> Though I am not sure that the ROM is controllable from this OTP...
>
> Perhaps it should be its own node.
>
> >
> >> +                                    reg = <0x00000 0xC200>;
> >> +                            };
> >> +
> >> +                            /*
> >> +                             * config string as described in RISC-V
> >> +                             * privileged spec 1.9
> >> +                             */
> >> +                            config-1-9 at 1c000 {
> >> +                                    reg = <0x1C000 0x1000>;
> >> +                            };
> >> +
> >> +                            /*
> >> +                             * Device tree containing only registers,
> >> +                             * interrupts, and cpus
> >> +                             */
> >> +                            fdt at 1d000 {
> >> +                                    reg = <0x1D000 0x2000>;
> >> +                            };
> >> +
> >> +                            /* CPU/ROM credits */
> >> +                            credits at 1f000 {
> >> +                                    reg = <0x1F000 0x1000>;
> >> +                            };
> >> +                    };
> >> +
> >> +                    dvp0: camera at 50430000 {
> >> +                            compatible = "canaan,k210-dvp";
> >
> > No documented. Seems to be several of them.
>
> Correct. At some point there may be drivers. But there is no
> authoritative information (memory map, list of registers, list of
> interrupts) outside of source code for this board.

Then you should just omit it.

Rob



More information about the linux-riscv mailing list