Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp5033639ima; Tue, 5 Feb 2019 05:26:45 -0800 (PST) X-Google-Smtp-Source: AHgI3IYeQ3PDu+AxSqeDqCpDRY18Rclqvdsn1/v5aUPSTDGdvhojDxtVjF73tdQlCSb3+dcujXUH X-Received: by 2002:a17:902:e78e:: with SMTP id cp14mr5140530plb.4.1549373205688; Tue, 05 Feb 2019 05:26:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549373205; cv=none; d=google.com; s=arc-20160816; b=XVH6h5iw3eeQOOU0TkAPaLB9ptq4bRbAHZo626kB36EF4lZk27P9YLsAPsRoNC1zu4 M8FDAWZUW3m9TlCVUdN99JsCoApY0csT5T1OOFujQFKGhHHvEkOkkY87V7saajEVfSk6 DQu81yiXXhd+tbRnKPhtMq+eyMu5aoviFlnadVI35xSWAM4e9TxstfBrR09uUxCqAILt jU5FxuLFyB9e9L9ukTojmCJGxNspJ2TKla6ly65xI+hLhHo9ULLtB2pEDTzQ80frF130 6+hjEUkgTLyV2z2i67eGqHnmGLRXQzI39MNXdure7CM/lbGtu7Uhd/rK2kcU2yG3XJYp JGtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=pOEC6RWJpI9Wlfx5K9Cg/z+ecj0a8LYSade+97iHKig=; b=F/KI5Kx0ZMgvjdkQMQHCsfTkRbW7Zepd4eRZVRVH0lHd1jv8oAiTCVxpLkZPFusEcq wuXyLAcz/WcG4x4OZUZWx1HkFTF6t1QwX+ucHDvGPsaVEBiKfJLWpgXxaOJQq5eqGaE2 qQ77qTfRjcta7QPNg8tJCgV/Bb8qjqK1z9c0voqKjLGTxv1gj+tBZnNUQ3Dv6JCz6fF7 /U31rTUuK4vj8IiWLPlsb92R1TSM2bDOGkL5BpF0Vn+07On9VMp9Ezgj2m+qwYuMJ4Q+ Pauo0Qr+hjs98P6Fhu/+q0CXnjYi+10j7SYd2RXhuF97wnm/DUWQ6blqA/LXyuD9QyuR Hezg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=l03vICYR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9si3354347pfl.13.2019.02.05.05.26.29; Tue, 05 Feb 2019 05:26:45 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=l03vICYR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729108AbfBENGw (ORCPT + 99 others); Tue, 5 Feb 2019 08:06:52 -0500 Received: from mail-vs1-f68.google.com ([209.85.217.68]:44337 "EHLO mail-vs1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726558AbfBENGv (ORCPT ); Tue, 5 Feb 2019 08:06:51 -0500 Received: by mail-vs1-f68.google.com with SMTP id u11so2050003vsp.11 for ; Tue, 05 Feb 2019 05:06:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=pOEC6RWJpI9Wlfx5K9Cg/z+ecj0a8LYSade+97iHKig=; b=l03vICYRZepXPU2iH4NB854Y4tbSfe420IrpgbE2sTk3QOmOfiq8shzC0B8QyJkPVS ZgesxagrIKBT5yaLTDa4YevpVTjJgtmNynvirgwqOppBxdWTHhFo3Ih89pd0jw9xtIn/ Ci+qccMY31J1So18/EZiy911yL4r/+YpiIZzsN1hUpzNecf/VVYiFxXmdZ9tUVKs8yov 06R/LrAMQf+s9JHekSjpl4LupDujru6fQqz5eSIH/FmAQNMmQHvCo/hnDTLHhfcUfFOj A9AoJmfPc+mn8k4KEuSlU0UG3YOUAXnYV1iQAw5rBpdXc7bA68AImsx/RoBoCz0yS52e Weaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=pOEC6RWJpI9Wlfx5K9Cg/z+ecj0a8LYSade+97iHKig=; b=a/6S1jRx+dDnAxKmsZbjwe8H2i2QRzhnjpGlWVtRBC+OsB13/jUtFTVf4z0Xp/3hFK zzQDNalzkTEZpRjnHkz7yy2Qx2Y0+Bv44helGLQsj+9ACbMiBwztuIJYmXG874tXeB9y V6YBtqsQ6mc2uKOjTHHGz37IsOn7Fy7DtQsNs3Zusy8r+UuebxwtKplQGRjuB7eWyv2F 8MJwLVykn+DheidguyHRjktpKeklQs7+Hsx4xgdhph3LzhbjnHcL4dfnU8TVq4C2nmPl VDjzlFMODkbBoLZoXyQHRQ3UTa118SQ8dGTZ5qNoiV2uTVS3s429QI8IAoq44ZPbh3Ik iO1A== X-Gm-Message-State: AHQUAuYGsRhn8BfxBv1r7SQ7WH4NdcnT0TTERiD2tF0bz1z4Sl3+mQy4 yBN+QIZ8czawUgne8VHxHGv4tEIMwUJmOmZDiwSm4w== X-Received: by 2002:a67:d00f:: with SMTP id r15mr518833vsi.191.1549372010128; Tue, 05 Feb 2019 05:06:50 -0800 (PST) MIME-Version: 1.0 References: <1548921212-5219-1-git-send-email-chaotian.jing@mediatek.com> <1548985091.10251.26.camel@mhfsdcap03> <0e95e1a1-843e-38ea-c4bb-e6c48432ea7c@intel.com> In-Reply-To: From: Ulf Hansson Date: Tue, 5 Feb 2019 14:06:13 +0100 Message-ID: Subject: Re: [PATCH] mmc: mmc: Fix HS setting in mmc_hs400_to_hs200() To: Adrian Hunter Cc: Chaotian Jing , Matthias Brugger , Shawn Lin , Simon Horman , Kyle Roeschley , Hongjie Fang , Harish Jenny K N , "linux-mmc@vger.kernel.org" , Linux Kernel Mailing List , Linux ARM , linux-mediatek@lists.infradead.org, srv_heupstream Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 4 Feb 2019 at 14:42, Adrian Hunter wrote: > > On 4/02/19 12:54 PM, Ulf Hansson wrote: > > On Mon, 4 Feb 2019 at 10:58, Adrian Hunter wrote: > >> > >> On 1/02/19 10:10 AM, Ulf Hansson wrote: > >>> On Fri, 1 Feb 2019 at 02:38, Chaotian Jing wrote: > >>>> > >>>> On Thu, 2019-01-31 at 16:58 +0100, Ulf Hansson wrote: > >>>>> On Thu, 31 Jan 2019 at 08:53, Chaotian Jing wrote: > >>>>>> > >>>>>> mmc_hs400_to_hs200() begins with the card and host in HS400 mode. > >>>>>> Therefore, any commands sent to the card should use HS400 timing. > >>>>>> It is incorrect to reduce frequency to 50Mhz before sending the switch > >>>>>> command, in this case, only reduce clock frequency to 50Mhz but without > >>>>>> host timming change, host is still in hs400 mode but clock changed from > >>>>>> 200Mhz to 50Mhz, which makes the tuning result unsuitable and cause > >>>>>> the switch command gets response CRC error. > >>>>> > >>>>> According the eMMC spec there is no violation by decreasing the clock > >>>>> frequency like this. We can use whatever value <=200MHz. > >>>>> > >>>>> However, perhaps in practice this becomes an issue, due to the tuning > >>>>> for HS400 has been done on the "current" frequency. > >>>>> > >>>>> As as start, I think you need to clarify this in the changelog. > >>>>> > >>>> Yes, reduce clock frequency to 50Mhz is no Spec violation, but it may > >>>> cause __mmc_switch() gets response CRC error, decreasing the clock but > >>>> without HOST mode change, on the host side, host driver do not know > >>>> what's operation the core layer want to do and can only set current bus > >>>> clock to 50Mhz, without tuning parameter change, it has a chance lead to > >>>> response CRC error. even lower clock frequency, but with the wrong > >>>> tuning parameter setting(the setting is of hs400 tuning @200Mhz). > >>> > >>> Right, makes sense. > >>> > >>>>>> > >>>>>> this patch refers to mmc_select_hs400(), make the reduce clock frequency > >>>>>> after card timing change. > >>>>>> > >>>>>> Signed-off-by: Chaotian Jing > >>>>>> --- > >>>>>> drivers/mmc/core/mmc.c | 8 ++++---- > >>>>>> 1 file changed, 4 insertions(+), 4 deletions(-) > >>>>>> > >>>>>> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c > >>>>>> index da892a5..21b811e 100644 > >>>>>> --- a/drivers/mmc/core/mmc.c > >>>>>> +++ b/drivers/mmc/core/mmc.c > >>>>>> @@ -1239,10 +1239,6 @@ int mmc_hs400_to_hs200(struct mmc_card *card) > >>>>>> int err; > >>>>>> u8 val; > >>>>>> > >>>>>> - /* Reduce frequency to HS */ > >>>>>> - max_dtr = card->ext_csd.hs_max_dtr; > >>>>>> - mmc_set_clock(host, max_dtr); > >>>>>> - > >>>>> > >>>>> As far as I can tell, the reason to why we change the clock frequency > >>>>> *before* the call to __mmc_switch() below, is probably to try to be on > >>>>> the safe side and conform to the spec. > >>>>> > >>>> Agree, it Must be more safe with lower clock frequency, but the > >>>> precondition is to make the host side recognize current timing is not > >>>> HS400 mode. it has no method to find a safe setting to ensure no > >>>> response CRC error when reduce clock from 200Mhz to 50Mhz. > >>>>> However, I think you have a point, as the call to __mmc_switch(), > >>>>> passes the "send_status" parameter as false, no other command than the > >>>>> CMD6 is sent to the card. > >>>>> > >>>> yes, the send status command was sent only after __mmc_switch() done. > >>>>>> /* Switch HS400 to HS DDR */ > >>>>>> val = EXT_CSD_TIMING_HS; > >>>>>> err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, > >>>>>> @@ -1253,6 +1249,10 @@ int mmc_hs400_to_hs200(struct mmc_card *card) > >>>>>> > >>>>>> mmc_set_timing(host, MMC_TIMING_MMC_DDR52); > >>>>>> > >>>>>> + /* Reduce frequency to HS */ > >>>>>> + max_dtr = card->ext_csd.hs_max_dtr; > >>>>>> + mmc_set_clock(host, max_dtr); > >>>>>> + > >>>>> > >>>>> Perhaps it's even more correct to change the clock frequency before > >>>>> the call to mmc_set_timing(host, MMC_TIMING_MMC_DDR52). Otherwise you > >>>>> will be using the DDR52 timing in the controller, but with a too high > >>>>> frequency. > >>>>> > >>>> for Our host, it has no impact to change the clock before or after > >>>> change timing, as the mmc_set_timing() is only for host side, not > >>>> related to MMC card side and no commands sent do card before the > >>>> timing/clock change completed. > >>> > >>> Alright. After a second thought, it actually looks more consistent > >>> with mmc_select_hs400() to do it after, as what you propose in > >>> $subject patch. > >>> > >>> So, let's keep it as is. > >>> > >>>>>> err = mmc_switch_status(card); > >>>>>> if (err) > >>>>>> goto out_err; > >>>>>> -- > >>>>>> 1.8.1.1.dirty > >>>>>> > >>>>> > >>>>> Finally, it sounds like you are trying to fix a real problem, can you > >>>>> please provide some more information what is happening when the > >>>>> problem occurs at your side? > >>>>> > >>>> Yes, I got a problem with new kernel version. with > >>>> commit:57da0c042f4af52614f4bd1a148155a299ae5cd8, this commit makes > >>>> re-tuning every time when access RPMB partition. > >>> > >>> Okay, could you please add this as fixes tag for the next version of the patch. > >>> > >>>> > >>>> in fact, our host tuning result of hs400 is very stable and almost never > >>>> get response CRC error with clock frequency at 200Mhz. but cannot ensure > >>>> this tuning result also suitable when running at HS400 mode @50Mhz. as I > >>>> mentioned before, the host side does not know the reason of reduce clock > >>>> frequency to 50Mhz at HS400 mode, so what's the host side can do is only > >>>> reduce the bus clock to 50Mhz, even it can just only set the tuning > >>>> setting to default when clock frequency lower than 50Mhz, but both card > >>>> & host side are still at HS400 mode, still cannot ensure this setting is > >>>> suitable. > >>> > >>> Right, thanks for clarifying. > >>> > >>> So I am expecting a new version with a fixes tag and some > >>> clarification of the changelog, then I am ready to apply this to give > >>> it some test. > >> > >> The switch from HS400 mode is done for tuning at times when CRC errors are a > >> possibility e.g. after a CRC error during transfer. So if the frequency is > >> not to be reduced, then some mitigation is needed for the possibility that > >> the CMD6 response itself will have a CRC error. > > > > That's a good point! > > > > However, how can we know that a CMD6 command is successfully > > completed, if there is CRC errors detected during the transmission? I > > guess we can't!? > > Yes, in that case, the only option is to assume the CMD6 was successful, > like in > > commit ef3d232245ab7a1bf361c52449e612e4c8b7c5ab > Author: Adrian Hunter > Date: Fri Dec 2 13:16:35 2016 +0200 > > mmc: mmc: Relax checking for switch errors after HS200 switch Well, relaxing the check for switch errors, is to me a different thing. This means we are first doing the CMD6, then allowing the following status command (CMD13) to have CRC errors. Actually, even the spec mention this as a case to consider. I guess it's because the card internally have switched to a new speed mode timing. Allowing CRC errors for the actual CMD6 sound more fragile to me. Of course, we can always try and see what happens. Chaotian, can you give it a go? Somehow, change the call to __mmc_switch() in mmc_hs400_to_hs200(), so the CMD6 doesn't have the CRC flag set. > > If we are going to do that, then we could stick with lowering the frequency > first. Let's see what Chaotian's test may show. > > Also I wonder if the mediatek driver could change to fixed sampling in > ->set_ios() when the frequency drops for HS400 mode? Well, this sounds like a generic problem so if this is a possible generic solution that would be great. Is this what sdhci is doing already? Kind regards Uffe