From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49AA6299959; Sat, 18 Jul 2026 03:12:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344335; cv=none; b=GSgiMR4H4K1BMvA7a/ShlhlB+HN4kpHe+ZFFiAJPhAJNnFI5W/GxY9l3RUJ0b3rJSo/qYfnMljd8A5sh/zo7RXzCfynR95t1o+zRzq9h7zPTzMg/15gRRjYJmdpQ1faG0N8uL/QYZJFO3k/v9rYXBeXItkL1YxYTsxHmoMvnZ10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344335; c=relaxed/simple; bh=fxy+nc36SiaU/vbBKKSf6ff8SDPmYMRGCyMcjZ9rk8k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y9iVOtirvD5RxAEDM95BW8fWMTN2A7hFReLR4TRytvRPLBY32c2UKDLPlh2uksfbMlGl+AJ0vVXPCCDRVxSvPM8OUS7XPvl8slC2b0n1uz88/zukgN0XPmVmhsBjsns52/G6nB9GrYpXR0zSpqzDUTkqVhys595o3C2Lcm9RCHI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=Hs7ICPbW; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=BDxbqMtb; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="Hs7ICPbW"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="BDxbqMtb" Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailflow.phl.internal (Postfix) with ESMTP id 7EDB51380146; Fri, 17 Jul 2026 23:12:12 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-01.internal (MEProxy); Fri, 17 Jul 2026 23:12:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344332; x= 1784347932; bh=UCG8fvidilzM1GejavT5xbtTJbTNjNFqZ35DfgSLpyo=; b=H s7ICPbWclADpKzM7SOzxdMS85tIMoFCS+H9Oa91PI3V7Lq8NqdxUxsHyaNGFcDuP pjfw3IVtoW6eRUeGPKtbzbZp+o5Xv3vcDyKuIo7hiTXjjpZnGJhyuELMEG/AKE9V aYbc4cGDCaUhtf6mEhTwKrJ4Ik6KOJyoVP9yerqgpJqBRaFyBWnfNFib6WO0aNd3 N+mBCGk8R7r+GJQYcuM9AoJ2lXaY0uFNa9X4qCcP5f4Kd0/2JlvTOBrSQsFCOFhw wOPNzX1S6h062zjLiGEGBk9NQxrJF92qR7KPwVerbaMQ3Tk2T67AnEu2NfZrEr30 5sllP42BFgr/RnkUD2j/Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344332; x=1784347932; bh=U CG8fvidilzM1GejavT5xbtTJbTNjNFqZ35DfgSLpyo=; b=BDxbqMtbmsBBiSeAM dGLaRH6CPZ0yoQDomAEpebDoi/Y4YvyOf+NY/HUJh/Z4KvWAe1SLfig8QfV1Z2Uf GiEQLIHUt+/LrEgKi7x3xYkCogKsMK+m6e6ZvxzjL+HNyTz41U1n0TLRsZYRWDeP ozwKWF+ghgPaTUgNf28WUTX7NxgRLa+dN2lAtwXHgT4UdTMwk30kXX521quMSCf3 EAxTQtqjGFu2UbdTcSoDDJcTC3x2ElZny3p8Sfg07Dnh9K+uT0TNV5GAxzao+Bi1 HuzArY1GrI5r8PVIB1ADjOtJM2411p77wkycsaI1lqCgdHPwwmUTFO8leNpVoV4w nrr9w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTEMX89gCC44dqObrbulQ/I2vRcOyTSU2dL37a8Nf+rFxjy5PE8WS5gpE9RXw7+0PS yxUIuQ6gupe5zEJJchZQE4bKfFbHmQL7INM15u9ExRdXgkO57kNGwURGa++uDEBsULgTHI t0ZbzRzarKEWrP6K0r8ac4f1j9EfeJOBqZIOuHi65D2zEb8+Hr9A3pyCOeN8z68LWwn2cR nBEqlZGvm1NlJl0MtKgrU7cphGYeMLoNKly7LudZuf9EOf4mYb3xk/iIY0lHGtBrmlZsu6 7UYsbLPlBovD5Ne0jETTe/ihY/4xpQnFOtQR8dx/YbbAYNmrYk14/xo0JBShoHg0ykTltN c20LUTZ8LOiSlZ0WWvVhsPpriaKAEy/uzGovc5fgwebH+vAoRmLlr0iSthV0tEFsniH7EX I+D/UAPw3cHw4AcjmZD3+QM/3RNcEHquVRYTFa5/iOvQxeDyvz1ag7o+zc1DGMoxTIVfmQ D2pbnsLDBQ+ZwkV6Fb22XDcGG/SXUHryD/tC9CN//PkJe4n6U0/COHGwkzOlycvpczsaEs YERPVyFRxBmpaXq3OTAuEXufkJyJ4CNzxKkA0Z2uGE198R9bUgu3TiVI6A+aF4HO3oLOKr DWXNSg20RkOs7I8cpuGoT0qQCVaDX8OURUBN1fbezcwOZeIhO9MG3zKtcGnA X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:04 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 1/8] dt-bindings: npu: rockchip: add rockchip,rk3576-rknn-core Date: Sat, 18 Jul 2026 15:11:39 +1200 Message-ID: <20260718031146.3368811-2-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Document the RK3576 NPU core: add rockchip,rk3576-rknn-core to the compatible enum. The RK3576 has no NPU SRAM supply, so make sram-supply required only for rockchip,rk3588-rknn-core via an allOf/if-then instead of dropping it from the shared required list (which would have weakened validation for RK3588). Signed-off-by: Jiaxing Hu --- .../bindings/npu/rockchip,rk3588-rknn-core.yaml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/npu/rockchip,rk3588-rknn-cor= e.yaml b/Documentation/devicetree/bindings/npu/rockchip,rk3588-rknn-core.ya= ml index caca2a490..985cde6b2 100644 --- a/Documentation/devicetree/bindings/npu/rockchip,rk3588-rknn-core.yaml +++ b/Documentation/devicetree/bindings/npu/rockchip,rk3588-rknn-core.yaml @@ -21,6 +21,7 @@ properties: =20 compatible: enum: + - rockchip,rk3576-rknn-core - rockchip,rk3588-rknn-core =20 reg: @@ -75,7 +76,16 @@ required: - resets - reset-names - npu-supply - - sram-supply + +allOf: + - if: + properties: + compatible: + contains: + const: rockchip,rk3588-rknn-core + then: + required: + - sram-supply =20 additionalProperties: false =20 --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AFFEC29E110; Sat, 18 Jul 2026 03:12:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344345; cv=none; b=TGhMOjDXwLJIgh0TRRzgoeqe2JffySAhptWv5tnUtA8SHlpJ+zulpU/RIyAEE82rZMb9x1oE5JCluEFEXny2xl6SEk/QeyTdoApP6rTz9w38sZy+nd94V8Ws6ykjPjXg31nB5r4eUk13I9/2UZu9xsvNj/FAbFNcIsOrqY+rO7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344345; c=relaxed/simple; bh=taecRovNMmTTM6gLwgWpEaHTa4pE0pHZP0lhZbmrF+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nih1on6MtfxkITu9voYgqcAZByFPyHVTSIZUPNHDyrCls/L3PMAimWlbA0lOs2WOi+lkRjZC0Z0Gf5I6bADDL+s47lx33xRNYWlSnpG7+Nj8sbARHldqmXfSDVPWngoyNzvemynbQ9hm3QGzfUnBw2GjgGk7L3coZiSTsfifuW4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=KisL0cry; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=pAtRK2eA; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="KisL0cry"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="pAtRK2eA" Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailflow.phl.internal (Postfix) with ESMTP id DB5F91380324; Fri, 17 Jul 2026 23:12:22 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-05.internal (MEProxy); Fri, 17 Jul 2026 23:12:22 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344342; x= 1784347942; bh=wXvq1c4qizRzzY1hTlhX58r8EY1LF4K2+vKFMFHqhy0=; b=K isL0cryIGZUG2o0BJQoSP+6F1qram42RST1EX9LCVWUr+6WyltiiVAx2sA8yxkXr efqu9kwy8rJ7DT09AIXRxtCUIG3Jnh38byCO/kgmn9iZ39GPRECkWtoaJ/F3OExq 9g0mfQde7bE15b+BHIH4DPag0L/s25Hl/uLYP2EZpwcWNjfA3qwSXE8BYCw7kC/k BV2B+nH6fVx0EgJBb7I5HNa7QoJUqLt2SCqnHk3TVu72R9gAqaS2dM+XE0QXvNz5 0jT9PD4pk5KYKZOs1zLJzYHle6gqI2Ex6g9gfnLid5TB3Z9D4Wao62HPdZ4cGErN leEYBcrYeh3audaBNpJ4A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344342; x=1784347942; bh=w Xvq1c4qizRzzY1hTlhX58r8EY1LF4K2+vKFMFHqhy0=; b=pAtRK2eAtWYWGxKOO MzfGIZ+5bb6mFU7sYm7oNM5nb8IIxT9SCRFCA7f9liAOmjYqkZksQEPQeOF5SBqT 6YOJcQiNSo1LEKMEsoJbgIBcW5cowJUcAOR6PLb/knegcnE6fYsNM+B4vGdIed2S sjgEw7B8UIxKt3ME/Smc12YXz3WLvg9q8en+2E8YirF9M4fGwmjDivh869gAjHYW 2H8aD3jm7Wb37rkTtTBQZ6YFt4jq/vuJ76zLNl0/0Zes3h0du24wh2Mekl8N7F8n xegkIy9C3LfOhvxflk3KBkFK99y8QIMBQFlHLZ52vgj2WrvWc6hzfs8WBGI6enhQ TCKWQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGdKxYqml70filiwpZAyk9xzZJVUlqXITOq/+pve3XDBYV5qFz8ckWzdQnjGAsfQy L94g1S87pSC5A9PqOBmMyyQxvTemSxjsbxCMpV/UkyIw4k85IPMDo4giJDv9meY8W+3ZGJ 7rs8txKC3pJCgGY8R/cZ16F7AaqWitLXNMydDLsiRhcPuepjcDlKsNyGTcEuNL/NTe46O5 sbfF0mBd8sxOQr9Axpf/T6uMsL4/0TWxsZd5HtKP2wSMtsouDi5D48PHZsJKTSrN97AFgX YyfukrwTjiOyNncXeK6X1bkSY9feAEdBHftqOdE8w0ekw432MGokFfhFE0xgjYmONoZjin a+kHlDTSFT5aoAlKXEFvaoTApnxll2T/cMjWi6lx5mplMsZG8x2yGbJucTRJHNJKoXdm6/ 8PbCal1stX7stfKqYDVhOL1EK2VUDTi/E/D/QVuSqFE5NE60qw4Q/YDP54EZ93q/Iyh2lG ibrFwrTKGZveR3sDzFOG4A3najJGt7j6Qk+ToxGmqOz4leQisD33E+CX4zlNlGpONqnXWZ +GfzHRhV/a8IcbmZ5PtS2a9tKpdYzmqrWByu/PzzJpJegpO9HtdP+VU3jO41VvYHNhRVMj /hYbxrA4yuT4EmbE65+3d7MPD8WP3E7fdkX56KdTlDTjURcSA44lqcsWclpw X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:15 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 2/8] pmdomain/rockchip: add optional per-domain power-on settle delay Date: Sat, 18 Jul 2026 15:11:40 +1200 Message-ID: <20260718031146.3368811-3-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The RK3576 NPU domains need a short settle time after the idle request is released before the QoS registers behind the domain are written: restoring QoS immediately after de-idle can raise an SError on the register access while the NoC is still settling (observed on ROCK 4D as a panic inside rockchip_pd_power() during NPU runtime-PM cycling). The vendor kernel handles this with a per-domain delay_us field applied between the de-idle request and the QoS restore, carrying 15us for the RK3576 NPUTOP domain. Mirror that: add delay_us to rockchip_domain_info, honor it in rockchip_pd_power() right before rockchip_pmu_restore_qos(), and set 15us for NPUTOP, NPU0 and NPU1 (the two core domains power-cycle constantly under runtime PM and showed the same symptom during bring-up). All other domains keep 0, so nothing changes for them. Signed-off-by: Jiaxing Hu --- drivers/pmdomain/rockchip/pm-domains.c | 51 ++++++++++++++------------ 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rock= chip/pm-domains.c index 490bbb1d1..1787f62ba 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -59,6 +59,7 @@ struct rockchip_domain_info { u32 pwr_offset; u32 mem_offset; u32 req_offset; + u32 delay_us; }; =20 struct rockchip_pmu_info { @@ -185,7 +186,7 @@ struct rockchip_pmu { .need_regulator =3D regulator, \ } =20 -#define DOMAIN_M_O_R_G(_name, p_offset, pwr, status, m_offset, m_status, r= _status, r_offset, req, idle, ack, g_mask, wakeup) \ +#define DOMAIN_M_O_R_G(_name, p_offset, pwr, status, m_offset, m_status, r= _status, r_offset, req, idle, ack, g_mask, delay, wakeup) \ { \ .name =3D _name, \ .pwr_offset =3D p_offset, \ @@ -200,6 +201,7 @@ struct rockchip_pmu { .req_mask =3D (req), \ .idle_mask =3D (idle), \ .clk_ungate_mask =3D (g_mask), \ + .delay_us =3D (delay), \ .ack_mask =3D (ack), \ .active_wakeup =3D wakeup, \ } @@ -244,8 +246,8 @@ struct rockchip_pmu { #define DOMAIN_RK3568(name, pwr, req, wakeup) \ DOMAIN_M(name, pwr, pwr, req, req, req, wakeup) =20 -#define DOMAIN_RK3576(name, p_offset, pwr, status, r_status, r_offset, req= , idle, g_mask, wakeup) \ - DOMAIN_M_O_R_G(name, p_offset, pwr, status, 0, r_status, r_status, r_offs= et, req, idle, idle, g_mask, wakeup) +#define DOMAIN_RK3576(name, p_offset, pwr, status, r_status, r_offset, req= , idle, g_mask, delay, wakeup) \ + DOMAIN_M_O_R_G(name, p_offset, pwr, status, 0, r_status, r_status, r_offs= et, req, idle, idle, g_mask, delay, wakeup) =20 /* * Dynamic Memory Controller may need to coordinate with us -- see @@ -612,7 +614,6 @@ static int rockchip_do_pmu_set_power_domain(struct rock= chip_pm_domain *pd, return ret; } =20 - ret =3D readx_poll_timeout_atomic(rockchip_pmu_domain_is_on, pd, is_on, is_on =3D=3D on, 0, 10000); if (ret) { @@ -667,6 +668,9 @@ static int rockchip_pd_power(struct rockchip_pm_domain = *pd, bool power_on) if (ret < 0) goto out; =20 + if (pd->info->delay_us) + udelay(pd->info->delay_us); + rockchip_pmu_restore_qos(pd); } =20 @@ -1286,25 +1290,26 @@ static const struct rockchip_domain_info rk3568_pm_= domains[] =3D { }; =20 static const struct rockchip_domain_info rk3576_pm_domains[] =3D { - [RK3576_PD_NPU] =3D DOMAIN_RK3576("npu", 0x0, BIT(0), BIT(0), 0, = 0x0, 0, 0, 0, false), - [RK3576_PD_NVM] =3D DOMAIN_RK3576("nvm", 0x0, BIT(6), 0, BIT(6)= , 0x4, BIT(2), BIT(18), BIT(2), false), - [RK3576_PD_SDGMAC] =3D DOMAIN_RK3576("sdgmac", 0x0, BIT(7), 0, BIT(= 7), 0x4, BIT(1), BIT(17), 0x6, false), - [RK3576_PD_AUDIO] =3D DOMAIN_RK3576("audio", 0x0, BIT(8), 0, BIT(8= ), 0x4, BIT(0), BIT(16), BIT(0), false), - [RK3576_PD_PHP] =3D DOMAIN_RK3576("php", 0x0, BIT(9), 0, BIT(9)= , 0x0, BIT(15), BIT(15), BIT(15), false), - [RK3576_PD_SUBPHP] =3D DOMAIN_RK3576("subphp", 0x0, BIT(10), 0, BIT(= 10), 0x0, 0, 0, 0, false), - [RK3576_PD_VOP] =3D DOMAIN_RK3576("vop", 0x0, BIT(11), 0, BIT(11= ), 0x0, 0x6000, 0x6000, 0x6000, false), - [RK3576_PD_VO1] =3D DOMAIN_RK3576("vo1", 0x0, BIT(14), 0, BIT(14= ), 0x0, BIT(12), BIT(12), 0x7000, false), - [RK3576_PD_VO0] =3D DOMAIN_RK3576("vo0", 0x0, BIT(15), 0, BIT(15= ), 0x0, BIT(11), BIT(11), 0x6800, false), - [RK3576_PD_USB] =3D DOMAIN_RK3576("usb", 0x4, BIT(0), 0, BIT(16= ), 0x0, BIT(10), BIT(10), 0x6400, true), - [RK3576_PD_VI] =3D DOMAIN_RK3576("vi", 0x4, BIT(1), 0, BIT(17)= , 0x0, BIT(9), BIT(9), BIT(9), false), - [RK3576_PD_VEPU0] =3D DOMAIN_RK3576("vepu0", 0x4, BIT(2), 0, BIT(1= 8), 0x0, BIT(7), BIT(7), 0x280, false), - [RK3576_PD_VEPU1] =3D DOMAIN_RK3576("vepu1", 0x4, BIT(3), 0, BIT(1= 9), 0x0, BIT(8), BIT(8), BIT(8), false), - [RK3576_PD_VDEC] =3D DOMAIN_RK3576("vdec", 0x4, BIT(4), 0, BIT(20= ), 0x0, BIT(6), BIT(6), BIT(6), false), - [RK3576_PD_VPU] =3D DOMAIN_RK3576("vpu", 0x4, BIT(5), 0, BIT(21= ), 0x0, BIT(5), BIT(5), BIT(5), false), - [RK3576_PD_NPUTOP] =3D DOMAIN_RK3576("nputop", 0x4, BIT(6), 0, BIT(= 22), 0x0, 0x18, 0x18, 0x18, false), - [RK3576_PD_NPU0] =3D DOMAIN_RK3576("npu0", 0x4, BIT(7), 0, BIT(23= ), 0x0, BIT(1), BIT(1), 0x1a, false), - [RK3576_PD_NPU1] =3D DOMAIN_RK3576("npu1", 0x4, BIT(8), 0, BIT(24= ), 0x0, BIT(2), BIT(2), 0x1c, false), - [RK3576_PD_GPU] =3D DOMAIN_RK3576("gpu", 0x4, BIT(9), 0, BIT(25= ), 0x0, BIT(0), BIT(0), BIT(0), false), + /* name p_offset pwr = status r_status r_offset req idle g_mask delay wakeup */ + [RK3576_PD_NPU] =3D DOMAIN_RK3576("npu", 0x0, BIT(0), BIT(0), 0, = 0x0, 0, 0, 0, 0, false), + [RK3576_PD_NVM] =3D DOMAIN_RK3576("nvm", 0x0, BIT(6), 0, BIT(6)= , 0x4, BIT(2), BIT(18), BIT(2), 0, false), + [RK3576_PD_SDGMAC] =3D DOMAIN_RK3576("sdgmac", 0x0, BIT(7), 0, BIT(= 7), 0x4, BIT(1), BIT(17), 0x6, 0, false), + [RK3576_PD_AUDIO] =3D DOMAIN_RK3576("audio", 0x0, BIT(8), 0, BIT(8= ), 0x4, BIT(0), BIT(16), BIT(0), 0, false), + [RK3576_PD_PHP] =3D DOMAIN_RK3576("php", 0x0, BIT(9), 0, BIT(9)= , 0x0, BIT(15), BIT(15), BIT(15), 0, false), + [RK3576_PD_SUBPHP] =3D DOMAIN_RK3576("subphp", 0x0, BIT(10), 0, BIT(= 10), 0x0, 0, 0, 0, 0, false), + [RK3576_PD_VOP] =3D DOMAIN_RK3576("vop", 0x0, BIT(11), 0, BIT(11= ), 0x0, 0x6000, 0x6000, 0x6000, 0, false), + [RK3576_PD_VO1] =3D DOMAIN_RK3576("vo1", 0x0, BIT(14), 0, BIT(14= ), 0x0, BIT(12), BIT(12), 0x7000, 0, false), + [RK3576_PD_VO0] =3D DOMAIN_RK3576("vo0", 0x0, BIT(15), 0, BIT(15= ), 0x0, BIT(11), BIT(11), 0x6800, 0, false), + [RK3576_PD_USB] =3D DOMAIN_RK3576("usb", 0x4, BIT(0), 0, BIT(16= ), 0x0, BIT(10), BIT(10), 0x6400, 0, true), + [RK3576_PD_VI] =3D DOMAIN_RK3576("vi", 0x4, BIT(1), 0, BIT(17)= , 0x0, BIT(9), BIT(9), BIT(9), 0, false), + [RK3576_PD_VEPU0] =3D DOMAIN_RK3576("vepu0", 0x4, BIT(2), 0, BIT(1= 8), 0x0, BIT(7), BIT(7), 0x280, 0, false), + [RK3576_PD_VEPU1] =3D DOMAIN_RK3576("vepu1", 0x4, BIT(3), 0, BIT(1= 9), 0x0, BIT(8), BIT(8), BIT(8), 0, false), + [RK3576_PD_VDEC] =3D DOMAIN_RK3576("vdec", 0x4, BIT(4), 0, BIT(20= ), 0x0, BIT(6), BIT(6), BIT(6), 0, false), + [RK3576_PD_VPU] =3D DOMAIN_RK3576("vpu", 0x4, BIT(5), 0, BIT(21= ), 0x0, BIT(5), BIT(5), BIT(5), 0, false), + [RK3576_PD_NPUTOP] =3D DOMAIN_RK3576("nputop", 0x4, BIT(6), 0, BIT(= 22), 0x0, 0x18, 0x18, 0x18, 15, false), + [RK3576_PD_NPU0] =3D DOMAIN_RK3576("npu0", 0x4, BIT(7), 0, BIT(23= ), 0x0, BIT(1), BIT(1), 0x1a, 15, false), + [RK3576_PD_NPU1] =3D DOMAIN_RK3576("npu1", 0x4, BIT(8), 0, BIT(24= ), 0x0, BIT(2), BIT(2), 0x1c, 15, false), + [RK3576_PD_GPU] =3D DOMAIN_RK3576("gpu", 0x4, BIT(9), 0, BIT(25= ), 0x0, BIT(0), BIT(0), BIT(0), 0, false), }; =20 static const struct rockchip_domain_info rk3588_pm_domains[] =3D { --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DBD7244665; Sat, 18 Jul 2026 03:12:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344355; cv=none; b=UnOFuap41Of8tJMavDA2HnI75KJkgJgq9hCO+z1hJp39wmkiap7u3yYbfKfDi2j++Ku44XrP+KgGyVHGaHeOppU/iIVmo1wOMptNQDtXk4OnNVRUio/SBZClhGDeHELy/yZZoWl9uCFM8ewpu3OTQ76jJU60Ww31nvrAyoL0ca4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344355; c=relaxed/simple; bh=QgRKt4IS7CNU0vvklMdhC/IP3jqWkDhJiThkz4Jx2+w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uzUt8ABI2bxrJwhllFecvy/wh2tmr7U18lXyjJh7Urxdk8ytpeXpBt7QBzkU09gtd3S7tqpeMaGXmsx28M+3aVTpmudqX+5GuV2MlTmGz5z3zDUxINSZYvxFF2qlq1vHa/+cw6o5Rcks9P5ya2DcTJysiCMFt+PXcAXrRH0/BcM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=f13js8cM; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=VETlfcUv; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="f13js8cM"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="VETlfcUv" Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailflow.phl.internal (Postfix) with ESMTP id 7E5011380327; Fri, 17 Jul 2026 23:12:33 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Fri, 17 Jul 2026 23:12:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344353; x= 1784347953; bh=ReDEZNNVB6LR8TBo9n+GfIJ6P/foCnyQWElDcThh+I8=; b=f 13js8cMotlSvz6w3J13kdWOflPNn7kaiGIZsJaYhhH8b2FtCbEmNvvxygoDdrvET e7N6qZ23ubjHJCv2bqSyIYBhnA5v+mmk9yOLofAvxVQcZoDJ/FbFz6qvL5JVXL9e E27MXQ4fe1UmFbZ/soOlokURSLp7oRPDzdG5fShpOJCN6w9yediqtZXr5YO/oeZM Je9dTJ3pXexj5iTt6lS9hi94ASmE6tjluDu/3CTx0eszBR/EolYQSj5AWMRf5fW6 +aGlN4BTORQ8y+TaUXUWHns/7fluKuGCmYp5Op5KEkNrLSDIgxJPVTZ8RPb712p9 72d+JQIOvP5H1NY5NB4GA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344353; x=1784347953; bh=R eDEZNNVB6LR8TBo9n+GfIJ6P/foCnyQWElDcThh+I8=; b=VETlfcUvMO2S0Z9Lj vfIZcjBnGpONs76AZEqg0fpDbGt8K8kWWr0T8Zd6C8cWe/0iJ8SJJveVj8HvvXpQ 6OOySbAQgSFvYnTlpzrnvx1mgIeIdRZ2SFIh0jApJfZCHJ/qA0Zvq5cLCX3hmz3f j/fScdiANyseDva2SxJ/wIWHovDlkPsPcWB47WvsJqotdyt4qi7WVDDTe9diGMt7 neS9s3xk2bjf2g7tv45u5cn4SWC+qWzkzYdRYupd/2Rak7aFrb1dESiAB7rccA8l n8L0RHg+Z0EGS+IiDeW3O7/hFM4xRkHK1nhbixv7YVNDSP2Q/4e/5h83uP+TIhoi 4XKlA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGiua8u0bNA9XH/1gRMOwAvIEaw+Xtz0KCuQKXabiOHwfxpZ5MZYByRWbR7Kp9nF6 qSe4oUPMRhjVDuO3uTQXqNB9rW/YS03mixI6iwJykTNKzlTWPLWtINW2pRnzFmGD/jHaBH GW+Ck3GrggAvw64iMT6xDcUsunGB8iGvjpZn8uEGxdGVdwsgwFdZGN7ymS1icJndc4lt6e zFZUrbtWEQG8UIpC7Nj6JLcyz0vHsWVRB3V4EGPAQFYmiIaqKn/E4qxv/cGIWyj+pw9l6Q Qrz/KpDo+6BmEyRu9vKadFcnov/EnFsq7LCdBsST1Re0wCrcf9imh4FlvqjBTb6afFWNbI CWDWTqgOw5anCxAJQ2RRzTsQ8FyQFlAOMjKAk1O4IqUMRqnLXv2OD6G3Fv6e85qDfB0ZbF sIdOWBajTsziR7rZvXmNaBtj4QEY42I8c9LuNjFX6ElGDT938ucWOXXxQmwYhHRbt4LK14 VxDq2e/FsrRxp1EZJsSbePv8BVlyJl33MEzRk7kCtypm8qti2NVi1VYHnGtBUKHkBg7kyM 9NiNRh5aQhUBpJ7rUKBpzR605Sj3g/nvWHh2gyFoxQFVsT+T3bQZbWRZ3EmHsbdJCE292S hWNu/R6Pr1K5Qq+e5y9bmqhMfMdnWlcWIa0///qO2yJrTEqXdZxjkqWSv+FQ X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:25 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 3/8] pmdomain/rockchip: cycle optional power-domain resets on power-on Date: Sat, 18 Jul 2026 15:11:41 +1200 Message-ID: <20260718031146.3368811-4-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some power domains contain hardware bus interfaces that require an explicit assert/deassert edge on their reset line after the domain is powered on. The CRU preserves reset state across power cycles (stays deasserted), so the hardware never sees the edge it needs unless the driver pulses it explicitly. Add an optional resets property to rockchip_pm_domain. When present, the resets are asserted and deasserted (with a 10 us hold) inside rockchip_pd_power() after the idle bits are cleared and the delay_us settling time has elapsed, but before any device in the domain resumes. The resets are released in rockchip_pm_remove_one_domain(). Signed-off-by: Jiaxing Hu --- drivers/pmdomain/rockchip/pm-domains.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rock= chip/pm-domains.c index 1787f62ba..8ce0cc3de 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +103,7 @@ struct rockchip_pm_domain { struct clk_bulk_data *clks; struct device_node *node; struct regulator *supply; + struct reset_control *resets; }; =20 struct rockchip_pmu { @@ -671,6 +673,12 @@ static int rockchip_pd_power(struct rockchip_pm_domain= *pd, bool power_on) if (pd->info->delay_us) udelay(pd->info->delay_us); =20 + if (pd->resets) { + reset_control_assert(pd->resets); + udelay(10); + reset_control_deassert(pd->resets); + } + rockchip_pmu_restore_qos(pd); } =20 @@ -840,6 +848,14 @@ static int rockchip_pm_add_one_domain(struct rockchip_= pmu *pmu, if (error) goto err_put_clocks; =20 + pd->resets =3D of_reset_control_array_get_optional_exclusive(node); + if (IS_ERR(pd->resets)) { + error =3D PTR_ERR(pd->resets); + dev_err(pmu->dev, "%pOFn: failed to get resets: %d\n", node, error); + pd->resets =3D NULL; + goto err_unprepare_clocks; + } + pd->num_qos =3D of_count_phandle_with_args(node, "pm_qos", NULL); =20 @@ -910,6 +926,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_p= mu *pmu, clk_bulk_unprepare(pd->num_clks, pd->clks); err_put_clocks: clk_bulk_put(pd->num_clks, pd->clks); + reset_control_put(pd->resets); return error; } =20 @@ -928,6 +945,7 @@ static void rockchip_pm_remove_one_domain(struct rockch= ip_pm_domain *pd) =20 clk_bulk_unprepare(pd->num_clks, pd->clks); clk_bulk_put(pd->num_clks, pd->clks); + reset_control_put(pd->resets); =20 /* protect the zeroing of pm->num_clks */ mutex_lock(&pd->pmu->mutex); --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE2B229B77C; Sat, 18 Jul 2026 03:12:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344366; cv=none; b=HnVqfI4sfVZ7RHZAcR8iaKDlIQXUqv4iYw1RMRLL4+q1EcM/GADyB9IwYlqSeK4NMfxF5ETcNE+HdJM7mBAjG31+roV4fTVWnMXiDVFXOZpJCISeod4BqUTxja4TzxnBfxe3Q6AuGh4Gl8hf9/M0wOHkb8piVGr7BndQ2czT2/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344366; c=relaxed/simple; bh=SCpYPvSQEF8kSzfVu3jAnFULo9PaUZa6DSK1bo3zZGI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kf4jX3w+IGkOgW1tDYCHpTB70NsENAPsFVk7EXYXt9m/r62F/L9K8N/Ak8U01PtsoUICuneD8MEq7ewNm8FZQVRi5wXdu19E4J6Ft2SiJfeFHqVewuv13H65aU8hJhuVgO0+oTp7L6kQcSRaQtIY+e9kxvGDR4adiweyAkEBO1M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=mrHUy57R; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=Mu3/T3SD; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="mrHUy57R"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="Mu3/T3SD" Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.phl.internal (Postfix) with ESMTP id E77471380329; Fri, 17 Jul 2026 23:12:43 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Fri, 17 Jul 2026 23:12:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344363; x= 1784347963; bh=ti2AV9H5OmIhJ7TBtoRF1uJCfDGB9x29ksYhj+T6ayk=; b=m rHUy57RU3yJfHtoSAa8dmztzxjJNo/DSFk6M/1p8LO64gv6aWeMiDV1nW1gkboo9 cuydNQ3o3dan11sI5BJmKqwuB3WBeGPZv7UtsSPtNyjqYWBXr7RbRwcaJMPG2oFR G/qg/waI6i7awe4k2Y7JKeeGUrqxPrHAuiS1VN8XXBtW1g4UOuKH9CTd1UXugv8G +coeHV627lGLO61JwMmmq1p2EdKfH+TO5NJsm003zEAVyfSjU4vS6C0e0X8s3jlv vpVaSkbaHjM5o35mnjqDFs4QOXhzK3rwDwlkJGhtO4PNBYW/JLE570PlIrIjIPkM lJ4ddaxGTk3Em5/RY9K2A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344363; x=1784347963; bh=t i2AV9H5OmIhJ7TBtoRF1uJCfDGB9x29ksYhj+T6ayk=; b=Mu3/T3SDKYIG5E1Ww cMv6MgUyY0dBx5//6LGjtO6oa8LLv/CGq4h+G6TkA6sTmNa5qKZpfh/dEsjwSS4C XY9Ha0tUYruyjcE2KItGwKqS0FXNmEv7P3dnJkZb8bo92L0G1Z8IpoOZUlTaHr9W verneyOxBo2KNCHUY686atqLtEBExrl4u2MVq/DlRsEZTqrZCBX4gU5C5R2K41nF awb8d0DMaCTpcXqc5tXrDbHUW7kZc5AA7IwQUbrJNHAfrUaEhGHicpuaV0af7jSy P6MUTD19c2NrDvPh5GTRLBchMYGtCvtx7FxgZzsTEW7tOXFFGU/FWNfJv7QfQ4dJ iRqdw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTEMX89gCC44dqObrbulQ/I2vRcOyTSU2dL37a8Nf+rFxjy5PE8WS5gpE9RXw7+0PS yxUIuQ6gupe5zEJJchZQE4bKfFbHmQL7INM15u9ExRdXgkO57kNGwURGa++uDEBsULgTHI t0ZbzRzarKEWrP6K0r8ac4f1j9EfeJOBqZIOuHi65D2zEb8+Hr9A3pyCOeN8z68LWwn2cR nBEqlZGvm1NlJl0MtKgrU7cphGYeMLoNKly7LudZuf9EOf4mYb3xk/iIY0lHGtBrmlZsu6 7UYsbLPlBovD5Ne0jETTe/ihY/4xpQnFOtQR8dx/YbbAYNmrYk14/xo0JBShoHg0ykTlOm z6ziJ2x85LrhfqPRXEIb73dow6FbHcETwOp5vjRuyDMBfforhzhRyfoONUHmoJ5eQInyho cxMpmoDqRAF3JoVP7ZzCQ+7dsYrEtyjHm7D4oJEsE4vQXtY8qm2/QyO5isUo85nZjTM44b s9Xo47f051dOil6peHJ/Ov0+6BvDZULKtseyuLNoMpC1SPPPxQ9bbXc6LrI8P93VVzM4eI JWdPPuzlnhnIO3uay8gkxOykB8G7JubSmFI3dzweVt39ojR1BrJRgn6ekuyUryHxHBWhFx tkOWt+/psBfVRWR5vEYKmVqhSr6LnfbWddRF0DPWrFI/9Z+SoEwM6RkNlKoQ X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:36 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 4/8] iommu/rockchip: take all DT clocks Date: Sat, 18 Jul 2026 15:11:42 +1200 Message-ID: <20260718031146.3368811-5-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" rk_iommu only enabled a fixed {aclk,iface} pair. On the RK3576 NPU the MMU sits behind the CBUF/DSU gates, so writes to DTE_ADDR are silently dropped until those clocks run too (reads work, writes need more clocks). Use devm_clk_bulk_get_all() to take every clock the devicetree provides instead of a fixed pair, so a platform can list the full set it needs. Clocks stay optional for the older clock-less devicetrees. Signed-off-by: Jiaxing Hu --- drivers/iommu/rockchip-iommu.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 0013cf196..62cd6b022 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -93,11 +93,6 @@ struct rk_iommu_domain { struct iommu_domain domain; }; =20 -/* list of clocks required by IOMMU */ -static const char * const rk_iommu_clocks[] =3D { - "aclk", "iface", -}; - struct rk_iommu_ops { phys_addr_t (*pt_address)(u32 dte); u32 (*mk_dtentries)(dma_addr_t pt_dma); @@ -1246,25 +1241,20 @@ static int rk_iommu_probe(struct platform_device *p= dev) iommu->reset_disabled =3D device_property_read_bool(dev, "rockchip,disable-mmu-reset"); =20 - iommu->num_clocks =3D ARRAY_SIZE(rk_iommu_clocks); - iommu->clocks =3D devm_kcalloc(iommu->dev, iommu->num_clocks, - sizeof(*iommu->clocks), GFP_KERNEL); - if (!iommu->clocks) - return -ENOMEM; - - for (i =3D 0; i < iommu->num_clocks; ++i) - iommu->clocks[i].id =3D rk_iommu_clocks[i]; - /* - * iommu clocks should be present for all new devices and devicetrees - * but there are older devicetrees without clocks out in the wild. - * So clocks as optional for the time being. + * Take every clock the devicetree provides. Most IOMMU instances + * need exactly "aclk" + "iface", but e.g. the RK3576 NPU IOMMUs sit + * behind additional gates (CBUF/DSU) whose clocks must be running + * for register writes to land. Clocks stay optional because there + * are older devicetrees without clocks out in the wild. */ - err =3D devm_clk_bulk_get(iommu->dev, iommu->num_clocks, iommu->clocks); + err =3D devm_clk_bulk_get_all(iommu->dev, &iommu->clocks); if (err =3D=3D -ENOENT) iommu->num_clocks =3D 0; - else if (err) + else if (err < 0) return err; + else + iommu->num_clocks =3D err; =20 err =3D clk_bulk_prepare(iommu->num_clocks, iommu->clocks); if (err) --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 340552C21F0; Sat, 18 Jul 2026 03:12:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344376; cv=none; b=I475IsyRvkyWj4gqkybWLNw5hBybutx7lY48Ye+rVlfMQTOGv9X76JgURkJVmvmrtW4HRoXthescK5+27fbltxwIq1WLq1WEK3v6DXCIT4mPI+sn0+IRoLHFYVuXuvY43W+GwiqkOwcFW4wCPX4JW1Y/f44epw3NH+2RvoERanc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344376; c=relaxed/simple; bh=ef7Nrygskl6ewIF32VEK1Xub3RQ5JYf5JkoIXiopH8U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hsqApDA8owexg/q0RoLDoXI3dO/sDOvFzzVNF97NU5iivI/P0Kd+ODbPudIu3H+caJr0nk2ovsx8kW5xzlZlP0wxQsmd5xOJDdTObnP+7AiTN6N3dHN/m1gEAyFB9pf7Q7iQezk8gAWkzWqF031siYj3htJ/BvhSVrG8yMW7jlE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=k1AVjW4C; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=Epa7J8WQ; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="k1AVjW4C"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="Epa7J8WQ" Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailflow.phl.internal (Postfix) with ESMTP id 683CE1380328; Fri, 17 Jul 2026 23:12:54 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-02.internal (MEProxy); Fri, 17 Jul 2026 23:12:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344374; x= 1784347974; bh=Ifoyain0O5tFEPV0Svn5oBE7BX1cAxLlXYL5Dnbq7b8=; b=k 1AVjW4CVfGhQ5uD6qlFmevlrff9gyfvdbUIrTBlBcVrga14KMnt+fsyU9K0xXORm KAtfFg08LKIuyDWvEOXlOWVHk0+mbr+Ucw0yG3Y7J4tORn2P7ak9qSP30LqNW9nK tWOSHeDFBCuA1Q5+Xi/Qsp8qbBJ0T63KZ6dGD1mnZ6r1S+QD7xVa8kIou+I4/Ybe GVuXxE9R4Eus4oOiNcRbAyBKNy+wmnHtiNp7N6nrPdObo+ithQW3TKia5/ZZ58t4 KlT5lzHVFc8H3L9K4o1V93CvzZJu/egFTIfAAk1NbrOITHn0F+wlNWSYGTciIJX8 2QP2HRs9GDraG8Hrab4NQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344374; x=1784347974; bh=I foyain0O5tFEPV0Svn5oBE7BX1cAxLlXYL5Dnbq7b8=; b=Epa7J8WQeQ/41tjsF FDe7KnXEAUZW0wB+g/C4zLn8fr2tjAfIkYNMKIyA3kOrSVDJWwuXbuuGKb8NnM1/ WvXSOxg+jP1hx6LswHjzd+QSHgEgbg67s7ufUGIDxzaDqht5dr+a7pildv6RDrGw hCWoNcBUtooE7n4rwPnTWQCBSPw3aM8PhGRm1XbbP4hV138HEW1TXU7dgt/1+7/1 mfbWbWJbiUb8NkrZ1dosmZvR1tfUEkwImho8w8rAMDFCSzPa0awSFIZj4R+LPQss 4j46KRaxnxm8c14v8fB0KZ0qo76lwz0oBz3Z54Rf9gxHbjO+wNH3ryejncC5DPMy hpIUw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTEMX89gCC44dqObrbulQ/I2vRcOyTSU2dL37a8Nf+rFxjy5PE8WS5gpE9RXw7+0PS yxUIuQ6gupe5zEJJchZQE4bKfFbHmQL7INM15u9ExRdXgkO57kNGwURGa++uDEBsULgTHI t0ZbzRzarKEWrP6K0r8ac4f1j9EfeJOBqZIOuHi65D2zEb8+Hr9A3pyCOeN8z68LWwn2cR nBEqlZGvm1NlJl0MtKgrU7cphGYeMLoNKly7LudZuf9EOf4mYb3xk/iIY0lHGtBrmlZsu6 7UYsbLPlBovD5Ne0jETTe/ihY/4xpQnFOtQR8dx/YbbAYNmrYk14/xo0JBShoHg0ykTlCu UH1/8J40WwwUfVCylVd0CgaZ5fom8Ci+xBFReSOhGgGwYinXEnURs1R8InSumbCTKV352C GSqSbGdpiU76yiHCuAw/npfwHy8qb6YdWX+6+bBhRHf71Ko0e7Eukdm1XvXguC2vi4JgiC D7A84GkDGYBqdzkR6uHOIAA81Sf6fBoxqSUxSuT9gkkKuOCPy+5wB2ao/cofhEZ/8SBRWY oI3Gtl1aHg11gxI27IrwBgIb2NrKk5HgT+R5SitX9RfX7aIMzn13Ddx+6oCaDJ6Qv5h7M6 gQ/b00ATM204LOaVLq0sPC6P1ZVWTjC7wGrQLF1SwThKWRWtlIht0hYP6lFg X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:46 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 5/8] iommu/rockchip: clear stale page faults before enabling stall Date: Sat, 18 Jul 2026 15:11:43 +1200 Message-ID: <20260718031146.3368811-6-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Boot firmware can leave an IOMMU bank in PAGE_FAULT_ACTIVE before the driver has configured paging: PAGE_FAULT_ACTIVE=3D1 STALL_ACTIVE=3D0 IDLE=3D1 Such a bank ignores CMD_ENABLE_STALL and never reaches STALL_ACTIVE, so rk_iommu_enable_stall()'s readx_poll_timeout() spins until it times out (seen on the RK3576 NPU, whose MMUs share this poll across banks). Rather than special-casing these banks in the stall path, acknowledge the stale fault with CMD_PAGE_FAULT_DONE before enabling stall, so every bank starts from a clean state and the normal stall sequence applies to all of them. Banks without a pending fault are untouched. Signed-off-by: Jiaxing Hu --- drivers/iommu/rockchip-iommu.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 62cd6b022..68bd55433 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -415,6 +415,19 @@ static int rk_iommu_enable_stall(struct rk_iommu *iomm= u) if (!rk_iommu_is_paging_enabled(iommu)) return 0; =20 + /* + * Boot firmware can leave a bank in PAGE_FAULT_ACTIVE with no handler + * (PAGE_FAULT_ACTIVE & !STALL_ACTIVE & IDLE). Such a bank ignores + * CMD_ENABLE_STALL and never reaches STALL_ACTIVE, timing out the poll + * below. Acknowledge any stale fault first so every bank starts clean. + */ + for (i =3D 0; i < iommu->num_mmu; i++) { + if (rk_iommu_read(iommu->bases[i], RK_MMU_STATUS) & + RK_MMU_STATUS_PAGE_FAULT_ACTIVE) + writel(RK_MMU_CMD_PAGE_FAULT_DONE, + iommu->bases[i] + RK_MMU_COMMAND); + } + rk_iommu_command(iommu, RK_MMU_CMD_ENABLE_STALL); =20 ret =3D readx_poll_timeout(rk_iommu_is_stall_active, iommu, val, --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BA4C2D3A75; Sat, 18 Jul 2026 03:13:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344388; cv=none; b=mWx0ZuJ+B1Tef1hC97Ua8UrYI2bl8jFT/hMVmvYPZCw1KxoHpIg+ysaTNrqu6YIP6pMkXpRsf3mckAM+H8QOz/gSd/HNvUPBVmgwPwqJBuR8NN6/UdXISrOqiibP0AI1zJCxYVr9UyfALNfdaiNqFnuBdnWnFMMmce/gzCP3QFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344388; c=relaxed/simple; bh=xZ9GABoN9tWIDSb7n9nQYzUQG4xnAfpln9nQTP9eKIw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jXsNqfOeoeFlwYRsATlMB504yuSRRT6PdzUtWBsxLYHhBXrepI5SvqI5XrBsth1OB+l7oniHVzcBvuh7oE3iXp64yyle5fRoeh5++UrvzU1VrgbwfMHzfkqi3ppDFAikVVgB+hFpEOygvGurAxMXUQbhFXUTSMBqfjTgXiIM2sA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=IRu6pxuQ; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=IZnJ5xUa; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="IRu6pxuQ"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="IZnJ5xUa" Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.phl.internal (Postfix) with ESMTP id 91AB7138032C; Fri, 17 Jul 2026 23:13:05 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-04.internal (MEProxy); Fri, 17 Jul 2026 23:13:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344385; x= 1784347985; bh=Ou2i+qMmHBvQjCWQZwA9wjH7Rf6P921q+fjIwYlqA7c=; b=I Ru6pxuQxv8tPiU4ik/q+Gq26TbqE7NLgy0GH1xTmk6Bt/63dgokkCo+zwNPXDZiT rpxVLdyIqcVK8Dvchlj5vh+FVE5Ma18YIjrefdkgV9ZNLQR61xOPPjkW92gTuSmz Rxux9908Yg+iuIXzNSGa7fIW+Yy/HEcofbrOXvqycBzIL3199LSZ3hsgMTj//izp /AeFwyLHK2ElQSDcwmv408Dxpc5sVQSXftywrFWiv1Tn1QV66o/zKut1PRjLNCdT 1ijNmuoOqLq9NdLb9mDuNwZ1SlHZurCusby+UwGRHSTzjJX1odK8p0G/FVW/65Vi Hy5+2jHkAc5F0OX9fTmfA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344385; x=1784347985; bh=O u2i+qMmHBvQjCWQZwA9wjH7Rf6P921q+fjIwYlqA7c=; b=IZnJ5xUaMtIttiBTP vFfjjm3ETUPm405pb5yXXdRkDfJRHEUY04wQZx/4lJ3+lYYsCjDWRUNgPUmLlKXh j2syLxw5E/qlHllbsNvf1FZLXecEIk7KuZreiNVkOCpTwf1CByetkA3sK81o54/n DDjvmYEnKnyEgfpf74SSJ3xC/8jQIftynEN10V3esM+ZkDgBgLYyWSNfI0tCfgLR i+upvIGXT1RZ5DNpYzbYTw+BnQAB1QWdJl+nhpM2vzH+/7ZPo5dpIpsRvfnEbiPe pMe9xw/gBrmg4IJhNbE377jWduBeZa9uDsAbGbuugFzvXNvmnGhft5LytBKZXL4x Kpivg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGo/Hd4L5rRwOTvh0WCJISmOoXEdIqPuYccPV++DcxWf8Powz1Ybe2qRyZPFweND+ SC523aTq5VzMTUw6xzE3TE+6TtlEB8vrrH4BUWnWvZIVs8l+O8kw8bSbEXZq4tcxWLKFnA IwLpvCvHFvCqvDLsht2am+N9qIBZJoYs9mEGKuttiOELjod/llVLMCR0u1IHVoIgucxxIW anxc0LTCCqkvsrJPqxq1atY24kesrMc6Brp/3dB1YLFs+ElyHTkaHO2ZOqSszleqXA0zXU HezeftBat/hbrTwvfrp/eJrkQh8GYvdSWkVFdy401SIxYsUskCWq+ozS3QCLOeylVm+aaZ EnSJZuQGiFpHfO7ej9myl5FlDcEnUvSM8DojWQSxTrnlCPJ6GGCFJ4btFbHXi/4aFLTNMY f6fzAaEDIt0Wg0x8RBWRDjhe0bGKyQAOh69KoMvsKpC+XDq40IYIv8URm8rdodQE342J7F ClECUy0CRnKZwSfPAbQP9ek7g+o6pvZooCrz0zPeRjcGMy3BBKOZUWic1jJBqV5rpi6WNy ZDb5i4EiBSLjsOdqUZbV5BCEbjCCD0oCdFc+8183OQMc27sP11ppfpX8nuDiBrNGLU4L51 7cQK7GaZA2twQOkjslqcdVkfJeXCc5Eu4gOEobxPxkxOQBZxZWxy6TKDevrg X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:12:57 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 6/8] accel/rocket: add RK3576 NPU (RKNN) support Date: Sat, 18 Jul 2026 15:11:44 +1200 Message-ID: <20260718031146.3368811-7-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add RK3576 support to the rocket DRM accelerator driver (used with the Mesa Teflon TFLite delegate). Per-SoC differences are selected by new of_device_id match data (struct rocket_soc_data) so the RK3588 path stays unchanged: - match rockchip,rk3576-rknn-core; iterate its nodes at probe - RK3576 takes six clocks (adds the CBUF domain ACLK/HCLK_RKNN_CBUF): the CNA fills the CBUF and CORE reads from it, so the compute path stalls without them. RK3588 keeps its four clocks. - RK3576 requests one reset (srst_a); its BIU reset (srst_h) is driven from the power domain. RK3588 keeps both. - RK3576 spans two power domains (PD_NPU0 + PD_NPU1) and attaches the list explicitly; RK3588 is single-domain and keeps the driver-core auto-attach. - RK3576 has no maskable completion interrupt (PC_DONE is read-only in INTERRUPT_MASK), so it polls PC_DONE via an hrtimer; RK3588 keeps the DPU completion IRQ. - guard rocket_job_timedout() MMIO behind pm_runtime_active() Tested on a Radxa ROCK 4D: the NPU probes, powers on, brings up its IOMMUs and runs submitted jobs to completion. Full multi-layer inference is not yet correct on this SoC (only the first operation per power session produces valid output); see the cover letter. Signed-off-by: Jiaxing Hu --- drivers/accel/rocket/rocket_core.c | 39 +++++++- drivers/accel/rocket/rocket_core.h | 22 ++++- drivers/accel/rocket/rocket_device.c | 4 + drivers/accel/rocket/rocket_drv.c | 22 ++++- drivers/accel/rocket/rocket_job.c | 127 +++++++++++++++++++++++++-- 5 files changed, 200 insertions(+), 14 deletions(-) diff --git a/drivers/accel/rocket/rocket_core.c b/drivers/accel/rocket/rock= et_core.c index b3b2fa9ba..140e37969 100644 --- a/drivers/accel/rocket/rocket_core.c +++ b/drivers/accel/rocket/rocket_core.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include =20 @@ -21,14 +22,31 @@ int rocket_core_init(struct rocket_core *core) u32 version; int err =3D 0; =20 + /* + * RK3576 moves the BIU (srst_h) reset to its power domain, so it only + * requests srst_a here (soc->num_resets =3D=3D 1); RK3588 keeps both. + */ core->resets[0].id =3D "srst_a"; core->resets[1].id =3D "srst_h"; - err =3D devm_reset_control_bulk_get_exclusive(&pdev->dev, ARRAY_SIZE(core= ->resets), + err =3D devm_reset_control_bulk_get_exclusive(&pdev->dev, core->soc->num_= resets, core->resets); if (err) return dev_err_probe(dev, err, "failed to get resets for core %d\n", cor= e->index); =20 - err =3D devm_clk_bulk_get(dev, ARRAY_SIZE(core->clks), core->clks); + core->clks[0].id =3D "aclk"; + core->clks[1].id =3D "hclk"; + core->clks[2].id =3D "npu"; + core->clks[3].id =3D "pclk"; + /* + * RK3576 (soc->num_clks =3D=3D 6): the CBUF (convolution buffer) has its= own + * clock domain. The CNA fills the CBUF and CORE reads from it; without + * these the compute path stalls after loading one slice (RDMA, which + * bypasses the CBUF, still runs). The vendor keeps all NPU clocks on + * whenever powered. + */ + core->clks[4].id =3D "aclk_cbuf"; + core->clks[5].id =3D "hclk_cbuf"; + err =3D devm_clk_bulk_get(dev, core->soc->num_clks, core->clks); if (err) return dev_err_probe(dev, err, "failed to get clocks for core %d\n", cor= e->index); =20 @@ -65,6 +83,23 @@ int rocket_core_init(struct rocket_core *core) return err; } =20 + /* + * RK3576: the NPU spans TWO power domains (PD_NPU0 + PD_NPU1). The vendor + * powers BOTH from its single NPU node even when computing on one core -- + * the CBUF->CMAC read path only works fully with NPU1 powered. A device + * with more than one power-domain is skipped by the driver-core single-PD + * auto-attach, so attach the list explicitly. RK3588 has a single domain + * and keeps the driver-core auto-attach (soc->multi_power_domain =3D=3D = false). + */ + if (core->soc->multi_power_domain) { + struct dev_pm_domain_list *pd_list; + + err =3D devm_pm_domain_attach_list(dev, NULL, &pd_list); + if (err < 0) + return dev_err_probe(dev, err, + "failed to attach NPU power domains\n"); + } + pm_runtime_use_autosuspend(dev); =20 /* diff --git a/drivers/accel/rocket/rocket_core.h b/drivers/accel/rocket/rock= et_core.h index f6d738285..2ab389c4b 100644 --- a/drivers/accel/rocket/rocket_core.h +++ b/drivers/accel/rocket/rocket_core.h @@ -6,6 +6,7 @@ =20 #include #include +#include #include #include #include @@ -27,16 +28,30 @@ #define rocket_core_writel(core, reg, value) \ writel(value, (core)->core_iomem + (REG_CORE_##reg) - REG_CORE_S_STATUS) =20 +/* + * Per-SoC differences, selected by the of_device_id match data. The RK35= 88 + * path (all flags/counts at their base values) must stay byte-for-byte the + * original behaviour; RK3576 opts in to the extra clocks, the multi-domain + * attach and the polled completion. + */ +struct rocket_soc_data { + unsigned int num_clks; /* clk_bulk count: 4 base, 6 with CBUF */ + unsigned int num_resets; /* reset_bulk count: 2 base, 1 on RK3576 */ + bool multi_power_domain; /* device spans more than one PM domain */ + bool poll_completion; /* PC_DONE not routable to the GIC; poll it */ +}; + struct rocket_core { struct device *dev; struct rocket_device *rdev; + const struct rocket_soc_data *soc; unsigned int index; =20 int irq; void __iomem *pc_iomem; void __iomem *cna_iomem; void __iomem *core_iomem; - struct clk_bulk_data clks[4]; + struct clk_bulk_data clks[6]; struct reset_control_bulk_data resets[2]; =20 struct iommu_group *iommu_group; @@ -52,6 +67,11 @@ struct rocket_core { atomic_t pending; } reset; =20 + /* RK3576 has no completion IRQ; poll for PC_DONE via hrtimer. */ + struct hrtimer poll_timer; + struct work_struct poll_work; + atomic_t poll_active; + struct drm_gpu_scheduler sched; u64 fence_context; u64 emit_seqno; diff --git a/drivers/accel/rocket/rocket_device.c b/drivers/accel/rocket/ro= cket_device.c index 46e6ee1e7..bfb00f967 100644 --- a/drivers/accel/rocket/rocket_device.c +++ b/drivers/accel/rocket/rocket_device.c @@ -31,6 +31,10 @@ struct rocket_device *rocket_device_init(struct platform= _device *pdev, if (of_device_is_available(core_node)) num_cores++; =20 + for_each_compatible_node(core_node, NULL, "rockchip,rk3576-rknn-core") + if (of_device_is_available(core_node)) + num_cores++; + rdev->cores =3D devm_kcalloc(dev, num_cores, sizeof(*rdev->cores), GFP_KE= RNEL); if (!rdev->cores) return ERR_PTR(-ENOMEM); diff --git a/drivers/accel/rocket/rocket_drv.c b/drivers/accel/rocket/rocke= t_drv.c index 8bbbce594..7f7dfa374 100644 --- a/drivers/accel/rocket/rocket_drv.c +++ b/drivers/accel/rocket/rocket_drv.c @@ -176,6 +176,7 @@ static int rocket_probe(struct platform_device *pdev) =20 rdev->cores[core].rdev =3D rdev; rdev->cores[core].dev =3D &pdev->dev; + rdev->cores[core].soc =3D of_device_get_match_data(&pdev->dev); rdev->cores[core].index =3D core; =20 rdev->num_cores++; @@ -213,8 +214,23 @@ static void rocket_remove(struct platform_device *pdev) } } =20 +static const struct rocket_soc_data rk3588_soc_data =3D { + .num_clks =3D 4, + .num_resets =3D 2, + .multi_power_domain =3D false, + .poll_completion =3D false, +}; + +static const struct rocket_soc_data rk3576_soc_data =3D { + .num_clks =3D 6, + .num_resets =3D 1, + .multi_power_domain =3D true, + .poll_completion =3D true, +}; + static const struct of_device_id dt_match[] =3D { - { .compatible =3D "rockchip,rk3588-rknn-core" }, + { .compatible =3D "rockchip,rk3588-rknn-core", .data =3D &rk3588_soc_data= }, + { .compatible =3D "rockchip,rk3576-rknn-core", .data =3D &rk3576_soc_data= }, {} }; MODULE_DEVICE_TABLE(of, dt_match); @@ -240,7 +256,7 @@ static int rocket_device_runtime_resume(struct device *= dev) if (core < 0) return -ENODEV; =20 - err =3D clk_bulk_prepare_enable(ARRAY_SIZE(rdev->cores[core].clks), rdev-= >cores[core].clks); + err =3D clk_bulk_prepare_enable(rdev->cores[core].soc->num_clks, rdev->co= res[core].clks); if (err) { dev_err(dev, "failed to enable (%d) clocks for core %d\n", err, core); return err; @@ -260,7 +276,7 @@ static int rocket_device_runtime_suspend(struct device = *dev) if (!rocket_job_is_idle(&rdev->cores[core])) return -EBUSY; =20 - clk_bulk_disable_unprepare(ARRAY_SIZE(rdev->cores[core].clks), rdev->core= s[core].clks); + clk_bulk_disable_unprepare(rdev->cores[core].soc->num_clks, rdev->cores[c= ore].clks); =20 return 0; } diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocke= t_job.c index 2f1861f96..ce3f7c92e 100644 --- a/drivers/accel/rocket/rocket_job.c +++ b/drivers/accel/rocket/rocket_job.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +21,16 @@ =20 #define JOB_TIMEOUT_MS 500 =20 +/* + * RK3576: INTERRUPT_MASK bits 28-29 are read-only (hardware rejects the w= rite), + * so the PC_DONE completion signal cannot be routed to the GIC via the no= rmal + * interrupt-mask path. We poll OPERATION_ENABLE every RK3576_POLL_INTERV= AL_NS + * instead of waiting for a completion IRQ. + */ +#define PC_INTERRUPT_MASK_RK3576_PC_DONE_0 0x10000000u +#define PC_INTERRUPT_MASK_RK3576_PC_DONE_1 0x20000000u +#define RK3576_POLL_INTERVAL_NS 1000000LL /* 1 ms */ + static struct rocket_job * to_rocket_job(struct drm_sched_job *sched_job) { @@ -137,8 +148,24 @@ static void rocket_job_hw_submit(struct rocket_core *c= ore, struct rocket_job *jo rocket_pc_writel(core, REGISTER_AMOUNTS, PC_REGISTER_AMOUNTS_PC_DATA_AMOUNT((task->regcmd_count + 1) / 2 - 1)); =20 - rocket_pc_writel(core, INTERRUPT_MASK, PC_INTERRUPT_MASK_DPU_0 | PC_INTER= RUPT_MASK_DPU_1); - rocket_pc_writel(core, INTERRUPT_CLEAR, PC_INTERRUPT_CLEAR_DPU_0 | PC_INT= ERRUPT_CLEAR_DPU_1); + if (core->soc->poll_completion) { + /* + * RK3576: PC_DONE (bits 28-29) is read-only in INTERRUPT_MASK, so + * it cannot be routed to the GIC; enable the DMA-error interrupts + * and poll PC_DONE via the hrtimer started below. + */ + rocket_pc_writel(core, INTERRUPT_MASK, + PC_INTERRUPT_MASK_DMA_READ_ERROR | + PC_INTERRUPT_MASK_DMA_WRITE_ERROR); + rocket_pc_writel(core, INTERRUPT_CLEAR, + PC_INTERRUPT_MASK_RK3576_PC_DONE_0 | + PC_INTERRUPT_MASK_RK3576_PC_DONE_1); + } else { + rocket_pc_writel(core, INTERRUPT_MASK, + PC_INTERRUPT_MASK_DPU_0 | PC_INTERRUPT_MASK_DPU_1); + rocket_pc_writel(core, INTERRUPT_CLEAR, + PC_INTERRUPT_CLEAR_DPU_0 | PC_INTERRUPT_CLEAR_DPU_1); + } =20 rocket_pc_writel(core, TASK_CON, PC_TASK_CON_RESERVED_0(1) | PC_TASK_CON_TASK_COUNT_CLEAR(1) | @@ -149,7 +176,14 @@ static void rocket_job_hw_submit(struct rocket_core *c= ore, struct rocket_job *jo =20 rocket_pc_writel(core, OPERATION_ENABLE, PC_OPERATION_ENABLE_OP_EN(1)); =20 - dev_dbg(core->dev, "Submitted regcmd at 0x%llx to core %d", task->regcmd,= core->index); + if (core->soc->poll_completion) { + atomic_set(&core->poll_active, 1); + hrtimer_start(&core->poll_timer, ns_to_ktime(RK3576_POLL_INTERVAL_NS), + HRTIMER_MODE_REL); + } else { + dev_dbg(core->dev, "Submitted regcmd at 0x%llx to core %d", + task->regcmd, core->index); + } } =20 static int rocket_acquire_object_fences(struct drm_gem_object **bos, @@ -326,12 +360,55 @@ static struct dma_fence *rocket_job_run(struct drm_sc= hed_job *sched_job) return fence; } =20 +static void rocket_job_handle_irq(struct rocket_core *core); + +static enum hrtimer_restart rocket_poll_timer_fn(struct hrtimer *timer) +{ + struct rocket_core *core =3D container_of(timer, struct rocket_core, poll= _timer); + + if (!atomic_read(&core->poll_active)) + return HRTIMER_NORESTART; + + /* + * On RK3576, OPERATION_ENABLE is not cleared by hardware on completion; + * check INTERRUPT_RAW_STATUS bits 28-29 (PC_DONE_0/1) instead. + */ + if (rocket_pc_readl(core, OPERATION_ENABLE) =3D=3D 0 || + (rocket_pc_readl(core, INTERRUPT_RAW_STATUS) & + (PC_INTERRUPT_MASK_RK3576_PC_DONE_0 | + PC_INTERRUPT_MASK_RK3576_PC_DONE_1))) { + atomic_set(&core->poll_active, 0); + schedule_work(&core->poll_work); + return HRTIMER_NORESTART; + } + + hrtimer_forward_now(timer, ns_to_ktime(RK3576_POLL_INTERVAL_NS)); + return HRTIMER_RESTART; +} + +static void rocket_poll_work_fn(struct work_struct *work) +{ + struct rocket_core *core =3D container_of(work, struct rocket_core, poll_= work); + + rocket_job_handle_irq(core); +} + static void rocket_job_handle_irq(struct rocket_core *core) { + u32 clear =3D 0x1ffff; + + if (core->soc->poll_completion) { + /* Stop the completion poll -- we're handling it now. */ + atomic_set(&core->poll_active, 0); + hrtimer_cancel(&core->poll_timer); + clear |=3D PC_INTERRUPT_MASK_RK3576_PC_DONE_0 | + PC_INTERRUPT_MASK_RK3576_PC_DONE_1; + } + pm_runtime_mark_last_busy(core->dev); =20 rocket_pc_writel(core, OPERATION_ENABLE, 0x0); - rocket_pc_writel(core, INTERRUPT_CLEAR, 0x1ffff); + rocket_pc_writel(core, INTERRUPT_CLEAR, clear); =20 scoped_guard(mutex, &core->job_lock) if (core->in_flight_job) { @@ -353,6 +430,12 @@ rocket_reset(struct rocket_core *core, struct drm_sche= d_job *bad) if (!atomic_read(&core->reset.pending)) return; =20 + if (core->soc->poll_completion) { + atomic_set(&core->poll_active, 0); + hrtimer_cancel(&core->poll_timer); + cancel_work_sync(&core->poll_work); + } + drm_sched_stop(&core->sched, bad); =20 /* @@ -385,7 +468,14 @@ static enum drm_gpu_sched_stat rocket_job_timedout(str= uct drm_sched_job *sched_j struct rocket_device *rdev =3D job->rdev; struct rocket_core *core =3D sched_to_core(rdev, sched_job->sched); =20 - dev_err(core->dev, "NPU job timed out"); + if (pm_runtime_active(core->dev)) + dev_err(core->dev, + "NPU job timed out: RAW_STATUS=3D0x%08x MASK=3D0x%08x OP_EN=3D0x%08x\n", + rocket_pc_readl(core, INTERRUPT_RAW_STATUS), + rocket_pc_readl(core, INTERRUPT_MASK), + rocket_pc_readl(core, OPERATION_ENABLE)); + else + dev_err(core->dev, "NPU job timed out (device not active)\n"); =20 atomic_set(&core->reset.pending, 1); rocket_reset(core, sched_job); @@ -424,9 +514,22 @@ static irqreturn_t rocket_job_irq_handler(int irq, voi= d *data) WARN_ON(raw_status & PC_INTERRUPT_RAW_STATUS_DMA_READ_ERROR); WARN_ON(raw_status & PC_INTERRUPT_RAW_STATUS_DMA_WRITE_ERROR); =20 - if (!(raw_status & PC_INTERRUPT_RAW_STATUS_DPU_0 || - raw_status & PC_INTERRUPT_RAW_STATUS_DPU_1)) - return IRQ_NONE; + if (core->soc->poll_completion) { + /* + * RK3576: completion is polled (rocket_poll_timer_fn); only the + * DMA-error bits (0-13) can raise this shared IRQ. + */ + u32 active =3D raw_status & 0x3fff; + + if (!active) + return IRQ_NONE; + + rocket_pc_writel(core, INTERRUPT_CLEAR, active); + } else { + if (!(raw_status & PC_INTERRUPT_RAW_STATUS_DPU_0 || + raw_status & PC_INTERRUPT_RAW_STATUS_DPU_1)) + return IRQ_NONE; + } =20 rocket_pc_writel(core, INTERRUPT_MASK, 0x0); =20 @@ -445,6 +548,10 @@ int rocket_job_init(struct rocket_core *core) int ret; =20 INIT_WORK(&core->reset.work, rocket_reset_work); + INIT_WORK(&core->poll_work, rocket_poll_work_fn); + hrtimer_setup(&core->poll_timer, rocket_poll_timer_fn, CLOCK_MONOTONIC, + HRTIMER_MODE_REL); + atomic_set(&core->poll_active, 0); spin_lock_init(&core->fence_lock); mutex_init(&core->job_lock); =20 @@ -486,6 +593,10 @@ int rocket_job_init(struct rocket_core *core) =20 void rocket_job_fini(struct rocket_core *core) { + atomic_set(&core->poll_active, 0); + hrtimer_cancel(&core->poll_timer); + cancel_work_sync(&core->poll_work); + drm_sched_fini(&core->sched); =20 cancel_work_sync(&core->reset.work); --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D679C2C158A; Sat, 18 Jul 2026 03:13:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344398; cv=none; b=ipfVPMdxqxSZhIIhQR86+dQMDpVap/67+KIc5L7as8dnV6NaUUd82qvSJHAj4gdUncFOyT0kiGo68n/4MubpbIIiHLCr/h9FGWHHOjtYdbcKd3wj5BgKrPcz56inhLutJf+zp5LeO8UJEaiyNfj8RQhWluc9o3Ds+vKNNJP8qpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344398; c=relaxed/simple; bh=AugLiOZZpf43n382xKWhWhjP3bM2FaMd0KmVHw7e7Z8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iLhZxxfbuluzBzwcaoQHasDD8TpyVZExPv3z8b/OP/GHItpqZ9vlRlcLndF4DPfmLBXubuSmJNHKSFrCKzDAo9Baj8NhjvdrBywpTOzr4XXeJfmboE6XwLqVhcz+qgd4ayd2lz6mDpL1QrGKP7byOg6R/gQcaAgY/7WV9FfZG4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=RZcxM6WU; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=TGqinDKj; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="RZcxM6WU"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="TGqinDKj" Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.phl.internal (Postfix) with ESMTP id 21C05138032E; Fri, 17 Jul 2026 23:13:16 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-04.internal (MEProxy); Fri, 17 Jul 2026 23:13:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344396; x= 1784347996; bh=RGge6AXelYw4CHxTjY9ZAudHE/paAHJpZ+SOWdc+8nE=; b=R ZcxM6WU3VIXmOq7vrYLmUZNX96nzQEOVoXqQLcrKkL+OOGdXtkNALg9LVFI/nPHE 0e5a37/4rWKfzpcejprWFKd0/3LFdARpntlS01RwO/ZKHamnIL/i7KEYBEvdPB1i RbKlc+xG0gaNgiXK0c6AO3fOds2ZSY5DzK9WebQg/qsCg2DqQdYJBaQ9wkUi+JNF 5ew56YT/PsVETeHFsu8Bw7shJsh2oRk8z/zpPnYZGT2qz+q5vJIKM/2kOUgvh85M IvkdpxFNjTfQPe1fn0SwFBlC19SDurZ6yPNAVof/66nFd91HiuR/0ZFkupqZCLWp aq0UqDfMjBzykbQgjVpqQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344396; x=1784347996; bh=R Gge6AXelYw4CHxTjY9ZAudHE/paAHJpZ+SOWdc+8nE=; b=TGqinDKjEKdcxJxIM IgX2EEjgZG0uJ4jl07TUfQYli/zRZWyxn8bOk8+Orj2zdLFy4QWeaCGCWAM1K1kx 00Ai7YIpqq/J4l47e4OZP8eyxUbBcqkOUboBkuSqzqTrl8eC9ISWpzPiKgwPNQ2p pQ+h8Euls/0vdulgz1dfdEVIQMMW4IP9dS32avamP8uHW3HbA9tllfJ5Iab9ESTd 6ZChr1P/wCXTqEgT9GwH8KzkXtLdP6pSRhHQCjCdXhD73FqyzYuMD2b3TlF/y1mI V2BkVC9XQcHksCVZaqyexfiSvAuXNjEsEZB+Ozp412h8EL4IYHlHlVn8fbtCxNmr JXQFA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTFwV1cFOfFn5PC73/ps5muOtgjuTiqxG0kSfLaiTUgsadolusDHAcJW7MRZ0220Q4 SMNmJKHZ7mfMKOV4i7J8w8QXnOcGdfffeHBigikD4MpXc0ah12NSo3fCM8/WJtIN/YKXN9 aVztulf1DP03Gn+B/ZVCtOW2jGWNL+h+ssR/8idEpSPgN173VWcpI+vcj73eJ98Dh/1P/3 5j6loLj84q4dWd1YK1iT123NoLmCLNdBBsYJthF3OnzZzy0Lgcee0ajRZPjY13C5ceHuV+ 1xLeJsLOnan2miDzyccXYjseBtjodOM2p23BiYsi/OLqrt4gGc6DAGDBr3uqxUe8L+GrEF IYlAE7vQGkR8aklR/mYKscUCCKQBsyrvkWo73QG+QixY48Q9BPSmcbVV74nnOIFz2RTm8R 4sNOw81zDe6nT1y87gYrvzWmfeCU2WiO2t/gvoYbguBsgaaw+2OcSsd8wwYDbRyBL8fLYR YTQMzX4+iDmKmOe2Uy52h6V/eWsih41fTlSR41pW0icwZNqh4njml6OR5jtWOFFuIHbY34 OpvqNMXn4xfPpfQlj2lDYoBWj2Hmwoq8x7+gjQSfpmz/VRbC4pkHPeOBi6IVlM2t+R5arS KuCWRLzpIS8lnklfr1XY0t5BZL9kpasqSIcL+liSBL4SToHIGM4DfaWHPHKg X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:13:08 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 7/8] arm64: dts: rockchip: rk3576: add NPU (RKNN) nodes Date: Sat, 18 Jul 2026 15:11:45 +1200 Message-ID: <20260718031146.3368811-8-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- 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 =3D ; clocks =3D <&cru HCLK_RKNN_ROOT>, - <&cru ACLK_RKNN0>; + <&cru ACLK_RKNN0>, + <&cru CLK_RKNN_DSU0>, + <&cru ACLK_RKNN_CBUF>, + <&cru HCLK_RKNN_CBUF>; + resets =3D <&cru SRST_A_RKNN0_BIU>; pm_qos =3D <&qos_npu_m0>; #power-domain-cells =3D <0>; }; power-domain@RK3576_PD_NPU1 { reg =3D ; clocks =3D <&cru HCLK_RKNN_ROOT>, - <&cru ACLK_RKNN1>; + <&cru ACLK_RKNN1>, + <&cru CLK_RKNN_DSU0>, + <&cru ACLK_RKNN_CBUF>, + <&cru HCLK_RKNN_CBUF>; + resets =3D <&cru SRST_A_RKNN1_BIU>; pm_qos =3D <&qos_npu_m1>; #power-domain-cells =3D <0>; }; @@ -1804,6 +1812,72 @@ qos_npu_m1ro: qos@27f22100 { reg =3D <0x0 0x27f22100 0x0 0x20>; }; =20 + rknn_core_0: npu@27700000 { + compatible =3D "rockchip,rk3576-rknn-core"; + reg =3D <0x0 0x27700000 0x0 0x1000>, + <0x0 0x27701000 0x0 0x1000>, + <0x0 0x27703000 0x0 0x1000>, + <0x0 0x27704000 0x0 0x1000>, + <0x0 0x27705000 0x0 0x1000>; + reg-names =3D "pc", "cna", "core", "dpu", "dpu_rdma"; + interrupts =3D ; + clocks =3D <&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 =3D "aclk", "hclk", "npu", "pclk", + "aclk_cbuf", "hclk_cbuf"; + resets =3D <&cru SRST_A_RKNN0>; + reset-names =3D "srst_a"; + power-domains =3D <&power RK3576_PD_NPU0>; + iommus =3D <&rknn_mmu_0>; + status =3D "disabled"; + }; + + rknn_mmu_0: iommu@27702000 { + compatible =3D "rockchip,rk3576-iommu", "rockchip,rk3568-iommu"; + reg =3D <0x0 0x27702000 0x0 0x100>, + <0x0 0x27702100 0x0 0x100>; + interrupts =3D ; + clocks =3D <&cru ACLK_RKNN0>, <&cru HCLK_RKNN_ROOT>, + <&cru CLK_RKNN_DSU0>, <&cru ACLK_RKNN_CBUF>, + <&cru HCLK_RKNN_CBUF>; + #iommu-cells =3D <0>; + power-domains =3D <&power RK3576_PD_NPU0>; + status =3D "disabled"; + }; + + rknn_core_1: npu@27710000 { + compatible =3D "rockchip,rk3576-rknn-core"; + reg =3D <0x0 0x27710000 0x0 0x1000>, + <0x0 0x27711000 0x0 0x1000>, + <0x0 0x27713000 0x0 0x1000>, + <0x0 0x27714000 0x0 0x1000>, + <0x0 0x27715000 0x0 0x1000>; + reg-names =3D "pc", "cna", "core", "dpu", "dpu_rdma"; + interrupts =3D ; + clocks =3D <&cru ACLK_RKNN1>, <&cru HCLK_RKNN_ROOT>, + <&cru CLK_RKNN_DSU0>, <&cru PCLK_NPUTOP_ROOT>; + clock-names =3D "aclk", "hclk", "npu", "pclk"; + resets =3D <&cru SRST_A_RKNN1>; + reset-names =3D "srst_a"; + power-domains =3D <&power RK3576_PD_NPU1>; + iommus =3D <&rknn_mmu_1>; + status =3D "disabled"; + }; + + rknn_mmu_1: iommu@2770a000 { + compatible =3D "rockchip,rk3576-iommu", "rockchip,rk3568-iommu"; + reg =3D <0x0 0x2770a000 0x0 0x100>, + <0x0 0x2770a100 0x0 0x100>; + interrupts =3D ; + clocks =3D <&cru ACLK_RKNN1>, <&cru HCLK_RKNN_ROOT>, + <&cru CLK_RKNN_DSU0>, <&cru ACLK_RKNN_CBUF>, + <&cru HCLK_RKNN_CBUF>; + #iommu-cells =3D <0>; + power-domains =3D <&power RK3576_PD_NPU1>; + status =3D "disabled"; + }; + gmac0: ethernet@2a220000 { compatible =3D "rockchip,rk3576-gmac", "snps,dwmac-4.20a"; reg =3D <0x0 0x2a220000 0x0 0x10000>; --=20 2.43.0 From nobody Sat Jul 25 04:30:07 2026 Received: from flow-a2-smtp.messagingengine.com (flow-a2-smtp.messagingengine.com [103.168.172.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 621702D249E; Sat, 18 Jul 2026 03:13:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.137 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344410; cv=none; b=dO7lCA4XyRXFQL8gPd54eQZ56BtEhx7I51Cq9jkxXUnlfn05geGq2RM2UQ3mUWU1uts4BkMnNk5O+yUX3ufAQxorZwXSq8mL+Y6YfkdJvBvLUYAhYYYQeiohLNGdOBi6HBaikY1ErDteXVIBUzpf4+jKq/GpQZ4fcvZTODRUCbQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784344410; c=relaxed/simple; bh=Uf+TTksccwhXVXwKc1h0XX0L562Gla3BGVJmfHenAKI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gVJ3sWCZoknc6v2exWC957GClT6I/40j7iTja4R8jnE8nWQubm5YmS3ue8Na9wp1hxmMifUGDuaBJc6pOVUW6p87H+uxG2F3tXNJ/zj7PV5W8HckKK97FSAGjjJiyZJIhQznld76nAHBMguqHhA4xFUtvmxeS0pP5qtpUCDSwfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b=f4+2uIhA; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=FEv7vYl3; arc=none smtp.client-ip=103.168.172.137 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gahingwoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gahingwoo.com header.i=@gahingwoo.com header.b="f4+2uIhA"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="FEv7vYl3" Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailflow.phl.internal (Postfix) with ESMTP id 96C621380331; Fri, 17 Jul 2026 23:13:28 -0400 (EDT) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-02.internal (MEProxy); Fri, 17 Jul 2026 23:13:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gahingwoo.com; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1784344408; x= 1784348008; bh=YN8hcc7LHmdlR/Uog1WmzdV1gpimyXqpsnNhBwVT+7c=; b=f 4+2uIhAusfUol4rxC2dMLYoC9KnygfD5PaCWftweDogHfD1Pp5zajB3+yuEVXa76 mt7m15J2jk4pziHy9NkPY3d7UGF6HUct/5UJGe7rKRyPS1ODGcrw0WeC8DfK+Nyk yQ2j+rOltDpK27ul2KVhpzzK/4oavW/InO5GqT5jSu6d5bPgpvZgWcrJ9kpFcUao 3DYJHLDRFkZB3gU4bpXNZeFAA+FqHdjKMcssmWCwD7jPBa4fK6IhBZYRApPR0Tey qJT3uLN7ggcHJM9usHld60Z7KqMZ91NLpW8fkytDHQ/OalJ/7SOdpdDpy/9zvOOw yy+UILUUJ9ndqu1WIea3g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1784344408; x=1784348008; bh=Y N8hcc7LHmdlR/Uog1WmzdV1gpimyXqpsnNhBwVT+7c=; b=FEv7vYl3eSjTFiTJK hifT8+DxYPkP0CoXACUzlbd+jbHSFBxu83xjh1VCH6smVg+grMVc4LVP+YWreYVH PCM9U2b1y8nG1m5YuKOCzpwgjOEsEvty34Bu8em8Nt46W+YeWkwZhx1Fy6DJ8hUt QV5emtL0Sinl56sEJon6bo1vDnyNUY10CvmIeFZaoJ5hcCMEa0Mbu92fZTu1g6Jc 8D+nXPEwS+n5tQHxrv1DqnCJowreGufzQzSHdUAI7G2LpS8nCdmAbKcPTMe0Nzyl 5GJBbiwqMajqSJR6mbLrH4acIP5g+C5mIF0ubydyoB5Nt5J1rgMuoeVxpXy2+4cL aa2WQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGo/Hd4L5rRwOTvh0WCJISmOoXEdIqPuYccPV++DcxWf8Powz1Ybe2qRyZPFweND+ SC523aTq5VzMTUw6xzE3TE+6TtlEB8vrrH4BUWnWvZIVs8l+O8kw8bSbEXZq4tcxWLKFnA IwLpvCvHFvCqvDLsht2am+N9qIBZJoYs9mEGKuttiOELjod/llVLMCR0u1IHVoIgucxxIW anxc0LTCCqkvsrJPqxq1atY24kesrMc6Brp/3dB1YLFs+ElyHTkaHO2ZOqSszleqXA0zXU HezeftBat/hbrTwvfrp/eJrkQh8GYvdSWkVFdy401SIxYsUskCWq+ozS3QCLOeylVm+ac4 mhkUCZfzedlPV217ifuS7BuzBzAZj5FR8Vb3i70lAsAb4Tz616O2qLJCUSo8KHCxill/Sv x/SOTD1uo27taJZ6UzFY1U86vK2BYoaOLXtnvWBMKKuEm2BRAfuduUFBpUqGS7Hte7s7Bc 2lEdCQ7R4kNrjhIxju+zU/BKmehiamiYQfbZUH4ImzbwfCU45zE7lc8py6MOqCAGwoB+Ft evDgxSzO37rdydZ98RNpUU5W3UWgd3kOpqaKP9C/N7+qPe6OEamMoDhPLR83GD6j5Nn+BU oa/R4skBzef0HKnUgmwkOiMugYbnwO/SOlJUhRqWzz/Yh090llGEL/ekQGkg X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 17 Jul 2026 23:13:20 -0400 (EDT) From: Jiaxing Hu To: tomeu@tomeuvizoso.net, heiko@sntech.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org Cc: chaoyi.chen@rock-chips.com, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jiaxing Hu Subject: [RFC PATCH v2 8/8] arm64: dts: rockchip: rk3576-rock-4d: enable NPU Date: Sat, 18 Jul 2026 15:11:46 +1200 Message-ID: <20260718031146.3368811-9-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260718031146.3368811-1-gahing@gahingwoo.com> References: <20260718031146.3368811-1-gahing@gahingwoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Enable rknn_core_0 and rknn_mmu_0 on the Radxa ROCK 4D and supply the NPU rail (vdd_npu_s0) via npu-supply. Signed-off-by: Jiaxing Hu --- arch/arm64/boot/dts/rockchip/rk3576-rock-4d.dts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3576-rock-4d.dts b/arch/arm64/b= oot/dts/rockchip/rk3576-rock-4d.dts index 272af1012..09d2fc98b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-rock-4d.dts +++ b/arch/arm64/boot/dts/rockchip/rk3576-rock-4d.dts @@ -442,6 +442,7 @@ regulator-state-mem { }; =20 vdd_npu_s0: dcdc-reg2 { + regulator-always-on; regulator-boot-on; regulator-enable-ramp-delay =3D <400>; regulator-min-microvolt =3D <550000>; @@ -869,3 +870,18 @@ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { remote-endpoint =3D <&hdmi_in_vp0>; }; }; + +&rknn_core_0 { + npu-supply =3D <&vdd_npu_s0>; + /* + * Power BOTH NPU domains (NPU0 + NPU1) like the vendor's single NPU node, + * even though rocket computes only on core 0: the CBUF->CMAC read path is + * only fully powered with NPU1 up. rocket attaches the multi-PD list. + */ + power-domains =3D <&power RK3576_PD_NPU0>, <&power RK3576_PD_NPU1>; + status =3D "okay"; +}; + +&rknn_mmu_0 { + status =3D "okay"; +}; --=20 2.43.0