Skip to contentSkip to conversation

mmc: sdhci-pci-core: Disable ES for ASUS BIOS on Jasper Lake

PATCH In review Patrick Thompson 3 participants 4 messages Oct 13, 2022 – Oct 19, 2022

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 mmc: sdhci-pci-core: Disable ES for ASUS BIOS on Jasper Lake

Enhanced Strobe (ES) does not work correctly on the ASUS 1100 series of devices. Jasper Lake eMMCs (pci_id 8086:4dc4) are supposed to support ES. There are also two system families under the series, thus this is being scoped to the ASUS BIOS.

The failing ES prevents the installer from writing to disk. Falling back to HS400 without ES fixes the issue.

Fixes 315e3bd7ac19 ("mmc: sdhci-pci: Add support for Intel JSL")

---

Changes in v3:
* Remove redundant MMC_CAP2_HS400 selection

Changes in v2:
* Only disable ES instead of CQE in its entirety.
* Target Jasper Lake (JSL)
* Target ASUS BIOS instead of specific system family

 drivers/mmc/host/sdhci-pci-core.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci-pci-core.c +11 -3
index 169b84761041..34ea1acbb3cc 100644
@@ -914,6 +914,12 @@ static bool glk_broken_cqhci(struct sdhci_pci_slot *slot)
 		dmi_match(DMI_SYS_VENDOR, "IRBIS"));
 }
 
+static bool jsl_broken_hs400es(struct sdhci_pci_slot *slot)
+{
+	return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_JSL_EMMC &&
+			dmi_match(DMI_BIOS_VENDOR, "ASUSTeK COMPUTER INC.");
+}
+
 static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 {
 	int ret = byt_emmc_probe_slot(slot);
@@ -922,9 +928,11 @@ static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 		slot->host->mmc->caps2 |= MMC_CAP2_CQE;
 
 	if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
-		slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
-		slot->host->mmc_host_ops.hs400_enhanced_strobe =
-						intel_hs400_enhanced_strobe;
+		if (!jsl_broken_hs400es(slot)) {
+			slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
+			slot->host->mmc_host_ops.hs400_enhanced_strobe =
+							intel_hs400_enhanced_strobe;
+		}
 		slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
 	}
 
Signature · 1 line
2.38.0.413.g74048e4d9e-goog
maintainer Acked-by on v3 1/1
#1 lore raw
Quoted 11 lines · Patrick Thompson

Enhanced Strobe (ES) does not work correctly on the ASUS 1100 series of devices. Jasper Lake eMMCs (pci_id 8086:4dc4) are supposed to support ES. There are also two system families under the series, thus this is being scoped to the ASUS BIOS.

The failing ES prevents the installer from writing to disk. Falling back to HS400 without ES fixes the issue.

Fixes 315e3bd7ac19 ("mmc: sdhci-pci: Add support for Intel JSL")
Quoted 46 lines

---

Changes in v3:
* Remove redundant MMC_CAP2_HS400 selection

Changes in v2:
* Only disable ES instead of CQE in its entirety.
* Target Jasper Lake (JSL)
* Target ASUS BIOS instead of specific system family

 drivers/mmc/host/sdhci-pci-core.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci-pci-core.c +11 -3
index 169b84761041..34ea1acbb3cc 100644
@@ -914,6 +914,12 @@ static bool glk_broken_cqhci(struct sdhci_pci_slot *slot)
 		dmi_match(DMI_SYS_VENDOR, "IRBIS"));
 }
 
+static bool jsl_broken_hs400es(struct sdhci_pci_slot *slot)
+{
+	return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_JSL_EMMC &&
+			dmi_match(DMI_BIOS_VENDOR, "ASUSTeK COMPUTER INC.");
+}
+
 static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 {
 	int ret = byt_emmc_probe_slot(slot);
@@ -922,9 +928,11 @@ static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 		slot->host->mmc->caps2 |= MMC_CAP2_CQE;
 
 	if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
-		slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
-		slot->host->mmc_host_ops.hs400_enhanced_strobe =
-						intel_hs400_enhanced_strobe;
+		if (!jsl_broken_hs400es(slot)) {
+			slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
+			slot->host->mmc_host_ops.hs400_enhanced_strobe =
+							intel_hs400_enhanced_strobe;
+		}
 		slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
 	}
 
#2 lore raw
In reply to Patrick Thompson
Quoted 6 lines · Patrick Thompson

Enhanced Strobe (ES) does not work correctly on the ASUS 1100 series of devices. Jasper Lake eMMCs (pci_id 8086:4dc4) are supposed to support ES. There are also two system families under the series, thus this is being scoped to the ASUS BIOS.

Quoted 6 lines

The failing ES prevents the installer from writing to disk. Falling back to HS400 without ES fixes the issue.

Fixes 315e3bd7ac19 ("mmc: sdhci-pci: Add support for Intel JSL")

Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe

Quoted 49 lines

---

Changes in v3:
* Remove redundant MMC_CAP2_HS400 selection

Changes in v2:
* Only disable ES instead of CQE in its entirety.
* Target Jasper Lake (JSL)
* Target ASUS BIOS instead of specific system family

 drivers/mmc/host/sdhci-pci-core.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci-pci-core.c +11 -4
index 169b84761041..34ea1acbb3cc 100644
@@ -914,6 +914,12 @@ static bool glk_broken_cqhci(struct sdhci_pci_slot *slot)
                dmi_match(DMI_SYS_VENDOR, "IRBIS"));
 }
 
+static bool jsl_broken_hs400es(struct sdhci_pci_slot *slot)
+{
+       return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_JSL_EMMC &&
+                       dmi_match(DMI_BIOS_VENDOR, "ASUSTeK COMPUTER INC.");
+}
+
 static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 {
        int ret = byt_emmc_probe_slot(slot);
@@ -922,9 +928,11 @@ static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
                slot->host->mmc->caps2 |= MMC_CAP2_CQE;
 
        if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
-               slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
-               slot->host->mmc_host_ops.hs400_enhanced_strobe =
-                                               intel_hs400_enhanced_strobe;
+               if (!jsl_broken_hs400es(slot)) {
+                       slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
+                       slot->host->mmc_host_ops.hs400_enhanced_strobe =
+                                                       intel_hs400_enhanced_strobe;
+               }
                slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
        }
 
--

2.38.0.413.g74048e4d9e-goog

#3 lore raw

Thank you Ulf,

Are there any actions that I need to take?

Best,
Patrick

Quoted 70 lines · Ulf Hansson
Quoted 6 lines · Patrick Thompson

Enhanced Strobe (ES) does not work correctly on the ASUS 1100 series of devices. Jasper Lake eMMCs (pci_id 8086:4dc4) are supposed to support ES. There are also two system families under the series, thus this is being scoped to the ASUS BIOS.

Quoted 6 lines

The failing ES prevents the installer from writing to disk. Falling back to HS400 without ES fixes the issue.

Fixes 315e3bd7ac19 ("mmc: sdhci-pci: Add support for Intel JSL")

Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe

Quoted 49 lines

---

Changes in v3:
* Remove redundant MMC_CAP2_HS400 selection

Changes in v2:
* Only disable ES instead of CQE in its entirety.
* Target Jasper Lake (JSL)
* Target ASUS BIOS instead of specific system family

 drivers/mmc/host/sdhci-pci-core.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci-pci-core.c +11 -4
index 169b84761041..34ea1acbb3cc 100644
@@ -914,6 +914,12 @@ static bool glk_broken_cqhci(struct sdhci_pci_slot *slot)
                dmi_match(DMI_SYS_VENDOR, "IRBIS"));
 }
 
+static bool jsl_broken_hs400es(struct sdhci_pci_slot *slot)
+{
+       return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_JSL_EMMC &&
+                       dmi_match(DMI_BIOS_VENDOR, "ASUSTeK COMPUTER INC.");
+}
+
 static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
 {
        int ret = byt_emmc_probe_slot(slot);
@@ -922,9 +928,11 @@ static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
                slot->host->mmc->caps2 |= MMC_CAP2_CQE;
 
        if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) {
-               slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
-               slot->host->mmc_host_ops.hs400_enhanced_strobe =
-                                               intel_hs400_enhanced_strobe;
+               if (!jsl_broken_hs400es(slot)) {
+                       slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES;
+                       slot->host->mmc_host_ops.hs400_enhanced_strobe =
+                                                       intel_hs400_enhanced_strobe;
+               }
                slot->host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
        }
 
--

2.38.0.413.g74048e4d9e-goog