1 /* $NetBSD: sdmmc_mem.c,v 1.67 2019/05/28 00:25:27 jmcneill Exp $ */ 2 /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ 3 4 /* 5 * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /*- 21 * Copyright (C) 2007, 2008, 2009, 2010 NONAKA Kimihiro <nonaka@netbsd.org> 22 * All rights reserved. 23 * 24 * Redistribution and use in source and binary forms, with or without 25 * modification, are permitted provided that the following conditions 26 * are met: 27 * 1. Redistributions of source code must retain the above copyright 28 * notice, this list of conditions and the following disclaimer. 29 * 2. Redistributions in binary form must reproduce the above copyright 30 * notice, this list of conditions and the following disclaimer in the 31 * documentation and/or other materials provided with the distribution. 32 * 33 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 34 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 36 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 37 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 38 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 39 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 40 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 41 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 42 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 */ 44 45 /* Routines for SD/MMC memory cards. */ 46 47 #include <sys/cdefs.h> 48 __KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.67 2019/05/28 00:25:27 jmcneill Exp $"); 49 50 #ifdef _KERNEL_OPT 51 #include "opt_sdmmc.h" 52 #endif 53 54 #include <sys/param.h> 55 #include <sys/kernel.h> 56 #include <sys/malloc.h> 57 #include <sys/systm.h> 58 #include <sys/device.h> 59 #include <sys/bitops.h> 60 #include <sys/evcnt.h> 61 62 #include <dev/sdmmc/sdmmcchip.h> 63 #include <dev/sdmmc/sdmmcreg.h> 64 #include <dev/sdmmc/sdmmcvar.h> 65 66 #ifdef SDMMC_DEBUG 67 #define DPRINTF(s) do { printf s; } while (/*CONSTCOND*/0) 68 #else 69 #define DPRINTF(s) do {} while (/*CONSTCOND*/0) 70 #endif 71 72 typedef struct { uint32_t _bits[512/32]; } __packed __aligned(4) sdmmc_bitfield512_t; 73 74 static int sdmmc_mem_sd_init(struct sdmmc_softc *, struct sdmmc_function *); 75 static int sdmmc_mem_mmc_init(struct sdmmc_softc *, struct sdmmc_function *); 76 static int sdmmc_mem_send_cid(struct sdmmc_softc *, sdmmc_response *); 77 static int sdmmc_mem_send_csd(struct sdmmc_softc *, struct sdmmc_function *, 78 sdmmc_response *); 79 static int sdmmc_mem_send_scr(struct sdmmc_softc *, struct sdmmc_function *, 80 uint32_t *scr); 81 static int sdmmc_mem_decode_scr(struct sdmmc_softc *, struct sdmmc_function *); 82 static int sdmmc_mem_send_ssr(struct sdmmc_softc *, struct sdmmc_function *, 83 sdmmc_bitfield512_t *); 84 static int sdmmc_mem_decode_ssr(struct sdmmc_softc *, struct sdmmc_function *, 85 sdmmc_bitfield512_t *); 86 static int sdmmc_mem_send_cxd_data(struct sdmmc_softc *, int, void *, size_t); 87 static int sdmmc_set_bus_width(struct sdmmc_function *, int); 88 static int sdmmc_mem_sd_switch(struct sdmmc_function *, int, int, int, sdmmc_bitfield512_t *); 89 static int sdmmc_mem_mmc_switch(struct sdmmc_function *, uint8_t, uint8_t, 90 uint8_t, bool); 91 static int sdmmc_mem_signal_voltage(struct sdmmc_softc *, int); 92 static int sdmmc_mem_spi_read_ocr(struct sdmmc_softc *, uint32_t, uint32_t *); 93 static int sdmmc_mem_single_read_block(struct sdmmc_function *, uint32_t, 94 u_char *, size_t); 95 static int sdmmc_mem_single_write_block(struct sdmmc_function *, uint32_t, 96 u_char *, size_t); 97 static int sdmmc_mem_single_segment_dma_read_block(struct sdmmc_function *, 98 uint32_t, u_char *, size_t); 99 static int sdmmc_mem_single_segment_dma_write_block(struct sdmmc_function *, 100 uint32_t, u_char *, size_t); 101 static int sdmmc_mem_read_block_subr(struct sdmmc_function *, bus_dmamap_t, 102 uint32_t, u_char *, size_t); 103 static int sdmmc_mem_write_block_subr(struct sdmmc_function *, bus_dmamap_t, 104 uint32_t, u_char *, size_t); 105 106 static const struct { 107 const char *name; 108 int v; 109 int freq; 110 } switch_group0_functions[] = { 111 /* Default/SDR12 */ 112 { "Default/SDR12", 0, 25000 }, 113 114 /* High-Speed/SDR25 */ 115 { "High-Speed/SDR25", SMC_CAPS_SD_HIGHSPEED, 50000 }, 116 117 /* SDR50 */ 118 { "SDR50", SMC_CAPS_UHS_SDR50, 100000 }, 119 120 /* SDR104 */ 121 { "SDR104", SMC_CAPS_UHS_SDR104, 208000 }, 122 123 /* DDR50 */ 124 { "DDR50", SMC_CAPS_UHS_DDR50, 50000 }, 125 }; 126 127 /* 128 * Initialize SD/MMC memory cards and memory in SDIO "combo" cards. 129 */ 130 int 131 sdmmc_mem_enable(struct sdmmc_softc *sc) 132 { 133 uint32_t host_ocr; 134 uint32_t card_ocr; 135 uint32_t new_ocr; 136 uint32_t ocr = 0; 137 int error; 138 139 SDMMC_LOCK(sc); 140 141 /* Set host mode to SD "combo" card or SD memory-only. */ 142 CLR(sc->sc_flags, SMF_UHS_MODE); 143 SET(sc->sc_flags, SMF_SD_MODE|SMF_MEM_MODE); 144 145 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 146 sdmmc_spi_chip_initialize(sc->sc_spi_sct, sc->sc_sch); 147 148 /* Reset memory (*must* do that before CMD55 or CMD1). */ 149 sdmmc_go_idle_state(sc); 150 151 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 152 /* Check SD Ver.2 */ 153 error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); 154 if (error == 0 && card_ocr == 0x1aa) 155 SET(ocr, MMC_OCR_HCS); 156 } 157 158 /* 159 * Read the SD/MMC memory OCR value by issuing CMD55 followed 160 * by ACMD41 to read the OCR value from memory-only SD cards. 161 * MMC cards will not respond to CMD55 or ACMD41 and this is 162 * how we distinguish them from SD cards. 163 */ 164 mmc_mode: 165 error = sdmmc_mem_send_op_cond(sc, 166 ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) ? ocr : 0, &card_ocr); 167 if (error) { 168 if (ISSET(sc->sc_flags, SMF_SD_MODE) && 169 !ISSET(sc->sc_flags, SMF_IO_MODE)) { 170 /* Not a SD card, switch to MMC mode. */ 171 DPRINTF(("%s: switch to MMC mode\n", SDMMCDEVNAME(sc))); 172 CLR(sc->sc_flags, SMF_SD_MODE); 173 goto mmc_mode; 174 } 175 if (!ISSET(sc->sc_flags, SMF_SD_MODE)) { 176 DPRINTF(("%s: couldn't read memory OCR\n", 177 SDMMCDEVNAME(sc))); 178 goto out; 179 } else { 180 /* Not a "combo" card. */ 181 CLR(sc->sc_flags, SMF_MEM_MODE); 182 error = 0; 183 goto out; 184 } 185 } 186 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 187 /* get card OCR */ 188 error = sdmmc_mem_spi_read_ocr(sc, ocr, &card_ocr); 189 if (error) { 190 DPRINTF(("%s: couldn't read SPI memory OCR\n", 191 SDMMCDEVNAME(sc))); 192 goto out; 193 } 194 } 195 196 /* Set the lowest voltage supported by the card and host. */ 197 host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); 198 error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); 199 if (error) { 200 DPRINTF(("%s: couldn't supply voltage requested by card\n", 201 SDMMCDEVNAME(sc))); 202 goto out; 203 } 204 205 DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); 206 DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); 207 208 host_ocr &= card_ocr; /* only allow the common voltages */ 209 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 210 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 211 /* Tell the card(s) to enter the idle state (again). */ 212 sdmmc_go_idle_state(sc); 213 /* Check SD Ver.2 */ 214 error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); 215 if (error == 0 && card_ocr == 0x1aa) 216 SET(ocr, MMC_OCR_HCS); 217 218 if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A) 219 SET(ocr, MMC_OCR_S18A); 220 } else { 221 SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR); 222 } 223 } 224 host_ocr |= ocr; 225 226 /* Send the new OCR value until all cards are ready. */ 227 error = sdmmc_mem_send_op_cond(sc, host_ocr, &new_ocr); 228 if (error) { 229 DPRINTF(("%s: couldn't send memory OCR\n", SDMMCDEVNAME(sc))); 230 goto out; 231 } 232 233 if (ISSET(sc->sc_flags, SMF_SD_MODE) && ISSET(new_ocr, MMC_OCR_S18A)) { 234 /* 235 * Card and host support low voltage mode, begin switch 236 * sequence. 237 */ 238 struct sdmmc_command cmd; 239 memset(&cmd, 0, sizeof(cmd)); 240 cmd.c_arg = 0; 241 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 242 cmd.c_opcode = SD_VOLTAGE_SWITCH; 243 DPRINTF(("%s: switching card to 1.8V\n", SDMMCDEVNAME(sc))); 244 error = sdmmc_mmc_command(sc, &cmd); 245 if (error) { 246 DPRINTF(("%s: voltage switch command failed\n", 247 SDMMCDEVNAME(sc))); 248 goto out; 249 } 250 251 error = sdmmc_mem_signal_voltage(sc, SDMMC_SIGNAL_VOLTAGE_180); 252 if (error) 253 goto out; 254 255 SET(sc->sc_flags, SMF_UHS_MODE); 256 } 257 258 out: 259 SDMMC_UNLOCK(sc); 260 261 if (error) 262 printf("%s: %s failed with error %d\n", SDMMCDEVNAME(sc), 263 __func__, error); 264 265 return error; 266 } 267 268 static int 269 sdmmc_mem_signal_voltage(struct sdmmc_softc *sc, int signal_voltage) 270 { 271 int error; 272 273 /* 274 * Stop the clock 275 */ 276 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 277 SDMMC_SDCLK_OFF, false); 278 if (error) 279 goto out; 280 281 delay(1000); 282 283 /* 284 * Card switch command was successful, update host controller 285 * signal voltage setting. 286 */ 287 DPRINTF(("%s: switching host to %s\n", SDMMCDEVNAME(sc), 288 signal_voltage == SDMMC_SIGNAL_VOLTAGE_180 ? "1.8V" : "3.3V")); 289 error = sdmmc_chip_signal_voltage(sc->sc_sct, 290 sc->sc_sch, signal_voltage); 291 if (error) 292 goto out; 293 294 delay(5000); 295 296 /* 297 * Switch to SDR12 timing 298 */ 299 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 25000, 300 false); 301 if (error) 302 goto out; 303 304 delay(1000); 305 306 out: 307 return error; 308 } 309 310 /* 311 * Read the CSD and CID from all cards and assign each card a unique 312 * relative card address (RCA). CMD2 is ignored by SDIO-only cards. 313 */ 314 void 315 sdmmc_mem_scan(struct sdmmc_softc *sc) 316 { 317 sdmmc_response resp; 318 struct sdmmc_function *sf; 319 uint16_t next_rca; 320 int error; 321 int retry; 322 323 SDMMC_LOCK(sc); 324 325 /* 326 * CMD2 is a broadcast command understood by SD cards and MMC 327 * cards. All cards begin to respond to the command, but back 328 * off if another card drives the CMD line to a different level. 329 * Only one card will get its entire response through. That 330 * card remains silent once it has been assigned a RCA. 331 */ 332 for (retry = 0; retry < 100; retry++) { 333 error = sdmmc_mem_send_cid(sc, &resp); 334 if (error) { 335 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) && 336 error == ETIMEDOUT) { 337 /* No more cards there. */ 338 break; 339 } 340 DPRINTF(("%s: couldn't read CID\n", SDMMCDEVNAME(sc))); 341 break; 342 } 343 344 /* In MMC mode, find the next available RCA. */ 345 next_rca = 1; 346 if (!ISSET(sc->sc_flags, SMF_SD_MODE)) { 347 SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) 348 next_rca++; 349 } 350 351 /* Allocate a sdmmc_function structure. */ 352 sf = sdmmc_function_alloc(sc); 353 sf->rca = next_rca; 354 355 /* 356 * Remember the CID returned in the CMD2 response for 357 * later decoding. 358 */ 359 memcpy(sf->raw_cid, resp, sizeof(sf->raw_cid)); 360 361 /* 362 * Silence the card by assigning it a unique RCA, or 363 * querying it for its RCA in the case of SD. 364 */ 365 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 366 if (sdmmc_set_relative_addr(sc, sf) != 0) { 367 aprint_error_dev(sc->sc_dev, 368 "couldn't set mem RCA\n"); 369 sdmmc_function_free(sf); 370 break; 371 } 372 } 373 374 /* 375 * If this is a memory-only card, the card responding 376 * first becomes an alias for SDIO function 0. 377 */ 378 if (sc->sc_fn0 == NULL) 379 sc->sc_fn0 = sf; 380 381 SIMPLEQ_INSERT_TAIL(&sc->sf_head, sf, sf_list); 382 383 /* only one function in SPI mode */ 384 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 385 break; 386 } 387 388 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 389 /* Go to Data Transfer Mode, if possible. */ 390 sdmmc_chip_bus_rod(sc->sc_sct, sc->sc_sch, 0); 391 392 /* 393 * All cards are either inactive or awaiting further commands. 394 * Read the CSDs and decode the raw CID for each card. 395 */ 396 SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) { 397 error = sdmmc_mem_send_csd(sc, sf, &resp); 398 if (error) { 399 SET(sf->flags, SFF_ERROR); 400 continue; 401 } 402 403 if (sdmmc_decode_csd(sc, resp, sf) != 0 || 404 sdmmc_decode_cid(sc, sf->raw_cid, sf) != 0) { 405 SET(sf->flags, SFF_ERROR); 406 continue; 407 } 408 409 #ifdef SDMMC_DEBUG 410 printf("%s: CID: ", SDMMCDEVNAME(sc)); 411 sdmmc_print_cid(&sf->cid); 412 #endif 413 } 414 415 SDMMC_UNLOCK(sc); 416 } 417 418 int 419 sdmmc_decode_csd(struct sdmmc_softc *sc, sdmmc_response resp, 420 struct sdmmc_function *sf) 421 { 422 /* TRAN_SPEED(2:0): transfer rate exponent */ 423 static const int speed_exponent[8] = { 424 100 * 1, /* 100 Kbits/s */ 425 1 * 1000, /* 1 Mbits/s */ 426 10 * 1000, /* 10 Mbits/s */ 427 100 * 1000, /* 100 Mbits/s */ 428 0, 429 0, 430 0, 431 0, 432 }; 433 /* TRAN_SPEED(6:3): time mantissa */ 434 static const int speed_mantissa[16] = { 435 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 436 }; 437 struct sdmmc_csd *csd = &sf->csd; 438 int e, m; 439 440 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 441 /* 442 * CSD version 1.0 corresponds to SD system 443 * specification version 1.0 - 1.10. (SanDisk, 3.5.3) 444 */ 445 csd->csdver = SD_CSD_CSDVER(resp); 446 switch (csd->csdver) { 447 case SD_CSD_CSDVER_2_0: 448 DPRINTF(("%s: SD Ver.2.0\n", SDMMCDEVNAME(sc))); 449 SET(sf->flags, SFF_SDHC); 450 csd->capacity = SD_CSD_V2_CAPACITY(resp); 451 csd->read_bl_len = SD_CSD_V2_BL_LEN; 452 break; 453 454 case SD_CSD_CSDVER_1_0: 455 DPRINTF(("%s: SD Ver.1.0\n", SDMMCDEVNAME(sc))); 456 csd->capacity = SD_CSD_CAPACITY(resp); 457 csd->read_bl_len = SD_CSD_READ_BL_LEN(resp); 458 break; 459 460 default: 461 aprint_error_dev(sc->sc_dev, 462 "unknown SD CSD structure version 0x%x\n", 463 csd->csdver); 464 return 1; 465 } 466 467 csd->mmcver = SD_CSD_MMCVER(resp); 468 csd->write_bl_len = SD_CSD_WRITE_BL_LEN(resp); 469 csd->r2w_factor = SD_CSD_R2W_FACTOR(resp); 470 e = SD_CSD_SPEED_EXP(resp); 471 m = SD_CSD_SPEED_MANT(resp); 472 csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10; 473 csd->ccc = SD_CSD_CCC(resp); 474 } else { 475 csd->csdver = MMC_CSD_CSDVER(resp); 476 if (csd->csdver == MMC_CSD_CSDVER_1_0) { 477 aprint_error_dev(sc->sc_dev, 478 "unknown MMC CSD structure version 0x%x\n", 479 csd->csdver); 480 return 1; 481 } 482 483 csd->mmcver = MMC_CSD_MMCVER(resp); 484 csd->capacity = MMC_CSD_CAPACITY(resp); 485 csd->read_bl_len = MMC_CSD_READ_BL_LEN(resp); 486 csd->write_bl_len = MMC_CSD_WRITE_BL_LEN(resp); 487 csd->r2w_factor = MMC_CSD_R2W_FACTOR(resp); 488 e = MMC_CSD_TRAN_SPEED_EXP(resp); 489 m = MMC_CSD_TRAN_SPEED_MANT(resp); 490 csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10; 491 } 492 if ((1 << csd->read_bl_len) > SDMMC_SECTOR_SIZE) 493 csd->capacity *= (1 << csd->read_bl_len) / SDMMC_SECTOR_SIZE; 494 495 #ifdef SDMMC_DUMP_CSD 496 sdmmc_print_csd(resp, csd); 497 #endif 498 499 return 0; 500 } 501 502 int 503 sdmmc_decode_cid(struct sdmmc_softc *sc, sdmmc_response resp, 504 struct sdmmc_function *sf) 505 { 506 struct sdmmc_cid *cid = &sf->cid; 507 508 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 509 cid->mid = SD_CID_MID(resp); 510 cid->oid = SD_CID_OID(resp); 511 SD_CID_PNM_CPY(resp, cid->pnm); 512 cid->rev = SD_CID_REV(resp); 513 cid->psn = SD_CID_PSN(resp); 514 cid->mdt = SD_CID_MDT(resp); 515 } else { 516 switch(sf->csd.mmcver) { 517 case MMC_CSD_MMCVER_1_0: 518 case MMC_CSD_MMCVER_1_4: 519 cid->mid = MMC_CID_MID_V1(resp); 520 MMC_CID_PNM_V1_CPY(resp, cid->pnm); 521 cid->rev = MMC_CID_REV_V1(resp); 522 cid->psn = MMC_CID_PSN_V1(resp); 523 cid->mdt = MMC_CID_MDT_V1(resp); 524 break; 525 case MMC_CSD_MMCVER_2_0: 526 case MMC_CSD_MMCVER_3_1: 527 case MMC_CSD_MMCVER_4_0: 528 cid->mid = MMC_CID_MID_V2(resp); 529 cid->oid = MMC_CID_OID_V2(resp); 530 MMC_CID_PNM_V2_CPY(resp, cid->pnm); 531 cid->psn = MMC_CID_PSN_V2(resp); 532 break; 533 default: 534 aprint_error_dev(sc->sc_dev, "unknown MMC version %d\n", 535 sf->csd.mmcver); 536 return 1; 537 } 538 } 539 return 0; 540 } 541 542 void 543 sdmmc_print_cid(struct sdmmc_cid *cid) 544 { 545 546 printf("mid=0x%02x oid=0x%04x pnm=\"%s\" rev=0x%02x psn=0x%08x" 547 " mdt=%03x\n", cid->mid, cid->oid, cid->pnm, cid->rev, cid->psn, 548 cid->mdt); 549 } 550 551 #ifdef SDMMC_DUMP_CSD 552 void 553 sdmmc_print_csd(sdmmc_response resp, struct sdmmc_csd *csd) 554 { 555 556 printf("csdver = %d\n", csd->csdver); 557 printf("mmcver = %d\n", csd->mmcver); 558 printf("capacity = 0x%08x\n", csd->capacity); 559 printf("read_bl_len = %d\n", csd->read_bl_len); 560 printf("write_bl_len = %d\n", csd->write_bl_len); 561 printf("r2w_factor = %d\n", csd->r2w_factor); 562 printf("tran_speed = %d\n", csd->tran_speed); 563 printf("ccc = 0x%x\n", csd->ccc); 564 } 565 #endif 566 567 /* 568 * Initialize a SD/MMC memory card. 569 */ 570 int 571 sdmmc_mem_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 572 { 573 int error = 0; 574 575 SDMMC_LOCK(sc); 576 577 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 578 error = sdmmc_select_card(sc, sf); 579 if (error) 580 goto out; 581 } 582 583 error = sdmmc_mem_set_blocklen(sc, sf, SDMMC_SECTOR_SIZE); 584 if (error) 585 goto out; 586 587 if (ISSET(sc->sc_flags, SMF_SD_MODE)) 588 error = sdmmc_mem_sd_init(sc, sf); 589 else 590 error = sdmmc_mem_mmc_init(sc, sf); 591 592 if (error != 0) 593 SET(sf->flags, SFF_ERROR); 594 595 out: 596 SDMMC_UNLOCK(sc); 597 598 return error; 599 } 600 601 /* 602 * Get or set the card's memory OCR value (SD or MMC). 603 */ 604 int 605 sdmmc_mem_send_op_cond(struct sdmmc_softc *sc, uint32_t ocr, uint32_t *ocrp) 606 { 607 struct sdmmc_command cmd; 608 int error; 609 int retry; 610 611 /* Don't lock */ 612 613 DPRINTF(("%s: sdmmc_mem_send_op_cond: ocr=%#x\n", 614 SDMMCDEVNAME(sc), ocr)); 615 616 /* 617 * If we change the OCR value, retry the command until the OCR 618 * we receive in response has the "CARD BUSY" bit set, meaning 619 * that all cards are ready for identification. 620 */ 621 for (retry = 0; retry < 100; retry++) { 622 memset(&cmd, 0, sizeof(cmd)); 623 cmd.c_arg = !ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) ? 624 ocr : (ocr & MMC_OCR_HCS); 625 cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R3 | SCF_RSP_SPI_R1 626 | SCF_TOUT_OK; 627 628 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 629 cmd.c_opcode = SD_APP_OP_COND; 630 error = sdmmc_app_command(sc, NULL, &cmd); 631 } else { 632 cmd.c_opcode = MMC_SEND_OP_COND; 633 error = sdmmc_mmc_command(sc, &cmd); 634 } 635 if (error) 636 break; 637 638 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 639 if (!ISSET(MMC_SPI_R1(cmd.c_resp), R1_SPI_IDLE)) 640 break; 641 } else { 642 if (ISSET(MMC_R3(cmd.c_resp), MMC_OCR_MEM_READY) || 643 ocr == 0) 644 break; 645 } 646 647 error = ETIMEDOUT; 648 sdmmc_delay(10000); 649 } 650 if (ocrp != NULL) { 651 if (error == 0 && 652 !ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 653 *ocrp = MMC_R3(cmd.c_resp); 654 } else { 655 *ocrp = ocr; 656 } 657 } 658 DPRINTF(("%s: sdmmc_mem_send_op_cond: error=%d, ocr=%#x\n", 659 SDMMCDEVNAME(sc), error, MMC_R3(cmd.c_resp))); 660 return error; 661 } 662 663 int 664 sdmmc_mem_send_if_cond(struct sdmmc_softc *sc, uint32_t ocr, uint32_t *ocrp) 665 { 666 struct sdmmc_command cmd; 667 int error; 668 669 /* Don't lock */ 670 671 memset(&cmd, 0, sizeof(cmd)); 672 cmd.c_arg = ocr; 673 cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R7 | SCF_RSP_SPI_R7; 674 cmd.c_opcode = SD_SEND_IF_COND; 675 676 error = sdmmc_mmc_command(sc, &cmd); 677 if (error == 0 && ocrp != NULL) { 678 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 679 *ocrp = MMC_SPI_R7(cmd.c_resp); 680 } else { 681 *ocrp = MMC_R7(cmd.c_resp); 682 } 683 DPRINTF(("%s: sdmmc_mem_send_if_cond: error=%d, ocr=%#x\n", 684 SDMMCDEVNAME(sc), error, *ocrp)); 685 } 686 return error; 687 } 688 689 /* 690 * Set the read block length appropriately for this card, according to 691 * the card CSD register value. 692 */ 693 int 694 sdmmc_mem_set_blocklen(struct sdmmc_softc *sc, struct sdmmc_function *sf, 695 int block_len) 696 { 697 struct sdmmc_command cmd; 698 int error; 699 700 /* Don't lock */ 701 702 memset(&cmd, 0, sizeof(cmd)); 703 cmd.c_opcode = MMC_SET_BLOCKLEN; 704 cmd.c_arg = block_len; 705 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R1; 706 707 error = sdmmc_mmc_command(sc, &cmd); 708 709 DPRINTF(("%s: sdmmc_mem_set_blocklen: read_bl_len=%d sector_size=%d\n", 710 SDMMCDEVNAME(sc), 1 << sf->csd.read_bl_len, block_len)); 711 712 return error; 713 } 714 715 /* make 512-bit BE quantity __bitfield()-compatible */ 716 static void 717 sdmmc_be512_to_bitfield512(sdmmc_bitfield512_t *buf) { 718 size_t i; 719 uint32_t tmp0, tmp1; 720 const size_t bitswords = __arraycount(buf->_bits); 721 for (i = 0; i < bitswords/2; i++) { 722 tmp0 = buf->_bits[i]; 723 tmp1 = buf->_bits[bitswords - 1 - i]; 724 buf->_bits[i] = be32toh(tmp1); 725 buf->_bits[bitswords - 1 - i] = be32toh(tmp0); 726 } 727 } 728 729 static int 730 sdmmc_mem_select_transfer_mode(struct sdmmc_softc *sc, int support_func) 731 { 732 if (ISSET(sc->sc_flags, SMF_UHS_MODE)) { 733 if (ISSET(sc->sc_caps, SMC_CAPS_UHS_SDR104) && 734 ISSET(support_func, 1 << SD_ACCESS_MODE_SDR104)) { 735 return SD_ACCESS_MODE_SDR104; 736 } 737 if (ISSET(sc->sc_caps, SMC_CAPS_UHS_DDR50) && 738 ISSET(support_func, 1 << SD_ACCESS_MODE_DDR50)) { 739 return SD_ACCESS_MODE_DDR50; 740 } 741 if (ISSET(sc->sc_caps, SMC_CAPS_UHS_SDR50) && 742 ISSET(support_func, 1 << SD_ACCESS_MODE_SDR50)) { 743 return SD_ACCESS_MODE_SDR50; 744 } 745 } 746 if (ISSET(sc->sc_caps, SMC_CAPS_SD_HIGHSPEED) && 747 ISSET(support_func, 1 << SD_ACCESS_MODE_SDR25)) { 748 return SD_ACCESS_MODE_SDR25; 749 } 750 return SD_ACCESS_MODE_SDR12; 751 } 752 753 static int 754 sdmmc_mem_execute_tuning(struct sdmmc_softc *sc, struct sdmmc_function *sf) 755 { 756 int timing = -1; 757 758 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 759 if (!ISSET(sc->sc_flags, SMF_UHS_MODE)) 760 return 0; 761 762 switch (sf->csd.tran_speed) { 763 case 100000: 764 timing = SDMMC_TIMING_UHS_SDR50; 765 break; 766 case 208000: 767 timing = SDMMC_TIMING_UHS_SDR104; 768 break; 769 default: 770 return 0; 771 } 772 } else { 773 switch (sf->csd.tran_speed) { 774 case 200000: 775 timing = SDMMC_TIMING_MMC_HS200; 776 break; 777 default: 778 return 0; 779 } 780 } 781 782 DPRINTF(("%s: execute tuning for timing %d\n", SDMMCDEVNAME(sc), 783 timing)); 784 785 return sdmmc_chip_execute_tuning(sc->sc_sct, sc->sc_sch, timing); 786 } 787 788 static int 789 sdmmc_mem_sd_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 790 { 791 int support_func, best_func, bus_clock, error, i; 792 sdmmc_bitfield512_t status; 793 bool ddr = false; 794 795 /* change bus clock */ 796 bus_clock = uimin(sc->sc_busclk, sf->csd.tran_speed); 797 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, bus_clock, false); 798 if (error) { 799 aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 800 return error; 801 } 802 803 error = sdmmc_mem_send_scr(sc, sf, sf->raw_scr); 804 if (error) { 805 aprint_error_dev(sc->sc_dev, "SD_SEND_SCR send failed.\n"); 806 return error; 807 } 808 error = sdmmc_mem_decode_scr(sc, sf); 809 if (error) 810 return error; 811 812 if (ISSET(sc->sc_caps, SMC_CAPS_4BIT_MODE) && 813 ISSET(sf->scr.bus_width, SCR_SD_BUS_WIDTHS_4BIT)) { 814 DPRINTF(("%s: change bus width\n", SDMMCDEVNAME(sc))); 815 error = sdmmc_set_bus_width(sf, 4); 816 if (error) { 817 aprint_error_dev(sc->sc_dev, 818 "can't change bus width (%d bit)\n", 4); 819 return error; 820 } 821 sf->width = 4; 822 } 823 824 best_func = 0; 825 if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && 826 ISSET(sf->csd.ccc, SD_CSD_CCC_SWITCH)) { 827 DPRINTF(("%s: switch func mode 0\n", SDMMCDEVNAME(sc))); 828 error = sdmmc_mem_sd_switch(sf, 0, 1, 0, &status); 829 if (error) { 830 aprint_error_dev(sc->sc_dev, 831 "switch func mode 0 failed\n"); 832 return error; 833 } 834 835 support_func = SFUNC_STATUS_GROUP(&status, 1); 836 837 if (!ISSET(sc->sc_flags, SMF_UHS_MODE) && support_func & 0x1c) { 838 /* XXX UHS-I card started in 1.8V mode, switch now */ 839 error = sdmmc_mem_signal_voltage(sc, 840 SDMMC_SIGNAL_VOLTAGE_180); 841 if (error) { 842 aprint_error_dev(sc->sc_dev, 843 "failed to recover UHS card\n"); 844 return error; 845 } 846 SET(sc->sc_flags, SMF_UHS_MODE); 847 } 848 849 for (i = 0; i < __arraycount(switch_group0_functions); i++) { 850 if (!(support_func & (1 << i))) 851 continue; 852 DPRINTF(("%s: card supports mode %s\n", 853 SDMMCDEVNAME(sc), 854 switch_group0_functions[i].name)); 855 } 856 857 best_func = sdmmc_mem_select_transfer_mode(sc, support_func); 858 859 DPRINTF(("%s: using mode %s\n", SDMMCDEVNAME(sc), 860 switch_group0_functions[best_func].name)); 861 862 if (best_func != 0) { 863 DPRINTF(("%s: switch func mode 1(func=%d)\n", 864 SDMMCDEVNAME(sc), best_func)); 865 error = 866 sdmmc_mem_sd_switch(sf, 1, 1, best_func, &status); 867 if (error) { 868 aprint_error_dev(sc->sc_dev, 869 "switch func mode 1 failed:" 870 " group 1 function %d(0x%2x)\n", 871 best_func, support_func); 872 return error; 873 } 874 sf->csd.tran_speed = 875 switch_group0_functions[best_func].freq; 876 877 if (best_func == SD_ACCESS_MODE_DDR50) 878 ddr = true; 879 880 /* Wait 400KHz x 8 clock (2.5us * 8 + slop) */ 881 delay(25); 882 } 883 } 884 885 /* update bus clock */ 886 if (sc->sc_busclk > sf->csd.tran_speed) 887 sc->sc_busclk = sf->csd.tran_speed; 888 if (sc->sc_busclk == bus_clock && sc->sc_busddr == ddr) 889 return 0; 890 891 /* change bus clock */ 892 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, sc->sc_busclk, 893 ddr); 894 if (error) { 895 aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 896 return error; 897 } 898 899 sc->sc_transfer_mode = switch_group0_functions[best_func].name; 900 sc->sc_busddr = ddr; 901 902 /* get card status */ 903 error = sdmmc_mem_send_ssr(sc, sf, &status); 904 if (error) { 905 aprint_error_dev(sc->sc_dev, "can't get SD status: %d\n", 906 error); 907 return error; 908 } 909 sdmmc_mem_decode_ssr(sc, sf, &status); 910 911 /* execute tuning (UHS) */ 912 error = sdmmc_mem_execute_tuning(sc, sf); 913 if (error) { 914 aprint_error_dev(sc->sc_dev, "can't execute SD tuning\n"); 915 return error; 916 } 917 918 return 0; 919 } 920 921 static int 922 sdmmc_mem_mmc_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 923 { 924 int width, value, hs_timing, bus_clock, error; 925 uint8_t ext_csd[512]; 926 uint32_t sectors = 0; 927 bool ddr = false; 928 929 sc->sc_transfer_mode = NULL; 930 931 /* change bus clock */ 932 bus_clock = uimin(sc->sc_busclk, sf->csd.tran_speed); 933 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, bus_clock, false); 934 if (error) { 935 aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 936 return error; 937 } 938 939 if (sf->csd.mmcver >= MMC_CSD_MMCVER_4_0) { 940 error = sdmmc_mem_send_cxd_data(sc, 941 MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd)); 942 if (error) { 943 aprint_error_dev(sc->sc_dev, 944 "can't read EXT_CSD (error=%d)\n", error); 945 return error; 946 } 947 if ((sf->csd.csdver == MMC_CSD_CSDVER_EXT_CSD) && 948 (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2)) { 949 aprint_error_dev(sc->sc_dev, 950 "unrecognised future version (%d)\n", 951 ext_csd[EXT_CSD_STRUCTURE]); 952 return ENOTSUP; 953 } 954 sf->ext_csd.rev = ext_csd[EXT_CSD_REV]; 955 956 if (ISSET(sc->sc_caps, SMC_CAPS_MMC_HS200) && 957 ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_HS200_1_8V) { 958 sf->csd.tran_speed = 200000; /* 200MHz SDR */ 959 hs_timing = EXT_CSD_HS_TIMING_HS200; 960 } else if (ISSET(sc->sc_caps, SMC_CAPS_MMC_DDR52) && 961 ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_DDR52_1_8V) { 962 sf->csd.tran_speed = 52000; /* 52MHz */ 963 hs_timing = EXT_CSD_HS_TIMING_HIGHSPEED; 964 ddr = true; 965 } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_52M) { 966 sf->csd.tran_speed = 52000; /* 52MHz */ 967 hs_timing = EXT_CSD_HS_TIMING_HIGHSPEED; 968 } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_26M) { 969 sf->csd.tran_speed = 26000; /* 26MHz */ 970 hs_timing = EXT_CSD_HS_TIMING_LEGACY; 971 } else { 972 aprint_error_dev(sc->sc_dev, 973 "unknown CARD_TYPE: 0x%x\n", 974 ext_csd[EXT_CSD_CARD_TYPE]); 975 return ENOTSUP; 976 } 977 978 if (ISSET(sc->sc_caps, SMC_CAPS_8BIT_MODE)) { 979 width = 8; 980 value = EXT_CSD_BUS_WIDTH_8; 981 } else if (ISSET(sc->sc_caps, SMC_CAPS_4BIT_MODE)) { 982 width = 4; 983 value = EXT_CSD_BUS_WIDTH_4; 984 } else { 985 width = 1; 986 value = EXT_CSD_BUS_WIDTH_1; 987 } 988 989 if (width != 1) { 990 error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL, 991 EXT_CSD_BUS_WIDTH, value, false); 992 if (error == 0) 993 error = sdmmc_chip_bus_width(sc->sc_sct, 994 sc->sc_sch, width); 995 else { 996 DPRINTF(("%s: can't change bus width" 997 " (%d bit)\n", SDMMCDEVNAME(sc), width)); 998 return error; 999 } 1000 1001 /* XXXX: need bus test? (using by CMD14 & CMD19) */ 1002 delay(10000); 1003 } 1004 sf->width = width; 1005 1006 if (hs_timing == EXT_CSD_HS_TIMING_HIGHSPEED && 1007 !ISSET(sc->sc_caps, SMC_CAPS_MMC_HIGHSPEED)) { 1008 hs_timing = EXT_CSD_HS_TIMING_LEGACY; 1009 } 1010 if (hs_timing != EXT_CSD_HS_TIMING_LEGACY) { 1011 error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL, 1012 EXT_CSD_HS_TIMING, hs_timing, false); 1013 if (error) { 1014 aprint_error_dev(sc->sc_dev, 1015 "can't change high speed %d, error %d\n", 1016 hs_timing, error); 1017 return error; 1018 } 1019 } 1020 1021 if (sc->sc_busclk > sf->csd.tran_speed) 1022 sc->sc_busclk = sf->csd.tran_speed; 1023 if (sc->sc_busclk != bus_clock) { 1024 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1025 sc->sc_busclk, false); 1026 if (error) { 1027 aprint_error_dev(sc->sc_dev, 1028 "can't change bus clock\n"); 1029 return error; 1030 } 1031 } 1032 1033 if (hs_timing != EXT_CSD_HS_TIMING_LEGACY) { 1034 error = sdmmc_mem_send_cxd_data(sc, 1035 MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd)); 1036 if (error) { 1037 aprint_error_dev(sc->sc_dev, 1038 "can't re-read EXT_CSD\n"); 1039 return error; 1040 } 1041 if (ext_csd[EXT_CSD_HS_TIMING] != hs_timing) { 1042 aprint_error_dev(sc->sc_dev, 1043 "HS_TIMING set failed\n"); 1044 return EINVAL; 1045 } 1046 } 1047 1048 /* 1049 * HS_TIMING must be set to “0x1” before setting BUS_WIDTH 1050 * for dual data rate operation 1051 */ 1052 if (ddr && 1053 hs_timing == EXT_CSD_HS_TIMING_HIGHSPEED && 1054 width > 1) { 1055 error = sdmmc_mem_mmc_switch(sf, 1056 EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, 1057 (width == 8) ? EXT_CSD_BUS_WIDTH_8_DDR : 1058 EXT_CSD_BUS_WIDTH_4_DDR, false); 1059 if (error) { 1060 DPRINTF(("%s: can't switch to DDR" 1061 " (%d bit)\n", SDMMCDEVNAME(sc), width)); 1062 return error; 1063 } 1064 1065 delay(10000); 1066 1067 error = sdmmc_mem_signal_voltage(sc, 1068 SDMMC_SIGNAL_VOLTAGE_180); 1069 if (error) { 1070 aprint_error_dev(sc->sc_dev, 1071 "can't switch signaling voltage\n"); 1072 return error; 1073 } 1074 1075 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1076 sc->sc_busclk, ddr); 1077 if (error) { 1078 aprint_error_dev(sc->sc_dev, 1079 "can't change bus clock\n"); 1080 return error; 1081 } 1082 1083 delay(10000); 1084 1085 sc->sc_transfer_mode = "DDR52"; 1086 sc->sc_busddr = ddr; 1087 } 1088 1089 sectors = ext_csd[EXT_CSD_SEC_COUNT + 0] << 0 | 1090 ext_csd[EXT_CSD_SEC_COUNT + 1] << 8 | 1091 ext_csd[EXT_CSD_SEC_COUNT + 2] << 16 | 1092 ext_csd[EXT_CSD_SEC_COUNT + 3] << 24; 1093 if (sectors > (2u * 1024 * 1024 * 1024) / 512) { 1094 SET(sf->flags, SFF_SDHC); 1095 sf->csd.capacity = sectors; 1096 } 1097 1098 if (hs_timing == EXT_CSD_HS_TIMING_HS200) { 1099 sc->sc_transfer_mode = "HS200"; 1100 1101 /* execute tuning (HS200) */ 1102 error = sdmmc_mem_execute_tuning(sc, sf); 1103 if (error) { 1104 aprint_error_dev(sc->sc_dev, 1105 "can't execute MMC tuning\n"); 1106 return error; 1107 } 1108 } 1109 1110 if (sf->ext_csd.rev >= 5) { 1111 sf->ext_csd.rst_n_function = 1112 ext_csd[EXT_CSD_RST_N_FUNCTION]; 1113 } 1114 1115 if (sf->ext_csd.rev >= 6) { 1116 sf->ext_csd.cache_size = 1117 le32dec(&ext_csd[EXT_CSD_CACHE_SIZE]) * 1024; 1118 } 1119 if (sf->ext_csd.cache_size > 0) { 1120 /* eMMC cache present, enable it */ 1121 error = sdmmc_mem_mmc_switch(sf, 1122 EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CACHE_CTRL, 1123 EXT_CSD_CACHE_CTRL_CACHE_EN, false); 1124 if (error) { 1125 aprint_error_dev(sc->sc_dev, 1126 "can't enable cache: %d\n", error); 1127 } else { 1128 SET(sf->flags, SFF_CACHE_ENABLED); 1129 } 1130 } 1131 } else { 1132 if (sc->sc_busclk > sf->csd.tran_speed) 1133 sc->sc_busclk = sf->csd.tran_speed; 1134 if (sc->sc_busclk != bus_clock) { 1135 error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1136 sc->sc_busclk, false); 1137 if (error) { 1138 aprint_error_dev(sc->sc_dev, 1139 "can't change bus clock\n"); 1140 return error; 1141 } 1142 } 1143 } 1144 1145 return 0; 1146 } 1147 1148 static int 1149 sdmmc_mem_send_cid(struct sdmmc_softc *sc, sdmmc_response *resp) 1150 { 1151 struct sdmmc_command cmd; 1152 int error; 1153 1154 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1155 memset(&cmd, 0, sizeof cmd); 1156 cmd.c_opcode = MMC_ALL_SEND_CID; 1157 cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R2 | SCF_TOUT_OK; 1158 1159 error = sdmmc_mmc_command(sc, &cmd); 1160 } else { 1161 error = sdmmc_mem_send_cxd_data(sc, MMC_SEND_CID, &cmd.c_resp, 1162 sizeof(cmd.c_resp)); 1163 } 1164 1165 #ifdef SDMMC_DEBUG 1166 if (error == 0) 1167 sdmmc_dump_data("CID", cmd.c_resp, sizeof(cmd.c_resp)); 1168 #endif 1169 if (error == 0 && resp != NULL) 1170 memcpy(resp, &cmd.c_resp, sizeof(*resp)); 1171 return error; 1172 } 1173 1174 static int 1175 sdmmc_mem_send_csd(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1176 sdmmc_response *resp) 1177 { 1178 struct sdmmc_command cmd; 1179 int error; 1180 1181 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1182 memset(&cmd, 0, sizeof cmd); 1183 cmd.c_opcode = MMC_SEND_CSD; 1184 cmd.c_arg = MMC_ARG_RCA(sf->rca); 1185 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R2; 1186 1187 error = sdmmc_mmc_command(sc, &cmd); 1188 } else { 1189 error = sdmmc_mem_send_cxd_data(sc, MMC_SEND_CSD, &cmd.c_resp, 1190 sizeof(cmd.c_resp)); 1191 } 1192 1193 #ifdef SDMMC_DEBUG 1194 if (error == 0) 1195 sdmmc_dump_data("CSD", cmd.c_resp, sizeof(cmd.c_resp)); 1196 #endif 1197 if (error == 0 && resp != NULL) 1198 memcpy(resp, &cmd.c_resp, sizeof(*resp)); 1199 return error; 1200 } 1201 1202 static int 1203 sdmmc_mem_send_scr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1204 uint32_t *scr) 1205 { 1206 struct sdmmc_command cmd; 1207 bus_dma_segment_t ds[1]; 1208 void *ptr = NULL; 1209 int datalen = 8; 1210 int rseg; 1211 int error = 0; 1212 1213 /* Don't lock */ 1214 1215 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1216 error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, 1217 ds, 1, &rseg, BUS_DMA_NOWAIT); 1218 if (error) 1219 goto out; 1220 error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1221 BUS_DMA_NOWAIT); 1222 if (error) 1223 goto dmamem_free; 1224 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1225 NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1226 if (error) 1227 goto dmamem_unmap; 1228 1229 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1230 BUS_DMASYNC_PREREAD); 1231 } else { 1232 ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1233 if (ptr == NULL) 1234 goto out; 1235 } 1236 1237 memset(&cmd, 0, sizeof(cmd)); 1238 cmd.c_data = ptr; 1239 cmd.c_datalen = datalen; 1240 cmd.c_blklen = datalen; 1241 cmd.c_arg = 0; 1242 cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1243 cmd.c_opcode = SD_APP_SEND_SCR; 1244 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1245 cmd.c_dmamap = sc->sc_dmap; 1246 1247 error = sdmmc_app_command(sc, sf, &cmd); 1248 if (error == 0) { 1249 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1250 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1251 BUS_DMASYNC_POSTREAD); 1252 } 1253 memcpy(scr, ptr, datalen); 1254 } 1255 1256 out: 1257 if (ptr != NULL) { 1258 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1259 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1260 dmamem_unmap: 1261 bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1262 dmamem_free: 1263 bus_dmamem_free(sc->sc_dmat, ds, rseg); 1264 } else { 1265 free(ptr, M_DEVBUF); 1266 } 1267 } 1268 DPRINTF(("%s: sdmem_mem_send_scr: error = %d\n", SDMMCDEVNAME(sc), 1269 error)); 1270 1271 #ifdef SDMMC_DEBUG 1272 if (error == 0) 1273 sdmmc_dump_data("SCR", scr, datalen); 1274 #endif 1275 return error; 1276 } 1277 1278 static int 1279 sdmmc_mem_decode_scr(struct sdmmc_softc *sc, struct sdmmc_function *sf) 1280 { 1281 sdmmc_response resp; 1282 int ver; 1283 1284 memset(resp, 0, sizeof(resp)); 1285 /* 1286 * Change the raw-scr received from the DMA stream to resp. 1287 */ 1288 resp[0] = be32toh(sf->raw_scr[1]) >> 8; // LSW 1289 resp[1] = be32toh(sf->raw_scr[0]); // MSW 1290 resp[0] |= (resp[1] & 0xff) << 24; 1291 resp[1] >>= 8; 1292 1293 ver = SCR_STRUCTURE(resp); 1294 sf->scr.sd_spec = SCR_SD_SPEC(resp); 1295 sf->scr.bus_width = SCR_SD_BUS_WIDTHS(resp); 1296 1297 DPRINTF(("%s: sdmmc_mem_decode_scr: %08x%08x ver=%d, spec=%d, bus width=%d\n", 1298 SDMMCDEVNAME(sc), resp[1], resp[0], 1299 ver, sf->scr.sd_spec, sf->scr.bus_width)); 1300 1301 if (ver != 0 && ver != 1) { 1302 DPRINTF(("%s: unknown structure version: %d\n", 1303 SDMMCDEVNAME(sc), ver)); 1304 return EINVAL; 1305 } 1306 return 0; 1307 } 1308 1309 static int 1310 sdmmc_mem_send_ssr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1311 sdmmc_bitfield512_t *ssr) 1312 { 1313 struct sdmmc_command cmd; 1314 bus_dma_segment_t ds[1]; 1315 void *ptr = NULL; 1316 int datalen = 64; 1317 int rseg; 1318 int error = 0; 1319 1320 /* Don't lock */ 1321 1322 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1323 error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, 1324 ds, 1, &rseg, BUS_DMA_NOWAIT); 1325 if (error) 1326 goto out; 1327 error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1328 BUS_DMA_NOWAIT); 1329 if (error) 1330 goto dmamem_free; 1331 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1332 NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1333 if (error) 1334 goto dmamem_unmap; 1335 1336 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1337 BUS_DMASYNC_PREREAD); 1338 } else { 1339 ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1340 if (ptr == NULL) 1341 goto out; 1342 } 1343 1344 memset(&cmd, 0, sizeof(cmd)); 1345 cmd.c_data = ptr; 1346 cmd.c_datalen = datalen; 1347 cmd.c_blklen = datalen; 1348 cmd.c_arg = 0; 1349 cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1350 cmd.c_opcode = SD_APP_SD_STATUS; 1351 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1352 cmd.c_dmamap = sc->sc_dmap; 1353 1354 error = sdmmc_app_command(sc, sf, &cmd); 1355 if (error == 0) { 1356 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1357 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1358 BUS_DMASYNC_POSTREAD); 1359 } 1360 memcpy(ssr, ptr, datalen); 1361 } 1362 1363 out: 1364 if (ptr != NULL) { 1365 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1366 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1367 dmamem_unmap: 1368 bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1369 dmamem_free: 1370 bus_dmamem_free(sc->sc_dmat, ds, rseg); 1371 } else { 1372 free(ptr, M_DEVBUF); 1373 } 1374 } 1375 DPRINTF(("%s: sdmem_mem_send_ssr: error = %d\n", SDMMCDEVNAME(sc), 1376 error)); 1377 1378 if (error == 0) 1379 sdmmc_be512_to_bitfield512(ssr); 1380 1381 #ifdef SDMMC_DEBUG 1382 if (error == 0) 1383 sdmmc_dump_data("SSR", ssr, datalen); 1384 #endif 1385 return error; 1386 } 1387 1388 static int 1389 sdmmc_mem_decode_ssr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1390 sdmmc_bitfield512_t *ssr_bitfield) 1391 { 1392 uint32_t *ssr = (uint32_t *)ssr_bitfield; 1393 int speed_class_val, bus_width_val; 1394 1395 const int bus_width = SSR_DAT_BUS_WIDTH(ssr); 1396 const int speed_class = SSR_SPEED_CLASS(ssr); 1397 const int uhs_speed_grade = SSR_UHS_SPEED_GRADE(ssr); 1398 const int video_speed_class = SSR_VIDEO_SPEED_CLASS(ssr); 1399 const int app_perf_class = SSR_APP_PERF_CLASS(ssr); 1400 1401 switch (speed_class) { 1402 case SSR_SPEED_CLASS_0: speed_class_val = 0; break; 1403 case SSR_SPEED_CLASS_2: speed_class_val = 2; break; 1404 case SSR_SPEED_CLASS_4: speed_class_val = 4; break; 1405 case SSR_SPEED_CLASS_6: speed_class_val = 6; break; 1406 case SSR_SPEED_CLASS_10: speed_class_val = 10; break; 1407 default: speed_class_val = -1; break; 1408 } 1409 1410 switch (bus_width) { 1411 case SSR_DAT_BUS_WIDTH_1: bus_width_val = 1; break; 1412 case SSR_DAT_BUS_WIDTH_4: bus_width_val = 4; break; 1413 default: bus_width_val = -1; 1414 } 1415 1416 /* 1417 * Log card status 1418 */ 1419 device_printf(sc->sc_dev, "SD card status:"); 1420 if (bus_width_val != -1) 1421 printf(" %d-bit", bus_width_val); 1422 else 1423 printf(" unknown bus width"); 1424 if (speed_class_val != -1) 1425 printf(", C%d", speed_class_val); 1426 if (uhs_speed_grade) 1427 printf(", U%d", uhs_speed_grade); 1428 if (video_speed_class) 1429 printf(", V%d", video_speed_class); 1430 if (app_perf_class) 1431 printf(", A%d", app_perf_class); 1432 printf("\n"); 1433 1434 return 0; 1435 } 1436 1437 static int 1438 sdmmc_mem_send_cxd_data(struct sdmmc_softc *sc, int opcode, void *data, 1439 size_t datalen) 1440 { 1441 struct sdmmc_command cmd; 1442 bus_dma_segment_t ds[1]; 1443 void *ptr = NULL; 1444 int rseg; 1445 int error = 0; 1446 1447 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1448 error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, ds, 1449 1, &rseg, BUS_DMA_NOWAIT); 1450 if (error) 1451 goto out; 1452 error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1453 BUS_DMA_NOWAIT); 1454 if (error) 1455 goto dmamem_free; 1456 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1457 NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1458 if (error) 1459 goto dmamem_unmap; 1460 1461 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1462 BUS_DMASYNC_PREREAD); 1463 } else { 1464 ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1465 if (ptr == NULL) 1466 goto out; 1467 } 1468 1469 memset(&cmd, 0, sizeof(cmd)); 1470 cmd.c_data = ptr; 1471 cmd.c_datalen = datalen; 1472 cmd.c_blklen = datalen; 1473 cmd.c_opcode = opcode; 1474 cmd.c_arg = 0; 1475 cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_SPI_R1; 1476 if (opcode == MMC_SEND_EXT_CSD) 1477 SET(cmd.c_flags, SCF_RSP_R1); 1478 else 1479 SET(cmd.c_flags, SCF_RSP_R2); 1480 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1481 cmd.c_dmamap = sc->sc_dmap; 1482 1483 error = sdmmc_mmc_command(sc, &cmd); 1484 if (error == 0) { 1485 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1486 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1487 BUS_DMASYNC_POSTREAD); 1488 } 1489 memcpy(data, ptr, datalen); 1490 #ifdef SDMMC_DEBUG 1491 sdmmc_dump_data("CXD", data, datalen); 1492 #endif 1493 } 1494 1495 out: 1496 if (ptr != NULL) { 1497 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1498 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1499 dmamem_unmap: 1500 bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1501 dmamem_free: 1502 bus_dmamem_free(sc->sc_dmat, ds, rseg); 1503 } else { 1504 free(ptr, M_DEVBUF); 1505 } 1506 } 1507 return error; 1508 } 1509 1510 static int 1511 sdmmc_set_bus_width(struct sdmmc_function *sf, int width) 1512 { 1513 struct sdmmc_softc *sc = sf->sc; 1514 struct sdmmc_command cmd; 1515 int error; 1516 1517 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 1518 return ENODEV; 1519 1520 memset(&cmd, 0, sizeof(cmd)); 1521 cmd.c_opcode = SD_APP_SET_BUS_WIDTH; 1522 cmd.c_flags = SCF_RSP_R1 | SCF_CMD_AC; 1523 1524 switch (width) { 1525 case 1: 1526 cmd.c_arg = SD_ARG_BUS_WIDTH_1; 1527 break; 1528 1529 case 4: 1530 cmd.c_arg = SD_ARG_BUS_WIDTH_4; 1531 break; 1532 1533 default: 1534 return EINVAL; 1535 } 1536 1537 error = sdmmc_app_command(sc, sf, &cmd); 1538 if (error == 0) 1539 error = sdmmc_chip_bus_width(sc->sc_sct, sc->sc_sch, width); 1540 return error; 1541 } 1542 1543 static int 1544 sdmmc_mem_sd_switch(struct sdmmc_function *sf, int mode, int group, 1545 int function, sdmmc_bitfield512_t *status) 1546 { 1547 struct sdmmc_softc *sc = sf->sc; 1548 struct sdmmc_command cmd; 1549 bus_dma_segment_t ds[1]; 1550 void *ptr = NULL; 1551 int gsft, rseg, error = 0; 1552 const int statlen = 64; 1553 1554 if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && 1555 !ISSET(sf->csd.ccc, SD_CSD_CCC_SWITCH)) 1556 return EINVAL; 1557 1558 if (group <= 0 || group > 6 || 1559 function < 0 || function > 15) 1560 return EINVAL; 1561 1562 gsft = (group - 1) << 2; 1563 1564 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1565 error = bus_dmamem_alloc(sc->sc_dmat, statlen, PAGE_SIZE, 0, ds, 1566 1, &rseg, BUS_DMA_NOWAIT); 1567 if (error) 1568 goto out; 1569 error = bus_dmamem_map(sc->sc_dmat, ds, 1, statlen, &ptr, 1570 BUS_DMA_NOWAIT); 1571 if (error) 1572 goto dmamem_free; 1573 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, statlen, 1574 NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1575 if (error) 1576 goto dmamem_unmap; 1577 1578 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, statlen, 1579 BUS_DMASYNC_PREREAD); 1580 } else { 1581 ptr = malloc(statlen, M_DEVBUF, M_NOWAIT | M_ZERO); 1582 if (ptr == NULL) 1583 goto out; 1584 } 1585 1586 memset(&cmd, 0, sizeof(cmd)); 1587 cmd.c_data = ptr; 1588 cmd.c_datalen = statlen; 1589 cmd.c_blklen = statlen; 1590 cmd.c_opcode = SD_SEND_SWITCH_FUNC; 1591 cmd.c_arg = 1592 (!!mode << 31) | (function << gsft) | (0x00ffffff & ~(0xf << gsft)); 1593 cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1594 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1595 cmd.c_dmamap = sc->sc_dmap; 1596 1597 error = sdmmc_mmc_command(sc, &cmd); 1598 if (error == 0) { 1599 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1600 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, statlen, 1601 BUS_DMASYNC_POSTREAD); 1602 } 1603 memcpy(status, ptr, statlen); 1604 } 1605 1606 out: 1607 if (ptr != NULL) { 1608 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1609 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1610 dmamem_unmap: 1611 bus_dmamem_unmap(sc->sc_dmat, ptr, statlen); 1612 dmamem_free: 1613 bus_dmamem_free(sc->sc_dmat, ds, rseg); 1614 } else { 1615 free(ptr, M_DEVBUF); 1616 } 1617 } 1618 1619 if (error == 0) 1620 sdmmc_be512_to_bitfield512(status); 1621 1622 return error; 1623 } 1624 1625 static int 1626 sdmmc_mem_mmc_switch(struct sdmmc_function *sf, uint8_t set, uint8_t index, 1627 uint8_t value, bool poll) 1628 { 1629 struct sdmmc_softc *sc = sf->sc; 1630 struct sdmmc_command cmd; 1631 int error; 1632 1633 memset(&cmd, 0, sizeof(cmd)); 1634 cmd.c_opcode = MMC_SWITCH; 1635 cmd.c_arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | 1636 (index << 16) | (value << 8) | set; 1637 cmd.c_flags = SCF_RSP_SPI_R1B | SCF_RSP_R1B | SCF_CMD_AC; 1638 1639 if (poll) 1640 cmd.c_flags |= SCF_POLL; 1641 1642 error = sdmmc_mmc_command(sc, &cmd); 1643 if (error) 1644 return error; 1645 1646 if (index == EXT_CSD_FLUSH_CACHE || (index == EXT_CSD_HS_TIMING && value >= 2)) { 1647 do { 1648 memset(&cmd, 0, sizeof(cmd)); 1649 cmd.c_opcode = MMC_SEND_STATUS; 1650 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 1651 cmd.c_arg = MMC_ARG_RCA(sf->rca); 1652 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 1653 if (poll) 1654 cmd.c_flags |= SCF_POLL; 1655 error = sdmmc_mmc_command(sc, &cmd); 1656 if (error) 1657 break; 1658 if (ISSET(MMC_R1(cmd.c_resp), MMC_R1_SWITCH_ERROR)) { 1659 aprint_error_dev(sc->sc_dev, "switch error\n"); 1660 return EINVAL; 1661 } 1662 /* XXX time out */ 1663 } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 1664 1665 if (error) { 1666 aprint_error_dev(sc->sc_dev, 1667 "error waiting for data ready after switch command: %d\n", 1668 error); 1669 return error; 1670 } 1671 } 1672 1673 return 0; 1674 } 1675 1676 /* 1677 * SPI mode function 1678 */ 1679 static int 1680 sdmmc_mem_spi_read_ocr(struct sdmmc_softc *sc, uint32_t hcs, uint32_t *card_ocr) 1681 { 1682 struct sdmmc_command cmd; 1683 int error; 1684 1685 memset(&cmd, 0, sizeof(cmd)); 1686 cmd.c_opcode = MMC_READ_OCR; 1687 cmd.c_arg = hcs ? MMC_OCR_HCS : 0; 1688 cmd.c_flags = SCF_RSP_SPI_R3; 1689 1690 error = sdmmc_mmc_command(sc, &cmd); 1691 if (error == 0 && card_ocr != NULL) 1692 *card_ocr = cmd.c_resp[1]; 1693 DPRINTF(("%s: sdmmc_mem_spi_read_ocr: error=%d, ocr=%#x\n", 1694 SDMMCDEVNAME(sc), error, cmd.c_resp[1])); 1695 return error; 1696 } 1697 1698 /* 1699 * read/write function 1700 */ 1701 /* read */ 1702 static int 1703 sdmmc_mem_single_read_block(struct sdmmc_function *sf, uint32_t blkno, 1704 u_char *data, size_t datalen) 1705 { 1706 struct sdmmc_softc *sc = sf->sc; 1707 int error = 0; 1708 int i; 1709 1710 KASSERT((datalen % SDMMC_SECTOR_SIZE) == 0); 1711 KASSERT(!ISSET(sc->sc_caps, SMC_CAPS_DMA)); 1712 1713 for (i = 0; i < datalen / SDMMC_SECTOR_SIZE; i++) { 1714 error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno + i, 1715 data + i * SDMMC_SECTOR_SIZE, SDMMC_SECTOR_SIZE); 1716 if (error) 1717 break; 1718 } 1719 return error; 1720 } 1721 1722 /* 1723 * Simulate multi-segment dma transfer. 1724 */ 1725 static int 1726 sdmmc_mem_single_segment_dma_read_block(struct sdmmc_function *sf, 1727 uint32_t blkno, u_char *data, size_t datalen) 1728 { 1729 struct sdmmc_softc *sc = sf->sc; 1730 bool use_bbuf = false; 1731 int error = 0; 1732 int i; 1733 1734 for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 1735 size_t len = sc->sc_dmap->dm_segs[i].ds_len; 1736 if ((len % SDMMC_SECTOR_SIZE) != 0) { 1737 use_bbuf = true; 1738 break; 1739 } 1740 } 1741 if (use_bbuf) { 1742 bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 1743 BUS_DMASYNC_PREREAD); 1744 1745 error = sdmmc_mem_read_block_subr(sf, sf->bbuf_dmap, 1746 blkno, data, datalen); 1747 if (error) { 1748 bus_dmamap_unload(sc->sc_dmat, sf->bbuf_dmap); 1749 return error; 1750 } 1751 1752 bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 1753 BUS_DMASYNC_POSTREAD); 1754 1755 /* Copy from bounce buffer */ 1756 memcpy(data, sf->bbuf, datalen); 1757 1758 return 0; 1759 } 1760 1761 for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 1762 size_t len = sc->sc_dmap->dm_segs[i].ds_len; 1763 1764 error = bus_dmamap_load(sc->sc_dmat, sf->sseg_dmap, 1765 data, len, NULL, BUS_DMA_NOWAIT|BUS_DMA_READ); 1766 if (error) 1767 return error; 1768 1769 bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 1770 BUS_DMASYNC_PREREAD); 1771 1772 error = sdmmc_mem_read_block_subr(sf, sf->sseg_dmap, 1773 blkno, data, len); 1774 if (error) { 1775 bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 1776 return error; 1777 } 1778 1779 bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 1780 BUS_DMASYNC_POSTREAD); 1781 1782 bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 1783 1784 blkno += len / SDMMC_SECTOR_SIZE; 1785 data += len; 1786 } 1787 return 0; 1788 } 1789 1790 static int 1791 sdmmc_mem_read_block_subr(struct sdmmc_function *sf, bus_dmamap_t dmap, 1792 uint32_t blkno, u_char *data, size_t datalen) 1793 { 1794 struct sdmmc_softc *sc = sf->sc; 1795 struct sdmmc_command cmd; 1796 int error; 1797 1798 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1799 error = sdmmc_select_card(sc, sf); 1800 if (error) 1801 goto out; 1802 } 1803 1804 memset(&cmd, 0, sizeof(cmd)); 1805 cmd.c_data = data; 1806 cmd.c_datalen = datalen; 1807 cmd.c_blklen = SDMMC_SECTOR_SIZE; 1808 cmd.c_opcode = (cmd.c_datalen / cmd.c_blklen) > 1 ? 1809 MMC_READ_BLOCK_MULTIPLE : MMC_READ_BLOCK_SINGLE; 1810 cmd.c_arg = blkno; 1811 if (!ISSET(sf->flags, SFF_SDHC)) 1812 cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 1813 cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1814 if (ISSET(sf->flags, SFF_SDHC)) 1815 cmd.c_flags |= SCF_XFER_SDHC; 1816 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1817 cmd.c_dmamap = dmap; 1818 1819 sc->sc_ev_xfer.ev_count++; 1820 1821 error = sdmmc_mmc_command(sc, &cmd); 1822 if (error) { 1823 sc->sc_ev_xfer_error.ev_count++; 1824 goto out; 1825 } 1826 1827 const u_int counter = __builtin_ctz(cmd.c_datalen); 1828 if (counter >= 9 && counter <= 16) { 1829 sc->sc_ev_xfer_aligned[counter - 9].ev_count++; 1830 } else { 1831 sc->sc_ev_xfer_unaligned.ev_count++; 1832 } 1833 1834 if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) { 1835 if (cmd.c_opcode == MMC_READ_BLOCK_MULTIPLE) { 1836 memset(&cmd, 0, sizeof cmd); 1837 cmd.c_opcode = MMC_STOP_TRANSMISSION; 1838 cmd.c_arg = MMC_ARG_RCA(sf->rca); 1839 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B | SCF_RSP_SPI_R1B; 1840 error = sdmmc_mmc_command(sc, &cmd); 1841 if (error) 1842 goto out; 1843 } 1844 } 1845 1846 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1847 do { 1848 memset(&cmd, 0, sizeof(cmd)); 1849 cmd.c_opcode = MMC_SEND_STATUS; 1850 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 1851 cmd.c_arg = MMC_ARG_RCA(sf->rca); 1852 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 1853 error = sdmmc_mmc_command(sc, &cmd); 1854 if (error) 1855 break; 1856 /* XXX time out */ 1857 } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 1858 } 1859 1860 out: 1861 return error; 1862 } 1863 1864 int 1865 sdmmc_mem_read_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data, 1866 size_t datalen) 1867 { 1868 struct sdmmc_softc *sc = sf->sc; 1869 int error; 1870 1871 SDMMC_LOCK(sc); 1872 mutex_enter(&sc->sc_mtx); 1873 1874 if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) { 1875 error = sdmmc_mem_single_read_block(sf, blkno, data, datalen); 1876 goto out; 1877 } 1878 1879 if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1880 error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno, data, 1881 datalen); 1882 goto out; 1883 } 1884 1885 /* DMA transfer */ 1886 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, data, datalen, NULL, 1887 BUS_DMA_NOWAIT|BUS_DMA_READ); 1888 if (error) 1889 goto out; 1890 1891 #ifdef SDMMC_DEBUG 1892 printf("data=%p, datalen=%zu\n", data, datalen); 1893 for (int i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 1894 printf("seg#%d: addr=%#lx, size=%#lx\n", i, 1895 (u_long)sc->sc_dmap->dm_segs[i].ds_addr, 1896 (u_long)sc->sc_dmap->dm_segs[i].ds_len); 1897 } 1898 #endif 1899 1900 if (sc->sc_dmap->dm_nsegs > 1 1901 && !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) { 1902 error = sdmmc_mem_single_segment_dma_read_block(sf, blkno, 1903 data, datalen); 1904 goto unload; 1905 } 1906 1907 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1908 BUS_DMASYNC_PREREAD); 1909 1910 error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno, data, 1911 datalen); 1912 if (error) 1913 goto unload; 1914 1915 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1916 BUS_DMASYNC_POSTREAD); 1917 unload: 1918 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1919 1920 out: 1921 mutex_exit(&sc->sc_mtx); 1922 SDMMC_UNLOCK(sc); 1923 1924 return error; 1925 } 1926 1927 /* write */ 1928 static int 1929 sdmmc_mem_single_write_block(struct sdmmc_function *sf, uint32_t blkno, 1930 u_char *data, size_t datalen) 1931 { 1932 struct sdmmc_softc *sc = sf->sc; 1933 int error = 0; 1934 int i; 1935 1936 KASSERT((datalen % SDMMC_SECTOR_SIZE) == 0); 1937 KASSERT(!ISSET(sc->sc_caps, SMC_CAPS_DMA)); 1938 1939 for (i = 0; i < datalen / SDMMC_SECTOR_SIZE; i++) { 1940 error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno + i, 1941 data + i * SDMMC_SECTOR_SIZE, SDMMC_SECTOR_SIZE); 1942 if (error) 1943 break; 1944 } 1945 return error; 1946 } 1947 1948 /* 1949 * Simulate multi-segment dma transfer. 1950 */ 1951 static int 1952 sdmmc_mem_single_segment_dma_write_block(struct sdmmc_function *sf, 1953 uint32_t blkno, u_char *data, size_t datalen) 1954 { 1955 struct sdmmc_softc *sc = sf->sc; 1956 bool use_bbuf = false; 1957 int error = 0; 1958 int i; 1959 1960 for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 1961 size_t len = sc->sc_dmap->dm_segs[i].ds_len; 1962 if ((len % SDMMC_SECTOR_SIZE) != 0) { 1963 use_bbuf = true; 1964 break; 1965 } 1966 } 1967 if (use_bbuf) { 1968 /* Copy to bounce buffer */ 1969 memcpy(sf->bbuf, data, datalen); 1970 1971 bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 1972 BUS_DMASYNC_PREWRITE); 1973 1974 error = sdmmc_mem_write_block_subr(sf, sf->bbuf_dmap, 1975 blkno, data, datalen); 1976 if (error) { 1977 bus_dmamap_unload(sc->sc_dmat, sf->bbuf_dmap); 1978 return error; 1979 } 1980 1981 bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 1982 BUS_DMASYNC_POSTWRITE); 1983 1984 return 0; 1985 } 1986 1987 for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 1988 size_t len = sc->sc_dmap->dm_segs[i].ds_len; 1989 1990 error = bus_dmamap_load(sc->sc_dmat, sf->sseg_dmap, 1991 data, len, NULL, BUS_DMA_NOWAIT|BUS_DMA_WRITE); 1992 if (error) 1993 return error; 1994 1995 bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 1996 BUS_DMASYNC_PREWRITE); 1997 1998 error = sdmmc_mem_write_block_subr(sf, sf->sseg_dmap, 1999 blkno, data, len); 2000 if (error) { 2001 bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2002 return error; 2003 } 2004 2005 bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 2006 BUS_DMASYNC_POSTWRITE); 2007 2008 bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2009 2010 blkno += len / SDMMC_SECTOR_SIZE; 2011 data += len; 2012 } 2013 2014 return error; 2015 } 2016 2017 static int 2018 sdmmc_mem_write_block_subr(struct sdmmc_function *sf, bus_dmamap_t dmap, 2019 uint32_t blkno, u_char *data, size_t datalen) 2020 { 2021 struct sdmmc_softc *sc = sf->sc; 2022 struct sdmmc_command cmd; 2023 int error; 2024 2025 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2026 error = sdmmc_select_card(sc, sf); 2027 if (error) 2028 goto out; 2029 } 2030 2031 const int nblk = howmany(datalen, SDMMC_SECTOR_SIZE); 2032 if (ISSET(sc->sc_flags, SMF_SD_MODE) && nblk > 1) { 2033 /* Set the number of write blocks to be pre-erased */ 2034 memset(&cmd, 0, sizeof(cmd)); 2035 cmd.c_opcode = SD_APP_SET_WR_BLK_ERASE_COUNT; 2036 cmd.c_flags = SCF_RSP_R1 | SCF_RSP_SPI_R1 | SCF_CMD_AC; 2037 cmd.c_arg = nblk; 2038 error = sdmmc_app_command(sc, sf, &cmd); 2039 if (error) 2040 goto out; 2041 } 2042 2043 memset(&cmd, 0, sizeof(cmd)); 2044 cmd.c_data = data; 2045 cmd.c_datalen = datalen; 2046 cmd.c_blklen = SDMMC_SECTOR_SIZE; 2047 cmd.c_opcode = (cmd.c_datalen / cmd.c_blklen) > 1 ? 2048 MMC_WRITE_BLOCK_MULTIPLE : MMC_WRITE_BLOCK_SINGLE; 2049 cmd.c_arg = blkno; 2050 if (!ISSET(sf->flags, SFF_SDHC)) 2051 cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2052 cmd.c_flags = SCF_CMD_ADTC | SCF_RSP_R1; 2053 if (ISSET(sf->flags, SFF_SDHC)) 2054 cmd.c_flags |= SCF_XFER_SDHC; 2055 if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 2056 cmd.c_dmamap = dmap; 2057 2058 sc->sc_ev_xfer.ev_count++; 2059 2060 error = sdmmc_mmc_command(sc, &cmd); 2061 if (error) { 2062 sc->sc_ev_xfer_error.ev_count++; 2063 goto out; 2064 } 2065 2066 const u_int counter = __builtin_ctz(cmd.c_datalen); 2067 if (counter >= 9 && counter <= 16) { 2068 sc->sc_ev_xfer_aligned[counter - 9].ev_count++; 2069 } else { 2070 sc->sc_ev_xfer_unaligned.ev_count++; 2071 } 2072 2073 if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) { 2074 if (cmd.c_opcode == MMC_WRITE_BLOCK_MULTIPLE) { 2075 memset(&cmd, 0, sizeof(cmd)); 2076 cmd.c_opcode = MMC_STOP_TRANSMISSION; 2077 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B | SCF_RSP_SPI_R1B; 2078 error = sdmmc_mmc_command(sc, &cmd); 2079 if (error) 2080 goto out; 2081 } 2082 } 2083 2084 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2085 do { 2086 memset(&cmd, 0, sizeof(cmd)); 2087 cmd.c_opcode = MMC_SEND_STATUS; 2088 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 2089 cmd.c_arg = MMC_ARG_RCA(sf->rca); 2090 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 2091 error = sdmmc_mmc_command(sc, &cmd); 2092 if (error) 2093 break; 2094 /* XXX time out */ 2095 } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 2096 } 2097 2098 out: 2099 return error; 2100 } 2101 2102 int 2103 sdmmc_mem_write_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data, 2104 size_t datalen) 2105 { 2106 struct sdmmc_softc *sc = sf->sc; 2107 int error; 2108 2109 SDMMC_LOCK(sc); 2110 mutex_enter(&sc->sc_mtx); 2111 2112 if (sdmmc_chip_write_protect(sc->sc_sct, sc->sc_sch)) { 2113 aprint_normal_dev(sc->sc_dev, "write-protected\n"); 2114 error = EIO; 2115 goto out; 2116 } 2117 2118 if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) { 2119 error = sdmmc_mem_single_write_block(sf, blkno, data, datalen); 2120 goto out; 2121 } 2122 2123 if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 2124 error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data, 2125 datalen); 2126 goto out; 2127 } 2128 2129 /* DMA transfer */ 2130 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, data, datalen, NULL, 2131 BUS_DMA_NOWAIT|BUS_DMA_WRITE); 2132 if (error) 2133 goto out; 2134 2135 #ifdef SDMMC_DEBUG 2136 aprint_normal_dev(sc->sc_dev, "%s: data=%p, datalen=%zu\n", 2137 __func__, data, datalen); 2138 for (int i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2139 aprint_normal_dev(sc->sc_dev, 2140 "%s: seg#%d: addr=%#lx, size=%#lx\n", __func__, i, 2141 (u_long)sc->sc_dmap->dm_segs[i].ds_addr, 2142 (u_long)sc->sc_dmap->dm_segs[i].ds_len); 2143 } 2144 #endif 2145 2146 if (sc->sc_dmap->dm_nsegs > 1 2147 && !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) { 2148 error = sdmmc_mem_single_segment_dma_write_block(sf, blkno, 2149 data, datalen); 2150 goto unload; 2151 } 2152 2153 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2154 BUS_DMASYNC_PREWRITE); 2155 2156 error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data, 2157 datalen); 2158 if (error) 2159 goto unload; 2160 2161 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2162 BUS_DMASYNC_POSTWRITE); 2163 unload: 2164 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 2165 2166 out: 2167 mutex_exit(&sc->sc_mtx); 2168 SDMMC_UNLOCK(sc); 2169 2170 return error; 2171 } 2172 2173 int 2174 sdmmc_mem_discard(struct sdmmc_function *sf, uint32_t sblkno, uint32_t eblkno) 2175 { 2176 struct sdmmc_softc *sc = sf->sc; 2177 struct sdmmc_command cmd; 2178 int error; 2179 2180 if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 2181 return ENODEV; /* XXX not tested */ 2182 2183 if (eblkno < sblkno) 2184 return EINVAL; 2185 2186 SDMMC_LOCK(sc); 2187 mutex_enter(&sc->sc_mtx); 2188 2189 /* Set the address of the first write block to be erased */ 2190 memset(&cmd, 0, sizeof(cmd)); 2191 cmd.c_opcode = ISSET(sc->sc_flags, SMF_SD_MODE) ? 2192 SD_ERASE_WR_BLK_START : MMC_TAG_ERASE_GROUP_START; 2193 cmd.c_arg = sblkno; 2194 if (!ISSET(sf->flags, SFF_SDHC)) 2195 cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2196 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 2197 error = sdmmc_mmc_command(sc, &cmd); 2198 if (error) 2199 goto out; 2200 2201 /* Set the address of the last write block to be erased */ 2202 memset(&cmd, 0, sizeof(cmd)); 2203 cmd.c_opcode = ISSET(sc->sc_flags, SMF_SD_MODE) ? 2204 SD_ERASE_WR_BLK_END : MMC_TAG_ERASE_GROUP_END; 2205 cmd.c_arg = eblkno; 2206 if (!ISSET(sf->flags, SFF_SDHC)) 2207 cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2208 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 2209 error = sdmmc_mmc_command(sc, &cmd); 2210 if (error) 2211 goto out; 2212 2213 /* Start the erase operation */ 2214 memset(&cmd, 0, sizeof(cmd)); 2215 cmd.c_opcode = MMC_ERASE; 2216 cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B; 2217 error = sdmmc_mmc_command(sc, &cmd); 2218 if (error) 2219 goto out; 2220 2221 out: 2222 mutex_exit(&sc->sc_mtx); 2223 SDMMC_UNLOCK(sc); 2224 2225 #ifdef SDMMC_DEBUG 2226 device_printf(sc->sc_dev, "discard blk %u-%u error %d\n", 2227 sblkno, eblkno, error); 2228 #endif 2229 2230 return error; 2231 } 2232 2233 int 2234 sdmmc_mem_flush_cache(struct sdmmc_function *sf, bool poll) 2235 { 2236 struct sdmmc_softc *sc = sf->sc; 2237 int error; 2238 2239 if (!ISSET(sf->flags, SFF_CACHE_ENABLED)) 2240 return 0; 2241 2242 SDMMC_LOCK(sc); 2243 mutex_enter(&sc->sc_mtx); 2244 2245 error = sdmmc_mem_mmc_switch(sf, 2246 EXT_CSD_CMD_SET_NORMAL, EXT_CSD_FLUSH_CACHE, 2247 EXT_CSD_FLUSH_CACHE_FLUSH, poll); 2248 2249 mutex_exit(&sc->sc_mtx); 2250 SDMMC_UNLOCK(sc); 2251 2252 #ifdef SDMMC_DEBUG 2253 device_printf(sc->sc_dev, "mmc flush cache error %d\n", error); 2254 #endif 2255 2256 return error; 2257 } 2258