From patchwork Fri Oct 21 09:16:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhichao Liu X-Patchwork-Id: 6604 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4242:0:0:0:0:0 with SMTP id s2csp591259wrr; Fri, 21 Oct 2022 02:40:43 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7N1BO153c/PeY1dQDv/t2apPIy4T3hE02UTU2q3QMxj/NEFJ+wbNTGRJDv0CDi93vS0q2v X-Received: by 2002:aa7:838a:0:b0:536:101a:9ccf with SMTP id u10-20020aa7838a000000b00536101a9ccfmr17997073pfm.18.1666345243193; Fri, 21 Oct 2022 02:40:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666345243; cv=none; d=google.com; s=arc-20160816; b=o4fDT9oCZ0vMpY1wbKw5Sfte+Tce7JwBBludbmn5Ri2RaHKxJHP0fX80M7Y2Z5CphL e+tjBz/vDa2Khd7hJ4bzJ05rq2k5Sv1ryDcjbD0LbyjmoLYSCmCw8MSXh4NyWq2NshuX kKG+KGHEUKVQ9YKkEaPV9P8usNIIpH/ZnB6OxkNRZBx3dmfc1Gy7sdDe896QHJdeIQS8 S0xb/j+CmFkcManKbNXxIIwPfd5+sq3wT9dFABPmaPIpJvvTD7ZWdGgAZHoIpjlZ8Mmr aiQRpvgXPAqwvwFDwrM3m3k3oyxU1mQ8cuCKQLWRSrdCwFgLeW+kLzK2sd9TvfrQkc5t U1WA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from :dkim-signature; bh=TDfh+x5FytpWi0W8sYJ9u2fBze82/hHd4fVkyhEFTUQ=; b=Za7F5eRv7N3Wo0SZr4gopGJx6xdsvchiXslu05/awZN/DCDUe2qZlM+DXvmpRDiNiZ Aj9+Ef1MimC0hIoqbi9uynjXXGEyDjp+2j/dpjZhQit4FLbM3GZVqZDinvrJEp9HZbjp jvTmBDDjg29Jihe5WAxT8QHoElph0QFYzuI+k0LqjKzzvaqGOWe9UFC90LrfLtmm478A ibbCT6kda9I9RQFiNZRQ7/YTmZhvnazY3NzKTADvrXGLZKyJCdJIPm/uqqwe+80NJPTv aH9AcQBMVc9e2iWv+1NEB14EEgLGRvH8Yc/mMoE3Tr0jsWvY4eEbaBktmsw16PFa7+Oo RZag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=NTG13TMM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e23-20020a635017000000b0045a6c6c559bsi24713707pgb.305.2022.10.21.02.40.30; Fri, 21 Oct 2022 02:40:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=NTG13TMM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229697AbiJUJ02 (ORCPT + 99 others); Fri, 21 Oct 2022 05:26:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47778 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230020AbiJUJ0Q (ORCPT ); Fri, 21 Oct 2022 05:26:16 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 340081119E7; Fri, 21 Oct 2022 02:26:11 -0700 (PDT) X-UUID: 0018b82e76504adeb0a5f38c6ad7ce51-20221021 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=TDfh+x5FytpWi0W8sYJ9u2fBze82/hHd4fVkyhEFTUQ=; b=NTG13TMMFoUnQYSCCW/LMGVc27cDGpcJLh9ICuV9waD/NVwDn2krFD3tM7M+TJl1J/OEpIcD8iJCZSuZM8Xr9ljuVBMbCJV2JoQkwAXJoMu5ICxAaE7COk8LAHOsKH9x/XTd7MMYUpeXKnWISJBYTHhq5r82i1+UILLY4ijFFUM=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.12,REQID:a9e61a8e-06a9-4544-867f-9bd59ba28860,IP:0,U RL:0,TC:0,Content:-25,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:-25 X-CID-META: VersionHash:62cd327,CLOUDID:f3bfae6c-89d3-4bfa-baad-dc632a24bca3,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:0,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0 X-UUID: 0018b82e76504adeb0a5f38c6ad7ce51-20221021 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1252444914; Fri, 21 Oct 2022 17:26:07 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n2.mediatek.inc (172.21.101.187) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.15; Fri, 21 Oct 2022 17:26:05 +0800 Received: from mbjsdccf07.mediatek.inc (10.15.20.246) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.15 via Frontend Transport; Fri, 21 Oct 2022 17:26:05 +0800 From: Zhichao Liu To: Mark Brown CC: , , , , , , Subject: [PATCH] spi: mediatek: Fix package division error Date: Fri, 21 Oct 2022 17:16:53 +0800 Message-ID: <20221021091653.18297-1-zhichao.liu@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747289630094746750?= X-GMAIL-MSGID: =?utf-8?q?1747289630094746750?= From: "zhichao.liu" Commit 7e963fb2a33ce ("spi: mediatek: add ipm design support for MT7986") makes a mistake on package dividing operation (one change is missing), need to fix it. Background: Ipm design is expanding the HW capability of dma (adjust package length from 1KB to 64KB), and using "dev_comp->ipm_support" flag to indicate it. Issue description: Ipm support patch (said above) is missing to handle remainder at package dividing operation. One case, a transmission length is 65KB, is will divide to 1K (package length) * 65(package loop) in non-ipm desgin case, and will divide to 64K(package length) * 1(package loop) + 1K(remainder) in ipm design case. And the 1K remainder will be lost with the current SW flow, and the transmission will be failure. So, it should be fixed. Solution: Add "ipm_design" flag in function "mtk_spi_get_mult_delta()" to indicate HW capability, and modify the parameters corespondingly. fixes: 7e963fb2a33ce ("spi: mediatek: add ipm design support for MT7986") Signed-off-by: zhichao.liu --- drivers/spi/spi-mt65xx.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index 11aeae7fe7fc..a33c9a3de395 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c @@ -551,14 +551,17 @@ static void mtk_spi_enable_transfer(struct spi_master *master) writel(cmd, mdata->base + SPI_CMD_REG); } -static int mtk_spi_get_mult_delta(u32 xfer_len) +static int mtk_spi_get_mult_delta(struct mtk_spi *mdata, u32 xfer_len) { - u32 mult_delta; + u32 mult_delta = 0; - if (xfer_len > MTK_SPI_PACKET_SIZE) - mult_delta = xfer_len % MTK_SPI_PACKET_SIZE; - else - mult_delta = 0; + if (mdata->dev_comp->ipm_design) { + if (xfer_len > MTK_SPI_IPM_PACKET_SIZE) + mult_delta = xfer_len % MTK_SPI_IPM_PACKET_SIZE; + } else { + if (xfer_len > MTK_SPI_PACKET_SIZE) + mult_delta = xfer_len % MTK_SPI_PACKET_SIZE; + } return mult_delta; } @@ -570,22 +573,22 @@ static void mtk_spi_update_mdata_len(struct spi_master *master) if (mdata->tx_sgl_len && mdata->rx_sgl_len) { if (mdata->tx_sgl_len > mdata->rx_sgl_len) { - mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len); + mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len); mdata->xfer_len = mdata->rx_sgl_len - mult_delta; mdata->rx_sgl_len = mult_delta; mdata->tx_sgl_len -= mdata->xfer_len; } else { - mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len); + mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len); mdata->xfer_len = mdata->tx_sgl_len - mult_delta; mdata->tx_sgl_len = mult_delta; mdata->rx_sgl_len -= mdata->xfer_len; } } else if (mdata->tx_sgl_len) { - mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len); + mult_delta = mtk_spi_get_mult_delta(mdata, mdata->tx_sgl_len); mdata->xfer_len = mdata->tx_sgl_len - mult_delta; mdata->tx_sgl_len = mult_delta; } else if (mdata->rx_sgl_len) { - mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len); + mult_delta = mtk_spi_get_mult_delta(mdata, mdata->rx_sgl_len); mdata->xfer_len = mdata->rx_sgl_len - mult_delta; mdata->rx_sgl_len = mult_delta; }