Re: [PATCH V22 02/22] mmc: core: Prepare to support SD UHS-II cards

From: Kees Bakker
Date: Tue Oct 08 2024 - 15:56:35 EST


Op 13-09-2024 om 12:28 schreef Victor Shih:
From: Ulf Hansson <ulf.hansson@xxxxxxxxxx>

The SD UHS-II interface was introduced to the SD spec v4.00 several years
ago. The interface is fundamentally different from an electrical and a
protocol point of view, comparing to the legacy SD interface.

However, the legacy SD protocol is supported through a specific transport
layer (SD-TRAN) defined in the UHS-II addendum of the spec. This allows the
SD card to be managed in a very similar way as a legacy SD card, hence a
lot of code can be re-used to support these new types of cards through the
mmc subsystem.

Moreover, an SD card that supports the UHS-II interface shall also be
backwards compatible with the legacy SD interface, which allows a UHS-II
card to be inserted into a legacy slot. As a matter of fact, this is
already supported by mmc subsystem as of today.

To prepare to add support for UHS-II, this change puts the basic foundation
in the mmc core in place, allowing it to be more easily reviewed before
subsequent changes implements the actual support.

Basically, the approach here adds a new UHS-II bus_ops type and adds a
separate initialization path for the UHS-II card. The intent is to avoid us
from sprinkling the legacy initialization path, but also to simplify
implementation of the UHS-II specific bits.

At this point, there is only one new host ops added to manage the various
ios settings needed for UHS-II. Additional host ops that are needed, are
being added from subsequent changes.

Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
---

Updates in V10:
- Drop unnecessary definitions and code.

Updates in V9:
- move sd_uhs2_operation definition of PatchV8[05/23] to
PatchV9[02/23] for avoid compilation errors.
- move uhs2_control definition of PatchV8[05/23] to
PatchV9[02/23] for avoid compilation errors.
- move mmc_host flags definition of PatchV8[05/23] to
PatchV9[02/23] for avoid compilation errors.
- move mmc_host flags MMC_UHS2_SUPPORT definition of PatchV8[05/23] to
PatchV9[02/23] for avoid compilation errors.
- move mmc_host flags MMC_UHS2_SD_TRAN definition of PatchV8[05/23] to
PatchV9[02/23] for avoid compilation errors.

Updates in V7:
- Drop sd_uhs2_set_ios function.
- Used ->uhs2_control() callback for uhs2_set_ios in sd_uhs2_power_up().
- Used ->uhs2_control() callback for uhs2_set_ios in sd_uhs2_power_off().
- Drop MMC_TIMING_SD_UHS2 in favor of MMC_TIMING_UHS2_SPEED_A.
- Modify sd_uhs2_legacy_init to avoid sd_uhs2_reinit cycle issue.

Updates in V4:
- Re-based, updated a comment and removed white-space.
- Moved MMC_VQMMC2_VOLTAGE_180 into a later patch in the series.
---

drivers/mmc/core/Makefile | 2 +-
drivers/mmc/core/core.c | 17 ++-
drivers/mmc/core/core.h | 1 +
drivers/mmc/core/sd_uhs2.c | 292 +++++++++++++++++++++++++++++++++++++
include/linux/mmc/card.h | 7 +
include/linux/mmc/host.h | 23 +++
6 files changed, 340 insertions(+), 2 deletions(-)
create mode 100644 drivers/mmc/core/sd_uhs2.c

[...]
+/*
+ * Run the enumeration process by sending the enumerate command to the card.
+ * Note that, we currently support only the point to point connection, which
+ * means only one card can be attached per host/slot.
+ */
+static int sd_uhs2_enum(struct mmc_host *host, u32 *node_id)
+{
+ return 0;
+}
[...]
+/*
+ * Allocate the data structure for the mmc_card and run the UHS-II specific
+ * initialization sequence.
+ */
+static int sd_uhs2_init_card(struct mmc_host *host)
+{
+ struct mmc_card *card;
+ u32 node_id;
+ int err;
+
+ err = sd_uhs2_dev_init(host);
+ if (err)
+ return err;
+
+ err = sd_uhs2_enum(host, &node_id);
node_id is still uninitialized, see implementation of sd_uhs2_enum above
+ if (err)
+ return err;
+
+ card = mmc_alloc_card(host, &sd_type);
+ if (IS_ERR(card))
+ return PTR_ERR(card);
+
+ card->uhs2_config.node_id = node_id;
Using uninitialized node_id
+ card->type = MMC_TYPE_SD;
+
+ err = sd_uhs2_config_read(host, card);
+ if (err)
+ goto err;
+
+ err = sd_uhs2_config_write(host, card);
+ if (err)
+ goto err;
+
+ host->card = card;
+ return 0;
+
+err:
+ mmc_remove_card(card);
+ return err;
+}