blob: 1875b31ad1fbe302a7de5a0a728d8bf44a71daea [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
Kishon Vijay Abraham Iaff5d3c2017-09-21 16:30:00 +020033static int mmc_set_signal_voltage(struct mmc *mmc, uint signal_voltage);
34
Marek Vasutb5b838f2016-12-01 02:06:33 +010035#if CONFIG_IS_ENABLED(MMC_TINY)
36static struct mmc mmc_static;
37struct mmc *find_mmc_device(int dev_num)
38{
39 return &mmc_static;
40}
41
42void mmc_do_preinit(void)
43{
44 struct mmc *m = &mmc_static;
45#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
46 mmc_set_preinit(m, 1);
47#endif
48 if (m->preinit)
49 mmc_start_init(m);
50}
51
52struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
53{
54 return &mmc->block_dev;
55}
56#endif
57
Simon Glasse7881d82017-07-29 11:35:31 -060058#if !CONFIG_IS_ENABLED(DM_MMC)
Jeroen Hofstee750121c2014-07-12 21:24:08 +020059__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000060{
61 return -1;
62}
63
64int mmc_getwp(struct mmc *mmc)
65{
66 int wp;
67
68 wp = board_mmc_getwp(mmc);
69
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000070 if (wp < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020071 if (mmc->cfg->ops->getwp)
72 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000073 else
74 wp = 0;
75 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000076
77 return wp;
78}
79
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +020080__weak int board_mmc_getcd(struct mmc *mmc)
81{
Stefano Babic11fdade2010-02-05 15:04:43 +010082 return -1;
83}
Simon Glass8ca51e52016-06-12 23:30:22 -060084#endif
Stefano Babic11fdade2010-02-05 15:04:43 +010085
Marek Vasut8635ff92012-03-15 18:41:35 +000086#ifdef CONFIG_MMC_TRACE
Simon Glassc0c76eb2016-06-12 23:30:20 -060087void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
88{
89 printf("CMD_SEND:%d\n", cmd->cmdidx);
90 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
91}
92
93void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
94{
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000095 int i;
96 u8 *ptr;
97
Bin Meng7863ce52016-03-17 21:53:14 -070098 if (ret) {
99 printf("\t\tRET\t\t\t %d\n", ret);
100 } else {
101 switch (cmd->resp_type) {
102 case MMC_RSP_NONE:
103 printf("\t\tMMC_RSP_NONE\n");
104 break;
105 case MMC_RSP_R1:
106 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
107 cmd->response[0]);
108 break;
109 case MMC_RSP_R1b:
110 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
111 cmd->response[0]);
112 break;
113 case MMC_RSP_R2:
114 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
115 cmd->response[0]);
116 printf("\t\t \t\t 0x%08X \n",
117 cmd->response[1]);
118 printf("\t\t \t\t 0x%08X \n",
119 cmd->response[2]);
120 printf("\t\t \t\t 0x%08X \n",
121 cmd->response[3]);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000122 printf("\n");
Bin Meng7863ce52016-03-17 21:53:14 -0700123 printf("\t\t\t\t\tDUMPING DATA\n");
124 for (i = 0; i < 4; i++) {
125 int j;
126 printf("\t\t\t\t\t%03d - ", i*4);
127 ptr = (u8 *)&cmd->response[i];
128 ptr += 3;
129 for (j = 0; j < 4; j++)
130 printf("%02X ", *ptr--);
131 printf("\n");
132 }
133 break;
134 case MMC_RSP_R3:
135 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
136 cmd->response[0]);
137 break;
138 default:
139 printf("\t\tERROR MMC rsp not supported\n");
140 break;
Bin Meng53e8e402016-03-17 21:53:13 -0700141 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000142 }
Simon Glassc0c76eb2016-06-12 23:30:20 -0600143}
144
145void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
146{
147 int status;
148
149 status = (cmd->response[0] & MMC_STATUS_CURR_STATE) >> 9;
150 printf("CURR STATE:%d\n", status);
151}
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000152#endif
Simon Glassc0c76eb2016-06-12 23:30:20 -0600153
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200154#if CONFIG_IS_ENABLED(MMC_VERBOSE) || defined(DEBUG)
155const char *mmc_mode_name(enum bus_mode mode)
156{
157 static const char *const names[] = {
158 [MMC_LEGACY] = "MMC legacy",
159 [SD_LEGACY] = "SD Legacy",
160 [MMC_HS] = "MMC High Speed (26MHz)",
161 [SD_HS] = "SD High Speed (50MHz)",
162 [UHS_SDR12] = "UHS SDR12 (25MHz)",
163 [UHS_SDR25] = "UHS SDR25 (50MHz)",
164 [UHS_SDR50] = "UHS SDR50 (100MHz)",
165 [UHS_SDR104] = "UHS SDR104 (208MHz)",
166 [UHS_DDR50] = "UHS DDR50 (50MHz)",
167 [MMC_HS_52] = "MMC High Speed (52MHz)",
168 [MMC_DDR_52] = "MMC DDR52 (52MHz)",
169 [MMC_HS_200] = "HS200 (200MHz)",
170 };
171
172 if (mode >= MMC_MODES_END)
173 return "Unknown mode";
174 else
175 return names[mode];
176}
177#endif
178
Jean-Jacques Hiblot05038572017-09-21 16:29:55 +0200179static uint mmc_mode2freq(struct mmc *mmc, enum bus_mode mode)
180{
181 static const int freqs[] = {
182 [SD_LEGACY] = 25000000,
183 [MMC_HS] = 26000000,
184 [SD_HS] = 50000000,
185 [UHS_SDR12] = 25000000,
186 [UHS_SDR25] = 50000000,
187 [UHS_SDR50] = 100000000,
188 [UHS_SDR104] = 208000000,
189 [UHS_DDR50] = 50000000,
190 [MMC_HS_52] = 52000000,
191 [MMC_DDR_52] = 52000000,
192 [MMC_HS_200] = 200000000,
193 };
194
195 if (mode == MMC_LEGACY)
196 return mmc->legacy_speed;
197 else if (mode >= MMC_MODES_END)
198 return 0;
199 else
200 return freqs[mode];
201}
202
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200203static int mmc_select_mode(struct mmc *mmc, enum bus_mode mode)
204{
205 mmc->selected_mode = mode;
Jean-Jacques Hiblot05038572017-09-21 16:29:55 +0200206 mmc->tran_speed = mmc_mode2freq(mmc, mode);
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200207 mmc->ddr_mode = mmc_is_mode_ddr(mode);
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +0200208 debug("selecting mode %s (freq : %d MHz)\n", mmc_mode_name(mode),
209 mmc->tran_speed / 1000000);
210 return 0;
211}
212
Simon Glasse7881d82017-07-29 11:35:31 -0600213#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glassc0c76eb2016-06-12 23:30:20 -0600214int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
215{
216 int ret;
217
218 mmmc_trace_before_send(mmc, cmd);
219 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
220 mmmc_trace_after_send(mmc, cmd, ret);
221
Marek Vasut8635ff92012-03-15 18:41:35 +0000222 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500223}
Simon Glass8ca51e52016-06-12 23:30:22 -0600224#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500225
Paul Burtonda61fa52013-09-09 15:30:26 +0100226int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000227{
228 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000229 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000230
231 cmd.cmdidx = MMC_CMD_SEND_STATUS;
232 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200233 if (!mmc_host_is_spi(mmc))
234 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000235
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500236 while (1) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000237 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000238 if (!err) {
239 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
240 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
241 MMC_STATE_PRG)
242 break;
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200243
244 if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton56196822013-09-04 16:12:25 +0100245#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzked617c422012-02-05 22:29:12 +0000246 printf("Status Error: 0x%08X\n",
247 cmd.response[0]);
Paul Burton56196822013-09-04 16:12:25 +0100248#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900249 return -ECOMM;
Jan Kloetzked617c422012-02-05 22:29:12 +0000250 }
251 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000252 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000253
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500254 if (timeout-- <= 0)
255 break;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000256
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500257 udelay(1000);
258 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000259
Simon Glassc0c76eb2016-06-12 23:30:20 -0600260 mmc_trace_state(mmc, &cmd);
Jongman Heo5b0c9422012-06-03 21:32:13 +0000261 if (timeout <= 0) {
Paul Burton56196822013-09-04 16:12:25 +0100262#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000263 printf("Timeout waiting card ready\n");
Paul Burton56196822013-09-04 16:12:25 +0100264#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900265 return -ETIMEDOUT;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000266 }
267
268 return 0;
269}
270
Paul Burtonda61fa52013-09-09 15:30:26 +0100271int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500272{
273 struct mmc_cmd cmd;
274
Andrew Gabbasov786e8f82014-12-01 06:59:09 -0600275 if (mmc->ddr_mode)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900276 return 0;
277
Andy Fleming272cc702008-10-30 16:41:01 -0500278 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
279 cmd.resp_type = MMC_RSP_R1;
280 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500281
282 return mmc_send_cmd(mmc, &cmd, NULL);
283}
284
Sascha Silbeff8fef52013-06-14 13:07:25 +0200285static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000286 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500287{
288 struct mmc_cmd cmd;
289 struct mmc_data data;
290
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700291 if (blkcnt > 1)
292 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
293 else
294 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500295
296 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700297 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500298 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700299 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500300
301 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500302
303 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700304 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500305 data.blocksize = mmc->read_bl_len;
306 data.flags = MMC_DATA_READ;
307
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700308 if (mmc_send_cmd(mmc, &cmd, &data))
309 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500310
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700311 if (blkcnt > 1) {
312 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
313 cmd.cmdarg = 0;
314 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700315 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton56196822013-09-04 16:12:25 +0100316#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700317 printf("mmc fail to send stop cmd\n");
Paul Burton56196822013-09-04 16:12:25 +0100318#endif
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700319 return 0;
320 }
Andy Fleming272cc702008-10-30 16:41:01 -0500321 }
322
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700323 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500324}
325
Simon Glassc4d660d2017-07-04 13:31:19 -0600326#if CONFIG_IS_ENABLED(BLK)
Simon Glass7dba0b92016-06-12 23:30:15 -0600327ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600328#else
Simon Glass7dba0b92016-06-12 23:30:15 -0600329ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
330 void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600331#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500332{
Simon Glassc4d660d2017-07-04 13:31:19 -0600333#if CONFIG_IS_ENABLED(BLK)
Simon Glass33fb2112016-05-01 13:52:41 -0600334 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
335#endif
Simon Glassbcce53d2016-02-29 15:25:51 -0700336 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700337 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700338 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500339
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700340 if (blkcnt == 0)
341 return 0;
342
343 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500344 if (!mmc)
345 return 0;
346
Marek Vasutb5b838f2016-12-01 02:06:33 +0100347 if (CONFIG_IS_ENABLED(MMC_TINY))
348 err = mmc_switch_part(mmc, block_dev->hwpart);
349 else
350 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
351
Stephen Warren873cc1d2015-12-07 11:38:49 -0700352 if (err < 0)
353 return 0;
354
Simon Glassc40fdca2016-05-01 13:52:35 -0600355 if ((start + blkcnt) > block_dev->lba) {
Paul Burton56196822013-09-04 16:12:25 +0100356#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200357 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glassc40fdca2016-05-01 13:52:35 -0600358 start + blkcnt, block_dev->lba);
Paul Burton56196822013-09-04 16:12:25 +0100359#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800360 return 0;
361 }
Andy Fleming272cc702008-10-30 16:41:01 -0500362
Simon Glass11692992015-06-23 15:38:50 -0600363 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
364 debug("%s: Failed to set blocklen\n", __func__);
Andy Fleming272cc702008-10-30 16:41:01 -0500365 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600366 }
Andy Fleming272cc702008-10-30 16:41:01 -0500367
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700368 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200369 cur = (blocks_todo > mmc->cfg->b_max) ?
370 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-06-23 15:38:50 -0600371 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
372 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700373 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600374 }
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700375 blocks_todo -= cur;
376 start += cur;
377 dst += cur * mmc->read_bl_len;
378 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500379
380 return blkcnt;
381}
382
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000383static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500384{
385 struct mmc_cmd cmd;
386 int err;
387
388 udelay(1000);
389
390 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
391 cmd.cmdarg = 0;
392 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500393
394 err = mmc_send_cmd(mmc, &cmd, NULL);
395
396 if (err)
397 return err;
398
399 udelay(2000);
400
401 return 0;
402}
403
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000404static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500405{
406 int timeout = 1000;
407 int err;
408 struct mmc_cmd cmd;
409
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500410 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500411 cmd.cmdidx = MMC_CMD_APP_CMD;
412 cmd.resp_type = MMC_RSP_R1;
413 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500414
415 err = mmc_send_cmd(mmc, &cmd, NULL);
416
417 if (err)
418 return err;
419
420 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
421 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100422
423 /*
424 * Most cards do not answer if some reserved bits
425 * in the ocr are set. However, Some controller
426 * can set bit 7 (reserved for low voltages), but
427 * how to manage low voltages SD card is not yet
428 * specified.
429 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000430 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200431 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500432
433 if (mmc->version == SD_VERSION_2)
434 cmd.cmdarg |= OCR_HCS;
435
436 err = mmc_send_cmd(mmc, &cmd, NULL);
437
438 if (err)
439 return err;
440
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500441 if (cmd.response[0] & OCR_BUSY)
442 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500443
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500444 if (timeout-- <= 0)
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900445 return -EOPNOTSUPP;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500446
447 udelay(1000);
448 }
Andy Fleming272cc702008-10-30 16:41:01 -0500449
450 if (mmc->version != SD_VERSION_2)
451 mmc->version = SD_VERSION_1_0;
452
Thomas Choud52ebf12010-12-24 13:12:21 +0000453 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
454 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
455 cmd.resp_type = MMC_RSP_R3;
456 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000457
458 err = mmc_send_cmd(mmc, &cmd, NULL);
459
460 if (err)
461 return err;
462 }
463
Rabin Vincent998be3d2009-04-05 13:30:56 +0530464 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500465
466 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
467 mmc->rca = 0;
468
469 return 0;
470}
471
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500472static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500473{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500474 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500475 int err;
476
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500477 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
478 cmd.resp_type = MMC_RSP_R3;
479 cmd.cmdarg = 0;
Rob Herring5a203972015-03-23 17:56:59 -0500480 if (use_arg && !mmc_host_is_spi(mmc))
481 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200482 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500483 (mmc->ocr & OCR_VOLTAGE_MASK)) |
484 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000485
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500486 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000487 if (err)
488 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500489 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000490 return 0;
491}
492
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200493static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000494{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000495 int err, i;
496
Andy Fleming272cc702008-10-30 16:41:01 -0500497 /* Some cards seem to need this */
498 mmc_go_idle(mmc);
499
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000500 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000501 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500502 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500503 if (err)
504 return err;
505
Che-Liang Chioue9550442012-11-28 15:21:13 +0000506 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500507 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500508 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000509 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500510 mmc->op_cond_pending = 1;
511 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000512}
Andy Fleming272cc702008-10-30 16:41:01 -0500513
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200514static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000515{
516 struct mmc_cmd cmd;
517 int timeout = 1000;
518 uint start;
519 int err;
520
521 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500522 if (!(mmc->ocr & OCR_BUSY)) {
Yangbo Lud188b112016-08-02 15:33:18 +0800523 /* Some cards seem to need this */
524 mmc_go_idle(mmc);
525
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500526 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500527 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500528 err = mmc_send_op_cond_iter(mmc, 1);
529 if (err)
530 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500531 if (mmc->ocr & OCR_BUSY)
532 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500533 if (get_timer(start) > timeout)
Jaehoon Chung915ffa52016-07-19 16:33:36 +0900534 return -EOPNOTSUPP;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500535 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500536 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500537 }
Andy Fleming272cc702008-10-30 16:41:01 -0500538
Thomas Choud52ebf12010-12-24 13:12:21 +0000539 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
540 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
541 cmd.resp_type = MMC_RSP_R3;
542 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000543
544 err = mmc_send_cmd(mmc, &cmd, NULL);
545
546 if (err)
547 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500548
549 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000550 }
551
Andy Fleming272cc702008-10-30 16:41:01 -0500552 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500553
554 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700555 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500556
557 return 0;
558}
559
560
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000561static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500562{
563 struct mmc_cmd cmd;
564 struct mmc_data data;
565 int err;
566
567 /* Get the Card Status Register */
568 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
569 cmd.resp_type = MMC_RSP_R1;
570 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500571
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000572 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500573 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000574 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -0500575 data.flags = MMC_DATA_READ;
576
577 err = mmc_send_cmd(mmc, &cmd, &data);
578
579 return err;
580}
581
Simon Glassc40704f2016-06-12 23:30:18 -0600582int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500583{
584 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000585 int timeout = 1000;
Maxime Riparda9003dc2016-11-04 16:18:08 +0100586 int retries = 3;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000587 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500588
589 cmd.cmdidx = MMC_CMD_SWITCH;
590 cmd.resp_type = MMC_RSP_R1b;
591 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000592 (index << 16) |
593 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500594
Maxime Riparda9003dc2016-11-04 16:18:08 +0100595 while (retries > 0) {
596 ret = mmc_send_cmd(mmc, &cmd, NULL);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000597
Maxime Riparda9003dc2016-11-04 16:18:08 +0100598 /* Waiting for the ready status */
599 if (!ret) {
600 ret = mmc_send_status(mmc, timeout);
601 return ret;
602 }
603
604 retries--;
605 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000606
607 return ret;
608
Andy Fleming272cc702008-10-30 16:41:01 -0500609}
610
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200611static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode)
Andy Fleming272cc702008-10-30 16:41:01 -0500612{
Andy Fleming272cc702008-10-30 16:41:01 -0500613 int err;
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200614 int speed_bits;
615
616 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
617
618 switch (mode) {
619 case MMC_HS:
620 case MMC_HS_52:
621 case MMC_DDR_52:
622 speed_bits = EXT_CSD_TIMING_HS;
623 case MMC_LEGACY:
624 speed_bits = EXT_CSD_TIMING_LEGACY;
625 break;
626 default:
627 return -EINVAL;
628 }
629 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING,
630 speed_bits);
631 if (err)
632 return err;
633
634 if ((mode == MMC_HS) || (mode == MMC_HS_52)) {
635 /* Now check to see that it worked */
636 err = mmc_send_ext_csd(mmc, test_csd);
637 if (err)
638 return err;
639
640 /* No high-speed support */
641 if (!test_csd[EXT_CSD_HS_TIMING])
642 return -ENOTSUPP;
643 }
644
645 return 0;
646}
647
648static int mmc_get_capabilities(struct mmc *mmc)
649{
650 u8 *ext_csd = mmc->ext_csd;
651 char cardtype;
Andy Fleming272cc702008-10-30 16:41:01 -0500652
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200653 mmc->card_caps = MMC_MODE_1BIT;
Andy Fleming272cc702008-10-30 16:41:01 -0500654
Thomas Choud52ebf12010-12-24 13:12:21 +0000655 if (mmc_host_is_spi(mmc))
656 return 0;
657
Andy Fleming272cc702008-10-30 16:41:01 -0500658 /* Only version 4 supports high-speed */
659 if (mmc->version < MMC_VERSION_4)
660 return 0;
661
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200662 if (!ext_csd) {
663 printf("No ext_csd found!\n"); /* this should enver happen */
664 return -ENOTSUPP;
665 }
666
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600667 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
668
Lei Wen0560db12011-10-03 20:35:10 +0000669 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500670
Andy Fleming272cc702008-10-30 16:41:01 -0500671 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900672 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200673 if (cardtype & EXT_CSD_CARD_TYPE_DDR_52)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900674 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200675 mmc->card_caps |= MMC_MODE_HS_52MHz;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900676 }
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +0200677 if (cardtype & EXT_CSD_CARD_TYPE_26)
678 mmc->card_caps |= MMC_MODE_HS;
Andy Fleming272cc702008-10-30 16:41:01 -0500679
680 return 0;
681}
682
Stephen Warrenf866a462013-06-11 15:14:01 -0600683static int mmc_set_capacity(struct mmc *mmc, int part_num)
684{
685 switch (part_num) {
686 case 0:
687 mmc->capacity = mmc->capacity_user;
688 break;
689 case 1:
690 case 2:
691 mmc->capacity = mmc->capacity_boot;
692 break;
693 case 3:
694 mmc->capacity = mmc->capacity_rpmb;
695 break;
696 case 4:
697 case 5:
698 case 6:
699 case 7:
700 mmc->capacity = mmc->capacity_gp[part_num - 4];
701 break;
702 default:
703 return -1;
704 }
705
Simon Glassc40fdca2016-05-01 13:52:35 -0600706 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrenf866a462013-06-11 15:14:01 -0600707
708 return 0;
709}
710
Simon Glass7dba0b92016-06-12 23:30:15 -0600711int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wenbc897b12011-05-02 16:26:26 +0000712{
Stephen Warrenf866a462013-06-11 15:14:01 -0600713 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000714
Stephen Warrenf866a462013-06-11 15:14:01 -0600715 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
716 (mmc->part_config & ~PART_ACCESS_MASK)
717 | (part_num & PART_ACCESS_MASK));
Stephen Warrenf866a462013-06-11 15:14:01 -0600718
Peter Bigot6dc93e72014-09-02 18:31:23 -0500719 /*
720 * Set the capacity if the switch succeeded or was intended
721 * to return to representing the raw device.
722 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700723 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500724 ret = mmc_set_capacity(mmc, part_num);
Simon Glassfdbb1392016-05-01 13:52:37 -0600725 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700726 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500727
728 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000729}
730
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100731int mmc_hwpart_config(struct mmc *mmc,
732 const struct mmc_hwpart_conf *conf,
733 enum mmc_hwpart_conf_mode mode)
734{
735 u8 part_attrs = 0;
736 u32 enh_size_mult;
737 u32 enh_start_addr;
738 u32 gp_size_mult[4];
739 u32 max_enh_size_mult;
740 u32 tot_enh_size_mult = 0;
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100741 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100742 int i, pidx, err;
743 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
744
745 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
746 return -EINVAL;
747
748 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
749 printf("eMMC >= 4.4 required for enhanced user data area\n");
750 return -EMEDIUMTYPE;
751 }
752
753 if (!(mmc->part_support & PART_SUPPORT)) {
754 printf("Card does not support partitioning\n");
755 return -EMEDIUMTYPE;
756 }
757
758 if (!mmc->hc_wp_grp_size) {
759 printf("Card does not define HC WP group size\n");
760 return -EMEDIUMTYPE;
761 }
762
763 /* check partition alignment and total enhanced size */
764 if (conf->user.enh_size) {
765 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
766 conf->user.enh_start % mmc->hc_wp_grp_size) {
767 printf("User data enhanced area not HC WP group "
768 "size aligned\n");
769 return -EINVAL;
770 }
771 part_attrs |= EXT_CSD_ENH_USR;
772 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
773 if (mmc->high_capacity) {
774 enh_start_addr = conf->user.enh_start;
775 } else {
776 enh_start_addr = (conf->user.enh_start << 9);
777 }
778 } else {
779 enh_size_mult = 0;
780 enh_start_addr = 0;
781 }
782 tot_enh_size_mult += enh_size_mult;
783
784 for (pidx = 0; pidx < 4; pidx++) {
785 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
786 printf("GP%i partition not HC WP group size "
787 "aligned\n", pidx+1);
788 return -EINVAL;
789 }
790 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
791 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
792 part_attrs |= EXT_CSD_ENH_GP(pidx);
793 tot_enh_size_mult += gp_size_mult[pidx];
794 }
795 }
796
797 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
798 printf("Card does not support enhanced attribute\n");
799 return -EMEDIUMTYPE;
800 }
801
802 err = mmc_send_ext_csd(mmc, ext_csd);
803 if (err)
804 return err;
805
806 max_enh_size_mult =
807 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
808 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
809 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
810 if (tot_enh_size_mult > max_enh_size_mult) {
811 printf("Total enhanced size exceeds maximum (%u > %u)\n",
812 tot_enh_size_mult, max_enh_size_mult);
813 return -EMEDIUMTYPE;
814 }
815
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100816 /* The default value of EXT_CSD_WR_REL_SET is device
817 * dependent, the values can only be changed if the
818 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
819 * changed only once and before partitioning is completed. */
820 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
821 if (conf->user.wr_rel_change) {
822 if (conf->user.wr_rel_set)
823 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
824 else
825 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
826 }
827 for (pidx = 0; pidx < 4; pidx++) {
828 if (conf->gp_part[pidx].wr_rel_change) {
829 if (conf->gp_part[pidx].wr_rel_set)
830 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
831 else
832 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
833 }
834 }
835
836 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
837 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
838 puts("Card does not support host controlled partition write "
839 "reliability settings\n");
840 return -EMEDIUMTYPE;
841 }
842
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100843 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
844 EXT_CSD_PARTITION_SETTING_COMPLETED) {
845 printf("Card already partitioned\n");
846 return -EPERM;
847 }
848
849 if (mode == MMC_HWPART_CONF_CHECK)
850 return 0;
851
852 /* Partitioning requires high-capacity size definitions */
853 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
854 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
855 EXT_CSD_ERASE_GROUP_DEF, 1);
856
857 if (err)
858 return err;
859
860 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
861
862 /* update erase group size to be high-capacity */
863 mmc->erase_grp_size =
864 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
865
866 }
867
868 /* all OK, write the configuration */
869 for (i = 0; i < 4; i++) {
870 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
871 EXT_CSD_ENH_START_ADDR+i,
872 (enh_start_addr >> (i*8)) & 0xFF);
873 if (err)
874 return err;
875 }
876 for (i = 0; i < 3; i++) {
877 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
878 EXT_CSD_ENH_SIZE_MULT+i,
879 (enh_size_mult >> (i*8)) & 0xFF);
880 if (err)
881 return err;
882 }
883 for (pidx = 0; pidx < 4; pidx++) {
884 for (i = 0; i < 3; i++) {
885 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
886 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
887 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
888 if (err)
889 return err;
890 }
891 }
892 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
893 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
894 if (err)
895 return err;
896
897 if (mode == MMC_HWPART_CONF_SET)
898 return 0;
899
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100900 /* The WR_REL_SET is a write-once register but shall be
901 * written before setting PART_SETTING_COMPLETED. As it is
902 * write-once we can only write it when completing the
903 * partitioning. */
904 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
905 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
906 EXT_CSD_WR_REL_SET, wr_rel_set);
907 if (err)
908 return err;
909 }
910
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100911 /* Setting PART_SETTING_COMPLETED confirms the partition
912 * configuration but it only becomes effective after power
913 * cycle, so we do not adjust the partition related settings
914 * in the mmc struct. */
915
916 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
917 EXT_CSD_PARTITION_SETTING,
918 EXT_CSD_PARTITION_SETTING_COMPLETED);
919 if (err)
920 return err;
921
922 return 0;
923}
924
Simon Glasse7881d82017-07-29 11:35:31 -0600925#if !CONFIG_IS_ENABLED(DM_MMC)
Thierry Reding48972d92012-01-02 01:15:37 +0000926int mmc_getcd(struct mmc *mmc)
927{
928 int cd;
929
930 cd = board_mmc_getcd(mmc);
931
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000932 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200933 if (mmc->cfg->ops->getcd)
934 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000935 else
936 cd = 1;
937 }
Thierry Reding48972d92012-01-02 01:15:37 +0000938
939 return cd;
940}
Simon Glass8ca51e52016-06-12 23:30:22 -0600941#endif
Thierry Reding48972d92012-01-02 01:15:37 +0000942
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000943static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500944{
945 struct mmc_cmd cmd;
946 struct mmc_data data;
947
948 /* Switch the frequency */
949 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
950 cmd.resp_type = MMC_RSP_R1;
951 cmd.cmdarg = (mode << 31) | 0xffffff;
952 cmd.cmdarg &= ~(0xf << (group * 4));
953 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500954
955 data.dest = (char *)resp;
956 data.blocksize = 64;
957 data.blocks = 1;
958 data.flags = MMC_DATA_READ;
959
960 return mmc_send_cmd(mmc, &cmd, &data);
961}
962
963
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200964static int sd_get_capabilities(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500965{
966 int err;
967 struct mmc_cmd cmd;
Suniel Mahesh18e7c8f2017-10-05 11:32:00 +0530968 ALLOC_CACHE_ALIGN_BUFFER(__be32, scr, 2);
969 ALLOC_CACHE_ALIGN_BUFFER(__be32, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500970 struct mmc_data data;
971 int timeout;
972
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +0200973 mmc->card_caps = MMC_MODE_1BIT;
Andy Fleming272cc702008-10-30 16:41:01 -0500974
Thomas Choud52ebf12010-12-24 13:12:21 +0000975 if (mmc_host_is_spi(mmc))
976 return 0;
977
Andy Fleming272cc702008-10-30 16:41:01 -0500978 /* Read the SCR to find out if this card supports higher speeds */
979 cmd.cmdidx = MMC_CMD_APP_CMD;
980 cmd.resp_type = MMC_RSP_R1;
981 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500982
983 err = mmc_send_cmd(mmc, &cmd, NULL);
984
985 if (err)
986 return err;
987
988 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
989 cmd.resp_type = MMC_RSP_R1;
990 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500991
992 timeout = 3;
993
994retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000995 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500996 data.blocksize = 8;
997 data.blocks = 1;
998 data.flags = MMC_DATA_READ;
999
1000 err = mmc_send_cmd(mmc, &cmd, &data);
1001
1002 if (err) {
1003 if (timeout--)
1004 goto retry_scr;
1005
1006 return err;
1007 }
1008
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +03001009 mmc->scr[0] = __be32_to_cpu(scr[0]);
1010 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -05001011
1012 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng53e8e402016-03-17 21:53:13 -07001013 case 0:
1014 mmc->version = SD_VERSION_1_0;
1015 break;
1016 case 1:
1017 mmc->version = SD_VERSION_1_10;
1018 break;
1019 case 2:
1020 mmc->version = SD_VERSION_2;
1021 if ((mmc->scr[0] >> 15) & 0x1)
1022 mmc->version = SD_VERSION_3;
1023 break;
1024 default:
1025 mmc->version = SD_VERSION_1_0;
1026 break;
Andy Fleming272cc702008-10-30 16:41:01 -05001027 }
1028
Alagu Sankarb44c7082010-05-12 15:08:24 +05301029 if (mmc->scr[0] & SD_DATA_4BIT)
1030 mmc->card_caps |= MMC_MODE_4BIT;
1031
Andy Fleming272cc702008-10-30 16:41:01 -05001032 /* Version 1.0 doesn't support switching */
1033 if (mmc->version == SD_VERSION_1_0)
1034 return 0;
1035
1036 timeout = 4;
1037 while (timeout--) {
1038 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +00001039 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -05001040
1041 if (err)
1042 return err;
1043
1044 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +03001045 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -05001046 break;
1047 }
1048
Andy Fleming272cc702008-10-30 16:41:01 -05001049 /* If high-speed isn't supported, we return */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001050 if (__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED)
1051 mmc->card_caps |= MMC_CAP(SD_HS);
Andy Fleming272cc702008-10-30 16:41:01 -05001052
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001053 return 0;
1054}
1055
1056static int sd_set_card_speed(struct mmc *mmc, enum bus_mode mode)
1057{
1058 int err;
1059
1060 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Macpaul Lin2c3fbf42011-11-28 16:31:09 +00001061
Anton staaff781dd32011-10-03 13:54:59 +00001062 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -05001063 if (err)
1064 return err;
1065
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001066 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) != 0x01000000)
1067 return -ENOTSUPP;
1068
1069 return 0;
1070}
1071
1072int sd_select_bus_width(struct mmc *mmc, int w)
1073{
1074 int err;
1075 struct mmc_cmd cmd;
1076
1077 if ((w != 4) && (w != 1))
1078 return -EINVAL;
1079
1080 cmd.cmdidx = MMC_CMD_APP_CMD;
1081 cmd.resp_type = MMC_RSP_R1;
1082 cmd.cmdarg = mmc->rca << 16;
1083
1084 err = mmc_send_cmd(mmc, &cmd, NULL);
1085 if (err)
1086 return err;
1087
1088 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1089 cmd.resp_type = MMC_RSP_R1;
1090 if (w == 4)
1091 cmd.cmdarg = 2;
1092 else if (w == 1)
1093 cmd.cmdarg = 0;
1094 err = mmc_send_cmd(mmc, &cmd, NULL);
1095 if (err)
1096 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001097
1098 return 0;
1099}
1100
Peng Fan3697e592016-09-01 11:13:38 +08001101static int sd_read_ssr(struct mmc *mmc)
1102{
1103 int err, i;
1104 struct mmc_cmd cmd;
1105 ALLOC_CACHE_ALIGN_BUFFER(uint, ssr, 16);
1106 struct mmc_data data;
1107 int timeout = 3;
1108 unsigned int au, eo, et, es;
1109
1110 cmd.cmdidx = MMC_CMD_APP_CMD;
1111 cmd.resp_type = MMC_RSP_R1;
1112 cmd.cmdarg = mmc->rca << 16;
1113
1114 err = mmc_send_cmd(mmc, &cmd, NULL);
1115 if (err)
1116 return err;
1117
1118 cmd.cmdidx = SD_CMD_APP_SD_STATUS;
1119 cmd.resp_type = MMC_RSP_R1;
1120 cmd.cmdarg = 0;
1121
1122retry_ssr:
1123 data.dest = (char *)ssr;
1124 data.blocksize = 64;
1125 data.blocks = 1;
1126 data.flags = MMC_DATA_READ;
1127
1128 err = mmc_send_cmd(mmc, &cmd, &data);
1129 if (err) {
1130 if (timeout--)
1131 goto retry_ssr;
1132
1133 return err;
1134 }
1135
1136 for (i = 0; i < 16; i++)
1137 ssr[i] = be32_to_cpu(ssr[i]);
1138
1139 au = (ssr[2] >> 12) & 0xF;
1140 if ((au <= 9) || (mmc->version == SD_VERSION_3)) {
1141 mmc->ssr.au = sd_au_size[au];
1142 es = (ssr[3] >> 24) & 0xFF;
1143 es |= (ssr[2] & 0xFF) << 8;
1144 et = (ssr[3] >> 18) & 0x3F;
1145 if (es && et) {
1146 eo = (ssr[3] >> 16) & 0x3;
1147 mmc->ssr.erase_timeout = (et * 1000) / es;
1148 mmc->ssr.erase_offset = eo * 1000;
1149 }
1150 } else {
1151 debug("Invalid Allocation Unit Size.\n");
1152 }
1153
1154 return 0;
1155}
1156
Andy Fleming272cc702008-10-30 16:41:01 -05001157/* frequency bases */
1158/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +00001159static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -05001160 10000,
1161 100000,
1162 1000000,
1163 10000000,
1164};
1165
1166/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
1167 * to platforms without floating point.
1168 */
Simon Glass61fe0762016-05-14 14:02:57 -06001169static const u8 multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -05001170 0, /* reserved */
1171 10,
1172 12,
1173 13,
1174 15,
1175 20,
1176 25,
1177 30,
1178 35,
1179 40,
1180 45,
1181 50,
1182 55,
1183 60,
1184 70,
1185 80,
1186};
1187
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001188static inline int bus_width(uint cap)
1189{
1190 if (cap == MMC_MODE_8BIT)
1191 return 8;
1192 if (cap == MMC_MODE_4BIT)
1193 return 4;
1194 if (cap == MMC_MODE_1BIT)
1195 return 1;
1196 printf("invalid bus witdh capability 0x%x\n", cap);
1197 return 0;
1198}
1199
Simon Glasse7881d82017-07-29 11:35:31 -06001200#if !CONFIG_IS_ENABLED(DM_MMC)
Jean-Jacques Hiblot318a7a52017-09-21 16:30:01 +02001201static void mmc_send_init_stream(struct mmc *mmc)
1202{
1203}
1204
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001205static int mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001206{
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001207 int ret = 0;
1208
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001209 if (mmc->cfg->ops->set_ios)
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001210 ret = mmc->cfg->ops->set_ios(mmc);
1211
1212 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05001213}
Simon Glass8ca51e52016-06-12 23:30:22 -06001214#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001215
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001216int mmc_set_clock(struct mmc *mmc, uint clock)
Andy Fleming272cc702008-10-30 16:41:01 -05001217{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001218 if (clock > mmc->cfg->f_max)
1219 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001220
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001221 if (clock < mmc->cfg->f_min)
1222 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001223
1224 mmc->clock = clock;
1225
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001226 return mmc_set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001227}
1228
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001229static int mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001230{
1231 mmc->bus_width = width;
1232
Kishon Vijay Abraham I2a4d2122017-09-21 16:29:59 +02001233 return mmc_set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001234}
1235
Jean-Jacques Hiblot4c9d2aa2017-09-21 16:29:54 +02001236#if CONFIG_IS_ENABLED(MMC_VERBOSE) || defined(DEBUG)
1237/*
1238 * helper function to display the capabilities in a human
1239 * friendly manner. The capabilities include bus width and
1240 * supported modes.
1241 */
1242void mmc_dump_capabilities(const char *text, uint caps)
1243{
1244 enum bus_mode mode;
1245
1246 printf("%s: widths [", text);
1247 if (caps & MMC_MODE_8BIT)
1248 printf("8, ");
1249 if (caps & MMC_MODE_4BIT)
1250 printf("4, ");
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001251 if (caps & MMC_MODE_1BIT)
1252 printf("1, ");
1253 printf("\b\b] modes [");
Jean-Jacques Hiblot4c9d2aa2017-09-21 16:29:54 +02001254 for (mode = MMC_LEGACY; mode < MMC_MODES_END; mode++)
1255 if (MMC_CAP(mode) & caps)
1256 printf("%s, ", mmc_mode_name(mode));
1257 printf("\b\b]\n");
1258}
1259#endif
1260
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001261struct mode_width_tuning {
1262 enum bus_mode mode;
1263 uint widths;
1264};
1265
Kishon Vijay Abraham Iaff5d3c2017-09-21 16:30:00 +02001266static int mmc_set_signal_voltage(struct mmc *mmc, uint signal_voltage)
1267{
1268 mmc->signal_voltage = signal_voltage;
1269 return mmc_set_ios(mmc);
1270}
1271
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001272static const struct mode_width_tuning sd_modes_by_pref[] = {
1273 {
1274 .mode = SD_HS,
1275 .widths = MMC_MODE_4BIT | MMC_MODE_1BIT,
1276 },
1277 {
1278 .mode = SD_LEGACY,
1279 .widths = MMC_MODE_4BIT | MMC_MODE_1BIT,
1280 }
1281};
1282
1283#define for_each_sd_mode_by_pref(caps, mwt) \
1284 for (mwt = sd_modes_by_pref;\
1285 mwt < sd_modes_by_pref + ARRAY_SIZE(sd_modes_by_pref);\
1286 mwt++) \
1287 if (caps & MMC_CAP(mwt->mode))
1288
1289static int sd_select_mode_and_width(struct mmc *mmc)
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001290{
1291 int err;
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001292 uint widths[] = {MMC_MODE_4BIT, MMC_MODE_1BIT};
1293 const struct mode_width_tuning *mwt;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001294
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001295 err = sd_get_capabilities(mmc);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001296 if (err)
1297 return err;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001298 /* Restrict card's capabilities by what the host can do */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001299 mmc->card_caps &= (mmc->cfg->host_caps | MMC_MODE_1BIT);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001300
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001301 for_each_sd_mode_by_pref(mmc->card_caps, mwt) {
1302 uint *w;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001303
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001304 for (w = widths; w < widths + ARRAY_SIZE(widths); w++) {
1305 if (*w & mmc->card_caps & mwt->widths) {
1306 debug("trying mode %s width %d (at %d MHz)\n",
1307 mmc_mode_name(mwt->mode),
1308 bus_width(*w),
1309 mmc_mode2freq(mmc, mwt->mode) / 1000000);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001310
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001311 /* configure the bus width (card + host) */
1312 err = sd_select_bus_width(mmc, bus_width(*w));
1313 if (err)
1314 goto error;
1315 mmc_set_bus_width(mmc, bus_width(*w));
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001316
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001317 /* configure the bus mode (card) */
1318 err = sd_set_card_speed(mmc, mwt->mode);
1319 if (err)
1320 goto error;
1321
1322 /* configure the bus mode (host) */
1323 mmc_select_mode(mmc, mwt->mode);
1324 mmc_set_clock(mmc, mmc->tran_speed);
1325
1326 err = sd_read_ssr(mmc);
1327 if (!err)
1328 return 0;
1329
1330 printf("bad ssr\n");
1331
1332error:
1333 /* revert to a safer bus speed */
1334 mmc_select_mode(mmc, SD_LEGACY);
1335 mmc_set_clock(mmc, mmc->tran_speed);
1336 }
1337 }
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001338 }
1339
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001340 printf("unable to select a mode\n");
1341 return -ENOTSUPP;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001342}
1343
Jean-Jacques Hiblot7382e692017-09-21 16:29:52 +02001344/*
1345 * read the compare the part of ext csd that is constant.
1346 * This can be used to check that the transfer is working
1347 * as expected.
1348 */
1349static int mmc_read_and_compare_ext_csd(struct mmc *mmc)
1350{
1351 int err;
1352 const u8 *ext_csd = mmc->ext_csd;
1353 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
1354
1355 err = mmc_send_ext_csd(mmc, test_csd);
1356 if (err)
1357 return err;
1358
1359 /* Only compare read only fields */
1360 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1361 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1362 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1363 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1364 ext_csd[EXT_CSD_REV]
1365 == test_csd[EXT_CSD_REV] &&
1366 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1367 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1368 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1369 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
1370 return 0;
1371
1372 return -EBADMSG;
1373}
1374
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001375static const struct mode_width_tuning mmc_modes_by_pref[] = {
1376 {
1377 .mode = MMC_HS_200,
1378 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT,
1379 },
1380 {
1381 .mode = MMC_DDR_52,
1382 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT,
1383 },
1384 {
1385 .mode = MMC_HS_52,
1386 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1387 },
1388 {
1389 .mode = MMC_HS,
1390 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1391 },
1392 {
1393 .mode = MMC_LEGACY,
1394 .widths = MMC_MODE_8BIT | MMC_MODE_4BIT | MMC_MODE_1BIT,
1395 }
1396};
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001397
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001398#define for_each_mmc_mode_by_pref(caps, mwt) \
1399 for (mwt = mmc_modes_by_pref;\
1400 mwt < mmc_modes_by_pref + ARRAY_SIZE(mmc_modes_by_pref);\
1401 mwt++) \
1402 if (caps & MMC_CAP(mwt->mode))
1403
1404static const struct ext_csd_bus_width {
1405 uint cap;
1406 bool is_ddr;
1407 uint ext_csd_bits;
1408} ext_csd_bus_width[] = {
1409 {MMC_MODE_8BIT, true, EXT_CSD_DDR_BUS_WIDTH_8},
1410 {MMC_MODE_4BIT, true, EXT_CSD_DDR_BUS_WIDTH_4},
1411 {MMC_MODE_8BIT, false, EXT_CSD_BUS_WIDTH_8},
1412 {MMC_MODE_4BIT, false, EXT_CSD_BUS_WIDTH_4},
1413 {MMC_MODE_1BIT, false, EXT_CSD_BUS_WIDTH_1},
1414};
1415
1416#define for_each_supported_width(caps, ddr, ecbv) \
1417 for (ecbv = ext_csd_bus_width;\
1418 ecbv < ext_csd_bus_width + ARRAY_SIZE(ext_csd_bus_width);\
1419 ecbv++) \
1420 if ((ddr == ecbv->is_ddr) && (caps & ecbv->cap))
1421
1422static int mmc_select_mode_and_width(struct mmc *mmc)
1423{
1424 int err;
1425 const struct mode_width_tuning *mwt;
1426 const struct ext_csd_bus_width *ecbw;
1427
1428 err = mmc_get_capabilities(mmc);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001429 if (err)
1430 return err;
1431
1432 /* Restrict card's capabilities by what the host can do */
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001433 mmc->card_caps &= (mmc->cfg->host_caps | MMC_MODE_1BIT);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001434
1435 /* Only version 4 of MMC supports wider bus widths */
1436 if (mmc->version < MMC_VERSION_4)
1437 return 0;
1438
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001439 if (!mmc->ext_csd) {
1440 debug("No ext_csd found!\n"); /* this should enver happen */
1441 return -ENOTSUPP;
1442 }
1443
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001444 for_each_mmc_mode_by_pref(mmc->card_caps, mwt) {
1445 for_each_supported_width(mmc->card_caps & mwt->widths,
1446 mmc_is_mode_ddr(mwt->mode), ecbw) {
1447 debug("trying mode %s width %d (at %d MHz)\n",
1448 mmc_mode_name(mwt->mode),
1449 bus_width(ecbw->cap),
1450 mmc_mode2freq(mmc, mwt->mode) / 1000000);
1451 /* configure the bus width (card + host) */
1452 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1453 EXT_CSD_BUS_WIDTH,
1454 ecbw->ext_csd_bits & ~EXT_CSD_DDR_FLAG);
1455 if (err)
1456 goto error;
1457 mmc_set_bus_width(mmc, bus_width(ecbw->cap));
1458
1459 /* configure the bus speed (card) */
1460 err = mmc_set_card_speed(mmc, mwt->mode);
1461 if (err)
1462 goto error;
1463
1464 /*
1465 * configure the bus width AND the ddr mode (card)
1466 * The host side will be taken care of in the next step
1467 */
1468 if (ecbw->ext_csd_bits & EXT_CSD_DDR_FLAG) {
1469 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1470 EXT_CSD_BUS_WIDTH,
1471 ecbw->ext_csd_bits);
1472 if (err)
1473 goto error;
1474 }
1475
1476 /* configure the bus mode (host) */
1477 mmc_select_mode(mmc, mwt->mode);
1478 mmc_set_clock(mmc, mmc->tran_speed);
1479
1480 /* do a transfer to check the configuration */
1481 err = mmc_read_and_compare_ext_csd(mmc);
1482 if (!err)
1483 return 0;
1484error:
1485 /* if an error occured, revert to a safer bus mode */
1486 mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1487 EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_1);
1488 mmc_select_mode(mmc, MMC_LEGACY);
1489 mmc_set_bus_width(mmc, 1);
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001490 }
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001491 }
1492
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001493 printf("unable to select a mode\n");
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001494
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001495 return -ENOTSUPP;
Jean-Jacques Hiblot8ac8a262017-09-21 16:29:49 +02001496}
1497
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001498static int mmc_startup_v4(struct mmc *mmc)
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001499{
1500 int err, i;
1501 u64 capacity;
1502 bool has_parts = false;
1503 bool part_completed;
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001504 u8 *ext_csd;
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001505
1506 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4))
1507 return 0;
1508
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001509 ext_csd = malloc_cache_aligned(MMC_MAX_BLOCK_LEN);
1510 if (!ext_csd)
1511 return -ENOMEM;
1512
1513 mmc->ext_csd = ext_csd;
1514
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001515 /* check ext_csd version and capacity */
1516 err = mmc_send_ext_csd(mmc, ext_csd);
1517 if (err)
1518 return err;
1519 if (ext_csd[EXT_CSD_REV] >= 2) {
1520 /*
1521 * According to the JEDEC Standard, the value of
1522 * ext_csd's capacity is valid if the value is more
1523 * than 2GB
1524 */
1525 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1526 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1527 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1528 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
1529 capacity *= MMC_MAX_BLOCK_LEN;
1530 if ((capacity >> 20) > 2 * 1024)
1531 mmc->capacity_user = capacity;
1532 }
1533
1534 switch (ext_csd[EXT_CSD_REV]) {
1535 case 1:
1536 mmc->version = MMC_VERSION_4_1;
1537 break;
1538 case 2:
1539 mmc->version = MMC_VERSION_4_2;
1540 break;
1541 case 3:
1542 mmc->version = MMC_VERSION_4_3;
1543 break;
1544 case 5:
1545 mmc->version = MMC_VERSION_4_41;
1546 break;
1547 case 6:
1548 mmc->version = MMC_VERSION_4_5;
1549 break;
1550 case 7:
1551 mmc->version = MMC_VERSION_5_0;
1552 break;
1553 case 8:
1554 mmc->version = MMC_VERSION_5_1;
1555 break;
1556 }
1557
1558 /* The partition data may be non-zero but it is only
1559 * effective if PARTITION_SETTING_COMPLETED is set in
1560 * EXT_CSD, so ignore any data if this bit is not set,
1561 * except for enabling the high-capacity group size
1562 * definition (see below).
1563 */
1564 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1565 EXT_CSD_PARTITION_SETTING_COMPLETED);
1566
1567 /* store the partition info of emmc */
1568 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1569 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1570 ext_csd[EXT_CSD_BOOT_MULT])
1571 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
1572 if (part_completed &&
1573 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
1574 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1575
1576 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1577
1578 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1579
1580 for (i = 0; i < 4; i++) {
1581 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1582 uint mult = (ext_csd[idx + 2] << 16) +
1583 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1584 if (mult)
1585 has_parts = true;
1586 if (!part_completed)
1587 continue;
1588 mmc->capacity_gp[i] = mult;
1589 mmc->capacity_gp[i] *=
1590 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1591 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1592 mmc->capacity_gp[i] <<= 19;
1593 }
1594
1595 if (part_completed) {
1596 mmc->enh_user_size =
1597 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) +
1598 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8) +
1599 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1600 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1601 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1602 mmc->enh_user_size <<= 19;
1603 mmc->enh_user_start =
1604 (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24) +
1605 (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) +
1606 (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) +
1607 ext_csd[EXT_CSD_ENH_START_ADDR];
1608 if (mmc->high_capacity)
1609 mmc->enh_user_start <<= 9;
1610 }
1611
1612 /*
1613 * Host needs to enable ERASE_GRP_DEF bit if device is
1614 * partitioned. This bit will be lost every time after a reset
1615 * or power off. This will affect erase size.
1616 */
1617 if (part_completed)
1618 has_parts = true;
1619 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
1620 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1621 has_parts = true;
1622 if (has_parts) {
1623 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1624 EXT_CSD_ERASE_GROUP_DEF, 1);
1625
1626 if (err)
1627 return err;
1628
1629 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
1630 }
1631
1632 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
1633 /* Read out group size from ext_csd */
1634 mmc->erase_grp_size =
1635 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
1636 /*
1637 * if high capacity and partition setting completed
1638 * SEC_COUNT is valid even if it is smaller than 2 GiB
1639 * JEDEC Standard JESD84-B45, 6.2.4
1640 */
1641 if (mmc->high_capacity && part_completed) {
1642 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1643 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1644 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1645 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1646 capacity *= MMC_MAX_BLOCK_LEN;
1647 mmc->capacity_user = capacity;
1648 }
1649 } else {
1650 /* Calculate the group size from the csd value. */
1651 int erase_gsz, erase_gmul;
1652
1653 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1654 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1655 mmc->erase_grp_size = (erase_gsz + 1)
1656 * (erase_gmul + 1);
1657 }
1658
1659 mmc->hc_wp_grp_size = 1024
1660 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1661 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1662
1663 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
1664
1665 return 0;
1666}
1667
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001668static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001669{
Stephen Warrenf866a462013-06-11 15:14:01 -06001670 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001671 uint mult, freq;
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001672 u64 cmult, csize;
Andy Fleming272cc702008-10-30 16:41:01 -05001673 struct mmc_cmd cmd;
Simon Glassc40fdca2016-05-01 13:52:35 -06001674 struct blk_desc *bdesc;
Andy Fleming272cc702008-10-30 16:41:01 -05001675
Thomas Choud52ebf12010-12-24 13:12:21 +00001676#ifdef CONFIG_MMC_SPI_CRC_ON
1677 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1678 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1679 cmd.resp_type = MMC_RSP_R1;
1680 cmd.cmdarg = 1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001681 err = mmc_send_cmd(mmc, &cmd, NULL);
1682
1683 if (err)
1684 return err;
1685 }
1686#endif
1687
Andy Fleming272cc702008-10-30 16:41:01 -05001688 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001689 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1690 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Fleming272cc702008-10-30 16:41:01 -05001691 cmd.resp_type = MMC_RSP_R2;
1692 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001693
1694 err = mmc_send_cmd(mmc, &cmd, NULL);
1695
1696 if (err)
1697 return err;
1698
1699 memcpy(mmc->cid, cmd.response, 16);
1700
1701 /*
1702 * For MMC cards, set the Relative Address.
1703 * For SD cards, get the Relatvie Address.
1704 * This also puts the cards into Standby State
1705 */
Thomas Choud52ebf12010-12-24 13:12:21 +00001706 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1707 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1708 cmd.cmdarg = mmc->rca << 16;
1709 cmd.resp_type = MMC_RSP_R6;
Andy Fleming272cc702008-10-30 16:41:01 -05001710
Thomas Choud52ebf12010-12-24 13:12:21 +00001711 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001712
Thomas Choud52ebf12010-12-24 13:12:21 +00001713 if (err)
1714 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001715
Thomas Choud52ebf12010-12-24 13:12:21 +00001716 if (IS_SD(mmc))
1717 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1718 }
Andy Fleming272cc702008-10-30 16:41:01 -05001719
1720 /* Get the Card-Specific Data */
1721 cmd.cmdidx = MMC_CMD_SEND_CSD;
1722 cmd.resp_type = MMC_RSP_R2;
1723 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001724
1725 err = mmc_send_cmd(mmc, &cmd, NULL);
1726
1727 if (err)
1728 return err;
1729
Rabin Vincent998be3d2009-04-05 13:30:56 +05301730 mmc->csd[0] = cmd.response[0];
1731 mmc->csd[1] = cmd.response[1];
1732 mmc->csd[2] = cmd.response[2];
1733 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -05001734
1735 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301736 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -05001737
1738 switch (version) {
Bin Meng53e8e402016-03-17 21:53:13 -07001739 case 0:
1740 mmc->version = MMC_VERSION_1_2;
1741 break;
1742 case 1:
1743 mmc->version = MMC_VERSION_1_4;
1744 break;
1745 case 2:
1746 mmc->version = MMC_VERSION_2_2;
1747 break;
1748 case 3:
1749 mmc->version = MMC_VERSION_3;
1750 break;
1751 case 4:
1752 mmc->version = MMC_VERSION_4;
1753 break;
1754 default:
1755 mmc->version = MMC_VERSION_1_2;
1756 break;
Andy Fleming272cc702008-10-30 16:41:01 -05001757 }
1758 }
1759
1760 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301761 freq = fbase[(cmd.response[0] & 0x7)];
1762 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001763
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +02001764 mmc->legacy_speed = freq * mult;
Jean-Jacques Hiblot35f9e192017-09-21 16:29:53 +02001765 mmc_select_mode(mmc, MMC_LEGACY);
Andy Fleming272cc702008-10-30 16:41:01 -05001766
Markus Niebelab711882013-12-16 13:40:46 +01001767 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincent998be3d2009-04-05 13:30:56 +05301768 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001769
1770 if (IS_SD(mmc))
1771 mmc->write_bl_len = mmc->read_bl_len;
1772 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301773 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001774
1775 if (mmc->high_capacity) {
1776 csize = (mmc->csd[1] & 0x3f) << 16
1777 | (mmc->csd[2] & 0xffff0000) >> 16;
1778 cmult = 8;
1779 } else {
1780 csize = (mmc->csd[1] & 0x3ff) << 2
1781 | (mmc->csd[2] & 0xc0000000) >> 30;
1782 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1783 }
1784
Stephen Warrenf866a462013-06-11 15:14:01 -06001785 mmc->capacity_user = (csize + 1) << (cmult + 2);
1786 mmc->capacity_user *= mmc->read_bl_len;
1787 mmc->capacity_boot = 0;
1788 mmc->capacity_rpmb = 0;
1789 for (i = 0; i < 4; i++)
1790 mmc->capacity_gp[i] = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001791
Simon Glass8bfa1952013-04-03 08:54:30 +00001792 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1793 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001794
Simon Glass8bfa1952013-04-03 08:54:30 +00001795 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1796 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001797
Markus Niebelab711882013-12-16 13:40:46 +01001798 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1799 cmd.cmdidx = MMC_CMD_SET_DSR;
1800 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1801 cmd.resp_type = MMC_RSP_NONE;
1802 if (mmc_send_cmd(mmc, &cmd, NULL))
1803 printf("MMC: SET_DSR failed\n");
1804 }
1805
Andy Fleming272cc702008-10-30 16:41:01 -05001806 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001807 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1808 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargavfe8f7062011-10-05 03:13:23 +00001809 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001810 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001811 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001812
Thomas Choud52ebf12010-12-24 13:12:21 +00001813 if (err)
1814 return err;
1815 }
Andy Fleming272cc702008-10-30 16:41:01 -05001816
Lei Wene6f99a52011-06-22 17:03:31 +00001817 /*
1818 * For SD, its erase group is always one sector
1819 */
1820 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001821 mmc->part_config = MMCPART_NOAVAILABLE;
Lei Wenbc897b12011-05-02 16:26:26 +00001822
Jean-Jacques Hiblotdfda9d82017-09-21 16:29:51 +02001823 err = mmc_startup_v4(mmc);
Jean-Jacques Hiblotc744b6f2017-09-21 16:29:50 +02001824 if (err)
1825 return err;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301826
Simon Glassc40fdca2016-05-01 13:52:35 -06001827 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001828 if (err)
1829 return err;
1830
Andy Fleming272cc702008-10-30 16:41:01 -05001831 if (IS_SD(mmc))
Jean-Jacques Hiblotd0c221f2017-09-21 16:29:57 +02001832 err = sd_select_mode_and_width(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001833 else
Jean-Jacques Hiblot3862b852017-09-21 16:29:58 +02001834 err = mmc_select_mode_and_width(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001835
1836 if (err)
1837 return err;
1838
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001839
Andrew Gabbasov5af8f452014-12-01 06:59:11 -06001840 /* Fix the block length for DDR mode */
1841 if (mmc->ddr_mode) {
1842 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1843 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1844 }
1845
Andy Fleming272cc702008-10-30 16:41:01 -05001846 /* fill in device description */
Simon Glassc40fdca2016-05-01 13:52:35 -06001847 bdesc = mmc_get_blk_desc(mmc);
1848 bdesc->lun = 0;
1849 bdesc->hwpart = 0;
1850 bdesc->type = 0;
1851 bdesc->blksz = mmc->read_bl_len;
1852 bdesc->log2blksz = LOG2(bdesc->blksz);
1853 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001854#if !defined(CONFIG_SPL_BUILD) || \
1855 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1856 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glassc40fdca2016-05-01 13:52:35 -06001857 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Huttbabce5f2012-10-20 17:15:59 +00001858 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1859 (mmc->cid[3] >> 16) & 0xffff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001860 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001861 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1862 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1863 (mmc->cid[2] >> 24) & 0xff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001864 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001865 (mmc->cid[2] >> 16) & 0xf);
Paul Burton56196822013-09-04 16:12:25 +01001866#else
Simon Glassc40fdca2016-05-01 13:52:35 -06001867 bdesc->vendor[0] = 0;
1868 bdesc->product[0] = 0;
1869 bdesc->revision[0] = 0;
Paul Burton56196822013-09-04 16:12:25 +01001870#endif
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001871#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassc40fdca2016-05-01 13:52:35 -06001872 part_init(bdesc);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001873#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001874
1875 return 0;
1876}
1877
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001878static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001879{
1880 struct mmc_cmd cmd;
1881 int err;
1882
1883 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1884 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001885 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001886 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001887
1888 err = mmc_send_cmd(mmc, &cmd, NULL);
1889
1890 if (err)
1891 return err;
1892
Rabin Vincent998be3d2009-04-05 13:30:56 +05301893 if ((cmd.response[0] & 0xff) != 0xaa)
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001894 return -EOPNOTSUPP;
Andy Fleming272cc702008-10-30 16:41:01 -05001895 else
1896 mmc->version = SD_VERSION_2;
1897
1898 return 0;
1899}
1900
Simon Glassc4d660d2017-07-04 13:31:19 -06001901#if !CONFIG_IS_ENABLED(DM_MMC)
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001902/* board-specific MMC power initializations. */
1903__weak void board_mmc_power_init(void)
1904{
1905}
Simon Glass05cbeb72017-04-22 19:10:56 -06001906#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001907
Peng Fan2051aef2016-10-11 15:08:43 +08001908static int mmc_power_init(struct mmc *mmc)
1909{
Simon Glassc4d660d2017-07-04 13:31:19 -06001910#if CONFIG_IS_ENABLED(DM_MMC)
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001911#if CONFIG_IS_ENABLED(DM_REGULATOR)
Peng Fan2051aef2016-10-11 15:08:43 +08001912 int ret;
1913
1914 ret = device_get_supply_regulator(mmc->dev, "vmmc-supply",
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001915 &mmc->vmmc_supply);
1916 if (ret)
Jaehoon Chung288db7c2016-10-24 15:22:22 +09001917 debug("%s: No vmmc supply\n", mmc->dev->name);
Peng Fan2051aef2016-10-11 15:08:43 +08001918
Jean-Jacques Hiblot06ec0452017-09-21 16:29:48 +02001919 ret = device_get_supply_regulator(mmc->dev, "vqmmc-supply",
1920 &mmc->vqmmc_supply);
1921 if (ret)
1922 debug("%s: No vqmmc supply\n", mmc->dev->name);
1923
1924 if (mmc->vmmc_supply) {
1925 ret = regulator_set_enable(mmc->vmmc_supply, true);
1926 if (ret) {
1927 puts("Error enabling VMMC supply\n");
1928 return ret;
1929 }
Peng Fan2051aef2016-10-11 15:08:43 +08001930 }
1931#endif
Simon Glass05cbeb72017-04-22 19:10:56 -06001932#else /* !CONFIG_DM_MMC */
1933 /*
1934 * Driver model should use a regulator, as above, rather than calling
1935 * out to board code.
1936 */
1937 board_mmc_power_init();
1938#endif
Peng Fan2051aef2016-10-11 15:08:43 +08001939 return 0;
1940}
1941
Che-Liang Chioue9550442012-11-28 15:21:13 +00001942int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001943{
Simon Glass8ca51e52016-06-12 23:30:22 -06001944 bool no_card;
Macpaul Linafd59322011-11-14 23:35:39 +00001945 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001946
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001947 /* we pretend there's no card when init is NULL */
Simon Glass8ca51e52016-06-12 23:30:22 -06001948 no_card = mmc_getcd(mmc) == 0;
Simon Glasse7881d82017-07-29 11:35:31 -06001949#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glass8ca51e52016-06-12 23:30:22 -06001950 no_card = no_card || (mmc->cfg->ops->init == NULL);
1951#endif
1952 if (no_card) {
Thierry Reding48972d92012-01-02 01:15:37 +00001953 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001954#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001955 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001956#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +09001957 return -ENOMEDIUM;
Thierry Reding48972d92012-01-02 01:15:37 +00001958 }
1959
Lei Wenbc897b12011-05-02 16:26:26 +00001960 if (mmc->has_init)
1961 return 0;
1962
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001963#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1964 mmc_adapter_card_type_ident();
1965#endif
Peng Fan2051aef2016-10-11 15:08:43 +08001966 err = mmc_power_init(mmc);
1967 if (err)
1968 return err;
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001969
Simon Glasse7881d82017-07-29 11:35:31 -06001970#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass8ca51e52016-06-12 23:30:22 -06001971 /* The device has already been probed ready for use */
1972#else
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001973 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001974 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001975 if (err)
1976 return err;
Simon Glass8ca51e52016-06-12 23:30:22 -06001977#endif
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001978 mmc->ddr_mode = 0;
Kishon Vijay Abraham Iaff5d3c2017-09-21 16:30:00 +02001979
1980 /* First try to set 3.3V. If it fails set to 1.8V */
1981 err = mmc_set_signal_voltage(mmc, MMC_SIGNAL_VOLTAGE_330);
1982 if (err != 0)
1983 err = mmc_set_signal_voltage(mmc, MMC_SIGNAL_VOLTAGE_180);
1984 if (err != 0)
1985 printf("failed to set signal voltage\n");
1986
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001987 mmc_set_bus_width(mmc, 1);
1988 mmc_set_clock(mmc, 1);
1989
Jean-Jacques Hiblot318a7a52017-09-21 16:30:01 +02001990 mmc_send_init_stream(mmc);
1991
Andy Fleming272cc702008-10-30 16:41:01 -05001992 /* Reset the Card */
1993 err = mmc_go_idle(mmc);
1994
1995 if (err)
1996 return err;
1997
Lei Wenbc897b12011-05-02 16:26:26 +00001998 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glassc40fdca2016-05-01 13:52:35 -06001999 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00002000
Andy Fleming272cc702008-10-30 16:41:01 -05002001 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00002002 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05002003
Andy Fleming272cc702008-10-30 16:41:01 -05002004 /* Now try to get the SD card's operating condition */
2005 err = sd_send_op_cond(mmc);
2006
2007 /* If the command timed out, we check for an MMC card */
Jaehoon Chung915ffa52016-07-19 16:33:36 +09002008 if (err == -ETIMEDOUT) {
Andy Fleming272cc702008-10-30 16:41:01 -05002009 err = mmc_send_op_cond(mmc);
2010
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002011 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01002012#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05002013 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01002014#endif
Jaehoon Chung915ffa52016-07-19 16:33:36 +09002015 return -EOPNOTSUPP;
Andy Fleming272cc702008-10-30 16:41:01 -05002016 }
2017 }
2018
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002019 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00002020 mmc->init_in_progress = 1;
2021
2022 return err;
2023}
2024
2025static int mmc_complete_init(struct mmc *mmc)
2026{
2027 int err = 0;
2028
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002029 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +00002030 if (mmc->op_cond_pending)
2031 err = mmc_complete_op_cond(mmc);
2032
2033 if (!err)
2034 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00002035 if (err)
2036 mmc->has_init = 0;
2037 else
2038 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00002039 return err;
2040}
2041
2042int mmc_init(struct mmc *mmc)
2043{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002044 int err = 0;
Marek Vasutce9eca92016-12-01 02:06:32 +01002045 __maybe_unused unsigned start;
Simon Glassc4d660d2017-07-04 13:31:19 -06002046#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass33fb2112016-05-01 13:52:41 -06002047 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chioue9550442012-11-28 15:21:13 +00002048
Simon Glass33fb2112016-05-01 13:52:41 -06002049 upriv->mmc = mmc;
2050#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00002051 if (mmc->has_init)
2052 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02002053
2054 start = get_timer(0);
2055
Che-Liang Chioue9550442012-11-28 15:21:13 +00002056 if (!mmc->init_in_progress)
2057 err = mmc_start_init(mmc);
2058
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05002059 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00002060 err = mmc_complete_init(mmc);
Jagan Teki919b4852017-01-10 11:18:43 +01002061 if (err)
2062 printf("%s: %d, time %lu\n", __func__, err, get_timer(start));
2063
Lei Wenbc897b12011-05-02 16:26:26 +00002064 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05002065}
2066
Markus Niebelab711882013-12-16 13:40:46 +01002067int mmc_set_dsr(struct mmc *mmc, u16 val)
2068{
2069 mmc->dsr = val;
2070 return 0;
2071}
2072
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02002073/* CPU-specific MMC initializations */
2074__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05002075{
2076 return -1;
2077}
2078
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02002079/* board-specific MMC initializations. */
2080__weak int board_mmc_init(bd_t *bis)
2081{
2082 return -1;
2083}
Andy Fleming272cc702008-10-30 16:41:01 -05002084
Che-Liang Chioue9550442012-11-28 15:21:13 +00002085void mmc_set_preinit(struct mmc *mmc, int preinit)
2086{
2087 mmc->preinit = preinit;
2088}
2089
Simon Glassc4d660d2017-07-04 13:31:19 -06002090#if CONFIG_IS_ENABLED(DM_MMC) && defined(CONFIG_SPL_BUILD)
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002091static int mmc_probe(bd_t *bis)
2092{
2093 return 0;
2094}
Simon Glassc4d660d2017-07-04 13:31:19 -06002095#elif CONFIG_IS_ENABLED(DM_MMC)
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002096static int mmc_probe(bd_t *bis)
2097{
Simon Glass4a1db6d2015-12-29 05:22:49 -07002098 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002099 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07002100 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002101
2102 ret = uclass_get(UCLASS_MMC, &uc);
2103 if (ret)
2104 return ret;
2105
Simon Glass4a1db6d2015-12-29 05:22:49 -07002106 /*
2107 * Try to add them in sequence order. Really with driver model we
2108 * should allow holes, but the current MMC list does not allow that.
2109 * So if we request 0, 1, 3 we will get 0, 1, 2.
2110 */
2111 for (i = 0; ; i++) {
2112 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
2113 if (ret == -ENODEV)
2114 break;
2115 }
2116 uclass_foreach_dev(dev, uc) {
2117 ret = device_probe(dev);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002118 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07002119 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002120 }
2121
2122 return 0;
2123}
2124#else
2125static int mmc_probe(bd_t *bis)
2126{
2127 if (board_mmc_init(bis) < 0)
2128 cpu_mmc_init(bis);
2129
2130 return 0;
2131}
2132#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00002133
Andy Fleming272cc702008-10-30 16:41:01 -05002134int mmc_initialize(bd_t *bis)
2135{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02002136 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002137 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02002138 if (initialized) /* Avoid initializing mmc multiple times */
2139 return 0;
2140 initialized = 1;
2141
Simon Glassc4d660d2017-07-04 13:31:19 -06002142#if !CONFIG_IS_ENABLED(BLK)
Marek Vasutb5b838f2016-12-01 02:06:33 +01002143#if !CONFIG_IS_ENABLED(MMC_TINY)
Simon Glassc40fdca2016-05-01 13:52:35 -06002144 mmc_list_init();
2145#endif
Marek Vasutb5b838f2016-12-01 02:06:33 +01002146#endif
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06002147 ret = mmc_probe(bis);
2148 if (ret)
2149 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05002150
Ying Zhangbb0dc102013-08-16 15:16:11 +08002151#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05002152 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08002153#endif
Andy Fleming272cc702008-10-30 16:41:01 -05002154
Simon Glassc40fdca2016-05-01 13:52:35 -06002155 mmc_do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05002156 return 0;
2157}
Tomas Melincd3d4882016-11-25 11:01:03 +02002158
2159#ifdef CONFIG_CMD_BKOPS_ENABLE
2160int mmc_set_bkops_enable(struct mmc *mmc)
2161{
2162 int err;
2163 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
2164
2165 err = mmc_send_ext_csd(mmc, ext_csd);
2166 if (err) {
2167 puts("Could not get ext_csd register values\n");
2168 return err;
2169 }
2170
2171 if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) {
2172 puts("Background operations not supported on device\n");
2173 return -EMEDIUMTYPE;
2174 }
2175
2176 if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) {
2177 puts("Background operations already enabled\n");
2178 return 0;
2179 }
2180
2181 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1);
2182 if (err) {
2183 puts("Failed to enable manual background operations\n");
2184 return err;
2185 }
2186
2187 puts("Enabled manual background operations\n");
2188
2189 return 0;
2190}
2191#endif