On 18/10/18 1:21 PM, Anisse Astier wrote: > If we don't have the voltage switch DSM methods available, there's no > point in advertising to the rest of the kernel that we support 1.8V, or > support voltage switch at all. > > This fixes an issue on a Gemini Lake (GLK) laptop : eMMC driver will > timeout on boot (from 60seconds to 10minutes ) as the cqhci attempts CQE > recovery after a failed voltage switch. In earlier kernels, the problem > existed, but only delayed boot for about 10 seconds after an I/O error, > allowing booting on the eMMC (almost) unnoticed. Can you send the kernel messages? Which kernel is it? Which laptop? An acpidump might help too. > > Signed-off-by: Anisse Astier <anisse@xxxxxxxxx> > --- > Hi, > > I'm looking forward to your feedback on this patch. Is it safe to > have no voltage switch method ? Should the quirk be used or skipped > entirely ? The eMMC is typically 1.8V only and the voltage switch does nothing. I have been meaning to tidy it up, but it seemed like it was working so it didn't get much priority, until now. > > It seemed to work well in my tests, as the mmc core works properly. > > Regards, > > Anisse > > drivers/mmc/host/sdhci-pci-core.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c > index 7bfd366d970d..8fac8cbc5ce8 100644 > --- a/drivers/mmc/host/sdhci-pci-core.c > +++ b/drivers/mmc/host/sdhci-pci-core.c > @@ -706,10 +706,27 @@ static int intel_execute_tuning(struct mmc_host *mmc, u32 opcode) > static void byt_probe_slot(struct sdhci_pci_slot *slot) > { > struct mmc_host_ops *ops = &slot->host->mmc_host_ops; > + struct intel_host *intel_host = sdhci_pci_priv(slot); > > byt_read_dsm(slot); > > ops->execute_tuning = intel_execute_tuning; > + > + /* Check if we have the appropriate voltage switch DSM methods */ > + if (!(intel_host->dsm_fns & (1 << INTEL_DSM_V18_SWITCH))) { > + pr_info("%s: no DSM function for 1.8 voltage switch\n", > + mmc_hostname(slot->host->mmc)); > + slot->host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V; > + > + if (!(intel_host->dsm_fns & (1 << INTEL_DSM_V33_SWITCH))) { > + /* No voltage switching supported at all, there's no > + * point in installing the callback: return. > + */ > + pr_info("%s: Voltage switching unsupported\n", > + mmc_hostname(slot->host->mmc)); > + return; > + } > + } > ops->start_signal_voltage_switch = intel_start_signal_voltage_switch; > } > >