#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
#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
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
\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