From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=202.12.124.144 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794121379; b=f7L7ocdvvfWL9oCr6JjOmn6VskmetapP0dAK43y9tgRNaTaus+Z4QFlOw9IaLy8MzgVF gvYexJtZz8yWSOAULg2OUsZZzkRtvMzjdzQR9aJNXIUkY915LNgMIJ85CJ6glcJazQysB OBj240PP7h6sgeCfzVeUzR5QJG19h7ei0VVIqVKMW+YVdeMECqBoCJtaLzluxH9BrZlSq 4sVFLTu5draW1Km6idh2CYNARTBWH96f6wzasP6HsOCEauB0hl9GaTIHqLGQImmNORXXE jBnjFWNkR2ZrU0OVB7ST44KO9FPHz5VLAyvo5OKJNG17k6hE/iMiNEFfOPCQ4E/gLnA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794121379; 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=FXVYakP/oT6Ni/cedh8DXGKsqUJQQrycKKZPqfoyYko=; b=oGj+vv6vZwrrsjQF8VE6CkI6PqXijtAdqiPlWnQLSx0u/fMernkeXF7dBH8MxtitmGm7 gaDBgbf4t4m6qPiyboq1MQtalV2wmgPqcZx8mtJSVxjdNvHQw87/+hRsM9I6JbqoM5oEM sRUM+BIpRLCibVdccSen0z1uHzcv4buZIQg4MzMveCntTXI+HFiRNJ3eI5Usf7GUGU7J+ mdLcfutdYhvSAGMXVGPhPFRDM3z76Z2BV29BdqzLzKC6tL5U6QB7An4OLlWA4F7PRiRQb FAAMj/aAxOjnneKVTBl3Orl8spuxcNOyg3Qp1RPl+adUJFV1m/ReA48cVXFAhpjBPRQ== 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="sF/A3TdS"; dkim=pass header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm3 header.b=ywiMYAgr; arc=none smtp.remote-ip=202.12.124.144 Received: from fout-b1-smtp.messagingengine.com (fout-b1-smtp.messagingengine.com [202.12.124.144]) (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 31382606A31E for ; Sun, 8 Nov 2026 07:02:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 31382606A31E 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=sF/A3TdS; dkim=pass (2048-bit key, unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm3 header.b=ywiMYAgr Received: from phl-compute-11.internal (phl-compute-11.internal [10.202.2.51]) by mailfout.stl.internal (Postfix) with ESMTP id B33301D0018C for ; Sun, 8 Nov 2026 02:02:58 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-11.internal (MEProxy); Sun, 08 Nov 2026 02:02:58 -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=1794121373; x= 1794207773; bh=FXVYakP/oT6Ni/cedh8DXGKsqUJQQrycKKZPqfoyYko=; b=s F/A3TdSMSPUc4wRSltkApXtFV/TEceOW+Qww+z2Oa+u9kBd73D7ZvxryWjwXU6rB gn4kbW+CGwyf8E4K7Pk9uKRKr9UfXR97agbI/CNOMTFWt74MNN/5497jxU9cGuBX c0cdWodV7g1r/FumKCoScsE4LJ2t0iHrr/BoaXivQTC64gHNp5Jp8vfz1200egxT xYF19lmC/WMhKigAde8UV7Txw4GxrfgmJC7YgHznu1GHM1lo65O8g5Miocubfvof oZW1nH9JSqADFfa/+bmyppb/fUsQ/LOows48c/djMx5Zukt/USSnzaX3bp/0dHSO YystRang2hKEXUOjp0E9w== 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=1794121373; x=1794207773; bh=F XVYakP/oT6Ni/cedh8DXGKsqUJQQrycKKZPqfoyYko=; b=ywiMYAgrFBcXGmFRC JSFsXUn7kreQ2v8bxjMWGdK4P3Z23VVgFNyqoPqrM+I8nymok5jg3h+Z8gL4dMtP RqUf2nkud4qrLPOhJraeMAJPz6DZCEf+jYg8BAQQsyE6GxjbBQ1xFCIKbdL5uH08 mpuJ5tceYgQlWKyM6i7kHj/5SXBmQWY5mzt2lzXqT5DZDt7MyRyYTxr4BcgZymvS FA0cytCVbp3fF+UNpoSwZLFnb0OKt7iBwHGFlnubp/prS2isTBPcSc8IRQIfZkKm TJv/okrrglLUSmOvtX/fKHcMqdI7g0PL9kdnZnsx/gjPcf0RRw7EVo9wD8sdHeSA KeTZg== 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=1794121373; d=gahingwoo.com; mf=PGdhaGluZ0BnYWhpbmd3b28uY29tPg==; rt=PGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+; s=fm1:rsa-sha256:l4f9p/mURtfFpVEi2tcazuvoWURtwLz8r8FzyAIj984NWp/ qInP+VfIGVlQQtM7Z6ljNUWtdzoGKxN+TK53BAaTua3QfMKQbtxyZCrSSfzCrzUy tm2EG/yaqn3Igqlf2TPQOobH7Z8UlALthrGIXSgbF6565ezkQT91iolqdMTwgoxo Cc5+BlzE8MrUTmfQx4lpuBGU4+Fava9BG2M7w5V8/KQ2DXKoIXMdXGI1UKXUM6N+ 7AvfAPH6X/YwbPdp9n1/KR1sTGYy2T4sgCsvhI+XCD8+iy82SseB3OxpwqhkMNWe vKMkGkp2Nrd7aLwMl9B7v5GSt1uK95g9Er8L2cw==; 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:mrP7AUNJvHJm3UOr6/xWFtQ6RgYqyK+/JlzFRMVHatw=:Gyw8SQh56a+FgtCmvejUs/7s3yagXlR6MEOZ703NnVc=; X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTE+dfomWWdqprUxj4/gaP67KtM1QzxdvzYexx4ticKE2LHx68cWKHqsmd44P18pPW 4gf1XQHcVs660UFNxyimOb9/xX2fJYhIZ5E4/RPcr0+5B2ECZDQnQKPd11oSJYSc9dP1tn 1D+dlgDSbf0NVzpSrGBS3hvXvohbWChlfE4ZVL7HJaGgQ3XNyZa5vysjDW9Hkjo+rVA3z7 CDI8SBB36R2DQiGVV5LgYrGWcW81i1X6zW8At+jVOUPUtnhdVEuWNPtnOYlRpcGhg2eD0V 0uYGocj8eW30E62Nm4rNY5HS6BVVmAyFbdaUnYiVhR7YN12+2vM8TpgK17t2agGcED9sXD AvZyyamdXojz0AL98AvhBWvJAUpKLlBwjFdWNyeGYnlxQFliPvqJgWZAE8M/hdQ6Sf84Tk GcVnIvFM7lMhOaYpTJVJ+u4xWew5QpRYI6MB/OgY5S/UibWR4YzAu7H/HH7LdnqPDF0WId MfwOYTsBL4nSDoKHnsLuv8GB3ZFUp2vLw/M3TrcGGs6Nak5LcuKMWMUEuRSE4pMTGaeohV T3wWjOysGjkZN72UU7HN1meRmiHQgwYg6QnjbXjYjfNSIkdeqD+sCPaj7I32MfvF1iIGyX f0KxTtuhVjAll4kU04MCQL9Qy1USf8AmMeLTH+hJSyMjVCjKlGNpXscVL/EA X-ME-Proxy: Feedback-ID: i7a5e4b5f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 8 Nov 2026 02:02:43 -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, ulfh@kernel.org, p.zabel@pengutronix.de, ogabbay@kernel.org, zhangqing@rock-chips.com Cc: royalnet026@gmail.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, jeff.hugo@oss.qualcomm.com, rfoss@kernel.org, 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: [PATCH v16 12/16] accel/rocket: add RK3576 NPU (RKNN) support Date: Sun, 8 Nov 2026 19:59:13 +1300 Message-ID: <20261108065917.135194-13-gahing@gahingwoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261108065917.135194-1-gahing@gahingwoo.com> References: <20261108065917.135194-1-gahing@gahingwoo.com> 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 --- 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, 35 insertions(+), 9 deletions(-) diff --git a/drivers/accel/rocket/rocket_core.c b/drivers/accel/rocket/rocket_core.c index b202d15816a3..128ebb4f19fb 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[1].id = "hclk"; core->clks[2].id = "npu"; core->clks[3].id = "pclk"; + core->clks[4].id = "aclk_cbuf"; + core->clks[5].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 bfbf5110b524..d5d353cc38e7 100644 --- a/drivers/accel/rocket/rocket_core.h +++ b/drivers/accel/rocket/rocket_core.h @@ -30,6 +30,7 @@ struct rocket_soc_data { unsigned int num_clks; unsigned int num_resets; + bool task_con_16bit; }; struct rocket_core { @@ -42,7 +43,7 @@ struct rocket_core { 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]; struct iommu_group *iommu_group; diff --git a/drivers/accel/rocket/rocket_device.c b/drivers/accel/rocket/rocket_device.c index efd004194c1a..39e8b7c49896 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 2c673bb99ccc..0cd692a66b85 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 ea23a44b1d9e..a33c9ea694f0 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