Add the RK3576 NPU: rknn_core_0/1 and rknn_mmu_0/1, with register
addresses, GIC_SPI 247/248 interrupts, clocks, resets and power-domains.

Run the full RKNN clock set (CLK_RKNN_DSU0, ACLK_RKNN0/1, HCLK_RKNN_ROOT,
ACLK/HCLK_RKNN_CBUF) during the NPU0/NPU1 power transitions and on the
MMU nodes; without the functional and CBUF clocks the block powers on but
its registers (including the IOMMU banks) read back dead. Drive the RKNN
BIU reset (SRST_A_RKNN0/1_BIU) from the power domain so it fires before
the IOMMU resumes.

Signed-off-by: Jiaxing Hu <[email protected]>
---
 arch/arm64/boot/dts/rockchip/rk3576.dtsi | 78 +++++++++++++++++++++++-
 1 file changed, 76 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
index e12a2a0cf..5033f7628 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
@@ -1070,14 +1070,22 @@ power-domain@RK3576_PD_NPUTOP {
                                                power-domain@RK3576_PD_NPU0 {
                                                        reg = <RK3576_PD_NPU0>;
                                                        clocks = <&cru 
HCLK_RKNN_ROOT>,
-                                                                <&cru 
ACLK_RKNN0>;
+                                                                <&cru 
ACLK_RKNN0>,
+                                                                <&cru 
CLK_RKNN_DSU0>,
+                                                                <&cru 
ACLK_RKNN_CBUF>,
+                                                                <&cru 
HCLK_RKNN_CBUF>;
+                                                       resets = <&cru 
SRST_A_RKNN0_BIU>;
                                                        pm_qos = <&qos_npu_m0>;
                                                        #power-domain-cells = 
<0>;
                                                };
                                                power-domain@RK3576_PD_NPU1 {
                                                        reg = <RK3576_PD_NPU1>;
                                                        clocks = <&cru 
HCLK_RKNN_ROOT>,
-                                                                <&cru 
ACLK_RKNN1>;
+                                                                <&cru 
ACLK_RKNN1>,
+                                                                <&cru 
CLK_RKNN_DSU0>,
+                                                                <&cru 
ACLK_RKNN_CBUF>,
+                                                                <&cru 
HCLK_RKNN_CBUF>;
+                                                       resets = <&cru 
SRST_A_RKNN1_BIU>;
                                                        pm_qos = <&qos_npu_m1>;
                                                        #power-domain-cells = 
<0>;
                                                };
@@ -1804,6 +1812,72 @@ qos_npu_m1ro: qos@27f22100 {
                        reg = <0x0 0x27f22100 0x0 0x20>;
                };
 
+               rknn_core_0: npu@27700000 {
+                       compatible = "rockchip,rk3576-rknn-core";
+                       reg = <0x0 0x27700000 0x0 0x1000>,
+                             <0x0 0x27701000 0x0 0x1000>,
+                             <0x0 0x27703000 0x0 0x1000>,
+                             <0x0 0x27704000 0x0 0x1000>,
+                             <0x0 0x27705000 0x0 0x1000>;
+                       reg-names = "pc", "cna", "core", "dpu", "dpu_rdma";
+                       interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru ACLK_RKNN0>, <&cru HCLK_RKNN_ROOT>,
+                                <&cru CLK_RKNN_DSU0>, <&cru PCLK_NPUTOP_ROOT>,
+                                <&cru ACLK_RKNN_CBUF>, <&cru HCLK_RKNN_CBUF>;
+                       clock-names = "aclk", "hclk", "npu", "pclk",
+                                     "aclk_cbuf", "hclk_cbuf";
+                       resets = <&cru SRST_A_RKNN0>;
+                       reset-names = "srst_a";
+                       power-domains = <&power RK3576_PD_NPU0>;
+                       iommus = <&rknn_mmu_0>;
+                       status = "disabled";
+               };
+
+               rknn_mmu_0: iommu@27702000 {
+                       compatible = "rockchip,rk3576-iommu", 
"rockchip,rk3568-iommu";
+                       reg = <0x0 0x27702000 0x0 0x100>,
+                             <0x0 0x27702100 0x0 0x100>;
+                       interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru ACLK_RKNN0>, <&cru HCLK_RKNN_ROOT>,
+                                <&cru CLK_RKNN_DSU0>, <&cru ACLK_RKNN_CBUF>,
+                                <&cru HCLK_RKNN_CBUF>;
+                       #iommu-cells = <0>;
+                       power-domains = <&power RK3576_PD_NPU0>;
+                       status = "disabled";
+               };
+
+               rknn_core_1: npu@27710000 {
+                       compatible = "rockchip,rk3576-rknn-core";
+                       reg = <0x0 0x27710000 0x0 0x1000>,
+                             <0x0 0x27711000 0x0 0x1000>,
+                             <0x0 0x27713000 0x0 0x1000>,
+                             <0x0 0x27714000 0x0 0x1000>,
+                             <0x0 0x27715000 0x0 0x1000>;
+                       reg-names = "pc", "cna", "core", "dpu", "dpu_rdma";
+                       interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru ACLK_RKNN1>, <&cru HCLK_RKNN_ROOT>,
+                                <&cru CLK_RKNN_DSU0>, <&cru PCLK_NPUTOP_ROOT>;
+                       clock-names = "aclk", "hclk", "npu", "pclk";
+                       resets = <&cru SRST_A_RKNN1>;
+                       reset-names = "srst_a";
+                       power-domains = <&power RK3576_PD_NPU1>;
+                       iommus = <&rknn_mmu_1>;
+                       status = "disabled";
+               };
+
+               rknn_mmu_1: iommu@2770a000 {
+                       compatible = "rockchip,rk3576-iommu", 
"rockchip,rk3568-iommu";
+                       reg = <0x0 0x2770a000 0x0 0x100>,
+                             <0x0 0x2770a100 0x0 0x100>;
+                       interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru ACLK_RKNN1>, <&cru HCLK_RKNN_ROOT>,
+                                <&cru CLK_RKNN_DSU0>, <&cru ACLK_RKNN_CBUF>,
+                                <&cru HCLK_RKNN_CBUF>;
+                       #iommu-cells = <0>;
+                       power-domains = <&power RK3576_PD_NPU1>;
+                       status = "disabled";
+               };
+
                gmac0: ethernet@2a220000 {
                        compatible = "rockchip,rk3576-gmac", "snps,dwmac-4.20a";
                        reg = <0x0 0x2a220000 0x0 0x10000>;
-- 
2.43.0

Reply via email to