mmc.h 13.8 KB
Newer Older
1
/*
2
 * Copyright 2008,2010 Freescale Semiconductor, Inc
A
Andy Fleming 已提交
3 4 5
 * Andy Fleming
 *
 * Based (loosely) on the Linux code
6
 *
7
 * SPDX-License-Identifier:	GPL-2.0+
8 9 10 11 12
 */

#ifndef _MMC_H_
#define _MMC_H_

A
Andy Fleming 已提交
13
#include <linux/list.h>
14
#include <linux/compiler.h>
M
Mateusz Zalega 已提交
15
#include <part.h>
A
Andy Fleming 已提交
16 17

#define SD_VERSION_SD	0x20000
18
#define SD_VERSION_3	(SD_VERSION_SD | 0x300)
19 20 21
#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)
A
Andy Fleming 已提交
22 23
#define MMC_VERSION_MMC		0x10000
#define MMC_VERSION_UNKNOWN	(MMC_VERSION_MMC)
24 25 26 27 28 29 30 31 32 33
#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)
M
Markus Niebel 已提交
34
#define MMC_VERSION_5_0		(MMC_VERSION_MMC | 0x500)
A
Andy Fleming 已提交
35

36 37 38 39 40 41
#define MMC_MODE_HS		(1 << 0)
#define MMC_MODE_HS_52MHz	(1 << 1)
#define MMC_MODE_4BIT		(1 << 2)
#define MMC_MODE_8BIT		(1 << 3)
#define MMC_MODE_SPI		(1 << 4)
#define MMC_MODE_HC		(1 << 5)
42
#define MMC_MODE_DDR_52MHz	(1 << 6)
43

A
Andy Fleming 已提交
44 45
#define SD_DATA_4BIT	0x00040000

46
#define IS_SD(x) (x->version & SD_VERSION_SD)
A
Andy Fleming 已提交
47 48 49 50 51 52 53 54

#define MMC_DATA_READ		1
#define MMC_DATA_WRITE		2

#define NO_CARD_ERR		-16 /* No SD/MMC card inserted */
#define UNUSABLE_ERR		-17 /* Unusable Card */
#define COMM_ERR		-18 /* Communications Error */
#define TIMEOUT			-19
55
#define IN_PROGRESS		-20 /* operation is in progress */
56
#define SWITCH_ERR		-21 /* Card reports failure to switch mode */
A
Andy Fleming 已提交
57

58 59 60 61 62
#define MMC_CMD_GO_IDLE_STATE		0
#define MMC_CMD_SEND_OP_COND		1
#define MMC_CMD_ALL_SEND_CID		2
#define MMC_CMD_SET_RELATIVE_ADDR	3
#define MMC_CMD_SET_DSR			4
A
Andy Fleming 已提交
63
#define MMC_CMD_SWITCH			6
64
#define MMC_CMD_SELECT_CARD		7
A
Andy Fleming 已提交
65
#define MMC_CMD_SEND_EXT_CSD		8
66 67
#define MMC_CMD_SEND_CSD		9
#define MMC_CMD_SEND_CID		10
A
Andy Fleming 已提交
68
#define MMC_CMD_STOP_TRANSMISSION	12
69 70 71 72
#define MMC_CMD_SEND_STATUS		13
#define MMC_CMD_SET_BLOCKLEN		16
#define MMC_CMD_READ_SINGLE_BLOCK	17
#define MMC_CMD_READ_MULTIPLE_BLOCK	18
73
#define MMC_CMD_SET_BLOCK_COUNT         23
A
Andy Fleming 已提交
74 75
#define MMC_CMD_WRITE_SINGLE_BLOCK	24
#define MMC_CMD_WRITE_MULTIPLE_BLOCK	25
76 77 78
#define MMC_CMD_ERASE_GROUP_START	35
#define MMC_CMD_ERASE_GROUP_END		36
#define MMC_CMD_ERASE			38
79
#define MMC_CMD_APP_CMD			55
T
Thomas Chou 已提交
80 81
#define MMC_CMD_SPI_READ_OCR		58
#define MMC_CMD_SPI_CRC_ON_OFF		59
82 83 84 85 86
#define MMC_CMD_RES_MAN			62

#define MMC_CMD62_ARG1			0xefac62ec
#define MMC_CMD62_ARG2			0xcbaea7

87 88

#define SD_CMD_SEND_RELATIVE_ADDR	3
A
Andy Fleming 已提交
89
#define SD_CMD_SWITCH_FUNC		6
90 91 92
#define SD_CMD_SEND_IF_COND		8

#define SD_CMD_APP_SET_BUS_WIDTH	6
93 94
#define SD_CMD_ERASE_WR_BLK_START	32
#define SD_CMD_ERASE_WR_BLK_END		33
95
#define SD_CMD_APP_SEND_OP_COND		41
A
Andy Fleming 已提交
96 97 98 99 100 101
#define SD_CMD_APP_SEND_SCR		51

/* SCR definitions in different words */
#define SD_HIGHSPEED_BUSY	0x00020000
#define SD_HIGHSPEED_SUPPORTED	0x00020000

102 103
#define OCR_BUSY		0x80000000
#define OCR_HCS			0x40000000
104 105
#define OCR_VOLTAGE_MASK	0x007FFF80
#define OCR_ACCESS_MODE		0x60000000
A
Andy Fleming 已提交
106

107 108
#define SECURE_ERASE		0x80000000

109
#define MMC_STATUS_MASK		(~0x0206BF7F)
110
#define MMC_STATUS_SWITCH_ERROR	(1 << 7)
111 112
#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
#define MMC_STATUS_CURR_STATE	(0xf << 9)
113
#define MMC_STATUS_ERROR	(1 << 19)
114

115 116
#define MMC_STATE_PRG		(7 << 9)

A
Andy Fleming 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
#define MMC_VDD_165_195		0x00000080	/* VDD voltage 1.65 - 1.95 */
#define MMC_VDD_20_21		0x00000100	/* VDD voltage 2.0 ~ 2.1 */
#define MMC_VDD_21_22		0x00000200	/* VDD voltage 2.1 ~ 2.2 */
#define MMC_VDD_22_23		0x00000400	/* VDD voltage 2.2 ~ 2.3 */
#define MMC_VDD_23_24		0x00000800	/* VDD voltage 2.3 ~ 2.4 */
#define MMC_VDD_24_25		0x00001000	/* VDD voltage 2.4 ~ 2.5 */
#define MMC_VDD_25_26		0x00002000	/* VDD voltage 2.5 ~ 2.6 */
#define MMC_VDD_26_27		0x00004000	/* VDD voltage 2.6 ~ 2.7 */
#define MMC_VDD_27_28		0x00008000	/* VDD voltage 2.7 ~ 2.8 */
#define MMC_VDD_28_29		0x00010000	/* VDD voltage 2.8 ~ 2.9 */
#define MMC_VDD_29_30		0x00020000	/* VDD voltage 2.9 ~ 3.0 */
#define MMC_VDD_30_31		0x00040000	/* VDD voltage 3.0 ~ 3.1 */
#define MMC_VDD_31_32		0x00080000	/* VDD voltage 3.1 ~ 3.2 */
#define MMC_VDD_32_33		0x00100000	/* VDD voltage 3.2 ~ 3.3 */
#define MMC_VDD_33_34		0x00200000	/* VDD voltage 3.3 ~ 3.4 */
#define MMC_VDD_34_35		0x00400000	/* VDD voltage 3.4 ~ 3.5 */
#define MMC_VDD_35_36		0x00800000	/* VDD voltage 3.5 ~ 3.6 */

#define MMC_SWITCH_MODE_CMD_SET		0x00 /* Change the command set */
#define MMC_SWITCH_MODE_SET_BITS	0x01 /* Set bits in EXT_CSD byte
						addressed by index which are
						1 in value field */
#define MMC_SWITCH_MODE_CLEAR_BITS	0x02 /* Clear bits in EXT_CSD byte
						addressed by index, which are
						1 in value field */
#define MMC_SWITCH_MODE_WRITE_BYTE	0x03 /* Set target byte to value */

#define SD_SWITCH_CHECK		0
#define SD_SWITCH_SWITCH	1

/*
 * EXT_CSD fields
 */
150 151
#define EXT_CSD_ENH_START_ADDR		136	/* R/W */
#define EXT_CSD_ENH_SIZE_MULT		140	/* R/W */
152
#define EXT_CSD_GP_SIZE_MULT		143	/* R/W */
153
#define EXT_CSD_PARTITION_SETTING	155	/* R/W */
154
#define EXT_CSD_PARTITIONS_ATTRIBUTE	156	/* R/W */
155
#define EXT_CSD_MAX_ENH_SIZE_MULT	157	/* R */
L
Lei Wen 已提交
156
#define EXT_CSD_PARTITIONING_SUPPORT	160	/* RO */
157
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
158
#define EXT_CSD_RPMB_MULT		168	/* RO */
L
Lei Wen 已提交
159
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
160
#define EXT_CSD_BOOT_BUS_WIDTH		177
L
Lei Wen 已提交
161 162 163 164 165 166
#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 */
167
#define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
L
Lei Wen 已提交
168
#define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
169
#define EXT_CSD_BOOT_MULT		226	/* RO */
A
Andy Fleming 已提交
170 171 172 173 174

/*
 * EXT_CSD field definitions
 */

175 176 177
#define EXT_CSD_CMD_SET_NORMAL		(1 << 0)
#define EXT_CSD_CMD_SET_SECURE		(1 << 1)
#define EXT_CSD_CMD_SET_CPSECURE	(1 << 2)
A
Andy Fleming 已提交
178

179 180
#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 */
181 182 183 184
#define EXT_CSD_CARD_TYPE_DDR_1_8V	(1 << 2)
#define EXT_CSD_CARD_TYPE_DDR_1_2V	(1 << 3)
#define EXT_CSD_CARD_TYPE_DDR_52	(EXT_CSD_CARD_TYPE_DDR_1_8V \
					| EXT_CSD_CARD_TYPE_DDR_1_2V)
A
Andy Fleming 已提交
185 186 187 188

#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 */
189 190
#define EXT_CSD_DDR_BUS_WIDTH_4	5	/* Card is in 4 bit DDR mode */
#define EXT_CSD_DDR_BUS_WIDTH_8	6	/* Card is in 8 bit DDR mode */
191

192 193 194 195 196 197 198 199 200
#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)

201 202 203
#define EXT_CSD_BOOT_BUS_WIDTH_MODE(x)	(x << 3)
#define EXT_CSD_BOOT_BUS_WIDTH_RESET(x)	(x << 2)
#define EXT_CSD_BOOT_BUS_WIDTH_WIDTH(x)	(x)
204

205 206
#define EXT_CSD_PARTITION_SETTING_COMPLETED	(1 << 0)

207 208 209
#define EXT_CSD_ENH_USR		(1 << 0)	/* user data area is enhanced */
#define EXT_CSD_ENH_GP(x)	(1 << ((x)+1))	/* GP part (x+1) is enhanced */

210 211 212
#define R1_ILLEGAL_COMMAND		(1 << 22)
#define R1_APP_CMD			(1 << 5)

A
Andy Fleming 已提交
213
#define MMC_RSP_PRESENT (1 << 0)
214 215 216 217
#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 */
A
Andy Fleming 已提交
218

219 220
#define MMC_RSP_NONE	(0)
#define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
A
Andy Fleming 已提交
221 222
#define MMC_RSP_R1b	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
			MMC_RSP_BUSY)
223 224 225 226 227 228
#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)
A
Andy Fleming 已提交
229

230 231 232
#define MMCPART_NOAVAILABLE	(0xff)
#define PART_ACCESS_MASK	(0x7)
#define PART_SUPPORT		(0x1)
233
#define ENHNCD_SUPPORT		(0x2)
234
#define PART_ENH_ATTRIB		(0x1f)
235

236 237 238
/* Maximum block size for MMC */
#define MMC_MAX_BLOCK_LEN	512

239 240 241 242
/* 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
243
#define MMC_PART_RPMB           3       /* RPMB partition number */
244

245 246 247 248 249 250 251 252 253
struct mmc_cid {
	unsigned long psn;
	unsigned short oid;
	unsigned char mid;
	unsigned char prv;
	unsigned char mdt;
	char pnm[7];
};

A
Andy Fleming 已提交
254 255 256 257
struct mmc_cmd {
	ushort cmdidx;
	uint resp_type;
	uint cmdarg;
258
	uint response[4];
A
Andy Fleming 已提交
259 260 261 262 263 264 265 266 267 268 269 270
};

struct mmc_data {
	union {
		char *dest;
		const char *src; /* src buffers don't get written to */
	};
	uint flags;
	uint blocks;
	uint blocksize;
};

271 272 273 274 275 276 277 278 279 280 281 282
/* forward decl. */
struct mmc;

struct mmc_ops {
	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);
	int (*getcd)(struct mmc *mmc);
	int (*getwp)(struct mmc *mmc);
};

283 284 285 286 287 288 289 290 291 292 293 294
struct mmc_config {
	const char *name;
	const struct mmc_ops *ops;
	uint host_caps;
	uint voltages;
	uint f_min;
	uint f_max;
	uint b_max;
	unsigned char part_type;
};

/* TODO struct mmc should be in mmc_private but it's hard to fix right now */
A
Andy Fleming 已提交
295 296
struct mmc {
	struct list_head link;
297
	const struct mmc_config *cfg;	/* provided configuration */
A
Andy Fleming 已提交
298
	uint version;
299
	void *priv;
300
	uint has_init;
A
Andy Fleming 已提交
301 302 303 304 305
	int high_capacity;
	uint bus_width;
	uint clock;
	uint card_caps;
	uint ocr;
M
Markus Niebel 已提交
306 307
	uint dsr;
	uint dsr_imp;
A
Andy Fleming 已提交
308 309
	uint scr[2];
	uint csd[4];
310
	uint cid[4];
A
Andy Fleming 已提交
311
	ushort rca;
312 313
	u8 part_support;
	u8 part_attr;
314 315
	char part_config;
	char part_num;
A
Andy Fleming 已提交
316 317 318
	uint tran_speed;
	uint read_bl_len;
	uint write_bl_len;
319
	uint erase_grp_size;	/* in 512-byte sectors */
320
	uint hc_wp_grp_size;	/* in 512-byte sectors */
A
Andy Fleming 已提交
321
	u64 capacity;
322 323 324 325
	u64 capacity_user;
	u64 capacity_boot;
	u64 capacity_rpmb;
	u64 capacity_gp[4];
326 327
	u64 enh_user_start;
	u64 enh_user_size;
A
Andy Fleming 已提交
328
	block_dev_desc_t block_dev;
329 330 331 332
	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 */
333
	int ddr_mode;
A
Andy Fleming 已提交
334 335
};

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
struct mmc_hwpart_conf {
	struct {
		uint enh_start;	/* in 512-byte sectors */
		uint enh_size;	/* in 512-byte sectors, if 0 no enh area */
	} user;
	struct {
		uint size;	/* in 512-byte sectors */
		int enhanced;
	} gp_part[4];
};

enum mmc_hwpart_conf_mode {
	MMC_HWPART_CONF_CHECK,
	MMC_HWPART_CONF_SET,
	MMC_HWPART_CONF_COMPLETE,
};

A
Andy Fleming 已提交
353
int mmc_register(struct mmc *mmc);
354 355
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
void mmc_destroy(struct mmc *mmc);
A
Andy Fleming 已提交
356 357 358
int mmc_initialize(bd_t *bis);
int mmc_init(struct mmc *mmc);
int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
359
void mmc_set_clock(struct mmc *mmc, uint clock);
A
Andy Fleming 已提交
360
struct mmc *find_mmc_device(int dev_num);
361
int mmc_set_dev(int dev_num);
A
Andy Fleming 已提交
362
void print_mmc_devices(char separator);
363
int get_mmc_num(void);
364
int mmc_switch_part(int dev_num, unsigned int part_num);
365 366
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
		      enum mmc_hwpart_conf_mode mode);
T
Thierry Reding 已提交
367
int mmc_getcd(struct mmc *mmc);
368
int board_mmc_getcd(struct mmc *mmc);
369
int mmc_getwp(struct mmc *mmc);
370
int board_mmc_getwp(struct mmc *mmc);
M
Markus Niebel 已提交
371
int mmc_set_dsr(struct mmc *mmc, u16 val);
372 373 374
/* 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);
375 376
/* Function to modify the PARTITION_CONFIG field of EXT_CSD */
int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access);
377 378
/* Function to modify the BOOT_BUS_WIDTH field of EXT_CSD */
int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode);
379 380
/* Function to modify the RST_n_FUNCTION field of EXT_CSD */
int mmc_set_rst_n_function(struct mmc *mmc, u8 enable);
381 382 383 384 385 386 387
/* Functions to read / write the RPMB partition */
int mmc_rpmb_set_key(struct mmc *mmc, void *key);
int mmc_rpmb_get_counter(struct mmc *mmc, unsigned long *counter);
int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned short blk,
		  unsigned short cnt, unsigned char *key);
int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,
		   unsigned short cnt, unsigned char *key);
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
/**
 * 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);

413
#ifdef CONFIG_GENERIC_MMC
414
#ifdef CONFIG_MMC_SPI
415
#define mmc_host_is_spi(mmc)	((mmc)->cfg->host_caps & MMC_MODE_SPI)
416 417 418
#else
#define mmc_host_is_spi(mmc)	0
#endif
T
Thomas Chou 已提交
419
struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
420
#else
A
Andy Fleming 已提交
421 422
int mmc_legacy_init(int verbose);
#endif
423

424
void board_mmc_power_init(void);
425
int board_mmc_init(bd_t *bis);
426
int cpu_mmc_init(bd_t *bis);
427
int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
428

429 430 431 432 433
/* Set block count limit because of 16 bit register limit on some hardware*/
#ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
#define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
#endif

434
#endif /* _MMC_H_ */