]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EmbeddedPkg/DwEmmc: Adjust FIFO threshold
authorJun Nie <jun.nie@linaro.org>
Fri, 7 Jul 2017 09:21:37 +0000 (17:21 +0800)
committerLeif Lindholm <leif.lindholm@linaro.org>
Mon, 17 Jul 2017 16:54:46 +0000 (17:54 +0100)
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 <jun.nie@linaro.org>
Acked-by: Haojian Zhuang <haojian.zhuang@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmc.h
EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.c
EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.inf
EmbeddedPkg/EmbeddedPkg.dec

index 055f1e05d1f6e2399c2205ec3a29f5e24feea5ee..90c767622defe734b3fd8d494d3068a83154be7c 100644 (file)
 #define DWEMMC_RINTSTS          ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x044)\r
 #define DWEMMC_STATUS           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x048)\r
 #define DWEMMC_FIFOTH           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x04c)\r
+#define DWEMMC_TCBCNT           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x05c)\r
+#define DWEMMC_TBBCNT           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x060)\r
 #define DWEMMC_DEBNCE           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x064)\r
+#define DWEMMC_HCON             ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x070)\r
 #define DWEMMC_UHSREG           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x074)\r
 #define DWEMMC_BMOD             ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x080)\r
 #define DWEMMC_DBADDR           ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x088)\r
@@ -47,6 +50,7 @@
 #define DWEMMC_DSCADDR          ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x094)\r
 #define DWEMMC_BUFADDR          ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0x098)\r
 #define DWEMMC_CARDTHRCTL       ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0X100)\r
+#define DWEMMC_DATA             ((UINT32)PcdGet32 (PcdDwEmmcDxeBaseAddress) + 0X200)\r
 \r
 #define CMD_UPDATE_CLK                          0x80202000\r
 #define CMD_START_BIT                           (1 << 31)\r
 #define DWEMMC_CARD_RD_THR(x)                   ((x & 0xfff) << 16)\r
 #define DWEMMC_CARD_RD_THR_EN                   (1 << 0)\r
 \r
+#define DWEMMC_GET_HDATA_WIDTH(x)               (((x) >> 7) & 0x7)\r
+\r
 #endif  // __DWEMMC_H__\r
index bb26b69fd16b89ff89aea72af95191ebb59224e5..0437e30f940f00ea60a86b12308a5f93a13000c9 100644 (file)
@@ -415,6 +415,47 @@ DwEmmcReceiveResponse (
   return EFI_SUCCESS;\r
 }\r
 \r
+VOID\r
+DwEmmcAdjustFifoThreshold (\r
+  VOID\r
+  )\r
+{\r
+  /* DMA multiple transaction size map to reg value as array index */\r
+  CONST UINT32 BurstSize[] = {1, 4, 8, 16, 32, 64, 128, 256};\r
+  UINT32 BlkDepthInFifo, FifoThreshold, FifoWidth, FifoDepth;\r
+  UINT32 BlkSize = DWEMMC_BLOCK_SIZE, Idx = 0, RxWatermark = 1, TxWatermark, TxWatermarkInvers;\r
+\r
+  /* Skip FIFO adjustment if we do not have platform FIFO depth info */\r
+  FifoDepth = PcdGet32 (PcdDwEmmcDxeFifoDepth);\r
+  if (!FifoDepth) {\r
+    return;\r
+  }\r
+\r
+  TxWatermark = FifoDepth / 2;\r
+  TxWatermarkInvers = FifoDepth - TxWatermark;\r
+\r
+  FifoWidth = DWEMMC_GET_HDATA_WIDTH (MmioRead32 (DWEMMC_HCON));\r
+  if (!FifoWidth) {\r
+    FifoWidth = 2;\r
+  } else if (FifoWidth == 2) {\r
+    FifoWidth = 8;\r
+  } else {\r
+    FifoWidth = 4;\r
+  }\r
+\r
+  BlkDepthInFifo = BlkSize / FifoWidth;\r
+\r
+  Idx = ARRAY_SIZE (BurstSize) - 1;\r
+  while (Idx && ((BlkDepthInFifo % BurstSize[Idx]) || (TxWatermarkInvers % BurstSize[Idx]))) {\r
+    Idx--;\r
+  }\r
+\r
+  RxWatermark = BurstSize[Idx] - 1;\r
+  FifoThreshold = DWEMMC_DMA_BURST_SIZE (Idx) | DWEMMC_FIFO_TWMARK (TxWatermark)\r
+           | DWEMMC_FIFO_RWMARK (RxWatermark);\r
+  MmioWrite32 (DWEMMC_FIFOTH, FifoThreshold);\r
+}\r
+\r
 EFI_STATUS\r
 PrepareDmaData (\r
   IN DWEMMC_IDMAC_DESCRIPTOR*    IdmacDesc,\r
@@ -633,6 +674,7 @@ DwEmmcDxeInitialize (
 \r
   Handle = NULL;\r
 \r
+  DwEmmcAdjustFifoThreshold ();\r
   gpIdmacDesc = (DWEMMC_IDMAC_DESCRIPTOR *)AllocatePages (DWEMMC_MAX_DESC_PAGES);\r
   if (gpIdmacDesc == NULL) {\r
     return EFI_BUFFER_TOO_SMALL;\r
index 99b4f990f67bb6c800c0e9071f5851dd286a6cbc..bc4413ecf1e4b3effb264e1ca34692a045bcac41 100644 (file)
@@ -49,6 +49,7 @@
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeBaseAddress\r
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz\r
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeMaxClockFreqInHz\r
+  gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeFifoDepth\r
 \r
 [Depex]\r
   TRUE\r
index 3cb30a49cf3a8e440525824565a8019f98e6b75b..4cd528aa3dfbde4ce5f81229dd26c51e16ca5370 100644 (file)
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeBaseAddress|0x0|UINT32|0x00000035\r
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz|0x0|UINT32|0x00000036\r
   gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeMaxClockFreqInHz|0x0|UINT32|0x00000037\r
+  gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeFifoDepth|0x0|UINT32|0x00000038\r
 \r
   #\r
   # Android FastBoot\r