From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EB069C43602 for ; Fri, 3 Jul 2026 02:36:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=MPrJpcCg1b1pZTUffuYmaHM2iwNl76j5H9WCkOROtFM=; b=Lh46xXOu5pTR2PAtV4dxFNbRwH d4Y+7alVNzHUkjK7WON+OYcCEl3f89oCyNK0x+sDm4Mr8OexF6ikhUlt+iq0bn6dTNc7cWWAi4FG7 at+tRZ2Cb+Zf2W7i3XmTqr1KcOR+XZ/oI7JLbcLBg0CjJm1SuoJimW01gpnDvPg5C/+Ar1P5nRkbD BejdXmaCulzPfg9bFrb3sAQa3gzTs2PJv0LABjliSsEgQ1DqvHhaYhDsC0/9uIjR32gxg0O74Cm5N 8USf+Tc+rSArdRNQZqlWTBx8fJi+eKYhAzIxUSTQxs5hqymgUDUNLT5RFi0koDygDqasGeDml5R/y IVufs9VA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wfTlE-00000005tHi-3M2y; Fri, 03 Jul 2026 02:36:12 +0000 Received: from out162-62-57-64.mail.qq.com ([162.62.57.64]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wfTlB-00000005tGN-47PH for linux-arm-kernel@lists.infradead.org; Fri, 03 Jul 2026 02:36:11 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1783046165; bh=MPrJpcCg1b1pZTUffuYmaHM2iwNl76j5H9WCkOROtFM=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=s/twmNuDvjrH6alIosi23S4kZeFE4BZ+xv3GHUDBytCDub2qYCyT7ZCvfLCZazGgX ApRPRldiKYmLFQMazNpL4wcCbPvd33JTcpCv7NnYtYrXycaqOCqVmJSZvT68f8w7cw fj+IB6/DzQLGV0leV2z4v+vulmIsIMYOoHyuJcxI= Received: from ubuntu2204.localdomain ([218.4.149.66]) by newxmesmtplogicsvrszb51-0.qq.com (NewEsmtp) with SMTP id 8F90EEF9; Fri, 03 Jul 2026 10:35:57 +0800 X-QQ-mid: xmsmtpt1783046161tl1yngyaw Message-ID: X-QQ-XMAILINFO: MDbayGdXPuoeIxgDGEDZi/RDzoLLCvVKclLzcRsJhAYxagIo1MwwfbqeN20hcX bgzd90NA/jluIuqSOwuyU46uIGbBteqBlpnJkf6js5ptPq0OULC6MBF+VORm2BEV12MgqNYy5aX3 oVqnTKNhAwq+zSLco6MAoI43Z8/RkBYWfOvd4tktjXp+1iPLl+mqzPDfEQFlqmOdDfbdQ/avW9LH 9YdDflroPoZrHWEbWJHFH6W08zjUF3nOIDPkIi9JhBK3N6UdYB+D/ZzqLQklB6n1pDEyCxzSLC+o IJWltA4+Wb/2UzGv9UiEyfvmd/OyfGIYMyoP1YAXr2W9jhTzYXS+nVLXlteitNIbJMCFKZyL67Tx dVlXr+GbiwY4tBCq+N3vmpy76w4ZqPFj4p/DiYCQ4pj7jPw4KeXYGe2DsXEj/u6Pdiag1MmioVEo 0SP3gDuszbkXWjRWEqkm6GtptAWb0mPiaIr3SnpygZwPb/gr0Hdzp0k8TXHfFhsN90iW1bykaBMI lq7E7A05e4Zlm4s1SBijlBXY3DLq0h/6C2fQcmvjX66spOzAerckcfc2Gm5TIo+oFz/KTyAxmmHj f1pqhVwYIQzh8IKagMU98fCOuHG3kZC3lQI8vPKaMSK3XDemzolDJ2hJwkJXYwQ6cYWOoQyk/vQn yR2cz60Z1vlpU/yQDB8rDEAm2eMmEa4nv5fZ07yzmwZWdLfox0mmjVZs6YCt3luehq4Auk+6dbFl Gih9k4BVlepeH1EpEClffTweGcd30/tNN7yy5xi+A6saiPcFx1Of9a8GYvNtghBcI5AkWJ5wGhU6 yNk0YrAl8hdzvsyNGTmxQCwj1OZrHgU3LaO9fQKyTZDVnA5eFdO/Cs3LtfLla8xIWtdvHaMoHFK+ fKD5EjQ/el/QsBIi4l12m5LpQGMYurBrCptGWrmxQ0vCtfnnaQsHv5K09DdKvuuZDMLxLen7xAiK bDsBDqxQGLhjVVKG54Sd0OPiFd3OS3ivtTssSIlX5eI4dXXeoLluyz36iCgtBTsvz0J+zknMUUEV dH05oWo1fYYyWW+ETS/42ecQjnsxqoA4K0JuXWom5CP5lw3w38ykPzl3tmBKQvKL/gj+tJFR2s76 YT/FMLXbemgDb+r2f9LdHiG4cMixWD1MuILqfyyFZMmY8LktUJOCy8B4yv1lT3Pyqo2JK2 X-QQ-XMRINFO: M/715EihBoGS47X28/vv4NpnfpeBLnr4Qg== From: Cunhao Lu <1579567540@qq.com> Date: Fri, 03 Jul 2026 10:35:41 +0800 Subject: [PATCH v3 2/4] can: rockchip: add RK3588 CAN support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-OQ-MSGID: <20260703-master-v3-2-6d56de6fd2f3@qq.com> References: <20260703-master-v3-0-6d56de6fd2f3@qq.com> In-Reply-To: <20260703-master-v3-0-6d56de6fd2f3@qq.com> To: Marc Kleine-Budde , kernel@pengutronix.de, Vincent Mailhol , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner Cc: linux-can@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, Cunhao Lu <1579567540@qq.com>, Heiko Stuebner X-Mailer: b4 0.15.2 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260702_193610_585085_26F524E4 X-CRM114-Status: GOOD ( 21.03 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add support for the RK3588 CAN controller by introducing a dedicated model ID and OF match entry. The block is closely related to the existing RK3568 variants, but it cannot reuse their match data unchanged. In particular, RK3588 encodes RX_FIFO_CNT in bits 7:5 instead of 6:4, so the RX path needs SoC-specific handling. The RX FIFO count bitfield difference was found by comparing Rockchip's vendor kernel 6.1 CAN support for RK3568 and RK3588. Runtime testing on RK3588 also confirms that bits 7:5 are needed. Enable the existing erratum 5 empty-FIFO workaround for RK3588. Heiko reproduced erratum 6 on RK3588, so enable that workaround as well. Keep RKCANFD_QUIRK_CANFD_BROKEN enabled for RK3588, so CAN-FD stays disabled for now. Local testing did not reproduce the two known CAN-FD trigger frames that cause Error Interrupts on RK3568 variants. Instead, RK3588 shows a different CAN-FD failure mode: CAN-FD frames without BRS work in this setup, but BRS with a data bitrate different from the nominal bitrate immediately drives the controller bus-off. Co-developed-by: Heiko Stuebner Signed-off-by: Heiko Stuebner Signed-off-by: Cunhao Lu <1579567540@qq.com> Tested-by: Heiko Stuebner Reviewed-by: Heiko Stuebner --- v2 -> v3: - Use Co-developed-by for Heiko's RK3588 contributions and add his Signed-off-by - Collect Heiko's Reviewed-by and Tested-by tags --- drivers/net/can/rockchip/rockchip_canfd-core.c | 12 ++++++++++++ drivers/net/can/rockchip/rockchip_canfd-rx.c | 5 ++++- drivers/net/can/rockchip/rockchip_canfd.h | 26 +++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/rockchip/rockchip_canfd-core.c b/drivers/net/can/rockchip/rockchip_canfd-core.c index 29de0c01e4ed..178d69edf1bb 100644 --- a/drivers/net/can/rockchip/rockchip_canfd-core.c +++ b/drivers/net/can/rockchip/rockchip_canfd-core.c @@ -50,6 +50,13 @@ static const struct rkcanfd_devtype_data rkcanfd_devtype_data_rk3568v3 = { RKCANFD_QUIRK_CANFD_BROKEN, }; +static const struct rkcanfd_devtype_data rkcanfd_devtype_data_rk3588 = { + .model = RKCANFD_MODEL_RK3588, + .quirks = RKCANFD_QUIRK_RK3568_ERRATUM_5 | + RKCANFD_QUIRK_RK3568_ERRATUM_6 | + RKCANFD_QUIRK_CANFD_BROKEN, +}; + static const char *__rkcanfd_get_model_str(enum rkcanfd_model model) { switch (model) { @@ -57,6 +64,8 @@ static const char *__rkcanfd_get_model_str(enum rkcanfd_model model) return "rk3568v2"; case RKCANFD_MODEL_RK3568V3: return "rk3568v3"; + case RKCANFD_MODEL_RK3588: + return "rk3588"; } return ""; @@ -846,6 +855,9 @@ static const struct of_device_id rkcanfd_of_match[] = { }, { .compatible = "rockchip,rk3568v3-canfd", .data = &rkcanfd_devtype_data_rk3568v3, + }, { + .compatible = "rockchip,rk3588-canfd", + .data = &rkcanfd_devtype_data_rk3588, }, { /* sentinel */ }, diff --git a/drivers/net/can/rockchip/rockchip_canfd-rx.c b/drivers/net/can/rockchip/rockchip_canfd-rx.c index 475c0409e215..24e87daa1df0 100644 --- a/drivers/net/can/rockchip/rockchip_canfd-rx.c +++ b/drivers/net/can/rockchip/rockchip_canfd-rx.c @@ -281,7 +281,10 @@ rkcanfd_rx_fifo_get_len(const struct rkcanfd_priv *priv) { const u32 reg = rkcanfd_read(priv, RKCANFD_REG_RX_FIFO_CTRL); - return FIELD_GET(RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT, reg); + if (priv->devtype_data.model == RKCANFD_MODEL_RK3588) + return FIELD_GET(RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT_RK3588, reg); + + return FIELD_GET(RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT_RK3568, reg); } int rkcanfd_handle_rx_int(struct rkcanfd_priv *priv) diff --git a/drivers/net/can/rockchip/rockchip_canfd.h b/drivers/net/can/rockchip/rockchip_canfd.h index 93131c7d7f54..82a617e4ca66 100644 --- a/drivers/net/can/rockchip/rockchip_canfd.h +++ b/drivers/net/can/rockchip/rockchip_canfd.h @@ -214,7 +214,8 @@ #define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_ENABLE BIT(0) #define RKCANFD_REG_RX_FIFO_CTRL 0x118 -#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT GENMASK(6, 4) +#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT_RK3568 GENMASK(6, 4) +#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT_RK3588 GENMASK(7, 5) #define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_FULL_WATERMARK GENMASK(3, 1) #define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_ENABLE BIT(0) @@ -331,6 +332,11 @@ * rarely with the standard clock of 300 MHz, but almost immediately * at 80 MHz. * + * Tests on the rk3588 show the same empty FIFO condition. + * In that setup rx_fifo_empty_errors increments when the bus + * transitions from idle to high CAN-FD load and stops growing once + * the bus reaches a steady state. + * * To workaround this problem, check for empty FIFO with * rkcanfd_fifo_header_empty() in rkcanfd_handle_rx_int_one() and exit * early. @@ -344,6 +350,8 @@ /* Erratum 6: The CAN controller's transmission of extended frames may * intermittently change into standard frames * + * Tests on the rk3588 show the same problem. + * * Work around this issue by activating self reception (RXSTX). If we * have pending TX CAN frames, check all RX'ed CAN frames in * rkcanfd_rxstx_filter(). @@ -408,6 +416,18 @@ * cansend can0 002##07217010000000000 * DUT: * candump any,0:0,#FFFFFFFF -cexdHtA + * + * Tests on the rk3588 show a different CAN-FD failure mode: these two + * CAN-FD frames do not trigger Error Interrupt or Error-Warning. CAN-FD + * frames without bitrate switching work in this setup, but BRS with a + * data bitrate different from the nominal bitrate drives the controller + * bus-off immediately. + * + * To reproduce: + * host: + * cangen can0 -I 2 -Li -Di -p 10 -f -g 1 -c32 -b + * DUT: + * cansequence -rv can1 -f */ #define RKCANFD_QUIRK_CANFD_BROKEN BIT(12) @@ -424,6 +444,9 @@ * cansequence -rv -i 1 * * - TX starvation after repeated Bus-Off + * Tests on the rk3588 show the same problem. In a + * 10-cycle Bus-Off recovery test, 9 cycles failed to send after the + * controller restarted. * To reproduce: * host: * sleep 3 && cangen can0 -I2 -Li -Di -p10 -g 0.0 @@ -434,6 +457,7 @@ enum rkcanfd_model { RKCANFD_MODEL_RK3568V2 = 0x35682, RKCANFD_MODEL_RK3568V3 = 0x35683, + RKCANFD_MODEL_RK3588 = 0x3588, }; struct rkcanfd_devtype_data { -- 2.34.1