Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3635776pxv; Mon, 5 Jul 2021 02:04:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyKKkxvx4o+kfiVfgcoAvFhqrc4hmHj3oftp0O0PvsKb5QxXHTpvqnukK/LvxPrNEcbziPW X-Received: by 2002:aa7:c909:: with SMTP id b9mr14985558edt.1.1625475871697; Mon, 05 Jul 2021 02:04:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625475871; cv=none; d=google.com; s=arc-20160816; b=KJgGk3MpzUu8CZhAt0AQj1l+0VU/9NGRHTYWke2UXOS/3cUBvM7+cED+xNXbaoVAM2 +AKqRTfhPlNBYHbrqqKu2cI1T7RNTzgJ1+FoUSgIbCviDpVSOTIaXZDnPliE7Re5Lihm rRIhOf1beCK+9bCzESyl7OSY2p6XiytiStBjU7SMpGJPJXkAAgeWLyAkgpGGWVrUNDh7 MRI3vlA/uz04QkzbvEBGrGNajguIYZ/sjPG1eFgVthM3Myvwe/vkrIf/0nbHChOzlWxC /pvJBqXxmG0kXwM3iEEMliZ1rwGiNUr5Bj3IzQRBEm1kieOs0D3syndVGnr533wXykt4 KMyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=BHOc9bMVKoqm+NvC6FFa+oLqE9OfPnAlc6OXJXSBlr4=; b=Hh4AxdKeMr/TKcoehtr0L6J0SIOFtlsPVwMtRRWVgFPACx+O+P8KlO6pW688lWW9ZP 7SQ+8GFWQ1bz5BNK+vKcZTIjs6L4GvJq7xJp577i3p4oHQbDkTUebg6CDZ+4sdgU0lOL RHwpgjxEhoe2VCwvK+k+X7bJxUN9lP/Ir+Ruh1wx58amnRBkBjitDhEz0whlG/0CcZrt HRlx3A5VvqDbJKANfyFHnCWgDqa+8gPyFCQkJo4R+UGxkTLSp6lmM1+UZSK2HnjIq6HM Y55R856lpuH7yyjV3LbkKkZY+ktk+gVvvZos2iOl6Mlv7K9nVFh8SCf/9MFRzua+V2d9 T43A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=arXkm6K4; 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 g4si2166506edb.87.2021.07.05.02.04.08; Mon, 05 Jul 2021 02:04:31 -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=arXkm6K4; 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 S230225AbhGEJDg (ORCPT + 99 others); Mon, 5 Jul 2021 05:03:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230121AbhGEJDf (ORCPT ); Mon, 5 Jul 2021 05:03:35 -0400 Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 582DCC061574; Mon, 5 Jul 2021 02:00:58 -0700 (PDT) Received: by mail-pf1-x431.google.com with SMTP id x16so16110120pfa.13; Mon, 05 Jul 2021 02:00:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=BHOc9bMVKoqm+NvC6FFa+oLqE9OfPnAlc6OXJXSBlr4=; b=arXkm6K4q8szDA8QUlC/LWXrZ0jK1xMx4CmSn30PFLk1XUy6aClRHxeVQ4ye+UmBnR QjLHZUMnztqyf7QK8HTU6fAXa4XOBEnX90f+if0zNidy3fVhHWQi1bgKA7ecguMMh+ea GCVBMrO5YkhdE9YBMYf4vJ/HgGdGQyT88AYqLh+2+zUOWvpW+TZ03gd7mdt3R5/J7imY DHa2HtMb0yECYJuRb+HlDXCWNoe6czeXpGqSQ05MYFEUDkg/1bdBDnOnc9CDpD20AuIn ip4OhN5eod9xnM7qFbUyHP1WILzghWqniUZPnrPFWbGOqIlZieWMlL6efSigv2Vc1yDK uydA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=BHOc9bMVKoqm+NvC6FFa+oLqE9OfPnAlc6OXJXSBlr4=; b=TIzNsv7V6mfiwOIdhtZ4biMXY9WRlkZhG9HuMZnIiB5axvSzPPYIYv5edtcDDKHSuA QZc1323hGGWaxm56lYIEQ/Zk9J8W+6F54by82HeZBA/fmAbRzMN+Hb/wyd3ZuXU4CXKE hQoQ8wKG186wDAgEk1k5bQXf6fwnTiC3AJ+l+HmpK/x3sGHDeLAA3mi455KH9ih+FPvl 8MjFWB3Ztdw+jC2Mdsr+rdzlH2YHN9KW25ZfaZxF7EDwdWkqFuCE1/bArDot2Li42UyE v6g1IRSa5ID+9SDPeW6uqnDn2mWpW4K4oDb1sR3yMtlcsz0qfP+MgoPbqyzn1gFkQm+8 J7qw== X-Gm-Message-State: AOAM533glNw5LcfjBeq2xseUAw52oJaSFEIaqVm/MqaRcPImVS39xsos H07gGBShwyYaAfjNwoGeHYY= X-Received: by 2002:a63:164c:: with SMTP id 12mr14709144pgw.141.1625475657922; Mon, 05 Jul 2021 02:00:57 -0700 (PDT) Received: from gli-System-Product-Name.genesyslogic.com.tw (60-251-58-169.HINET-IP.hinet.net. [60.251.58.169]) by smtp.gmail.com with ESMTPSA id j16sm13570816pgh.69.2021.07.05.02.00.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jul 2021 02:00:57 -0700 (PDT) From: Renius Chen To: ulf.hansson@linaro.org, adrian.hunter@intel.com Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Ben.Chuang@genesyslogic.com.tw, Renius Chen Subject: [PATCH] [v2] mmc: sdhci-pci-gli: Improve Random 4K Read Performance of GL9763E Date: Mon, 5 Jul 2021 17:00:50 +0800 Message-Id: <20210705090050.15077-1-reniuschengl@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org During a sequence of random 4K read operations, the performance will be reduced due to spending much time on entering/exiting the low power state between requests. We disable the low power state negotiation of GL9763E during a sequence of random 4K read operations to improve the performance and enable it again after the operations have finished. Signed-off-by: Renius Chen --- drivers/mmc/host/sdhci-pci-gli.c | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/drivers/mmc/host/sdhci-pci-gli.c b/drivers/mmc/host/sdhci-pci-gli.c index 302a7579a9b3..5f1f332b4241 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 @@ -128,6 +131,11 @@ #define GLI_MAX_TUNING_LOOP 40 +struct gli_host { + bool start_4k_r; + int continuous_4k_r; +}; + /* Genesys Logic chipset */ static inline void gl9750_wt_on(struct sdhci_host *host) { @@ -691,6 +699,62 @@ static void sdhci_gl9763e_dumpregs(struct mmc_host *mmc) sdhci_dumpregs(mmc_priv(mmc)); } +static void gl9763e_set_low_power_negotiation(struct sdhci_pci_slot *slot, bool enable) +{ + struct pci_dev *pdev = slot->chip->pdev; + u32 value; + + pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value); + value &= ~GLI_9763E_VHS_REV; + value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W); + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value); + + pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &value); + + if (enable) + value &= ~GLI_9763E_CFG_LPSN_DIS; + else + value |= 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 &= ~GLI_9763E_VHS_REV; + value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R); + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value); +} + +static void gl9763e_request(struct mmc_host *mmc, struct mmc_request *mrq) +{ + struct sdhci_host *host = mmc_priv(mmc); + struct mmc_command *cmd; + struct sdhci_pci_slot *slot = sdhci_priv(host); + struct gli_host *gli_host = sdhci_pci_priv(slot); + + cmd = mrq->cmd; + + if (cmd && (cmd->opcode == MMC_READ_MULTIPLE_BLOCK) && (cmd->data->blocks == 8)) { + gli_host->continuous_4k_r++; + + if ((!gli_host->start_4k_r) && (gli_host->continuous_4k_r >= 3)) { + gl9763e_set_low_power_negotiation(slot, false); + + gli_host->start_4k_r = true; + } + } else { + gli_host->continuous_4k_r = 0; + + if (gli_host->start_4k_r) { + gl9763e_set_low_power_negotiation(slot, true); + + gli_host->start_4k_r = false; + } + } + + sdhci_request(mmc, mrq); +} + + static void sdhci_gl9763e_cqe_pre_enable(struct mmc_host *mmc) { struct cqhci_host *cq_host = mmc->cqe_private; @@ -848,6 +912,9 @@ static int gli_probe_slot_gl9763e(struct sdhci_pci_slot *slot) gli_pcie_enable_msi(slot); host->mmc_host_ops.hs400_enhanced_strobe = gl9763e_hs400_enhanced_strobe; + + host->mmc_host_ops.request = gl9763e_request; + gli_set_gl9763e(slot); sdhci_enable_v4_mode(host); @@ -913,4 +980,5 @@ const struct sdhci_pci_fixes sdhci_gl9763e = { .suspend = sdhci_cqhci_gli_suspend, #endif .add_host = gl9763e_add_host, + .priv_size = sizeof(struct gli_host), }; -- 2.27.0