From patchwork Fri Jun 30 03:02:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Nie X-Patchwork-Id: 106659 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp1800305qge; Thu, 29 Jun 2017 20:03:39 -0700 (PDT) X-Received: by 10.237.33.78 with SMTP id 72mr22012460qtc.99.1498791818962; Thu, 29 Jun 2017 20:03:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1498791818; cv=none; d=google.com; s=arc-20160816; b=eMIcI7Ko+BKIAdVxT0D3qydnT8STJJJQLEleoO3fYSVovgj+kplVwwfvSnSW53JGSH gOimT76sWOvBlAEgF73g480yjg9Atn7u+lgm+7euUhGsfdTktZDCsuDbRyOL05k8RwgZ alEb280PmILqN0Ok9Amas1Nb4cOF0bg+sdUtU2JNtywUws1r7DR7PbHPOlY9+dY3V8hk c1h8TOx+g0tRZlqr49hlOy/y9pMvplE4wzWFs4A42lHEz7cexbUP8zhSvHqtfojOsqqw 889ryOO1Kpx+8pI7OeaSWMFRut77DCMA708o4oD+fAghcHo+Rm6CRtIahWnLHb/sglmu OcFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:references:in-reply-to:message-id :date:to:from:delivered-to:arc-authentication-results; bh=K5QI4Px+EkGBeb+QmWb+xzFyd6zlTyRobMVd5C8yFMk=; b=HUngUmMXh02ke4wF49MLamhLbnySq7TpZbcmragfj+6eV+DZCRVCCC0v+Ero9f/LGV xjU3L2GMdnudbq65J2k0JnQzHUFQrRiflE6A4E042sjTvQNf1CQaRAKB6UbVKr+Vj8b5 ZP+CUA3IqXmW9bCErvI45MzEBy7IjR1hZHGOUo2xynVyd6aWc5MhRanMsWqpTw6/T1as nsgCGVzvVvqYLcVMmTxSYwVrwns5qf3NvcA1MHVxo/B8bAOFs02+gkK4wZJar3ZOwZei tmtzyvn391xKycHuQJ1u054xsYOLSRKbZHjyufpb9cGIgNzfrwaQAo5bVq1L2fh1/NGr vb3A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=linaro-uefi-bounces@lists.linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id z73si6270849qka.209.2017.06.29.20.03.38; Thu, 29 Jun 2017 20:03:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=linaro-uefi-bounces@lists.linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 9E13660A6D; Fri, 30 Jun 2017 03:03:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SORBS_SPAM, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 7230E60A12; Fri, 30 Jun 2017 03:03:32 +0000 (UTC) X-Original-To: linaro-uefi@lists.linaro.org Delivered-To: linaro-uefi@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 76FCF60A51; Fri, 30 Jun 2017 03:03:29 +0000 (UTC) Received: from mail-pg0-f51.google.com (mail-pg0-f51.google.com [74.125.83.51]) by lists.linaro.org (Postfix) with ESMTPS id 9DCAE6099C for ; Fri, 30 Jun 2017 03:03:17 +0000 (UTC) Received: by mail-pg0-f51.google.com with SMTP id t186so57076479pgb.1 for ; Thu, 29 Jun 2017 20:03:17 -0700 (PDT) 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:in-reply-to :references; bh=i96yU1v0JCDIf+Ay1jIVdPlhwD0fHH/ZodZpGbLYyrQ=; b=kvQQgm3hP1jydqMFmNzdeuTP/IFIp+hfYz/h1ix9l6/1OAlASxiwck3G6R4Htltuj9 9cAqCkxfnG9GmWYx8NCiOXrhmkBlHpT0xVWNygvsCvIrbh5rbW8BsFLyqxPOVivzRVwQ mTQ3JIVWtBv/WB3TnhtFhsoreSthMQ9jVNGVQ66vQc4DpAnX+rpChBwS8dzKFCtQTXhq RHVhbSRzRGc85kr7lKtJ4BtodtAiI5jrKLW5A+1AT9h1Ssc7ePMKTgiAhJRtOnwGnCMv YaFn9bRmT18ZQVZe+2AjkLbr9aRSjwAf+bB+jQLULmcFk5D29qG3vq5wY1ZnPkko8rox pO6Q== X-Gm-Message-State: AKS2vOyg+PVaznF3nyrNrZj0Y5aR9NodLSS9fmf4YNp1jc25IkID26u3 vII8j0BAAlcjApxuXv4= X-Received: by 10.98.80.198 with SMTP id g67mr20394794pfj.146.1498791796812; Thu, 29 Jun 2017 20:03:16 -0700 (PDT) Received: from localhost.localdomain ([113.53.228.63]) by smtp.gmail.com with ESMTPSA id u2sm17084885pgn.28.2017.06.29.20.03.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 Jun 2017 20:03:16 -0700 (PDT) From: Jun Nie To: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, haojian.zhuang@linaro.org, linaro-uefi@lists.linaro.org Date: Fri, 30 Jun 2017 11:02:57 +0800 Message-Id: <1498791777-16122-2-git-send-email-jun.nie@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1498791777-16122-1-git-send-email-jun.nie@linaro.org> References: <1498791777-16122-1-git-send-email-jun.nie@linaro.org> Cc: jason.liu@linaro.org, shawn.guo@linaro.org Subject: [Linaro-uefi] [PATCH 2/2] Drivers/Mmc/DwEmmc: Adjust FIFO threshold X-BeenThere: linaro-uefi@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "For discussions about Linaro-related UEFI development. Not a substitute for edk2-devel." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linaro-uefi-bounces@lists.linaro.org Sender: "Linaro-uefi" Adjust FIFO threshold according to FIFO depth. Skip the adjustment if we do not have FIFO depth info. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jun Nie --- Drivers/Mmc/DwEmmcDxe/DwEmmc.h | 6 +++++ Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.c | 54 +++++++++++++++++++++++++++++++++++++ Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.dec | 1 + Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.inf | 1 + 4 files changed, 62 insertions(+) diff --git a/Drivers/Mmc/DwEmmcDxe/DwEmmc.h b/Drivers/Mmc/DwEmmcDxe/DwEmmc.h index 055f1e0..2b41539 100644 --- a/Drivers/Mmc/DwEmmcDxe/DwEmmc.h +++ b/Drivers/Mmc/DwEmmcDxe/DwEmmc.h @@ -38,7 +38,10 @@ #define DWEMMC_RINTSTS ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x044) #define DWEMMC_STATUS ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x048) #define DWEMMC_FIFOTH ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x04c) +#define DWEMMC_TCBCNT ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x05c) +#define DWEMMC_TBBCNT ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x060) #define DWEMMC_DEBNCE ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x064) +#define DWEMMC_HCON ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x070) #define DWEMMC_UHSREG ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x074) #define DWEMMC_BMOD ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x080) #define DWEMMC_DBADDR ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x088) @@ -47,6 +50,7 @@ #define DWEMMC_DSCADDR ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x094) #define DWEMMC_BUFADDR ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x098) #define DWEMMC_CARDTHRCTL ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0X100) +#define DWEMMC_DATA ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0X200) #define CMD_UPDATE_CLK 0x80202000 #define CMD_START_BIT (1 << 31) @@ -124,4 +128,6 @@ #define DWEMMC_CARD_RD_THR(x) ((x & 0xfff) << 16) #define DWEMMC_CARD_RD_THR_EN (1 << 0) +#define DWEMMC_GET_HDATA_WIDTH(x) (((x)>>7) & 0x7) + #endif // __DWEMMC_H__ diff --git a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.c b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.c index c67dd0d..8299c13 100644 --- a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.c +++ b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.c @@ -415,6 +415,59 @@ DwEmmcReceiveResponse ( return EFI_SUCCESS; } +VOID DwEmmcAdjustFifoth( + VOID + ) +{ + const UINT32 Mszs[] = {1, 4, 8, 16, 32, 64, 128, 256}; + UINT32 BlkSizeDepth, Fifoth, FifoWidth, FifoDepth; + UINT32 BlkSize = 512, Msize = 0, RxWmark = 1, TxWmark, TxWmarkInvers; + UINT32 Idx = ARRAY_SIZE(Mszs) - 1; + + /* Skip FIFO adjustment if we do not have platform FIFO depth info */ + FifoDepth = PcdGet32 (PcdDwEmmcDxeFifoDepth); + if (!FifoDepth) + return; + + TxWmark = FifoDepth / 2; + TxWmarkInvers = FifoDepth - TxWmark; + + FifoWidth = DWEMMC_GET_HDATA_WIDTH(MmioRead32 (DWEMMC_HCON)); + if (!FifoWidth) { + FifoWidth = 2; + } else if (FifoWidth == 2) { + FifoWidth = 8; + } else { + FifoWidth = 4; + } + + BlkSizeDepth = BlkSize / FifoWidth; + + /* + * MSIZE is '1', + * if BlkSize is not a multiple of the FIFO width + */ + if (BlkSize % FifoWidth) { + goto done; + } + + do { + if (!((BlkSizeDepth % Mszs[Idx]) || (TxWmarkInvers % Mszs[Idx]))) { + Msize = Idx; + RxWmark = Mszs[Idx] - 1; + break; + } + } while (--Idx > 0); + /* + * If Idx is '0', it won't be tried + * Thus, initial values are uesed + */ + done: + Fifoth = DWEMMC_DMA_BURST_SIZE(Msize) | DWEMMC_FIFO_TWMARK(TxWmark) + | DWEMMC_FIFO_RWMARK(RxWmark); + MmioWrite32 (DWEMMC_FIFOTH, Fifoth); + } + EFI_STATUS PrepareDmaData ( IN DWEMMC_IDMAC_DESCRIPTOR* IdmacDesc, @@ -632,6 +685,7 @@ DwEmmcDxeInitialize ( Handle = NULL; + DwEmmcAdjustFifoth(); gpIdmacDesc = (DWEMMC_IDMAC_DESCRIPTOR *)AllocatePages (DWEMMC_MAX_DESC_PAGES); if (gpIdmacDesc == NULL) { return EFI_BUFFER_TOO_SMALL; diff --git a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.dec b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.dec index 7b84a9a..503899c 100644 --- a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.dec +++ b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.dec @@ -41,3 +41,4 @@ gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeBaseAddress|0x0|UINT32|0x00000001 gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz|0x0|UINT32|0x00000002 gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeMaxClockFrequencyInHz|0x0|UINT32|52000000 + gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeFifoDepth|0x0|UINT32|0 diff --git a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.inf b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.inf index 99176f1..7872c52 100644 --- a/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.inf +++ b/Drivers/Mmc/DwEmmcDxe/DwEmmcDxe.inf @@ -50,6 +50,7 @@ gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeBaseAddress gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeMaxClockFrequencyInHz + gDwEmmcDxeTokenSpaceGuid.PcdDwEmmcDxeFifoDepth [Depex] TRUE