blob: 822b66b906c4b5781b4fc0d0cdd12801bbcfe167 [file] [log] [blame]
Andy Fleming272cc702008-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 Denk1a459662013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Fleming272cc702008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simons8e3332e2015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrend4622df2014-05-23 12:47:06 -060015#include <errno.h>
Andy Fleming272cc702008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
Peng Fan2051aef2016-10-11 15:08:43 +080018#include <power/regulator.h>
Andy Fleming272cc702008-10-30 16:41:01 -050019#include <malloc.h>
Simon Glasscf92e052015-09-02 17:24:58 -060020#include <memalign.h>
Andy Fleming272cc702008-10-30 16:41:01 -050021#include <linux/list.h>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053022#include <div64.h>
Paul Burtonda61fa52013-09-09 15:30:26 +010023#include "mmc_private.h"
Andy Fleming272cc702008-10-30 16:41:01 -050024
Peng Fan3697e592016-09-01 11:13:38 +080025static const unsigned int sd_au_size[] = {
26 0, SZ_16K / 512, SZ_32K / 512,
27 SZ_64K / 512, SZ_128K / 512, SZ_256K / 512,
28 SZ_512K / 512, SZ_1M / 512, SZ_2M / 512,
29 SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512,
30 SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512,
31};
32
Marek Vasutb5b838f2016-12-01 02:06:33 +010033#if CONFIG_IS_ENABLED(MMC_TINY)
34static struct mmc mmc_static;
35struct mmc *find_mmc_device(int dev_num)
36{
37 return &mmc_static;
38}
39
40void mmc_do_preinit(void)
41{
42 struct mmc *m = &mmc_static;
43#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
44 mmc_set_preinit(m, 1);
45#endif
46 if (m->preinit)
47 mmc_start_init(m);
48}
49
50struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
51{
52 return &mmc->block_dev;
53}
54#endif
55
Simon Glasse7881d82017-07-29 11:35:31 -060056#if !CONFIG_IS_ENABLED(DM_MMC)
Jeroen Hofstee750121c2014-07-12 21:24:08 +020057__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000058{
59 return -1;
60}
61
62int mmc_getwp(struct mmc *mmc)
63{
64 int wp;
65
66 wp = board_mmc_getwp(mmc);
67
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000068 if (wp < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020069 if (mmc->cfg->ops->getwp)
70 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000071 else
72 wp = 0;
73 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000074
75 return wp;
76}
77
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +020078__weak int board_mmc_getcd(struct mmc *mmc)
79{
Stefano Babic11fdade2010-02-05 15:04:43 +010080 return -1;
81}
Simon Glass8ca51e52016-06-12 23:30:22 -060082#endif
Stefano Babic11fdade2010-02-05 15:04:43 +010083
Marek Vasut8635ff92012-03-15 18:41:35 +000084#ifdef CONFIG_MMC_TRACE
Simon Glassc0c76eb2016-06-12 23:30:20 -060085void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
86{
87 printf("CMD_SEND:%d\n", cmd->cmdidx);
88 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
89}
90
91void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
92{
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000093 int i;
94 u8 *ptr;
95
Bin Meng7863ce52016-03-17 21:53:14 -070096 if (ret) {
97 printf("\t\tRET\t\t\t %d\n", ret);
98 } else {
99 switch (cmd->resp_type) {
100 case MMC_RSP_NONE:
101 printf("\t\tMMC_RSP_NONE\n");
102 break;
103 case MMC_RSP_R1:
104 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
105 cmd->response[0]);
106 break;
107 case MMC_RSP_R1b:
108 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
109 cmd->response[0]);
110 break;
111 case MMC_RSP_R2:
112 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
113 cmd->response[0]);
114 printf("\t\t \t\t 0x%08X \n",
115 cmd->response[1]);
116 printf("\t\t \t\t 0x%08X \n",
117 cmd->response[2]);
118 printf("\t\t \t\t 0x%08X \n",
119 cmd->response[3]);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000120 printf("\n");
Bin Meng7863ce52016-03-17 21:53:14 -0700121 printf("\t\t\t\t\tDUMPING DATA\n");
122 for (i = 0; i < 4; i++) {
123 int j;
124 printf("\t\t\t\t\t%03d - ", i*4);
125 ptr = (u8 *)&cmd->response[i];
126 ptr += 3;
127 for (j = 0; j < 4; j++)
128 printf("%02X ", *ptr--);
129 printf("\n");
130 }
131 break;
132 case MMC_RSP_R3:
133 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
134 cmd->response[0]);
135 break;
136 default:
137 printf("\t\tERROR MMC rsp not supported\n");
138 break;
Bin Meng53e8e402016-03-17 21:53:13 -0700139 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000140 }
Simon Glassc0c76eb2016-06-12 23:30:20 -0600141}
142
143void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
144{
145 int status;
146
147 status = (cmd->response[0] & MMC_STATUS_CURR_STATE) >> 9;
148 printf("CURR STATE:%d\n", status);
149}
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000150#endif
Simon Glassc0c76eb2016-06-12 23:30:20 -0600151
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200152#if CONFIG_IS_ENABLED(MMC_VERBOSE) || defined(DEBUG)
153const char *mmc_mode_name(enum bus_mode mode)
154{
155 static const char *const names[] = {
156 [MMC_LEGACY] = "MMC legacy",
157 [SD_LEGACY] = "SD Legacy",
158 [MMC_HS] = "MMC High Speed (26MHz)",
159 [SD_HS] = "SD High Speed (50MHz)",
160 [UHS_SDR12] = "UHS SDR12 (25MHz)",
161 [UHS_SDR25] = "UHS SDR25 (50MHz)",
162 [UHS_SDR50] = "UHS SDR50 (100MHz)",
163 [UHS_SDR104] = "UHS SDR104 (208MHz)",
164 [UHS_DDR50] = "UHS DDR50 (50MHz)",
165 [MMC_HS_52] = "MMC High Speed (52MHz)",
166 [MMC_DDR_52] = "MMC DDR52 (52MHz)",
167 [MMC_HS_200] = "HS200 (200MHz)",
168 };
169
170 if (mode >= MMC_MODES_END)
171 return "Unknown mode";
172 else
173 return names[mode];
174}
175#endif
176
Jean-Jacques Hiblot05038572017-09-21 16:29:55 +0200177static uint mmc_mode2freq(struct mmc *mmc, enum bus_mode mode)
178{
179 static const int freqs[] = {
180 [SD_LEGACY] = 25000000,
181 [MMC_HS] = 26000000,
182 [SD_HS] = 50000000,
183 [UHS_SDR12] = 25000000,
184 [UHS_SDR25] = 50000000,
185 [UHS_SDR50] = 100000000,
186 [UHS_SDR104] = 208000000,
187 [UHS_DDR50] = 50000000,
188 [MMC_HS_52] = 52000000,
189 [MMC_DDR_52] = 52000000,
190 [MMC_HS_200] = 200000000,
191 };
192
193 if (mode == MMC_LEGACY)
194 return mmc->legacy_speed;
195 else if (mode >= MMC_MODES_END)
196 return 0;
197 else
198 return freqs[mode];
199}
200
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200201static int mmc_select_mode(struct mmc *mmc, enum bus_mode mode)
202{
203 mmc->selected_mode = mode;
Jean-Jacques Hiblot05038572017-09-21 16:29:55 +0200204 mmc->tran_speed = mmc_mode2freq(mmc, mode);
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200205 mmc->ddr_mode = mmc_is_mode_ddr(mode);
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200206 debug("selecting mode %s (freq : %d MHz)\n", mmc_mode_name(mode),
207 mmc->tran_speed / 1000000);
208 return 0;
209}
210
Simon Glasse7881d82017-07-29 11:35:31 -0600211#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glassc0c76eb2016-06-12 23:30:20 -0600212int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
213{
214 int ret;
215
216 mmmc_trace_before_send(mmc, cmd);
217 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
218 mmmc_trace_after_send(mmc, cmd, ret);
219
Marek Vasut8635ff92012-03-15 18:41:35 +0000220 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500221}
Simon Glass8ca51e52016-06-12 23:30:22 -0600222#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500223
Paul Burtonda61fa52013-09-09 15:30:26 +0100224int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000225{
226 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000227 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000228
229 cmd.cmdidx = MMC_CMD_SEND_STATUS;
230 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200231 if (!mmc_host_is_spi(mmc))
232 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000233
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500234 while (1) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000235 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000236 if (!err) {
237 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
238 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
239 MMC_STATE_PRG)
240 break;
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200241
242 if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton56196822013-09-04 16:12:25 +0100243#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzked617c422012-02-05 22:29:12 +0000244 printf("Status Error: 0x%08X\n",
245 cmd.response[0]);
Paul Burton56196822013-09-04 16:12:25 +0100246#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900247 return -ECOMM;
Jan Kloetzked617c422012-02-05 22:29:12 +0000248 }
249 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000250 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000251
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500252 if (timeout-- <= 0)
253 break;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000254
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500255 udelay(1000);
256 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000257
Simon Glassc0c76eb2016-06-12 23:30:20 -0600258 mmc_trace_state(mmc, &cmd);
Jongman Heo5b0c9422012-06-03 21:32:13 +0000259 if (timeout <= 0) {
Paul Burton56196822013-09-04 16:12:25 +0100260#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000261 printf("Timeout waiting card ready\n");
Paul Burton56196822013-09-04 16:12:25 +0100262#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900263 return -ETIMEDOUT;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000264 }
265
266 return 0;
267}
268
Paul Burtonda61fa52013-09-09 15:30:26 +0100269int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500270{
271 struct mmc_cmd cmd;
272
Andrew Gabbasov786e8f82014-12-01 06:59:09 -0600273 if (mmc->ddr_mode)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900274 return 0;
275
Andy Fleming272cc702008-10-30 16:41:01 -0500276 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
277 cmd.resp_type = MMC_RSP_R1;
278 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500279
280 return mmc_send_cmd(mmc, &cmd, NULL);
281}
282
Sascha Silbeff8fef52013-06-14 13:07:25 +0200283static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000284 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500285{
286 struct mmc_cmd cmd;
287 struct mmc_data data;
288
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700289 if (blkcnt > 1)
290 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
291 else
292 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500293
294 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700295 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500296 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700297 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500298
299 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500300
301 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700302 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500303 data.blocksize = mmc->read_bl_len;
304 data.flags = MMC_DATA_READ;
305
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700306 if (mmc_send_cmd(mmc, &cmd, &data))
307 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500308
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700309 if (blkcnt > 1) {
310 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
311 cmd.cmdarg = 0;
312 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700313 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton56196822013-09-04 16:12:25 +0100314#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700315 printf("mmc fail to send stop cmd\n");
Paul Burton56196822013-09-04 16:12:25 +0100316#endif
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700317 return 0;
318 }
Andy Fleming272cc702008-10-30 16:41:01 -0500319 }
320
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700321 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500322}
323
Simon Glassc4d660d2017-07-04 13:31:19 -0600324#if CONFIG_IS_ENABLED(BLK)
Simon Glass7dba0b92016-06-12 23:30:15 -0600325ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600326#else
Simon Glass7dba0b92016-06-12 23:30:15 -0600327ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
328 void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600329#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500330{
Simon Glassc4d660d2017-07-04 13:31:19 -0600331#if CONFIG_IS_ENABLED(BLK)
Simon Glass33fb2112016-05-01 13:52:41 -0600332 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
333#endif
Simon Glassbcce53d2016-02-29 15:25:51 -0700334 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700335 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700336 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500337
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700338 if (blkcnt == 0)
339 return 0;
340
341 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500342 if (!mmc)
343 return 0;
344
Marek Vasutb5b838f2016-12-01 02:06:33 +0100345 if (CONFIG_IS_ENABLED(MMC_TINY))
346 err = mmc_switch_part(mmc, block_dev->hwpart);
347 else
348 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
349
Stephen Warren873cc1d2015-12-07 11:38:49 -0700350 if (err < 0)
351 return 0;
352
Simon Glassc40fdca2016-05-01 13:52:35 -0600353 if ((start + blkcnt) > block_dev->lba) {
Paul Burton56196822013-09-04 16:12:25 +0100354#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200355 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glassc40fdca2016-05-01 13:52:35 -0600356 start + blkcnt, block_dev->lba);
Paul Burton56196822013-09-04 16:12:25 +0100357#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800358 return 0;
359 }
Andy Fleming272cc702008-10-30 16:41:01 -0500360
Simon Glass11692992015-06-23 15:38:50 -0600361 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
362 debug("%s: Failed to set blocklen\n", __func__);
Andy Fleming272cc702008-10-30 16:41:01 -0500363 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600364 }
Andy Fleming272cc702008-10-30 16:41:01 -0500365
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700366 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200367 cur = (blocks_todo > mmc->cfg->b_max) ?
368 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-06-23 15:38:50 -0600369 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
370 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700371 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600372 }
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700373 blocks_todo -= cur;
374 start += cur;
375 dst += cur * mmc->read_bl_len;
376 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500377
378 return blkcnt;
379}
380
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000381static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500382{
383 struct mmc_cmd cmd;
384 int err;
385
386 udelay(1000);
387
388 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
389 cmd.cmdarg = 0;
390 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500391
392 err = mmc_send_cmd(mmc, &cmd, NULL);
393
394 if (err)
395 return err;
396
397 udelay(2000);
398
399 return 0;
400}
401
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000402static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500403{
404 int timeout = 1000;
405 int err;
406 struct mmc_cmd cmd;
407
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500408 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500409 cmd.cmdidx = MMC_CMD_APP_CMD;
410 cmd.resp_type = MMC_RSP_R1;
411 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500412
413 err = mmc_send_cmd(mmc, &cmd, NULL);
414
415 if (err)
416 return err;
417
418 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
419 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100420
421 /*
422 * Most cards do not answer if some reserved bits
423 * in the ocr are set. However, Some controller
424 * can set bit 7 (reserved for low voltages), but
425 * how to manage low voltages SD card is not yet
426 * specified.
427 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000428 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200429 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500430
431 if (mmc->version == SD_VERSION_2)
432 cmd.cmdarg |= OCR_HCS;
433
434 err = mmc_send_cmd(mmc, &cmd, NULL);
435
436 if (err)
437 return err;
438
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500439 if (cmd.response[0] & OCR_BUSY)
440 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500441
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500442 if (timeout-- <= 0)
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900443 return -EOPNOTSUPP;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500444
445 udelay(1000);
446 }
Andy Fleming272cc702008-10-30 16:41:01 -0500447
448 if (mmc->version != SD_VERSION_2)
449 mmc->version = SD_VERSION_1_0;
450
Thomas Choud52ebf12010-12-24 13:12:21 +0000451 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
452 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
453 cmd.resp_type = MMC_RSP_R3;
454 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000455
456 err = mmc_send_cmd(mmc, &cmd, NULL);
457
458 if (err)
459 return err;
460 }
461
Rabin Vincent998be3d2009-04-05 13:30:56 +0530462 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500463
464 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
465 mmc->rca = 0;
466
467 return 0;
468}
469
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500470static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500471{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500472 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500473 int err;
474
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500475 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
476 cmd.resp_type = MMC_RSP_R3;
477 cmd.cmdarg = 0;
Rob Herring5a203972015-03-23 17:56:59 -0500478 if (use_arg && !mmc_host_is_spi(mmc))
479 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200480 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500481 (mmc->ocr & OCR_VOLTAGE_MASK)) |
482 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000483
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500484 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000485 if (err)
486 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500487 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000488 return 0;
489}
490
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200491static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000492{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000493 int err, i;
494
Andy Fleming272cc702008-10-30 16:41:01 -0500495 /* Some cards seem to need this */
496 mmc_go_idle(mmc);
497
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000498 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000499 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500500 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500501 if (err)
502 return err;
503
Che-Liang Chioue9550442012-11-28 15:21:13 +0000504 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500505 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500506 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000507 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500508 mmc->op_cond_pending = 1;
509 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000510}
Andy Fleming272cc702008-10-30 16:41:01 -0500511
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200512static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000513{
514 struct mmc_cmd cmd;
515 int timeout = 1000;
516 uint start;
517 int err;
518
519 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500520 if (!(mmc->ocr & OCR_BUSY)) {
Yangbo Lud188b112016-08-02 15:33:18 +0800521 /* Some cards seem to need this */
522 mmc_go_idle(mmc);
523
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500524 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500525 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500526 err = mmc_send_op_cond_iter(mmc, 1);
527 if (err)
528 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500529 if (mmc->ocr & OCR_BUSY)
530 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500531 if (get_timer(start) > timeout)
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900532 return -EOPNOTSUPP;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500533 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500534 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500535 }
Andy Fleming272cc702008-10-30 16:41:01 -0500536
Thomas Choud52ebf12010-12-24 13:12:21 +0000537 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
538 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
539 cmd.resp_type = MMC_RSP_R3;
540 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000541
542 err = mmc_send_cmd(mmc, &cmd, NULL);
543
544 if (err)
545 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500546
547 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000548 }
549
Andy Fleming272cc702008-10-30 16:41:01 -0500550 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500551
552 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700553 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500554
555 return 0;
556}
557
558
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000559static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500560{
561 struct mmc_cmd cmd;
562 struct mmc_data data;
563 int err;
564
565 /* Get the Card Status Register */
566 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
567 cmd.resp_type = MMC_RSP_R1;
568 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500569
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000570 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500571 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000572 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -0500573 data.flags = MMC_DATA_READ;
574
575 err = mmc_send_cmd(mmc, &cmd, &data);
576
577 return err;
578}
579
Simon Glassc40704f2016-06-12 23:30:18 -0600580int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500581{
582 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000583 int timeout = 1000;
Maxime Riparda9003dc2016-11-04 16:18:08 +0100584 int retries = 3;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000585 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500586
587 cmd.cmdidx = MMC_CMD_SWITCH;
588 cmd.resp_type = MMC_RSP_R1b;
589 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000590 (index << 16) |
591 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500592
Maxime Riparda9003dc2016-11-04 16:18:08 +0100593 while (retries > 0) {
594 ret = mmc_send_cmd(mmc, &cmd, NULL);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000595
Maxime Riparda9003dc2016-11-04 16:18:08 +0100596 /* Waiting for the ready status */
597 if (!ret) {
598 ret = mmc_send_status(mmc, timeout);
599 return ret;
600 }
601
602 retries--;
603 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000604
605 return ret;
606
Andy Fleming272cc702008-10-30 16:41:01 -0500607}
608
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200609static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode)
Andy Fleming272cc702008-10-30 16:41:01 -0500610{
Andy Fleming272cc702008-10-30 16:41:01 -0500611 int err;
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200612 int speed_bits;
613
614 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
615
616 switch (mode) {
617 case MMC_HS:
618 case MMC_HS_52:
619 case MMC_DDR_52:
620 speed_bits = EXT_CSD_TIMING_HS;
621 case MMC_LEGACY:
622 speed_bits = EXT_CSD_TIMING_LEGACY;
623 break;
624 default:
625 return -EINVAL;
626 }
627 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING,
628 speed_bits);
629 if (err)
630 return err;
631
632 if ((mode == MMC_HS) || (mode == MMC_HS_52)) {
633 /* Now check to see that it worked */
634 err = mmc_send_ext_csd(mmc, test_csd);
635 if (err)
636 return err;
637
638 /* No high-speed support */
639 if (!test_csd[EXT_CSD_HS_TIMING])
640 return -ENOTSUPP;
641 }
642
643 return 0;
644}
645
646static int mmc_get_capabilities(struct mmc *mmc)
647{
648 u8 *ext_csd = mmc->ext_csd;
649 char cardtype;
Andy Fleming272cc702008-10-30 16:41:01 -0500650
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200651 mmc->card_caps = MMC_MODE_1BIT;
Andy Fleming272cc702008-10-30 16:41:01 -0500652
Thomas Choud52ebf12010-12-24 13:12:21 +0000653 if (mmc_host_is_spi(mmc))
654 return 0;
655
Andy Fleming272cc702008-10-30 16:41:01 -0500656 /* Only version 4 supports high-speed */
657 if (mmc->version < MMC_VERSION_4)
658 return 0;
659
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200660 if (!ext_csd) {
661 printf("No ext_csd found!\n"); /* this should enver happen */
662 return -ENOTSUPP;
663 }
664
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600665 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
666
Lei Wen0560db12011-10-03 20:35:10 +0000667 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500668
Andy Fleming272cc702008-10-30 16:41:01 -0500669 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900670 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200671 if (cardtype & EXT_CSD_CARD_TYPE_DDR_52)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900672 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200673 mmc->card_caps |= MMC_MODE_HS_52MHz;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900674 }
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200675 if (cardtype & EXT_CSD_CARD_TYPE_26)
676 mmc->card_caps |= MMC_MODE_HS;
Andy Fleming272cc702008-10-30 16:41:01 -0500677
678 return 0;
679}
680
Stephen Warrenf866a462013-06-11 15:14:01 -0600681static int mmc_set_capacity(struct mmc *mmc, int part_num)
682{
683 switch (part_num) {
684 case 0:
685 mmc->capacity = mmc->capacity_user;
686 break;
687 case 1:
688 case 2:
689 mmc->capacity = mmc->capacity_boot;
690 break;
691 case 3:
692 mmc->capacity = mmc->capacity_rpmb;
693 break;
694 case 4:
695 case 5:
696 case 6:
697 case 7:
698 mmc->capacity = mmc->capacity_gp[part_num - 4];
699 break;
700 default:
701 return -1;
702 }
703
Simon Glassc40fdca2016-05-01 13:52:35 -0600704 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrenf866a462013-06-11 15:14:01 -0600705
706 return 0;
707}
708
Simon Glass7dba0b92016-06-12 23:30:15 -0600709int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wenbc897b12011-05-02 16:26:26 +0000710{
Stephen Warrenf866a462013-06-11 15:14:01 -0600711 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000712
Stephen Warrenf866a462013-06-11 15:14:01 -0600713 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
714 (mmc->part_config & ~PART_ACCESS_MASK)
715 | (part_num & PART_ACCESS_MASK));
Stephen Warrenf866a462013-06-11 15:14:01 -0600716
Peter Bigot6dc93e72014-09-02 18:31:23 -0500717 /*
718 * Set the capacity if the switch succeeded or was intended
719 * to return to representing the raw device.
720 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700721 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500722 ret = mmc_set_capacity(mmc, part_num);
Simon Glassfdbb1392016-05-01 13:52:37 -0600723 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700724 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500725
726 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000727}
728
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100729int mmc_hwpart_config(struct mmc *mmc,
730 const struct mmc_hwpart_conf *conf,
731 enum mmc_hwpart_conf_mode mode)
732{
733 u8 part_attrs = 0;
734 u32 enh_size_mult;
735 u32 enh_start_addr;
736 u32 gp_size_mult[4];
737 u32 max_enh_size_mult;
738 u32 tot_enh_size_mult = 0;
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100739 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100740 int i, pidx, err;
741 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
742
743 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
744 return -EINVAL;
745
746 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
747 printf("eMMC >= 4.4 required for enhanced user data area\n");
748 return -EMEDIUMTYPE;
749 }
750
751 if (!(mmc->part_support & PART_SUPPORT)) {
752 printf("Card does not support partitioning\n");
753 return -EMEDIUMTYPE;
754 }
755
756 if (!mmc->hc_wp_grp_size) {
757 printf("Card does not define HC WP group size\n");
758 return -EMEDIUMTYPE;
759 }
760
761 /* check partition alignment and total enhanced size */
762 if (conf->user.enh_size) {
763 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
764 conf->user.enh_start % mmc->hc_wp_grp_size) {
765 printf("User data enhanced area not HC WP group "
766 "size aligned\n");
767 return -EINVAL;
768 }
769 part_attrs |= EXT_CSD_ENH_USR;
770 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
771 if (mmc->high_capacity) {
772 enh_start_addr = conf->user.enh_start;
773 } else {
774 enh_start_addr = (conf->user.enh_start << 9);
775 }
776 } else {
777 enh_size_mult = 0;
778 enh_start_addr = 0;
779 }
780 tot_enh_size_mult += enh_size_mult;
781
782 for (pidx = 0; pidx < 4; pidx++) {
783 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
784 printf("GP%i partition not HC WP group size "
785 "aligned\n", pidx+1);
786 return -EINVAL;
787 }
788 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
789 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
790 part_attrs |= EXT_CSD_ENH_GP(pidx);
791 tot_enh_size_mult += gp_size_mult[pidx];
792 }
793 }
794
795 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
796 printf("Card does not support enhanced attribute\n");
797 return -EMEDIUMTYPE;
798 }
799
800 err = mmc_send_ext_csd(mmc, ext_csd);
801 if (err)
802 return err;
803
804 max_enh_size_mult =
805 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
806 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
807 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
808 if (tot_enh_size_mult > max_enh_size_mult) {
809 printf("Total enhanced size exceeds maximum (%u > %u)\n",
810 tot_enh_size_mult, max_enh_size_mult);
811 return -EMEDIUMTYPE;
812 }
813
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100814 /* The default value of EXT_CSD_WR_REL_SET is device
815 * dependent, the values can only be changed if the
816 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
817 * changed only once and before partitioning is completed. */
818 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
819 if (conf->user.wr_rel_change) {
820 if (conf->user.wr_rel_set)
821 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
822 else
823 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
824 }
825 for (pidx = 0; pidx < 4; pidx++) {
826 if (conf->gp_part[pidx].wr_rel_change) {
827 if (conf->gp_part[pidx].wr_rel_set)
828 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
829 else
830 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
831 }
832 }
833
834 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
835 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
836 puts("Card does not support host controlled partition write "
837 "reliability settings\n");
838 return -EMEDIUMTYPE;
839 }
840
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100841 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
842 EXT_CSD_PARTITION_SETTING_COMPLETED) {
843 printf("Card already partitioned\n");
844 return -EPERM;
845 }
846
847 if (mode == MMC_HWPART_CONF_CHECK)
848 return 0;
849
850 /* Partitioning requires high-capacity size definitions */
851 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
852 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
853 EXT_CSD_ERASE_GROUP_DEF, 1);
854
855 if (err)
856 return err;
857
858 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
859
860 /* update erase group size to be high-capacity */
861 mmc->erase_grp_size =
862 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
863
864 }
865
866 /* all OK, write the configuration */
867 for (i = 0; i < 4; i++) {
868 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
869 EXT_CSD_ENH_START_ADDR+i,
870 (enh_start_addr >> (i*8)) & 0xFF);
871 if (err)
872 return err;
873 }
874 for (i = 0; i < 3; i++) {
875 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
876 EXT_CSD_ENH_SIZE_MULT+i,
877 (enh_size_mult >> (i*8)) & 0xFF);
878 if (err)
879 return err;
880 }
881 for (pidx = 0; pidx < 4; pidx++) {
882 for (i = 0; i < 3; i++) {
883 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
884 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
885 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
886 if (err)
887 return err;
888 }
889 }
890 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
891 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
892 if (err)
893 return err;
894
895 if (mode == MMC_HWPART_CONF_SET)
896 return 0;
897
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100898 /* The WR_REL_SET is a write-once register but shall be
899 * written before setting PART_SETTING_COMPLETED. As it is
900 * write-once we can only write it when completing the
901 * partitioning. */
902 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
903 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
904 EXT_CSD_WR_REL_SET, wr_rel_set);
905 if (err)
906 return err;
907 }
908
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100909 /* Setting PART_SETTING_COMPLETED confirms the partition
910 * configuration but it only becomes effective after power
911 * cycle, so we do not adjust the partition related settings
912 * in the mmc struct. */
913
914 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
915 EXT_CSD_PARTITION_SETTING,
916 EXT_CSD_PARTITION_SETTING_COMPLETED);
917 if (err)
918 return err;
919
920 return 0;
921}
922
Simon Glasse7881d82017-07-29 11:35:31 -0600923#if !CONFIG_IS_ENABLED(DM_MMC)
Thierry Reding48972d92012-01-02 01:15:37 +0000924int mmc_getcd(struct mmc *mmc)
925{
926 int cd;
927
928 cd = board_mmc_getcd(mmc);
929
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000930 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200931 if (mmc->cfg->ops->getcd)
932 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000933 else
934 cd = 1;
935 }
Thierry Reding48972d92012-01-02 01:15:37 +0000936
937 return cd;
938}
Simon Glass8ca51e52016-06-12 23:30:22 -0600939#endif
Thierry Reding48972d92012-01-02 01:15:37 +0000940
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000941static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500942{
943 struct mmc_cmd cmd;
944 struct mmc_data data;
945
946 /* Switch the frequency */
947 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
948 cmd.resp_type = MMC_RSP_R1;
949 cmd.cmdarg = (mode << 31) | 0xffffff;
950 cmd.cmdarg &= ~(0xf << (group * 4));
951 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500952
953 data.dest = (char *)resp;
954 data.blocksize = 64;
955 data.blocks = 1;
956 data.flags = MMC_DATA_READ;
957
958 return mmc_send_cmd(mmc, &cmd, &data);
959}
960
961
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200962static int sd_get_capabilities(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500963{
964 int err;
965 struct mmc_cmd cmd;
Suniel Mahesh18e7c8f2017-10-05 11:32:00 +0530966 ALLOC_CACHE_ALIGN_BUFFER(__be32, scr, 2);
967 ALLOC_CACHE_ALIGN_BUFFER(__be32, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500968 struct mmc_data data;
969 int timeout;
970
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200971 mmc->card_caps = MMC_MODE_1BIT;
Andy Fleming272cc702008-10-30 16:41:01 -0500972
Thomas Choud52ebf12010-12-24 13:12:21 +0000973 if (mmc_host_is_spi(mmc))
974 return 0;
975
Andy Fleming272cc702008-10-30 16:41:01 -0500976 /* Read the SCR to find out if this card supports higher speeds */
977 cmd.cmdidx = MMC_CMD_APP_CMD;
978 cmd.resp_type = MMC_RSP_R1;
979 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500980
981 err = mmc_send_cmd(mmc, &cmd, NULL);
982
983 if (err)
984 return err;
985
986 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
987 cmd.resp_type = MMC_RSP_R1;
988 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500989
990 timeout = 3;
991
992retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000993 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500994 data.blocksize = 8;
995 data.blocks = 1;
996 data.flags = MMC_DATA_READ;
997
998 err = mmc_send_cmd(mmc, &cmd, &data);
999
1000 if (err) {
1001 if (timeout--)
1002 goto retry_scr;
1003
1004 return err;
1005 }
1006
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +03001007 mmc->scr[0] = __be32_to_cpu(scr[0]);
1008 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -05001009
1010 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng53e8e402016-03-17 21:53:13 -07001011 case 0:
1012 mmc->version = SD_VERSION_1_0;
1013 break;
1014 case 1:
1015 mmc->version = SD_VERSION_1_10;
1016 break;
1017 case 2:
1018 mmc->version = SD_VERSION_2;
1019 if ((mmc->scr[0] >> 15) & 0x1)
1020 mmc->version = SD_VERSION_3;
1021 break;
1022 default:
1023 mmc->version = SD_VERSION_1_0;
1024 break;
Andy Fleming272cc702008-10-30 16:41:01 -05001025 }
1026
Alagu Sankarb44c7082010-05-12 15:08:24 +05301027 if (mmc->scr[0] & SD_DATA_4BIT)
1028 mmc->card_caps |= MMC_MODE_4BIT;
1029
Andy Fleming272cc702008-10-30 16:41:01 -05001030 /* Version 1.0 doesn't support switching */
1031 if (mmc->version == SD_VERSION_1_0)
1032 return 0;
1033
1034 timeout = 4;
1035 while (timeout--) {
1036 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +00001037 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -05001038
1039 if (err)
1040 return err;
1041
1042 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +03001043 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -05001044 break;
1045 }
1046
Andy Fleming272cc702008-10-30 16:41:01 -05001047 /* If high-speed isn't supported, we return */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001048 if (__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED)
1049 mmc->card_caps |= MMC_CAP(SD_HS);
Andy Fleming272cc702008-10-30 16:41:01 -05001050
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001051 return 0;
1052}
1053
1054static int sd_set_card_speed(struct mmc *mmc, enum bus_mode mode)
1055{
1056 int err;
1057
1058 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Macpaul Lin2c3fbf42011-11-28 16:31:09 +00001059
Anton staaff781dd32011-10-03 13:54:59 +00001060 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -05001061 if (err)
1062 return err;
1063
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001064 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) != 0x01000000)
1065 return -ENOTSUPP;
1066
1067 return 0;
1068}
1069
1070int sd_select_bus_width(struct mmc *mmc, int w)
1071{
1072 int err;
1073 struct mmc_cmd cmd;
1074
1075 if ((w != 4) && (w != 1))
1076 return -EINVAL;
1077
1078 cmd.cmdidx = MMC_CMD_APP_CMD;
1079 cmd.resp_type = MMC_RSP_R1;
1080 cmd.cmdarg = mmc->rca << 16;
1081
1082 err = mmc_send_cmd(mmc, &cmd, NULL);
1083 if (err)
1084 return err;
1085
1086 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1087 cmd.resp_type = MMC_RSP_R1;
1088 if (w == 4)
1089 cmd.cmdarg = 2;
1090 else if (w == 1)
1091 cmd.cmdarg = 0;
1092 err = mmc_send_cmd(mmc, &cmd, NULL);
1093 if (err)
1094 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001095
1096 return 0;
1097}
1098
Peng Fan3697e592016-09-01 11:13:38 +08001099static int sd_read_ssr(struct mmc *mmc)
1100{
1101 int err, i;
1102 struct mmc_cmd cmd;
1103 ALLOC_CACHE_ALIGN_BUFFER(uint, ssr, 16);
1104 struct mmc_data data;
1105 int timeout = 3;
1106 unsigned int au, eo, et, es;
1107
1108 cmd.cmdidx = MMC_CMD_APP_CMD;
1109 cmd.resp_type = MMC_RSP_R1;
1110 cmd.cmdarg = mmc->rca << 16;
1111
1112 err = mmc_send_cmd(mmc, &cmd, NULL);
1113 if (err)
1114 return err;
1115
1116 cmd.cmdidx = SD_CMD_APP_SD_STATUS;
1117 cmd.resp_type = MMC_RSP_R1;
1118 cmd.cmdarg = 0;
1119
1120retry_ssr:
1121 data.dest = (char *)ssr;
1122 data.blocksize = 64;
1123 data.blocks = 1;
1124 data.flags = MMC_DATA_READ;
1125
1126 err = mmc_send_cmd(mmc, &cmd, &data);
1127 if (err) {
1128 if (timeout--)
1129 goto retry_ssr;
1130
1131 return err;
1132 }
1133
1134 for (i = 0; i < 16; i++)
1135 ssr[i] = be32_to_cpu(ssr[i]);
1136
1137 au = (ssr[2] >> 12) & 0xF;
1138 if ((au <= 9) || (mmc->version == SD_VERSION_3)) {
1139 mmc->ssr.au = sd_au_size[au];
1140 es = (ssr[3] >> 24) & 0xFF;
1141 es |= (ssr[2] & 0xFF) << 8;
1142 et = (ssr[3] >> 18) & 0x3F;
1143 if (es && et) {
1144 eo = (ssr[3] >> 16) & 0x3;
1145 mmc->ssr.erase_timeout = (et * 1000) / es;
1146 mmc->ssr.erase_offset = eo * 1000;
1147 }
1148 } else {
1149 debug("Invalid Allocation Unit Size.\n");
1150 }
1151
1152 return 0;
1153}
1154
Andy Fleming272cc702008-10-30 16:41:01 -05001155/* frequency bases */
1156/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +00001157static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -05001158 10000,
1159 100000,
1160 1000000,
1161 10000000,
1162};
1163
1164/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
1165 * to platforms without floating point.
1166 */
Simon Glass61fe0762016-05-14 14:02:57 -06001167static const u8 multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -05001168 0, /* reserved */
1169 10,
1170 12,
1171 13,
1172 15,
1173 20,
1174 25,
1175 30,
1176 35,
1177 40,
1178 45,
1179 50,
1180 55,
1181 60,
1182 70,
1183 80,
1184};
1185
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001186static inline int bus_width(uint cap)
1187{
1188 if (cap == MMC_MODE_8BIT)
1189 return 8;
1190 if (cap == MMC_MODE_4BIT)
1191 return 4;
1192 if (cap == MMC_MODE_1BIT)
1193 return 1;
1194 printf("invalid bus witdh capability 0x%x\n", cap);
1195 return 0;
1196}
1197
Simon Glasse7881d82017-07-29 11:35:31 -06001198#if !CONFIG_IS_ENABLED(DM_MMC)
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001199static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001200{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001201 if (mmc->cfg->ops->set_ios)
1202 mmc->cfg->ops->set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001203}
Simon Glass8ca51e52016-06-12 23:30:22 -06001204#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001205
1206void mmc_set_clock(struct mmc *mmc, uint clock)
1207{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001208 if (clock > mmc->cfg->f_max)
1209 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001210
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001211 if (clock < mmc->cfg->f_min)
1212 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001213
1214 mmc->clock = clock;
1215
1216 mmc_set_ios(mmc);
1217}
1218
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001219static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001220{
1221 mmc->bus_width = width;
1222
1223 mmc_set_ios(mmc);
1224}
1225
Jean-Jacques Hiblot4c9d2aa2017-09-21 16:29:54 +02001226#if CONFIG_IS_ENABLED(MMC_VERBOSE) || defined(DEBUG)
1227/*
1228 * helper function to display the capabilities in a human
1229 * friendly manner. The capabilities include bus width and
1230 * supported modes.
1231 */
1232void mmc_dump_capabilities(const char *text, uint caps)
1233{
1234 enum bus_mode mode;
1235
1236 printf("%s: widths [", text);
1237 if (caps & MMC_MODE_8BIT)
1238 printf("8, ");
1239 if (caps & MMC_MODE_4BIT)
1240 printf("4, ");
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001241 if (caps & MMC_MODE_1BIT)
1242 printf("1, ");
1243 printf("\b\b] modes [");
Jean-Jacques Hiblot4c9d2aa2017-09-21 16:29:54 +02001244 for (mode = MMC_LEGACY; mode < MMC_MODES_END; mode++)
1245 if (MMC_CAP(mode) & caps)
1246 printf("%s, ", mmc_mode_name(mode));
1247 printf("\b\b]\n");
1248}
1249#endif
1250
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001251struct mode_width_tuning {
1252 enum bus_mode mode;
1253 uint widths;
1254};
1255
1256static const struct mode_width_tuning sd_modes_by_pref[] = {
1257 {
1258 .mode = SD_HS,
1259 .widths = MMC_MODE_4BIT | MMC_MODE_1BIT,
1260 },
1261 {
1262 .mode = SD_LEGACY,
1263 .widths = MMC_MODE_4BIT | MMC_MODE_1BIT,
1264 }
1265};
1266
1267#define for_each_sd_mode_by_pref(caps, mwt) \
1268 for (mwt = sd_modes_by_pref;\
1269 mwt < sd_modes_by_pref + ARRAY_SIZE(sd_modes_by_pref);\
1270 mwt++) \
1271 if (caps & MMC_CAP(mwt->mode))
1272
1273static int sd_select_mode_and_width(struct mmc *mmc)
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001274{
1275 int err;
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001276 uint widths[] = {MMC_MODE_4BIT, MMC_MODE_1BIT};
1277 const struct mode_width_tuning *mwt;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001278
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001279 err = sd_get_capabilities(mmc);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001280 if (err)
1281 return err;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001282 /* Restrict card's capabilities by what the host can do */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001283 mmc->card_caps &= (mmc->cfg->host_caps | MMC_MODE_1BIT);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001284
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001285 for_each_sd_mode_by_pref(mmc->card_caps, mwt) {
1286 uint *w;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001287
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001288 for (w = widths; w < widths + ARRAY_SIZE(widths); w++) {
1289 if (*w & mmc->card_caps & mwt->widths) {
1290 debug("trying mode %s width %d (at %d MHz)\n",
1291 mmc_mode_name(mwt->mode),
1292 bus_width(*w),
1293 mmc_mode2freq(mmc, mwt->mode) / 1000000);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001294
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001295 /* configure the bus width (card + host) */
1296 err = sd_select_bus_width(mmc, bus_width(*w));
1297 if (err)
1298 goto error;
1299 mmc_set_bus_width(mmc, bus_width(*w));
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001300
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001301 /* configure the bus mode (card) */
1302 err = sd_set_card_speed(mmc, mwt->mode);
1303 if (err)
1304 goto error;
1305
1306 /* configure the bus mode (host) */
1307 mmc_select_mode(mmc, mwt->mode);
1308 mmc_set_clock(mmc, mmc->tran_speed);
1309
1310 err = sd_read_ssr(mmc);
1311 if (!err)
1312 return 0;
1313
1314 printf("bad ssr\n");
1315
1316error:
1317 /* revert to a safer bus speed */
1318 mmc_select_mode(mmc, SD_LEGACY);
1319 mmc_set_clock(mmc, mmc->tran_speed);
1320 }
1321 }
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001322 }
1323
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001324 printf("unable to select a mode\n");
1325 return -ENOTSUPP;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001326}
1327
Jean-Jacques Hiblot7382e692017-09-21 16:29:52 +02001328/*
1329 * read the compare the part of ext csd that is constant.
1330 * This can be used to check that the transfer is working
1331 * as expected.
1332 */
1333static int mmc_read_and_compare_ext_csd(struct mmc *mmc)
1334{
1335 int err;
1336 const u8 *ext_csd = mmc->ext_csd;
1337 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
1338
1339 err = mmc_send_ext_csd(mmc, test_csd);
1340 if (err)
1341 return err;
1342
1343 /* Only compare read only fields */
1344 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1345 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1346 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1347 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1348 ext_csd[EXT_CSD_REV]
1349 == test_csd[EXT_CSD_REV] &&
1350 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1351 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1352 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1353 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
1354 return 0;
1355
1356 return -EBADMSG;
1357}
1358
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001359static const struct mode_width_tuning mmc_modes_by_pref[] = {
1360 {
1361 .mode = MMC_HS_200,
1362 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT,
1363 },
1364 {
1365 .mode = MMC_DDR_52,
1366 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT,
1367 },
1368 {
1369 .mode = MMC_HS_52,
1370 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1371 },
1372 {
1373 .mode = MMC_HS,
1374 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1375 },
1376 {
1377 .mode = MMC_LEGACY,
1378 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1379 }
1380};
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001381
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001382#define for_each_mmc_mode_by_pref(caps, mwt) \
1383 for (mwt = mmc_modes_by_pref;\
1384 mwt < mmc_modes_by_pref + ARRAY_SIZE(mmc_modes_by_pref);\
1385 mwt++) \
1386 if (caps & MMC_CAP(mwt->mode))
1387
1388static const struct ext_csd_bus_width {
1389 uint cap;
1390 bool is_ddr;
1391 uint ext_csd_bits;
1392} ext_csd_bus_width[] = {
1393 {MMC_MODE_8BIT, true, EXT_CSD_DDR_BUS_WIDTH_8},
1394 {MMC_MODE_4BIT, true, EXT_CSD_DDR_BUS_WIDTH_4},
1395 {MMC_MODE_8BIT, false, EXT_CSD_BUS_WIDTH_8},
1396 {MMC_MODE_4BIT, false, EXT_CSD_BUS_WIDTH_4},
1397 {MMC_MODE_1BIT, false, EXT_CSD_BUS_WIDTH_1},
1398};
1399
1400#define for_each_supported_width(caps, ddr, ecbv) \
1401 for (ecbv = ext_csd_bus_width;\
1402 ecbv < ext_csd_bus_width + ARRAY_SIZE(ext_csd_bus_width);\
1403 ecbv++) \
1404 if ((ddr == ecbv->is_ddr) && (caps & ecbv->cap))
1405
1406static int mmc_select_mode_and_width(struct mmc *mmc)
1407{
1408 int err;
1409 const struct mode_width_tuning *mwt;
1410 const struct ext_csd_bus_width *ecbw;
1411
1412 err = mmc_get_capabilities(mmc);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001413 if (err)
1414 return err;
1415
1416 /* Restrict card's capabilities by what the host can do */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001417 mmc->card_caps &= (mmc->cfg->host_caps | MMC_MODE_1BIT);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001418
1419 /* Only version 4 of MMC supports wider bus widths */
1420 if (mmc->version < MMC_VERSION_4)
1421 return 0;
1422
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001423 if (!mmc->ext_csd) {
1424 debug("No ext_csd found!\n"); /* this should enver happen */
1425 return -ENOTSUPP;
1426 }
1427
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001428 for_each_mmc_mode_by_pref(mmc->card_caps, mwt) {
1429 for_each_supported_width(mmc->card_caps & mwt->widths,
1430 mmc_is_mode_ddr(mwt->mode), ecbw) {
1431 debug("trying mode %s width %d (at %d MHz)\n",
1432 mmc_mode_name(mwt->mode),
1433 bus_width(ecbw->cap),
1434 mmc_mode2freq(mmc, mwt->mode) / 1000000);
1435 /* configure the bus width (card + host) */
1436 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1437 EXT_CSD_BUS_WIDTH,
1438 ecbw->ext_csd_bits & ~EXT_CSD_DDR_FLAG);
1439 if (err)
1440 goto error;
1441 mmc_set_bus_width(mmc, bus_width(ecbw->cap));
1442
1443 /* configure the bus speed (card) */
1444 err = mmc_set_card_speed(mmc, mwt->mode);
1445 if (err)
1446 goto error;
1447
1448 /*
1449 * configure the bus width AND the ddr mode (card)
1450 * The host side will be taken care of in the next step
1451 */
1452 if (ecbw->ext_csd_bits & EXT_CSD_DDR_FLAG) {
1453 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1454 EXT_CSD_BUS_WIDTH,
1455 ecbw->ext_csd_bits);
1456 if (err)
1457 goto error;
1458 }
1459
1460 /* configure the bus mode (host) */
1461 mmc_select_mode(mmc, mwt->mode);
1462 mmc_set_clock(mmc, mmc->tran_speed);
1463
1464 /* do a transfer to check the configuration */
1465 err = mmc_read_and_compare_ext_csd(mmc);
1466 if (!err)
1467 return 0;
1468error:
1469 /* if an error occured, revert to a safer bus mode */
1470 mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1471 EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_1);
1472 mmc_select_mode(mmc, MMC_LEGACY);
1473 mmc_set_bus_width(mmc, 1);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001474 }
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001475 }
1476
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001477 printf("unable to select a mode\n");
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001478
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001479 return -ENOTSUPP;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001480}
1481
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001482static int mmc_startup_v4(struct mmc *mmc)
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001483{
1484 int err, i;
1485 u64 capacity;
1486 bool has_parts = false;
1487 bool part_completed;
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001488 u8 *ext_csd;
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001489
1490 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4))
1491 return 0;
1492
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001493 ext_csd = malloc_cache_aligned(MMC_MAX_BLOCK_LEN);
1494 if (!ext_csd)
1495 return -ENOMEM;
1496
1497 mmc->ext_csd = ext_csd;
1498
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001499 /* check ext_csd version and capacity */
1500 err = mmc_send_ext_csd(mmc, ext_csd);
1501 if (err)
1502 return err;
1503 if (ext_csd[EXT_CSD_REV] >= 2) {
1504 /*
1505 * According to the JEDEC Standard, the value of
1506 * ext_csd's capacity is valid if the value is more
1507 * than 2GB
1508 */
1509 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1510 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1511 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1512 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
1513 capacity *= MMC_MAX_BLOCK_LEN;
1514 if ((capacity >> 20) > 2 * 1024)
1515 mmc->capacity_user = capacity;
1516 }
1517
1518 switch (ext_csd[EXT_CSD_REV]) {
1519 case 1:
1520 mmc->version = MMC_VERSION_4_1;
1521 break;
1522 case 2:
1523 mmc->version = MMC_VERSION_4_2;
1524 break;
1525 case 3:
1526 mmc->version = MMC_VERSION_4_3;
1527 break;
1528 case 5:
1529 mmc->version = MMC_VERSION_4_41;
1530 break;
1531 case 6:
1532 mmc->version = MMC_VERSION_4_5;
1533 break;
1534 case 7:
1535 mmc->version = MMC_VERSION_5_0;
1536 break;
1537 case 8:
1538 mmc->version = MMC_VERSION_5_1;
1539 break;
1540 }
1541
1542 /* The partition data may be non-zero but it is only
1543 * effective if PARTITION_SETTING_COMPLETED is set in
1544 * EXT_CSD, so ignore any data if this bit is not set,
1545 * except for enabling the high-capacity group size
1546 * definition (see below).
1547 */
1548 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1549 EXT_CSD_PARTITION_SETTING_COMPLETED);
1550
1551 /* store the partition info of emmc */
1552 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1553 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1554 ext_csd[EXT_CSD_BOOT_MULT])
1555 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
1556 if (part_completed &&
1557 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
1558 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1559
1560 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1561
1562 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1563
1564 for (i = 0; i < 4; i++) {
1565 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1566 uint mult = (ext_csd[idx + 2] << 16) +
1567 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1568 if (mult)
1569 has_parts = true;
1570 if (!part_completed)
1571 continue;
1572 mmc->capacity_gp[i] = mult;
1573 mmc->capacity_gp[i] *=
1574 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1575 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1576 mmc->capacity_gp[i] <<= 19;
1577 }
1578
1579 if (part_completed) {
1580 mmc->enh_user_size =
1581 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) +
1582 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8) +
1583 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1584 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1585 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1586 mmc->enh_user_size <<= 19;
1587 mmc->enh_user_start =
1588 (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24) +
1589 (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) +
1590 (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) +
1591 ext_csd[EXT_CSD_ENH_START_ADDR];
1592 if (mmc->high_capacity)
1593 mmc->enh_user_start <<= 9;
1594 }
1595
1596 /*
1597 * Host needs to enable ERASE_GRP_DEF bit if device is
1598 * partitioned. This bit will be lost every time after a reset
1599 * or power off. This will affect erase size.
1600 */
1601 if (part_completed)
1602 has_parts = true;
1603 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
1604 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1605 has_parts = true;
1606 if (has_parts) {
1607 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1608 EXT_CSD_ERASE_GROUP_DEF, 1);
1609
1610 if (err)
1611 return err;
1612
1613 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
1614 }
1615
1616 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
1617 /* Read out group size from ext_csd */
1618 mmc->erase_grp_size =
1619 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
1620 /*
1621 * if high capacity and partition setting completed
1622 * SEC_COUNT is valid even if it is smaller than 2 GiB
1623 * JEDEC Standard JESD84-B45, 6.2.4
1624 */
1625 if (mmc->high_capacity && part_completed) {
1626 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1627 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1628 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1629 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1630 capacity *= MMC_MAX_BLOCK_LEN;
1631 mmc->capacity_user = capacity;
1632 }
1633 } else {
1634 /* Calculate the group size from the csd value. */
1635 int erase_gsz, erase_gmul;
1636
1637 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1638 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1639 mmc->erase_grp_size = (erase_gsz + 1)
1640 * (erase_gmul + 1);
1641 }
1642
1643 mmc->hc_wp_grp_size = 1024
1644 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1645 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1646
1647 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
1648
1649 return 0;
1650}
1651
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001652static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001653{
Stephen Warrenf866a462013-06-11 15:14:01 -06001654 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001655 uint mult, freq;
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001656 u64 cmult, csize;
Andy Fleming272cc702008-10-30 16:41:01 -05001657 struct mmc_cmd cmd;
Simon Glassc40fdca2016-05-01 13:52:35 -06001658 struct blk_desc *bdesc;
Andy Fleming272cc702008-10-30 16:41:01 -05001659
Thomas Choud52ebf12010-12-24 13:12:21 +00001660#ifdef CONFIG_MMC_SPI_CRC_ON
1661 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1662 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1663 cmd.resp_type = MMC_RSP_R1;
1664 cmd.cmdarg = 1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001665 err = mmc_send_cmd(mmc, &cmd, NULL);
1666
1667 if (err)
1668 return err;
1669 }
1670#endif
1671
Andy Fleming272cc702008-10-30 16:41:01 -05001672 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001673 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1674 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Fleming272cc702008-10-30 16:41:01 -05001675 cmd.resp_type = MMC_RSP_R2;
1676 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001677
1678 err = mmc_send_cmd(mmc, &cmd, NULL);
1679
1680 if (err)
1681 return err;
1682
1683 memcpy(mmc->cid, cmd.response, 16);
1684
1685 /*
1686 * For MMC cards, set the Relative Address.
1687 * For SD cards, get the Relatvie Address.
1688 * This also puts the cards into Standby State
1689 */
Thomas Choud52ebf12010-12-24 13:12:21 +00001690 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1691 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1692 cmd.cmdarg = mmc->rca << 16;
1693 cmd.resp_type = MMC_RSP_R6;
Andy Fleming272cc702008-10-30 16:41:01 -05001694
Thomas Choud52ebf12010-12-24 13:12:21 +00001695 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001696
Thomas Choud52ebf12010-12-24 13:12:21 +00001697 if (err)
1698 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001699
Thomas Choud52ebf12010-12-24 13:12:21 +00001700 if (IS_SD(mmc))
1701 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1702 }
Andy Fleming272cc702008-10-30 16:41:01 -05001703
1704 /* Get the Card-Specific Data */
1705 cmd.cmdidx = MMC_CMD_SEND_CSD;
1706 cmd.resp_type = MMC_RSP_R2;
1707 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001708
1709 err = mmc_send_cmd(mmc, &cmd, NULL);
1710
1711 if (err)
1712 return err;
1713
Rabin Vincent998be3d2009-04-05 13:30:56 +05301714 mmc->csd[0] = cmd.response[0];
1715 mmc->csd[1] = cmd.response[1];
1716 mmc->csd[2] = cmd.response[2];
1717 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -05001718
1719 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301720 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -05001721
1722 switch (version) {
Bin Meng53e8e402016-03-17 21:53:13 -07001723 case 0:
1724 mmc->version = MMC_VERSION_1_2;
1725 break;
1726 case 1:
1727 mmc->version = MMC_VERSION_1_4;
1728 break;
1729 case 2:
1730 mmc->version = MMC_VERSION_2_2;
1731 break;
1732 case 3:
1733 mmc->version = MMC_VERSION_3;
1734 break;
1735 case 4:
1736 mmc->version = MMC_VERSION_4;
1737 break;
1738 default:
1739 mmc->version = MMC_VERSION_1_2;
1740 break;
Andy Fleming272cc702008-10-30 16:41:01 -05001741 }
1742 }
1743
1744 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301745 freq = fbase[(cmd.response[0] & 0x7)];
1746 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001747
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +02001748 mmc->legacy_speed = freq * mult;
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +02001749 mmc_select_mode(mmc, MMC_LEGACY);
Andy Fleming272cc702008-10-30 16:41:01 -05001750
Markus Niebelab711882013-12-16 13:40:46 +01001751 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincent998be3d2009-04-05 13:30:56 +05301752 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001753
1754 if (IS_SD(mmc))
1755 mmc->write_bl_len = mmc->read_bl_len;
1756 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301757 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001758
1759 if (mmc->high_capacity) {
1760 csize = (mmc->csd[1] & 0x3f) << 16
1761 | (mmc->csd[2] & 0xffff0000) >> 16;
1762 cmult = 8;
1763 } else {
1764 csize = (mmc->csd[1] & 0x3ff) << 2
1765 | (mmc->csd[2] & 0xc0000000) >> 30;
1766 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1767 }
1768
Stephen Warrenf866a462013-06-11 15:14:01 -06001769 mmc->capacity_user = (csize + 1) << (cmult + 2);
1770 mmc->capacity_user *= mmc->read_bl_len;
1771 mmc->capacity_boot = 0;
1772 mmc->capacity_rpmb = 0;
1773 for (i = 0; i < 4; i++)
1774 mmc->capacity_gp[i] = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001775
Simon Glass8bfa1952013-04-03 08:54:30 +00001776 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1777 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001778
Simon Glass8bfa1952013-04-03 08:54:30 +00001779 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1780 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001781
Markus Niebelab711882013-12-16 13:40:46 +01001782 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1783 cmd.cmdidx = MMC_CMD_SET_DSR;
1784 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1785 cmd.resp_type = MMC_RSP_NONE;
1786 if (mmc_send_cmd(mmc, &cmd, NULL))
1787 printf("MMC: SET_DSR failed\n");
1788 }
1789
Andy Fleming272cc702008-10-30 16:41:01 -05001790 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001791 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1792 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargavfe8f7062011-10-05 03:13:23 +00001793 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001794 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001795 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001796
Thomas Choud52ebf12010-12-24 13:12:21 +00001797 if (err)
1798 return err;
1799 }
Andy Fleming272cc702008-10-30 16:41:01 -05001800
Lei Wene6f99a52011-06-22 17:03:31 +00001801 /*
1802 * For SD, its erase group is always one sector
1803 */
1804 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001805 mmc->part_config = MMCPART_NOAVAILABLE;
Lei Wenbc897b12011-05-02 16:26:26 +00001806
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001807 err = mmc_startup_v4(mmc);
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001808 if (err)
1809 return err;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301810
Simon Glassc40fdca2016-05-01 13:52:35 -06001811 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001812 if (err)
1813 return err;
1814
Andy Fleming272cc702008-10-30 16:41:01 -05001815 if (IS_SD(mmc))
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001816 err = sd_select_mode_and_width(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001817 else
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001818 err = mmc_select_mode_and_width(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001819
1820 if (err)
1821 return err;
1822
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001823
Andrew Gabbasov5af8f452014-12-01 06:59:11 -06001824 /* Fix the block length for DDR mode */
1825 if (mmc->ddr_mode) {
1826 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1827 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1828 }
1829
Andy Fleming272cc702008-10-30 16:41:01 -05001830 /* fill in device description */
Simon Glassc40fdca2016-05-01 13:52:35 -06001831 bdesc = mmc_get_blk_desc(mmc);
1832 bdesc->lun = 0;
1833 bdesc->hwpart = 0;
1834 bdesc->type = 0;
1835 bdesc->blksz = mmc->read_bl_len;
1836 bdesc->log2blksz = LOG2(bdesc->blksz);
1837 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001838#if !defined(CONFIG_SPL_BUILD) || \
1839 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1840 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glassc40fdca2016-05-01 13:52:35 -06001841 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Huttbabce5f2012-10-20 17:15:59 +00001842 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1843 (mmc->cid[3] >> 16) & 0xffff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001844 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001845 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1846 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1847 (mmc->cid[2] >> 24) & 0xff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001848 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001849 (mmc->cid[2] >> 16) & 0xf);
Paul Burton56196822013-09-04 16:12:25 +01001850#else
Simon Glassc40fdca2016-05-01 13:52:35 -06001851 bdesc->vendor[0] = 0;
1852 bdesc->product[0] = 0;
1853 bdesc->revision[0] = 0;
Paul Burton56196822013-09-04 16:12:25 +01001854#endif
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001855#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassc40fdca2016-05-01 13:52:35 -06001856 part_init(bdesc);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001857#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001858
1859 return 0;
1860}
1861
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001862static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001863{
1864 struct mmc_cmd cmd;
1865 int err;
1866
1867 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1868 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001869 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001870 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001871
1872 err = mmc_send_cmd(mmc, &cmd, NULL);
1873
1874 if (err)
1875 return err;
1876
Rabin Vincent998be3d2009-04-05 13:30:56 +05301877 if ((cmd.response[0] & 0xff) != 0xaa)
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001878 return -EOPNOTSUPP;
Andy Fleming272cc702008-10-30 16:41:01 -05001879 else
1880 mmc->version = SD_VERSION_2;
1881
1882 return 0;
1883}
1884
Simon Glassc4d660d2017-07-04 13:31:19 -06001885#if !CONFIG_IS_ENABLED(DM_MMC)
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001886/* board-specific MMC power initializations. */
1887__weak void board_mmc_power_init(void)
1888{
1889}
Simon Glass05cbeb72017-04-22 19:10:56 -06001890#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001891
Peng Fan2051aef2016-10-11 15:08:43 +08001892static int mmc_power_init(struct mmc *mmc)
1893{
Simon Glassc4d660d2017-07-04 13:31:19 -06001894#if CONFIG_IS_ENABLED(DM_MMC)
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001895#if CONFIG_IS_ENABLED(DM_REGULATOR)
Peng Fan2051aef2016-10-11 15:08:43 +08001896 int ret;
1897
1898 ret = device_get_supply_regulator(mmc->dev, "vmmc-supply",
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001899 &mmc->vmmc_supply);
1900 if (ret)
Jaehoon Chung288db7c2016-10-24 15:22:22 +09001901 debug("%s: No vmmc supply\n", mmc->dev->name);
Peng Fan2051aef2016-10-11 15:08:43 +08001902
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001903 ret = device_get_supply_regulator(mmc->dev, "vqmmc-supply",
1904 &mmc->vqmmc_supply);
1905 if (ret)
1906 debug("%s: No vqmmc supply\n", mmc->dev->name);
1907
1908 if (mmc->vmmc_supply) {
1909 ret = regulator_set_enable(mmc->vmmc_supply, true);
1910 if (ret) {
1911 puts("Error enabling VMMC supply\n");
1912 return ret;
1913 }
Peng Fan2051aef2016-10-11 15:08:43 +08001914 }
1915#endif
Simon Glass05cbeb72017-04-22 19:10:56 -06001916#else /* !CONFIG_DM_MMC */
1917 /*
1918 * Driver model should use a regulator, as above, rather than calling
1919 * out to board code.
1920 */
1921 board_mmc_power_init();
1922#endif
Peng Fan2051aef2016-10-11 15:08:43 +08001923 return 0;
1924}
1925
Che-Liang Chioue9550442012-11-28 15:21:13 +00001926int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001927{
Simon Glass8ca51e52016-06-12 23:30:22 -06001928 bool no_card;
Macpaul Linafd59322011-11-14 23:35:39 +00001929 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001930
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001931 /* we pretend there's no card when init is NULL */
Simon Glass8ca51e52016-06-12 23:30:22 -06001932 no_card = mmc_getcd(mmc) == 0;
Simon Glasse7881d82017-07-29 11:35:31 -06001933#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glass8ca51e52016-06-12 23:30:22 -06001934 no_card = no_card || (mmc->cfg->ops->init == NULL);
1935#endif
1936 if (no_card) {
Thierry Reding48972d92012-01-02 01:15:37 +00001937 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001938#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001939 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001940#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001941 return -ENOMEDIUM;
Thierry Reding48972d92012-01-02 01:15:37 +00001942 }
1943
Lei Wenbc897b12011-05-02 16:26:26 +00001944 if (mmc->has_init)
1945 return 0;
1946
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001947#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1948 mmc_adapter_card_type_ident();
1949#endif
Peng Fan2051aef2016-10-11 15:08:43 +08001950 err = mmc_power_init(mmc);
1951 if (err)
1952 return err;
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001953
Simon Glasse7881d82017-07-29 11:35:31 -06001954#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass8ca51e52016-06-12 23:30:22 -06001955 /* The device has already been probed ready for use */
1956#else
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001957 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001958 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001959 if (err)
1960 return err;
Simon Glass8ca51e52016-06-12 23:30:22 -06001961#endif
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001962 mmc->ddr_mode = 0;
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001963 mmc_set_bus_width(mmc, 1);
1964 mmc_set_clock(mmc, 1);
1965
Andy Fleming272cc702008-10-30 16:41:01 -05001966 /* Reset the Card */
1967 err = mmc_go_idle(mmc);
1968
1969 if (err)
1970 return err;
1971
Lei Wenbc897b12011-05-02 16:26:26 +00001972 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glassc40fdca2016-05-01 13:52:35 -06001973 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00001974
Andy Fleming272cc702008-10-30 16:41:01 -05001975 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001976 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001977
Andy Fleming272cc702008-10-30 16:41:01 -05001978 /* Now try to get the SD card's operating condition */
1979 err = sd_send_op_cond(mmc);
1980
1981 /* If the command timed out, we check for an MMC card */
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001982 if (err == -ETIMEDOUT) {
Andy Fleming272cc702008-10-30 16:41:01 -05001983 err = mmc_send_op_cond(mmc);
1984
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001985 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01001986#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001987 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01001988#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001989 return -EOPNOTSUPP;
Andy Fleming272cc702008-10-30 16:41:01 -05001990 }
1991 }
1992
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001993 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001994 mmc->init_in_progress = 1;
1995
1996 return err;
1997}
1998
1999static int mmc_complete_init(struct mmc *mmc)
2000{
2001 int err = 0;
2002
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002003 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +00002004 if (mmc->op_cond_pending)
2005 err = mmc_complete_op_cond(mmc);
2006
2007 if (!err)
2008 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00002009 if (err)
2010 mmc->has_init = 0;
2011 else
2012 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00002013 return err;
2014}
2015
2016int mmc_init(struct mmc *mmc)
2017{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002018 int err = 0;
Marek Vasutce9eca92016-12-01 02:06:32 +01002019 __maybe_unused unsigned start;
Simon Glassc4d660d2017-07-04 13:31:19 -06002020#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass33fb2112016-05-01 13:52:41 -06002021 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chioue9550442012-11-28 15:21:13 +00002022
Simon Glass33fb2112016-05-01 13:52:41 -06002023 upriv->mmc = mmc;
2024#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00002025 if (mmc->has_init)
2026 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02002027
2028 start = get_timer(0);
2029
Che-Liang Chioue9550442012-11-28 15:21:13 +00002030 if (!mmc->init_in_progress)
2031 err = mmc_start_init(mmc);
2032
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002033 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00002034 err = mmc_complete_init(mmc);
Jagan Teki919b4852017-01-10 11:18:43 +01002035 if (err)
2036 printf("%s: %d, time %lu\n", __func__, err, get_timer(start));
2037
Lei Wenbc897b12011-05-02 16:26:26 +00002038 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05002039}
2040
Markus Niebelab711882013-12-16 13:40:46 +01002041int mmc_set_dsr(struct mmc *mmc, u16 val)
2042{
2043 mmc->dsr = val;
2044 return 0;
2045}
2046
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02002047/* CPU-specific MMC initializations */
2048__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05002049{
2050 return -1;
2051}
2052
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02002053/* board-specific MMC initializations. */
2054__weak int board_mmc_init(bd_t *bis)
2055{
2056 return -1;
2057}
Andy Fleming272cc702008-10-30 16:41:01 -05002058
Che-Liang Chioue9550442012-11-28 15:21:13 +00002059void mmc_set_preinit(struct mmc *mmc, int preinit)
2060{
2061 mmc->preinit = preinit;
2062}
2063
Simon Glassc4d660d2017-07-04 13:31:19 -06002064#if CONFIG_IS_ENABLED(DM_MMC) && defined(CONFIG_SPL_BUILD)
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002065static int mmc_probe(bd_t *bis)
2066{
2067 return 0;
2068}
Simon Glassc4d660d2017-07-04 13:31:19 -06002069#elif CONFIG_IS_ENABLED(DM_MMC)
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002070static int mmc_probe(bd_t *bis)
2071{
Simon Glass4a1db6d2015-12-29 05:22:49 -07002072 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002073 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07002074 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002075
2076 ret = uclass_get(UCLASS_MMC, &uc);
2077 if (ret)
2078 return ret;
2079
Simon Glass4a1db6d2015-12-29 05:22:49 -07002080 /*
2081 * Try to add them in sequence order. Really with driver model we
2082 * should allow holes, but the current MMC list does not allow that.
2083 * So if we request 0, 1, 3 we will get 0, 1, 2.
2084 */
2085 for (i = 0; ; i++) {
2086 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
2087 if (ret == -ENODEV)
2088 break;
2089 }
2090 uclass_foreach_dev(dev, uc) {
2091 ret = device_probe(dev);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002092 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07002093 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002094 }
2095
2096 return 0;
2097}
2098#else
2099static int mmc_probe(bd_t *bis)
2100{
2101 if (board_mmc_init(bis) < 0)
2102 cpu_mmc_init(bis);
2103
2104 return 0;
2105}
2106#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00002107
Andy Fleming272cc702008-10-30 16:41:01 -05002108int mmc_initialize(bd_t *bis)
2109{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02002110 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002111 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02002112 if (initialized) /* Avoid initializing mmc multiple times */
2113 return 0;
2114 initialized = 1;
2115
Simon Glassc4d660d2017-07-04 13:31:19 -06002116#if !CONFIG_IS_ENABLED(BLK)
Marek Vasutb5b838f2016-12-01 02:06:33 +01002117#if !CONFIG_IS_ENABLED(MMC_TINY)
Simon Glassc40fdca2016-05-01 13:52:35 -06002118 mmc_list_init();
2119#endif
Marek Vasutb5b838f2016-12-01 02:06:33 +01002120#endif
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002121 ret = mmc_probe(bis);
2122 if (ret)
2123 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05002124
Ying Zhangbb0dc102013-08-16 15:16:11 +08002125#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05002126 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08002127#endif
Andy Fleming272cc702008-10-30 16:41:01 -05002128
Simon Glassc40fdca2016-05-01 13:52:35 -06002129 mmc_do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05002130 return 0;
2131}
Tomas Melincd3d4882016-11-25 11:01:03 +02002132
2133#ifdef CONFIG_CMD_BKOPS_ENABLE
2134int mmc_set_bkops_enable(struct mmc *mmc)
2135{
2136 int err;
2137 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
2138
2139 err = mmc_send_ext_csd(mmc, ext_csd);
2140 if (err) {
2141 puts("Could not get ext_csd register values\n");
2142 return err;
2143 }
2144
2145 if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) {
2146 puts("Background operations not supported on device\n");
2147 return -EMEDIUMTYPE;
2148 }
2149
2150 if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) {
2151 puts("Background operations already enabled\n");
2152 return 0;
2153 }
2154
2155 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1);
2156 if (err) {
2157 puts("Failed to enable manual background operations\n");
2158 return err;
2159 }
2160
2161 puts("Enabled manual background operations\n");
2162
2163 return 0;
2164}
2165#endif