mmc.h 22.3 KB
Newer Older
1
/*
2
 * Copyright 2008,2010 Freescale Semiconductor, Inc
Andy Fleming's avatar
Andy Fleming committed
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_

Andy Fleming's avatar
Andy Fleming committed
13
#include <linux/list.h>
14
#include <linux/sizes.h>
15
#include <linux/compiler.h>
Mateusz Zalega's avatar
Mateusz Zalega committed
16
#include <part.h>
Andy Fleming's avatar
Andy Fleming committed
17

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/* SD/MMC version bits; 8 flags, 8 major, 8 minor, 8 change */
#define SD_VERSION_SD	(1U << 31)
#define MMC_VERSION_MMC	(1U << 30)

#define MAKE_SDMMC_VERSION(a, b, c)	\
	((((u32)(a)) << 16) | ((u32)(b) << 8) | (u32)(c))
#define MAKE_SD_VERSION(a, b, c)	\
	(SD_VERSION_SD | MAKE_SDMMC_VERSION(a, b, c))
#define MAKE_MMC_VERSION(a, b, c)	\
	(MMC_VERSION_MMC | MAKE_SDMMC_VERSION(a, b, c))

#define EXTRACT_SDMMC_MAJOR_VERSION(x)	\
	(((u32)(x) >> 16) & 0xff)
#define EXTRACT_SDMMC_MINOR_VERSION(x)	\
	(((u32)(x) >> 8) & 0xff)
#define EXTRACT_SDMMC_CHANGE_VERSION(x)	\
	((u32)(x) & 0xff)

#define SD_VERSION_3		MAKE_SD_VERSION(3, 0, 0)
#define SD_VERSION_2		MAKE_SD_VERSION(2, 0, 0)
#define SD_VERSION_1_0		MAKE_SD_VERSION(1, 0, 0)
#define SD_VERSION_1_10		MAKE_SD_VERSION(1, 10, 0)

#define MMC_VERSION_UNKNOWN	MAKE_MMC_VERSION(0, 0, 0)
#define MMC_VERSION_1_2		MAKE_MMC_VERSION(1, 2, 0)
#define MMC_VERSION_1_4		MAKE_MMC_VERSION(1, 4, 0)
#define MMC_VERSION_2_2		MAKE_MMC_VERSION(2, 2, 0)
#define MMC_VERSION_3		MAKE_MMC_VERSION(3, 0, 0)
#define MMC_VERSION_4		MAKE_MMC_VERSION(4, 0, 0)
#define MMC_VERSION_4_1		MAKE_MMC_VERSION(4, 1, 0)
#define MMC_VERSION_4_2		MAKE_MMC_VERSION(4, 2, 0)
#define MMC_VERSION_4_3		MAKE_MMC_VERSION(4, 3, 0)
#define MMC_VERSION_4_41	MAKE_MMC_VERSION(4, 4, 1)
#define MMC_VERSION_4_5		MAKE_MMC_VERSION(4, 5, 0)
#define MMC_VERSION_5_0		MAKE_MMC_VERSION(5, 0, 0)
Stefan Wahren's avatar
Stefan Wahren committed
53
#define MMC_VERSION_5_1		MAKE_MMC_VERSION(5, 1, 0)
Andy Fleming's avatar
Andy Fleming committed
54

55 56 57 58
#define MMC_CAP(mode)		(1 << mode)
#define MMC_MODE_HS		(MMC_CAP(MMC_HS) | MMC_CAP(SD_HS))
#define MMC_MODE_HS_52MHz	MMC_CAP(MMC_HS_52)
#define MMC_MODE_DDR_52MHz	MMC_CAP(MMC_DDR_52)
59
#define MMC_MODE_HS200		MMC_CAP(MMC_HS_200)
60 61
#define MMC_MODE_HS400		MMC_CAP(MMC_HS_400)
#define MMC_MODE_HS400_ES	MMC_CAP(MMC_HS_400_ES)
62 63 64

#define MMC_MODE_8BIT		(1 << 30)
#define MMC_MODE_4BIT		(1 << 29)
65
#define MMC_MODE_1BIT		(1 << 28)
66 67
#define MMC_MODE_SPI		(1 << 27)

68

Andy Fleming's avatar
Andy Fleming committed
69 70
#define SD_DATA_4BIT	0x00040000

71
#define IS_SD(x)	((x)->version & SD_VERSION_SD)
72
#define IS_MMC(x)	((x)->version & MMC_VERSION_MMC)
Andy Fleming's avatar
Andy Fleming committed
73 74 75 76

#define MMC_DATA_READ		1
#define MMC_DATA_WRITE		2

77 78 79 80 81
#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
Andy Fleming's avatar
Andy Fleming committed
82
#define MMC_CMD_SWITCH			6
83
#define MMC_CMD_SELECT_CARD		7
Andy Fleming's avatar
Andy Fleming committed
84
#define MMC_CMD_SEND_EXT_CSD		8
85 86
#define MMC_CMD_SEND_CSD		9
#define MMC_CMD_SEND_CID		10
Andy Fleming's avatar
Andy Fleming committed
87
#define MMC_CMD_STOP_TRANSMISSION	12
88 89 90 91
#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
92
#define MMC_SEND_TUNING_BLOCK		19
93
#define MMC_SEND_TUNING_BLOCK_HS200	21
94
#define MMC_CMD_SET_BLOCK_COUNT         23
Andy Fleming's avatar
Andy Fleming committed
95 96
#define MMC_CMD_WRITE_SINGLE_BLOCK	24
#define MMC_CMD_WRITE_MULTIPLE_BLOCK	25
97 98 99
#define MMC_CMD_ERASE_GROUP_START	35
#define MMC_CMD_ERASE_GROUP_END		36
#define MMC_CMD_ERASE			38
100
#define MMC_CMD_APP_CMD			55
101 102
#define MMC_CMD_SPI_READ_OCR		58
#define MMC_CMD_SPI_CRC_ON_OFF		59
103 104 105 106 107
#define MMC_CMD_RES_MAN			62

#define MMC_CMD62_ARG1			0xefac62ec
#define MMC_CMD62_ARG2			0xcbaea7

108 109

#define SD_CMD_SEND_RELATIVE_ADDR	3
Andy Fleming's avatar
Andy Fleming committed
110
#define SD_CMD_SWITCH_FUNC		6
111
#define SD_CMD_SEND_IF_COND		8
112
#define SD_CMD_SWITCH_UHS18V		11
113 114

#define SD_CMD_APP_SET_BUS_WIDTH	6
115
#define SD_CMD_APP_SD_STATUS		13
116 117
#define SD_CMD_ERASE_WR_BLK_START	32
#define SD_CMD_ERASE_WR_BLK_END		33
118
#define SD_CMD_APP_SEND_OP_COND		41
Andy Fleming's avatar
Andy Fleming committed
119 120
#define SD_CMD_APP_SEND_SCR		51

121 122
static inline bool mmc_is_tuning_cmd(uint cmdidx)
{
123 124
	if ((cmdidx == MMC_SEND_TUNING_BLOCK_HS200) ||
	    (cmdidx == MMC_SEND_TUNING_BLOCK))
125 126 127 128
		return true;
	return false;
}

Andy Fleming's avatar
Andy Fleming committed
129 130 131 132
/* SCR definitions in different words */
#define SD_HIGHSPEED_BUSY	0x00020000
#define SD_HIGHSPEED_SUPPORTED	0x00020000

133 134 135 136 137 138 139 140 141 142 143 144 145
#define UHS_SDR12_BUS_SPEED	0
#define HIGH_SPEED_BUS_SPEED	1
#define UHS_SDR25_BUS_SPEED	1
#define UHS_SDR50_BUS_SPEED	2
#define UHS_SDR104_BUS_SPEED	3
#define UHS_DDR50_BUS_SPEED	4

#define SD_MODE_UHS_SDR12	(1 << UHS_SDR12_BUS_SPEED)
#define SD_MODE_UHS_SDR25	(1 << UHS_SDR25_BUS_SPEED)
#define SD_MODE_UHS_SDR50	(1 << UHS_SDR50_BUS_SPEED)
#define SD_MODE_UHS_SDR104	(1 << UHS_SDR104_BUS_SPEED)
#define SD_MODE_UHS_DDR50	(1 << UHS_DDR50_BUS_SPEED)

146 147
#define OCR_BUSY		0x80000000
#define OCR_HCS			0x40000000
148
#define OCR_S18R		0x1000000
149 150
#define OCR_VOLTAGE_MASK	0x007FFF80
#define OCR_ACCESS_MODE		0x60000000
Andy Fleming's avatar
Andy Fleming committed
151

152 153 154 155 156 157
#define MMC_ERASE_ARG		0x00000000
#define MMC_SECURE_ERASE_ARG	0x80000000
#define MMC_TRIM_ARG		0x00000001
#define MMC_DISCARD_ARG		0x00000003
#define MMC_SECURE_TRIM1_ARG	0x80000001
#define MMC_SECURE_TRIM2_ARG	0x80008000
158

159
#define MMC_STATUS_MASK		(~0x0206BF7F)
160
#define MMC_STATUS_SWITCH_ERROR	(1 << 7)
161 162
#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
#define MMC_STATUS_CURR_STATE	(0xf << 9)
163
#define MMC_STATUS_ERROR	(1 << 19)
164

165 166
#define MMC_STATE_PRG		(7 << 9)

Andy Fleming's avatar
Andy Fleming committed
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
#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
 */
200 201
#define EXT_CSD_ENH_START_ADDR		136	/* R/W */
#define EXT_CSD_ENH_SIZE_MULT		140	/* R/W */
202
#define EXT_CSD_GP_SIZE_MULT		143	/* R/W */
203
#define EXT_CSD_PARTITION_SETTING	155	/* R/W */
204
#define EXT_CSD_PARTITIONS_ATTRIBUTE	156	/* R/W */
205
#define EXT_CSD_MAX_ENH_SIZE_MULT	157	/* R */
206
#define EXT_CSD_PARTITIONING_SUPPORT	160	/* RO */
207
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
208
#define EXT_CSD_BKOPS_EN		163	/* R/W & R/W/E */
209 210
#define EXT_CSD_WR_REL_PARAM		166	/* R */
#define EXT_CSD_WR_REL_SET		167	/* R/W */
211
#define EXT_CSD_RPMB_MULT		168	/* RO */
212
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
213
#define EXT_CSD_BOOT_BUS_WIDTH		177
214 215
#define EXT_CSD_PART_CONF		179	/* R/W */
#define EXT_CSD_BUS_WIDTH		183	/* R/W */
216
#define EXT_CSD_STROBE_SUPPORT		184	/* R/W */
217 218 219 220
#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 */
221
#define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
222
#define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
223
#define EXT_CSD_BOOT_MULT		226	/* RO */
224
#define EXT_CSD_BKOPS_SUPPORT		502	/* RO */
Andy Fleming's avatar
Andy Fleming committed
225 226 227 228 229

/*
 * EXT_CSD field definitions
 */

230 231 232
#define EXT_CSD_CMD_SET_NORMAL		(1 << 0)
#define EXT_CSD_CMD_SET_SECURE		(1 << 1)
#define EXT_CSD_CMD_SET_CPSECURE	(1 << 2)
Andy Fleming's avatar
Andy Fleming committed
233

234 235
#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 */
236 237 238 239
#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)
Andy Fleming's avatar
Andy Fleming committed
240

241 242 243 244 245 246
#define EXT_CSD_CARD_TYPE_HS200_1_8V	(1<<4)	/* Card can run at 200MHz */
#define EXT_CSD_CARD_TYPE_HS200_1_2V	(1<<5)	/* Card can run at 200MHz */
						/* SDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_HS200		(EXT_CSD_CARD_TYPE_HS200_1_8V | \
					 EXT_CSD_CARD_TYPE_HS200_1_2V)

247 248 249 250 251 252
#define EXT_CSD_CARD_TYPE_HS400_1_8V	(1<<6)
#define EXT_CSD_CARD_TYPE_HS400_1_2V	(1<<7)
#define EXT_CSD_CARD_TYPE_HS400		(EXT_CSD_CARD_TYPE_HS400_1_8V | \
					 EXT_CSD_CARD_TYPE_HS400_1_2V)
#define EXT_CSD_CARD_TYPE_HS400ES	(1<<8)

Andy Fleming's avatar
Andy Fleming committed
253 254 255
#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 */
256
#define EXT_CSD_DDR		4	/* Card is in DDR mode */
257
#define EXT_CSD_BUS_WIDTH_STROBE (1 << 7) /* Enhanced strobe mode */
258

259 260
#define EXT_CSD_TIMING_LEGACY	0	/* no high speed */
#define EXT_CSD_TIMING_HS	1	/* HS */
261
#define EXT_CSD_TIMING_HS200	2	/* HS200 */
262 263
#define EXT_CSD_TIMING_HS400	3	/* HS400 */
#define EXT_CSD_DRV_STR_SHIFT	4	/* Driver Strength shift */
264

265 266 267 268 269 270 271 272 273
#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)

274 275 276
#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)
277

278 279
#define EXT_CSD_PARTITION_SETTING_COMPLETED	(1 << 0)

280 281 282
#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 */

283 284 285 286 287
#define EXT_CSD_HS_CTRL_REL	(1 << 0)	/* host controlled WR_REL_SET */

#define EXT_CSD_WR_DATA_REL_USR		(1 << 0)	/* user data area WR_REL */
#define EXT_CSD_WR_DATA_REL_GP(x)	(1 << ((x)+1))	/* GP part (x+1) WR_REL */

288 289 290
#define R1_ILLEGAL_COMMAND		(1 << 22)
#define R1_APP_CMD			(1 << 5)

Andy Fleming's avatar
Andy Fleming committed
291
#define MMC_RSP_PRESENT (1 << 0)
292 293 294 295
#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 */
Andy Fleming's avatar
Andy Fleming committed
296

297 298
#define MMC_RSP_NONE	(0)
#define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
Andy Fleming's avatar
Andy Fleming committed
299 300
#define MMC_RSP_R1b	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
			MMC_RSP_BUSY)
301 302 303 304 305 306
#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)
Andy Fleming's avatar
Andy Fleming committed
307

308 309 310
#define MMCPART_NOAVAILABLE	(0xff)
#define PART_ACCESS_MASK	(0x7)
#define PART_SUPPORT		(0x1)
311
#define ENHNCD_SUPPORT		(0x2)
312
#define PART_ENH_ATTRIB		(0x1f)
313

314 315 316 317
#define MMC_SIGNAL_VOLTAGE_330	1
#define MMC_SIGNAL_VOLTAGE_180	2
#define MMC_SIGNAL_VOLTAGE_120	3

318 319 320
/* Maximum block size for MMC */
#define MMC_MAX_BLOCK_LEN	512

321 322 323 324
/* 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
325
#define MMC_PART_RPMB           3       /* RPMB partition number */
326

Simon Glass's avatar
Simon Glass committed
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
/* Driver model support */

/**
 * struct mmc_uclass_priv - Holds information about a device used by the uclass
 */
struct mmc_uclass_priv {
	struct mmc *mmc;
};

/**
 * mmc_get_mmc_dev() - get the MMC struct pointer for a device
 *
 * Provided that the device is already probed and ready for use, this value
 * will be available.
 *
 * @dev:	Device
 * @return associated mmc struct pointer if available, else NULL
 */
struct mmc *mmc_get_mmc_dev(struct udevice *dev);

/* End of driver model support */

349 350 351 352 353 354 355 356 357
struct mmc_cid {
	unsigned long psn;
	unsigned short oid;
	unsigned char mid;
	unsigned char prv;
	unsigned char mdt;
	char pnm[7];
};

Andy Fleming's avatar
Andy Fleming committed
358 359 360 361
struct mmc_cmd {
	ushort cmdidx;
	uint resp_type;
	uint cmdarg;
362
	uint response[4];
Andy Fleming's avatar
Andy Fleming committed
363 364 365 366 367 368 369 370 371 372 373 374
};

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

375 376 377
/* forward decl. */
struct mmc;

378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
#ifdef CONFIG_DM_MMC_OPS
struct dm_mmc_ops {
	/**
	 * send_cmd() - Send a command to the MMC device
	 *
	 * @dev:	Device to receive the command
	 * @cmd:	Command to send
	 * @data:	Additional data to send/receive
	 * @return 0 if OK, -ve on error
	 */
	int (*send_cmd)(struct udevice *dev, struct mmc_cmd *cmd,
			struct mmc_data *data);

	/**
	 * set_ios() - Set the I/O speed/width for an MMC device
	 *
	 * @dev:	Device to update
	 * @return 0 if OK, -ve on error
	 */
	int (*set_ios)(struct udevice *dev);

399 400 401 402 403 404 405 406 407
	/**
	 * set_vdd() - Enable or Disable the Vdd line
	 *
	 * @dev:	Device to update
	 * @enable:	true or false to enable or disable Vdd respectively
	 * @return 0 if OK, -ve on error
	 */
	int (*set_vdd)(struct udevice *dev, bool enable);

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
	/**
	 * get_cd() - See whether a card is present
	 *
	 * @dev:	Device to check
	 * @return 0 if not present, 1 if present, -ve on error
	 */
	int (*get_cd)(struct udevice *dev);

	/**
	 * get_wp() - See whether a card has write-protect enabled
	 *
	 * @dev:	Device to check
	 * @return 0 if write-enabled, 1 if write-protected, -ve on error
	 */
	int (*get_wp)(struct udevice *dev);
423 424 425 426 427 428 429 430 431

	/**
	 * execute_tuning() - Start the tuning process
	 *
	 * @dev:	Device to start the tuning
	 * @opcode:	Command opcode to send
	 * @return 0 if OK, -ve on error
	 */
	int (*execute_tuning)(struct udevice *dev, uint opcode);
432 433 434 435 436 437 438 439

	/**
	 * card_busy() - See whether a card is busy
	 *
	 * @dev:	Device to check
	 * @return 1 if busy, O if not busy
	 */
	int (*card_busy)(struct udevice *dev);
440 441 442

	/* hs400_enhanced_strobe() - set enhanced strobe */
	void (*hs400_enhanced_strobe)(struct udevice *dev);
443 444 445 446 447 448 449
};

#define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)

int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
		    struct mmc_data *data);
int dm_mmc_set_ios(struct udevice *dev);
450
int dm_mmc_set_vdd(struct udevice *dev, bool enable);
451 452
int dm_mmc_get_cd(struct udevice *dev);
int dm_mmc_get_wp(struct udevice *dev);
453
int dm_mmc_execute_tuning(struct udevice *dev, uint opcode);
454
int dm_mmc_card_busy(struct udevice *dev);
455 456 457

/* Transition functions for compatibility */
int mmc_set_ios(struct mmc *mmc);
458
int mmc_set_vdd(struct mmc *mmc, bool enable);
459 460
int mmc_getcd(struct mmc *mmc);
int mmc_getwp(struct mmc *mmc);
461
int mmc_execute_tuning(struct mmc *mmc, uint opcode);
462
int mmc_card_busy(struct mmc *mmc);
463 464

#else
465 466 467
struct mmc_ops {
	int (*send_cmd)(struct mmc *mmc,
			struct mmc_cmd *cmd, struct mmc_data *data);
468
	int (*set_ios)(struct mmc *mmc);
469
	int (*init)(struct mmc *mmc);
470
	int (*set_vdd)(struct mmc *mmc, bool enable);
471 472
	int (*getcd)(struct mmc *mmc);
	int (*getwp)(struct mmc *mmc);
473
	int (*execute_tuning)(struct mmc *mmc, uint opcode);
474
	int (*card_busy)(struct mmc *mmc);
475
	void (*hs400_enhanced_strobe)(struct mmc *mmc);
476
};
477
#endif
478

479 480
struct mmc_config {
	const char *name;
481
#ifndef CONFIG_DM_MMC_OPS
482
	const struct mmc_ops *ops;
483
#endif
484 485 486 487 488 489 490 491
	uint host_caps;
	uint voltages;
	uint f_min;
	uint f_max;
	uint b_max;
	unsigned char part_type;
};

492 493 494 495 496 497
struct sd_ssr {
	unsigned int au;		/* In sectors */
	unsigned int erase_timeout;	/* In milliseconds */
	unsigned int erase_offset;	/* In milliseconds */
};

498 499 500 501 502 503 504 505 506 507 508 509 510
enum bus_mode {
	MMC_LEGACY	= 0,
	SD_LEGACY	= 1,
	MMC_HS		= 2,
	SD_HS		= 3,
	UHS_SDR12	= 4,
	UHS_SDR25	= 5,
	UHS_SDR50	= 6,
	UHS_SDR104	= 7,
	UHS_DDR50	= 8,
	MMC_HS_52	= 9,
	MMC_DDR_52	= 10,
	MMC_HS_200	= 11,
511 512
	MMC_HS_400	= 12,
	MMC_HS_400_ES	= 13,
513 514 515 516
	MMC_MODES_END
};

const char *mmc_mode_name(enum bus_mode mode);
517
void mmc_dump_capabilities(const char *text, uint caps);
518 519 520

static inline bool mmc_is_mode_ddr(enum bus_mode mode)
{
521 522
	if ((mode == MMC_HS_400) || (mode == MMC_HS_400_ES) || \
	    (mode == MMC_DDR_52) || (mode == UHS_DDR50))
523 524 525 526 527
		return true;
	else
		return false;
}

528 529 530 531 532 533 534 535 536
#define UHS_CAPS (MMC_CAP(UHS_SDR12) | MMC_CAP(UHS_SDR25) | \
		  MMC_CAP(UHS_SDR50) | MMC_CAP(UHS_SDR104) | \
		  MMC_CAP(UHS_DDR50))

static inline bool supports_uhs(uint caps)
{
	return (caps & UHS_CAPS) ? true : false;
}

537

538 539 540 541 542 543
/*
 * With CONFIG_DM_MMC enabled, struct mmc can be accessed from the MMC device
 * with mmc_get_mmc_dev().
 *
 * TODO struct mmc should be in mmc_private but it's hard to fix right now
 */
Andy Fleming's avatar
Andy Fleming committed
544
struct mmc {
545
#ifndef CONFIG_BLK
Andy Fleming's avatar
Andy Fleming committed
546
	struct list_head link;
547
#endif
548
	const struct mmc_config *cfg;	/* provided configuration */
Andy Fleming's avatar
Andy Fleming committed
549
	uint version;
550
	void *priv;
551
	uint has_init;
Andy Fleming's avatar
Andy Fleming committed
552
	int high_capacity;
553
	u8 clk_disable;
Andy Fleming's avatar
Andy Fleming committed
554 555
	uint bus_width;
	uint clock;
556
	uint signal_voltage;
Andy Fleming's avatar
Andy Fleming committed
557 558
	uint card_caps;
	uint ocr;
Markus Niebel's avatar
Markus Niebel committed
559 560
	uint dsr;
	uint dsr_imp;
Andy Fleming's avatar
Andy Fleming committed
561 562
	uint scr[2];
	uint csd[4];
563
	uint cid[4];
Andy Fleming's avatar
Andy Fleming committed
564
	ushort rca;
565 566
	u8 part_support;
	u8 part_attr;
567
	u8 wr_rel_set;
568
	char part_config;
Andy Fleming's avatar
Andy Fleming committed
569
	uint tran_speed;
570
	uint legacy_speed;
Andy Fleming's avatar
Andy Fleming committed
571 572
	uint read_bl_len;
	uint write_bl_len;
573
	uint erase_grp_size;	/* in 512-byte sectors */
574
	uint hc_wp_grp_size;	/* in 512-byte sectors */
575
	struct sd_ssr	ssr;	/* SD status register */
Andy Fleming's avatar
Andy Fleming committed
576
	u64 capacity;
577 578 579 580
	u64 capacity_user;
	u64 capacity_boot;
	u64 capacity_rpmb;
	u64 capacity_gp[4];
581 582
	u64 enh_user_start;
	u64 enh_user_size;
583
#ifndef CONFIG_BLK
584
	struct blk_desc block_dev;
585
#endif
586 587 588
	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 */
589
	int ddr_mode;
590 591 592
#ifdef CONFIG_DM_MMC
	struct udevice *dev;	/* Device for this MMC controller */
#endif
593
	u8 *ext_csd;
594
	enum bus_mode selected_mode;
595
	enum bus_mode best_mode;
Andy Fleming's avatar
Andy Fleming committed
596 597
};

598 599 600 601
struct mmc_hwpart_conf {
	struct {
		uint enh_start;	/* in 512-byte sectors */
		uint enh_size;	/* in 512-byte sectors, if 0 no enh area */
602 603
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
604 605 606
	} user;
	struct {
		uint size;	/* in 512-byte sectors */
607 608 609
		unsigned enhanced : 1;
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
610 611 612 613 614 615 616 617 618
	} gp_part[4];
};

enum mmc_hwpart_conf_mode {
	MMC_HWPART_CONF_CHECK,
	MMC_HWPART_CONF_SET,
	MMC_HWPART_CONF_COMPLETE,
};

619
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
620 621 622 623 624 625 626 627 628 629 630 631 632 633

/**
 * mmc_bind() - Set up a new MMC device ready for probing
 *
 * A child block device is bound with the IF_TYPE_MMC interface type. This
 * allows the device to be used with CONFIG_BLK
 *
 * @dev:	MMC device to set up
 * @mmc:	MMC struct
 * @cfg:	MMC configuration
 * @return 0 if OK, -ve on error
 */
int mmc_bind(struct udevice *dev, struct mmc *mmc,
	     const struct mmc_config *cfg);
634
void mmc_destroy(struct mmc *mmc);
635 636 637 638 639 640 641 642

/**
 * mmc_unbind() - Unbind a MMC device's child block device
 *
 * @dev:	MMC device
 * @return 0 if OK, -ve on error
 */
int mmc_unbind(struct udevice *dev);
Andy Fleming's avatar
Andy Fleming committed
643 644
int mmc_initialize(bd_t *bis);
int mmc_init(struct mmc *mmc);
645
int mmc_send_tuning(struct mmc *mmc, u32 opcode, int *cmd_error);
Andy Fleming's avatar
Andy Fleming committed
646
int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
647
int mmc_set_clock(struct mmc *mmc, uint clock, u8 disable);
Andy Fleming's avatar
Andy Fleming committed
648
struct mmc *find_mmc_device(int dev_num);
649
int mmc_set_dev(int dev_num);
Andy Fleming's avatar
Andy Fleming committed
650
void print_mmc_devices(char separator);
651 652 653 654 655 656

/**
 * get_mmc_num() - get the total MMC device number
 *
 * @return 0 if there is no MMC device, else the number of devices
 */
657
int get_mmc_num(void);
658
int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
659 660
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
		      enum mmc_hwpart_conf_mode mode);
661 662

#ifndef CONFIG_DM_MMC_OPS
663
int mmc_getcd(struct mmc *mmc);
664
int board_mmc_getcd(struct mmc *mmc);
665
int mmc_getwp(struct mmc *mmc);
666
int board_mmc_getwp(struct mmc *mmc);
667 668
#endif

Markus Niebel's avatar
Markus Niebel committed
669
int mmc_set_dsr(struct mmc *mmc, u16 val);
670 671 672
/* 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);
673 674
/* 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);
675 676
/* 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);
677 678
/* Function to modify the RST_n_FUNCTION field of EXT_CSD */
int mmc_set_rst_n_function(struct mmc *mmc, u8 enable);
679 680 681 682 683 684 685
/* 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);
686 687 688 689
#ifdef CONFIG_CMD_BKOPS_ENABLE
int mmc_set_bkops_enable(struct mmc *mmc);
#endif

690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
/**
 * 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);

715
#ifdef CONFIG_MMC_SPI
716
#define mmc_host_is_spi(mmc)	((mmc)->cfg->host_caps & MMC_MODE_SPI)
717 718 719
#else
#define mmc_host_is_spi(mmc)	0
#endif
720
struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
721

722
void board_mmc_power_init(void);
723
int board_mmc_init(bd_t *bis);
724
int cpu_mmc_init(bd_t *bis);
725
int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
726
int mmc_get_env_dev(void);
727
int mmc_map_to_kernel_blk(int dev_no);
728

729 730 731 732 733 734 735 736
struct pci_device_id;

/**
 * pci_mmc_init() - set up PCI MMC devices
 *
 * This finds all the matching PCI IDs and sets them up as MMC devices.
 *
 * @name:		Name to use for devices
737
 * @mmc_supported:	PCI IDs to search for, terminated by {0, 0}
738
 */
739
int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported);
740

741 742 743 744 745
/* 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

746 747 748 749 750 751 752 753
/**
 * mmc_get_blk_desc() - Get the block descriptor for an MMC device
 *
 * @mmc:	MMC device
 * @return block device if found, else NULL
 */
struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);

754
#endif /* _MMC_H_ */