From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=103.168.172.139 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794625642; b=lnzvdJboqnfZJqMBfjbDqQd52yJWJ3chnXDqDUgYDuH/LeDF0jvmI+8AFSYATT+nPmI/ dqsbfT49/txQUp7O8v0Iw5PMle4lJMwDxuljUv423UbBhUgTIgw1W1QFu7lg1pv8ThAnI OAGUiZ2XkcU6gUIyF9oSRwceRft3NrksSWr2EGbOgcUjQ+TMCevYfTohA/d5sTi0SwdCY A7cCS8Gs3qRVzq3UZCbIzKN11uv7USqz7Y/Q6N/R/HOz2muz1wBD1ivkk1MTaGViZ+C9J nIxB+KZ/sDy4MmSUtvgat8QpBnecYyTg/oLpzVd5nurhtStFA2iN2MY07/0TNEjDvKw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794625642; h=DMARC-Filter:Received:Received:DKIM-Signature:DKIM-Signature: X-DKIM2-Info:DKIM2-Signature:X-DKIM2-Info:Message-Instance: X-ME-Sender:X-ME-Received:X-ME-Proxy-Cause:X-ME-Proxy:Feedback-ID: Received:From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; bh=ZxUyROuDthVLtFanIfBp0sfv7UFu/s7kRd8U8ZoQom8=; b=xNSSWN4J31B/kEXNdrZPyMzmv6hVq/BqV2kamm66E3pg1nueySE9fPqGkB/6k5VCYnhr eInsbkcgj5V5RIo1bxx5yihGjemn5wXI//Y0BqK0zHYvOtSokUykCi5sCTC0ynPxt4uAn jt0qvbqtYOlpoCrvDFX69nvj4o3FwoyIWZWV17cjhbAg58XDDEwAKYxuWkh14wXAt9Fso L7mXAiT7FI7TlMPTe64qJemDVVbMBDNcRlFbAUo0qjzIA3ax9KcZWxKP5NsuJkocxtoKl fqbEElF1BQmIAcMYIQdTSRrA6tWfjkwJCw70AT0sbuQWZ57MQebSsRJ127l263rjztw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=gahingwoo.com; spf=pass smtp.mailfrom=gahingwoo.com; dkim=pass header.d=gahingwoo.com header.i=@gahingwoo.com header.a=rsa-sha256 header.s=fm1 header.b=BCjYoXHC; dkim=pass header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm3 header.b="oDAt/bYZ"; arc=none smtp.remote-ip=103.168.172.139 Received: from flow-a4-smtp.messagingengine.com (flow-a4-smtp.messagingengine.com [103.168.172.139]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E519160A2613 for ; Sat, 14 Nov 2026 03:07:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org E519160A2613 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, unprotected) header.d=gahingwoo.com header.i=@gahingwoo.com header.a=rsa-sha256 header.s=fm1 header.b=BCjYoXHC; dkim=pass (2048-bit key, unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm3 header.b=oDAt/bYZ Received: from phl-compute-07.internal (phl-compute-07.internal [10.202.2.47]) by mailflow.phl.internal (Postfix) with ESMTP id 49AFA1381A4E for ; Fri, 13 Nov 2026 22:07:21 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-07.internal (MEProxy); Fri, 13 Nov 2026 22:07:21 -0500 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=1794625641; x= 1794632841; bh=ZxUyROuDthVLtFanIfBp0sfv7UFu/s7kRd8U8ZoQom8=; b=B CjYoXHC60d7oK4R4g7YqMcyUqG6Dy1AoKYQE6F0y0chzDx1+LDxcGXvkgHLoRWtd 7d5p6vApXNbn4BPPK4WArEyZ3L+Kmcv994SgZnhI6Z6F4IX7co2N48IrW53YC+ip 4ozpgeUw+/C3X9pn0t6ggdxlC6Q/wey86HuiOi//ul52Pqx9j8xWu7di0NoBFhBO 5wSXp3a3F2HyOSFJtLlh6bgtdjLXS6pG4VhKrIu5QDBX6ajtuR+HVSJLGd0OAAUS 6o77X8A5GDvW0uq0l46XMuaHF3U9ee+DxMMT926O/45bTcZ8u41NVCDKW/Zwuh2h sSvLKAZmXQNtMrg3G7rfQ== 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=fm3; t=1794625641; x=1794632841; bh=Z xUyROuDthVLtFanIfBp0sfv7UFu/s7kRd8U8ZoQom8=; b=oDAt/bYZmpRtxNBkX rsikVhlCHC0YpYN6JfJHAQbUYYrY0B5yLtr0fwYXRUgxIhJKXrT+uCGwV+OsIdRG dhqRE//cBrJeR29Y8qkCgRGhjUMws3V3QR3Vff8oPT7jHqJTQfNGJmG1mZ0GUPgU 5S7DX0bwZaREhQ3MsuyU4nlxHu1KS71diIHsDI1tm+/yqSDC4s8ZxPBO8gU6kv3v cG8SkGViY+EDpVTIOUFLQjqSWCzl+dil8TFrY804TcD4yhRekE6mVv6uoHJbcob8 mig3efvaEta/CC39oRPP6TBYT9I8bpFBGwAGPx/q3UVrshjb7H0Vd90d2Lvba+OY JZyDg== X-DKIM2-Info: draft=ietf-dkim-dkim2-spec-09; repo=github.com/dkim2wg/interop; date=2026-11-03; sw=lmtpprox; action=sign d=gahingwoo.com a=rsa-sha256; DKIM2-Signature: i=1; m=1; t=1794625641; d=gahingwoo.com; mf=PGdhaGluZ0BnYWhpbmd3b28uY29tPg==; rt=PGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+; s=fm1:rsa-sha256:OY3KVkSw/R1FER072AHOGkDL8tBxyLU7VNUWBQyAAu9UA3E qabVmrjgL/4Kygb4l2vHgBhpG12vrQcYBZi/IPHedcsvT/NNI6sfIUkb8w7n0JaV lPEHH1NaYCiiyX5c+pZVz++KWw2RycgYZHvCdhcrBmtmKJh6x1L11z6U7wUPHRke CkEf6icCch00pxaNwQGXZbmh4KTkfofQWOIxI5uXYQUOapcrN9l/0l7ncd+w75Qz /+SvKLVP5Nuu07wIQeynR+pl/QVTZR3DUoM0oIBRhSJVbAmGMX1LmylYOThr0G9h R9W/sg1QsGs0dRgePruDFD9lM4FM6rVym11Kp0w==; X-DKIM2-Info: draft=ietf-dkim-dkim2-spec-09; repo=github.com/dkim2wg/interop; date=2026-11-03; sw=lmtpprox; action=mi-m=1; hc=11; hn=cc,content-transfer-encoding,date,feedback-id,from, in-reply-to,message-id,mime-version,references,subject,to; Message-Instance: m=1; h=sha256:X5ESKhpGyixR+D89Fb0Ja8nTlYtS8VLcsQwSjmxxrXM=:ebLMyHUtp2h/cZGBOQS5t6ujg1UFzw5hcjwxzwQhJYU=; X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGLv1hz09a3Z3EXCwmORUpwC+Cy72ChFuKnGtX6ZU8GGLHgxpuX6WqGXEA/YZrryv vv0prpdLfBwpQpLWmeD6AMfy7KlCfIGstcy+mENKkf07iojtVvEya/NHDu3GuWT4c2rhqI ZONNY3wWPMjfN9lDAHW9TqItupPiJk+3wyJf0nnsl70tYmnvYemNXYszDru2blGoT8EQgR h1/Ss5vi/yXiM3iowxUh2VDtjNJEl9yaMnp9yw432jsGdApevC/sGgaH7cyYWyAVXTJw6p 6LHSFyjkbDMd9Mymm1VF44oN6b4dfIstLoOUWpNdcumuV3L/vQ1Ryv1ZYSCAHCK+wZoelk iMYij8HqJFVdFvx8k/yzupStm23xdFlZBIJmaIwJpUMFeufkNaUnN/Y6ihJE3Wobfo5362 DP9ip92GHJlA3oHxsh3fz6s8OIUZBC+a4/GAp5GFYfdJgmy0/b7hSf17wiplKi+DGYI2ve 6UrA145QYBwQgXzX8bGm89lB/ZdAZMPnUvqu9zkMyRtKtQKg/s1RyOl8Q+96cnD4oHRBkh R7FAwIyhLW9GAILzcPrdQUqjO6fyA/K4tW1OiTU+OLmfc4mcCFf8e2EUGGvvcFnfQDjF+Q kyfRqSKRpw98aojJhZzBVXsrwA4SAZbMvviKHTPGH+Q5MxF86dpPHH54uC4w X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 13 Nov 2026 22:07:12 -0500 (EST) 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, p.zabel@pengutronix.de, ogabbay@kernel.org, zhangqing@rock-chips.com Cc: royalnet026@gmail.com, ulf.hansson@oss.qualcomm.com, abel.vesa@oss.qualcomm.com, sebastian.reichel@collabora.com, sidong.yang@furiosa.ai, u.kleine-koenig@baylibre.com, chaoyi.chen@rock-chips.com, shawn.lin@rock-chips.com, finley.xiao@rock-chips.com, diederik@cknow-tech.com, alchark@flipper.net, leonard@lausen.nl, vlwwwwww@gmail.com, jeff.hugo@oss.qualcomm.com, rfoss@kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, iommu@lists.linux.dev, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v17 09/12] accel/rocket: add RK3576 NPU (RKNN) support Date: Sat, 14 Nov 2026 16:05:26 +1300 Message-ID: <57874e7459ed84ad47b2e31a62871ff535da249b.1794615323.git.gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add support for the RK3576 NPU. It has two cores; each core needs six clocks and one reset, with aclk_cbuf and hclk_cbuf on top of what the RK3588 has. The task number in PC_TASK_CON is 16 bits wide, not 12. BIT16, BIT17 and BIT18 are pp_en, count_clear and last_layer_clear. Chaoyi Chen confirmed this layout on the list: https://lore.kernel.org/all/4f300b78-d96d-4d98-8819-dc292b0c9b97@rock-chips.com/ The number of NPU cores is taken from the driver's own match table. Signed-off-by: Jiaxing Hu # Conflicts: # drivers/accel/rocket/rocket_core.c # drivers/accel/rocket/rocket_core.h --- drivers/accel/rocket/rocket_core.c | 2 ++ drivers/accel/rocket/rocket_core.h | 3 +++ drivers/accel/rocket/rocket_device.c | 3 ++- drivers/accel/rocket/rocket_drv.c | 14 +++++++++++--- drivers/accel/rocket/rocket_drv.h | 2 ++ drivers/accel/rocket/rocket_job.c | 20 ++++++++++++++++---- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/drivers/accel/rocket/rocket_core.c b/drivers/accel/rocket/rocket_core.c index 040272573a72..638061a97bf3 100644 --- a/drivers/accel/rocket/rocket_core.c +++ b/drivers/accel/rocket/rocket_core.c @@ -32,6 +32,8 @@ int rocket_core_init(struct rocket_core *core) core->clks[ROCKET_CLK_HCLK].id = "hclk"; core->clks[ROCKET_CLK_NPU].id = "npu"; core->clks[ROCKET_CLK_PCLK].id = "pclk"; + core->clks[ROCKET_CLK_ACLK_CBUF].id = "aclk_cbuf"; + core->clks[ROCKET_CLK_HCLK_CBUF].id = "hclk_cbuf"; err = 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", core->index); diff --git a/drivers/accel/rocket/rocket_core.h b/drivers/accel/rocket/rocket_core.h index 05d34e538e36..ef7043046bc6 100644 --- a/drivers/accel/rocket/rocket_core.h +++ b/drivers/accel/rocket/rocket_core.h @@ -32,12 +32,15 @@ enum rocket_clk { ROCKET_CLK_HCLK, ROCKET_CLK_NPU, ROCKET_CLK_PCLK, + ROCKET_CLK_ACLK_CBUF, + ROCKET_CLK_HCLK_CBUF, ROCKET_CLK_MAX, }; struct rocket_soc_data { unsigned int num_clks; unsigned int num_resets; + bool task_con_16bit; }; struct rocket_core { diff --git a/drivers/accel/rocket/rocket_device.c b/drivers/accel/rocket/rocket_device.c index db137e2ec15e..868af86d00ce 100644 --- a/drivers/accel/rocket/rocket_device.c +++ b/drivers/accel/rocket/rocket_device.c @@ -9,6 +9,7 @@ #include #include "rocket_device.h" +#include "rocket_drv.h" struct rocket_device *rocket_device_init(struct platform_device *pdev, const struct drm_driver *rocket_drm_driver) @@ -27,7 +28,7 @@ struct rocket_device *rocket_device_init(struct platform_device *pdev, ddev = &rdev->ddev; dev_set_drvdata(dev, rdev); - for_each_compatible_node(core_node, NULL, "rockchip,rk3588-rknn-core") + for_each_matching_node(core_node, rocket_dt_match) if (of_device_is_available(core_node)) num_cores++; diff --git a/drivers/accel/rocket/rocket_drv.c b/drivers/accel/rocket/rocket_drv.c index 1030d8407b78..fff31c1ebe52 100644 --- a/drivers/accel/rocket/rocket_drv.c +++ b/drivers/accel/rocket/rocket_drv.c @@ -226,13 +226,21 @@ static void rocket_remove(struct platform_device *pdev) static const struct rocket_soc_data rk3588_soc_data = { .num_clks = 4, .num_resets = 2, + .task_con_16bit = false, }; -static const struct of_device_id dt_match[] = { +static const struct rocket_soc_data rk3576_soc_data = { + .num_clks = 6, + .num_resets = 1, + .task_con_16bit = true, +}; + +const struct of_device_id rocket_dt_match[] = { { .compatible = "rockchip,rk3588-rknn-core", .data = &rk3588_soc_data }, + { .compatible = "rockchip,rk3576-rknn-core", .data = &rk3576_soc_data }, {} }; -MODULE_DEVICE_TABLE(of, dt_match); +MODULE_DEVICE_TABLE(of, rocket_dt_match); static int find_core_for_dev(struct device *dev) { @@ -291,7 +299,7 @@ static struct platform_driver rocket_driver = { .driver = { .name = "rocket", .pm = pm_ptr(&rocket_pm_ops), - .of_match_table = dt_match, + .of_match_table = rocket_dt_match, }, }; diff --git a/drivers/accel/rocket/rocket_drv.h b/drivers/accel/rocket/rocket_drv.h index 9421e48ec5d8..eb1e243ff75a 100644 --- a/drivers/accel/rocket/rocket_drv.h +++ b/drivers/accel/rocket/rocket_drv.h @@ -6,10 +6,12 @@ #include #include +#include #include "rocket_device.h" extern const struct dev_pm_ops rocket_pm_ops; +extern const struct of_device_id rocket_dt_match[]; struct rocket_iommu_domain { struct iommu_domain *domain; diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocket_job.c index 68df1596014e..59a6f548e108 100644 --- a/drivers/accel/rocket/rocket_job.c +++ b/drivers/accel/rocket/rocket_job.c @@ -31,6 +31,11 @@ /* Bits 3:0 of PC_BASE_ADDRESS hold the mode selection bit and reserved bits */ #define ROCKET_REGCMD_ALIGN 16 +#define RK3576_PC_TASK_CON_TASK_NUMBER(n) ((n) & 0xffff) +#define RK3576_PC_TASK_CON_PP_EN BIT(16) +#define RK3576_PC_TASK_CON_COUNT_CLEAR BIT(17) +#define RK3576_PC_TASK_CON_LAST_LAYER_CLEAR BIT(18) + static struct rocket_job * to_rocket_job(struct drm_sched_job *sched_job) { @@ -166,10 +171,17 @@ static void rocket_job_hw_submit(struct rocket_core *core, struct rocket_job *jo 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); - rocket_pc_writel(core, TASK_CON, PC_TASK_CON_RESERVED_0(1) | - PC_TASK_CON_TASK_COUNT_CLEAR(1) | - PC_TASK_CON_TASK_NUMBER(1) | - PC_TASK_CON_TASK_PP_EN(1)); + if (core->soc->task_con_16bit) + rocket_pc_writel(core, TASK_CON, + RK3576_PC_TASK_CON_LAST_LAYER_CLEAR | + RK3576_PC_TASK_CON_COUNT_CLEAR | + RK3576_PC_TASK_CON_PP_EN | + RK3576_PC_TASK_CON_TASK_NUMBER(1)); + else + rocket_pc_writel(core, TASK_CON, PC_TASK_CON_RESERVED_0(1) | + PC_TASK_CON_TASK_COUNT_CLEAR(1) | + PC_TASK_CON_TASK_NUMBER(1) | + PC_TASK_CON_TASK_PP_EN(1)); rocket_pc_writel(core, TASK_DMA_BASE_ADDR, PC_TASK_DMA_BASE_ADDR_DMA_BASE_ADDR(0x0)); -- 2.43.0