]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/mmc/mmc.c
mmc: Fix erase_grp_size for partitioned card
[people/ms/u-boot.git] / drivers / mmc / mmc.c
1 /*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
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>
17 #include <div64.h>
18 #include "mmc_private.h"
19
20 /* Set block count limit because of 16 bit register limit on some hardware*/
21 #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
22 #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
23 #endif
24
25 static struct list_head mmc_devices;
26 static int cur_dev_num = -1;
27
28 int __weak board_mmc_getwp(struct mmc *mmc)
29 {
30 return -1;
31 }
32
33 int mmc_getwp(struct mmc *mmc)
34 {
35 int wp;
36
37 wp = board_mmc_getwp(mmc);
38
39 if (wp < 0) {
40 if (mmc->getwp)
41 wp = mmc->getwp(mmc);
42 else
43 wp = 0;
44 }
45
46 return wp;
47 }
48
49 int __board_mmc_getcd(struct mmc *mmc) {
50 return -1;
51 }
52
53 int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
54 alias("__board_mmc_getcd")));
55
56 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
57 {
58 int ret;
59
60 #ifdef CONFIG_MMC_TRACE
61 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);
66 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);
93 ptr = (u8 *)&cmd->response[i];
94 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 }
108 #else
109 ret = mmc->send_cmd(mmc, cmd, data);
110 #endif
111 return ret;
112 }
113
114 int mmc_send_status(struct mmc *mmc, int timeout)
115 {
116 struct mmc_cmd cmd;
117 int err, retries = 5;
118 #ifdef CONFIG_MMC_TRACE
119 int status;
120 #endif
121
122 cmd.cmdidx = MMC_CMD_SEND_STATUS;
123 cmd.resp_type = MMC_RSP_R1;
124 if (!mmc_host_is_spi(mmc))
125 cmd.cmdarg = mmc->rca << 16;
126
127 do {
128 err = mmc_send_cmd(mmc, &cmd, NULL);
129 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) {
135 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
136 printf("Status Error: 0x%08X\n",
137 cmd.response[0]);
138 #endif
139 return COMM_ERR;
140 }
141 } else if (--retries < 0)
142 return err;
143
144 udelay(1000);
145
146 } while (timeout--);
147
148 #ifdef CONFIG_MMC_TRACE
149 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
150 printf("CURR STATE:%d\n", status);
151 #endif
152 if (timeout <= 0) {
153 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
154 printf("Timeout waiting card ready\n");
155 #endif
156 return TIMEOUT;
157 }
158
159 return 0;
160 }
161
162 int mmc_set_blocklen(struct mmc *mmc, int len)
163 {
164 struct mmc_cmd cmd;
165
166 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
167 cmd.resp_type = MMC_RSP_R1;
168 cmd.cmdarg = len;
169
170 return mmc_send_cmd(mmc, &cmd, NULL);
171 }
172
173 struct 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
185 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
186 printf("MMC Device %d not found\n", dev_num);
187 #endif
188
189 return NULL;
190 }
191
192 static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
193 lbaint_t blkcnt)
194 {
195 struct mmc_cmd cmd;
196 struct mmc_data data;
197
198 if (blkcnt > 1)
199 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
200 else
201 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
202
203 if (mmc->high_capacity)
204 cmd.cmdarg = start;
205 else
206 cmd.cmdarg = start * mmc->read_bl_len;
207
208 cmd.resp_type = MMC_RSP_R1;
209
210 data.dest = dst;
211 data.blocks = blkcnt;
212 data.blocksize = mmc->read_bl_len;
213 data.flags = MMC_DATA_READ;
214
215 if (mmc_send_cmd(mmc, &cmd, &data))
216 return 0;
217
218 if (blkcnt > 1) {
219 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
220 cmd.cmdarg = 0;
221 cmd.resp_type = MMC_RSP_R1b;
222 if (mmc_send_cmd(mmc, &cmd, NULL)) {
223 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
224 printf("mmc fail to send stop cmd\n");
225 #endif
226 return 0;
227 }
228 }
229
230 return blkcnt;
231 }
232
233 static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst)
234 {
235 lbaint_t cur, blocks_todo = blkcnt;
236
237 if (blkcnt == 0)
238 return 0;
239
240 struct mmc *mmc = find_mmc_device(dev_num);
241 if (!mmc)
242 return 0;
243
244 if ((start + blkcnt) > mmc->block_dev.lba) {
245 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
246 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
247 start + blkcnt, mmc->block_dev.lba);
248 #endif
249 return 0;
250 }
251
252 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
253 return 0;
254
255 do {
256 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
257 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
258 return 0;
259 blocks_todo -= cur;
260 start += cur;
261 dst += cur * mmc->read_bl_len;
262 } while (blocks_todo > 0);
263
264 return blkcnt;
265 }
266
267 static int mmc_go_idle(struct mmc *mmc)
268 {
269 struct mmc_cmd cmd;
270 int err;
271
272 udelay(1000);
273
274 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
275 cmd.cmdarg = 0;
276 cmd.resp_type = MMC_RSP_NONE;
277
278 err = mmc_send_cmd(mmc, &cmd, NULL);
279
280 if (err)
281 return err;
282
283 udelay(2000);
284
285 return 0;
286 }
287
288 static int sd_send_op_cond(struct mmc *mmc)
289 {
290 int timeout = 1000;
291 int err;
292 struct mmc_cmd cmd;
293
294 do {
295 cmd.cmdidx = MMC_CMD_APP_CMD;
296 cmd.resp_type = MMC_RSP_R1;
297 cmd.cmdarg = 0;
298
299 err = mmc_send_cmd(mmc, &cmd, NULL);
300
301 if (err)
302 return err;
303
304 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
305 cmd.resp_type = MMC_RSP_R3;
306
307 /*
308 * Most cards do not answer if some reserved bits
309 * in the ocr are set. However, Some controller
310 * can set bit 7 (reserved for low voltages), but
311 * how to manage low voltages SD card is not yet
312 * specified.
313 */
314 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
315 (mmc->voltages & 0xff8000);
316
317 if (mmc->version == SD_VERSION_2)
318 cmd.cmdarg |= OCR_HCS;
319
320 err = mmc_send_cmd(mmc, &cmd, NULL);
321
322 if (err)
323 return err;
324
325 udelay(1000);
326 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
327
328 if (timeout <= 0)
329 return UNUSABLE_ERR;
330
331 if (mmc->version != SD_VERSION_2)
332 mmc->version = SD_VERSION_1_0;
333
334 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
335 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
336 cmd.resp_type = MMC_RSP_R3;
337 cmd.cmdarg = 0;
338
339 err = mmc_send_cmd(mmc, &cmd, NULL);
340
341 if (err)
342 return err;
343 }
344
345 mmc->ocr = cmd.response[0];
346
347 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
348 mmc->rca = 0;
349
350 return 0;
351 }
352
353 /* We pass in the cmd since otherwise the init seems to fail */
354 static int mmc_send_op_cond_iter(struct mmc *mmc, struct mmc_cmd *cmd,
355 int use_arg)
356 {
357 int err;
358
359 cmd->cmdidx = MMC_CMD_SEND_OP_COND;
360 cmd->resp_type = MMC_RSP_R3;
361 cmd->cmdarg = 0;
362 if (use_arg && !mmc_host_is_spi(mmc)) {
363 cmd->cmdarg =
364 (mmc->voltages &
365 (mmc->op_cond_response & OCR_VOLTAGE_MASK)) |
366 (mmc->op_cond_response & OCR_ACCESS_MODE);
367
368 if (mmc->host_caps & MMC_MODE_HC)
369 cmd->cmdarg |= OCR_HCS;
370 }
371 err = mmc_send_cmd(mmc, cmd, NULL);
372 if (err)
373 return err;
374 mmc->op_cond_response = cmd->response[0];
375 return 0;
376 }
377
378 int mmc_send_op_cond(struct mmc *mmc)
379 {
380 struct mmc_cmd cmd;
381 int err, i;
382
383 /* Some cards seem to need this */
384 mmc_go_idle(mmc);
385
386 /* Asking to the card its capabilities */
387 mmc->op_cond_pending = 1;
388 for (i = 0; i < 2; i++) {
389 err = mmc_send_op_cond_iter(mmc, &cmd, i != 0);
390 if (err)
391 return err;
392
393 /* exit if not busy (flag seems to be inverted) */
394 if (mmc->op_cond_response & OCR_BUSY)
395 return 0;
396 }
397 return IN_PROGRESS;
398 }
399
400 int mmc_complete_op_cond(struct mmc *mmc)
401 {
402 struct mmc_cmd cmd;
403 int timeout = 1000;
404 uint start;
405 int err;
406
407 mmc->op_cond_pending = 0;
408 start = get_timer(0);
409 do {
410 err = mmc_send_op_cond_iter(mmc, &cmd, 1);
411 if (err)
412 return err;
413 if (get_timer(start) > timeout)
414 return UNUSABLE_ERR;
415 udelay(100);
416 } while (!(mmc->op_cond_response & OCR_BUSY));
417
418 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
419 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
420 cmd.resp_type = MMC_RSP_R3;
421 cmd.cmdarg = 0;
422
423 err = mmc_send_cmd(mmc, &cmd, NULL);
424
425 if (err)
426 return err;
427 }
428
429 mmc->version = MMC_VERSION_UNKNOWN;
430 mmc->ocr = cmd.response[0];
431
432 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
433 mmc->rca = 0;
434
435 return 0;
436 }
437
438
439 static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
440 {
441 struct mmc_cmd cmd;
442 struct mmc_data data;
443 int err;
444
445 /* Get the Card Status Register */
446 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
447 cmd.resp_type = MMC_RSP_R1;
448 cmd.cmdarg = 0;
449
450 data.dest = (char *)ext_csd;
451 data.blocks = 1;
452 data.blocksize = MMC_MAX_BLOCK_LEN;
453 data.flags = MMC_DATA_READ;
454
455 err = mmc_send_cmd(mmc, &cmd, &data);
456
457 return err;
458 }
459
460
461 static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
462 {
463 struct mmc_cmd cmd;
464 int timeout = 1000;
465 int ret;
466
467 cmd.cmdidx = MMC_CMD_SWITCH;
468 cmd.resp_type = MMC_RSP_R1b;
469 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
470 (index << 16) |
471 (value << 8);
472
473 ret = mmc_send_cmd(mmc, &cmd, NULL);
474
475 /* Waiting for the ready status */
476 if (!ret)
477 ret = mmc_send_status(mmc, timeout);
478
479 return ret;
480
481 }
482
483 static int mmc_change_freq(struct mmc *mmc)
484 {
485 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
486 char cardtype;
487 int err;
488
489 mmc->card_caps = 0;
490
491 if (mmc_host_is_spi(mmc))
492 return 0;
493
494 /* Only version 4 supports high-speed */
495 if (mmc->version < MMC_VERSION_4)
496 return 0;
497
498 err = mmc_send_ext_csd(mmc, ext_csd);
499
500 if (err)
501 return err;
502
503 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
504
505 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
506
507 if (err)
508 return err;
509
510 /* Now check to see that it worked */
511 err = mmc_send_ext_csd(mmc, ext_csd);
512
513 if (err)
514 return err;
515
516 /* No high-speed support */
517 if (!ext_csd[EXT_CSD_HS_TIMING])
518 return 0;
519
520 /* High Speed is set, there are two types: 52MHz and 26MHz */
521 if (cardtype & MMC_HS_52MHZ)
522 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
523 else
524 mmc->card_caps |= MMC_MODE_HS;
525
526 return 0;
527 }
528
529 static int mmc_set_capacity(struct mmc *mmc, int part_num)
530 {
531 switch (part_num) {
532 case 0:
533 mmc->capacity = mmc->capacity_user;
534 break;
535 case 1:
536 case 2:
537 mmc->capacity = mmc->capacity_boot;
538 break;
539 case 3:
540 mmc->capacity = mmc->capacity_rpmb;
541 break;
542 case 4:
543 case 5:
544 case 6:
545 case 7:
546 mmc->capacity = mmc->capacity_gp[part_num - 4];
547 break;
548 default:
549 return -1;
550 }
551
552 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
553
554 return 0;
555 }
556
557 int mmc_switch_part(int dev_num, unsigned int part_num)
558 {
559 struct mmc *mmc = find_mmc_device(dev_num);
560 int ret;
561
562 if (!mmc)
563 return -1;
564
565 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
566 (mmc->part_config & ~PART_ACCESS_MASK)
567 | (part_num & PART_ACCESS_MASK));
568 if (ret)
569 return ret;
570
571 return mmc_set_capacity(mmc, part_num);
572 }
573
574 int mmc_getcd(struct mmc *mmc)
575 {
576 int cd;
577
578 cd = board_mmc_getcd(mmc);
579
580 if (cd < 0) {
581 if (mmc->getcd)
582 cd = mmc->getcd(mmc);
583 else
584 cd = 1;
585 }
586
587 return cd;
588 }
589
590 static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
591 {
592 struct mmc_cmd cmd;
593 struct mmc_data data;
594
595 /* Switch the frequency */
596 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
597 cmd.resp_type = MMC_RSP_R1;
598 cmd.cmdarg = (mode << 31) | 0xffffff;
599 cmd.cmdarg &= ~(0xf << (group * 4));
600 cmd.cmdarg |= value << (group * 4);
601
602 data.dest = (char *)resp;
603 data.blocksize = 64;
604 data.blocks = 1;
605 data.flags = MMC_DATA_READ;
606
607 return mmc_send_cmd(mmc, &cmd, &data);
608 }
609
610
611 static int sd_change_freq(struct mmc *mmc)
612 {
613 int err;
614 struct mmc_cmd cmd;
615 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
616 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
617 struct mmc_data data;
618 int timeout;
619
620 mmc->card_caps = 0;
621
622 if (mmc_host_is_spi(mmc))
623 return 0;
624
625 /* Read the SCR to find out if this card supports higher speeds */
626 cmd.cmdidx = MMC_CMD_APP_CMD;
627 cmd.resp_type = MMC_RSP_R1;
628 cmd.cmdarg = mmc->rca << 16;
629
630 err = mmc_send_cmd(mmc, &cmd, NULL);
631
632 if (err)
633 return err;
634
635 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
636 cmd.resp_type = MMC_RSP_R1;
637 cmd.cmdarg = 0;
638
639 timeout = 3;
640
641 retry_scr:
642 data.dest = (char *)scr;
643 data.blocksize = 8;
644 data.blocks = 1;
645 data.flags = MMC_DATA_READ;
646
647 err = mmc_send_cmd(mmc, &cmd, &data);
648
649 if (err) {
650 if (timeout--)
651 goto retry_scr;
652
653 return err;
654 }
655
656 mmc->scr[0] = __be32_to_cpu(scr[0]);
657 mmc->scr[1] = __be32_to_cpu(scr[1]);
658
659 switch ((mmc->scr[0] >> 24) & 0xf) {
660 case 0:
661 mmc->version = SD_VERSION_1_0;
662 break;
663 case 1:
664 mmc->version = SD_VERSION_1_10;
665 break;
666 case 2:
667 mmc->version = SD_VERSION_2;
668 if ((mmc->scr[0] >> 15) & 0x1)
669 mmc->version = SD_VERSION_3;
670 break;
671 default:
672 mmc->version = SD_VERSION_1_0;
673 break;
674 }
675
676 if (mmc->scr[0] & SD_DATA_4BIT)
677 mmc->card_caps |= MMC_MODE_4BIT;
678
679 /* Version 1.0 doesn't support switching */
680 if (mmc->version == SD_VERSION_1_0)
681 return 0;
682
683 timeout = 4;
684 while (timeout--) {
685 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
686 (u8 *)switch_status);
687
688 if (err)
689 return err;
690
691 /* The high-speed function is busy. Try again */
692 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
693 break;
694 }
695
696 /* If high-speed isn't supported, we return */
697 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
698 return 0;
699
700 /*
701 * If the host doesn't support SD_HIGHSPEED, do not switch card to
702 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
703 * This can avoid furthur problem when the card runs in different
704 * mode between the host.
705 */
706 if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
707 (mmc->host_caps & MMC_MODE_HS)))
708 return 0;
709
710 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
711
712 if (err)
713 return err;
714
715 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
716 mmc->card_caps |= MMC_MODE_HS;
717
718 return 0;
719 }
720
721 /* frequency bases */
722 /* divided by 10 to be nice to platforms without floating point */
723 static const int fbase[] = {
724 10000,
725 100000,
726 1000000,
727 10000000,
728 };
729
730 /* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
731 * to platforms without floating point.
732 */
733 static const int multipliers[] = {
734 0, /* reserved */
735 10,
736 12,
737 13,
738 15,
739 20,
740 25,
741 30,
742 35,
743 40,
744 45,
745 50,
746 55,
747 60,
748 70,
749 80,
750 };
751
752 static void mmc_set_ios(struct mmc *mmc)
753 {
754 mmc->set_ios(mmc);
755 }
756
757 void mmc_set_clock(struct mmc *mmc, uint clock)
758 {
759 if (clock > mmc->f_max)
760 clock = mmc->f_max;
761
762 if (clock < mmc->f_min)
763 clock = mmc->f_min;
764
765 mmc->clock = clock;
766
767 mmc_set_ios(mmc);
768 }
769
770 static void mmc_set_bus_width(struct mmc *mmc, uint width)
771 {
772 mmc->bus_width = width;
773
774 mmc_set_ios(mmc);
775 }
776
777 static int mmc_startup(struct mmc *mmc)
778 {
779 int err, i;
780 uint mult, freq;
781 u64 cmult, csize, capacity;
782 struct mmc_cmd cmd;
783 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
784 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
785 int timeout = 1000;
786
787 #ifdef CONFIG_MMC_SPI_CRC_ON
788 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
789 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
790 cmd.resp_type = MMC_RSP_R1;
791 cmd.cmdarg = 1;
792 err = mmc_send_cmd(mmc, &cmd, NULL);
793
794 if (err)
795 return err;
796 }
797 #endif
798
799 /* Put the Card in Identify Mode */
800 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
801 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
802 cmd.resp_type = MMC_RSP_R2;
803 cmd.cmdarg = 0;
804
805 err = mmc_send_cmd(mmc, &cmd, NULL);
806
807 if (err)
808 return err;
809
810 memcpy(mmc->cid, cmd.response, 16);
811
812 /*
813 * For MMC cards, set the Relative Address.
814 * For SD cards, get the Relatvie Address.
815 * This also puts the cards into Standby State
816 */
817 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
818 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
819 cmd.cmdarg = mmc->rca << 16;
820 cmd.resp_type = MMC_RSP_R6;
821
822 err = mmc_send_cmd(mmc, &cmd, NULL);
823
824 if (err)
825 return err;
826
827 if (IS_SD(mmc))
828 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
829 }
830
831 /* Get the Card-Specific Data */
832 cmd.cmdidx = MMC_CMD_SEND_CSD;
833 cmd.resp_type = MMC_RSP_R2;
834 cmd.cmdarg = mmc->rca << 16;
835
836 err = mmc_send_cmd(mmc, &cmd, NULL);
837
838 /* Waiting for the ready status */
839 mmc_send_status(mmc, timeout);
840
841 if (err)
842 return err;
843
844 mmc->csd[0] = cmd.response[0];
845 mmc->csd[1] = cmd.response[1];
846 mmc->csd[2] = cmd.response[2];
847 mmc->csd[3] = cmd.response[3];
848
849 if (mmc->version == MMC_VERSION_UNKNOWN) {
850 int version = (cmd.response[0] >> 26) & 0xf;
851
852 switch (version) {
853 case 0:
854 mmc->version = MMC_VERSION_1_2;
855 break;
856 case 1:
857 mmc->version = MMC_VERSION_1_4;
858 break;
859 case 2:
860 mmc->version = MMC_VERSION_2_2;
861 break;
862 case 3:
863 mmc->version = MMC_VERSION_3;
864 break;
865 case 4:
866 mmc->version = MMC_VERSION_4;
867 break;
868 default:
869 mmc->version = MMC_VERSION_1_2;
870 break;
871 }
872 }
873
874 /* divide frequency by 10, since the mults are 10x bigger */
875 freq = fbase[(cmd.response[0] & 0x7)];
876 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
877
878 mmc->tran_speed = freq * mult;
879
880 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
881
882 if (IS_SD(mmc))
883 mmc->write_bl_len = mmc->read_bl_len;
884 else
885 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
886
887 if (mmc->high_capacity) {
888 csize = (mmc->csd[1] & 0x3f) << 16
889 | (mmc->csd[2] & 0xffff0000) >> 16;
890 cmult = 8;
891 } else {
892 csize = (mmc->csd[1] & 0x3ff) << 2
893 | (mmc->csd[2] & 0xc0000000) >> 30;
894 cmult = (mmc->csd[2] & 0x00038000) >> 15;
895 }
896
897 mmc->capacity_user = (csize + 1) << (cmult + 2);
898 mmc->capacity_user *= mmc->read_bl_len;
899 mmc->capacity_boot = 0;
900 mmc->capacity_rpmb = 0;
901 for (i = 0; i < 4; i++)
902 mmc->capacity_gp[i] = 0;
903
904 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
905 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
906
907 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
908 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
909
910 /* Select the card, and put it into Transfer Mode */
911 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
912 cmd.cmdidx = MMC_CMD_SELECT_CARD;
913 cmd.resp_type = MMC_RSP_R1;
914 cmd.cmdarg = mmc->rca << 16;
915 err = mmc_send_cmd(mmc, &cmd, NULL);
916
917 if (err)
918 return err;
919 }
920
921 /*
922 * For SD, its erase group is always one sector
923 */
924 mmc->erase_grp_size = 1;
925 mmc->part_config = MMCPART_NOAVAILABLE;
926 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
927 /* check ext_csd version and capacity */
928 err = mmc_send_ext_csd(mmc, ext_csd);
929 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
930 /*
931 * According to the JEDEC Standard, the value of
932 * ext_csd's capacity is valid if the value is more
933 * than 2GB
934 */
935 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
936 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
937 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
938 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
939 capacity *= MMC_MAX_BLOCK_LEN;
940 if ((capacity >> 20) > 2 * 1024)
941 mmc->capacity_user = capacity;
942 }
943
944 switch (ext_csd[EXT_CSD_REV]) {
945 case 1:
946 mmc->version = MMC_VERSION_4_1;
947 break;
948 case 2:
949 mmc->version = MMC_VERSION_4_2;
950 break;
951 case 3:
952 mmc->version = MMC_VERSION_4_3;
953 break;
954 case 5:
955 mmc->version = MMC_VERSION_4_41;
956 break;
957 case 6:
958 mmc->version = MMC_VERSION_4_5;
959 break;
960 }
961
962 /*
963 * Host needs to enable ERASE_GRP_DEF bit if device is
964 * partitioned. This bit will be lost every time after a reset
965 * or power off. This will affect erase size.
966 */
967 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
968 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) {
969 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
970 EXT_CSD_ERASE_GROUP_DEF, 1);
971
972 if (err)
973 return err;
974
975 /* Read out group size from ext_csd */
976 mmc->erase_grp_size =
977 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
978 MMC_MAX_BLOCK_LEN * 1024;
979 } else {
980 /* Calculate the group size from the csd value. */
981 int erase_gsz, erase_gmul;
982 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
983 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
984 mmc->erase_grp_size = (erase_gsz + 1)
985 * (erase_gmul + 1);
986 }
987
988 /* store the partition info of emmc */
989 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
990 ext_csd[EXT_CSD_BOOT_MULT])
991 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
992
993 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
994
995 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
996
997 for (i = 0; i < 4; i++) {
998 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
999 mmc->capacity_gp[i] = (ext_csd[idx + 2] << 16) +
1000 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1001 mmc->capacity_gp[i] *=
1002 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1003 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1004 }
1005 }
1006
1007 err = mmc_set_capacity(mmc, mmc->part_num);
1008 if (err)
1009 return err;
1010
1011 if (IS_SD(mmc))
1012 err = sd_change_freq(mmc);
1013 else
1014 err = mmc_change_freq(mmc);
1015
1016 if (err)
1017 return err;
1018
1019 /* Restrict card's capabilities by what the host can do */
1020 mmc->card_caps &= mmc->host_caps;
1021
1022 if (IS_SD(mmc)) {
1023 if (mmc->card_caps & MMC_MODE_4BIT) {
1024 cmd.cmdidx = MMC_CMD_APP_CMD;
1025 cmd.resp_type = MMC_RSP_R1;
1026 cmd.cmdarg = mmc->rca << 16;
1027
1028 err = mmc_send_cmd(mmc, &cmd, NULL);
1029 if (err)
1030 return err;
1031
1032 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1033 cmd.resp_type = MMC_RSP_R1;
1034 cmd.cmdarg = 2;
1035 err = mmc_send_cmd(mmc, &cmd, NULL);
1036 if (err)
1037 return err;
1038
1039 mmc_set_bus_width(mmc, 4);
1040 }
1041
1042 if (mmc->card_caps & MMC_MODE_HS)
1043 mmc->tran_speed = 50000000;
1044 else
1045 mmc->tran_speed = 25000000;
1046 } else {
1047 int idx;
1048
1049 /* An array of possible bus widths in order of preference */
1050 static unsigned ext_csd_bits[] = {
1051 EXT_CSD_BUS_WIDTH_8,
1052 EXT_CSD_BUS_WIDTH_4,
1053 EXT_CSD_BUS_WIDTH_1,
1054 };
1055
1056 /* An array to map CSD bus widths to host cap bits */
1057 static unsigned ext_to_hostcaps[] = {
1058 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1059 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1060 };
1061
1062 /* An array to map chosen bus width to an integer */
1063 static unsigned widths[] = {
1064 8, 4, 1,
1065 };
1066
1067 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1068 unsigned int extw = ext_csd_bits[idx];
1069
1070 /*
1071 * Check to make sure the controller supports
1072 * this bus width, if it's more than 1
1073 */
1074 if (extw != EXT_CSD_BUS_WIDTH_1 &&
1075 !(mmc->host_caps & ext_to_hostcaps[extw]))
1076 continue;
1077
1078 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1079 EXT_CSD_BUS_WIDTH, extw);
1080
1081 if (err)
1082 continue;
1083
1084 mmc_set_bus_width(mmc, widths[idx]);
1085
1086 err = mmc_send_ext_csd(mmc, test_csd);
1087 if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1088 == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1089 && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1090 == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1091 && ext_csd[EXT_CSD_REV] \
1092 == test_csd[EXT_CSD_REV]
1093 && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1094 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1095 && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1096 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
1097
1098 mmc->card_caps |= ext_to_hostcaps[extw];
1099 break;
1100 }
1101 }
1102
1103 if (mmc->card_caps & MMC_MODE_HS) {
1104 if (mmc->card_caps & MMC_MODE_HS_52MHz)
1105 mmc->tran_speed = 52000000;
1106 else
1107 mmc->tran_speed = 26000000;
1108 }
1109 }
1110
1111 mmc_set_clock(mmc, mmc->tran_speed);
1112
1113 /* fill in device description */
1114 mmc->block_dev.lun = 0;
1115 mmc->block_dev.type = 0;
1116 mmc->block_dev.blksz = mmc->read_bl_len;
1117 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
1118 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
1119 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1120 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1121 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1122 (mmc->cid[3] >> 16) & 0xffff);
1123 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1124 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1125 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1126 (mmc->cid[2] >> 24) & 0xff);
1127 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1128 (mmc->cid[2] >> 16) & 0xf);
1129 #else
1130 mmc->block_dev.vendor[0] = 0;
1131 mmc->block_dev.product[0] = 0;
1132 mmc->block_dev.revision[0] = 0;
1133 #endif
1134 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
1135 init_part(&mmc->block_dev);
1136 #endif
1137
1138 return 0;
1139 }
1140
1141 static int mmc_send_if_cond(struct mmc *mmc)
1142 {
1143 struct mmc_cmd cmd;
1144 int err;
1145
1146 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1147 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1148 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1149 cmd.resp_type = MMC_RSP_R7;
1150
1151 err = mmc_send_cmd(mmc, &cmd, NULL);
1152
1153 if (err)
1154 return err;
1155
1156 if ((cmd.response[0] & 0xff) != 0xaa)
1157 return UNUSABLE_ERR;
1158 else
1159 mmc->version = SD_VERSION_2;
1160
1161 return 0;
1162 }
1163
1164 int mmc_register(struct mmc *mmc)
1165 {
1166 /* Setup the universal parts of the block interface just once */
1167 mmc->block_dev.if_type = IF_TYPE_MMC;
1168 mmc->block_dev.dev = cur_dev_num++;
1169 mmc->block_dev.removable = 1;
1170 mmc->block_dev.block_read = mmc_bread;
1171 mmc->block_dev.block_write = mmc_bwrite;
1172 mmc->block_dev.block_erase = mmc_berase;
1173 if (!mmc->b_max)
1174 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
1175
1176 INIT_LIST_HEAD (&mmc->link);
1177
1178 list_add_tail (&mmc->link, &mmc_devices);
1179
1180 return 0;
1181 }
1182
1183 #ifdef CONFIG_PARTITIONS
1184 block_dev_desc_t *mmc_get_dev(int dev)
1185 {
1186 struct mmc *mmc = find_mmc_device(dev);
1187 if (!mmc || mmc_init(mmc))
1188 return NULL;
1189
1190 return &mmc->block_dev;
1191 }
1192 #endif
1193
1194 int mmc_start_init(struct mmc *mmc)
1195 {
1196 int err;
1197
1198 if (mmc_getcd(mmc) == 0) {
1199 mmc->has_init = 0;
1200 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1201 printf("MMC: no card present\n");
1202 #endif
1203 return NO_CARD_ERR;
1204 }
1205
1206 if (mmc->has_init)
1207 return 0;
1208
1209 err = mmc->init(mmc);
1210
1211 if (err)
1212 return err;
1213
1214 mmc_set_bus_width(mmc, 1);
1215 mmc_set_clock(mmc, 1);
1216
1217 /* Reset the Card */
1218 err = mmc_go_idle(mmc);
1219
1220 if (err)
1221 return err;
1222
1223 /* The internal partition reset to user partition(0) at every CMD0*/
1224 mmc->part_num = 0;
1225
1226 /* Test for SD version 2 */
1227 err = mmc_send_if_cond(mmc);
1228
1229 /* Now try to get the SD card's operating condition */
1230 err = sd_send_op_cond(mmc);
1231
1232 /* If the command timed out, we check for an MMC card */
1233 if (err == TIMEOUT) {
1234 err = mmc_send_op_cond(mmc);
1235
1236 if (err && err != IN_PROGRESS) {
1237 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1238 printf("Card did not respond to voltage select!\n");
1239 #endif
1240 return UNUSABLE_ERR;
1241 }
1242 }
1243
1244 if (err == IN_PROGRESS)
1245 mmc->init_in_progress = 1;
1246
1247 return err;
1248 }
1249
1250 static int mmc_complete_init(struct mmc *mmc)
1251 {
1252 int err = 0;
1253
1254 if (mmc->op_cond_pending)
1255 err = mmc_complete_op_cond(mmc);
1256
1257 if (!err)
1258 err = mmc_startup(mmc);
1259 if (err)
1260 mmc->has_init = 0;
1261 else
1262 mmc->has_init = 1;
1263 mmc->init_in_progress = 0;
1264 return err;
1265 }
1266
1267 int mmc_init(struct mmc *mmc)
1268 {
1269 int err = IN_PROGRESS;
1270 unsigned start = get_timer(0);
1271
1272 if (mmc->has_init)
1273 return 0;
1274 if (!mmc->init_in_progress)
1275 err = mmc_start_init(mmc);
1276
1277 if (!err || err == IN_PROGRESS)
1278 err = mmc_complete_init(mmc);
1279 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1280 return err;
1281 }
1282
1283 /*
1284 * CPU and board-specific MMC initializations. Aliased function
1285 * signals caller to move on
1286 */
1287 static int __def_mmc_init(bd_t *bis)
1288 {
1289 return -1;
1290 }
1291
1292 int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1293 int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1294
1295 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1296
1297 void print_mmc_devices(char separator)
1298 {
1299 struct mmc *m;
1300 struct list_head *entry;
1301
1302 list_for_each(entry, &mmc_devices) {
1303 m = list_entry(entry, struct mmc, link);
1304
1305 printf("%s: %d", m->name, m->block_dev.dev);
1306
1307 if (entry->next != &mmc_devices)
1308 printf("%c ", separator);
1309 }
1310
1311 printf("\n");
1312 }
1313
1314 #else
1315 void print_mmc_devices(char separator) { }
1316 #endif
1317
1318 int get_mmc_num(void)
1319 {
1320 return cur_dev_num;
1321 }
1322
1323 void mmc_set_preinit(struct mmc *mmc, int preinit)
1324 {
1325 mmc->preinit = preinit;
1326 }
1327
1328 static void do_preinit(void)
1329 {
1330 struct mmc *m;
1331 struct list_head *entry;
1332
1333 list_for_each(entry, &mmc_devices) {
1334 m = list_entry(entry, struct mmc, link);
1335
1336 if (m->preinit)
1337 mmc_start_init(m);
1338 }
1339 }
1340
1341
1342 int mmc_initialize(bd_t *bis)
1343 {
1344 INIT_LIST_HEAD (&mmc_devices);
1345 cur_dev_num = 0;
1346
1347 if (board_mmc_init(bis) < 0)
1348 cpu_mmc_init(bis);
1349
1350 #ifndef CONFIG_SPL_BUILD
1351 print_mmc_devices(',');
1352 #endif
1353
1354 do_preinit();
1355 return 0;
1356 }
1357
1358 #ifdef CONFIG_SUPPORT_EMMC_BOOT
1359 /*
1360 * This function changes the size of boot partition and the size of rpmb
1361 * partition present on EMMC devices.
1362 *
1363 * Input Parameters:
1364 * struct *mmc: pointer for the mmc device strcuture
1365 * bootsize: size of boot partition
1366 * rpmbsize: size of rpmb partition
1367 *
1368 * Returns 0 on success.
1369 */
1370
1371 int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1372 unsigned long rpmbsize)
1373 {
1374 int err;
1375 struct mmc_cmd cmd;
1376
1377 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1378 cmd.cmdidx = MMC_CMD_RES_MAN;
1379 cmd.resp_type = MMC_RSP_R1b;
1380 cmd.cmdarg = MMC_CMD62_ARG1;
1381
1382 err = mmc_send_cmd(mmc, &cmd, NULL);
1383 if (err) {
1384 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1385 return err;
1386 }
1387
1388 /* Boot partition changing mode */
1389 cmd.cmdidx = MMC_CMD_RES_MAN;
1390 cmd.resp_type = MMC_RSP_R1b;
1391 cmd.cmdarg = MMC_CMD62_ARG2;
1392
1393 err = mmc_send_cmd(mmc, &cmd, NULL);
1394 if (err) {
1395 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1396 return err;
1397 }
1398 /* boot partition size is multiple of 128KB */
1399 bootsize = (bootsize * 1024) / 128;
1400
1401 /* Arg: boot partition size */
1402 cmd.cmdidx = MMC_CMD_RES_MAN;
1403 cmd.resp_type = MMC_RSP_R1b;
1404 cmd.cmdarg = bootsize;
1405
1406 err = mmc_send_cmd(mmc, &cmd, NULL);
1407 if (err) {
1408 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1409 return err;
1410 }
1411 /* RPMB partition size is multiple of 128KB */
1412 rpmbsize = (rpmbsize * 1024) / 128;
1413 /* Arg: RPMB partition size */
1414 cmd.cmdidx = MMC_CMD_RES_MAN;
1415 cmd.resp_type = MMC_RSP_R1b;
1416 cmd.cmdarg = rpmbsize;
1417
1418 err = mmc_send_cmd(mmc, &cmd, NULL);
1419 if (err) {
1420 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1421 return err;
1422 }
1423 return 0;
1424 }
1425
1426 /*
1427 * This function shall form and send the commands to open / close the
1428 * boot partition specified by user.
1429 *
1430 * Input Parameters:
1431 * ack: 0x0 - No boot acknowledge sent (default)
1432 * 0x1 - Boot acknowledge sent during boot operation
1433 * part_num: User selects boot data that will be sent to master
1434 * 0x0 - Device not boot enabled (default)
1435 * 0x1 - Boot partition 1 enabled for boot
1436 * 0x2 - Boot partition 2 enabled for boot
1437 * access: User selects partitions to access
1438 * 0x0 : No access to boot partition (default)
1439 * 0x1 : R/W boot partition 1
1440 * 0x2 : R/W boot partition 2
1441 * 0x3 : R/W Replay Protected Memory Block (RPMB)
1442 *
1443 * Returns 0 on success.
1444 */
1445 int mmc_boot_part_access(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1446 {
1447 int err;
1448 struct mmc_cmd cmd;
1449
1450 /* Boot ack enable, boot partition enable , boot partition access */
1451 cmd.cmdidx = MMC_CMD_SWITCH;
1452 cmd.resp_type = MMC_RSP_R1b;
1453
1454 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
1455 (EXT_CSD_PART_CONF << 16) |
1456 ((EXT_CSD_BOOT_ACK(ack) |
1457 EXT_CSD_BOOT_PART_NUM(part_num) |
1458 EXT_CSD_PARTITION_ACCESS(access)) << 8);
1459
1460 err = mmc_send_cmd(mmc, &cmd, NULL);
1461 if (err) {
1462 if (access) {
1463 debug("mmc boot partition#%d open fail:Error1 = %d\n",
1464 part_num, err);
1465 } else {
1466 debug("mmc boot partition#%d close fail:Error = %d\n",
1467 part_num, err);
1468 }
1469 return err;
1470 }
1471
1472 if (access) {
1473 /* 4bit transfer mode at booting time. */
1474 cmd.cmdidx = MMC_CMD_SWITCH;
1475 cmd.resp_type = MMC_RSP_R1b;
1476
1477 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
1478 (EXT_CSD_BOOT_BUS_WIDTH << 16) |
1479 ((1 << 0) << 8);
1480
1481 err = mmc_send_cmd(mmc, &cmd, NULL);
1482 if (err) {
1483 debug("mmc boot partition#%d open fail:Error2 = %d\n",
1484 part_num, err);
1485 return err;
1486 }
1487 }
1488 return 0;
1489 }
1490 #endif