From patchwork Tue Dec 27 10:04:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Bornyakov X-Patchwork-Id: 36809 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp1321530wrt; Tue, 27 Dec 2022 02:22:53 -0800 (PST) X-Google-Smtp-Source: AMrXdXtZsgIr65vipEAaKAKR8jvBsxXjAvWxHmrhl+pVN9UsahOVTfCXOxGlLllyODUaUklXV7Tt X-Received: by 2002:a17:906:8a58:b0:7c1:6981:d062 with SMTP id gx24-20020a1709068a5800b007c16981d062mr18389734ejc.72.1672136572817; Tue, 27 Dec 2022 02:22:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672136572; cv=none; d=google.com; s=arc-20160816; b=IxdmnsnScGQ7harZ1QPUT+CnR92AwxIcOwjKPSEouJkaxuboEP/q9+b5sr/mYBwYhA lhZ5DjMEUy0KQwvVuSrnmoEC4XukKiL7FYDHwn8zLc2CpjEqY8KRxr1103Hqsc+1T89M bjX38Sj93+4qyVK6U2txFTZLkTSalzmqHgoBksfNA00pGtlcmq2BgkN3hU6m+4Zz1GTE uRZhxRzbHQUVcVn27cHgOQ2a2v4pjJDJs6Nkn4jAF/DjpFRY9UY1Ku9CYqNUwbHLOsZJ rMKwu1nPY7LR8qH0ylx8QKX76HCIaK+EwnmPcyOtp3ddzCAR7p5D/sAnb9PuJ4sO/wXI GOQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=5G3+kE+rr0tNliu7vb/3/Qm049561e5iHsUDmOIGluE=; b=lEk4iPFa1KmhtiObWSkXTJQwasib/d6QmxxOJkQ4tPYABYj/fSfbHEw8JZ9ERm4gLg Ff3j5jVRLWDU5qir8gODpdDemz+Mqfq3OPO82h+w8GREO3aSgIi08cvFcPeoYqex5xHL Z0ybvIMl/xsTRo2NUtbFX6TpuRE4NpMzapyRgcjBPB+NBiJmDnwLjQ+/H/HFR9nnZvG5 jEcR7+5rif09IpurfJz+3Vz19q/zvVbgd1PWfr+7TKrVzSP7CEC/19XIBBl8Krp8nqLD 5hzJHPYnjF4lLzsBLFIW0xKiLSdyBScC8xvmOd3JMV9n/zNz1QnHy3YCnsmpdstu4BJS pSCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@metrotek.ru header.s=mail header.b=DwOqS6xJ; 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ww6-20020a170907084600b007a7d37e4681si8952362ejb.845.2022.12.27.02.22.28; Tue, 27 Dec 2022 02:22:52 -0800 (PST) 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=fail header.i=@metrotek.ru header.s=mail header.b=DwOqS6xJ; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231436AbiL0KHy (ORCPT + 99 others); Tue, 27 Dec 2022 05:07:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231320AbiL0KHf (ORCPT ); Tue, 27 Dec 2022 05:07:35 -0500 Received: from mail.pr-group.ru (mail.pr-group.ru [178.18.215.3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8BF564C6; Tue, 27 Dec 2022 02:07:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=metrotek.ru; s=mail; h=from:subject:date:message-id:to:cc:mime-version:content-transfer-encoding: in-reply-to:references; bh=MFUNeq3Y8GcJH9bDlEKq9WaByHZjyHz4SS+VcCmqW98=; b=DwOqS6xJqzsDKlj06s4oDcoY5JpfLV/4xQUecvmQZj1SLnGj9Dfft/JX5LUOxlpceZf5Gzp9a3ljt qZS7MHun1CQCaF0wNdsLo1zn/t88Jm3RzaiH/fGNl1OH6uKIBzXrRbsq+n/3C4jkrcBjHfs+e35iFp c7+OpMKWew5SLK9jct/UqG0ViHedCB4BiYY7vyqzOcTSDbilJrIAlVQUHDGc7nMEd3MC1KKBoCu3U1 dU5B9HmAsm6WSLN8tdBgVtNNBS2mIYX+Gtn9uQUwofXF5XAPC8DCrxkSafNGMD6P+cT7D6PSCtEvhd 1Y4cdlzplx1aub2SBhKmVVi0ck6rZdA== X-Kerio-Anti-Spam: Build: [Engines: 2.16.5.1460, Stamp: 3], Multi: [Enabled, t: (0.000012,0.032822)], BW: [Enabled, t: (0.000021,0.000001)], RTDA: [Enabled, t: (0.099154), Hit: No, Details: v2.42.0; Id: 15.52ka2n.1gl9gpper.3mu; mclb], total: 0(700) X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Level: X-Footer: bWV0cm90ZWsucnU= Received: from localhost.localdomain ([78.37.162.181]) (authenticated user i.bornyakov@metrotek.ru) by mail.pr-group.ru with ESMTPSA (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)); Tue, 27 Dec 2022 13:07:09 +0300 From: Ivan Bornyakov To: Conor Dooley , Moritz Fischer , Wu Hao , Xu Yilun , Tom Rix , =?utf-8?q?Ilpo_J?= =?utf-8?q?=C3=A4rvinen?= Cc: Ivan Bornyakov , linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, system@metrotek.ru Subject: [PATCH v3 1/3] fpga: microchip-spi: move SPI I/O buffers out of stack Date: Tue, 27 Dec 2022 13:04:48 +0300 Message-Id: <20221227100450.2257-2-i.bornyakov@metrotek.ru> X-Mailer: git-send-email 2.38.2 In-Reply-To: <20221227100450.2257-1-i.bornyakov@metrotek.ru> References: <20221227100450.2257-1-i.bornyakov@metrotek.ru> MIME-Version: 1.0 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?1753362279013801592?= X-GMAIL-MSGID: =?utf-8?q?1753362279013801592?= As spi-summary doc says: > I/O buffers use the usual Linux rules, and must be DMA-safe. > You'd normally allocate them from the heap or free page pool. > Don't use the stack, or anything that's declared "static". Replace spi_write() with spi_write_then_read(), which is dma-safe for on-stack buffers. Use allocated buffers for transfers used in spi_sync_transfer(). Although everything works OK with stack-located I/O buffers, better follow the doc to be safe. Fixes: 5f8d4a900830 ("fpga: microchip-spi: add Microchip MPF FPGA manager") Signed-off-by: Ivan Bornyakov Acked-by: Conor Dooley --- drivers/fpga/microchip-spi.c | 93 ++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/drivers/fpga/microchip-spi.c b/drivers/fpga/microchip-spi.c index 7436976ea904..e72fedd93a27 100644 --- a/drivers/fpga/microchip-spi.c +++ b/drivers/fpga/microchip-spi.c @@ -42,46 +42,55 @@ struct mpf_priv { struct spi_device *spi; bool program_mode; + u8 tx __aligned(ARCH_KMALLOC_MINALIGN); + u8 rx __aligned(ARCH_KMALLOC_MINALIGN); }; -static int mpf_read_status(struct spi_device *spi) +static int mpf_read_status(struct mpf_priv *priv) { - u8 status = 0, status_command = MPF_SPI_READ_STATUS; - struct spi_transfer xfers[2] = { 0 }; - int ret; - /* * HW status is returned on MISO in the first byte after CS went * active. However, first reading can be inadequate, so we submit * two identical SPI transfers and use result of the later one. */ - xfers[0].tx_buf = &status_command; - xfers[1].tx_buf = &status_command; - xfers[0].rx_buf = &status; - xfers[1].rx_buf = &status; - xfers[0].len = 1; - xfers[1].len = 1; - xfers[0].cs_change = 1; + struct spi_transfer xfers[2] = { + { + .tx_buf = &priv->tx, + .rx_buf = &priv->rx, + .len = 1, + .cs_change = 1, + }, { + .tx_buf = &priv->tx, + .rx_buf = &priv->rx, + .len = 1, + }, + }; + u8 status; + int ret; + + priv->tx = MPF_SPI_READ_STATUS; + + ret = spi_sync_transfer(priv->spi, xfers, 2); + if (ret) + return ret; - ret = spi_sync_transfer(spi, xfers, 2); + status = priv->rx; if ((status & MPF_STATUS_SPI_VIOLATION) || (status & MPF_STATUS_SPI_ERROR)) - ret = -EIO; + return -EIO; - return ret ? : status; + return status; } static enum fpga_mgr_states mpf_ops_state(struct fpga_manager *mgr) { struct mpf_priv *priv = mgr->priv; - struct spi_device *spi; bool program_mode; int status; - spi = priv->spi; program_mode = priv->program_mode; - status = mpf_read_status(spi); + status = mpf_read_status(priv); if (!program_mode && !status) return FPGA_MGR_STATE_OPERATING; @@ -186,12 +195,12 @@ static int mpf_ops_parse_header(struct fpga_manager *mgr, } /* Poll HW status until busy bit is cleared and mask bits are set. */ -static int mpf_poll_status(struct spi_device *spi, u8 mask) +static int mpf_poll_status(struct mpf_priv *priv, u8 mask) { int status, retries = MPF_STATUS_POLL_RETRIES; while (retries--) { - status = mpf_read_status(spi); + status = mpf_read_status(priv); if (status < 0) return status; @@ -205,32 +214,32 @@ static int mpf_poll_status(struct spi_device *spi, u8 mask) return -EBUSY; } -static int mpf_spi_write(struct spi_device *spi, const void *buf, size_t buf_size) +static int mpf_spi_write(struct mpf_priv *priv, const void *buf, size_t buf_size) { - int status = mpf_poll_status(spi, 0); + int status = mpf_poll_status(priv, 0); if (status < 0) return status; - return spi_write(spi, buf, buf_size); + return spi_write_then_read(priv->spi, buf, buf_size, NULL, 0); } -static int mpf_spi_write_then_read(struct spi_device *spi, +static int mpf_spi_write_then_read(struct mpf_priv *priv, const void *txbuf, size_t txbuf_size, void *rxbuf, size_t rxbuf_size) { const u8 read_command[] = { MPF_SPI_READ_DATA }; int ret; - ret = mpf_spi_write(spi, txbuf, txbuf_size); + ret = mpf_spi_write(priv, txbuf, txbuf_size); if (ret) return ret; - ret = mpf_poll_status(spi, MPF_STATUS_READY); + ret = mpf_poll_status(priv, MPF_STATUS_READY); if (ret < 0) return ret; - return spi_write_then_read(spi, read_command, sizeof(read_command), + return spi_write_then_read(priv->spi, read_command, sizeof(read_command), rxbuf, rxbuf_size); } @@ -242,7 +251,6 @@ static int mpf_ops_write_init(struct fpga_manager *mgr, const u8 isc_en_command[] = { MPF_SPI_ISC_ENABLE }; struct mpf_priv *priv = mgr->priv; struct device *dev = &mgr->dev; - struct spi_device *spi; u32 isc_ret = 0; int ret; @@ -251,9 +259,7 @@ static int mpf_ops_write_init(struct fpga_manager *mgr, return -EOPNOTSUPP; } - spi = priv->spi; - - ret = mpf_spi_write_then_read(spi, isc_en_command, sizeof(isc_en_command), + ret = mpf_spi_write_then_read(priv, isc_en_command, sizeof(isc_en_command), &isc_ret, sizeof(isc_ret)); if (ret || isc_ret) { dev_err(dev, "Failed to enable ISC: spi_ret %d, isc_ret %u\n", @@ -261,7 +267,7 @@ static int mpf_ops_write_init(struct fpga_manager *mgr, return -EFAULT; } - ret = mpf_spi_write(spi, program_mode, sizeof(program_mode)); + ret = mpf_spi_write(priv, program_mode, sizeof(program_mode)); if (ret) { dev_err(dev, "Failed to enter program mode: %d\n", ret); return ret; @@ -274,11 +280,9 @@ static int mpf_ops_write_init(struct fpga_manager *mgr, static int mpf_ops_write(struct fpga_manager *mgr, const char *buf, size_t count) { - u8 spi_frame_command[] = { MPF_SPI_FRAME }; struct spi_transfer xfers[2] = { 0 }; struct mpf_priv *priv = mgr->priv; struct device *dev = &mgr->dev; - struct spi_device *spi; int ret, i; if (count % MPF_SPI_FRAME_SIZE) { @@ -287,18 +291,18 @@ static int mpf_ops_write(struct fpga_manager *mgr, const char *buf, size_t count return -EINVAL; } - spi = priv->spi; - - xfers[0].tx_buf = spi_frame_command; - xfers[0].len = sizeof(spi_frame_command); + xfers[0].tx_buf = &priv->tx; + xfers[0].len = 1; for (i = 0; i < count / MPF_SPI_FRAME_SIZE; i++) { xfers[1].tx_buf = buf + i * MPF_SPI_FRAME_SIZE; xfers[1].len = MPF_SPI_FRAME_SIZE; - ret = mpf_poll_status(spi, 0); - if (ret >= 0) - ret = spi_sync_transfer(spi, xfers, ARRAY_SIZE(xfers)); + ret = mpf_poll_status(priv, 0); + if (ret >= 0) { + priv->tx = MPF_SPI_FRAME; + ret = spi_sync_transfer(priv->spi, xfers, ARRAY_SIZE(xfers)); + } if (ret) { dev_err(dev, "Failed to write bitstream frame %d/%zu\n", @@ -317,12 +321,9 @@ static int mpf_ops_write_complete(struct fpga_manager *mgr, const u8 release_command[] = { MPF_SPI_RELEASE }; struct mpf_priv *priv = mgr->priv; struct device *dev = &mgr->dev; - struct spi_device *spi; int ret; - spi = priv->spi; - - ret = mpf_spi_write(spi, isc_dis_command, sizeof(isc_dis_command)); + ret = mpf_spi_write(priv, isc_dis_command, sizeof(isc_dis_command)); if (ret) { dev_err(dev, "Failed to disable ISC: %d\n", ret); return ret; @@ -330,7 +331,7 @@ static int mpf_ops_write_complete(struct fpga_manager *mgr, usleep_range(1000, 2000); - ret = mpf_spi_write(spi, release_command, sizeof(release_command)); + ret = mpf_spi_write(priv, release_command, sizeof(release_command)); if (ret) { dev_err(dev, "Failed to exit program mode: %d\n", ret); return ret; From patchwork Tue Dec 27 10:04:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ivan Bornyakov X-Patchwork-Id: 36808 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp1319464wrt; Tue, 27 Dec 2022 02:16:50 -0800 (PST) X-Google-Smtp-Source: AMrXdXvgINHSRIGmS/r06K0WxlSYOKH8fj3JlW08ZAV4bqnqj7bvvKpDzA8PCDKrS+0WbaeBPvv5 X-Received: by 2002:a17:907:d48a:b0:7c1:766e:e09 with SMTP id vj10-20020a170907d48a00b007c1766e0e09mr17862662ejc.29.1672136210062; Tue, 27 Dec 2022 02:16:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672136210; cv=none; d=google.com; s=arc-20160816; b=NFkGG+pQiZkPmA6ruaZjdiwL9W53k0UL91M34fQWJFgtskGEKdR1OVZsK11NiKrxJA 88JYHiFucu0Cpqlsd277hZrR+q89++zeVGmEDVNWiXvy/PWM6l7pTvFDxrnMejgeRkcY ClivXX4ZqxVSebQio0oOFSaEybDkYZmF9iI60a8tR59V9tVsoheAr1tdRg39vHM77Q1r M6k/i28ykAdePOGxJ0sWI21N+LqCRCjOJzFDwc9y4pIrKrRlNcZLZbgNLFGsSK2V9BN8 xK+IM5w4nM91aTSHgV7K4Jp7jlIfjxht7THSSFi9WL/jvy/7s+3+HZ1tjJmrlDDefILd zkuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=716xkZbp3iNOvCg2puSvnz/yGSgh4p9sWyA0DAmTnAI=; b=HF0wALBmuW/gDeX31y0cAu2+k2j0hjIPtdlbR4cjgZ1TapaN1PD+xLWwjwmdDnBbIT AtaZyztogHnoYQVz9xdtNqGGEAZZpUA6RiOs4Q3kpYswi56NqE8xhvnM1Dhe3ByMdXCm w8WGe2Okjvf6z1BW/Pk1L6DXzJy0sXtiLMUbsb7nTAp3Ve4IdAXZYw8lDVWoBbBOUh+n sGlecJ0PP/nVO5h1nhQ09v+9TJNba7/y8GLBU6SwJg4wBF4q0FbWEk/28VPfx72tmfrA WUlI+jksSs8y7uW8QCNTs0ypispDx+PzN70fMDLAzGUfiC1oB95VYpanJ9IhxnePZMUN ngGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@metrotek.ru header.s=mail header.b=SLvWAWwm; 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o13-20020a17090611cd00b007c16b3feca1si9594382eja.903.2022.12.27.02.16.26; Tue, 27 Dec 2022 02:16:50 -0800 (PST) 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=fail header.i=@metrotek.ru header.s=mail header.b=SLvWAWwm; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231317AbiL0KHf (ORCPT + 99 others); Tue, 27 Dec 2022 05:07:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229445AbiL0KHa (ORCPT ); Tue, 27 Dec 2022 05:07:30 -0500 Received: from mail.pr-group.ru (mail.pr-group.ru [178.18.215.3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 159062FF; Tue, 27 Dec 2022 02:07:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=metrotek.ru; s=mail; h=from:subject:date:message-id:to:cc:mime-version:content-transfer-encoding: in-reply-to:references; bh=7Fvs78gYqrEVBbbQ/K9bc20z+/joLO6qDiw854CBaFQ=; b=SLvWAWwm+e3kVkiocTYSH6yr8Rs4Gu5Kc7UcGaV7cR8Y2jyWu/puOUzaEXH20HRVtNx9mlnWJzec4 zdOKRm6SM1RgM450cjqAla6xG9c0haKUEfj+zz3xCcarc1GcXMjEctepRhxzJ5kvfBUfewGJQqGeUt A1gEE7ClAEUMMcpJmE24UriX0i3Nr+sDyJKYGOFP4FIKCA3PJWUl2mbOAdPRDBnx9O5CbS5PPt3B+y 3zkd5uhPxNRLBm7H5x5D1MNeQIIGR/vXoAx7okkvsGyQgyvHMRLoSKwh2j5+GKvL7dPY+29ZJXvJSu JdFwuUq63RVjs8cplssk17HQsG8u/RQ== X-Kerio-Anti-Spam: Build: [Engines: 2.16.5.1460, Stamp: 3], Multi: [Enabled, t: (0.000010,0.012862)], BW: [Enabled, t: (0.000031,0.000002)], RTDA: [Enabled, t: (0.094436), Hit: No, Details: v2.42.0; Id: 15.52ka2l.1gl9gppe8.3nj; mclb], total: 0(700) X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Level: X-Footer: bWV0cm90ZWsucnU= Received: from localhost.localdomain ([78.37.162.181]) (authenticated user i.bornyakov@metrotek.ru) by mail.pr-group.ru with ESMTPSA (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)); Tue, 27 Dec 2022 13:07:10 +0300 From: Ivan Bornyakov To: Conor Dooley , Moritz Fischer , Wu Hao , Xu Yilun , Tom Rix , =?utf-8?q?Ilpo_J?= =?utf-8?q?=C3=A4rvinen?= Cc: Ivan Bornyakov , linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, system@metrotek.ru Subject: [PATCH v3 2/3] fpga: microchip-spi: rewrite status polling in a time measurable way Date: Tue, 27 Dec 2022 13:04:49 +0300 Message-Id: <20221227100450.2257-3-i.bornyakov@metrotek.ru> X-Mailer: git-send-email 2.38.2 In-Reply-To: <20221227100450.2257-1-i.bornyakov@metrotek.ru> References: <20221227100450.2257-1-i.bornyakov@metrotek.ru> MIME-Version: 1.0 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?1753361898917044359?= X-GMAIL-MSGID: =?utf-8?q?1753361898917044359?= Original busy loop with retries count in mpf_poll_status() is not too reliable, as it takes different times on different systems. Replace it with read_poll_timeout() macro. While at it, fix polling stop condition to met function's original intention declared in the comment. The issue with original polling stop condition is that it stops if any of mask bits is set, while intention was to stop if all mask bits is set. This was not noticible because only MPF_STATUS_READY is passed as mask argument and it is BIT(1). Fixes: 5f8d4a900830 ("fpga: microchip-spi: add Microchip MPF FPGA manager") Signed-off-by: Ivan Bornyakov Reviewed-by: Ilpo Järvinen Acked-by: Conor Dooley --- drivers/fpga/microchip-spi.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/fpga/microchip-spi.c b/drivers/fpga/microchip-spi.c index e72fedd93a27..8d1d9476d0cc 100644 --- a/drivers/fpga/microchip-spi.c +++ b/drivers/fpga/microchip-spi.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,7 @@ #define MPF_BITS_PER_COMPONENT_SIZE 22 -#define MPF_STATUS_POLL_RETRIES 10000 +#define MPF_STATUS_POLL_TIMEOUT (2 * USEC_PER_SEC) #define MPF_STATUS_BUSY BIT(0) #define MPF_STATUS_READY BIT(1) #define MPF_STATUS_SPI_VIOLATION BIT(2) @@ -197,21 +198,16 @@ static int mpf_ops_parse_header(struct fpga_manager *mgr, /* Poll HW status until busy bit is cleared and mask bits are set. */ static int mpf_poll_status(struct mpf_priv *priv, u8 mask) { - int status, retries = MPF_STATUS_POLL_RETRIES; + int ret, status; - while (retries--) { - status = mpf_read_status(priv); - if (status < 0) - return status; - - if (status & MPF_STATUS_BUSY) - continue; - - if (!mask || (status & mask)) - return status; - } + ret = read_poll_timeout(mpf_read_status, status, + (status < 0) || + ((status & (MPF_STATUS_BUSY | mask)) == mask), + 0, MPF_STATUS_POLL_TIMEOUT, false, priv); + if (ret < 0) + return ret; - return -EBUSY; + return status; } static int mpf_spi_write(struct mpf_priv *priv, const void *buf, size_t buf_size) From patchwork Tue Dec 27 10:04:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Bornyakov X-Patchwork-Id: 36807 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp1319432wrt; Tue, 27 Dec 2022 02:16:46 -0800 (PST) X-Google-Smtp-Source: AMrXdXv+ekvmECVhrbo4Vn6gGGiNh14w0IeuD22G40qREBYZXD19k/1Pu2TO9yiSykc5IyHru/TC X-Received: by 2002:a17:906:fb97:b0:7c1:64dc:ac3c with SMTP id lr23-20020a170906fb9700b007c164dcac3cmr17965265ejb.59.1672136206090; Tue, 27 Dec 2022 02:16:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672136206; cv=none; d=google.com; s=arc-20160816; b=QJEalpbAUiIPPH8LuM6Mgd4exF4hnOQpRVNyJAUstcAz3FhHFVk1r73/hw9dJ2Rr7O uqotRFhI3eTHQnJckPmL9Le3DQWimESCR+rj8V74M1HSketboDCc6Q/i5nDJufivUuYE f51BozGUkrlJICpel73hsOXI4byYX7zHNuoVeDPSq4g4eg8lJitS1Y+vgLlBVbi2OS0i huEdL97dWje/k+E4beXjHBods6368mCbRZGW92IouvDrbv/3CKZWFnohOV8bBTCFYCPb XUhCI6dy0gMwCdSD7JOzCWp6ZwerW9TrSBa++dhtFoAI+SKFRS6r8UvS95/PjRm1epoh mtuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=XM79o3xc3aqIzLs/kC03gR/ABs+LGuj/R3x8/QEqYuE=; b=TI7SZV4PsaX+x+Jv2A1xSBmP5cS9NsKBO0cVjCKfYwYX34HNwqb6Tn+5XXMZvYTRVL 6kKIQt7yjHMTUJTXa+oG1GbJvAXTkzFTKuqYFuJCQH2idFXcK5Gw72THgcNA57+NcRNl ktreheJSE4VXVqEV4IouRPmPAzbCtOJ5cJ3eM3wzg0h7DuYe9S3ewRrj7L7L0Zx/zUJM BhMQHg5aPCBoWMQkumunklZDSl5iURE+ZcuWzeBYX+O3ZV1p0G5f2co2U80bwUV8qBDW O93RkHBdPwb3N8ZTAUWR+2JU46usWYzph57IdAqDU+2UnBDNgtffvZqLSHjkrQi0UZTJ UBBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@metrotek.ru header.s=mail header.b=NRKaVERj; 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id oz8-20020a1709077d8800b007c0c9bd6206si11394921ejc.553.2022.12.27.02.16.20; Tue, 27 Dec 2022 02:16:46 -0800 (PST) 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=fail header.i=@metrotek.ru header.s=mail header.b=NRKaVERj; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231373AbiL0KHk (ORCPT + 99 others); Tue, 27 Dec 2022 05:07:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230201AbiL0KHa (ORCPT ); Tue, 27 Dec 2022 05:07:30 -0500 Received: from mail.pr-group.ru (mail.pr-group.ru [178.18.215.3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 755D964C3; Tue, 27 Dec 2022 02:07:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=metrotek.ru; s=mail; h=from:subject:date:message-id:to:cc:mime-version:content-transfer-encoding: in-reply-to:references; bh=PYDm95PWaADa9YxjFLIe4Cqpn1ITTd0IS1l03smDoZI=; b=NRKaVERjP8DPCHUa1B+i6P3ve/o20Ki43luqRob99yEHHPV3BdvQx8tteWZBssTlc19fpTU5j+6YM +HdiekDTphI0msuVJKGfQvw88BKqaoOXVWfN5jBn87HMA/T0BtmWEd9LZhylJhyY+fSbdmchmvc9kS VhelAq6A6RAWzFzd4hFUlgZVrX9Esw+s8kLBIPBb+4B+1hnQGY5OOtnDEcde+UO0IgLQ3IYgFuB7yv z9xowIiEbnf+5K2WCAsSjxJ8EKC+SQyLLcTnFwYk8YTeeQlUXTM73efdd38kxASJ4+wt+TyjtkBZKK b9/jxjbE3RK26+4+8pFhVqHDGWPccHw== X-Kerio-Anti-Spam: Build: [Engines: 2.16.5.1460, Stamp: 3], Multi: [Enabled, t: (0.000009,0.012572)], BW: [Enabled, t: (0.000022,0.000001)], RTDA: [Enabled, t: (0.089347), Hit: No, Details: v2.42.0; Id: 15.52ka2i.1gl9gprcr.3ma; mclb], total: 0(700) X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Level: X-Footer: bWV0cm90ZWsucnU= Received: from localhost.localdomain ([78.37.162.181]) (authenticated user i.bornyakov@metrotek.ru) by mail.pr-group.ru with ESMTPSA (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)); Tue, 27 Dec 2022 13:07:11 +0300 From: Ivan Bornyakov To: Conor Dooley , Moritz Fischer , Wu Hao , Xu Yilun , Tom Rix , =?utf-8?q?Ilpo_J?= =?utf-8?q?=C3=A4rvinen?= Cc: Ivan Bornyakov , linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org, system@metrotek.ru Subject: [PATCH v3 3/3] fpga: microchip-spi: separate data frame write routine Date: Tue, 27 Dec 2022 13:04:50 +0300 Message-Id: <20221227100450.2257-4-i.bornyakov@metrotek.ru> X-Mailer: git-send-email 2.38.2 In-Reply-To: <20221227100450.2257-1-i.bornyakov@metrotek.ru> References: <20221227100450.2257-1-i.bornyakov@metrotek.ru> MIME-Version: 1.0 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?1753361894454097827?= X-GMAIL-MSGID: =?utf-8?q?1753361894454097827?= mpf_ops_write() function writes bitstream data to the FPGA by a smaller frames. Introduce mpf_spi_frame_write() function which is for writing a single data frame and use it in mpf_ops_write(). No functional changes intended. Signed-off-by: Ivan Bornyakov Acked-by: Conor Dooley --- drivers/fpga/microchip-spi.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/fpga/microchip-spi.c b/drivers/fpga/microchip-spi.c index 8d1d9476d0cc..ea92e5d106fa 100644 --- a/drivers/fpga/microchip-spi.c +++ b/drivers/fpga/microchip-spi.c @@ -274,9 +274,30 @@ static int mpf_ops_write_init(struct fpga_manager *mgr, return 0; } +static int mpf_spi_frame_write(struct mpf_priv *priv, const char *buf) +{ + struct spi_transfer xfers[2] = { + { + .tx_buf = &priv->tx, + .len = 1, + }, { + .tx_buf = buf, + .len = MPF_SPI_FRAME_SIZE, + }, + }; + int ret; + + ret = mpf_poll_status(priv, 0); + if (ret < 0) + return ret; + + priv->tx = MPF_SPI_FRAME; + + return spi_sync_transfer(priv->spi, xfers, ARRAY_SIZE(xfers)); +} + static int mpf_ops_write(struct fpga_manager *mgr, const char *buf, size_t count) { - struct spi_transfer xfers[2] = { 0 }; struct mpf_priv *priv = mgr->priv; struct device *dev = &mgr->dev; int ret, i; @@ -287,19 +308,8 @@ static int mpf_ops_write(struct fpga_manager *mgr, const char *buf, size_t count return -EINVAL; } - xfers[0].tx_buf = &priv->tx; - xfers[0].len = 1; - for (i = 0; i < count / MPF_SPI_FRAME_SIZE; i++) { - xfers[1].tx_buf = buf + i * MPF_SPI_FRAME_SIZE; - xfers[1].len = MPF_SPI_FRAME_SIZE; - - ret = mpf_poll_status(priv, 0); - if (ret >= 0) { - priv->tx = MPF_SPI_FRAME; - ret = spi_sync_transfer(priv->spi, xfers, ARRAY_SIZE(xfers)); - } - + ret = mpf_spi_frame_write(priv, buf + i * MPF_SPI_FRAME_SIZE); if (ret) { dev_err(dev, "Failed to write bitstream frame %d/%zu\n", i, count / MPF_SPI_FRAME_SIZE);