]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - include/mmc.h
Merge branch 'u-boot-samsung/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / include / mmc.h
index e0a56d9d23b76501f1d378ce79ec9f2702762cfa..f88f672f111fee172e655167b0284e5b7521774d 100644 (file)
@@ -14,7 +14,7 @@
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
 #define _MMC_H_
 
 #include <linux/list.h>
+#include <linux/compiler.h>
 
 #define SD_VERSION_SD  0x20000
-#define SD_VERSION_2   (SD_VERSION_SD | 0x20)
-#define SD_VERSION_1_0 (SD_VERSION_SD | 0x10)
-#define SD_VERSION_1_10        (SD_VERSION_SD | 0x1a)
+#define SD_VERSION_3   (SD_VERSION_SD | 0x300)
+#define SD_VERSION_2   (SD_VERSION_SD | 0x200)
+#define SD_VERSION_1_0 (SD_VERSION_SD | 0x100)
+#define SD_VERSION_1_10        (SD_VERSION_SD | 0x10a)
 #define MMC_VERSION_MMC                0x10000
 #define MMC_VERSION_UNKNOWN    (MMC_VERSION_MMC)
-#define MMC_VERSION_1_2                (MMC_VERSION_MMC | 0x12)
-#define MMC_VERSION_1_4                (MMC_VERSION_MMC | 0x14)
-#define MMC_VERSION_2_2                (MMC_VERSION_MMC | 0x22)
-#define MMC_VERSION_3          (MMC_VERSION_MMC | 0x30)
-#define MMC_VERSION_4          (MMC_VERSION_MMC | 0x40)
+#define MMC_VERSION_1_2                (MMC_VERSION_MMC | 0x102)
+#define MMC_VERSION_1_4                (MMC_VERSION_MMC | 0x104)
+#define MMC_VERSION_2_2                (MMC_VERSION_MMC | 0x202)
+#define MMC_VERSION_3          (MMC_VERSION_MMC | 0x300)
+#define MMC_VERSION_4          (MMC_VERSION_MMC | 0x400)
+#define MMC_VERSION_4_1                (MMC_VERSION_MMC | 0x401)
+#define MMC_VERSION_4_2                (MMC_VERSION_MMC | 0x402)
+#define MMC_VERSION_4_3                (MMC_VERSION_MMC | 0x403)
+#define MMC_VERSION_4_41       (MMC_VERSION_MMC | 0x429)
+#define MMC_VERSION_4_5                (MMC_VERSION_MMC | 0x405)
 
 #define MMC_MODE_HS            0x001
 #define MMC_MODE_HS_52MHz      0x010
 #define MMC_MODE_4BIT          0x100
 #define MMC_MODE_8BIT          0x200
 #define MMC_MODE_SPI           0x400
+#define MMC_MODE_HC            0x800
+
+#define MMC_MODE_MASK_WIDTH_BITS (MMC_MODE_4BIT | MMC_MODE_8BIT)
+#define MMC_MODE_WIDTH_BITS_SHIFT 8
 
 #define SD_DATA_4BIT   0x00040000
 
@@ -57,6 +68,7 @@
 #define UNUSABLE_ERR           -17 /* Unusable Card */
 #define COMM_ERR               -18 /* Communications Error */
 #define TIMEOUT                        -19
+#define IN_PROGRESS            -20 /* operation is in progress */
 
 #define MMC_CMD_GO_IDLE_STATE          0
 #define MMC_CMD_SEND_OP_COND           1
 #define MMC_CMD_READ_MULTIPLE_BLOCK    18
 #define MMC_CMD_WRITE_SINGLE_BLOCK     24
 #define MMC_CMD_WRITE_MULTIPLE_BLOCK   25
+#define MMC_CMD_ERASE_GROUP_START      35
+#define MMC_CMD_ERASE_GROUP_END                36
+#define MMC_CMD_ERASE                  38
 #define MMC_CMD_APP_CMD                        55
 #define MMC_CMD_SPI_READ_OCR           58
 #define MMC_CMD_SPI_CRC_ON_OFF         59
+#define MMC_CMD_RES_MAN                        62
+
+#define MMC_CMD62_ARG1                 0xefac62ec
+#define MMC_CMD62_ARG2                 0xcbaea7
+
 
 #define SD_CMD_SEND_RELATIVE_ADDR      3
 #define SD_CMD_SWITCH_FUNC             6
 #define SD_CMD_SEND_IF_COND            8
 
 #define SD_CMD_APP_SET_BUS_WIDTH       6
+#define SD_CMD_ERASE_WR_BLK_START      32
+#define SD_CMD_ERASE_WR_BLK_END                33
 #define SD_CMD_APP_SEND_OP_COND                41
 #define SD_CMD_APP_SEND_SCR            51
 
 #define MMC_HS_TIMING          0x00000100
 #define MMC_HS_52MHZ           0x2
 
-#define OCR_BUSY       0x80000000
-#define OCR_HCS                0x40000000
+#define OCR_BUSY               0x80000000
+#define OCR_HCS                        0x40000000
 #define OCR_VOLTAGE_MASK       0x007FFF80
 #define OCR_ACCESS_MODE                0x60000000
 
+#define SECURE_ERASE           0x80000000
+
 #define MMC_STATUS_MASK                (~0x0206BF7F)
-#define MMC_STATUS_RDY_FOR_DATA (1<<8)
-#define MMC_STATUS_CURR_STATE  (0xf<<9)
+#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
+#define MMC_STATUS_CURR_STATE  (0xf << 9)
+#define MMC_STATUS_ERROR       (1 << 19)
+
+#define MMC_STATE_PRG          (7 << 9)
 
 #define MMC_VDD_165_195                0x00000080      /* VDD voltage 1.65 - 1.95 */
 #define MMC_VDD_20_21          0x00000100      /* VDD voltage 2.0 ~ 2.1 */
 /*
  * EXT_CSD fields
  */
-
-#define EXT_CSD_BUS_WIDTH      183     /* R/W */
-#define EXT_CSD_HS_TIMING      185     /* R/W */
-#define EXT_CSD_CARD_TYPE      196     /* RO */
-#define EXT_CSD_REV            192     /* RO */
-#define EXT_CSD_SEC_CNT                212     /* RO, 4 bytes */
+#define EXT_CSD_PARTITIONING_SUPPORT   160     /* RO */
+#define EXT_CSD_ERASE_GROUP_DEF                175     /* R/W */
+#define EXT_CSD_BOOT_BUS_WIDTH         177
+#define EXT_CSD_PART_CONF              179     /* R/W */
+#define EXT_CSD_BUS_WIDTH              183     /* R/W */
+#define EXT_CSD_HS_TIMING              185     /* R/W */
+#define EXT_CSD_REV                    192     /* RO */
+#define EXT_CSD_CARD_TYPE              196     /* RO */
+#define EXT_CSD_SEC_CNT                        212     /* RO, 4 bytes */
+#define EXT_CSD_HC_ERASE_GRP_SIZE      224     /* RO */
+#define EXT_CSD_BOOT_MULT              226     /* RO */
 
 /*
  * EXT_CSD field definitions
  */
 
-#define EXT_CSD_CMD_SET_NORMAL         (1<<0)
-#define EXT_CSD_CMD_SET_SECURE         (1<<1)
-#define EXT_CSD_CMD_SET_CPSECURE       (1<<2)
+#define EXT_CSD_CMD_SET_NORMAL         (1 << 0)
+#define EXT_CSD_CMD_SET_SECURE         (1 << 1)
+#define EXT_CSD_CMD_SET_CPSECURE       (1 << 2)
 
-#define EXT_CSD_CARD_TYPE_26   (1<<0)  /* Card can run at 26MHz */
-#define EXT_CSD_CARD_TYPE_52   (1<<1)  /* Card can run at 52MHz */
+#define EXT_CSD_CARD_TYPE_26   (1 << 0)        /* Card can run at 26MHz */
+#define EXT_CSD_CARD_TYPE_52   (1 << 1)        /* Card can run at 52MHz */
 
 #define EXT_CSD_BUS_WIDTH_1    0       /* Card is in 1 bit mode */
 #define EXT_CSD_BUS_WIDTH_4    1       /* Card is in 4 bit mode */
 #define EXT_CSD_BUS_WIDTH_8    2       /* Card is in 8 bit mode */
 
+#define EXT_CSD_BOOT_ACK_ENABLE                        (1 << 6)
+#define EXT_CSD_BOOT_PARTITION_ENABLE          (1 << 3)
+#define EXT_CSD_PARTITION_ACCESS_ENABLE                (1 << 0)
+#define EXT_CSD_PARTITION_ACCESS_DISABLE       (0 << 0)
+
+#define EXT_CSD_BOOT_ACK(x)            (x << 6)
+#define EXT_CSD_BOOT_PART_NUM(x)       (x << 3)
+#define EXT_CSD_PARTITION_ACCESS(x)    (x << 0)
+
+
 #define R1_ILLEGAL_COMMAND             (1 << 22)
 #define R1_APP_CMD                     (1 << 5)
 
 #define MMC_RSP_PRESENT (1 << 0)
-#define MMC_RSP_136     (1 << 1)                /* 136 bit response */
-#define MMC_RSP_CRC     (1 << 2)                /* expect valid crc */
-#define MMC_RSP_BUSY    (1 << 3)                /* card may send busy */
-#define MMC_RSP_OPCODE  (1 << 4)                /* response contains opcode */
+#define MMC_RSP_136    (1 << 1)                /* 136 bit response */
+#define MMC_RSP_CRC    (1 << 2)                /* expect valid crc */
+#define MMC_RSP_BUSY   (1 << 3)                /* card may send busy */
+#define MMC_RSP_OPCODE (1 << 4)                /* response contains opcode */
 
-#define MMC_RSP_NONE    (0)
-#define MMC_RSP_R1      (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
+#define MMC_RSP_NONE   (0)
+#define MMC_RSP_R1     (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
 #define MMC_RSP_R1b    (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
                        MMC_RSP_BUSY)
-#define MMC_RSP_R2      (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
-#define MMC_RSP_R3      (MMC_RSP_PRESENT)
-#define MMC_RSP_R4      (MMC_RSP_PRESENT)
-#define MMC_RSP_R5      (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
-#define MMC_RSP_R6      (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
-#define MMC_RSP_R7      (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
-
+#define MMC_RSP_R2     (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
+#define MMC_RSP_R3     (MMC_RSP_PRESENT)
+#define MMC_RSP_R4     (MMC_RSP_PRESENT)
+#define MMC_RSP_R5     (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
+#define MMC_RSP_R6     (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
+#define MMC_RSP_R7     (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
+
+#define MMCPART_NOAVAILABLE    (0xff)
+#define PART_ACCESS_MASK       (0x7)
+#define PART_SUPPORT           (0x1)
+
+/* Maximum block size for MMC */
+#define MMC_MAX_BLOCK_LEN      512
+
+/* The number of MMC physical partitions.  These consist of:
+ * boot partitions (2), general purpose partitions (4) in MMC v4.4.
+ */
+#define MMC_NUM_BOOT_PARTITION 2
 
 struct mmc_cid {
        unsigned long psn;
@@ -188,62 +241,11 @@ struct mmc_cid {
        char pnm[7];
 };
 
-/*
- * WARNING!
- *
- * This structure is used by atmel_mci.c only.
- * It works for the AVR32 architecture but NOT
- * for ARM/AT91 architectures.
- * Its use is highly depreciated.
- * After the atmel_mci.c driver for AVR32 has
- * been replaced this structure will be removed.
- */
-struct mmc_csd
-{
-       u8      csd_structure:2,
-               spec_vers:4,
-               rsvd1:2;
-       u8      taac;
-       u8      nsac;
-       u8      tran_speed;
-       u16     ccc:12,
-               read_bl_len:4;
-       u64     read_bl_partial:1,
-               write_blk_misalign:1,
-               read_blk_misalign:1,
-               dsr_imp:1,
-               rsvd2:2,
-               c_size:12,
-               vdd_r_curr_min:3,
-               vdd_r_curr_max:3,
-               vdd_w_curr_min:3,
-               vdd_w_curr_max:3,
-               c_size_mult:3,
-               sector_size:5,
-               erase_grp_size:5,
-               wp_grp_size:5,
-               wp_grp_enable:1,
-               default_ecc:2,
-               r2w_factor:3,
-               write_bl_len:4,
-               write_bl_partial:1,
-               rsvd3:5;
-       u8      file_format_grp:1,
-               copy:1,
-               perm_write_protect:1,
-               tmp_write_protect:1,
-               file_format:2,
-               ecc:2;
-       u8      crc:7;
-       u8      one:1;
-};
-
 struct mmc_cmd {
        ushort cmdidx;
        uint resp_type;
        uint cmdarg;
        uint response[4];
-       uint flags;
 };
 
 struct mmc_data {
@@ -262,6 +264,7 @@ struct mmc {
        void *priv;
        uint voltages;
        uint version;
+       uint has_init;
        uint f_min;
        uint f_max;
        int high_capacity;
@@ -274,18 +277,25 @@ struct mmc {
        uint csd[4];
        uint cid[4];
        ushort rca;
+       char part_config;
+       char part_num;
        uint tran_speed;
        uint read_bl_len;
        uint write_bl_len;
+       uint erase_grp_size;
        u64 capacity;
        block_dev_desc_t block_dev;
        int (*send_cmd)(struct mmc *mmc,
                        struct mmc_cmd *cmd, struct mmc_data *data);
        void (*set_ios)(struct mmc *mmc);
        int (*init)(struct mmc *mmc);
-#ifdef CONFIG_MMC_MBLOCK
+       int (*getcd)(struct mmc *mmc);
+       int (*getwp)(struct mmc *mmc);
        uint b_max;
-#endif
+       char op_cond_pending;   /* 1 if we are waiting on an op_cond command */
+       char init_in_progress;  /* 1 if we have done mmc_start_init() */
+       char preinit;           /* start init as early as possible */
+       uint op_cond_response;  /* the response byte from the last op_cond */
 };
 
 int mmc_register(struct mmc *mmc);
@@ -296,10 +306,44 @@ void mmc_set_clock(struct mmc *mmc, uint clock);
 struct mmc *find_mmc_device(int dev_num);
 int mmc_set_dev(int dev_num);
 void print_mmc_devices(char separator);
-int board_mmc_getcd(u8 *cd, struct mmc *mmc);
+int get_mmc_num(void);
+int board_mmc_getcd(struct mmc *mmc);
+int mmc_switch_part(int dev_num, unsigned int part_num);
+int mmc_getcd(struct mmc *mmc);
+int mmc_getwp(struct mmc *mmc);
+void spl_mmc_load(void) __noreturn;
+/* Function to change the size of boot partition and rpmb partitions */
+int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
+                                       unsigned long rpmbsize);
+/* Function to send commands to open/close the specified boot partition */
+int mmc_boot_part_access(struct mmc *mmc, u8 ack, u8 part_num, u8 access);
+
+/**
+ * Start device initialization and return immediately; it does not block on
+ * polling OCR (operation condition register) status.  Then you should call
+ * mmc_init, which would block on polling OCR status and complete the device
+ * initializatin.
+ *
+ * @param mmc  Pointer to a MMC device struct
+ * @return 0 on success, IN_PROGRESS on waiting for OCR status, <0 on error.
+ */
+int mmc_start_init(struct mmc *mmc);
+
+/**
+ * Set preinit flag of mmc device.
+ *
+ * This will cause the device to be pre-inited during mmc_initialize(),
+ * which may save boot time if the device is not accessed until later.
+ * Some eMMC devices take 200-300ms to init, but unfortunately they
+ * must be sent a series of commands to even get them to start preparing
+ * for operation.
+ *
+ * @param mmc          Pointer to a MMC device struct
+ * @param preinit      preinit flag value
+ */
+void mmc_set_preinit(struct mmc *mmc, int preinit);
 
 #ifdef CONFIG_GENERIC_MMC
-int atmel_mci_init(void *regs);
 #define mmc_host_is_spi(mmc)   ((mmc)->host_caps & MMC_MODE_SPI)
 struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
 #else