mb/google/brya/var/orisa: Update Type C DisplayPort HPD Configuration
[coreboot2.git] / src / commonlib / storage / mmc.c
blob6ba2250669173152f8f7d1eea8e9e9c7f68e9cc6
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * MultiMediaCard (MMC) and eMMC specific support code
4 * This code is controller independent
5 */
7 #include <cbmem.h>
8 #include <commonlib/storage.h>
9 #include <delay.h>
10 #include "mmc.h"
11 #include "sd_mmc.h"
12 #include "storage.h"
13 #include <string.h>
14 #include <timer.h>
16 /* We pass in the cmd since otherwise the init seems to fail */
17 static int mmc_send_op_cond_iter(struct storage_media *media,
18 struct mmc_command *cmd, int use_arg)
20 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
22 cmd->cmdidx = MMC_CMD_SEND_OP_COND;
23 cmd->resp_type = CARD_RSP_R3;
25 /* Set the controller's operating conditions */
26 if (use_arg) {
27 uint32_t mask = media->op_cond_response &
28 (OCR_VOLTAGE_MASK | OCR_ACCESS_MODE);
29 cmd->cmdarg = ctrlr->voltages & mask;
31 /* Always request high capacity if supported by the
32 * controller
34 if (ctrlr->caps & DRVR_CAP_HC)
35 cmd->cmdarg |= OCR_HCS;
37 cmd->flags = 0;
38 int err = ctrlr->send_cmd(ctrlr, cmd, NULL);
39 if (err)
40 return err;
42 media->op_cond_response = cmd->response[0];
43 return 0;
46 int mmc_send_op_cond(struct storage_media *media)
48 struct mmc_command cmd;
49 int max_iters = 2;
51 /* Ask the card for its operating conditions */
52 cmd.cmdarg = 0;
53 for (int i = 0; i < max_iters; i++) {
54 int err = mmc_send_op_cond_iter(media, &cmd, i != 0);
55 if (err)
56 return err;
58 // OCR_BUSY is active low, this bit set means
59 // "initialization complete".
60 if (media->op_cond_response & OCR_BUSY)
61 return 0;
63 return CARD_IN_PROGRESS;
66 int mmc_complete_op_cond(struct storage_media *media)
68 struct mmc_command cmd;
69 struct stopwatch sw;
71 stopwatch_init_msecs_expire(&sw, MMC_INIT_TIMEOUT_US_MS);
72 while (1) {
73 // CMD1 queries whether initialization is done.
74 int err = mmc_send_op_cond_iter(media, &cmd, 1);
75 if (err)
76 return err;
78 // OCR_BUSY means "initialization complete".
79 if (media->op_cond_response & OCR_BUSY)
80 break;
82 // Check if init timeout has expired.
83 if (stopwatch_expired(&sw))
84 return CARD_UNUSABLE_ERR;
86 udelay(100);
89 media->version = MMC_VERSION_UNKNOWN;
90 media->ocr = cmd.response[0];
92 media->high_capacity = ((media->ocr & OCR_HCS) == OCR_HCS);
93 media->rca = 0;
94 return 0;
97 int mmc_send_ext_csd(struct sd_mmc_ctrlr *ctrlr, unsigned char *ext_csd)
99 struct mmc_command cmd;
100 struct mmc_data data;
101 int rv;
103 /* Get the Card Status Register */
104 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
105 cmd.resp_type = CARD_RSP_R1;
106 cmd.cmdarg = 0;
107 cmd.flags = 0;
109 data.dest = (char *)ext_csd;
110 data.blocks = 1;
111 data.blocksize = 512;
112 data.flags = DATA_FLAG_READ;
114 rv = ctrlr->send_cmd(ctrlr, &cmd, &data);
116 if (!rv && CONFIG(SD_MMC_TRACE)) {
117 int i, size;
119 size = data.blocks * data.blocksize;
120 sd_mmc_trace("\t%p ext_csd:", ctrlr);
121 for (i = 0; i < size; i++) {
122 if (!(i % 32))
123 sd_mmc_trace("\n");
124 sd_mmc_trace(" %2.2x", ext_csd[i]);
126 sd_mmc_trace("\n");
128 return rv;
131 static int mmc_switch(struct storage_media *media, uint8_t index, uint8_t value)
133 struct mmc_command cmd;
134 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
136 cmd.cmdidx = MMC_CMD_SWITCH;
137 cmd.resp_type = CARD_RSP_R1b;
138 cmd.cmdarg = ((MMC_SWITCH_MODE_WRITE_BYTE << 24) |
139 (index << 16) | (value << 8));
140 cmd.flags = 0;
142 int ret = ctrlr->send_cmd(ctrlr, &cmd, NULL);
144 /* Waiting for the ready status */
145 sd_mmc_send_status(media, SD_MMC_IO_RETRIES);
146 return ret;
149 static void mmc_recalculate_clock(struct storage_media *media)
151 uint32_t clock;
153 clock = CLOCK_26MHZ;
154 if (media->caps & DRVR_CAP_HS) {
155 if ((media->caps & DRVR_CAP_HS200) ||
156 (media->caps & DRVR_CAP_HS400))
157 clock = CLOCK_200MHZ;
158 else if (media->caps & DRVR_CAP_HS52)
159 clock = CLOCK_52MHZ;
161 SET_CLOCK(media->ctrlr, clock);
164 static int mmc_select_hs(struct storage_media *media)
166 int ret;
168 /* Switch the MMC device into high speed mode */
169 ret = mmc_switch(media, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
170 if (ret) {
171 sd_mmc_error("Timing switch to high speed failed\n");
172 return ret;
174 sdhc_debug("SDHCI switched MMC to high speed\n");
176 /* Increase the controller clock speed */
177 SET_TIMING(media->ctrlr, BUS_TIMING_MMC_HS);
178 media->caps &= ~(DRVR_CAP_HS200 | DRVR_CAP_HS400);
179 media->caps |= DRVR_CAP_HS52 | DRVR_CAP_HS;
180 mmc_recalculate_clock(media);
181 ret = sd_mmc_send_status(media, SD_MMC_IO_RETRIES);
182 return ret;
185 static int mmc_send_tuning_seq(struct sd_mmc_ctrlr *ctrlr, char *buffer)
187 struct mmc_command cmd;
188 struct mmc_data data;
190 /* Request the device send the tuning sequence to the host */
191 cmd.cmdidx = MMC_CMD_AUTO_TUNING_SEQUENCE;
192 cmd.resp_type = CARD_RSP_R1;
193 cmd.cmdarg = 0;
194 cmd.flags = CMD_FLAG_IGNORE_INHIBIT;
196 data.dest = buffer;
197 data.blocks = 1;
198 data.blocksize = (ctrlr->bus_width == 8) ? 128 : 64;
199 data.flags = DATA_FLAG_READ;
200 return ctrlr->send_cmd(ctrlr, &cmd, &data);
203 static int mmc_bus_tuning(struct storage_media *media)
205 ALLOC_CACHE_ALIGN_BUFFER(char, buffer, 128);
206 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
207 int index;
208 int successful;
210 /* Request the device send the tuning sequence up to 40 times */
211 ctrlr->tuning_start(ctrlr, 0);
212 for (index = 0; index < 40; index++) {
213 mmc_send_tuning_seq(ctrlr, buffer);
214 if (ctrlr->is_tuning_complete(ctrlr, &successful)) {
215 if (successful)
216 return 0;
217 break;
220 sd_mmc_error("Bus tuning failed!\n");
221 return -1;
224 static int mmc_select_hs400(struct storage_media *media)
226 uint8_t bus_width;
227 uint32_t caps;
228 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
229 int ret;
230 uint32_t timing;
232 /* Switch the MMC device into high speed mode */
233 ret = mmc_select_hs(media);
234 if (ret)
235 return ret;
237 /* Switch MMC device to 8-bit DDR with strobe */
238 bus_width = EXT_CSD_DDR_BUS_WIDTH_8;
239 caps = DRVR_CAP_HS400 | DRVR_CAP_HS52 | DRVR_CAP_HS;
240 timing = BUS_TIMING_MMC_HS400;
241 if ((ctrlr->caps & DRVR_CAP_ENHANCED_STROBE)
242 && (media->caps & DRVR_CAP_ENHANCED_STROBE)) {
243 bus_width |= EXT_CSD_BUS_WIDTH_STROBE;
244 caps |= DRVR_CAP_ENHANCED_STROBE;
245 timing = BUS_TIMING_MMC_HS400ES;
247 ret = mmc_switch(media, EXT_CSD_BUS_WIDTH, bus_width);
248 if (ret) {
249 sd_mmc_error("Switching bus width for HS400 failed\n");
250 return ret;
252 sdhc_debug("SDHCI switched MMC to 8-bit DDR\n");
254 /* Set controller to 8-bit mode */
255 SET_BUS_WIDTH(ctrlr, 8);
256 media->caps |= EXT_CSD_BUS_WIDTH_8;
258 /* Switch MMC device to HS400 */
259 ret = mmc_switch(media, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400);
260 if (ret) {
261 sd_mmc_error("Switch to HS400 timing failed\n");
262 return ret;
265 /* Set controller to 200 MHz and use receive strobe */
266 SET_TIMING(ctrlr, timing);
267 media->caps |= caps;
268 mmc_recalculate_clock(media);
269 ret = sd_mmc_send_status(media, SD_MMC_IO_RETRIES);
270 return ret;
273 static int mmc_select_hs200(struct storage_media *media)
275 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
276 int ret;
278 /* Switch the MMC device to 8-bit SDR */
279 ret = mmc_switch(media, EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_8);
280 if (ret) {
281 sd_mmc_error("Switching bus width for HS200 failed\n");
282 return ret;
285 /* Set controller to 8-bit mode */
286 SET_BUS_WIDTH(ctrlr, 8);
287 media->caps |= EXT_CSD_BUS_WIDTH_8;
289 /* Switch to HS200 */
290 ret = mmc_switch(media, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200);
292 if (ret) {
293 sd_mmc_error("Switch to HS200 failed\n");
294 return ret;
296 sdhc_debug("SDHCI switched MMC to 8-bit SDR\n");
298 /* Set controller to 200 MHz */
299 SET_TIMING(ctrlr, BUS_TIMING_MMC_HS200);
300 media->caps |= DRVR_CAP_HS200 | DRVR_CAP_HS52 | DRVR_CAP_HS;
301 mmc_recalculate_clock(media);
303 /* Tune the receive sampling point for the bus */
304 if ((!ret) && (ctrlr->caps & DRVR_CAP_HS200_TUNING))
305 ret = mmc_bus_tuning(media);
306 return ret;
309 int mmc_change_freq(struct storage_media *media)
311 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
312 int err;
313 ALLOC_CACHE_ALIGN_BUFFER(unsigned char, ext_csd, 512);
315 media->caps = 0;
317 /* Only version 4 supports high-speed */
318 if (media->version < MMC_VERSION_4)
319 return 0;
321 err = mmc_send_ext_csd(ctrlr, ext_csd);
322 if (err)
323 return err;
325 /* Determine if the device supports enhanced strobe */
326 media->caps |= ext_csd[EXT_CSD_STROBE_SUPPORT]
327 ? DRVR_CAP_ENHANCED_STROBE : 0;
329 if ((ctrlr->caps & DRVR_CAP_HS400) &&
330 (ext_csd[EXT_CSD_CARD_TYPE] & MMC_HS400))
331 err = mmc_select_hs400(media);
332 else if ((ctrlr->caps & DRVR_CAP_HS200) &&
333 (ext_csd[EXT_CSD_CARD_TYPE] & MMC_HS_200MHZ))
334 err = mmc_select_hs200(media);
335 else
336 err = mmc_select_hs(media);
338 return err;
341 int mmc_set_bus_width(struct storage_media *media)
343 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
344 int err;
345 int width;
347 ALLOC_CACHE_ALIGN_BUFFER(unsigned char, ext_csd, EXT_CSD_SIZE);
348 ALLOC_CACHE_ALIGN_BUFFER(unsigned char, test_csd, EXT_CSD_SIZE);
350 /* Set the bus width */
351 err = 0;
352 for (width = EXT_CSD_BUS_WIDTH_8; width >= 0; width--) {
353 /* If HS200 is switched, Bus Width has been 8-bit */
354 if ((media->caps & DRVR_CAP_HS200) ||
355 (media->caps & DRVR_CAP_HS400))
356 break;
358 /* Set the card to use 4 bit*/
359 err = mmc_switch(media, EXT_CSD_BUS_WIDTH, width);
360 if (err)
361 continue;
363 if (!width) {
364 SET_BUS_WIDTH(ctrlr, 1);
365 break;
367 SET_BUS_WIDTH(ctrlr, 4 * width);
369 err = mmc_send_ext_csd(ctrlr, test_csd);
370 if (!err &&
371 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] ==
372 test_csd[EXT_CSD_PARTITIONING_SUPPORT]) &&
373 (ext_csd[EXT_CSD_ERASE_GROUP_DEF] ==
374 test_csd[EXT_CSD_ERASE_GROUP_DEF]) &&
375 (ext_csd[EXT_CSD_REV] ==
376 test_csd[EXT_CSD_REV]) &&
377 (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] ==
378 test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
379 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
380 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
381 media->caps |= width;
382 break;
385 return err;
388 int mmc_update_capacity(struct storage_media *media)
390 uint64_t capacity;
391 struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
392 int err;
393 ALLOC_CACHE_ALIGN_BUFFER(unsigned char, ext_csd, EXT_CSD_SIZE);
394 uint32_t erase_size;
395 uint32_t hc_erase_size;
396 uint64_t hc_wp_size;
397 int index;
399 if (media->version < MMC_VERSION_4)
400 return 0;
402 /* check ext_csd version and capacity */
403 err = mmc_send_ext_csd(ctrlr, ext_csd);
404 if (err)
405 return err;
407 if (ext_csd[EXT_CSD_REV] < 2)
408 return 0;
410 /* Determine the eMMC device information */
411 media->partition_config = ext_csd[EXT_CSD_PART_CONF]
412 & EXT_CSD_PART_ACCESS_MASK;
414 /* Determine the user partition size
416 * According to the JEDEC Standard, the value of
417 * ext_csd's capacity is valid if the value is
418 * more than 2GB
420 capacity = (uint32_t)(ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
421 ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
422 ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
423 ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
424 capacity *= 512;
425 if ((capacity >> 20) > 2 * 1024)
426 media->capacity[MMC_PARTITION_USER] = capacity;
428 /* Determine the boot partition sizes */
429 hc_erase_size = ext_csd[224] * 512 * KiB;
430 capacity = ext_csd[EXT_CSD_BOOT_SIZE_MULT] * 128 * KiB;
431 media->capacity[MMC_PARTITION_BOOT_1] = capacity;
432 media->capacity[MMC_PARTITION_BOOT_2] = capacity;
434 /* Determine the RPMB size */
435 hc_wp_size = ext_csd[EXT_CSD_HC_WP_GRP_SIZE] * hc_erase_size;
436 capacity = 128 * KiB * ext_csd[EXT_CSD_RPMB_SIZE_MULT];
437 media->capacity[MMC_PARTITION_RPMB] = capacity;
439 /* Determine the general partition sizes */
440 capacity = (ext_csd[EXT_CSD_GP_SIZE_MULT_GP0 + 2] << 16)
441 | (ext_csd[EXT_CSD_GP_SIZE_MULT_GP0 + 1] << 8)
442 | ext_csd[EXT_CSD_GP_SIZE_MULT_GP0];
443 capacity *= hc_wp_size;
444 media->capacity[MMC_PARTITION_GP1] = capacity;
446 capacity = (ext_csd[EXT_CSD_GP_SIZE_MULT_GP1 + 2] << 16)
447 | (ext_csd[EXT_CSD_GP_SIZE_MULT_GP1 + 1] << 8)
448 | ext_csd[EXT_CSD_GP_SIZE_MULT_GP1];
449 capacity *= hc_wp_size;
450 media->capacity[MMC_PARTITION_GP2] = capacity;
452 capacity = (ext_csd[EXT_CSD_GP_SIZE_MULT_GP2 + 2] << 16)
453 | (ext_csd[EXT_CSD_GP_SIZE_MULT_GP2 + 1] << 8)
454 | ext_csd[EXT_CSD_GP_SIZE_MULT_GP2];
455 capacity *= hc_wp_size;
456 media->capacity[MMC_PARTITION_GP3] = capacity;
458 capacity = (ext_csd[EXT_CSD_GP_SIZE_MULT_GP3 + 2] << 16)
459 | (ext_csd[EXT_CSD_GP_SIZE_MULT_GP3 + 1] << 8)
460 | ext_csd[EXT_CSD_GP_SIZE_MULT_GP3];
461 capacity *= hc_wp_size;
462 media->capacity[MMC_PARTITION_GP4] = capacity;
464 /* Determine the erase size */
465 erase_size = (sd_mmc_extract_uint32_bits(media->csd,
466 81, 5) + 1) *
467 (sd_mmc_extract_uint32_bits(media->csd, 86, 5)
468 + 1);
469 for (index = MMC_PARTITION_BOOT_1; index <= MMC_PARTITION_GP4;
470 index++) {
471 if (media->capacity[index] != 0) {
472 /* Enable the partitions */
473 err = mmc_switch(media, EXT_CSD_ERASE_GROUP_DEF,
474 EXT_CSD_PARTITION_ENABLE);
475 if (err) {
476 sdhc_error("Failed to enable partition access\n");
477 return err;
480 /* Use HC erase group size */
481 erase_size = hc_erase_size / media->write_bl_len;
482 break;
485 media->erase_blocks = erase_size;
486 media->trim_mult = ext_csd[EXT_CSD_TRIM_MULT];
488 return 0;
491 int mmc_set_partition(struct storage_media *media,
492 unsigned int partition_number)
494 uint8_t partition_config;
496 /* Validate the partition number */
497 if ((partition_number > MMC_PARTITION_GP4)
498 || (!media->capacity[partition_number]))
499 return -1;
501 /* Update the partition register */
502 partition_config = media->partition_config;
503 partition_config &= ~EXT_CSD_PART_ACCESS_MASK;
504 partition_config |= partition_number;
506 /* Select the new partition */
507 int ret = mmc_switch(media, EXT_CSD_PART_CONF, partition_config);
508 if (!ret)
509 media->partition_config = partition_config;
511 return ret;
514 const char *mmc_partition_name(struct storage_media *media,
515 unsigned int partition_number)
517 static const char *const partition_name[8] = {
518 "User", /* 0 */
519 "Boot 1", /* 1 */
520 "Boot 2", /* 2 */
521 "RPMB", /* 3 */
522 "GP 1", /* 4 */
523 "GP 2", /* 5 */
524 "GP 3", /* 6 */
525 "GP 4" /* 7 */
528 if (partition_number >= ARRAY_SIZE(partition_name))
529 return "";
530 return partition_name[partition_number];
533 void mmc_set_early_wake_status(int32_t status)
535 int32_t *ms_cbmem;
537 ms_cbmem = cbmem_add(CBMEM_ID_MMC_STATUS, sizeof(status));
539 if (!ms_cbmem) {
540 printk(BIOS_ERR,
541 "%s: Failed to add early mmc wake status to cbmem!\n",
542 __func__);
543 return;
546 *ms_cbmem = status;
549 int mmc_send_cmd1(struct storage_media *media)
551 int err;
553 /* Reset emmc, send CMD0 */
554 if (sd_mmc_go_idle(media))
555 goto out_err;
557 /* Send CMD1 */
558 err = mmc_send_op_cond(media);
559 if (err == 0) {
560 if (media->op_cond_response & OCR_HCS)
561 mmc_set_early_wake_status(MMC_STATUS_CMD1_READY_HCS);
562 else
563 mmc_set_early_wake_status(MMC_STATUS_CMD1_READY);
564 } else if (err == CARD_IN_PROGRESS) {
565 mmc_set_early_wake_status(MMC_STATUS_CMD1_IN_PROGRESS);
566 } else {
567 goto out_err;
570 return 0;
572 out_err:
573 mmc_set_early_wake_status(MMC_STATUS_NEED_RESET);
574 return -1;