From patchwork Fri Dec 2 16:18:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Fitzgerald X-Patchwork-Id: 28991 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp950865wrr; Fri, 2 Dec 2022 08:24:42 -0800 (PST) X-Google-Smtp-Source: AA0mqf5J2AFqhu+l5WbDBlA3m/ttjaWKC6Wzc92gH0M8uO269GnhY20PXWY873DqOQ107LfFs4li X-Received: by 2002:a17:90a:4a85:b0:20a:dba9:ebe2 with SMTP id f5-20020a17090a4a8500b0020adba9ebe2mr84638195pjh.136.1669998281813; Fri, 02 Dec 2022 08:24:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669998281; cv=none; d=google.com; s=arc-20160816; b=RxoBVxgMVQ1jw8uJHFTY0c6Lpb4rRPBwXIK4kVNQMXchuG6Jifs8Py3hSaqNTGLlCS iF3IZB/Em+9BWq108xGq9HONK53pJCoDdAcZPKoUZvTCKqItvFcTuWrEqt7Q7aN4IpNC QyBBNEKGmGRwVmh7Ny31LHBh5JYlKtJKYYZD9+65z3kJtY3rA+YIkyRjDS17UsluDkwH yIifxVe2Me7/vDlQ16PCcVlcZWloddMXR/hewbt54eLsTZVuCS1WoOdgwea+WuCXhQ54 xBiX28jJQLCrQY57jU/ktk7WXSEM6c+9O/HFocYct/I2DVDdS9pYbKewycohCEjqOJTG 0Veg== 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=4x7T5bgGFPWeQVLPmho0vqjLN8bDaVdyGpmi80dmNJI=; b=eNoi+RHLhDDhL4ImfL2Tb38K012f+Se9Qgzq6OSufEk9V+yOR3EYl9qRbNZ29dUljC Tkk+h1oNlQ/ylWsUxX9SZwdo0mVnAj24OGs1lQ5fM011UJPwH+CJcBp7N0EdGC1mAPgQ 7Aydh0Wy/mCw15vxwz+cWNvDyP4EbJGxgwuNqOgqN41ZKBtlb5z9sqxmw/YeEPzy6cqU jL3Y/llHh3GIXaoeGxW9Z3PTJcE5AIjaoKvpc3tng3TubD8Kip1ioIHDDGG2zLoxog6x MdBrX7oUCu7XPGKiJXGLkdPrgSpOy7GZh0bnOKXPw2wxsGgSQ7SgUgZlw6SCY9rDB4S9 AGQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=qxDK9pff; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d6-20020a170903230600b0017f61ac5a53si8704218plh.111.2022.12.02.08.24.25; Fri, 02 Dec 2022 08:24:40 -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=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=qxDK9pff; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233678AbiLBQWT (ORCPT + 99 others); Fri, 2 Dec 2022 11:22:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233413AbiLBQVp (ORCPT ); Fri, 2 Dec 2022 11:21:45 -0500 Received: from mx0b-001ae601.pphosted.com (mx0b-001ae601.pphosted.com [67.231.152.168]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE143EF0CE for ; Fri, 2 Dec 2022 08:19:00 -0800 (PST) Received: from pps.filterd (m0077474.ppops.net [127.0.0.1]) by mx0b-001ae601.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2B25sRqn018164; Fri, 2 Dec 2022 10:18:14 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=PODMain02222019; bh=4x7T5bgGFPWeQVLPmho0vqjLN8bDaVdyGpmi80dmNJI=; b=qxDK9pff+D/ZotG1XFjBPfBtQb0dIH32FT4fsjI8C2nnwB2B7O60EQzIkdYiFExUegwY YtN8m315vz3LjAdrmKP8KuMka99lqlQSuNhqyb2r5Gw4I1B8Gv6i00OjE3hPO3ty32Oo hKm8vC6VlMHVv7ii3ldzH4HPAJb9tJwG/Wu9UvihAEpUo3aFh9PXCyubrpRP0tarb6mK 739hoKJnmb4GLWWhEMiZVEbq7BzTLOCaz+d195UkyZGoLetOMjT3k6HuiI/tSl8Z6TO/ E1otqEEPC9CrZng7kJlZSmWsWdqUdfHSpQkN2w06CnZGejDu6G7z7sCS14q8vDV1CW6V WA== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0b-001ae601.pphosted.com (PPS) with ESMTPS id 3m6k2vt0n5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Dec 2022 10:18:14 -0600 Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.20; Fri, 2 Dec 2022 10:18:12 -0600 Received: from ediswmail.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server id 15.2.1118.20 via Frontend Transport; Fri, 2 Dec 2022 10:18:12 -0600 Received: from edi-sw-dsktp-006.ad.cirrus.com (edi-sw-dsktp-006.ad.cirrus.com [198.90.251.111]) by ediswmail.ad.cirrus.com (Postfix) with ESMTP id 83230B12; Fri, 2 Dec 2022 16:18:12 +0000 (UTC) From: Richard Fitzgerald To: , CC: , , , , , Richard Fitzgerald Subject: [PATCH v2 1/3] soundwire: cadence: Don't overflow the command FIFOs Date: Fri, 2 Dec 2022 16:18:10 +0000 Message-ID: <20221202161812.4186897-2-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221202161812.4186897-1-rf@opensource.cirrus.com> References: <20221202161812.4186897-1-rf@opensource.cirrus.com> MIME-Version: 1.0 X-Proofpoint-GUID: Hgsr-ASjt8q9cyhzOQadwna_WAjYWdep X-Proofpoint-ORIG-GUID: Hgsr-ASjt8q9cyhzOQadwna_WAjYWdep X-Proofpoint-Spam-Reason: safe X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS 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?1751120117588026146?= X-GMAIL-MSGID: =?utf-8?q?1751120117588026146?= The command FIFOs in the Cadence IP can be configured during design up to 32 entries, and the code in cadence_master.c was assuming the full 32-entry FIFO. But all current Intel implementations use an 8-entry FIFO. Up to now the longest message used was 6 entries so this wasn't causing any problem. But future Cirrus Logic codecs have downloadable firmware or tuning blobs. It is more efficient for the codec driver to issue long transfers that can take advantage of any queuing in the Soundwire controller and avoid the overhead of repeatedly writing the page registers. Signed-off-by: Richard Fitzgerald Reviewed-by: Pierre-Louis Bossart Fixes: 2f52a5177caa ("soundwire: cdns: Add cadence library") --- Changes since v1: Commit description rewritten. No code change. --- drivers/soundwire/cadence_master.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index a1de363eba3f..27699f341f2c 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -127,7 +127,8 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask"); #define CDNS_MCP_CMD_BASE 0x80 #define CDNS_MCP_RESP_BASE 0x80 -#define CDNS_MCP_CMD_LEN 0x20 +/* FIFO can hold 8 commands */ +#define CDNS_MCP_CMD_LEN 8 #define CDNS_MCP_CMD_WORD_LEN 0x4 #define CDNS_MCP_CMD_SSP_TAG BIT(31) From patchwork Fri Dec 2 16:18:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Fitzgerald X-Patchwork-Id: 28992 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp951351wrr; Fri, 2 Dec 2022 08:25:50 -0800 (PST) X-Google-Smtp-Source: AA0mqf4xCd3B/H2mK1aV40GtAPduCzg4ND76p/P8TbWL1B6mML2WRR8Kn0hL3EzXQ9Agm4IHm5pP X-Received: by 2002:a17:90a:5918:b0:213:ff:1cda with SMTP id k24-20020a17090a591800b0021300ff1cdamr74454483pji.86.1669998349964; Fri, 02 Dec 2022 08:25:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669998349; cv=none; d=google.com; s=arc-20160816; b=FIYUAi1HbbCyDox/6xKZs7rLPQ84QI2wLfOuQq5zErwNMHVfBCgtc62Aw37iKIE1QJ H3vWX5OBUW0fQzmivQJUBatZG3hV+hFLb3IqqA6Kd7iRYWssWdoxvoSWprFKafSLk96J UXw/zNYw5SYSTfXxDh0vQU3r2nHQsOA3fZg1+43qYmTIzIVGoyebEjv5hT5nNZ93qoMB Hvtgcht1adM6ixC2JRT2D1FRZbWEftazpns5UEQTMqrvSVl7a3dW0IcBXgsApiTEeW67 9CIfUf5DRw27kWWC7huaHZmKlF2QIunEPuYblf99dFvpOTUzlCcnUjTKGGtW52cJ7bmW wu2A== 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=fnOUlVD1+EfyAjC/Rot3TtuSZIDDO+MesIulzw8RRDQ=; b=Oxz/miT+x5TA+OBlYnCNJqPfBsKTqFGjLXLxzEQ8AwBWWb4jAiW1CgsiUDgRkvX7wu kmfl91xTxt+vlal3gaWsjAjfKjdwUh9X3QrTLIac3tMTgnCLeJ3LCQYCnenOJj3DPsuh NOR79nV37xzuo67LkBiAAVjiD+QT2JOIvTm72pgakY9t0xctaSMfstX63VhxmY789BG8 ln5Bn+vChUSwkOmgKUDxpp0QhwyXaYb1Az4Geef/Qt40QGgLvSPx/WVaeDgM0EMy8LT0 AfHXgIfAlMF0PKrrb/RDTB2+zlDLpIqAnee3JP71GSZXMUGviqeKmoiTAocYhfSYewho iw7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=jHfhA1Oj; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e23-20020a656897000000b0047764bac806si7898562pgt.749.2022.12.02.08.25.35; Fri, 02 Dec 2022 08:25:49 -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=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=jHfhA1Oj; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234025AbiLBQXC (ORCPT + 99 others); Fri, 2 Dec 2022 11:23:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234028AbiLBQWc (ORCPT ); Fri, 2 Dec 2022 11:22:32 -0500 Received: from mx0b-001ae601.pphosted.com (mx0b-001ae601.pphosted.com [67.231.152.168]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F042ABF90E for ; Fri, 2 Dec 2022 08:19:22 -0800 (PST) Received: from pps.filterd (m0077474.ppops.net [127.0.0.1]) by mx0b-001ae601.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2B25sRqo018164; Fri, 2 Dec 2022 10:18:15 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=PODMain02222019; bh=fnOUlVD1+EfyAjC/Rot3TtuSZIDDO+MesIulzw8RRDQ=; b=jHfhA1OjEIaECty7TP/89pujFIqgTTgH6+c9iZd6lJrGr3xBOGURNWkatOd8iy6cDlwC eQ2IDl0RyPiV6e6C8pu7xbziLneKTFXlGJiq7wTkLK25yeGSbFdJd3XBfrEYip7/NqUV CDj8L9nTNfWkwzzRJpuMNeyBaMpwEOzLVOU9zQ+AT0mwVr2NRwr+zgS797/kItnG1eJg cy3iW1rgCinZYzmCSfEWaajSl0aryp76SHZw8ttpPBdgFP94C+ikMWld7GW7MTnIdM3M f0C1+Ffprab4pZIMb+9pdMHAaSmw5p2U48vLvyxHnO9FPbb3YuL0wBkHFM6JFNPegsok gA== Received: from ediex02.ad.cirrus.com ([84.19.233.68]) by mx0b-001ae601.pphosted.com (PPS) with ESMTPS id 3m6k2vt0n5-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Dec 2022 10:18:14 -0600 Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.20; Fri, 2 Dec 2022 10:18:12 -0600 Received: from ediswmail.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1118.20 via Frontend Transport; Fri, 2 Dec 2022 10:18:12 -0600 Received: from edi-sw-dsktp-006.ad.cirrus.com (edi-sw-dsktp-006.ad.cirrus.com [198.90.251.111]) by ediswmail.ad.cirrus.com (Postfix) with ESMTP id 8B719B38; Fri, 2 Dec 2022 16:18:12 +0000 (UTC) From: Richard Fitzgerald To: , CC: , , , , , Richard Fitzgerald Subject: [PATCH v2 2/3] soundwire: cadence: Remove wasted space in response_buf Date: Fri, 2 Dec 2022 16:18:11 +0000 Message-ID: <20221202161812.4186897-3-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221202161812.4186897-1-rf@opensource.cirrus.com> References: <20221202161812.4186897-1-rf@opensource.cirrus.com> MIME-Version: 1.0 X-Proofpoint-GUID: xtqEQNcKQUURuLF1eA2wera7p7oe0Y3I X-Proofpoint-ORIG-GUID: xtqEQNcKQUURuLF1eA2wera7p7oe0Y3I X-Proofpoint-Spam-Reason: safe X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS 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?1751120189914009866?= X-GMAIL-MSGID: =?utf-8?q?1751120189914009866?= The response_buf was declared much larger (128 entries) than the number of responses that could ever be written into it. The Cadence IP is configurable up to a maximum of 32 entries, and the datasheet says that RX_FIFO_AVAIL can be 2 larger than this. So allow up to 34 responses. Also add checking in cdns_read_response() to prevent overflowing reponse_buf if RX_FIFO_AVAIL contains an unexpectedly large number. Signed-off-by: Richard Fitzgerald --- Changes since v1: - Make response_buf large enough for the maximum IP config of 32 plus the mysterious extra 2. - If RX_FIFO_AVAIL is too big trim it to the size of response_buf instead of CDNS_MCP_CMD_LEN. --- drivers/soundwire/cadence_master.c | 7 +++++++ drivers/soundwire/cadence_master.h | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index 27699f341f2c..a6635f7f350e 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -774,8 +774,15 @@ static void cdns_read_response(struct sdw_cdns *cdns) u32 num_resp, cmd_base; int i; + /* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ + BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2); + num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT); num_resp &= CDNS_MCP_RX_FIFO_AVAIL; + if (num_resp > ARRAY_SIZE(cdns->response_buf)) { + dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp); + num_resp = ARRAY_SIZE(cdns->response_buf); + } cmd_base = CDNS_MCP_CMD_BASE; diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h index 0434d70d4b1f..e0a64b28c6b9 100644 --- a/drivers/soundwire/cadence_master.h +++ b/drivers/soundwire/cadence_master.h @@ -8,6 +8,12 @@ #define SDW_CADENCE_GSYNC_KHZ 4 /* 4 kHz */ #define SDW_CADENCE_GSYNC_HZ (SDW_CADENCE_GSYNC_KHZ * 1000) +/* + * The Cadence IP supports up to 32 entries in the FIFO, though implementations + * can configure the IP to have a smaller FIFO. + */ +#define CDNS_MCP_IP_MAX_CMD_LEN 32 + /** * struct sdw_cdns_pdi: PDI (Physical Data Interface) instance * @@ -117,7 +123,12 @@ struct sdw_cdns { struct sdw_bus bus; unsigned int instance; - u32 response_buf[0x80]; + /* + * The datasheet says the RX FIFO AVAIL can be 2 entries more + * than the FIFO capacity, so allow for this. + */ + u32 response_buf[CDNS_MCP_IP_MAX_CMD_LEN + 2]; + struct completion tx_complete; struct sdw_defer *defer; From patchwork Fri Dec 2 16:18:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Fitzgerald X-Patchwork-Id: 28990 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp950169wrr; Fri, 2 Dec 2022 08:23:15 -0800 (PST) X-Google-Smtp-Source: AA0mqf5EjfW+bOQdZoVbuQkTz9hPSDzvxJ/FNr67fKnnUE5vzEcHau04YhBUJcQOsK26TgT8meB8 X-Received: by 2002:a17:902:7d89:b0:188:4ba9:79ee with SMTP id a9-20020a1709027d8900b001884ba979eemr53903474plm.83.1669998195631; Fri, 02 Dec 2022 08:23:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669998195; cv=none; d=google.com; s=arc-20160816; b=uixlxA7yvSGmVaN+xSv7R5KdwkvDjufmJa5AeHJdbPT76akZLP0v4GdHh+kMzksYtt g/9l6JxBQoZWdOhM5QYPKq7Pwgu13hAXV+WF+ab0+c2kOlaTo9Q6hfyiGVTeDO1R+LND yLhQXOD3nAjAqSatccgpWmXWvVgy0N3sq/fmxwOrv1QmOy04I4Z8J+4KmT/dlA/iuavn 9kpQPwp2mugpPlLb52y6KmpVoTgz7OyQZ0lkZzHtyNg77VS1gs2HiYBBf3+hP1K2TyIN UeHVLoj9eNuLIVGfnlsJvqD3jD80/Rb3v4OzAlb6Q/9E+8j4xSLuiJ4TQfjfpCS6D0HW q5fA== 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=BE++jpEueF2GegZwNGVzOdbbuVP+vf8cC+Lif4Aj6fo=; b=ZhileDpP6MotpjXny5pGTNyLyMkV9tDiI2rn9tTCPaNdLiJnUDaNKSR3J5WOZY7L32 57RMd1JAqXSzfoGi5XAYfv71Fb6xTPxqTBRt005+mUF94CAAfC9/Kc5hPCtFusp5LbRt an7agjPsPefWuxOBqndRFTb/t7nkZGlm6P6DEBzQdQox9R1KkaMn28yRMdNixJJ44b1E HLZikWjLSz5D+A0KSxIkIyf7G+VWFgQ0CcW2jZlMvckCCk7zwIATOyJTfPAltfbu4+ct brUl+VHZIMGtx6CIf96j0XiSpVDTidpgMmy1fAcshkK3zRg6aMdm9FNiLDE4fgebcJG2 0JOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=HYCxCbLP; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g12-20020a17090a578c00b0020d65f31df8si10128138pji.143.2022.12.02.08.23.02; Fri, 02 Dec 2022 08:23:15 -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=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=HYCxCbLP; 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=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233199AbiLBQVx (ORCPT + 99 others); Fri, 2 Dec 2022 11:21:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233987AbiLBQVc (ORCPT ); Fri, 2 Dec 2022 11:21:32 -0500 Received: from mx0b-001ae601.pphosted.com (mx0b-001ae601.pphosted.com [67.231.152.168]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5F9CE3451 for ; Fri, 2 Dec 2022 08:18:51 -0800 (PST) Received: from pps.filterd (m0077474.ppops.net [127.0.0.1]) by mx0b-001ae601.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2B28j12l022681; Fri, 2 Dec 2022 10:18:15 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=PODMain02222019; bh=BE++jpEueF2GegZwNGVzOdbbuVP+vf8cC+Lif4Aj6fo=; b=HYCxCbLPyppYyzeG8rj1vuGq/Oi8jz0GcR93F3L0tdyquAMShqFb+KcSp5yG8SaFoY0S +d1XJMoj0QYbp22CPSSuvFySXrYIGBz2+4q1UWVJgtbCZHmNxJ15IUvZ0ocTFrJnRmpU lEnA34wnsMRUcE11odnTp+LYMZFFt7FZz8DlvxhGgVdaWe46sgxFxw2bCeJu9tGiY6r8 d+Flpv/KrX2Xy70TkqIkn70zop9bvP5g4twd8iQ0n/Bj03FTKqOsOhrEuklF75b1CRDV vnm7QaUsrjkNmMT8cSY1jQvWYeYc1gv0DlEeqlBJEJpa+AoBrgTSsSBrstgH4pkADJsc bg== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0b-001ae601.pphosted.com (PPS) with ESMTPS id 3m6k2vt0n6-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Dec 2022 10:18:14 -0600 Received: from ediex01.ad.cirrus.com (198.61.84.80) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.20; Fri, 2 Dec 2022 10:18:12 -0600 Received: from ediswmail.ad.cirrus.com (198.61.86.93) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server id 15.2.1118.20 via Frontend Transport; Fri, 2 Dec 2022 10:18:12 -0600 Received: from edi-sw-dsktp-006.ad.cirrus.com (edi-sw-dsktp-006.ad.cirrus.com [198.90.251.111]) by ediswmail.ad.cirrus.com (Postfix) with ESMTP id 9C556B2F; Fri, 2 Dec 2022 16:18:12 +0000 (UTC) From: Richard Fitzgerald To: , CC: , , , , , Richard Fitzgerald Subject: [PATCH v2 3/3] soundwire: cadence: Drain the RX FIFO after an IO timeout Date: Fri, 2 Dec 2022 16:18:12 +0000 Message-ID: <20221202161812.4186897-4-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221202161812.4186897-1-rf@opensource.cirrus.com> References: <20221202161812.4186897-1-rf@opensource.cirrus.com> MIME-Version: 1.0 X-Proofpoint-GUID: JbfrKx6hsDlg3qbXh0BsCbr3l__qe-bI X-Proofpoint-ORIG-GUID: JbfrKx6hsDlg3qbXh0BsCbr3l__qe-bI X-Proofpoint-Spam-Reason: safe X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS 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?1751120027846504730?= X-GMAIL-MSGID: =?utf-8?q?1751120027846504730?= If wait_for_completion_timeout() times-out in _cdns_xfer_msg() it is possible that something could have been written to the RX FIFO. In this case, we should drain the RX FIFO so that anything in it doesn't carry over and mess up the next transfer. Obviously, if we got to this state something went wrong, and we don't really know the state of everything. The cleanup in this situation cannot be bullet-proof but we should attempt to avoid breaking future transaction, if only to reduce the amount of error noise when debugging the failure from a kernel log. Note that this patch only implements the draining for blocking (non-deferred) transfers. The deferred API doesn't have any proper handling of error conditions and would need some re-design before implementing cleanup. That is a task for a separate patch... Signed-off-by: Richard Fitzgerald --- Changes since v1: The change is "the same" but the function that is moved up the file has different content because of changes in patch #2 --- drivers/soundwire/cadence_master.c | 50 ++++++++++++++++-------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index a6635f7f350e..521387322145 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -555,6 +555,29 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns, return SDW_CMD_OK; } +static void cdns_read_response(struct sdw_cdns *cdns) +{ + u32 num_resp, cmd_base; + int i; + + /* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ + BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2); + + num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT); + num_resp &= CDNS_MCP_RX_FIFO_AVAIL; + if (num_resp > ARRAY_SIZE(cdns->response_buf)) { + dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp); + num_resp = ARRAY_SIZE(cdns->response_buf); + } + + cmd_base = CDNS_MCP_CMD_BASE; + + for (i = 0; i < num_resp; i++) { + cdns->response_buf[i] = cdns_readl(cdns, cmd_base); + cmd_base += CDNS_MCP_CMD_WORD_LEN; + } +} + static enum sdw_command_response _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd, int offset, int count, bool defer) @@ -596,6 +619,10 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd, dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n", cmd, msg->dev_num, msg->addr, msg->len); msg->len = 0; + + /* Drain anything in the RX_FIFO */ + cdns_read_response(cdns); + return SDW_CMD_TIMEOUT; } @@ -769,29 +796,6 @@ EXPORT_SYMBOL(cdns_read_ping_status); * IRQ handling */ -static void cdns_read_response(struct sdw_cdns *cdns) -{ - u32 num_resp, cmd_base; - int i; - - /* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */ - BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2); - - num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT); - num_resp &= CDNS_MCP_RX_FIFO_AVAIL; - if (num_resp > ARRAY_SIZE(cdns->response_buf)) { - dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp); - num_resp = ARRAY_SIZE(cdns->response_buf); - } - - cmd_base = CDNS_MCP_CMD_BASE; - - for (i = 0; i < num_resp; i++) { - cdns->response_buf[i] = cdns_readl(cdns, cmd_base); - cmd_base += CDNS_MCP_CMD_WORD_LEN; - } -} - static int cdns_update_slave_status(struct sdw_cdns *cdns, u64 slave_intstat) {