]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - include/sdhci.h
mmc: sdhci: Fix potential ADMA descriptor table overflow
[thirdparty/u-boot.git] / include / sdhci.h
index 24b4599b857d217ad12963a8107bb610423075b4..2dd13b4c714a5c1d85c89aa0351a1303db0efcbb 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/bitops.h>
 #include <linux/types.h>
+#include <linux/kernel.h>
 #include <asm/io.h>
 #include <mmc.h>
 #include <asm/gpio.h>
@@ -57,6 +58,7 @@
 #define SDHCI_PRESENT_STATE    0x24
 #define  SDHCI_CMD_INHIBIT     BIT(0)
 #define  SDHCI_DATA_INHIBIT    BIT(1)
+#define  SDHCI_DAT_ACTIVE      BIT(2)
 #define  SDHCI_DOING_WRITE     BIT(8)
 #define  SDHCI_DOING_READ      BIT(9)
 #define  SDHCI_SPACE_AVAILABLE BIT(10)
 #define  SDHCI_SUPPORT_SDR50   0x00000001
 #define  SDHCI_SUPPORT_SDR104  0x00000002
 #define  SDHCI_SUPPORT_DDR50   0x00000004
+#define  SDHCI_SUPPORT_HS400   BIT(31)
 #define  SDHCI_USE_SDR50_TUNING        0x00002000
 
 #define  SDHCI_CLOCK_MUL_MASK  0x00FF0000
 #define SDHCI_QUIRK_USE_WIDE8          (1 << 8)
 #define SDHCI_QUIRK_NO_1_8_V           (1 << 9)
 #define SDHCI_QUIRK_SUPPORT_SINGLE     (1 << 10)
+/* Capability register bit-63 indicates HS400 support */
+#define SDHCI_QUIRK_CAPS_BIT63_FOR_HS400       BIT(11)
 
 /* to make gcc happy */
 struct sdhci_host;
@@ -272,6 +277,8 @@ struct sdhci_ops {
        void    (*set_clock)(struct sdhci_host *host, u32 div);
        int (*platform_execute_tuning)(struct mmc *host, u8 opcode);
        int (*set_delay)(struct sdhci_host *host);
+       /* Callback function to set DLL clock configuration */
+       int (*config_dll)(struct sdhci_host *host, u32 clock, bool enable);
        int     (*deferred_probe)(struct sdhci_host *host);
 
        /**
@@ -285,6 +292,11 @@ struct sdhci_ops {
         * Return: 0 if successful, -ve on error
         */
        int     (*set_enhanced_strobe)(struct sdhci_host *host);
+
+#ifdef CONFIG_MMC_SDHCI_ADMA_HELPERS
+       void    (*adma_write_desc)(struct sdhci_host *host, void **desc,
+                                  dma_addr_t addr, int len, bool end);
+#endif
 };
 
 #define ADMA_MAX_LEN   65532
@@ -293,8 +305,8 @@ struct sdhci_ops {
 #else
 #define ADMA_DESC_LEN  8
 #endif
-#define ADMA_TABLE_NO_ENTRIES (CONFIG_SYS_MMC_MAX_BLK_COUNT * \
-                              MMC_MAX_BLOCK_LEN) / ADMA_MAX_LEN
+#define ADMA_TABLE_NO_ENTRIES DIV_ROUND_UP(CONFIG_SYS_MMC_MAX_BLK_COUNT * \
+                             MMC_MAX_BLOCK_LEN, ADMA_MAX_LEN)
 
 #define ADMA_TABLE_SZ (ADMA_TABLE_NO_ENTRIES * ADMA_DESC_LEN)
 
@@ -520,8 +532,11 @@ extern const struct dm_mmc_ops sdhci_ops;
 #else
 #endif
 
+void sdhci_adma_write_desc(struct sdhci_host *host, void **next_desc,
+                          dma_addr_t addr, int len, bool end);
 struct sdhci_adma_desc *sdhci_adma_init(void);
-void sdhci_prepare_adma_table(struct sdhci_adma_desc *table,
-                             struct mmc_data *data, dma_addr_t addr);
+void sdhci_prepare_adma_table(struct sdhci_host *host,
+                             struct sdhci_adma_desc *table,
+                             struct mmc_data *data, dma_addr_t start_addr);
 
 #endif /* __SDHCI_HW_H */