linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Raul E Rangel <rrangel@chromium.org>, linux-mmc@vger.kernel.org
Cc: Shirish.S@amd.com, Akshu.Agrawal@amd.com,
	Nehal-bakulchandra.Shah@amd.com, chris.wang@amd.com,
	Ulf Hansson <ulf.hansson@linaro.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] mmc: sdhci-acpi: AMDI0040: Set SDHCI_QUIRK2_PRESET_VALUE_BROKEN
Date: Wed, 30 Sep 2020 10:25:46 +0300	[thread overview]
Message-ID: <5094f730-ab5c-b0e4-677d-e53d3e42b52e@intel.com> (raw)
In-Reply-To: <20200928154718.1.Icc21d4b2f354e83e26e57e270dc952f5fe0b0a40@changeid>

On 29/09/20 12:59 am, Raul E Rangel wrote:
> This change fixes HS400 tuning for devices with invalid presets.
> 
> SDHCI presets are not currently used for eMMC HS/HS200/HS400, but are
> used for DDR52. The HS400 retuning sequence is:
> 
>     HS400->DDR52->HS->HS200->Perform Tuning->HS->HS400
> 
> This means that when HS400 tuning happens, we transition through DDR52
> for a very brief period. This causes presets to be enabled
> unintentionally and stay enabled when transitioning back to HS200 or
> HS400. Some firmware has invalid presets, so we end up with driver
> strengths that can cause I/O problems.
> 
> Fixes: 34597a3f60b1 ("mmc: sdhci-acpi: Add support for ACPI HID of AMD Controller with HS400")
> Signed-off-by: Raul E Rangel <rrangel@chromium.org>

Acked-by: Adrian Hunter <adrian.hunter@intel.com>

> ---
> I decided to abandon adding the preset_value_support for now. Enabling
> presets for the AMD controller currently results in using invalid
> presets for HS400. This is because sdhci_get_preset_value is using a
> non-standard HS400 register that the AMD controller does not support.
> 
> I think preset_value_support also needs more thought. Since HS400
> re-tuning requires switching to HS, DDR52, and HS200, if one of those
> timings is not in the list, we would need to disable presets.
> 
> I chose this approach to avoid any additional complexity.
> 
>  drivers/mmc/host/sdhci-acpi.c | 37 +++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
> 
> diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c
> index 284cba11e2795..d335a34ad05b3 100644
> --- a/drivers/mmc/host/sdhci-acpi.c
> +++ b/drivers/mmc/host/sdhci-acpi.c
> @@ -662,6 +662,43 @@ static int sdhci_acpi_emmc_amd_probe_slot(struct platform_device *pdev,
>  	    (host->mmc->caps & MMC_CAP_1_8V_DDR))
>  		host->mmc->caps2 = MMC_CAP2_HS400_1_8V;
>  
> +	/*
> +	 * There are two types of presets out in the wild:
> +	 * 1) Default/broken presets.
> +	 *    These presets have two sets of problems:
> +	 *    a) The clock divisor for SDR12, SDR25, and SDR50 is too small.
> +	 *       This results in clock frequencies that are 2x higher than
> +	 *       acceptable. i.e., SDR12 = 25 MHz, SDR25 = 50 MHz, SDR50 =
> +	 *       100 MHz.x
> +	 *    b) The HS200 and HS400 driver strengths don't match.
> +	 *       By default, the SDR104 preset register has a driver strength of
> +	 *       A, but the (internal) HS400 preset register has a driver
> +	 *       strength of B. As part of initializing HS400, HS200 tuning
> +	 *       needs to be performed. Having different driver strengths
> +	 *       between tuning and operation is wrong. It results in different
> +	 *       rise/fall times that lead to incorrect sampling.
> +	 * 2) Firmware with properly initialized presets.
> +	 *    These presets have proper clock divisors. i.e., SDR12 => 12MHz,
> +	 *    SDR25 => 25 MHz, SDR50 => 50 MHz. Additionally the HS200 and
> +	 *    HS400 preset driver strengths match.
> +	 *
> +	 *    Enabling presets for HS400 doesn't work for the following reasons:
> +	 *    1) sdhci_set_ios has a hard coded list of timings that are used
> +	 *       to determine if presets should be enabled.
> +	 *    2) sdhci_get_preset_value is using a non-standard register to
> +	 *       read out HS400 presets. The AMD controller doesn't support this
> +	 *       non-standard register. In fact, it doesn't expose the HS400
> +	 *       preset register anywhere in the SDHCI memory map. This results
> +	 *       in reading a garbage value and using the wrong presets.
> +	 *
> +	 *       Since HS400 and HS200 presets must be identical, we could
> +	 *       instead use the the SDR104 preset register.
> +	 *
> +	 *    If the above issues are resolved we could remove this quirk for
> +	 *    firmware that that has valid presets (i.e., SDR12 <= 12 MHz).
> +	 */
> +	host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
> +
>  	host->mmc_host_ops.select_drive_strength = amd_select_drive_strength;
>  	host->mmc_host_ops.set_ios = amd_set_ios;
>  	host->mmc_host_ops.execute_tuning = amd_sdhci_execute_tuning;
> 


  parent reply	other threads:[~2020-09-30  7:26 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-28 21:59 [PATCH 1/2] mmc: sdhci-acpi: AMDI0040: Set SDHCI_QUIRK2_PRESET_VALUE_BROKEN Raul E Rangel
2020-09-28 21:59 ` [PATCH 2/2] mmc: sdhci-acpi: AMDI0040: Allow changing HS200/HS400 driver strength Raul E Rangel
2020-09-30  7:26   ` Adrian Hunter
2020-10-05 12:50   ` Ulf Hansson
2020-10-06  9:40     ` Ulf Hansson
2020-09-30  7:25 ` Adrian Hunter [this message]
2020-10-05 12:50 ` [PATCH 1/2] mmc: sdhci-acpi: AMDI0040: Set SDHCI_QUIRK2_PRESET_VALUE_BROKEN Ulf Hansson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5094f730-ab5c-b0e4-677d-e53d3e42b52e@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=Akshu.Agrawal@amd.com \
    --cc=Nehal-bakulchandra.Shah@amd.com \
    --cc=Shirish.S@amd.com \
    --cc=chris.wang@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=rrangel@chromium.org \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).