Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp278577pxv; Wed, 30 Jun 2021 20:50:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw9ZsDAvikKH7vXT7+kiun3SbM3PjEiwynaJopFzh/YMtczvdGb7RF68bbdmf0nNcxn4jiV X-Received: by 2002:a05:6402:350e:: with SMTP id b14mr50463239edd.286.1625111410968; Wed, 30 Jun 2021 20:50:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625111410; cv=none; d=google.com; s=arc-20160816; b=npgb34ZkskHi/sr04tlp6cvbud6r4/DyjjXyNuj4uh3UrxWkKXR9JzCbhzZM3QyYhv X9BQzutFEEp47zFH/qX3QNpaufPYnxukD6+lBNfzez8uHxmrLVQZd8zFl+ykVqWaIjSD YZlTNUiE7mejB2ayqGOu1f9pSz5z5FikUj/vtRbRg46DaSzwz12HJ89sA18oiiu+al3H HGWZicegKsb3t0GrwDazdrVjEStjJMFM13a9rsyNnATFhXlY6XsRUBALd4/yMZJM8VeP qvKEiu9yJJtK40Z0nzMc/thGAdV+BuSppsS9IeIhAs66Lhqn04iFiAdYnBmQWOgiNlw9 41jQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=FBLy8HhoOQw9pfBLv1qCVmi6SynKDzQv7BxPdiIz/K8=; b=YJaMaJiYK/JSWXVT+/HjLn6q77KUQdBsLHytoehGw4sfpuEhValZK394NzE0eofD2L OuAJNm/JhYJ+2xR8C/jg39xToY+vBa1i+uyJhESZcRIKiROu4NPXUGnfBbESm11PPmF4 S5Wh95wyw+Z2whoVYOfvlEVLuvPArm+SIyaX/V8xT8OaKSEAnuxWfHnhATYqBGu55GWY aEZ5E1QrdYc1+UZk+tjd5ul7KPwMaBEAXLgVdNeoLCOAMs/Z7EVqq1exlfMxJ84sJ7mS Cu8s32DHRJVGYKJDt2P/wg8xDZT332W+aHAyIFajX+mafKYHAYcrQlh9IqsmDavnnGUo C+dQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=V68wQ3Z7; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id aq16si22253503ejc.217.2021.06.30.20.49.45; Wed, 30 Jun 2021 20:50:10 -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=@gmail.com header.s=20161025 header.b=V68wQ3Z7; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233771AbhGADuX (ORCPT + 99 others); Wed, 30 Jun 2021 23:50:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229622AbhGADuX (ORCPT ); Wed, 30 Jun 2021 23:50:23 -0400 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B486EC061756; Wed, 30 Jun 2021 20:47:53 -0700 (PDT) Received: by mail-qk1-x72e.google.com with SMTP id b2so4736652qka.7; Wed, 30 Jun 2021 20:47:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=FBLy8HhoOQw9pfBLv1qCVmi6SynKDzQv7BxPdiIz/K8=; b=V68wQ3Z7V0VQohcSlj5ylfMwuua5JqDVGeD/WUsl+prrVaaK8mT4erndv3YysAUG1Q iINVvFFenlXGchVxRJ6eo2BgZM1FTQhDCyRgLkPwnnzHl/EQ0ci7FeYpSqv5jdHBnvfz 1QmatDB8IbxL2kERGq+f8yIZ94e6tzUeOpi96FKMwt75+iFcNeC2f52TL6RSfw+8lGkD 9xME1QeGuA/nKan7V6HF7UB9kzE26WdVe5Bf3ByRPLZbLE6RNfKOrdAyKlizop/H7/4J GlPdks9mugdm0xVETvtjAe8jDOf1I67LBaYPgYskYsnAL2DKK71hT+1SjAuSw3hC8emC zQvA== 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:content-transfer-encoding; bh=FBLy8HhoOQw9pfBLv1qCVmi6SynKDzQv7BxPdiIz/K8=; b=C7I7441cB0WpjvCaxrxHswErDmOC7A7+9BcxIlSQKjQ7Kj9PHvkJ6kDwePQhg34L8E kF0i5G3YcZz23o30arKLhhpC/nUR17YJNHKwnDbOUzUSYR78OiVP4qSrSaI+3rgSUPcf vQDiqITwlJarqZLcns1Xm/9lQ8QlZVeCeBnXVlbBXCzRJssxIhnZ5+MpItjGT+Y8i657 Fch+8Kdu6mVlUVX4TfKuuekNkIuddcZsn+lE0U+MvXXyItXxRPeGQUT+TEosredc8ofM M64rUvbn4VNICfsqz2J4Ek+es3OGZzLyd/bA9PV1zBPSktnTQz47LH3J70PZYpc1Bhub WuXw== X-Gm-Message-State: AOAM533qoN2uKiVxRybA+YZ8J3QvRob4AR7YBA83SnF914jcenha7jyT 11syJM4HrH/3YTZn1ARqy2u1aSrYDh/5Jaof2I4= X-Received: by 2002:a05:620a:12b4:: with SMTP id x20mr21252019qki.217.1625111273013; Wed, 30 Jun 2021 20:47:53 -0700 (PDT) MIME-Version: 1.0 References: <20210624032543.101861-1-reniuschengl@gmail.com> <916ea01b-4265-0964-9139-8f50b80ea66e@intel.com> In-Reply-To: <916ea01b-4265-0964-9139-8f50b80ea66e@intel.com> From: Renius Chen Date: Thu, 1 Jul 2021 11:47:42 +0800 Message-ID: Subject: Re: [PATCH] [RESEND] mmc: sdhci-pci-gli: Improve Random 4K Read Performance of GL9763E To: Adrian Hunter Cc: Ulf Hansson , linux-mmc , Linux Kernel Mailing List , Ben Chuang Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adrian Hunter =E6=96=BC 2021=E5=B9=B46=E6=9C=8830= =E6=97=A5 =E9=80=B1=E4=B8=89 =E4=B8=8B=E5=8D=888:18=E5=AF=AB=E9=81=93=EF=BC= =9A > > On 24/06/21 6:25 am, Renius Chen wrote: > > During a sequence of random 4K read operations, the performance will be > > reduced due to spending much time on entering/exiting the low power sta= te > > between requests. We disable the low power state negotiation of GL9763E > > during a sequence of random 4K read operations to improve the performan= ce > > and enable it again after the operations have finished. > > > > Signed-off-by: Renius Chen > > --- > > drivers/mmc/host/sdhci-pci-gli.c | 86 ++++++++++++++++++++++++++++++++ > > 1 file changed, 86 insertions(+) > > > > diff --git a/drivers/mmc/host/sdhci-pci-gli.c b/drivers/mmc/host/sdhci-= pci-gli.c > > index 302a7579a9b3..0105f728ccc4 100644 > > --- a/drivers/mmc/host/sdhci-pci-gli.c > > +++ b/drivers/mmc/host/sdhci-pci-gli.c > > @@ -88,6 +88,9 @@ > > #define PCIE_GLI_9763E_SCR 0x8E0 > > #define GLI_9763E_SCR_AXI_REQ BIT(9) > > > > +#define PCIE_GLI_9763E_CFG 0x8A0 > > +#define GLI_9763E_CFG_LPSN_DIS BIT(12) > > + > > #define PCIE_GLI_9763E_CFG2 0x8A4 > > #define GLI_9763E_CFG2_L1DLY GENMASK(28, 19) > > #define GLI_9763E_CFG2_L1DLY_MID 0x54 > > @@ -691,6 +694,86 @@ static void sdhci_gl9763e_dumpregs(struct mmc_host= *mmc) > > sdhci_dumpregs(mmc_priv(mmc)); > > } > > > > +static void gl9763e_request(struct mmc_host *mmc, struct mmc_request *= mrq) > > +{ > > + struct sdhci_host *host =3D mmc_priv(mmc); > > + struct mmc_command *cmd; > > + struct sdhci_pci_slot *slot =3D sdhci_priv(host); > > + struct pci_dev *pdev =3D slot->chip->pdev; > > + u32 value; > > + static bool start_4k_r; > > + static int continuous_4k_r; > > Please do not use static variables. Instead define a struct for them and > set .priv_size in sdhci_pci_fixes e.g. > > struct sdhci_pci_gli { > static bool start_4k_r; > static int continuous_4k_r; > }; > > const struct sdhci_pci_fixes sdhci_gl9763e =3D { > .quirks =3D SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, > .probe_slot =3D gli_probe_slot_gl9763e, > .ops =3D &sdhci_gl9763e_ops, > #ifdef CONFIG_PM_SLEEP > .resume =3D sdhci_cqhci_gli_resume, > .suspend =3D sdhci_cqhci_gli_suspend, > #endif > .add_host =3D gl9763e_add_host, > .priv_size =3D sizeof(struct sdhci_pci_gli); > }; > > And then you can get a pointer to it: > > struct sdhci_pci_gli *sdhci_pci_gli =3D sdhci_pci_priv(slot); > > > > + > > + cmd =3D (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) ? mrq->sb= c : mrq->cmd; > > mrq->cmd is always the main command, so why look at mrq->sbc? OK, I will just check if mrq->cmd is valid or not instead of looking at mrq->sbc. I will also modify the other parts by your comments and submit a newer vers= ion. Thanks for your review. > > > + > > + if (cmd->opcode =3D=3D MMC_READ_MULTIPLE_BLOCK) { > > + if (cmd->data->blocks =3D=3D 8) { > > + continuous_4k_r++; > > + > > + if ((!start_4k_r) && (continuous_4k_r >=3D 3)) { > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_VHS, &value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, = GLI_9763E_VHS_REV_W); > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_VHS, value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_CFG, &value); > > + value |=3D GLI_9763E_CFG_LPSN_DIS; > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_CFG, value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_VHS, &value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, = GLI_9763E_VHS_REV_R); > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_VHS, value); > > + > > + start_4k_r =3D true; > > + } > > + } else { > > + continuous_4k_r =3D 0; > > + > > + if (start_4k_r) { > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_VHS, &value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, = GLI_9763E_VHS_REV_W); > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_VHS, value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_CFG, &value); > > + value &=3D ~GLI_9763E_CFG_LPSN_DIS; > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_CFG, value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763= E_VHS, &value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, = GLI_9763E_VHS_REV_R); > > + pci_write_config_dword(pdev, PCIE_GLI_976= 3E_VHS, value); > > + > > + start_4k_r =3D false; > > + } > > + } > > + } else { > > + continuous_4k_r =3D 0; > > + > > + if (start_4k_r) { > > + pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &= value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763= E_VHS_REV_W); > > + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, = value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &= value); > > + value &=3D ~GLI_9763E_CFG_LPSN_DIS; > > + pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG, = value); > > + > > + pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &= value); > > + value &=3D ~GLI_9763E_VHS_REV; > > + value |=3D FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763= E_VHS_REV_R); > > + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, = value); > > + > > + start_4k_r =3D false; > > + } > > The code chunk above is the same as the previous and almost > the same as the one before that. Please make a separate function > > > + } > > + > > + sdhci_request(mmc, mrq); > > +} > > + > > + > > static void sdhci_gl9763e_cqe_pre_enable(struct mmc_host *mmc) > > { > > struct cqhci_host *cq_host =3D mmc->cqe_private; > > @@ -848,6 +931,9 @@ static int gli_probe_slot_gl9763e(struct sdhci_pci_= slot *slot) > > gli_pcie_enable_msi(slot); > > host->mmc_host_ops.hs400_enhanced_strobe =3D > > gl9763e_hs400_enhanced_strobe; > > + > > + host->mmc_host_ops.request =3D gl9763e_request; > > + > > gli_set_gl9763e(slot); > > sdhci_enable_v4_mode(host); > > > > >