blob: 5550d46be9ea781d5480219fd63d09daa95c5430 [file] [log] [blame]
Andy Flemingad347bb2008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Flemingad347bb2008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
13#include <mmc.h>
14#include <part.h>
15#include <malloc.h>
16#include <linux/list.h>
Rabin Vincent69d4e2c2009-04-05 13:30:54 +053017#include <div64.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050018
Matt Waddeld0e3c802011-02-24 16:35:23 +000019/* Set block count limit because of 16 bit register limit on some hardware*/
20#ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
21#define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
22#endif
23
Andy Flemingad347bb2008-10-30 16:41:01 -050024static struct list_head mmc_devices;
25static int cur_dev_num = -1;
26
Nikita Kiryanov020f2612012-12-03 02:19:46 +000027int __weak board_mmc_getwp(struct mmc *mmc)
28{
29 return -1;
30}
31
32int mmc_getwp(struct mmc *mmc)
33{
34 int wp;
35
36 wp = board_mmc_getwp(mmc);
37
Peter Korsgaardf7b15102013-03-21 04:00:03 +000038 if (wp < 0) {
39 if (mmc->getwp)
40 wp = mmc->getwp(mmc);
41 else
42 wp = 0;
43 }
Nikita Kiryanov020f2612012-12-03 02:19:46 +000044
45 return wp;
46}
47
Thierry Redingd7aebf42012-01-02 01:15:36 +000048int __board_mmc_getcd(struct mmc *mmc) {
Stefano Babic6e00edf2010-02-05 15:04:43 +010049 return -1;
50}
51
Thierry Redingd7aebf42012-01-02 01:15:36 +000052int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
Stefano Babic6e00edf2010-02-05 15:04:43 +010053 alias("__board_mmc_getcd")));
54
Kim Phillips87ea3892012-10-29 13:34:43 +000055static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
56 struct mmc_data *data)
Andy Flemingad347bb2008-10-30 16:41:01 -050057{
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000058 int ret;
Marek Vasutdccb6082012-03-15 18:41:35 +000059
Marek Vasutdccb6082012-03-15 18:41:35 +000060#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000061 int i;
62 u8 *ptr;
63
64 printf("CMD_SEND:%d\n", cmd->cmdidx);
65 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000066 ret = mmc->send_cmd(mmc, cmd, data);
67 switch (cmd->resp_type) {
68 case MMC_RSP_NONE:
69 printf("\t\tMMC_RSP_NONE\n");
70 break;
71 case MMC_RSP_R1:
72 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
73 cmd->response[0]);
74 break;
75 case MMC_RSP_R1b:
76 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
77 cmd->response[0]);
78 break;
79 case MMC_RSP_R2:
80 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
81 cmd->response[0]);
82 printf("\t\t \t\t 0x%08X \n",
83 cmd->response[1]);
84 printf("\t\t \t\t 0x%08X \n",
85 cmd->response[2]);
86 printf("\t\t \t\t 0x%08X \n",
87 cmd->response[3]);
88 printf("\n");
89 printf("\t\t\t\t\tDUMPING DATA\n");
90 for (i = 0; i < 4; i++) {
91 int j;
92 printf("\t\t\t\t\t%03d - ", i*4);
Dirk Behmec9cb4a92012-03-08 02:35:34 +000093 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000094 ptr += 3;
95 for (j = 0; j < 4; j++)
96 printf("%02X ", *ptr--);
97 printf("\n");
98 }
99 break;
100 case MMC_RSP_R3:
101 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
102 cmd->response[0]);
103 break;
104 default:
105 printf("\t\tERROR MMC rsp not supported\n");
106 break;
107 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000108#else
Marek Vasutdccb6082012-03-15 18:41:35 +0000109 ret = mmc->send_cmd(mmc, cmd, data);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000110#endif
Marek Vasutdccb6082012-03-15 18:41:35 +0000111 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500112}
113
Kim Phillips87ea3892012-10-29 13:34:43 +0000114static int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000115{
116 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000117 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000118#ifdef CONFIG_MMC_TRACE
119 int status;
120#endif
121
122 cmd.cmdidx = MMC_CMD_SEND_STATUS;
123 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200124 if (!mmc_host_is_spi(mmc))
125 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000126
127 do {
128 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000129 if (!err) {
130 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
131 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
132 MMC_STATE_PRG)
133 break;
134 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100135#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000136 printf("Status Error: 0x%08X\n",
137 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100138#endif
Jan Kloetzke31789322012-02-05 22:29:12 +0000139 return COMM_ERR;
140 }
141 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000142 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000143
144 udelay(1000);
145
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000146 } while (timeout--);
147
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000148#ifdef CONFIG_MMC_TRACE
149 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
150 printf("CURR STATE:%d\n", status);
151#endif
Jongman Heo1be00d92012-06-03 21:32:13 +0000152 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100153#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000154 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100155#endif
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000156 return TIMEOUT;
157 }
158
159 return 0;
160}
161
Kim Phillips87ea3892012-10-29 13:34:43 +0000162static int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500163{
164 struct mmc_cmd cmd;
165
166 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
167 cmd.resp_type = MMC_RSP_R1;
168 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500169
170 return mmc_send_cmd(mmc, &cmd, NULL);
171}
172
173struct mmc *find_mmc_device(int dev_num)
174{
175 struct mmc *m;
176 struct list_head *entry;
177
178 list_for_each(entry, &mmc_devices) {
179 m = list_entry(entry, struct mmc, link);
180
181 if (m->block_dev.dev == dev_num)
182 return m;
183 }
184
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100185#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -0500186 printf("MMC Device %d not found\n", dev_num);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100187#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500188
189 return NULL;
190}
191
Lei Wenea526762011-06-22 17:03:31 +0000192static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
193{
194 struct mmc_cmd cmd;
195 ulong end;
196 int err, start_cmd, end_cmd;
197
198 if (mmc->high_capacity)
199 end = start + blkcnt - 1;
200 else {
201 end = (start + blkcnt - 1) * mmc->write_bl_len;
202 start *= mmc->write_bl_len;
203 }
204
205 if (IS_SD(mmc)) {
206 start_cmd = SD_CMD_ERASE_WR_BLK_START;
207 end_cmd = SD_CMD_ERASE_WR_BLK_END;
208 } else {
209 start_cmd = MMC_CMD_ERASE_GROUP_START;
210 end_cmd = MMC_CMD_ERASE_GROUP_END;
211 }
212
213 cmd.cmdidx = start_cmd;
214 cmd.cmdarg = start;
215 cmd.resp_type = MMC_RSP_R1;
Lei Wenea526762011-06-22 17:03:31 +0000216
217 err = mmc_send_cmd(mmc, &cmd, NULL);
218 if (err)
219 goto err_out;
220
221 cmd.cmdidx = end_cmd;
222 cmd.cmdarg = end;
223
224 err = mmc_send_cmd(mmc, &cmd, NULL);
225 if (err)
226 goto err_out;
227
228 cmd.cmdidx = MMC_CMD_ERASE;
229 cmd.cmdarg = SECURE_ERASE;
230 cmd.resp_type = MMC_RSP_R1b;
231
232 err = mmc_send_cmd(mmc, &cmd, NULL);
233 if (err)
234 goto err_out;
235
236 return 0;
237
238err_out:
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100239#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Lei Wenea526762011-06-22 17:03:31 +0000240 puts("mmc erase failed\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100241#endif
Lei Wenea526762011-06-22 17:03:31 +0000242 return err;
243}
244
245static unsigned long
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200246mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt)
Lei Wenea526762011-06-22 17:03:31 +0000247{
248 int err = 0;
249 struct mmc *mmc = find_mmc_device(dev_num);
250 lbaint_t blk = 0, blk_r = 0;
Jerry Huang15c9ad92012-05-17 23:00:51 +0000251 int timeout = 1000;
Lei Wenea526762011-06-22 17:03:31 +0000252
253 if (!mmc)
254 return -1;
255
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100256#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Lei Wenea526762011-06-22 17:03:31 +0000257 if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size))
258 printf("\n\nCaution! Your devices Erase group is 0x%x\n"
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200259 "The erase range would be change to "
260 "0x" LBAF "~0x" LBAF "\n\n",
Lei Wenea526762011-06-22 17:03:31 +0000261 mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1),
262 ((start + blkcnt + mmc->erase_grp_size)
263 & ~(mmc->erase_grp_size - 1)) - 1);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100264#endif
Lei Wenea526762011-06-22 17:03:31 +0000265
266 while (blk < blkcnt) {
267 blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
268 mmc->erase_grp_size : (blkcnt - blk);
269 err = mmc_erase_t(mmc, start + blk, blk_r);
270 if (err)
271 break;
272
273 blk += blk_r;
Jerry Huang15c9ad92012-05-17 23:00:51 +0000274
275 /* Waiting for the ready status */
276 if (mmc_send_status(mmc, timeout))
277 return 0;
Lei Wenea526762011-06-22 17:03:31 +0000278 }
279
280 return blk;
281}
282
Andy Flemingad347bb2008-10-30 16:41:01 -0500283static ulong
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200284mmc_write_blocks(struct mmc *mmc, lbaint_t start, lbaint_t blkcnt, const void*src)
Andy Flemingad347bb2008-10-30 16:41:01 -0500285{
286 struct mmc_cmd cmd;
287 struct mmc_data data;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000288 int timeout = 1000;
Andy Flemingad347bb2008-10-30 16:41:01 -0500289
Lei Wene1cc9c82010-09-13 22:07:27 +0800290 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100291#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200292 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800293 start + blkcnt, mmc->block_dev.lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100294#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800295 return 0;
296 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500297
Ruud Commandeuraa05e012013-05-22 13:19:43 +0200298 if (blkcnt == 0)
299 return 0;
300 else if (blkcnt == 1)
Andy Flemingad347bb2008-10-30 16:41:01 -0500301 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
Ruud Commandeuraa05e012013-05-22 13:19:43 +0200302 else
303 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500304
305 if (mmc->high_capacity)
306 cmd.cmdarg = start;
307 else
Steve Sakomaneb288862010-10-28 09:00:26 -0700308 cmd.cmdarg = start * mmc->write_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500309
310 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500311
312 data.src = src;
313 data.blocks = blkcnt;
Steve Sakomaneb288862010-10-28 09:00:26 -0700314 data.blocksize = mmc->write_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500315 data.flags = MMC_DATA_WRITE;
316
Steve Sakomaneb288862010-10-28 09:00:26 -0700317 if (mmc_send_cmd(mmc, &cmd, &data)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100318#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Steve Sakomaneb288862010-10-28 09:00:26 -0700319 printf("mmc write failed\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100320#endif
Steve Sakomaneb288862010-10-28 09:00:26 -0700321 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500322 }
323
Thomas Chou1254c3d2010-12-24 13:12:21 +0000324 /* SPI multiblock writes terminate using a special
325 * token, not a STOP_TRANSMISSION request.
326 */
327 if (!mmc_host_is_spi(mmc) && blkcnt > 1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500328 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
329 cmd.cmdarg = 0;
330 cmd.resp_type = MMC_RSP_R1b;
Steve Sakomaneb288862010-10-28 09:00:26 -0700331 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100332#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Steve Sakomaneb288862010-10-28 09:00:26 -0700333 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100334#endif
Steve Sakomaneb288862010-10-28 09:00:26 -0700335 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800336 }
337 }
338
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000339 /* Waiting for the ready status */
340 if (mmc_send_status(mmc, timeout))
341 return 0;
342
Lei Wen6b405b72010-10-14 13:38:11 +0800343 return blkcnt;
344}
345
346static ulong
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200347mmc_bwrite(int dev_num, lbaint_t start, lbaint_t blkcnt, const void*src)
Lei Wen6b405b72010-10-14 13:38:11 +0800348{
Lei Wen6b405b72010-10-14 13:38:11 +0800349 lbaint_t cur, blocks_todo = blkcnt;
350
Steve Sakomaneb288862010-10-28 09:00:26 -0700351 struct mmc *mmc = find_mmc_device(dev_num);
Lei Wen6b405b72010-10-14 13:38:11 +0800352 if (!mmc)
Steve Sakomaneb288862010-10-28 09:00:26 -0700353 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800354
Steve Sakomaneb288862010-10-28 09:00:26 -0700355 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
356 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500357
Lei Wen6b405b72010-10-14 13:38:11 +0800358 do {
John Rigbyf2f43662011-04-18 05:50:08 +0000359 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Lei Wen6b405b72010-10-14 13:38:11 +0800360 if(mmc_write_blocks(mmc, start, cur, src) != cur)
Steve Sakomaneb288862010-10-28 09:00:26 -0700361 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800362 blocks_todo -= cur;
363 start += cur;
364 src += cur * mmc->write_bl_len;
365 } while (blocks_todo > 0);
366
Andy Flemingad347bb2008-10-30 16:41:01 -0500367 return blkcnt;
368}
369
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200370static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000371 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500372{
373 struct mmc_cmd cmd;
374 struct mmc_data data;
375
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700376 if (blkcnt > 1)
377 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
378 else
379 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500380
381 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700382 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500383 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700384 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500385
386 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500387
388 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700389 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500390 data.blocksize = mmc->read_bl_len;
391 data.flags = MMC_DATA_READ;
392
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700393 if (mmc_send_cmd(mmc, &cmd, &data))
394 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500395
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700396 if (blkcnt > 1) {
397 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
398 cmd.cmdarg = 0;
399 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700400 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100401#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700402 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100403#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700404 return 0;
405 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500406 }
407
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700408 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500409}
410
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200411static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst)
Andy Flemingad347bb2008-10-30 16:41:01 -0500412{
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700413 lbaint_t cur, blocks_todo = blkcnt;
414
415 if (blkcnt == 0)
416 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500417
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700418 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500419 if (!mmc)
420 return 0;
421
Lei Wene1cc9c82010-09-13 22:07:27 +0800422 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100423#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200424 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800425 start + blkcnt, mmc->block_dev.lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100426#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800427 return 0;
428 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500429
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700430 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
Andy Flemingad347bb2008-10-30 16:41:01 -0500431 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500432
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700433 do {
John Rigbyf2f43662011-04-18 05:50:08 +0000434 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700435 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
436 return 0;
437 blocks_todo -= cur;
438 start += cur;
439 dst += cur * mmc->read_bl_len;
440 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500441
442 return blkcnt;
443}
444
Kim Phillips87ea3892012-10-29 13:34:43 +0000445static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500446{
447 struct mmc_cmd cmd;
448 int err;
449
450 udelay(1000);
451
452 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
453 cmd.cmdarg = 0;
454 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500455
456 err = mmc_send_cmd(mmc, &cmd, NULL);
457
458 if (err)
459 return err;
460
461 udelay(2000);
462
463 return 0;
464}
465
Kim Phillips87ea3892012-10-29 13:34:43 +0000466static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500467{
468 int timeout = 1000;
469 int err;
470 struct mmc_cmd cmd;
471
472 do {
473 cmd.cmdidx = MMC_CMD_APP_CMD;
474 cmd.resp_type = MMC_RSP_R1;
475 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500476
477 err = mmc_send_cmd(mmc, &cmd, NULL);
478
479 if (err)
480 return err;
481
482 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
483 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100484
485 /*
486 * Most cards do not answer if some reserved bits
487 * in the ocr are set. However, Some controller
488 * can set bit 7 (reserved for low voltages), but
489 * how to manage low voltages SD card is not yet
490 * specified.
491 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000492 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
493 (mmc->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500494
495 if (mmc->version == SD_VERSION_2)
496 cmd.cmdarg |= OCR_HCS;
497
498 err = mmc_send_cmd(mmc, &cmd, NULL);
499
500 if (err)
501 return err;
502
503 udelay(1000);
504 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
505
506 if (timeout <= 0)
507 return UNUSABLE_ERR;
508
509 if (mmc->version != SD_VERSION_2)
510 mmc->version = SD_VERSION_1_0;
511
Thomas Chou1254c3d2010-12-24 13:12:21 +0000512 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
513 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
514 cmd.resp_type = MMC_RSP_R3;
515 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000516
517 err = mmc_send_cmd(mmc, &cmd, NULL);
518
519 if (err)
520 return err;
521 }
522
Rabin Vincentb6eed942009-04-05 13:30:56 +0530523 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500524
525 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
526 mmc->rca = 0;
527
528 return 0;
529}
530
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000531/* We pass in the cmd since otherwise the init seems to fail */
532static int mmc_send_op_cond_iter(struct mmc *mmc, struct mmc_cmd *cmd,
533 int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500534{
Andy Flemingad347bb2008-10-30 16:41:01 -0500535 int err;
536
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000537 cmd->cmdidx = MMC_CMD_SEND_OP_COND;
538 cmd->resp_type = MMC_RSP_R3;
539 cmd->cmdarg = 0;
540 if (use_arg && !mmc_host_is_spi(mmc)) {
541 cmd->cmdarg =
542 (mmc->voltages &
543 (mmc->op_cond_response & OCR_VOLTAGE_MASK)) |
544 (mmc->op_cond_response & OCR_ACCESS_MODE);
545
546 if (mmc->host_caps & MMC_MODE_HC)
547 cmd->cmdarg |= OCR_HCS;
548 }
549 err = mmc_send_cmd(mmc, cmd, NULL);
550 if (err)
551 return err;
552 mmc->op_cond_response = cmd->response[0];
553 return 0;
554}
555
556int mmc_send_op_cond(struct mmc *mmc)
557{
558 struct mmc_cmd cmd;
559 int err, i;
560
Andy Flemingad347bb2008-10-30 16:41:01 -0500561 /* Some cards seem to need this */
562 mmc_go_idle(mmc);
563
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000564 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000565 mmc->op_cond_pending = 1;
566 for (i = 0; i < 2; i++) {
567 err = mmc_send_op_cond_iter(mmc, &cmd, i != 0);
568 if (err)
569 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200570
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000571 /* exit if not busy (flag seems to be inverted) */
572 if (mmc->op_cond_response & OCR_BUSY)
573 return 0;
574 }
575 return IN_PROGRESS;
576}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200577
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000578int mmc_complete_op_cond(struct mmc *mmc)
579{
580 struct mmc_cmd cmd;
581 int timeout = 1000;
582 uint start;
583 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200584
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000585 mmc->op_cond_pending = 0;
586 start = get_timer(0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500587 do {
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000588 err = mmc_send_op_cond_iter(mmc, &cmd, 1);
Andy Flemingad347bb2008-10-30 16:41:01 -0500589 if (err)
590 return err;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000591 if (get_timer(start) > timeout)
592 return UNUSABLE_ERR;
593 udelay(100);
594 } while (!(mmc->op_cond_response & OCR_BUSY));
Andy Flemingad347bb2008-10-30 16:41:01 -0500595
Thomas Chou1254c3d2010-12-24 13:12:21 +0000596 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
597 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
598 cmd.resp_type = MMC_RSP_R3;
599 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000600
601 err = mmc_send_cmd(mmc, &cmd, NULL);
602
603 if (err)
604 return err;
605 }
606
Andy Flemingad347bb2008-10-30 16:41:01 -0500607 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincentb6eed942009-04-05 13:30:56 +0530608 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500609
610 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
611 mmc->rca = 0;
612
613 return 0;
614}
615
616
Kim Phillips87ea3892012-10-29 13:34:43 +0000617static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500618{
619 struct mmc_cmd cmd;
620 struct mmc_data data;
621 int err;
622
623 /* Get the Card Status Register */
624 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
625 cmd.resp_type = MMC_RSP_R1;
626 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500627
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000628 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500629 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000630 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500631 data.flags = MMC_DATA_READ;
632
633 err = mmc_send_cmd(mmc, &cmd, &data);
634
635 return err;
636}
637
638
Kim Phillips87ea3892012-10-29 13:34:43 +0000639static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500640{
641 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000642 int timeout = 1000;
643 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500644
645 cmd.cmdidx = MMC_CMD_SWITCH;
646 cmd.resp_type = MMC_RSP_R1b;
647 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000648 (index << 16) |
649 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500650
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000651 ret = mmc_send_cmd(mmc, &cmd, NULL);
652
653 /* Waiting for the ready status */
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000654 if (!ret)
655 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000656
657 return ret;
658
Andy Flemingad347bb2008-10-30 16:41:01 -0500659}
660
Kim Phillips87ea3892012-10-29 13:34:43 +0000661static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500662{
Simon Glassa09c2b72013-04-03 08:54:30 +0000663 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500664 char cardtype;
665 int err;
666
667 mmc->card_caps = 0;
668
Thomas Chou1254c3d2010-12-24 13:12:21 +0000669 if (mmc_host_is_spi(mmc))
670 return 0;
671
Andy Flemingad347bb2008-10-30 16:41:01 -0500672 /* Only version 4 supports high-speed */
673 if (mmc->version < MMC_VERSION_4)
674 return 0;
675
Andy Flemingad347bb2008-10-30 16:41:01 -0500676 err = mmc_send_ext_csd(mmc, ext_csd);
677
678 if (err)
679 return err;
680
Lei Wen217467f2011-10-03 20:35:10 +0000681 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500682
683 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
684
685 if (err)
686 return err;
687
688 /* Now check to see that it worked */
689 err = mmc_send_ext_csd(mmc, ext_csd);
690
691 if (err)
692 return err;
693
694 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000695 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500696 return 0;
697
698 /* High Speed is set, there are two types: 52MHz and 26MHz */
699 if (cardtype & MMC_HS_52MHZ)
700 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
701 else
702 mmc->card_caps |= MMC_MODE_HS;
703
704 return 0;
705}
706
Stephen Warrene315ae82013-06-11 15:14:01 -0600707static int mmc_set_capacity(struct mmc *mmc, int part_num)
708{
709 switch (part_num) {
710 case 0:
711 mmc->capacity = mmc->capacity_user;
712 break;
713 case 1:
714 case 2:
715 mmc->capacity = mmc->capacity_boot;
716 break;
717 case 3:
718 mmc->capacity = mmc->capacity_rpmb;
719 break;
720 case 4:
721 case 5:
722 case 6:
723 case 7:
724 mmc->capacity = mmc->capacity_gp[part_num - 4];
725 break;
726 default:
727 return -1;
728 }
729
730 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
731
732 return 0;
733}
734
Lei Wen31b99802011-05-02 16:26:26 +0000735int mmc_switch_part(int dev_num, unsigned int part_num)
736{
737 struct mmc *mmc = find_mmc_device(dev_num);
Stephen Warrene315ae82013-06-11 15:14:01 -0600738 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000739
740 if (!mmc)
741 return -1;
742
Stephen Warrene315ae82013-06-11 15:14:01 -0600743 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
744 (mmc->part_config & ~PART_ACCESS_MASK)
745 | (part_num & PART_ACCESS_MASK));
746 if (ret)
747 return ret;
748
749 return mmc_set_capacity(mmc, part_num);
Lei Wen31b99802011-05-02 16:26:26 +0000750}
751
Thierry Redingb9c8b772012-01-02 01:15:37 +0000752int mmc_getcd(struct mmc *mmc)
753{
754 int cd;
755
756 cd = board_mmc_getcd(mmc);
757
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000758 if (cd < 0) {
759 if (mmc->getcd)
760 cd = mmc->getcd(mmc);
761 else
762 cd = 1;
763 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000764
765 return cd;
766}
767
Kim Phillips87ea3892012-10-29 13:34:43 +0000768static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500769{
770 struct mmc_cmd cmd;
771 struct mmc_data data;
772
773 /* Switch the frequency */
774 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
775 cmd.resp_type = MMC_RSP_R1;
776 cmd.cmdarg = (mode << 31) | 0xffffff;
777 cmd.cmdarg &= ~(0xf << (group * 4));
778 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500779
780 data.dest = (char *)resp;
781 data.blocksize = 64;
782 data.blocks = 1;
783 data.flags = MMC_DATA_READ;
784
785 return mmc_send_cmd(mmc, &cmd, &data);
786}
787
788
Kim Phillips87ea3892012-10-29 13:34:43 +0000789static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500790{
791 int err;
792 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000793 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
794 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500795 struct mmc_data data;
796 int timeout;
797
798 mmc->card_caps = 0;
799
Thomas Chou1254c3d2010-12-24 13:12:21 +0000800 if (mmc_host_is_spi(mmc))
801 return 0;
802
Andy Flemingad347bb2008-10-30 16:41:01 -0500803 /* Read the SCR to find out if this card supports higher speeds */
804 cmd.cmdidx = MMC_CMD_APP_CMD;
805 cmd.resp_type = MMC_RSP_R1;
806 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500807
808 err = mmc_send_cmd(mmc, &cmd, NULL);
809
810 if (err)
811 return err;
812
813 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
814 cmd.resp_type = MMC_RSP_R1;
815 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500816
817 timeout = 3;
818
819retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000820 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500821 data.blocksize = 8;
822 data.blocks = 1;
823 data.flags = MMC_DATA_READ;
824
825 err = mmc_send_cmd(mmc, &cmd, &data);
826
827 if (err) {
828 if (timeout--)
829 goto retry_scr;
830
831 return err;
832 }
833
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300834 mmc->scr[0] = __be32_to_cpu(scr[0]);
835 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500836
837 switch ((mmc->scr[0] >> 24) & 0xf) {
838 case 0:
839 mmc->version = SD_VERSION_1_0;
840 break;
841 case 1:
842 mmc->version = SD_VERSION_1_10;
843 break;
844 case 2:
845 mmc->version = SD_VERSION_2;
Jaehoon Chungd552bd12013-01-29 22:58:16 +0000846 if ((mmc->scr[0] >> 15) & 0x1)
847 mmc->version = SD_VERSION_3;
Andy Flemingad347bb2008-10-30 16:41:01 -0500848 break;
849 default:
850 mmc->version = SD_VERSION_1_0;
851 break;
852 }
853
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530854 if (mmc->scr[0] & SD_DATA_4BIT)
855 mmc->card_caps |= MMC_MODE_4BIT;
856
Andy Flemingad347bb2008-10-30 16:41:01 -0500857 /* Version 1.0 doesn't support switching */
858 if (mmc->version == SD_VERSION_1_0)
859 return 0;
860
861 timeout = 4;
862 while (timeout--) {
863 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000864 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500865
866 if (err)
867 return err;
868
869 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300870 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500871 break;
872 }
873
Andy Flemingad347bb2008-10-30 16:41:01 -0500874 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300875 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500876 return 0;
877
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000878 /*
879 * If the host doesn't support SD_HIGHSPEED, do not switch card to
880 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
881 * This can avoid furthur problem when the card runs in different
882 * mode between the host.
883 */
884 if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
885 (mmc->host_caps & MMC_MODE_HS)))
886 return 0;
887
Anton staaf9b00f0d2011-10-03 13:54:59 +0000888 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500889
890 if (err)
891 return err;
892
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300893 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500894 mmc->card_caps |= MMC_MODE_HS;
895
896 return 0;
897}
898
899/* frequency bases */
900/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000901static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500902 10000,
903 100000,
904 1000000,
905 10000000,
906};
907
908/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
909 * to platforms without floating point.
910 */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000911static const int multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500912 0, /* reserved */
913 10,
914 12,
915 13,
916 15,
917 20,
918 25,
919 30,
920 35,
921 40,
922 45,
923 50,
924 55,
925 60,
926 70,
927 80,
928};
929
Kim Phillips87ea3892012-10-29 13:34:43 +0000930static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500931{
932 mmc->set_ios(mmc);
933}
934
935void mmc_set_clock(struct mmc *mmc, uint clock)
936{
937 if (clock > mmc->f_max)
938 clock = mmc->f_max;
939
940 if (clock < mmc->f_min)
941 clock = mmc->f_min;
942
943 mmc->clock = clock;
944
945 mmc_set_ios(mmc);
946}
947
Kim Phillips87ea3892012-10-29 13:34:43 +0000948static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -0500949{
950 mmc->bus_width = width;
951
952 mmc_set_ios(mmc);
953}
954
Kim Phillips87ea3892012-10-29 13:34:43 +0000955static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500956{
Stephen Warrene315ae82013-06-11 15:14:01 -0600957 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -0500958 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +0000959 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -0500960 struct mmc_cmd cmd;
Simon Glassa09c2b72013-04-03 08:54:30 +0000961 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
962 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000963 int timeout = 1000;
Andy Flemingad347bb2008-10-30 16:41:01 -0500964
Thomas Chou1254c3d2010-12-24 13:12:21 +0000965#ifdef CONFIG_MMC_SPI_CRC_ON
966 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
967 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
968 cmd.resp_type = MMC_RSP_R1;
969 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000970 err = mmc_send_cmd(mmc, &cmd, NULL);
971
972 if (err)
973 return err;
974 }
975#endif
976
Andy Flemingad347bb2008-10-30 16:41:01 -0500977 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000978 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
979 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -0500980 cmd.resp_type = MMC_RSP_R2;
981 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500982
983 err = mmc_send_cmd(mmc, &cmd, NULL);
984
985 if (err)
986 return err;
987
988 memcpy(mmc->cid, cmd.response, 16);
989
990 /*
991 * For MMC cards, set the Relative Address.
992 * For SD cards, get the Relatvie Address.
993 * This also puts the cards into Standby State
994 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000995 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
996 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
997 cmd.cmdarg = mmc->rca << 16;
998 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -0500999
Thomas Chou1254c3d2010-12-24 13:12:21 +00001000 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001001
Thomas Chou1254c3d2010-12-24 13:12:21 +00001002 if (err)
1003 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001004
Thomas Chou1254c3d2010-12-24 13:12:21 +00001005 if (IS_SD(mmc))
1006 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1007 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001008
1009 /* Get the Card-Specific Data */
1010 cmd.cmdidx = MMC_CMD_SEND_CSD;
1011 cmd.resp_type = MMC_RSP_R2;
1012 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001013
1014 err = mmc_send_cmd(mmc, &cmd, NULL);
1015
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001016 /* Waiting for the ready status */
1017 mmc_send_status(mmc, timeout);
1018
Andy Flemingad347bb2008-10-30 16:41:01 -05001019 if (err)
1020 return err;
1021
Rabin Vincentb6eed942009-04-05 13:30:56 +05301022 mmc->csd[0] = cmd.response[0];
1023 mmc->csd[1] = cmd.response[1];
1024 mmc->csd[2] = cmd.response[2];
1025 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001026
1027 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301028 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001029
1030 switch (version) {
1031 case 0:
1032 mmc->version = MMC_VERSION_1_2;
1033 break;
1034 case 1:
1035 mmc->version = MMC_VERSION_1_4;
1036 break;
1037 case 2:
1038 mmc->version = MMC_VERSION_2_2;
1039 break;
1040 case 3:
1041 mmc->version = MMC_VERSION_3;
1042 break;
1043 case 4:
1044 mmc->version = MMC_VERSION_4;
1045 break;
1046 default:
1047 mmc->version = MMC_VERSION_1_2;
1048 break;
1049 }
1050 }
1051
1052 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301053 freq = fbase[(cmd.response[0] & 0x7)];
1054 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001055
1056 mmc->tran_speed = freq * mult;
1057
Rabin Vincentb6eed942009-04-05 13:30:56 +05301058 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001059
1060 if (IS_SD(mmc))
1061 mmc->write_bl_len = mmc->read_bl_len;
1062 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301063 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001064
1065 if (mmc->high_capacity) {
1066 csize = (mmc->csd[1] & 0x3f) << 16
1067 | (mmc->csd[2] & 0xffff0000) >> 16;
1068 cmult = 8;
1069 } else {
1070 csize = (mmc->csd[1] & 0x3ff) << 2
1071 | (mmc->csd[2] & 0xc0000000) >> 30;
1072 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1073 }
1074
Stephen Warrene315ae82013-06-11 15:14:01 -06001075 mmc->capacity_user = (csize + 1) << (cmult + 2);
1076 mmc->capacity_user *= mmc->read_bl_len;
1077 mmc->capacity_boot = 0;
1078 mmc->capacity_rpmb = 0;
1079 for (i = 0; i < 4; i++)
1080 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001081
Simon Glassa09c2b72013-04-03 08:54:30 +00001082 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1083 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001084
Simon Glassa09c2b72013-04-03 08:54:30 +00001085 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1086 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001087
1088 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001089 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1090 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001091 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001092 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001093 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001094
Thomas Chou1254c3d2010-12-24 13:12:21 +00001095 if (err)
1096 return err;
1097 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001098
Lei Wenea526762011-06-22 17:03:31 +00001099 /*
1100 * For SD, its erase group is always one sector
1101 */
1102 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001103 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301104 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1105 /* check ext_csd version and capacity */
1106 err = mmc_send_ext_csd(mmc, ext_csd);
Kim Phillips87ea3892012-10-29 13:34:43 +00001107 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001108 /*
1109 * According to the JEDEC Standard, the value of
1110 * ext_csd's capacity is valid if the value is more
1111 * than 2GB
1112 */
Lei Wen217467f2011-10-03 20:35:10 +00001113 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1114 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1115 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1116 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glassa09c2b72013-04-03 08:54:30 +00001117 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001118 if ((capacity >> 20) > 2 * 1024)
Stephen Warrene315ae82013-06-11 15:14:01 -06001119 mmc->capacity_user = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301120 }
Lei Wen31b99802011-05-02 16:26:26 +00001121
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001122 switch (ext_csd[EXT_CSD_REV]) {
1123 case 1:
1124 mmc->version = MMC_VERSION_4_1;
1125 break;
1126 case 2:
1127 mmc->version = MMC_VERSION_4_2;
1128 break;
1129 case 3:
1130 mmc->version = MMC_VERSION_4_3;
1131 break;
1132 case 5:
1133 mmc->version = MMC_VERSION_4_41;
1134 break;
1135 case 6:
1136 mmc->version = MMC_VERSION_4_5;
1137 break;
1138 }
1139
Lei Wenea526762011-06-22 17:03:31 +00001140 /*
1141 * Check whether GROUP_DEF is set, if yes, read out
1142 * group size from ext_csd directly, or calculate
1143 * the group size from the csd value.
1144 */
Simon Glassa09c2b72013-04-03 08:54:30 +00001145 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF]) {
Lei Wen217467f2011-10-03 20:35:10 +00001146 mmc->erase_grp_size =
Simon Glassa09c2b72013-04-03 08:54:30 +00001147 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
1148 MMC_MAX_BLOCK_LEN * 1024;
1149 } else {
Lei Wenea526762011-06-22 17:03:31 +00001150 int erase_gsz, erase_gmul;
1151 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1152 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1153 mmc->erase_grp_size = (erase_gsz + 1)
1154 * (erase_gmul + 1);
1155 }
1156
Lei Wen31b99802011-05-02 16:26:26 +00001157 /* store the partition info of emmc */
Stephen Warren009784c2012-07-30 10:55:43 +00001158 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1159 ext_csd[EXT_CSD_BOOT_MULT])
Lei Wen217467f2011-10-03 20:35:10 +00001160 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Stephen Warrene315ae82013-06-11 15:14:01 -06001161
1162 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1163
1164 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1165
1166 for (i = 0; i < 4; i++) {
1167 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1168 mmc->capacity_gp[i] = (ext_csd[idx + 2] << 16) +
1169 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1170 mmc->capacity_gp[i] *=
1171 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1172 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1173 }
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301174 }
1175
Stephen Warrene315ae82013-06-11 15:14:01 -06001176 err = mmc_set_capacity(mmc, mmc->part_num);
1177 if (err)
1178 return err;
1179
Andy Flemingad347bb2008-10-30 16:41:01 -05001180 if (IS_SD(mmc))
1181 err = sd_change_freq(mmc);
1182 else
1183 err = mmc_change_freq(mmc);
1184
1185 if (err)
1186 return err;
1187
1188 /* Restrict card's capabilities by what the host can do */
1189 mmc->card_caps &= mmc->host_caps;
1190
1191 if (IS_SD(mmc)) {
1192 if (mmc->card_caps & MMC_MODE_4BIT) {
1193 cmd.cmdidx = MMC_CMD_APP_CMD;
1194 cmd.resp_type = MMC_RSP_R1;
1195 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001196
1197 err = mmc_send_cmd(mmc, &cmd, NULL);
1198 if (err)
1199 return err;
1200
1201 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1202 cmd.resp_type = MMC_RSP_R1;
1203 cmd.cmdarg = 2;
Andy Flemingad347bb2008-10-30 16:41:01 -05001204 err = mmc_send_cmd(mmc, &cmd, NULL);
1205 if (err)
1206 return err;
1207
1208 mmc_set_bus_width(mmc, 4);
1209 }
1210
1211 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001212 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001213 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001214 mmc->tran_speed = 25000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001215 } else {
Andy Flemingeb766ad2012-10-31 19:02:38 +00001216 int idx;
1217
1218 /* An array of possible bus widths in order of preference */
1219 static unsigned ext_csd_bits[] = {
1220 EXT_CSD_BUS_WIDTH_8,
1221 EXT_CSD_BUS_WIDTH_4,
1222 EXT_CSD_BUS_WIDTH_1,
1223 };
1224
1225 /* An array to map CSD bus widths to host cap bits */
1226 static unsigned ext_to_hostcaps[] = {
1227 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1228 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1229 };
1230
1231 /* An array to map chosen bus width to an integer */
1232 static unsigned widths[] = {
1233 8, 4, 1,
1234 };
1235
1236 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1237 unsigned int extw = ext_csd_bits[idx];
1238
1239 /*
1240 * Check to make sure the controller supports
1241 * this bus width, if it's more than 1
1242 */
1243 if (extw != EXT_CSD_BUS_WIDTH_1 &&
1244 !(mmc->host_caps & ext_to_hostcaps[extw]))
1245 continue;
1246
Andy Flemingad347bb2008-10-30 16:41:01 -05001247 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001248 EXT_CSD_BUS_WIDTH, extw);
Andy Flemingad347bb2008-10-30 16:41:01 -05001249
1250 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001251 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001252
Andy Flemingeb766ad2012-10-31 19:02:38 +00001253 mmc_set_bus_width(mmc, widths[idx]);
Andy Flemingad347bb2008-10-30 16:41:01 -05001254
Lei Wen4f5a6a52011-10-03 20:35:11 +00001255 err = mmc_send_ext_csd(mmc, test_csd);
1256 if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1257 == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1258 && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1259 == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1260 && ext_csd[EXT_CSD_REV] \
1261 == test_csd[EXT_CSD_REV]
1262 && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1263 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1264 && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1265 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
Andy Flemingad347bb2008-10-30 16:41:01 -05001266
Andy Flemingeb766ad2012-10-31 19:02:38 +00001267 mmc->card_caps |= ext_to_hostcaps[extw];
Lei Wen4f5a6a52011-10-03 20:35:11 +00001268 break;
1269 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001270 }
1271
1272 if (mmc->card_caps & MMC_MODE_HS) {
1273 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001274 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001275 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001276 mmc->tran_speed = 26000000;
1277 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001278 }
1279
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001280 mmc_set_clock(mmc, mmc->tran_speed);
1281
Andy Flemingad347bb2008-10-30 16:41:01 -05001282 /* fill in device description */
1283 mmc->block_dev.lun = 0;
1284 mmc->block_dev.type = 0;
1285 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich2eec2ab2013-04-09 21:11:56 +00001286 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent69d4e2c2009-04-05 13:30:54 +05301287 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001288#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Taylor Hutt7367ec22012-10-20 17:15:59 +00001289 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1290 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1291 (mmc->cid[3] >> 16) & 0xffff);
1292 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1293 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1294 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1295 (mmc->cid[2] >> 24) & 0xff);
1296 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1297 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001298#else
1299 mmc->block_dev.vendor[0] = 0;
1300 mmc->block_dev.product[0] = 0;
1301 mmc->block_dev.revision[0] = 0;
1302#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001303#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001304 init_part(&mmc->block_dev);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001305#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001306
1307 return 0;
1308}
1309
Kim Phillips87ea3892012-10-29 13:34:43 +00001310static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001311{
1312 struct mmc_cmd cmd;
1313 int err;
1314
1315 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1316 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1317 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1318 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001319
1320 err = mmc_send_cmd(mmc, &cmd, NULL);
1321
1322 if (err)
1323 return err;
1324
Rabin Vincentb6eed942009-04-05 13:30:56 +05301325 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Flemingad347bb2008-10-30 16:41:01 -05001326 return UNUSABLE_ERR;
1327 else
1328 mmc->version = SD_VERSION_2;
1329
1330 return 0;
1331}
1332
1333int mmc_register(struct mmc *mmc)
1334{
1335 /* Setup the universal parts of the block interface just once */
1336 mmc->block_dev.if_type = IF_TYPE_MMC;
1337 mmc->block_dev.dev = cur_dev_num++;
1338 mmc->block_dev.removable = 1;
1339 mmc->block_dev.block_read = mmc_bread;
1340 mmc->block_dev.block_write = mmc_bwrite;
Lei Wenea526762011-06-22 17:03:31 +00001341 mmc->block_dev.block_erase = mmc_berase;
John Rigbyf2f43662011-04-18 05:50:08 +00001342 if (!mmc->b_max)
1343 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
Andy Flemingad347bb2008-10-30 16:41:01 -05001344
1345 INIT_LIST_HEAD (&mmc->link);
1346
1347 list_add_tail (&mmc->link, &mmc_devices);
1348
1349 return 0;
1350}
1351
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001352#ifdef CONFIG_PARTITIONS
Andy Flemingad347bb2008-10-30 16:41:01 -05001353block_dev_desc_t *mmc_get_dev(int dev)
1354{
1355 struct mmc *mmc = find_mmc_device(dev);
Benoît Thébaudeau6ce8aed2012-08-10 08:59:12 +00001356 if (!mmc || mmc_init(mmc))
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001357 return NULL;
Andy Flemingad347bb2008-10-30 16:41:01 -05001358
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001359 return &mmc->block_dev;
Andy Flemingad347bb2008-10-30 16:41:01 -05001360}
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001361#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001362
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001363int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001364{
Macpaul Lin028bde12011-11-14 23:35:39 +00001365 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001366
Thierry Redingb9c8b772012-01-02 01:15:37 +00001367 if (mmc_getcd(mmc) == 0) {
1368 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001369#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001370 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001371#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +00001372 return NO_CARD_ERR;
1373 }
1374
Lei Wen31b99802011-05-02 16:26:26 +00001375 if (mmc->has_init)
1376 return 0;
1377
Andy Flemingad347bb2008-10-30 16:41:01 -05001378 err = mmc->init(mmc);
1379
1380 if (err)
1381 return err;
1382
Ilya Yanok8459aab2009-06-29 17:53:16 +04001383 mmc_set_bus_width(mmc, 1);
1384 mmc_set_clock(mmc, 1);
1385
Andy Flemingad347bb2008-10-30 16:41:01 -05001386 /* Reset the Card */
1387 err = mmc_go_idle(mmc);
1388
1389 if (err)
1390 return err;
1391
Lei Wen31b99802011-05-02 16:26:26 +00001392 /* The internal partition reset to user partition(0) at every CMD0*/
1393 mmc->part_num = 0;
1394
Andy Flemingad347bb2008-10-30 16:41:01 -05001395 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001396 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001397
Andy Flemingad347bb2008-10-30 16:41:01 -05001398 /* Now try to get the SD card's operating condition */
1399 err = sd_send_op_cond(mmc);
1400
1401 /* If the command timed out, we check for an MMC card */
1402 if (err == TIMEOUT) {
1403 err = mmc_send_op_cond(mmc);
1404
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001405 if (err && err != IN_PROGRESS) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001406#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001407 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001408#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001409 return UNUSABLE_ERR;
1410 }
1411 }
1412
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001413 if (err == IN_PROGRESS)
1414 mmc->init_in_progress = 1;
1415
1416 return err;
1417}
1418
1419static int mmc_complete_init(struct mmc *mmc)
1420{
1421 int err = 0;
1422
1423 if (mmc->op_cond_pending)
1424 err = mmc_complete_op_cond(mmc);
1425
1426 if (!err)
1427 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001428 if (err)
1429 mmc->has_init = 0;
1430 else
1431 mmc->has_init = 1;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001432 mmc->init_in_progress = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001433 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001434}
1435
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001436int mmc_init(struct mmc *mmc)
1437{
1438 int err = IN_PROGRESS;
1439 unsigned start = get_timer(0);
1440
1441 if (mmc->has_init)
1442 return 0;
1443 if (!mmc->init_in_progress)
1444 err = mmc_start_init(mmc);
1445
1446 if (!err || err == IN_PROGRESS)
1447 err = mmc_complete_init(mmc);
1448 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1449 return err;
1450}
1451
Andy Flemingad347bb2008-10-30 16:41:01 -05001452/*
1453 * CPU and board-specific MMC initializations. Aliased function
1454 * signals caller to move on
1455 */
1456static int __def_mmc_init(bd_t *bis)
1457{
1458 return -1;
1459}
1460
Peter Tyser21d2cd22009-04-20 11:08:46 -05001461int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1462int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Flemingad347bb2008-10-30 16:41:01 -05001463
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001464#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1465
Andy Flemingad347bb2008-10-30 16:41:01 -05001466void print_mmc_devices(char separator)
1467{
1468 struct mmc *m;
1469 struct list_head *entry;
1470
1471 list_for_each(entry, &mmc_devices) {
1472 m = list_entry(entry, struct mmc, link);
1473
1474 printf("%s: %d", m->name, m->block_dev.dev);
1475
1476 if (entry->next != &mmc_devices)
1477 printf("%c ", separator);
1478 }
1479
1480 printf("\n");
1481}
1482
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001483#else
1484void print_mmc_devices(char separator) { }
1485#endif
1486
Lei Wend430d7c2011-05-02 16:26:25 +00001487int get_mmc_num(void)
1488{
1489 return cur_dev_num;
1490}
1491
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001492void mmc_set_preinit(struct mmc *mmc, int preinit)
1493{
1494 mmc->preinit = preinit;
1495}
1496
1497static void do_preinit(void)
1498{
1499 struct mmc *m;
1500 struct list_head *entry;
1501
1502 list_for_each(entry, &mmc_devices) {
1503 m = list_entry(entry, struct mmc, link);
1504
1505 if (m->preinit)
1506 mmc_start_init(m);
1507 }
1508}
1509
1510
Andy Flemingad347bb2008-10-30 16:41:01 -05001511int mmc_initialize(bd_t *bis)
1512{
1513 INIT_LIST_HEAD (&mmc_devices);
1514 cur_dev_num = 0;
1515
1516 if (board_mmc_init(bis) < 0)
1517 cpu_mmc_init(bis);
1518
Ying Zhang9ff70262013-08-16 15:16:11 +08001519#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001520 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001521#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001522
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001523 do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001524 return 0;
1525}
Amar1104e9b2013-04-27 11:42:58 +05301526
1527#ifdef CONFIG_SUPPORT_EMMC_BOOT
1528/*
1529 * This function changes the size of boot partition and the size of rpmb
1530 * partition present on EMMC devices.
1531 *
1532 * Input Parameters:
1533 * struct *mmc: pointer for the mmc device strcuture
1534 * bootsize: size of boot partition
1535 * rpmbsize: size of rpmb partition
1536 *
1537 * Returns 0 on success.
1538 */
1539
1540int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1541 unsigned long rpmbsize)
1542{
1543 int err;
1544 struct mmc_cmd cmd;
1545
1546 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1547 cmd.cmdidx = MMC_CMD_RES_MAN;
1548 cmd.resp_type = MMC_RSP_R1b;
1549 cmd.cmdarg = MMC_CMD62_ARG1;
1550
1551 err = mmc_send_cmd(mmc, &cmd, NULL);
1552 if (err) {
1553 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1554 return err;
1555 }
1556
1557 /* Boot partition changing mode */
1558 cmd.cmdidx = MMC_CMD_RES_MAN;
1559 cmd.resp_type = MMC_RSP_R1b;
1560 cmd.cmdarg = MMC_CMD62_ARG2;
1561
1562 err = mmc_send_cmd(mmc, &cmd, NULL);
1563 if (err) {
1564 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1565 return err;
1566 }
1567 /* boot partition size is multiple of 128KB */
1568 bootsize = (bootsize * 1024) / 128;
1569
1570 /* Arg: boot partition size */
1571 cmd.cmdidx = MMC_CMD_RES_MAN;
1572 cmd.resp_type = MMC_RSP_R1b;
1573 cmd.cmdarg = bootsize;
1574
1575 err = mmc_send_cmd(mmc, &cmd, NULL);
1576 if (err) {
1577 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1578 return err;
1579 }
1580 /* RPMB partition size is multiple of 128KB */
1581 rpmbsize = (rpmbsize * 1024) / 128;
1582 /* Arg: RPMB partition size */
1583 cmd.cmdidx = MMC_CMD_RES_MAN;
1584 cmd.resp_type = MMC_RSP_R1b;
1585 cmd.cmdarg = rpmbsize;
1586
1587 err = mmc_send_cmd(mmc, &cmd, NULL);
1588 if (err) {
1589 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1590 return err;
1591 }
1592 return 0;
1593}
1594
1595/*
1596 * This function shall form and send the commands to open / close the
1597 * boot partition specified by user.
1598 *
1599 * Input Parameters:
1600 * ack: 0x0 - No boot acknowledge sent (default)
1601 * 0x1 - Boot acknowledge sent during boot operation
1602 * part_num: User selects boot data that will be sent to master
1603 * 0x0 - Device not boot enabled (default)
1604 * 0x1 - Boot partition 1 enabled for boot
1605 * 0x2 - Boot partition 2 enabled for boot
1606 * access: User selects partitions to access
1607 * 0x0 : No access to boot partition (default)
1608 * 0x1 : R/W boot partition 1
1609 * 0x2 : R/W boot partition 2
1610 * 0x3 : R/W Replay Protected Memory Block (RPMB)
1611 *
1612 * Returns 0 on success.
1613 */
1614int mmc_boot_part_access(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1615{
1616 int err;
1617 struct mmc_cmd cmd;
1618
1619 /* Boot ack enable, boot partition enable , boot partition access */
1620 cmd.cmdidx = MMC_CMD_SWITCH;
1621 cmd.resp_type = MMC_RSP_R1b;
1622
1623 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
1624 (EXT_CSD_PART_CONF << 16) |
1625 ((EXT_CSD_BOOT_ACK(ack) |
1626 EXT_CSD_BOOT_PART_NUM(part_num) |
1627 EXT_CSD_PARTITION_ACCESS(access)) << 8);
1628
1629 err = mmc_send_cmd(mmc, &cmd, NULL);
1630 if (err) {
1631 if (access) {
1632 debug("mmc boot partition#%d open fail:Error1 = %d\n",
1633 part_num, err);
1634 } else {
1635 debug("mmc boot partition#%d close fail:Error = %d\n",
1636 part_num, err);
1637 }
1638 return err;
1639 }
1640
1641 if (access) {
1642 /* 4bit transfer mode at booting time. */
1643 cmd.cmdidx = MMC_CMD_SWITCH;
1644 cmd.resp_type = MMC_RSP_R1b;
1645
1646 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
1647 (EXT_CSD_BOOT_BUS_WIDTH << 16) |
1648 ((1 << 0) << 8);
1649
1650 err = mmc_send_cmd(mmc, &cmd, NULL);
1651 if (err) {
1652 debug("mmc boot partition#%d open fail:Error2 = %d\n",
1653 part_num, err);
1654 return err;
1655 }
1656 }
1657 return 0;
1658}
1659#endif