From nobody Tue Oct 7 18:21:13 2025 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 299A52E11AD; Mon, 7 Jul 2025 15:24:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901898; cv=none; b=uTokmFFlu2Yf5sbOJ74hHCuxC7Q8HehO8BK6ILZUZ38F7WUNZ9YUzA3JrkyNEHmi6zrkK45rFgL7nLd200EXsVEQ8wAqmyikWTP72fCSm9WHtP7AtvBdLiJDc9j6jCUYEIAuOx9AIlDblBXoCVqTEtSrltUL38XcwkfJ8G41BI4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901898; c=relaxed/simple; bh=z56V3LYt6JflWbtJ6sLvEX0xeXlfbTMu3dFd7UNoQsM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=p+MeWYzPy/UBrpVmuA6tiB9Uje5pMDZmiSsbBvXgD4QatTywYI4M+Xlvm27ZnADmzH8nYISMOvl40qyux6EdRcxfYg+r6sVp0Ma3KXWz7Kn1svg5yfU5dDjblV5DK3dLkeaYO25AwnAjs/AhU1fA/lLMVmyQR6cLwFwaylqMeQ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=dCgZXTtB; arc=none smtp.client-ip=217.70.183.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="dCgZXTtB" Received: by mail.gandi.net (Postfix) with ESMTPSA id C3CF444461; Mon, 7 Jul 2025 15:24:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1751901893; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JEfmHIK+C+t2w8tfy05b4ClfFEIVcsPOdzDGg7LPXR0=; b=dCgZXTtBYuMv7ARy6r+wg8KKXnIuNySF5eC6r4eBi/WmUy4319yHXNmUJO4TVWvOvxlP+8 6/OAGxiW6Z2ByL6MpS4x3vC7AHKjj3JWE+N64sdcoK1wMaFyLrdBU1iZ6Q8o4jsh6c6XIj PEyuVkjlrxWcnsm0tsp9IToFmBfSft2WdMMP+UdMk+/FrO9ScNt363amZt40L5Z8lsRZA6 w0S4Q+zyXFyDuo2TLKfgfCcxHyEKN9/g0dHqo7ZV+f/o9EHOquMQ5ozViUsqcXJ9PxOuq8 PKCuN+40DupzZtai8lNzRmpP2yRquNQ6Qa8ZmwxVRCqWYi4MAqP1N5QT1jGeyg== From: =?UTF-8?q?Beno=C3=AEt=20Monin?= To: Ulf Hansson , Adrian Hunter Cc: =?UTF-8?q?Beno=C3=AEt=20Monin?= , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Vladimir Kondratiev , Tawfik Bayouk , Gregory CLEMENT , "Thomas Petazzoni" Subject: [PATCH v2 1/4] mmc: core: add mmc_read_blocks to mmc_ops Date: Mon, 7 Jul 2025 17:24:33 +0200 Message-ID: <346c422139b658b2ba6272f7ba7b07374008760f.1751898225.git.benoit.monin@bootlin.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdefvdduhecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpeeuvghnohpfthcuofhonhhinhcuoegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepvdfffeeiieejkeevuefhvdeggeefudffueeuffehffehffevjedugfdtueegtddvnecukfhppedvrgdtudemtggsudegmeehheeimeejrgdttdemudehfeejmehffeehmeelfeeiugemvgelvdehnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgdugeemheehieemjegrtddtmeduheefjeemfhefheemleefiegumegvledvhedphhgvlhhopehfrhgrmhgvfihorhhkpdhmrghilhhfrhhomhepsggvnhhoihhtrdhmohhnihhnsegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopeelpdhrtghpthhtohepuhhlfhdrhhgrnhhsshhonheslhhinhgrrhhordhorhhgpdhrtghpthhtoheprggurhhirghnrdhhuhhnthgvrhesihhnthgvlhdrtghomhdprhgtphhtthhopegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehlihhnuhigq dhmmhgtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvhhlrgguihhmihhrrdhkohhnughrrghtihgvvhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepthgrfihfihhkrdgsrgihohhukhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepghhrvghgohhrhidrtghlvghmvghnthessghoohhtlhhinhdrtghomh X-GND-Sasl: benoit.monin@bootlin.com Add a generic function to read some blocks of data from the MMC, to be used by drivers as part of their tuning. Signed-off-by: Beno=C3=AEt Monin --- drivers/mmc/core/card.h | 10 ++++++ drivers/mmc/core/mmc_ops.c | 69 ++++++++++++++++++++++++++++++++++++++ include/linux/mmc/host.h | 3 ++ 3 files changed, 82 insertions(+) diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h index 9cbdd240c3a7d..93fd502c1f5fc 100644 --- a/drivers/mmc/core/card.h +++ b/drivers/mmc/core/card.h @@ -11,6 +11,7 @@ #define _MMC_CORE_CARD_H =20 #include +#include =20 #define mmc_card_name(c) ((c)->cid.prod_name) #define mmc_card_id(c) (dev_name(&(c)->dev)) @@ -300,4 +301,13 @@ static inline int mmc_card_no_uhs_ddr50_tuning(const s= truct mmc_card *c) return c->quirks & MMC_QUIRK_NO_UHS_DDR50_TUNING; } =20 +static inline bool mmc_card_can_cmd23(struct mmc_card *card) +{ + return ((mmc_card_mmc(card) && + card->csd.mmca_vsn >=3D CSD_SPEC_VER_3) || + (mmc_card_sd(card) && !mmc_card_ult_capacity(card) && + card->scr.cmds & SD_SCR_CMD23_SUPPORT)) && + !(card->quirks & MMC_QUIRK_BLK_NO_CMD23); +} + #endif diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 66283825513cb..848d8aa3ff2b5 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -1077,3 +1077,72 @@ int mmc_sanitize(struct mmc_card *card, unsigned int= timeout_ms) return err; } EXPORT_SYMBOL_GPL(mmc_sanitize); + +/** + * mmc_read_blocks() - read data blocks from the mmc + * @card: mmc card to read from, can be NULL + * @host: mmc host doing the read + * @blksz: data block size + * @blocks: number of blocks to read + * @blk_addr: first block address + * @buf: output buffer + * @len: size of the buffer + * + * Read one or more blocks of data from the mmc. This is a low-level helpe= r for + * tuning operation. If card is NULL, it is assumed that CMD23 can be used= for + * multi-block read. + * + * Return: 0 in case of success, otherwise -EIO + */ +int mmc_read_blocks(struct mmc_card *card, struct mmc_host *host, + unsigned int blksz, unsigned int blocks, + unsigned int blk_addr, void *buf, unsigned int len) +{ + struct mmc_request mrq =3D {}; + struct mmc_command sbc =3D {}; + struct mmc_command cmd =3D {}; + struct mmc_command stop =3D {}; + struct mmc_data data =3D {}; + struct scatterlist sg; + + if (blocks > 1) { + if (mmc_host_can_cmd23(host) && + (!card || mmc_card_can_cmd23(card))) { + mrq.sbc =3D &sbc; + sbc.opcode =3D MMC_SET_BLOCK_COUNT; + sbc.arg =3D blocks; + sbc.flags =3D MMC_RSP_R1 | MMC_CMD_AC; + } + cmd.opcode =3D MMC_READ_MULTIPLE_BLOCK; + mrq.stop =3D &stop; + stop.opcode =3D MMC_STOP_TRANSMISSION; + stop.flags =3D MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; + } else { + cmd.opcode =3D MMC_READ_SINGLE_BLOCK; + } + + mrq.cmd =3D &cmd; + cmd.flags =3D MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + + mrq.data =3D &data; + data.flags =3D MMC_DATA_READ; + data.blksz =3D blksz; + data.blocks =3D blocks; + data.blk_addr =3D blk_addr; + data.sg =3D &sg; + data.sg_len =3D 1; + if (card) + mmc_set_data_timeout(&data, card); + else + data.timeout_ns =3D 1000000000; + + sg_init_one(&sg, buf, len); + + mmc_wait_for_req(host, &mrq); + + if (sbc.error || cmd.error || data.error) + return -EIO; + + return 0; +} +EXPORT_SYMBOL_GPL(mmc_read_blocks); diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 68f09a955a902..72196817a6f0f 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -743,5 +743,8 @@ int mmc_send_status(struct mmc_card *card, u32 *status); int mmc_send_tuning(struct mmc_host *host, u32 opcode, int *cmd_error); int mmc_send_abort_tuning(struct mmc_host *host, u32 opcode); int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd); +int mmc_read_blocks(struct mmc_card *card, struct mmc_host *host, + unsigned int blksz, unsigned int blocks, + unsigned int blk_addr, void *buf, unsigned int len); =20 #endif /* LINUX_MMC_HOST_H */ From nobody Tue Oct 7 18:21:13 2025 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2992F28A1D6; Mon, 7 Jul 2025 15:24:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901897; cv=none; b=UZAShv47zcnchmMx20GrlwOR0El97oEIzJv7fZl8jz5XNd+IWIIDeq9rVWEvmyhRQt3YcF1oVmgQCYxnyLTatGG+9MjA3A7fQM9zWyO3EYoeWVO//2dtEXs6tz9IzpsLI/DH6qACsDepnEfjwZb0OjmMWWm6fHLNqVNtIsAmSAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901897; c=relaxed/simple; bh=qYb9y//QmCZa2tCqRmFc+CD/t63Lr9ZkatkFc6Ffv+s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N0zdjuzMJSXigPW6iRnL6PQ5kyYEFu5HTVvMikiPe4hMhbhIL62PC8+ofRlsBqqBejTo1JUM0cgJcNq2r1nKcTlIKMOA60oBUKmA/wmke62I938KaLbpMQmvhclPQPPwyvpcWFsH6a6cEg54eTCMYwQyHRVbhFMEz/534gKqQIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=jeqUfG5Z; arc=none smtp.client-ip=217.70.183.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="jeqUfG5Z" Received: by mail.gandi.net (Postfix) with ESMTPSA id 404754446E; Mon, 7 Jul 2025 15:24:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1751901893; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A57nz6RK/Z+8UqMlpppM+ROv8Kwa5LbCTBc+BSbupIU=; b=jeqUfG5ZyzKqzRZy9gyXRsNm4w+m+Sn5ZxHn/qBcjRXAhWF/9OQleZmUa+MWRUEpVjeC/5 2z7Y7qLeOUwGivFMLdzhtzyyFtCi9HDdy7SihO5Q7fV4vSkgAhKLlCqMb6Z4CsW/QGvhWV 1NqaY4GzK+hWvXlYIPMd6GWcfdawQrGIU9eTlbHg5SETQxHQG3BdARSy4uHqj3L2SIbEFF Su50tRMGV36Sh8au9kuBvguWPXbkgJjS2puv4rYVz6bAYtWbIYLCBmxGRlgnvzgMaBbonY OrVesH/f2ypoIijMm1F7dCZ2CePbsbelDP5a7tunZkRoCO70VMs4bZEzbgzhPA== From: =?UTF-8?q?Beno=C3=AEt=20Monin?= To: Ulf Hansson , Adrian Hunter Cc: =?UTF-8?q?Beno=C3=AEt=20Monin?= , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Vladimir Kondratiev , Tawfik Bayouk , Gregory CLEMENT , "Thomas Petazzoni" Subject: [PATCH v2 2/4] mmc: sdhci-cadence: implement multi-block read gap tuning Date: Mon, 7 Jul 2025 17:24:34 +0200 Message-ID: <3dfd4773123ca92a4adc935100788129e1970449.1751898225.git.benoit.monin@bootlin.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdefvdduhecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpeeuvghnohpfthcuofhonhhinhcuoegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepvdfffeeiieejkeevuefhvdeggeefudffueeuffehffehffevjedugfdtueegtddvnecukfhppedvrgdtudemtggsudegmeehheeimeejrgdttdemudehfeejmehffeehmeelfeeiugemvgelvdehnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgdugeemheehieemjegrtddtmeduheefjeemfhefheemleefiegumegvledvhedphhgvlhhopehfrhgrmhgvfihorhhkpdhmrghilhhfrhhomhepsggvnhhoihhtrdhmohhnihhnsegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopeelpdhrtghpthhtohepuhhlfhdrhhgrnhhsshhonheslhhinhgrrhhordhorhhgpdhrtghpthhtoheprggurhhirghnrdhhuhhnthgvrhesihhnthgvlhdrtghomhdprhgtphhtthhopegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehlihhnuhigq dhmmhgtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvhhlrgguihhmihhrrdhkohhnughrrghtihgvvhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepthgrfihfihhkrdgsrgihohhukhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepghhrvghgohhrhidrtghlvghmvghnthessghoohhtlhhinhdrtghomh X-GND-Sasl: benoit.monin@bootlin.com The controller suspends the clock between blocks when reading from the MMC as part of its flow-control, called read block gap. At higher clock speed and with IO delay between the controller and the MMC, this clock pause can happen too late, during the read of the next block and trigger a read error. To prevent this, the delay can be programmed for each mode via the pair of registers HRS37/38. This delay is obtained during tuning, by trying a multi-block read and increasing the delay until the read succeeds. For now, the tuning is only done in HS200, as the read error has only been observed at that speed. Signed-off-by: Beno=C3=AEt Monin --- drivers/mmc/host/sdhci-cadence.c | 72 +++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cade= nce.c index 2d823e158c598..2199100f3d4a7 100644 --- a/drivers/mmc/host/sdhci-cadence.c +++ b/drivers/mmc/host/sdhci-cadence.c @@ -36,6 +36,24 @@ #define SDHCI_CDNS_HRS06_MODE_MMC_HS400 0x5 #define SDHCI_CDNS_HRS06_MODE_MMC_HS400ES 0x6 =20 +/* Read block gap */ +#define SDHCI_CDNS_HRS37 0x94 /* interface mode select */ +#define SDHCI_CDNS_HRS37_MODE_DS 0x0 +#define SDHCI_CDNS_HRS37_MODE_HS 0x1 +#define SDHCI_CDNS_HRS37_MODE_UDS_SDR12 0x8 +#define SDHCI_CDNS_HRS37_MODE_UDS_SDR25 0x9 +#define SDHCI_CDNS_HRS37_MODE_UDS_SDR50 0xa +#define SDHCI_CDNS_HRS37_MODE_UDS_SDR104 0xb +#define SDHCI_CDNS_HRS37_MODE_UDS_DDR50 0xc +#define SDHCI_CDNS_HRS37_MODE_MMC_LEGACY 0x20 +#define SDHCI_CDNS_HRS37_MODE_MMC_SDR 0x21 +#define SDHCI_CDNS_HRS37_MODE_MMC_DDR 0x22 +#define SDHCI_CDNS_HRS37_MODE_MMC_HS200 0x23 +#define SDHCI_CDNS_HRS37_MODE_MMC_HS400 0x24 +#define SDHCI_CDNS_HRS37_MODE_MMC_HS400ES 0x25 +#define SDHCI_CDNS_HRS38 0x98 /* Read block gap coefficient */ +#define SDHCI_CDNS_HRS38_BLKGAP_MAX 0xf + /* SRS - Slot Register Set (SDHCI-compatible) */ #define SDHCI_CDNS_SRS_BASE 0x200 =20 @@ -251,6 +269,52 @@ static int sdhci_cdns_set_tune_val(struct sdhci_host *= host, unsigned int val) return 0; } =20 +/** + * sdhci_cdns_tune_blkgap() - tune multi-block read gap + * @mmc: MMC host + * + * Tune delay used in multi block read. To do so, + * try sending multi-block read command with incremented gap, unless + * it succeeds. + * + * Return: error code + */ +static int sdhci_cdns_tune_blkgap(struct mmc_host *mmc) +{ + struct sdhci_host *host =3D mmc_priv(mmc); + struct sdhci_pltfm_host *pltfm_host =3D sdhci_priv(host); + struct sdhci_cdns_priv *priv =3D sdhci_pltfm_priv(pltfm_host); + void __iomem *hrs37_reg =3D priv->hrs_addr + SDHCI_CDNS_HRS37; + void __iomem *hrs38_reg =3D priv->hrs_addr + SDHCI_CDNS_HRS38; + int ret; + u32 gap; + u32 hrs37_mode; + void *buf; + + switch (host->timing) { + case MMC_TIMING_MMC_HS200: + hrs37_mode =3D SDHCI_CDNS_HRS37_MODE_MMC_HS200; + break; + default: + return 0; /* no tuning in this mode */ + } + + writel(hrs37_mode, hrs37_reg); + + buf =3D kmalloc(512 * 32, GFP_KERNEL); + for (gap =3D 0; gap <=3D SDHCI_CDNS_HRS38_BLKGAP_MAX; gap++) { + writel(gap, hrs38_reg); + ret =3D mmc_read_blocks(NULL, mmc, 512, 32, 0, buf, 512 * 32); + if (ret =3D=3D 0) + break; + } + kfree(buf); + + dev_dbg(mmc_dev(mmc), "read block gap tune %s, gap %d\n", + ret =3D=3D 0 ? "OK" : "failed", gap); + return ret; +} + /* * In SD mode, software must not use the hardware tuning and instead perfo= rm * an almost identical procedure to eMMC. @@ -261,6 +325,7 @@ static int sdhci_cdns_execute_tuning(struct sdhci_host = *host, u32 opcode) int max_streak =3D 0; int end_of_streak =3D 0; int i; + int ret; =20 /* * Do not execute tuning for UHS_SDR50 or UHS_DDR50. @@ -288,7 +353,12 @@ static int sdhci_cdns_execute_tuning(struct sdhci_host= *host, u32 opcode) return -EIO; } =20 - return sdhci_cdns_set_tune_val(host, end_of_streak - max_streak / 2); + ret =3D sdhci_cdns_set_tune_val(host, end_of_streak - max_streak / 2); + + if (!ret) + ret =3D sdhci_cdns_tune_blkgap(host->mmc); + + return ret; } =20 static void sdhci_cdns_set_uhs_signaling(struct sdhci_host *host, From nobody Tue Oct 7 18:21:13 2025 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7C472E2664; Mon, 7 Jul 2025 15:24:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901897; cv=none; b=RW+4mCZhqAdR0mpT6NRRjADgPcp35Cgumuh98pxcyqJn/JyhJRjfZK6IPBs9aeSbe2TKnBqKmFr3tyfZd4iAA0AhXlUuZT6kpJSEO0dL+URlpJY9px2gS/H/DQ6Sdbnv0YFO+I1dun9hnrT5C94ufdINC1+fuoaNl1dkdMko3Bg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901897; c=relaxed/simple; bh=gIQsxmwoSHoTmKUAUr8Mq90worR0CkHb2rdYBEvdFgo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UjWE4bCtWcGFX9FlRagPvADu2vMNz0qEtkijCywEcPVxA77Zwyyv3xIhk7FOZY4rwbrMNU+kJKrWm05fhS0RQkD6szw1XptJNTf8QfHEJp8GnlD7hdfRWlMO27+Mu9xhP9YXcrwH8G2p7V63UiA5Jt8yl7MQRDj7OWHCqd+4G1A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=EY1uX1RJ; arc=none smtp.client-ip=217.70.183.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="EY1uX1RJ" Received: by mail.gandi.net (Postfix) with ESMTPSA id AF54042FF4; Mon, 7 Jul 2025 15:24:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1751901894; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ouoUClIh/gkR2NWqCpyq8tEKwC8nAl5LCDvLuhVBOEI=; b=EY1uX1RJBJnEmI+zRwYa7tTMkYEnY37nnKQJ0s+3laLzeZN2paar7st+A4Tnu9q+lDdZQt xAW65/+Oc+o2ZUHLudaUDrRjh0Q7zUCdyHRE28O1PEcOqbrkzhgAexmScsOOdV7Cz66P5N J2zCTD2wV2Rl5lldKnb7u4X5IYUdFNuCH+v+rtwjaK0vXVAmNloWeKcrznpjtDGnewcDo9 0IE3XXg7LghzjXJEMZJOgHagPnMV0oOAwdSUlp2S6ZZpOixUKE9JvBez9s8XeJsVhvNY/L lP/OJ5ex6cKlcHJfdAI26An48JIW5TA1VE8WUmoD+aYDy0oLOelPe/9+Ocekkg== From: =?UTF-8?q?Beno=C3=AEt=20Monin?= To: Ulf Hansson , Adrian Hunter Cc: =?UTF-8?q?Beno=C3=AEt=20Monin?= , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Vladimir Kondratiev , Tawfik Bayouk , Gregory CLEMENT , "Thomas Petazzoni" Subject: [PATCH v2 3/4] mmc: mmc_test: use mmc_card_can_cmd23 Date: Mon, 7 Jul 2025 17:24:35 +0200 Message-ID: X-Mailer: git-send-email 2.50.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdefvdduhecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpeeuvghnohpfthcuofhonhhinhcuoegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepvdfffeeiieejkeevuefhvdeggeefudffueeuffehffehffevjedugfdtueegtddvnecukfhppedvrgdtudemtggsudegmeehheeimeejrgdttdemudehfeejmehffeehmeelfeeiugemvgelvdehnecuvehluhhsthgvrhfuihiivgepvdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgdugeemheehieemjegrtddtmeduheefjeemfhefheemleefiegumegvledvhedphhgvlhhopehfrhgrmhgvfihorhhkpdhmrghilhhfrhhomhepsggvnhhoihhtrdhmohhnihhnsegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopeelpdhrtghpthhtohepuhhlfhdrhhgrnhhsshhonheslhhinhgrrhhordhorhhgpdhrtghpthhtoheprggurhhirghnrdhhuhhnthgvrhesihhnthgvlhdrtghomhdprhgtphhtthhopegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehlihhnuhigq dhmmhgtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvhhlrgguihhmihhrrdhkohhnughrrghtihgvvhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepthgrfihfihhkrdgsrgihohhukhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepghhrvghgohhrhidrtghlvghmvghnthessghoohhtlhhinhdrtghomh X-GND-Sasl: benoit.monin@bootlin.com Use the helper instead of using a local implementation. Signed-off-by: Beno=C3=AEt Monin --- drivers/mmc/core/mmc_test.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c index 80e5d87a5e50b..58413af22517b 100644 --- a/drivers/mmc/core/mmc_test.c +++ b/drivers/mmc/core/mmc_test.c @@ -180,20 +180,13 @@ static int mmc_test_set_blksize(struct mmc_test_card = *test, unsigned size) return mmc_set_blocklen(test->card, size); } =20 -static bool mmc_test_card_cmd23(struct mmc_card *card) -{ - return mmc_card_mmc(card) || - (mmc_card_sd(card) && card->scr.cmds & SD_SCR_CMD23_SUPPORT); -} - static void mmc_test_prepare_sbc(struct mmc_test_card *test, struct mmc_request *mrq, unsigned int blocks) { struct mmc_card *card =3D test->card; =20 if (!mrq->sbc || !mmc_host_can_cmd23(card->host) || - !mmc_test_card_cmd23(card) || !mmc_op_multi(mrq->cmd->opcode) || - (card->quirks & MMC_QUIRK_BLK_NO_CMD23)) { + !mmc_card_can_cmd23(card) || !mmc_op_multi(mrq->cmd->opcode)) { mrq->sbc =3D NULL; return; } From nobody Tue Oct 7 18:21:13 2025 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E9032E266D; Mon, 7 Jul 2025 15:24:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901898; cv=none; b=gj2vaNdJtwNNmgLncf4ivpJvSxcC+m1gM36wrddgsQF86VHVzlom2rnypHB/SXXu7pMSjaD8WzvXv9qWdxC3cGDBilgC2Z9p9Ae/0DyvOn2uL/rOSAvcPGr7z7wpi8NLsb60yHJSFXSjipQcB+f7ris7uJPRR4f11SRtJT1dq+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751901898; c=relaxed/simple; bh=NxfRsEXjom4ScRJ/zhIsda4QU9wioouFB6Bmwo+evJU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q6UkhuMPIHG962Sxig1je5O+VpVDBkkX4InjJ+/OkspDtWvPH5Z0WC7wVS4clALMzuz6kOPiOoUA/CSqY7ig3Vz5w7DkpqMI4E8//fYXAuwwBVWx2UHixMLRJkHBbpeZ0tpvUS5av/68zwC6jTK1uCfGEw50dgUDdoj+ecPuzLc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ono6DK67; arc=none smtp.client-ip=217.70.183.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ono6DK67" Received: by mail.gandi.net (Postfix) with ESMTPSA id 244E04446F; Mon, 7 Jul 2025 15:24:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1751901894; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vasRCk+heDQuoeK+7MeJyn1gmxGcI290u/BrgCMWho8=; b=ono6DK67DVwZIz2qDQkMyiWT5r4IO2vHb8D/a70PpABHMtSwFpA+MAkHAD+kTS6S+xMKo6 hWoABuyW/o4zFMf989HB8k+7N8v1eO99f0vEFk0nQEIASBhJEYLuVKzXQ8AgAM+2uiJiIp igxqzTvWhrmNl/BrlLE5WN71/Q5ICZx+zs1j/q0y+uTzjUVe3mT7JHswrn6pObfrGbdm6l 3EDS8KA2nDJLHLNdCowbPami8zzZ1daiTi33B7q/pABeJsIZ13GdYgYPbmHHI8KaVpTZMK /gDRZ2Dw8QuxTTLLtJhJAp9ABr/WOLOTrvsvYoDBOTiWJfx99OXdbKZSL6EQcA== From: =?UTF-8?q?Beno=C3=AEt=20Monin?= To: Ulf Hansson , Adrian Hunter Cc: =?UTF-8?q?Beno=C3=AEt=20Monin?= , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Vladimir Kondratiev , Tawfik Bayouk , Gregory CLEMENT , "Thomas Petazzoni" Subject: [PATCH v2 4/4] mmc: block: use mmc_card_can_cmd23 Date: Mon, 7 Jul 2025 17:24:36 +0200 Message-ID: X-Mailer: git-send-email 2.50.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdefvdduhecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpeeuvghnohpfthcuofhonhhinhcuoegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepvdfffeeiieejkeevuefhvdeggeefudffueeuffehffehffevjedugfdtueegtddvnecukfhppedvrgdtudemtggsudegmeehheeimeejrgdttdemudehfeejmehffeehmeelfeeiugemvgelvdehnecuvehluhhsthgvrhfuihiivgepvdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgdugeemheehieemjegrtddtmeduheefjeemfhefheemleefiegumegvledvhedphhgvlhhopehfrhgrmhgvfihorhhkpdhmrghilhhfrhhomhepsggvnhhoihhtrdhmohhnihhnsegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopeelpdhrtghpthhtohepuhhlfhdrhhgrnhhsshhonheslhhinhgrrhhordhorhhgpdhrtghpthhtoheprggurhhirghnrdhhuhhnthgvrhesihhnthgvlhdrtghomhdprhgtphhtthhopegsvghnohhithdrmhhonhhinhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehlihhnuhigq dhmmhgtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvhhlrgguihhmihhrrdhkohhnughrrghtihgvvhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepthgrfihfihhkrdgsrgihohhukhesmhhosghilhgvhigvrdgtohhmpdhrtghpthhtohepghhrvghgohhrhidrtghlvghmvghnthessghoohhtlhhinhdrtghomh X-GND-Sasl: benoit.monin@bootlin.com Use the helper to test for CMD23 card support. Remove the check on the NO_CMD23 quirk as it is already done in the helper. Signed-off-by: Beno=C3=AEt Monin --- drivers/mmc/core/block.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 9cc47bf94804b..f67f5ff97f896 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -1768,8 +1768,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *= mqrq, * these, while retaining features like reliable writes. */ if ((md->flags & MMC_BLK_CMD23) && mmc_op_multi(brq->cmd.opcode) && - (do_rel_wr || !(card->quirks & MMC_QUIRK_BLK_NO_CMD23) || - do_data_tag)) { + (do_rel_wr || do_data_tag)) { brq->sbc.opcode =3D MMC_SET_BLOCK_COUNT; brq->sbc.arg =3D brq->data.blocks | (do_rel_wr ? (1 << 31) : 0) | @@ -2618,13 +2617,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct= mmc_card *card, */ md->read_only =3D mmc_blk_readonly(card); =20 - if (mmc_host_can_cmd23(card->host)) { - if ((mmc_card_mmc(card) && - card->csd.mmca_vsn >=3D CSD_SPEC_VER_3) || - (mmc_card_sd(card) && !mmc_card_ult_capacity(card) && - card->scr.cmds & SD_SCR_CMD23_SUPPORT)) - md->flags |=3D MMC_BLK_CMD23; - } + if (mmc_host_can_cmd23(card->host) && mmc_card_can_cmd23(card)) + md->flags |=3D MMC_BLK_CMD23; =20 if (md->flags & MMC_BLK_CMD23 && ((card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN) ||