mbox series

[v6,00/11] riscv: add initial support for Canaan Kendryte K230

Message ID tencent_F76EB8D731C521C18D5D7C4F8229DAA58E08@qq.com
Headers show
Series riscv: add initial support for Canaan Kendryte K230 | expand

Message

Yangyu Chen March 23, 2024, 12:09 p.m. UTC
K230 is an ideal chip for RISC-V Vector 1.0 evaluation now. Add initial
support for it to allow more people to participate in building drivers
to mainline for it.

This kernel has been tested upon factory SDK [1] with
k230_evb_only_linux_defconfig and patched mainline opensbi [2] to skip
locked pmp and successfully booted to busybox on initrd with this log [3].

[1] https://github.com/kendryte/k230_sdk
[2] https://github.com/cyyself/opensbi/tree/k230
[3] https://gist.github.com/cyyself/b9445f38cc3ba1094924bd41c9086176

Changes since v5:
- Deprecate SOC_CANAAN and use SOC_CANAAN_K210 for K210 SoCs
- Modify existing K210 drivers depends on SOC_CANAAN_K210 symbol
- Reword dts commit message
- Modify dts to use Full 512MB memory
- Rebase to linux mainline master

Changes since v4:
- Reword commit message on dts that the B-ext version of c908 is 1.0 rather
  than 1.0-rc1

v4: https://lore.kernel.org/linux-riscv/tencent_587730262984A011834F42D0563BC6B10405@qq.com/

Changes since v3:
- Refactor Kconfig.soc which uses ARCH_CANAAN for regular Canaan SoCs and
  rename SOC_CANAAN to SOC_CANAAN_K210 for K210 in patch [5/7]
- Sort dt-binding stings on Cannan SoCs in alphanumerical order

v3: https://lore.kernel.org/linux-riscv/tencent_BB2364BBF1812F4E304F7BDDD11E57356605@qq.com/

Changes since v2:
- Add MIT License to dts file
- Sort dt-binding stings in alphanumerical order
- Sort filename in dts Makefile in alphanumerical order
- Rename canmv-k230.dts to k230-canmv.dts

v2: https://lore.kernel.org/linux-riscv/tencent_64A9B4B31C2D70D5633042461AC9F80C0509@qq.com/

Changes since v1:
- Patch dt-bindings in clint and plic
- Use enum in K230 compatible dt bindings
- Fix dts to pass `make dtbs_check`
- Add more details in commit message

v1: https://lore.kernel.org/linux-riscv/tencent_E15F8FE0B6769E6338AE690C7F4844A31706@qq.com/

Yangyu Chen (11):
  dt-bindings: riscv: Add T-HEAD C908 compatible
  dt-bindings: add Canaan K230 boards compatible strings
  dt-bindings: timer: Add Canaan K230 CLINT
  dt-bindings: interrupt-controller: Add Canaan K230 PLIC
  riscv: Kconfig.socs: Split ARCH_CANAAN and SOC_CANAAN_K210
  soc: canaan: Deprecate SOC_CANAAN and use SOC_CANAAN_K210 for K210
  clk: k210: Deprecate SOC_CANAAN and use SOC_CANAAN_K210
  pinctrl: k210: Deprecate SOC_CANAAN and use SOC_CANAAN_K210
  reset: k210: Deprecate SOC_CANAAN and use SOC_CANAAN_K210
  riscv: dts: add initial canmv-k230 and k230-evb dts
  riscv: config: enable ARCH_CANAAN in defconfig

 .../sifive,plic-1.0.0.yaml                    |   1 +
 .../devicetree/bindings/riscv/canaan.yaml     |   8 +-
 .../devicetree/bindings/riscv/cpus.yaml       |   1 +
 .../bindings/timer/sifive,clint.yaml          |   1 +
 arch/riscv/Kconfig.socs                       |   8 +-
 arch/riscv/Makefile                           |   2 +-
 arch/riscv/boot/dts/canaan/Makefile           |   2 +
 arch/riscv/boot/dts/canaan/k230-canmv.dts     |  24 +++
 arch/riscv/boot/dts/canaan/k230-evb.dts       |  24 +++
 arch/riscv/boot/dts/canaan/k230.dtsi          | 140 ++++++++++++++++++
 arch/riscv/configs/defconfig                  |   1 +
 arch/riscv/configs/nommu_k210_defconfig       |   3 +-
 .../riscv/configs/nommu_k210_sdcard_defconfig |   3 +-
 drivers/clk/Kconfig                           |   4 +-
 drivers/pinctrl/Kconfig                       |   4 +-
 drivers/reset/Kconfig                         |   4 +-
 drivers/soc/Makefile                          |   2 +-
 drivers/soc/canaan/Kconfig                    |   4 +-
 18 files changed, 220 insertions(+), 16 deletions(-)
 create mode 100644 arch/riscv/boot/dts/canaan/k230-canmv.dts
 create mode 100644 arch/riscv/boot/dts/canaan/k230-evb.dts
 create mode 100644 arch/riscv/boot/dts/canaan/k230.dtsi

base-commit: 8e938e39866920ddc266898e6ae1fffc5c8f51aa

Comments

Icenowy Zheng March 24, 2024, 4:23 p.m. UTC | #1
在 2024-03-23星期六的 20:12 +0800,Yangyu Chen写道:
> Add initial dts for CanMV-K230 and K230-EVB powered by Canaan
> Kendryte
> K230 SoC [1].
> 
> Some key consideration:
> 
> - Only place BigCore which is 1.6GHz RV64GCBV
> 
> The existence of cache coherence between the two cores remains
> unknown
> since they have dedicated L2 caches. And the factory SDK uses it for
> other OS by default. I don't know whether the two CPUs on K230 SoC
> can be used in one system. So only place BigCore here.
> 
> Meanwhile, although docs from Canaan said 1.6GHz Core with Vector is
> CPU1, the CSR.MHARTID of this core is 0.

I assume as these two cores do not have any coherency, they are just in
different hartid namespace.

> 
> - Support for "zba" "zbb" "zbc" "zbs" are tested by hand
> 
> The user manual of C908 from T-Head does not document it
> specifically.
> It just said it supports B extension V1.0. [2]
> 
> I have tested it by using this [3] which attempts to execute
> "add.uw",
> "andn", "clmulr", "bclr" and they doesn't traps on K230. But on
> JH7110,
> "clmulr" and "bclr" will trap.
> 
> - Support for "zicbom" is tested by hand
> 
> Have tested with some out-of-tree drivers from [4] that need DMA and
> they
> do not come to the dts currently.
> 
> - Cache parameters are inferred from T-Head docs [2] and Canaan docs
> [1]
> 
> L1i: 32KB, VIPT 4-Way set-associative, 64B Cacheline
> L1d: 32KB, VIPT 4-Way set-associative, 64B Cacheline
> L2: 256KB, PIPT 16-way set-associative, 64B Cacheline
> 
> The numbers of cache sets are calculated from these parameters.
> 
> - MMU only supports Sv39
> 
> The T-Head docs [2] say the C908 core can be configured to support
> Sv48 and
> Sv39 or only Sv39. On K230, I tried to write "riscv,sv48" on mmu-type
> in
> dts and boot the mainline kernel. However, it failed during the
> kernel
> probe and fell back to Sv39. I also tested it on M-Mode software,
> writing
> Sv48 to satp.mode will not trap but will leave the CSR unchanged.

It's specified by the spec that writing a unsupported mode to SATP will
leave SATP unchanged, and it's also how the kernel detects for Sv48/57.

If a hardware fail to implement this behavior (make SATP changes when
writing an unsupported mode), the kernel will fail to boot and manually
specify MMU mode by putting noXlvl to command line is required. This
behavior may be observed on FSL1030M SoC of Milk-V Vega (if it ever
runs mainline kernel).

> While
> writing Sv39, it will take effect. It shows that this CPU does not
> support
> Sv48.
> 
> - Svpbmt and T-Head MAEE both supported
> 
> T-Head C908 does support both Svpbmt and T-Head MAEE for page-based
> memory
> attributes and is controlled by BIT(21) on CSR.MXSTATUS. The Svpbmt
> is used
> here for mainline kernel support for K230. If the kernel wants to use
> Svpbmt, the M-Mode software should unset BIT(21) of CSR.MXSTATUS
> before
> entering the S-Mode kernel. Otherwise, the kernel will not boot, as 0
> on
> T-Head MAEE is NonCachable Memory. Once the kernel switches from bare
> metal
> to Sv39, It will lose dirty cache line modifications that haven't
> been
> written back to the memory.

As MXSTATUS has a S-mode read-only mirror known as SXSTATUS, maybe the
kernel should detect SXSTATUS to decide whether to use Svpbmt or
Xtheadpbmt (BTW Svnapot conflicts with Xtheadpbmt too).

> 
> [1]
> https://developer.canaan-creative.com/k230/dev/zh/00_hardware/K230_datasheet.html#chapter-1-introduction
> [2]
> https://occ-intl-prod.oss-ap-southeast-1.aliyuncs.com/resource//1699268369347/XuanTie-C908-UserManual.pdf
> [3] https://github.com/cyyself/rvb_test
> [4] https://github.com/cyyself/linux/tree/k230-mainline
> 
> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
> ---
>  arch/riscv/boot/dts/canaan/Makefile       |   2 +
>  arch/riscv/boot/dts/canaan/k230-canmv.dts |  24 ++++
>  arch/riscv/boot/dts/canaan/k230-evb.dts   |  24 ++++
>  arch/riscv/boot/dts/canaan/k230.dtsi      | 140
> ++++++++++++++++++++++
>  4 files changed, 190 insertions(+)
>  create mode 100644 arch/riscv/boot/dts/canaan/k230-canmv.dts
>  create mode 100644 arch/riscv/boot/dts/canaan/k230-evb.dts
>  create mode 100644 arch/riscv/boot/dts/canaan/k230.dtsi
> 
> diff --git a/arch/riscv/boot/dts/canaan/Makefile
> b/arch/riscv/boot/dts/canaan/Makefile
> index 987d1f0c41f0..7d54ea5c6f3d 100644
> --- a/arch/riscv/boot/dts/canaan/Makefile
> +++ b/arch/riscv/boot/dts/canaan/Makefile
> @@ -1,6 +1,8 @@
>  # SPDX-License-Identifier: GPL-2.0
>  dtb-$(CONFIG_ARCH_CANAAN) += canaan_kd233.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += k210_generic.dtb
> +dtb-$(CONFIG_ARCH_CANAAN) += k230-canmv.dtb
> +dtb-$(CONFIG_ARCH_CANAAN) += k230-evb.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_bit.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_dock.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_go.dtb
> diff --git a/arch/riscv/boot/dts/canaan/k230-canmv.dts
> b/arch/riscv/boot/dts/canaan/k230-canmv.dts
> new file mode 100644
> index 000000000000..9565915cead6
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230-canmv.dts
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include "k230.dtsi"
> +
> +/ {
> +       model = "Canaan CanMV-K230";
> +       compatible = "canaan,canmv-k230", "canaan,kendryte-k230";
> +
> +       chosen {
> +               stdout-path = "serial0:115200n8";
> +       };
> +
> +       ddr: memory@0 {
> +               device_type = "memory";
> +               reg = <0x0 0x0 0x0 0x20000000>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/arch/riscv/boot/dts/canaan/k230-evb.dts
> b/arch/riscv/boot/dts/canaan/k230-evb.dts
> new file mode 100644
> index 000000000000..f898b8e62368
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230-evb.dts
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include "k230.dtsi"
> +
> +/ {
> +       model = "Kendryte K230 EVB";
> +       compatible = "canaan,k230-usip-lp3-evb", "canaan,kendryte-
> k230";
> +
> +       chosen {
> +               stdout-path = "serial0:115200n8";
> +       };
> +
> +       ddr: memory@0 {
> +               device_type = "memory";
> +               reg = <0x0 0x0 0x0 0x20000000>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/arch/riscv/boot/dts/canaan/k230.dtsi
> b/arch/riscv/boot/dts/canaan/k230.dtsi
> new file mode 100644
> index 000000000000..7da49498945e
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230.dtsi
> @@ -0,0 +1,140 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include <dt-bindings/interrupt-controller/irq.h>
> +
> +/dts-v1/;
> +/ {
> +       #address-cells = <2>;
> +       #size-cells = <2>;
> +       compatible = "canaan,kendryte-k230";
> +
> +       aliases {
> +               serial0 = &uart0;
> +       };
> +
> +       cpus {
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               timebase-frequency = <27000000>;
> +
> +               cpu@0 {
> +                       compatible = "thead,c908", "riscv";
> +                       device_type = "cpu";
> +                       reg = <0>;
> +                       riscv,isa =
> "rv64imafdcv_zba_zbb_zbc_zbs_zicbom_svpbmt";
> +                       riscv,isa-base = "rv64i";
> +                       riscv,isa-extensions = "i", "m", "a", "f",
> "d", "c", "v", "zba", "zbb",
> +                                              "zbc", "zbs",
> "zicbom", "zicntr", "zicsr",
> +                                              "zifencei", "zihpm",
> "svpbmt";
> +                       riscv,cbom-block-size = <64>;
> +                       d-cache-block-size = <64>;
> +                       d-cache-sets = <128>;
> +                       d-cache-size = <32768>;
> +                       i-cache-block-size = <64>;
> +                       i-cache-sets = <128>;
> +                       i-cache-size = <32768>;
> +                       next-level-cache = <&l2_cache>;
> +                       mmu-type = "riscv,sv39";
> +
> +                       cpu0_intc: interrupt-controller {
> +                               compatible = "riscv,cpu-intc";
> +                               interrupt-controller;
> +                               #interrupt-cells = <1>;
> +                       };
> +               };
> +
> +               l2_cache: l2-cache {
> +                       compatible = "cache";
> +                       cache-block-size = <64>;
> +                       cache-level = <2>;
> +                       cache-size = <262144>;
> +                       cache-sets = <256>;
> +                       cache-unified;
> +               };
> +       };
> +
> +       apb_clk: apb-clk-clock {
> +               compatible = "fixed-clock";
> +               clock-frequency = <50000000>;
> +               clock-output-names = "apb_clk";
> +               #clock-cells = <0>;
> +       };
> +
> +       soc {
> +               compatible = "simple-bus";
> +               interrupt-parent = <&plic>;
> +               #address-cells = <2>;
> +               #size-cells = <2>;
> +               dma-noncoherent;
> +               ranges;
> +
> +               plic: interrupt-controller@f00000000 {
> +                       compatible = "canaan,k230-plic" ,"thead,c900-
> plic";
> +                       reg = <0xf 0x00000000 0x0 0x04000000>;
> +                       interrupts-extended = <&cpu0_intc 11>,
> <&cpu0_intc 9>;
> +                       interrupt-controller;
> +                       #address-cells = <0>;
> +                       #interrupt-cells = <2>;
> +                       riscv,ndev = <208>;
> +               };
> +
> +               clint: timer@f04000000 {
> +                       compatible = "canaan,k230-clint",
> "thead,c900-clint";
> +                       reg = <0xf 0x04000000 0x0 0x00010000>;
> +                       interrupts-extended = <&cpu0_intc 3>,
> <&cpu0_intc 7>;
> +               };
> +
> +               uart0: serial@91400000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91400000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart1: serial@91401000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91401000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart2: serial@91402000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91402000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart3: serial@91403000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91403000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart4: serial@91404000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91404000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +       };
> +};
Icenowy Zheng March 24, 2024, 4:24 p.m. UTC | #2
在 2024-03-23星期六的 20:12 +0800,Yangyu Chen写道:
> Add initial dts for CanMV-K230 and K230-EVB powered by Canaan
> Kendryte
> K230 SoC [1].
> 
> Some key consideration:
> 
> - Only place BigCore which is 1.6GHz RV64GCBV
> 
> The existence of cache coherence between the two cores remains
> unknown
> since they have dedicated L2 caches. And the factory SDK uses it for
> other OS by default. I don't know whether the two CPUs on K230 SoC
> can be used in one system. So only place BigCore here.
> 
> Meanwhile, although docs from Canaan said 1.6GHz Core with Vector is
> CPU1, the CSR.MHARTID of this core is 0.
> 
> - Support for "zba" "zbb" "zbc" "zbs" are tested by hand
> 
> The user manual of C908 from T-Head does not document it
> specifically.
> It just said it supports B extension V1.0. [2]
> 
> I have tested it by using this [3] which attempts to execute
> "add.uw",
> "andn", "clmulr", "bclr" and they doesn't traps on K230. But on
> JH7110,
> "clmulr" and "bclr" will trap.
> 
> - Support for "zicbom" is tested by hand
> 
> Have tested with some out-of-tree drivers from [4] that need DMA and
> they
> do not come to the dts currently.
> 
> - Cache parameters are inferred from T-Head docs [2] and Canaan docs
> [1]
> 
> L1i: 32KB, VIPT 4-Way set-associative, 64B Cacheline
> L1d: 32KB, VIPT 4-Way set-associative, 64B Cacheline
> L2: 256KB, PIPT 16-way set-associative, 64B Cacheline
> 
> The numbers of cache sets are calculated from these parameters.
> 
> - MMU only supports Sv39
> 
> The T-Head docs [2] say the C908 core can be configured to support
> Sv48 and
> Sv39 or only Sv39. On K230, I tried to write "riscv,sv48" on mmu-type
> in
> dts and boot the mainline kernel. However, it failed during the
> kernel
> probe and fell back to Sv39. I also tested it on M-Mode software,
> writing
> Sv48 to satp.mode will not trap but will leave the CSR unchanged.
> While
> writing Sv39, it will take effect. It shows that this CPU does not
> support
> Sv48.
> 
> - Svpbmt and T-Head MAEE both supported
> 
> T-Head C908 does support both Svpbmt and T-Head MAEE for page-based
> memory
> attributes and is controlled by BIT(21) on CSR.MXSTATUS. The Svpbmt
> is used
> here for mainline kernel support for K230. If the kernel wants to use
> Svpbmt, the M-Mode software should unset BIT(21) of CSR.MXSTATUS
> before
> entering the S-Mode kernel. Otherwise, the kernel will not boot, as 0
> on
> T-Head MAEE is NonCachable Memory. Once the kernel switches from bare
> metal
> to Sv39, It will lose dirty cache line modifications that haven't
> been
> written back to the memory.
> 
> [1]
> https://developer.canaan-creative.com/k230/dev/zh/00_hardware/K230_datasheet.html#chapter-1-introduction
> [2]
> https://occ-intl-prod.oss-ap-southeast-1.aliyuncs.com/resource//1699268369347/XuanTie-C908-UserManual.pdf
> [3] https://github.com/cyyself/rvb_test
> [4] https://github.com/cyyself/linux/tree/k230-mainline
> 
> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
> ---
>  arch/riscv/boot/dts/canaan/Makefile       |   2 +
>  arch/riscv/boot/dts/canaan/k230-canmv.dts |  24 ++++
>  arch/riscv/boot/dts/canaan/k230-evb.dts   |  24 ++++
>  arch/riscv/boot/dts/canaan/k230.dtsi      | 140
> ++++++++++++++++++++++
>  4 files changed, 190 insertions(+)
>  create mode 100644 arch/riscv/boot/dts/canaan/k230-canmv.dts
>  create mode 100644 arch/riscv/boot/dts/canaan/k230-evb.dts
>  create mode 100644 arch/riscv/boot/dts/canaan/k230.dtsi
> 
> diff --git a/arch/riscv/boot/dts/canaan/Makefile
> b/arch/riscv/boot/dts/canaan/Makefile
> index 987d1f0c41f0..7d54ea5c6f3d 100644
> --- a/arch/riscv/boot/dts/canaan/Makefile
> +++ b/arch/riscv/boot/dts/canaan/Makefile
> @@ -1,6 +1,8 @@
>  # SPDX-License-Identifier: GPL-2.0
>  dtb-$(CONFIG_ARCH_CANAAN) += canaan_kd233.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += k210_generic.dtb
> +dtb-$(CONFIG_ARCH_CANAAN) += k230-canmv.dtb
> +dtb-$(CONFIG_ARCH_CANAAN) += k230-evb.dtb

BTW did you test on K230 EVB? I think only CanMV is currently publicly
available.

If K230 EVB support is not tested, I suggest not adding it.

>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_bit.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_dock.dtb
>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_go.dtb
> diff --git a/arch/riscv/boot/dts/canaan/k230-canmv.dts
> b/arch/riscv/boot/dts/canaan/k230-canmv.dts
> new file mode 100644
> index 000000000000..9565915cead6
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230-canmv.dts
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include "k230.dtsi"
> +
> +/ {
> +       model = "Canaan CanMV-K230";
> +       compatible = "canaan,canmv-k230", "canaan,kendryte-k230";
> +
> +       chosen {
> +               stdout-path = "serial0:115200n8";
> +       };
> +
> +       ddr: memory@0 {
> +               device_type = "memory";
> +               reg = <0x0 0x0 0x0 0x20000000>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/arch/riscv/boot/dts/canaan/k230-evb.dts
> b/arch/riscv/boot/dts/canaan/k230-evb.dts
> new file mode 100644
> index 000000000000..f898b8e62368
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230-evb.dts
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include "k230.dtsi"
> +
> +/ {
> +       model = "Kendryte K230 EVB";
> +       compatible = "canaan,k230-usip-lp3-evb", "canaan,kendryte-
> k230";
> +
> +       chosen {
> +               stdout-path = "serial0:115200n8";
> +       };
> +
> +       ddr: memory@0 {
> +               device_type = "memory";
> +               reg = <0x0 0x0 0x0 0x20000000>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/arch/riscv/boot/dts/canaan/k230.dtsi
> b/arch/riscv/boot/dts/canaan/k230.dtsi
> new file mode 100644
> index 000000000000..7da49498945e
> --- /dev/null
> +++ b/arch/riscv/boot/dts/canaan/k230.dtsi
> @@ -0,0 +1,140 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
> + */
> +
> +#include <dt-bindings/interrupt-controller/irq.h>
> +
> +/dts-v1/;
> +/ {
> +       #address-cells = <2>;
> +       #size-cells = <2>;
> +       compatible = "canaan,kendryte-k230";
> +
> +       aliases {
> +               serial0 = &uart0;
> +       };
> +
> +       cpus {
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               timebase-frequency = <27000000>;
> +
> +               cpu@0 {
> +                       compatible = "thead,c908", "riscv";
> +                       device_type = "cpu";
> +                       reg = <0>;
> +                       riscv,isa =
> "rv64imafdcv_zba_zbb_zbc_zbs_zicbom_svpbmt";
> +                       riscv,isa-base = "rv64i";
> +                       riscv,isa-extensions = "i", "m", "a", "f",
> "d", "c", "v", "zba", "zbb",
> +                                              "zbc", "zbs",
> "zicbom", "zicntr", "zicsr",
> +                                              "zifencei", "zihpm",
> "svpbmt";
> +                       riscv,cbom-block-size = <64>;
> +                       d-cache-block-size = <64>;
> +                       d-cache-sets = <128>;
> +                       d-cache-size = <32768>;
> +                       i-cache-block-size = <64>;
> +                       i-cache-sets = <128>;
> +                       i-cache-size = <32768>;
> +                       next-level-cache = <&l2_cache>;
> +                       mmu-type = "riscv,sv39";
> +
> +                       cpu0_intc: interrupt-controller {
> +                               compatible = "riscv,cpu-intc";
> +                               interrupt-controller;
> +                               #interrupt-cells = <1>;
> +                       };
> +               };
> +
> +               l2_cache: l2-cache {
> +                       compatible = "cache";
> +                       cache-block-size = <64>;
> +                       cache-level = <2>;
> +                       cache-size = <262144>;
> +                       cache-sets = <256>;
> +                       cache-unified;
> +               };
> +       };
> +
> +       apb_clk: apb-clk-clock {
> +               compatible = "fixed-clock";
> +               clock-frequency = <50000000>;
> +               clock-output-names = "apb_clk";
> +               #clock-cells = <0>;
> +       };
> +
> +       soc {
> +               compatible = "simple-bus";
> +               interrupt-parent = <&plic>;
> +               #address-cells = <2>;
> +               #size-cells = <2>;
> +               dma-noncoherent;
> +               ranges;
> +
> +               plic: interrupt-controller@f00000000 {
> +                       compatible = "canaan,k230-plic" ,"thead,c900-
> plic";
> +                       reg = <0xf 0x00000000 0x0 0x04000000>;
> +                       interrupts-extended = <&cpu0_intc 11>,
> <&cpu0_intc 9>;
> +                       interrupt-controller;
> +                       #address-cells = <0>;
> +                       #interrupt-cells = <2>;
> +                       riscv,ndev = <208>;
> +               };
> +
> +               clint: timer@f04000000 {
> +                       compatible = "canaan,k230-clint",
> "thead,c900-clint";
> +                       reg = <0xf 0x04000000 0x0 0x00010000>;
> +                       interrupts-extended = <&cpu0_intc 3>,
> <&cpu0_intc 7>;
> +               };
> +
> +               uart0: serial@91400000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91400000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart1: serial@91401000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91401000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart2: serial@91402000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91402000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart3: serial@91403000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91403000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +
> +               uart4: serial@91404000 {
> +                       compatible = "snps,dw-apb-uart";
> +                       reg = <0x0 0x91404000 0x0 0x1000>;
> +                       clocks = <&apb_clk>;
> +                       interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
> +                       reg-io-width = <4>;
> +                       reg-shift = <2>;
> +                       status = "disabled";
> +               };
> +       };
> +};
Yangyu Chen March 25, 2024, 2:59 a.m. UTC | #3
> On Mar 25, 2024, at 00:24, Icenowy Zheng <uwu@icenowy.me> wrote:
> 
> 在 2024-03-23星期六的 20:12 +0800,Yangyu Chen写道:
>> Add initial dts for CanMV-K230 and K230-EVB powered by Canaan
>> Kendryte
>> K230 SoC [1].
>> 
>> Some key consideration:
>> 
>> - Only place BigCore which is 1.6GHz RV64GCBV
>> 
>> The existence of cache coherence between the two cores remains
>> unknown
>> since they have dedicated L2 caches. And the factory SDK uses it for
>> other OS by default. I don't know whether the two CPUs on K230 SoC
>> can be used in one system. So only place BigCore here.
>> 
>> Meanwhile, although docs from Canaan said 1.6GHz Core with Vector is
>> CPU1, the CSR.MHARTID of this core is 0.
>> 
>> - Support for "zba" "zbb" "zbc" "zbs" are tested by hand
>> 
>> The user manual of C908 from T-Head does not document it
>> specifically.
>> It just said it supports B extension V1.0. [2]
>> 
>> I have tested it by using this [3] which attempts to execute
>> "add.uw",
>> "andn", "clmulr", "bclr" and they doesn't traps on K230. But on
>> JH7110,
>> "clmulr" and "bclr" will trap.
>> 
>> - Support for "zicbom" is tested by hand
>> 
>> Have tested with some out-of-tree drivers from [4] that need DMA and
>> they
>> do not come to the dts currently.
>> 
>> - Cache parameters are inferred from T-Head docs [2] and Canaan docs
>> [1]
>> 
>> L1i: 32KB, VIPT 4-Way set-associative, 64B Cacheline
>> L1d: 32KB, VIPT 4-Way set-associative, 64B Cacheline
>> L2: 256KB, PIPT 16-way set-associative, 64B Cacheline
>> 
>> The numbers of cache sets are calculated from these parameters.
>> 
>> - MMU only supports Sv39
>> 
>> The T-Head docs [2] say the C908 core can be configured to support
>> Sv48 and
>> Sv39 or only Sv39. On K230, I tried to write "riscv,sv48" on mmu-type
>> in
>> dts and boot the mainline kernel. However, it failed during the
>> kernel
>> probe and fell back to Sv39. I also tested it on M-Mode software,
>> writing
>> Sv48 to satp.mode will not trap but will leave the CSR unchanged.
>> While
>> writing Sv39, it will take effect. It shows that this CPU does not
>> support
>> Sv48.
>> 
>> - Svpbmt and T-Head MAEE both supported
>> 
>> T-Head C908 does support both Svpbmt and T-Head MAEE for page-based
>> memory
>> attributes and is controlled by BIT(21) on CSR.MXSTATUS. The Svpbmt
>> is used
>> here for mainline kernel support for K230. If the kernel wants to use
>> Svpbmt, the M-Mode software should unset BIT(21) of CSR.MXSTATUS
>> before
>> entering the S-Mode kernel. Otherwise, the kernel will not boot, as 0
>> on
>> T-Head MAEE is NonCachable Memory. Once the kernel switches from bare
>> metal
>> to Sv39, It will lose dirty cache line modifications that haven't
>> been
>> written back to the memory.
>> 
>> [1]
>> https://developer.canaan-creative.com/k230/dev/zh/00_hardware/K230_datasheet.html#chapter-1-introduction
>> [2]
>> https://occ-intl-prod.oss-ap-southeast-1.aliyuncs.com/resource//1699268369347/XuanTie-C908-UserManual.pdf
>> [3] https://github.com/cyyself/rvb_test
>> [4] https://github.com/cyyself/linux/tree/k230-mainline
>> 
>> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
>> ---
>>  arch/riscv/boot/dts/canaan/Makefile       |   2 +
>>  arch/riscv/boot/dts/canaan/k230-canmv.dts |  24 ++++
>>  arch/riscv/boot/dts/canaan/k230-evb.dts   |  24 ++++
>>  arch/riscv/boot/dts/canaan/k230.dtsi      | 140
>> ++++++++++++++++++++++
>>  4 files changed, 190 insertions(+)
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230-canmv.dts
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230-evb.dts
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230.dtsi
>> 
>> diff --git a/arch/riscv/boot/dts/canaan/Makefile
>> b/arch/riscv/boot/dts/canaan/Makefile
>> index 987d1f0c41f0..7d54ea5c6f3d 100644
>> --- a/arch/riscv/boot/dts/canaan/Makefile
>> +++ b/arch/riscv/boot/dts/canaan/Makefile
>> @@ -1,6 +1,8 @@
>>  # SPDX-License-Identifier: GPL-2.0
>>  dtb-$(CONFIG_ARCH_CANAAN) += canaan_kd233.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += k210_generic.dtb
>> +dtb-$(CONFIG_ARCH_CANAAN) += k230-canmv.dtb
>> +dtb-$(CONFIG_ARCH_CANAAN) += k230-evb.dtb
> 
> BTW did you test on K230 EVB? I think only CanMV is currently publicly
> available.
> 
> If K230 EVB support is not tested, I suggest not adding it.
> 

Actually I got one K230 EVB and tested on it.

>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_bit.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_dock.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_go.dtb
>> diff --git a/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> b/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> new file mode 100644
>> index 000000000000..9565915cead6
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> @@ -0,0 +1,24 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include "k230.dtsi"
>> +
>> +/ {
>> +       model = "Canaan CanMV-K230";
>> +       compatible = "canaan,canmv-k230", "canaan,kendryte-k230";
>> +
>> +       chosen {
>> +               stdout-path = "serial0:115200n8";
>> +       };
>> +
>> +       ddr: memory@0 {
>> +               device_type = "memory";
>> +               reg = <0x0 0x0 0x0 0x20000000>;
>> +       };
>> +};
>> +
>> +&uart0 {
>> +       status = "okay";
>> +};
>> diff --git a/arch/riscv/boot/dts/canaan/k230-evb.dts
>> b/arch/riscv/boot/dts/canaan/k230-evb.dts
>> new file mode 100644
>> index 000000000000..f898b8e62368
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230-evb.dts
>> @@ -0,0 +1,24 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include "k230.dtsi"
>> +
>> +/ {
>> +       model = "Kendryte K230 EVB";
>> +       compatible = "canaan,k230-usip-lp3-evb", "canaan,kendryte-
>> k230";
>> +
>> +       chosen {
>> +               stdout-path = "serial0:115200n8";
>> +       };
>> +
>> +       ddr: memory@0 {
>> +               device_type = "memory";
>> +               reg = <0x0 0x0 0x0 0x20000000>;
>> +       };
>> +};
>> +
>> +&uart0 {
>> +       status = "okay";
>> +};
>> diff --git a/arch/riscv/boot/dts/canaan/k230.dtsi
>> b/arch/riscv/boot/dts/canaan/k230.dtsi
>> new file mode 100644
>> index 000000000000..7da49498945e
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230.dtsi
>> @@ -0,0 +1,140 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include <dt-bindings/interrupt-controller/irq.h>
>> +
>> +/dts-v1/;
>> +/ {
>> +       #address-cells = <2>;
>> +       #size-cells = <2>;
>> +       compatible = "canaan,kendryte-k230";
>> +
>> +       aliases {
>> +               serial0 = &uart0;
>> +       };
>> +
>> +       cpus {
>> +               #address-cells = <1>;
>> +               #size-cells = <0>;
>> +               timebase-frequency = <27000000>;
>> +
>> +               cpu@0 {
>> +                       compatible = "thead,c908", "riscv";
>> +                       device_type = "cpu";
>> +                       reg = <0>;
>> +                       riscv,isa =
>> "rv64imafdcv_zba_zbb_zbc_zbs_zicbom_svpbmt";
>> +                       riscv,isa-base = "rv64i";
>> +                       riscv,isa-extensions = "i", "m", "a", "f",
>> "d", "c", "v", "zba", "zbb",
>> +                                              "zbc", "zbs",
>> "zicbom", "zicntr", "zicsr",
>> +                                              "zifencei", "zihpm",
>> "svpbmt";
>> +                       riscv,cbom-block-size = <64>;
>> +                       d-cache-block-size = <64>;
>> +                       d-cache-sets = <128>;
>> +                       d-cache-size = <32768>;
>> +                       i-cache-block-size = <64>;
>> +                       i-cache-sets = <128>;
>> +                       i-cache-size = <32768>;
>> +                       next-level-cache = <&l2_cache>;
>> +                       mmu-type = "riscv,sv39";
>> +
>> +                       cpu0_intc: interrupt-controller {
>> +                               compatible = "riscv,cpu-intc";
>> +                               interrupt-controller;
>> +                               #interrupt-cells = <1>;
>> +                       };
>> +               };
>> +
>> +               l2_cache: l2-cache {
>> +                       compatible = "cache";
>> +                       cache-block-size = <64>;
>> +                       cache-level = <2>;
>> +                       cache-size = <262144>;
>> +                       cache-sets = <256>;
>> +                       cache-unified;
>> +               };
>> +       };
>> +
>> +       apb_clk: apb-clk-clock {
>> +               compatible = "fixed-clock";
>> +               clock-frequency = <50000000>;
>> +               clock-output-names = "apb_clk";
>> +               #clock-cells = <0>;
>> +       };
>> +
>> +       soc {
>> +               compatible = "simple-bus";
>> +               interrupt-parent = <&plic>;
>> +               #address-cells = <2>;
>> +               #size-cells = <2>;
>> +               dma-noncoherent;
>> +               ranges;
>> +
>> +               plic: interrupt-controller@f00000000 {
>> +                       compatible = "canaan,k230-plic" ,"thead,c900-
>> plic";
>> +                       reg = <0xf 0x00000000 0x0 0x04000000>;
>> +                       interrupts-extended = <&cpu0_intc 11>,
>> <&cpu0_intc 9>;
>> +                       interrupt-controller;
>> +                       #address-cells = <0>;
>> +                       #interrupt-cells = <2>;
>> +                       riscv,ndev = <208>;
>> +               };
>> +
>> +               clint: timer@f04000000 {
>> +                       compatible = "canaan,k230-clint",
>> "thead,c900-clint";
>> +                       reg = <0xf 0x04000000 0x0 0x00010000>;
>> +                       interrupts-extended = <&cpu0_intc 3>,
>> <&cpu0_intc 7>;
>> +               };
>> +
>> +               uart0: serial@91400000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91400000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart1: serial@91401000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91401000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart2: serial@91402000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91402000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart3: serial@91403000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91403000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart4: serial@91404000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91404000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +       };
>> +};
>
Yangyu Chen March 25, 2024, 3:10 a.m. UTC | #4
> On Mar 25, 2024, at 00:23, Icenowy Zheng <uwu@icenowy.me> wrote:
> 
> 在 2024-03-23星期六的 20:12 +0800,Yangyu Chen写道:
>> Add initial dts for CanMV-K230 and K230-EVB powered by Canaan
>> Kendryte
>> K230 SoC [1].
>> 
>> Some key consideration:
>> 
>> - Only place BigCore which is 1.6GHz RV64GCBV
>> 
>> The existence of cache coherence between the two cores remains
>> unknown
>> since they have dedicated L2 caches. And the factory SDK uses it for
>> other OS by default. I don't know whether the two CPUs on K230 SoC
>> can be used in one system. So only place BigCore here.
>> 
>> Meanwhile, although docs from Canaan said 1.6GHz Core with Vector is
>> CPU1, the CSR.MHARTID of this core is 0.
> 
> I assume as these two cores do not have any coherency, they are just in
> different hartid namespace.
> 

Thanks for this hint.

>> 
>> - Support for "zba" "zbb" "zbc" "zbs" are tested by hand
>> 
>> The user manual of C908 from T-Head does not document it
>> specifically.
>> It just said it supports B extension V1.0. [2]
>> 
>> I have tested it by using this [3] which attempts to execute
>> "add.uw",
>> "andn", "clmulr", "bclr" and they doesn't traps on K230. But on
>> JH7110,
>> "clmulr" and "bclr" will trap.
>> 
>> - Support for "zicbom" is tested by hand
>> 
>> Have tested with some out-of-tree drivers from [4] that need DMA and
>> they
>> do not come to the dts currently.
>> 
>> - Cache parameters are inferred from T-Head docs [2] and Canaan docs
>> [1]
>> 
>> L1i: 32KB, VIPT 4-Way set-associative, 64B Cacheline
>> L1d: 32KB, VIPT 4-Way set-associative, 64B Cacheline
>> L2: 256KB, PIPT 16-way set-associative, 64B Cacheline
>> 
>> The numbers of cache sets are calculated from these parameters.
>> 
>> - MMU only supports Sv39
>> 
>> The T-Head docs [2] say the C908 core can be configured to support
>> Sv48 and
>> Sv39 or only Sv39. On K230, I tried to write "riscv,sv48" on mmu-type
>> in
>> dts and boot the mainline kernel. However, it failed during the
>> kernel
>> probe and fell back to Sv39. I also tested it on M-Mode software,
>> writing
>> Sv48 to satp.mode will not trap but will leave the CSR unchanged.
> 
> It's specified by the spec that writing a unsupported mode to SATP will
> leave SATP unchanged, and it's also how the kernel detects for Sv48/57.
> 
> If a hardware fail to implement this behavior (make SATP changes when
> writing an unsupported mode), the kernel will fail to boot and manually
> specify MMU mode by putting noXlvl to command line is required. This
> behavior may be observed on FSL1030M SoC of Milk-V Vega (if it ever
> runs mainline kernel).
> 

OK.

>> While
>> writing Sv39, it will take effect. It shows that this CPU does not
>> support
>> Sv48.
>> 
>> - Svpbmt and T-Head MAEE both supported
>> 
>> T-Head C908 does support both Svpbmt and T-Head MAEE for page-based
>> memory
>> attributes and is controlled by BIT(21) on CSR.MXSTATUS. The Svpbmt
>> is used
>> here for mainline kernel support for K230. If the kernel wants to use
>> Svpbmt, the M-Mode software should unset BIT(21) of CSR.MXSTATUS
>> before
>> entering the S-Mode kernel. Otherwise, the kernel will not boot, as 0
>> on
>> T-Head MAEE is NonCachable Memory. Once the kernel switches from bare
>> metal
>> to Sv39, It will lose dirty cache line modifications that haven't
>> been
>> written back to the memory.
> 
> As MXSTATUS has a S-mode read-only mirror known as SXSTATUS, maybe the
> kernel should detect SXSTATUS to decide whether to use Svpbmt or
> Xtheadpbmt (BTW Svnapot conflicts with Xtheadpbmt too).
> 

Thanks for this hint. I may need to change some code in the T-Head PBMT probe.

>> 
>> [1]
>> https://developer.canaan-creative.com/k230/dev/zh/00_hardware/K230_datasheet.html#chapter-1-introduction
>> [2]
>> https://occ-intl-prod.oss-ap-southeast-1.aliyuncs.com/resource//1699268369347/XuanTie-C908-UserManual.pdf
>> [3] https://github.com/cyyself/rvb_test
>> [4] https://github.com/cyyself/linux/tree/k230-mainline
>> 
>> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
>> ---
>>  arch/riscv/boot/dts/canaan/Makefile       |   2 +
>>  arch/riscv/boot/dts/canaan/k230-canmv.dts |  24 ++++
>>  arch/riscv/boot/dts/canaan/k230-evb.dts   |  24 ++++
>>  arch/riscv/boot/dts/canaan/k230.dtsi      | 140
>> ++++++++++++++++++++++
>>  4 files changed, 190 insertions(+)
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230-canmv.dts
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230-evb.dts
>>  create mode 100644 arch/riscv/boot/dts/canaan/k230.dtsi
>> 
>> diff --git a/arch/riscv/boot/dts/canaan/Makefile
>> b/arch/riscv/boot/dts/canaan/Makefile
>> index 987d1f0c41f0..7d54ea5c6f3d 100644
>> --- a/arch/riscv/boot/dts/canaan/Makefile
>> +++ b/arch/riscv/boot/dts/canaan/Makefile
>> @@ -1,6 +1,8 @@
>>  # SPDX-License-Identifier: GPL-2.0
>>  dtb-$(CONFIG_ARCH_CANAAN) += canaan_kd233.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += k210_generic.dtb
>> +dtb-$(CONFIG_ARCH_CANAAN) += k230-canmv.dtb
>> +dtb-$(CONFIG_ARCH_CANAAN) += k230-evb.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_bit.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_dock.dtb
>>  dtb-$(CONFIG_ARCH_CANAAN) += sipeed_maix_go.dtb
>> diff --git a/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> b/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> new file mode 100644
>> index 000000000000..9565915cead6
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230-canmv.dts
>> @@ -0,0 +1,24 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include "k230.dtsi"
>> +
>> +/ {
>> +       model = "Canaan CanMV-K230";
>> +       compatible = "canaan,canmv-k230", "canaan,kendryte-k230";
>> +
>> +       chosen {
>> +               stdout-path = "serial0:115200n8";
>> +       };
>> +
>> +       ddr: memory@0 {
>> +               device_type = "memory";
>> +               reg = <0x0 0x0 0x0 0x20000000>;
>> +       };
>> +};
>> +
>> +&uart0 {
>> +       status = "okay";
>> +};
>> diff --git a/arch/riscv/boot/dts/canaan/k230-evb.dts
>> b/arch/riscv/boot/dts/canaan/k230-evb.dts
>> new file mode 100644
>> index 000000000000..f898b8e62368
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230-evb.dts
>> @@ -0,0 +1,24 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include "k230.dtsi"
>> +
>> +/ {
>> +       model = "Kendryte K230 EVB";
>> +       compatible = "canaan,k230-usip-lp3-evb", "canaan,kendryte-
>> k230";
>> +
>> +       chosen {
>> +               stdout-path = "serial0:115200n8";
>> +       };
>> +
>> +       ddr: memory@0 {
>> +               device_type = "memory";
>> +               reg = <0x0 0x0 0x0 0x20000000>;
>> +       };
>> +};
>> +
>> +&uart0 {
>> +       status = "okay";
>> +};
>> diff --git a/arch/riscv/boot/dts/canaan/k230.dtsi
>> b/arch/riscv/boot/dts/canaan/k230.dtsi
>> new file mode 100644
>> index 000000000000..7da49498945e
>> --- /dev/null
>> +++ b/arch/riscv/boot/dts/canaan/k230.dtsi
>> @@ -0,0 +1,140 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR MIT
>> +/*
>> + * Copyright (C) 2024 Yangyu Chen <cyy@cyyself.name>
>> + */
>> +
>> +#include <dt-bindings/interrupt-controller/irq.h>
>> +
>> +/dts-v1/;
>> +/ {
>> +       #address-cells = <2>;
>> +       #size-cells = <2>;
>> +       compatible = "canaan,kendryte-k230";
>> +
>> +       aliases {
>> +               serial0 = &uart0;
>> +       };
>> +
>> +       cpus {
>> +               #address-cells = <1>;
>> +               #size-cells = <0>;
>> +               timebase-frequency = <27000000>;
>> +
>> +               cpu@0 {
>> +                       compatible = "thead,c908", "riscv";
>> +                       device_type = "cpu";
>> +                       reg = <0>;
>> +                       riscv,isa =
>> "rv64imafdcv_zba_zbb_zbc_zbs_zicbom_svpbmt";
>> +                       riscv,isa-base = "rv64i";
>> +                       riscv,isa-extensions = "i", "m", "a", "f",
>> "d", "c", "v", "zba", "zbb",
>> +                                              "zbc", "zbs",
>> "zicbom", "zicntr", "zicsr",
>> +                                              "zifencei", "zihpm",
>> "svpbmt";
>> +                       riscv,cbom-block-size = <64>;
>> +                       d-cache-block-size = <64>;
>> +                       d-cache-sets = <128>;
>> +                       d-cache-size = <32768>;
>> +                       i-cache-block-size = <64>;
>> +                       i-cache-sets = <128>;
>> +                       i-cache-size = <32768>;
>> +                       next-level-cache = <&l2_cache>;
>> +                       mmu-type = "riscv,sv39";
>> +
>> +                       cpu0_intc: interrupt-controller {
>> +                               compatible = "riscv,cpu-intc";
>> +                               interrupt-controller;
>> +                               #interrupt-cells = <1>;
>> +                       };
>> +               };
>> +
>> +               l2_cache: l2-cache {
>> +                       compatible = "cache";
>> +                       cache-block-size = <64>;
>> +                       cache-level = <2>;
>> +                       cache-size = <262144>;
>> +                       cache-sets = <256>;
>> +                       cache-unified;
>> +               };
>> +       };
>> +
>> +       apb_clk: apb-clk-clock {
>> +               compatible = "fixed-clock";
>> +               clock-frequency = <50000000>;
>> +               clock-output-names = "apb_clk";
>> +               #clock-cells = <0>;
>> +       };
>> +
>> +       soc {
>> +               compatible = "simple-bus";
>> +               interrupt-parent = <&plic>;
>> +               #address-cells = <2>;
>> +               #size-cells = <2>;
>> +               dma-noncoherent;
>> +               ranges;
>> +
>> +               plic: interrupt-controller@f00000000 {
>> +                       compatible = "canaan,k230-plic" ,"thead,c900-
>> plic";
>> +                       reg = <0xf 0x00000000 0x0 0x04000000>;
>> +                       interrupts-extended = <&cpu0_intc 11>,
>> <&cpu0_intc 9>;
>> +                       interrupt-controller;
>> +                       #address-cells = <0>;
>> +                       #interrupt-cells = <2>;
>> +                       riscv,ndev = <208>;
>> +               };
>> +
>> +               clint: timer@f04000000 {
>> +                       compatible = "canaan,k230-clint",
>> "thead,c900-clint";
>> +                       reg = <0xf 0x04000000 0x0 0x00010000>;
>> +                       interrupts-extended = <&cpu0_intc 3>,
>> <&cpu0_intc 7>;
>> +               };
>> +
>> +               uart0: serial@91400000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91400000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart1: serial@91401000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91401000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart2: serial@91402000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91402000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart3: serial@91403000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91403000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               uart4: serial@91404000 {
>> +                       compatible = "snps,dw-apb-uart";
>> +                       reg = <0x0 0x91404000 0x0 0x1000>;
>> +                       clocks = <&apb_clk>;
>> +                       interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>> +                       reg-io-width = <4>;
>> +                       reg-shift = <2>;
>> +                       status = "disabled";
>> +               };
>> +       };
>> +};
>
Dan Carpenter March 25, 2024, 10:52 a.m. UTC | #5
On Sat, Mar 23, 2024 at 08:12:17PM +0800, Yangyu Chen wrote:
> Since SOC_FOO should be deprecated from patch [1], and cleanup for other
> SoCs is already on the mailing list [2,3,4], we remove the use of
> SOC_CANAAN and use ARCH_CANAAN for SoCs vendored by Canaan instead from
> now on. And allows ARCH_CANAAN to be selected for other Canaan SoCs.
> 
> Then, since we have Canaan Kendryte K230 with MMU now, the use of
> SOC_CANAAN is no longer only referred to K210. Thus, we introduce a new
> symbol SOC_CANAAN_K210 for any conditional code or driver selection
> specific to the K210, so users will not try to build some K210-specific
> things when MMU is enabled and see it fails to boot on K210.
> 
> [1] https://lore.kernel.org/linux-riscv/20221121221414.109965-1-conor@kernel.org/
> [2] https://lore.kernel.org/linux-riscv/20240305-praying-clad-c4fbcaa7ed0a@spud/
> [3] https://lore.kernel.org/linux-riscv/20240305-fled-undrilled-41dc0c46bb29@spud/
> [4] https://lore.kernel.org/linux-riscv/20240305-stress-earflap-d7ddb8655a4d@spud/
> 
> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
> ---
>  arch/riscv/Kconfig.socs                        | 8 +++++---
>  arch/riscv/Makefile                            | 2 +-
>  arch/riscv/configs/nommu_k210_defconfig        | 3 ++-
>  arch/riscv/configs/nommu_k210_sdcard_defconfig | 3 ++-
>  4 files changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs
> index 623de5f8a208..5710aee456ac 100644
> --- a/arch/riscv/Kconfig.socs
> +++ b/arch/riscv/Kconfig.socs
> @@ -72,11 +72,13 @@ config SOC_VIRT
>  	  This enables support for QEMU Virt Machine.
>  
>  config ARCH_CANAAN
> -	def_bool SOC_CANAAN
> +	bool "Canaan Kendryte SoC"
> +	help
> +	  This enables support for Canaan Kendryte SoC platform hardware.
>  
> -config SOC_CANAAN
> +config SOC_CANAAN_K210

This breaks git bisect, right?  There are references to SOC_CANAAN that
are get updated later in the patch series.  You can't delete SOC_CANAAN
and leave the other references dangling.

regards,
dan carpenter
Conor Dooley March 25, 2024, 11:10 a.m. UTC | #6
On Mon, Mar 25, 2024 at 01:52:42PM +0300, Dan Carpenter wrote:
> On Sat, Mar 23, 2024 at 08:12:17PM +0800, Yangyu Chen wrote:
> > Since SOC_FOO should be deprecated from patch [1], and cleanup for other
> > SoCs is already on the mailing list [2,3,4], we remove the use of
> > SOC_CANAAN and use ARCH_CANAAN for SoCs vendored by Canaan instead from
> > now on. And allows ARCH_CANAAN to be selected for other Canaan SoCs.
> > 
> > Then, since we have Canaan Kendryte K230 with MMU now, the use of
> > SOC_CANAAN is no longer only referred to K210. Thus, we introduce a new
> > symbol SOC_CANAAN_K210 for any conditional code or driver selection
> > specific to the K210, so users will not try to build some K210-specific
> > things when MMU is enabled and see it fails to boot on K210.
> > 
> > [1] https://lore.kernel.org/linux-riscv/20221121221414.109965-1-conor@kernel.org/
> > [2] https://lore.kernel.org/linux-riscv/20240305-praying-clad-c4fbcaa7ed0a@spud/
> > [3] https://lore.kernel.org/linux-riscv/20240305-fled-undrilled-41dc0c46bb29@spud/
> > [4] https://lore.kernel.org/linux-riscv/20240305-stress-earflap-d7ddb8655a4d@spud/
> > 
> > Signed-off-by: Yangyu Chen <cyy@cyyself.name>
> > ---
> >  arch/riscv/Kconfig.socs                        | 8 +++++---
> >  arch/riscv/Makefile                            | 2 +-
> >  arch/riscv/configs/nommu_k210_defconfig        | 3 ++-
> >  arch/riscv/configs/nommu_k210_sdcard_defconfig | 3 ++-
> >  4 files changed, 10 insertions(+), 6 deletions(-)
> > 
> > diff --git a/arch/riscv/Kconfig.socs b/arch/riscv/Kconfig.socs
> > index 623de5f8a208..5710aee456ac 100644
> > --- a/arch/riscv/Kconfig.socs
> > +++ b/arch/riscv/Kconfig.socs
> > @@ -72,11 +72,13 @@ config SOC_VIRT
> >  	  This enables support for QEMU Virt Machine.
> >  
> >  config ARCH_CANAAN
> > -	def_bool SOC_CANAAN
> > +	bool "Canaan Kendryte SoC"
> > +	help
> > +	  This enables support for Canaan Kendryte SoC platform hardware.
> >  
> > -config SOC_CANAAN
> > +config SOC_CANAAN_K210
> 
> This breaks git bisect, right?  There are references to SOC_CANAAN that
> are get updated later in the patch series.  You can't delete SOC_CANAAN
> and leave the other references dangling.

Right. I thought that I had said to resend the patch from v5 and solicit
acks to take it via the soc tree [1]. Splitting it out like this means you
have to introduce a symbol that shadows the original one and then switch
only once all references have been removed. If this series went into 6.10,
which it should, the switch would be in 6.11. I think the chances of a
meaningful conflict are low with the treewide swap so it should be safe
to do.


1 - https://lore.kernel.org/all/20240320-ideology-pasty-d3aea07cc519@spud/
Stephen Boyd April 5, 2024, 9:47 p.m. UTC | #7
Quoting Yangyu Chen (2024-03-23 05:12:19)
> Since SOC_FOO should be deprecated from patch [1], and cleanup for other
> SoCs is already on the mailing list [2,3,4], we remove the use of
> SOC_CANAAN and introduced SOC_CANAAN_K210 for K210-specific drivers,
> 
> Thus, we replace its drivers depends on SOC_CANAAN_K210 and default select
> when it has the symbol SOC_CANAAN_K210.
> 
> [1] https://lore.kernel.org/linux-riscv/20221121221414.109965-1-conor@kernel.org/
> [2] https://lore.kernel.org/linux-riscv/20240305-praying-clad-c4fbcaa7ed0a@spud/
> [3] https://lore.kernel.org/linux-riscv/20240305-fled-undrilled-41dc0c46bb29@spud/
> [4] https://lore.kernel.org/linux-riscv/20240305-stress-earflap-d7ddb8655a4d@spud/
> 
> Signed-off-by: Yangyu Chen <cyy@cyyself.name>
> ---

Acked-by: Stephen Boyd <sboyd@kernel.org>