Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp104264pxx; Tue, 27 Oct 2020 22:58:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyZnJFX/TKutAU6TfFHHIRlewktS9M3hMz0tih0DIFkOrjXxpwa5j9grgvOus0Xc9HRkVT4 X-Received: by 2002:a17:906:4e16:: with SMTP id z22mr5803453eju.527.1603864738837; Tue, 27 Oct 2020 22:58:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603864738; cv=none; d=google.com; s=arc-20160816; b=xmQXZGPp09hsPnMafX7DL+/C6MwjVSzzkNEHFHacG1bCITkGLiSLx1kib5FtEa8tH1 43XLN6q6CdsF28hdwb2CoBK9EHEzVHnfwvsEu+R9QkT5vt53Oqrh8pDGUOo9NPABEtk3 uIAy/O/La6KeBSpNQWk3zB1yWfp2SWiVc7JUfVGbBrt2aSDnnvmqQgSQBm1cwccsIDGd kG/lywk/UUg5P7hdZYVmQQk56k9czz77HoYYqxPmwKBpGYVI5VuzO6G7L1XXz2PmjgBs S8JmJ7qtTQzq3uMKnEaVEzMtWaI0xwnLgoB83GCyV3Ivt7VY2Zhi4shjqN78nPABnCbe l3BQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:mime-version:message-id:date :sender:dkim-signature; bh=PHSX1yllEEpVL2wWXaBXv4UsLFRKnniRVSM8yQzP6OY=; b=XzHzkgXW5wi6ChqBTT/AcFeH+LAsVJ7cjKNcpmk/RDquTmdIh2eZKAlCygjGQC7tKx y+698v2WpbEC/tRPOAsuHmFi31cF/UK3Cc+p8JulCpnMCZd1J693JAEqEg864PYwLxJq pDpAUSa6XgEd98tzHxio7CmcBM2oSMAapfCatsmuAWAH6mrgHw1kJEDEHHC0pVbUbYgH 9f+XYQY1iMpg8hH4FHToFzzSHMzNBYcNWj6HfPXrwNet+100XUlNathNcLIJtyqbv8NC wQ5PEr3ycIU3LJDZZ/wQN8zhwwhonSM5m779+f+8II45R00gacbOejoZeCPK79FxU+j9 ULyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=m1iPMNbs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id lr11si2627133ejb.116.2020.10.27.22.58.36; Tue, 27 Oct 2020 22:58:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=m1iPMNbs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2509244AbgJ0Iqf (ORCPT + 99 others); Tue, 27 Oct 2020 04:46:35 -0400 Received: from mail-yb1-f202.google.com ([209.85.219.202]:53129 "EHLO mail-yb1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2444455AbgJ0Iqf (ORCPT ); Tue, 27 Oct 2020 04:46:35 -0400 Received: by mail-yb1-f202.google.com with SMTP id j10so628661ybl.19 for ; Tue, 27 Oct 2020 01:46:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:message-id:mime-version:subject:from:to:cc; bh=PHSX1yllEEpVL2wWXaBXv4UsLFRKnniRVSM8yQzP6OY=; b=m1iPMNbsZU6ojEjWigu9LT/5yPvJjM04VR/kS0RL5z9vq3o9VCW73xMXjIZ/z+Zxli DRtbo1uHbLFT6+jCQTzU6htk6OOyzobJ0yKRlPfQ2VyJvKAFgMjlQ21gOn7feYQk+E9G FLqmP/quCVYamrqTocJHlq5UbZQxySc/i+WOEF+DJ3iwVq6loaJd6rMyyBH7wvpf0HvY oQHZQFDTcxIFCtjbm5DhdmDomnfyzKAQTBNL6tnF65JD8cKSCcVe/WyJHEgE8ISOpSiS PR8QgJZjQTSgy0RNMrsXbBUvnVhe1zwkvASaOcgxkL70NcPqCeur/fSJKrA54JaNgBF1 f1kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:message-id:mime-version:subject:from :to:cc; bh=PHSX1yllEEpVL2wWXaBXv4UsLFRKnniRVSM8yQzP6OY=; b=GN4iTj7WdEtx2g9usrabijKDnDXeHtyJ9ccOMjpO+6rQo53bNaRAkknheX3Pe9qY0K rM5q/X6rSGSBKnPCHzuDbh9BHegnbwrriBgNMXRDeVKy1MbKY61SewK3oGISNesm4oTF llzNPdCKMFvGu1nQuUQ9A1hOdxirL77U3XSX+Y/F9PfrzUUW2kZRdzidoj0qSI1SlCgc y7aBfZgAKuDdpKV2vx/MCIvp5tevFqZnIx2GQEoyBo4yvQ1JSLo4gjmRx4g2Av67Q0Ns 4LWSA/GeIIwEDfowIDjVjgt/bWsKRMXCP3+u6oKTPa87fuVlj+zyWMIiVu1/0vnzbPl+ mMLg== X-Gm-Message-State: AOAM5321v0syacLHuAUBEHih/sHksMD/bo+3iC5xlzNCjKHemUN2inai KSnjYK4VdY5hwfo/CZnTxmVBKwZxyu+l1LSJ9cQBGSgS86lltFrxc8x0k4dFG65oZQ4rp8IuNR2 KL3WXahAzuihNGj0lukGIhrI96tHm2qhAjmPnVKJWw9CNDeDuPmnbBA5NyOI+3v9waQ+lmlzkbu /Ju+cK Sender: "victording via sendgmr" X-Received: from victording.syd.corp.google.com ([2401:fa00:9:14:f693:9fff:fef4:fa73]) (user=victording job=sendgmr) by 2002:a25:4e55:: with SMTP id c82mr1622346ybb.416.1603788393692; Tue, 27 Oct 2020 01:46:33 -0700 (PDT) Date: Tue, 27 Oct 2020 19:46:12 +1100 Message-Id: <20201027084612.528301-1-victording@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog Subject: [PATCH v2] mmc: sdhci-acpi: AMDI0040: Allow changing HS200/HS400 driver strength From: Victor Ding To: linux-kernel@vger.kernel.org Cc: Ulf Hansson , Adrian Hunter , Raul E Rangel , Victor Ding , linux-mmc@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Raul E Rangel This change will allow platform designers better control over signal integrity by allowing them to tune the HS200 and HS400 driver strengths. The driver strength was previously hard coded to A to solve boot problems with certain platforms. This driver strength does not universally apply to all platforms so we need a knob to adjust it. All older platforms currently have the SDR104 preset hard coded to A in the firmware. This means that switching from the hard coded value in the kernel to reading the SDR104 preset is a no-op for these platforms. Newer platforms will have properly set presets. So this change will support both new and old platforms. Signed-off-by: Raul E Rangel Signed-off-by: Victor Ding --- Changes in v2: By Victor Ding - Rebased the patch by using FIELD_GET for preset value bit masks. - (No functional changes). The original patch was developed by Raul E Rangel. https://patchwork.kernel.org/project/linux-mmc/patch/20200928154718.2.Ic6b6031366f090393d00a53fd69e1ada31ceb29e@changeid/ drivers/mmc/host/sdhci-acpi.c | 39 ++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index 54205e3be9e8..225cb34cf1b9 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c @@ -5,6 +5,7 @@ * Copyright (c) 2012, Intel Corporation. */ +#include #include #include #include @@ -545,10 +546,42 @@ struct amd_sdhci_host { static int amd_select_drive_strength(struct mmc_card *card, unsigned int max_dtr, int host_drv, - int card_drv, int *drv_type) + int card_drv, int *host_driver_strength) { - *drv_type = MMC_SET_DRIVER_TYPE_A; - return MMC_SET_DRIVER_TYPE_A; + struct sdhci_host *host = mmc_priv(card->host); + u16 preset, preset_driver_strength; + + /* + * This method is only called by mmc_select_hs200 so we only need to + * read from the HS200 (SDR104) preset register. + * + * Firmware that has "invalid/default" presets return a driver strength + * of A. This matches the previously hard coded value. + */ + preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR104); + preset_driver_strength = FIELD_GET(SDHCI_PRESET_DRV_MASK, preset); + + /* + * We want the controller driver strength to match the card's driver + * strength so they have similar rise/fall times. + * + * The controller driver strength set by this method is sticky for all + * timings after this method is called. This unfortunately means that + * while HS400 tuning is in progress we end up with mismatched driver + * strengths between the controller and the card. HS400 tuning requires + * switching from HS400->DDR52->HS->HS200->HS400. So the driver mismatch + * happens while in DDR52 and HS modes. This has not been observed to + * cause problems. Enabling presets would fix this issue. + */ + *host_driver_strength = preset_driver_strength; + + /* + * The resulting card driver strength is only set when switching the + * card's timing to HS200 or HS400. The card will use the default driver + * strength (B) for any other mode. + */ + return preset_driver_strength; + } static void sdhci_acpi_amd_hs400_dll(struct sdhci_host *host, bool enable) -- 2.29.0.rc2.309.g374f81d7ae-goog