Lines Matching +full:spi +full:- +full:max +full:- +full:frequency

5  * eMMC emulation defined in "JEDEC Standard No. 84-A43"
9 * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
40 #include "system/block-backend.h"
45 #include "hw/qdev-properties.h"
46 #include "hw/qdev-properties-system.h"
47 #include "qemu/error-report.h"
50 #include "qemu/guest-random.h"
52 #include "sdmmc-internal.h"
69 sd_r1b = -1,
70 sd_illegal = -2,
75 sd_bc, /* broadcast -- no response */
77 sd_ac, /* addressed -- no data transfer */
88 sd_waitirq_state = -2, /* emmc */
89 sd_inactive_state = -1,
187 return sd->proto == &sd_proto_spi; in sd_is_spi()
192 return sd->proto == &sd_proto_emmc; in sd_is_emmc()
228 [sd_bus_test_state] = "bus-test", in sd_state_name()
239 return "wait-irq"; in sd_state_name()
272 const SDProto *sdp = sd->proto; in sd_cmd_name()
274 if (sdp->cmd[cmd].handler) { in sd_cmd_name()
276 return sdp->cmd[cmd].name; in sd_cmd_name()
283 const SDProto *sdp = sd->proto; in sd_acmd_name()
285 if (sdp->acmd[cmd].handler) { in sd_acmd_name()
286 return sdp->acmd[cmd].name; in sd_acmd_name()
294 return sd->dat_lines; in sd_get_dat_lines()
299 return sd->cmd_line; in sd_get_cmd_line()
318 switch (sd->state) { in sd_set_mode()
320 sd->mode = sd_inactive; in sd_set_mode()
326 sd->mode = sd_card_identification_mode; in sd_set_mode()
335 sd->mode = sd_data_transfer_mode; in sd_set_mode()
347 for (bit = 7; bit >= 0; bit --) { in sd_crc7()
364 FIELD(OCR, ACCEPT_SWITCH_1V8, 24, 1) /* Only UHS-I */
365 FIELD(OCR, UHS_II_CARD, 29, 1) /* Only UHS-II */
381 assert(!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)); in sd_ocr_powerup()
383 /* card power-up OK */ in sd_ocr_powerup()
384 sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_POWER_UP, 1); in sd_ocr_powerup()
386 if (sd->size > SDSC_MAX_CAPACITY) { in sd_ocr_powerup()
387 sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1); in sd_ocr_powerup()
394 sd->ocr = R_OCR_VDD_VOLTAGE_WIN_HI_MASK; in sd_set_ocr()
398 * We don't need to emulate power up sequence in SPI-mode. in sd_set_ocr()
411 sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */ in sd_set_scr()
412 if (sd->spec_version == SD_PHY_SPECv1_10_VERS) { in sd_set_scr()
413 sd->scr[0] |= 1; /* Spec Version 1.10 */ in sd_set_scr()
415 sd->scr[0] |= 2; /* Spec Version 2.00 or Version 3.0X */ in sd_set_scr()
417 sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */ in sd_set_scr()
418 | 0b0101; /* 1-bit or 4-bit width bus modes */ in sd_set_scr()
419 sd->scr[2] = 0x00; /* Extended Security is not supported. */ in sd_set_scr()
420 if (sd->spec_version >= SD_PHY_SPECv3_01_VERS) { in sd_set_scr()
421 sd->scr[2] |= 1 << 7; /* Spec Version 3.0X */ in sd_set_scr()
423 sd->scr[3] = 0x00; in sd_set_scr()
425 sd->scr[4] = 0x00; in sd_set_scr()
426 sd->scr[5] = 0x00; in sd_set_scr()
427 sd->scr[6] = 0x00; in sd_set_scr()
428 sd->scr[7] = 0x00; in sd_set_scr()
442 sd->cid[0] = MID; /* Fake card manufacturer ID (MID) */ in sd_set_cid()
443 sd->cid[1] = OID[0]; /* OEM/Application ID (OID) */ in sd_set_cid()
444 sd->cid[2] = OID[1]; in sd_set_cid()
445 sd->cid[3] = PNM[0]; /* Fake product name (PNM) */ in sd_set_cid()
446 sd->cid[4] = PNM[1]; in sd_set_cid()
447 sd->cid[5] = PNM[2]; in sd_set_cid()
448 sd->cid[6] = PNM[3]; in sd_set_cid()
449 sd->cid[7] = PNM[4]; in sd_set_cid()
450 sd->cid[8] = PRV; /* Fake product revision (PRV) */ in sd_set_cid()
451 stl_be_p(&sd->cid[9], 0xdeadbeef); /* Fake serial number (PSN) */ in sd_set_cid()
452 sd->cid[13] = 0x00 | /* Manufacture date (MDT) */ in sd_set_cid()
453 ((MDT_YR - 2000) / 10); in sd_set_cid()
454 sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON; in sd_set_cid()
455 sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1; in sd_set_cid()
460 sd->cid[0] = MID; /* Fake card manufacturer ID (MID) */ in emmc_set_cid()
461 sd->cid[1] = 0b01; /* CBX: soldered BGA */ in emmc_set_cid()
462 sd->cid[2] = OID[0]; /* OEM/Application ID (OID) */ in emmc_set_cid()
463 sd->cid[3] = PNM[0]; /* Fake product name (PNM) */ in emmc_set_cid()
464 sd->cid[4] = PNM[1]; in emmc_set_cid()
465 sd->cid[5] = PNM[2]; in emmc_set_cid()
466 sd->cid[6] = PNM[3]; in emmc_set_cid()
467 sd->cid[7] = PNM[4]; in emmc_set_cid()
468 sd->cid[8] = PNM[4]; in emmc_set_cid()
469 sd->cid[9] = PRV; /* Fake product revision (PRV) */ in emmc_set_cid()
470 stl_be_p(&sd->cid[10], 0xdeadbeef); /* Fake serial number (PSN) */ in emmc_set_cid()
471 sd->cid[14] = (MDT_MON << 4) | (MDT_YR - 1997); /* Manufacture date (MDT) */ in emmc_set_cid()
472 sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1; in emmc_set_cid()
475 /* Card-Specific Data register */
492 memset(sd->ext_csd, 0, sizeof(sd->ext_csd)); /* FIXME only RW at reset */ in emmc_set_ext_csd()
495 sd->ext_csd[EXT_CSD_S_CMD_SET] = 0b1; /* supported command sets */ in emmc_set_ext_csd()
496 sd->ext_csd[EXT_CSD_BOOT_INFO] = 0x0; /* Boot information */ in emmc_set_ext_csd()
498 sd->ext_csd[EXT_CSD_BOOT_MULT] = sd->boot_part_size / (128 * KiB); in emmc_set_ext_csd()
499 sd->ext_csd[EXT_CSD_ACC_SIZE] = 0x1; /* Access size */ in emmc_set_ext_csd()
500 sd->ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] = 0x01; /* HC Erase unit size */ in emmc_set_ext_csd()
501 sd->ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] = 0x01; /* HC erase timeout */ in emmc_set_ext_csd()
502 sd->ext_csd[EXT_CSD_REL_WR_SEC_C] = 0x1; /* Reliable write sector count */ in emmc_set_ext_csd()
503 sd->ext_csd[EXT_CSD_HC_WP_GRP_SIZE] = 0x01; /* HC write protect group size */ in emmc_set_ext_csd()
504 sd->ext_csd[EXT_CSD_S_C_VCC] = 0x01; /* Sleep current VCC */ in emmc_set_ext_csd()
505 sd->ext_csd[EXT_CSD_S_C_VCCQ] = 0x01; /* Sleep current VCCQ */ in emmc_set_ext_csd()
506 sd->ext_csd[EXT_CSD_S_A_TIMEOUT] = 0x01; /* Sleep/Awake timeout */ in emmc_set_ext_csd()
507 stl_le_p(&sd->ext_csd[EXT_CSD_SEC_CNT], sectcount); /* Sector count */ in emmc_set_ext_csd()
508 sd->ext_csd[210] = 0x46; /* Min write perf for 8bit@52Mhz */ in emmc_set_ext_csd()
509 sd->ext_csd[209] = 0x46; /* Min read perf for 8bit@52Mhz */ in emmc_set_ext_csd()
510 sd->ext_csd[208] = 0x46; /* Min write perf for 4bit@52Mhz */ in emmc_set_ext_csd()
511 sd->ext_csd[207] = 0x46; /* Min read perf for 4bit@52Mhz */ in emmc_set_ext_csd()
512 sd->ext_csd[206] = 0x46; /* Min write perf for 4bit@26Mhz */ in emmc_set_ext_csd()
513 sd->ext_csd[205] = 0x46; /* Min read perf for 4bit@26Mhz */ in emmc_set_ext_csd()
514 sd->ext_csd[EXT_CSD_CARD_TYPE] = 0b11; in emmc_set_ext_csd()
515 sd->ext_csd[EXT_CSD_STRUCTURE] = 2; in emmc_set_ext_csd()
516 sd->ext_csd[EXT_CSD_REV] = 3; in emmc_set_ext_csd()
519 sd->ext_csd[EXT_CSD_PART_CONFIG] = sd->boot_config; in emmc_set_ext_csd()
525 uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1; in emmc_set_csd()
526 uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1; in emmc_set_csd()
528 sd->csd[0] = (3 << 6) | (4 << 2); /* Spec v4.3 with EXT_CSD */ in emmc_set_csd()
529 sd->csd[1] = (1 << 3) | 6; /* Asynchronous data access time: 1ms */ in emmc_set_csd()
530 sd->csd[2] = 0x00; in emmc_set_csd()
531 sd->csd[3] = (1 << 3) | 3;; /* Maximum bus clock frequency: 100MHz */ in emmc_set_csd()
532 sd->csd[4] = 0x0f; in emmc_set_csd()
535 uint32_t csize1k = (size >> (CMULT_SHIFT + 10)) - 1; in emmc_set_csd()
536 sd->csd[5] = 0x5a; in emmc_set_csd()
537 sd->csd[6] = 0x80 | ((csize1k >> 10) & 0xf); in emmc_set_csd()
538 sd->csd[7] = (csize1k >> 2) & 0xff; in emmc_set_csd()
540 sd->csd[5] = 0x59; in emmc_set_csd()
541 sd->csd[6] = 0x8f; in emmc_set_csd()
542 sd->csd[7] = 0xff; in emmc_set_csd()
543 sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1); in emmc_set_csd()
545 sd->csd[8] = 0xff; in emmc_set_csd()
546 sd->csd[9] = 0xfc | /* Max. write current */ in emmc_set_csd()
547 ((CMULT_SHIFT - 2) >> 1); in emmc_set_csd()
548 sd->csd[10] = 0x40 | /* Erase sector size */ in emmc_set_csd()
549 (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1); in emmc_set_csd()
550 sd->csd[11] = 0x00 | /* Write protect group size */ in emmc_set_csd()
552 sd->csd[12] = 0x90 | /* Write speed factor */ in emmc_set_csd()
554 sd->csd[13] = 0x20 | /* Max. write data block length */ in emmc_set_csd()
556 sd->csd[14] = 0x00; in emmc_set_csd()
557 sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1; in emmc_set_csd()
565 uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1; in sd_set_csd()
566 uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1; in sd_set_csd()
572 csize = (size >> (CMULT_SHIFT + hwblock_shift)) - 1; in sd_set_csd()
575 sd->csd[0] = 0x00; /* CSD structure */ in sd_set_csd()
576 sd->csd[1] = 0x26; /* Data read access-time-1 */ in sd_set_csd()
577 sd->csd[2] = 0x00; /* Data read access-time-2 */ in sd_set_csd()
578 sd->csd[3] = 0x32; /* Max. data transfer rate: 25 MHz */ in sd_set_csd()
579 sd->csd[4] = 0x5f; /* Card Command Classes */ in sd_set_csd()
580 sd->csd[5] = 0x50 | /* Max. read data block length */ in sd_set_csd()
582 sd->csd[6] = 0xe0 | /* Partial block for read allowed */ in sd_set_csd()
584 sd->csd[7] = 0x00 | /* Device size */ in sd_set_csd()
586 sd->csd[8] = 0x3f | /* Max. read current */ in sd_set_csd()
588 sd->csd[9] = 0xfc | /* Max. write current */ in sd_set_csd()
589 ((CMULT_SHIFT - 2) >> 1); in sd_set_csd()
590 sd->csd[10] = 0x40 | /* Erase sector size */ in sd_set_csd()
591 (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1); in sd_set_csd()
592 sd->csd[11] = 0x00 | /* Write protect group size */ in sd_set_csd()
594 sd->csd[12] = 0x90 | /* Write speed factor */ in sd_set_csd()
596 sd->csd[13] = 0x20 | /* Max. write data block length */ in sd_set_csd()
598 sd->csd[14] = 0x00; /* File format group */ in sd_set_csd()
601 size -= 1; in sd_set_csd()
602 sd->csd[0] = 0x40; in sd_set_csd()
603 sd->csd[1] = 0x0e; in sd_set_csd()
604 sd->csd[2] = 0x00; in sd_set_csd()
605 sd->csd[3] = 0x32; in sd_set_csd()
606 sd->csd[4] = 0x5b; in sd_set_csd()
607 sd->csd[5] = 0x59; in sd_set_csd()
608 sd->csd[6] = 0x00; in sd_set_csd()
609 st24_be_p(&sd->csd[7], size); in sd_set_csd()
610 sd->csd[10] = 0x7f; in sd_set_csd()
611 sd->csd[11] = 0x80; in sd_set_csd()
612 sd->csd[12] = 0x0a; in sd_set_csd()
613 sd->csd[13] = 0x40; in sd_set_csd()
614 sd->csd[14] = 0x00; in sd_set_csd()
616 sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1; in sd_set_csd()
624 sd->rca = value; in sd_set_rca()
629 switch (s->proto->cmd[req.cmd].type) { in sd_req_get_rca()
641 return sd_req_get_rca(s, req) == s->rca; in sd_req_rca_same()
700 sd->card_status = READY_FOR_DATA; in sd_set_cardstatus()
705 memset(sd->sd_status, 0, 64); in sd_set_sdstatus()
711 * Table 4-2.
726 buffer[0] = 0x40 | req->cmd; in sd_req_crc_validate()
727 stl_be_p(&buffer[1], req->arg); in sd_req_crc_validate()
729 return sd_crc7(buffer, 5) != req->crc; /* TODO */ in sd_req_crc_validate()
734 stl_be_p(response, sd->card_status); in sd_response_r1_make()
737 sd->card_status &= ~CARD_STATUS_C; in sd_response_r1_make()
742 stl_be_p(response, sd->ocr & ACMD41_R3_MASK); in sd_response_r3_make()
749 status = ((sd->card_status >> 8) & 0xc000) | in sd_response_r6_make()
750 ((sd->card_status >> 6) & 0x2000) | in sd_response_r6_make()
751 (sd->card_status & 0x1fff); in sd_response_r6_make()
752 sd->card_status &= ~(CARD_STATUS_C & 0xc81fff); in sd_response_r6_make()
753 stw_be_p(response + 0, sd->rca); in sd_response_r6_make()
759 stl_be_p(response, sd->vhs); in sd_response_r7_make()
764 if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) { in sd_blk_len()
767 return sd->blk_len; in sd_blk_len()
772 * beginning of it. The size of the boot partitions is the "boot-size"
779 if (!sd->boot_part_size || !sd_is_emmc(sd)) { in sd_bootpart_offset()
783 partition_access = sd->ext_csd[EXT_CSD_PART_CONFIG] in sd_bootpart_offset()
787 return sd->boot_part_size * 2; in sd_bootpart_offset()
791 return sd->boot_part_size * 1; in sd_bootpart_offset()
801 if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) { in sd_req_get_address()
823 if (sd->blk) { in sd_reset()
824 blk_get_geometry(sd->blk, &sect); in sd_reset()
830 size -= sd->boot_part_size * 2; in sd_reset()
835 sd->state = sd_idle_state; in sd_reset()
838 sd->rca = sd_is_emmc(sd) ? 0x0001 : 0x0000; in sd_reset()
839 sd->size = size; in sd_reset()
842 sc->set_cid(sd); in sd_reset()
843 sc->set_csd(sd, size); in sd_reset()
847 g_free(sd->wp_group_bmap); in sd_reset()
848 sd->wp_switch = sd->blk ? !blk_is_writable(sd->blk) : false; in sd_reset()
849 sd->wp_group_bits = sect; in sd_reset()
850 sd->wp_group_bmap = bitmap_new(sd->wp_group_bits); in sd_reset()
851 memset(sd->function_group, 0, sizeof(sd->function_group)); in sd_reset()
852 sd->erase_start = INVALID_ADDRESS; in sd_reset()
853 sd->erase_end = INVALID_ADDRESS; in sd_reset()
854 sd->blk_len = 0x200; in sd_reset()
855 sd->pwd_len = 0; in sd_reset()
856 sd->expecting_acmd = false; in sd_reset()
857 sd->dat_lines = 0xf; in sd_reset()
858 sd->cmd_line = true; in sd_reset()
859 sd->multi_blk_cnt = 0; in sd_reset()
864 return sd->blk && blk_is_inserted(sd->blk); in sd_get_inserted()
869 return sd->wp_switch; in sd_get_readonly()
903 return !FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP); in sd_ocr_vmstate_needed()
907 .name = "sd-card/ocr-state",
926 .name = "sd-card/ext_csd_modes-state",
950 .name = "sd-card",
992 if (!sd->blk || blk_pread(sd->blk, addr, len, sd->data, 0) < 0) { in sd_blk_read()
1001 if (!sd->blk || blk_pwrite(sd->blk, addr, len, sd->data, 0) < 0) { in sd_blk_write()
1008 uint64_t erase_start = sd->erase_start; in sd_erase()
1009 uint64_t erase_end = sd->erase_end; in sd_erase()
1015 trace_sdcard_erase(sd->erase_start, sd->erase_end); in sd_erase()
1016 if (sd->erase_start == INVALID_ADDRESS in sd_erase()
1017 || sd->erase_end == INVALID_ADDRESS) { in sd_erase()
1018 sd->card_status |= ERASE_SEQ_ERROR; in sd_erase()
1019 sd->erase_start = INVALID_ADDRESS; in sd_erase()
1020 sd->erase_end = INVALID_ADDRESS; in sd_erase()
1024 if (FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) { in sd_erase()
1031 if (erase_start > sd->size || erase_end > sd->size) { in sd_erase()
1032 sd->card_status |= OUT_OF_RANGE; in sd_erase()
1033 sd->erase_start = INVALID_ADDRESS; in sd_erase()
1034 sd->erase_end = INVALID_ADDRESS; in sd_erase()
1038 sd->erase_start = INVALID_ADDRESS; in sd_erase()
1039 sd->erase_end = INVALID_ADDRESS; in sd_erase()
1040 sd->csd[14] |= 0x40; in sd_erase()
1042 memset(sd->data, 0xff, erase_len); in sd_erase()
1048 assert(wpnum < sd->wp_group_bits); in sd_erase()
1049 if (test_bit(wpnum, sd->wp_group_bmap)) { in sd_erase()
1050 sd->card_status |= WP_ERASE_SKIP; in sd_erase()
1066 if (addr >= sd->size) { in sd_wpbits()
1073 assert(wpnum < sd->wp_group_bits); in sd_wpbits()
1074 if (test_bit(wpnum, sd->wp_group_bmap)) { in sd_wpbits()
1094 uint8_t b = sd->ext_csd[index]; in emmc_function_switch()
1100 sd->card_status |= R_CSR_SWITCH_ERROR_MASK; in emmc_function_switch()
1119 trace_sdcard_ext_csd_update(index, sd->ext_csd[index], b); in emmc_function_switch()
1120 sd->ext_csd[index] = b; in emmc_function_switch()
1128 sd->data[0] = 0x00; /* Maximum current consumption */ in sd_function_switch()
1129 sd->data[1] = 0x01; in sd_function_switch()
1130 sd->data[2] = 0x80; /* Supported group 6 functions */ in sd_function_switch()
1131 sd->data[3] = 0x01; in sd_function_switch()
1132 sd->data[4] = 0x80; /* Supported group 5 functions */ in sd_function_switch()
1133 sd->data[5] = 0x01; in sd_function_switch()
1134 sd->data[6] = 0x80; /* Supported group 4 functions */ in sd_function_switch()
1135 sd->data[7] = 0x01; in sd_function_switch()
1136 sd->data[8] = 0x80; /* Supported group 3 functions */ in sd_function_switch()
1137 sd->data[9] = 0x01; in sd_function_switch()
1138 sd->data[10] = 0x80; /* Supported group 2 functions */ in sd_function_switch()
1139 sd->data[11] = 0x43; in sd_function_switch()
1140 sd->data[12] = 0x80; /* Supported group 1 functions */ in sd_function_switch()
1141 sd->data[13] = 0x03; in sd_function_switch()
1143 memset(&sd->data[14], 0, 3); in sd_function_switch()
1147 sd->function_group[i] = new_func; in sd_function_switch()
1148 sd->data[16 - (i >> 1)] |= new_func << ((i % 2) * 4); in sd_function_switch()
1150 memset(&sd->data[17], 0, 47); in sd_function_switch()
1155 return test_bit(sd_addr_to_wpnum(addr), sd->wp_group_bmap); in sd_wp_addr()
1161 erase = !!(sd->data[0] & 0x08); in sd_lock_command()
1162 lock = sd->data[0] & 0x04; in sd_lock_command()
1163 clr_pwd = sd->data[0] & 0x02; in sd_lock_command()
1164 set_pwd = sd->data[0] & 0x01; in sd_lock_command()
1166 if (sd->blk_len > 1) in sd_lock_command()
1167 pwd_len = sd->data[1]; in sd_lock_command()
1177 if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 || in sd_lock_command()
1178 set_pwd || clr_pwd || lock || sd->wp_switch || in sd_lock_command()
1179 (sd->csd[14] & 0x20)) { in sd_lock_command()
1180 sd->card_status |= LOCK_UNLOCK_FAILED; in sd_lock_command()
1183 bitmap_zero(sd->wp_group_bmap, sd->wp_group_bits); in sd_lock_command()
1184 sd->csd[14] &= ~0x10; in sd_lock_command()
1185 sd->card_status &= ~CARD_IS_LOCKED; in sd_lock_command()
1186 sd->pwd_len = 0; in sd_lock_command()
1188 fprintf(stderr, "SD: Card force-erased by CMD42\n"); in sd_lock_command()
1192 if (sd->blk_len < 2 + pwd_len || in sd_lock_command()
1193 pwd_len <= sd->pwd_len || in sd_lock_command()
1194 pwd_len > sd->pwd_len + 16) { in sd_lock_command()
1195 sd->card_status |= LOCK_UNLOCK_FAILED; in sd_lock_command()
1199 if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) { in sd_lock_command()
1200 sd->card_status |= LOCK_UNLOCK_FAILED; in sd_lock_command()
1204 pwd_len -= sd->pwd_len; in sd_lock_command()
1207 (lock && !sd->pwd_len && !set_pwd) || in sd_lock_command()
1209 (((sd->card_status & CARD_IS_LOCKED) && lock) || in sd_lock_command()
1210 (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) { in sd_lock_command()
1211 sd->card_status |= LOCK_UNLOCK_FAILED; in sd_lock_command()
1216 memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len); in sd_lock_command()
1217 sd->pwd_len = pwd_len; in sd_lock_command()
1221 sd->pwd_len = 0; in sd_lock_command()
1225 sd->card_status |= CARD_IS_LOCKED; in sd_lock_command()
1227 sd->card_status &= ~CARD_IS_LOCKED; in sd_lock_command()
1233 if (addr + length > sd->size) { in address_in_range()
1236 desc, addr, sd->size, length); in address_in_range()
1237 sd->card_status |= ADDRESS_ERROR; in address_in_range()
1246 sd->proto->name, req.cmd, sd_state_name(sd->state), in sd_invalid_state_for_cmd()
1247 sd_version_str(sd->spec_version)); in sd_invalid_state_for_cmd()
1255 sd->proto->name, req.cmd, sd_mode_name(sd->mode), in sd_invalid_mode_for_cmd()
1256 sd_version_str(sd->spec_version)); in sd_invalid_mode_for_cmd()
1264 sd->proto->name, req.cmd, in sd_cmd_illegal()
1265 sd_version_str(sd->spec_version)); in sd_cmd_illegal()
1274 sd->proto->name, req.cmd); in sd_cmd_unimplemented()
1282 sd->proto->name, req.cmd); in sd_cmd_optional()
1291 if (sd->state != sd_transfer_state) { in sd_cmd_to_receivingdata()
1294 sd->state = sd_receivingdata_state; in sd_cmd_to_receivingdata()
1295 sd->data_start = start; in sd_cmd_to_receivingdata()
1296 sd->data_offset = 0; in sd_cmd_to_receivingdata()
1297 /* sd->data[] used as receive buffer */ in sd_cmd_to_receivingdata()
1298 sd->data_size = size ?: sizeof(sd->data); in sd_cmd_to_receivingdata()
1307 if (sd->state != sd_transfer_state) { in sd_cmd_to_sendingdata()
1311 sd->state = sd_sendingdata_state; in sd_cmd_to_sendingdata()
1312 sd->data_start = start; in sd_cmd_to_sendingdata()
1313 sd->data_offset = 0; in sd_cmd_to_sendingdata()
1315 assert(size > 0 && size <= sizeof(sd->data)); in sd_cmd_to_sendingdata()
1316 memcpy(sd->data, data, size); in sd_cmd_to_sendingdata()
1319 sd->data_size = size; in sd_cmd_to_sendingdata()
1327 if (sd->state == sd_sleep_state) { in sd_cmd_GO_IDLE_STATE()
1336 if (sd->state != sd_inactive_state) { in sd_cmd_GO_IDLE_STATE()
1337 sd->state = sd_idle_state; in sd_cmd_GO_IDLE_STATE()
1347 sd->state = sd_transfer_state; in spi_cmd_SEND_OP_COND()
1355 switch (sd->state) { in sd_cmd_ALL_SEND_CID()
1357 sd->state = sd_identification_state; in sd_cmd_ALL_SEND_CID()
1369 switch (sd->state) { in sd_cmd_SEND_RELATIVE_ADDR()
1372 sd->state = sd_standby_state; in sd_cmd_SEND_RELATIVE_ADDR()
1384 switch (sd->state) { in emmc_cmd_SET_RELATIVE_ADDR()
1387 sd->state = sd_standby_state; in emmc_cmd_SET_RELATIVE_ADDR()
1401 switch (sd->state) { in emmc_cmd_sleep_awake()
1405 sd->state = sd_standby_state; in emmc_cmd_sleep_awake()
1411 sd->state = sd_sleep_state; in emmc_cmd_sleep_awake()
1423 if (sd->mode != sd_data_transfer_mode) { in sd_cmd_SWITCH_FUNCTION()
1426 if (sd->state != sd_transfer_state) { in sd_cmd_SWITCH_FUNCTION()
1436 switch (sd->state) { in emmc_cmd_SWITCH()
1438 sd->state = sd_programming_state; in emmc_cmd_SWITCH()
1440 sd->state = sd_transfer_state; in emmc_cmd_SWITCH()
1452 switch (sd->state) { in sd_cmd_DE_SELECT_CARD()
1457 sd->state = sd_transfer_state; in sd_cmd_DE_SELECT_CARD()
1465 sd->state = sd_standby_state; in sd_cmd_DE_SELECT_CARD()
1472 sd->state = sd_programming_state; in sd_cmd_DE_SELECT_CARD()
1479 sd->state = sd_disconnect_state; in sd_cmd_DE_SELECT_CARD()
1491 if (sd->spec_version < SD_PHY_SPECv2_00_VERS) { in sd_cmd_SEND_IF_COND()
1494 if (sd->state != sd_idle_state) { in sd_cmd_SEND_IF_COND()
1497 sd->vhs = 0; in sd_cmd_SEND_IF_COND()
1505 sd->vhs = req.arg; in sd_cmd_SEND_IF_COND()
1512 if (sd->state != sd_transfer_state) { in emmc_cmd_SEND_EXT_CSD()
1517 sd->ext_csd, sizeof(sd->ext_csd)); in emmc_cmd_SEND_EXT_CSD()
1523 if (sd->state != sd_standby_state) { in spi_cmd_SEND_CSD()
1527 sd->csd, 16); in spi_cmd_SEND_CSD()
1532 if (sd->state != sd_standby_state) { in sd_cmd_SEND_CSD()
1542 if (sd->state != sd_standby_state) { in spi_cmd_SEND_CID()
1546 sd->cid, 16); in spi_cmd_SEND_CID()
1551 if (sd->state != sd_standby_state) { in sd_cmd_SEND_CID()
1561 switch (sd->state) { in sd_cmd_STOP_TRANSMISSION()
1563 sd->state = sd_transfer_state; in sd_cmd_STOP_TRANSMISSION()
1566 sd->state = sd_programming_state; in sd_cmd_STOP_TRANSMISSION()
1568 sd->state = sd_transfer_state; in sd_cmd_STOP_TRANSMISSION()
1578 if (sd->mode != sd_data_transfer_mode) { in sd_cmd_SEND_STATUS()
1582 switch (sd->state) { in sd_cmd_SEND_STATUS()
1604 if (sd->mode != sd_data_transfer_mode) { in sd_cmd_GO_INACTIVE_STATE()
1607 switch (sd->state) { in sd_cmd_GO_INACTIVE_STATE()
1619 sd->state = sd_inactive_state; in sd_cmd_GO_INACTIVE_STATE()
1628 if (sd->state != sd_transfer_state) { in sd_cmd_SET_BLOCKLEN()
1632 sd->card_status |= BLOCK_LEN_ERROR; in sd_cmd_SET_BLOCKLEN()
1635 sd->blk_len = req.arg; in sd_cmd_SET_BLOCKLEN()
1646 if (sd->state != sd_transfer_state) { in sd_cmd_READ_SINGLE_BLOCK()
1651 if (!address_in_range(sd, "READ_SINGLE_BLOCK", addr, sd->blk_len)) { in sd_cmd_READ_SINGLE_BLOCK()
1655 sd_blk_read(sd, addr, sd->blk_len); in sd_cmd_READ_SINGLE_BLOCK()
1656 return sd_cmd_to_sendingdata(sd, req, addr, NULL, sd->blk_len); in sd_cmd_READ_SINGLE_BLOCK()
1662 if (sd->spec_version < SD_PHY_SPECv3_01_VERS) { in sd_cmd_SEND_TUNING_BLOCK()
1674 if (sd->spec_version < SD_PHY_SPECv3_01_VERS) { in sd_cmd_SET_BLOCK_COUNT()
1678 if (sd->state != sd_transfer_state) { in sd_cmd_SET_BLOCK_COUNT()
1682 sd->multi_blk_cnt = req.arg; in sd_cmd_SET_BLOCK_COUNT()
1684 sd->multi_blk_cnt &= 0xffff; in sd_cmd_SET_BLOCK_COUNT()
1686 trace_sdcard_set_block_count(sd->multi_blk_cnt); in sd_cmd_SET_BLOCK_COUNT()
1696 if (sd->state != sd_transfer_state) { in sd_cmd_WRITE_SINGLE_BLOCK()
1701 if (!address_in_range(sd, "WRITE_SINGLE_BLOCK", addr, sd->blk_len)) { in sd_cmd_WRITE_SINGLE_BLOCK()
1705 if (sd->size <= SDSC_MAX_CAPACITY) { in sd_cmd_WRITE_SINGLE_BLOCK()
1707 sd->card_status |= WP_VIOLATION; in sd_cmd_WRITE_SINGLE_BLOCK()
1710 if (sd->csd[14] & 0x30) { in sd_cmd_WRITE_SINGLE_BLOCK()
1711 sd->card_status |= WP_VIOLATION; in sd_cmd_WRITE_SINGLE_BLOCK()
1714 sd->blk_written = 0; in sd_cmd_WRITE_SINGLE_BLOCK()
1715 return sd_cmd_to_receivingdata(sd, req, addr, sd->blk_len); in sd_cmd_WRITE_SINGLE_BLOCK()
1721 return sd_cmd_to_receivingdata(sd, req, 0, sizeof(sd->cid)); in emmc_cmd_PROGRAM_CID()
1727 return sd_cmd_to_receivingdata(sd, req, 0, sizeof(sd->csd)); in sd_cmd_PROGRAM_CSD()
1735 if (sd->size > SDSC_MAX_CAPACITY) { in sd_cmd_SET_CLR_WRITE_PROT()
1739 if (sd->state != sd_transfer_state) { in sd_cmd_SET_CLR_WRITE_PROT()
1749 sd->state = sd_programming_state; in sd_cmd_SET_CLR_WRITE_PROT()
1751 set_bit(sd_addr_to_wpnum(addr), sd->wp_group_bmap); in sd_cmd_SET_CLR_WRITE_PROT()
1753 clear_bit(sd_addr_to_wpnum(addr), sd->wp_group_bmap); in sd_cmd_SET_CLR_WRITE_PROT()
1756 sd->state = sd_transfer_state; in sd_cmd_SET_CLR_WRITE_PROT()
1778 if (sd->size > SDSC_MAX_CAPACITY) { in sd_cmd_SEND_WRITE_PROT()
1782 if (sd->state != sd_transfer_state) { in sd_cmd_SEND_WRITE_PROT()
1787 if (!address_in_range(sd, "SEND_WRITE_PROT", addr, sd->blk_len)) { in sd_cmd_SEND_WRITE_PROT()
1798 if (sd->state != sd_transfer_state) { in sd_cmd_ERASE_WR_BLK_START()
1801 sd->erase_start = req.arg; in sd_cmd_ERASE_WR_BLK_START()
1808 if (sd->state != sd_transfer_state) { in sd_cmd_ERASE_WR_BLK_END()
1811 sd->erase_end = req.arg; in sd_cmd_ERASE_WR_BLK_END()
1818 if (sd->state != sd_transfer_state) { in sd_cmd_ERASE()
1821 if (sd->csd[14] & 0x30) { in sd_cmd_ERASE()
1822 sd->card_status |= WP_VIOLATION; in sd_cmd_ERASE()
1826 sd->state = sd_programming_state; in sd_cmd_ERASE()
1829 sd->state = sd_transfer_state; in sd_cmd_ERASE()
1842 switch (sd->state) { in sd_cmd_APP_CMD()
1853 /* fall-through */ in sd_cmd_APP_CMD()
1860 sd->expecting_acmd = true; in sd_cmd_APP_CMD()
1861 sd->card_status |= APP_CMD; in sd_cmd_APP_CMD()
1869 if (sd->state != sd_transfer_state) { in sd_cmd_GEN_CMD()
1875 memset(sd->data, 0, sizeof(sd->data)); in sd_cmd_GEN_CMD()
1897 if (sd->state != sd_transfer_state) { in sd_acmd_SET_BUS_WIDTH()
1901 sd->sd_status[0] &= 0x3f; in sd_acmd_SET_BUS_WIDTH()
1902 sd->sd_status[0] |= (req.arg & 0x03) << 6; in sd_acmd_SET_BUS_WIDTH()
1910 sd->sd_status, sizeof(sd->sd_status)); in sd_acmd_SD_STATUS()
1917 &sd->blk_written, sizeof(sd->blk_written)); in sd_acmd_SEND_NUM_WR_BLOCKS()
1923 if (sd->state != sd_transfer_state) { in sd_acmd_SET_WR_BLK_ERASE_COUNT()
1932 if (sd->state != sd_idle_state) { in sd_cmd_SEND_OP_COND()
1946 if (!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)) { in sd_cmd_SEND_OP_COND()
1948 timer_del(sd->ocr_power_timer); in sd_cmd_SEND_OP_COND()
1952 if (!timer_pending(sd->ocr_power_timer)) { in sd_cmd_SEND_OP_COND()
1953 timer_mod_ns(sd->ocr_power_timer, in sd_cmd_SEND_OP_COND()
1960 if (FIELD_EX32(sd->ocr & req.arg, OCR, VDD_VOLTAGE_WINDOW)) { in sd_cmd_SEND_OP_COND()
1967 sd->state = sd_ready_state; in sd_cmd_SEND_OP_COND()
1976 if (sd->state != sd_transfer_state) { in sd_acmd_SET_CLR_CARD_DETECT()
1980 /* Bringing in the 50KOhm pull-up resistor... Done. */ in sd_acmd_SET_CLR_CARD_DETECT()
1987 return sd_cmd_to_sendingdata(sd, req, 0, sd->scr, sizeof(sd->scr)); in sd_acmd_SEND_SCR()
1994 sd->last_cmd_name = sd_cmd_name(sd, req.cmd); in sd_normal_command()
1998 if (req.cmd != 55 || sd->expecting_acmd) { in sd_normal_command()
1999 trace_sdcard_normal_command(sd->proto->name, in sd_normal_command()
2000 sd->last_cmd_name, req.cmd, in sd_normal_command()
2001 req.arg, sd_state_name(sd->state)); in sd_normal_command()
2005 sd->card_status &= ~APP_CMD; in sd_normal_command()
2009 if (sd->multi_blk_cnt != 0 && !(req.cmd == 18 || req.cmd == 25)) { in sd_normal_command()
2010 sd->multi_blk_cnt = 0; in sd_normal_command()
2013 if (sd->proto->cmd[req.cmd].class == 6 && FIELD_EX32(sd->ocr, OCR, in sd_normal_command()
2019 if (sd->proto->cmd[req.cmd].handler) { in sd_normal_command()
2020 return sd->proto->cmd[req.cmd].handler(sd, req); in sd_normal_command()
2027 switch (sd->state) { in sd_normal_command()
2030 if (!address_in_range(sd, "READ_BLOCK", addr, sd->blk_len)) { in sd_normal_command()
2034 sd->state = sd_sendingdata_state; in sd_normal_command()
2035 sd->data_start = addr; in sd_normal_command()
2036 sd->data_offset = 0; in sd_normal_command()
2047 switch (sd->state) { in sd_normal_command()
2050 if (!address_in_range(sd, "WRITE_BLOCK", addr, sd->blk_len)) { in sd_normal_command()
2054 sd->state = sd_receivingdata_state; in sd_normal_command()
2055 sd->data_start = addr; in sd_normal_command()
2056 sd->data_offset = 0; in sd_normal_command()
2057 sd->blk_written = 0; in sd_normal_command()
2059 if (sd->size <= SDSC_MAX_CAPACITY) { in sd_normal_command()
2060 if (sd_wp_addr(sd, sd->data_start)) { in sd_normal_command()
2061 sd->card_status |= WP_VIOLATION; in sd_normal_command()
2064 if (sd->csd[14] & 0x30) { in sd_normal_command()
2065 sd->card_status |= WP_VIOLATION; in sd_normal_command()
2085 sd->last_cmd_name = sd_acmd_name(sd, req.cmd); in sd_app_command()
2086 trace_sdcard_app_command(sd->proto->name, sd->last_cmd_name, in sd_app_command()
2087 req.cmd, req.arg, sd_state_name(sd->state)); in sd_app_command()
2088 sd->card_status |= APP_CMD; in sd_app_command()
2090 if (sd->proto->acmd[req.cmd].handler) { in sd_app_command()
2091 return sd->proto->acmd[req.cmd].handler(sd, req); in sd_app_command()
2128 if (sd->expecting_acmd) { in cmd_valid_while_locked()
2134 if (!sd->proto->cmd[cmd].handler) { in cmd_valid_while_locked()
2137 cmd_class = sd->proto->cmd[cmd].class; in cmd_valid_while_locked()
2148 if (!sd->blk || !blk_is_inserted(sd->blk)) { in sd_do_command()
2152 if (sd->state == sd_inactive_state) { in sd_do_command()
2158 sd->card_status |= COM_CRC_ERROR; in sd_do_command()
2163 if (req->cmd >= SDMMC_CMD_MAX) { in sd_do_command()
2165 req->cmd); in sd_do_command()
2166 req->cmd &= 0x3f; in sd_do_command()
2169 if (sd->state == sd_sleep_state && req->cmd) { in sd_do_command()
2175 if (sd->card_status & CARD_IS_LOCKED) { in sd_do_command()
2176 if (!cmd_valid_while_locked(sd, req->cmd)) { in sd_do_command()
2177 sd->card_status |= ILLEGAL_COMMAND; in sd_do_command()
2178 sd->expecting_acmd = false; in sd_do_command()
2185 last_state = sd->state; in sd_do_command()
2188 if (sd->expecting_acmd) { in sd_do_command()
2189 sd->expecting_acmd = false; in sd_do_command()
2196 sd->card_status |= ILLEGAL_COMMAND; in sd_do_command()
2201 sd->card_status = FIELD_DP32(sd->card_status, CSR, in sd_do_command()
2214 memcpy(response, sd->cid, sizeof(sd->cid)); in sd_do_command()
2219 memcpy(response, sd->csd, sizeof(sd->csd)); in sd_do_command()
2243 sd->data_start = 0; in sd_do_command()
2244 sd->data_offset = 0; in sd_do_command()
2245 /* fall-through */ in sd_do_command()
2258 sd->card_status &= ~CARD_STATUS_B; in sd_do_command()
2265 sd->current_cmd = rtype == sd_illegal ? 0 : req->cmd; in sd_do_command()
2273 sd->data[sd->data_offset] = value; in sd_generic_write_byte()
2275 if (++sd->data_offset >= sd->data_size) { in sd_generic_write_byte()
2276 sd->state = sd_transfer_state; in sd_generic_write_byte()
2285 *value = sd->data[sd->data_offset]; in sd_generic_read_byte()
2287 if (++sd->data_offset >= sd->data_size) { in sd_generic_read_byte()
2288 sd->state = sd_transfer_state; in sd_generic_read_byte()
2299 if (!sd->blk || !blk_is_inserted(sd->blk)) { in sd_write_byte()
2303 if (sd->state != sd_receivingdata_state) { in sd_write_byte()
2305 "%s: not in Receiving-Data state\n", __func__); in sd_write_byte()
2309 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION)) in sd_write_byte()
2312 trace_sdcard_write_data(sd->proto->name, in sd_write_byte()
2313 sd->last_cmd_name, in sd_write_byte()
2314 sd->current_cmd, sd->data_offset, value); in sd_write_byte()
2315 switch (sd->current_cmd) { in sd_write_byte()
2319 sd->state = sd_programming_state; in sd_write_byte()
2320 sd_blk_write(sd, sd->data_start, sd->data_offset); in sd_write_byte()
2321 sd->blk_written ++; in sd_write_byte()
2322 sd->csd[14] |= 0x40; in sd_write_byte()
2324 sd->state = sd_transfer_state; in sd_write_byte()
2329 if (sd->data_offset == 0) { in sd_write_byte()
2330 /* Start of the block - let's check the address is valid */ in sd_write_byte()
2332 sd->data_start, sd->blk_len)) { in sd_write_byte()
2335 if (sd->size <= SDSC_MAX_CAPACITY) { in sd_write_byte()
2336 if (sd_wp_addr(sd, sd->data_start)) { in sd_write_byte()
2337 sd->card_status |= WP_VIOLATION; in sd_write_byte()
2342 sd->data[sd->data_offset++] = value; in sd_write_byte()
2343 if (sd->data_offset >= sd->blk_len) { in sd_write_byte()
2345 sd->state = sd_programming_state; in sd_write_byte()
2346 sd_blk_write(sd, sd->data_start, sd->data_offset); in sd_write_byte()
2347 sd->blk_written++; in sd_write_byte()
2348 sd->data_start += sd->blk_len; in sd_write_byte()
2349 sd->data_offset = 0; in sd_write_byte()
2350 sd->csd[14] |= 0x40; in sd_write_byte()
2353 if (sd->multi_blk_cnt != 0) { in sd_write_byte()
2354 if (--sd->multi_blk_cnt == 0) { in sd_write_byte()
2356 sd->state = sd_transfer_state; in sd_write_byte()
2361 sd->state = sd_receivingdata_state; in sd_write_byte()
2368 sd->state = sd_programming_state; in sd_write_byte()
2369 for (i = 0; i < sizeof(sd->cid); i ++) in sd_write_byte()
2370 if ((sd->cid[i] | 0x00) != sd->data[i]) in sd_write_byte()
2371 sd->card_status |= CID_CSD_OVERWRITE; in sd_write_byte()
2373 if (!(sd->card_status & CID_CSD_OVERWRITE)) in sd_write_byte()
2374 for (i = 0; i < sizeof(sd->cid); i ++) { in sd_write_byte()
2375 sd->cid[i] |= 0x00; in sd_write_byte()
2376 sd->cid[i] &= sd->data[i]; in sd_write_byte()
2379 sd->state = sd_transfer_state; in sd_write_byte()
2386 sd->state = sd_programming_state; in sd_write_byte()
2387 for (i = 0; i < sizeof(sd->csd); i ++) in sd_write_byte()
2388 if ((sd->csd[i] | sd_csd_rw_mask[i]) != in sd_write_byte()
2389 (sd->data[i] | sd_csd_rw_mask[i])) in sd_write_byte()
2390 sd->card_status |= CID_CSD_OVERWRITE; in sd_write_byte()
2393 if (sd->csd[14] & ~sd->data[14] & 0x60) in sd_write_byte()
2394 sd->card_status |= CID_CSD_OVERWRITE; in sd_write_byte()
2396 if (!(sd->card_status & CID_CSD_OVERWRITE)) in sd_write_byte()
2397 for (i = 0; i < sizeof(sd->csd); i ++) { in sd_write_byte()
2398 sd->csd[i] |= sd_csd_rw_mask[i]; in sd_write_byte()
2399 sd->csd[i] &= sd->data[i]; in sd_write_byte()
2402 sd->state = sd_transfer_state; in sd_write_byte()
2409 sd->state = sd_programming_state; in sd_write_byte()
2412 sd->state = sd_transfer_state; in sd_write_byte()
2432 if (!sd->blk || !blk_is_inserted(sd->blk)) { in sd_read_byte()
2436 if (sd->state != sd_sendingdata_state) { in sd_read_byte()
2438 "%s: not in Sending-Data state\n", __func__); in sd_read_byte()
2442 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION)) { in sd_read_byte()
2448 trace_sdcard_read_data(sd->proto->name, in sd_read_byte()
2449 sd->last_cmd_name, sd->current_cmd, in sd_read_byte()
2450 sd->data_offset, sd->data_size, io_len); in sd_read_byte()
2451 switch (sd->current_cmd) { in sd_read_byte()
2467 if (sd->data_offset == 0) { in sd_read_byte()
2469 sd->data_start, io_len)) { in sd_read_byte()
2472 sd_blk_read(sd, sd->data_start, io_len); in sd_read_byte()
2474 ret = sd->data[sd->data_offset ++]; in sd_read_byte()
2476 if (sd->data_offset >= io_len) { in sd_read_byte()
2477 sd->data_start += io_len; in sd_read_byte()
2478 sd->data_offset = 0; in sd_read_byte()
2480 if (sd->multi_blk_cnt != 0) { in sd_read_byte()
2481 if (--sd->multi_blk_cnt == 0) { in sd_read_byte()
2483 sd->state = sd_transfer_state; in sd_read_byte()
2492 __func__, sd->last_cmd_name); in sd_read_byte()
2501 return sd->state == sd_receivingdata_state; in sd_receive_ready()
2506 return sd->state == sd_sendingdata_state; in sd_data_ready()
2510 .name = "SPI",
2666 sd->proto = sc->proto; in sd_instance_init()
2667 sd->last_cmd_name = "UNSET"; in sd_instance_init()
2668 sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd); in sd_instance_init()
2675 timer_free(sd->ocr_power_timer); in sd_instance_finalize()
2683 switch (sd->spec_version) { in sd_realize()
2688 error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version); in sd_realize()
2692 if (sd->blk) { in sd_realize()
2695 if (!blk_supports_write_perm(sd->blk)) { in sd_realize()
2696 error_setg(errp, "Cannot use read-only drive as SD card"); in sd_realize()
2700 blk_size = blk_getlength(sd->blk); in sd_realize()
2713 " 'qemu-img resize <imagefile> <new-size>'\n" in sd_realize()
2722 ret = blk_set_perm(sd->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, in sd_realize()
2727 blk_set_dev_ops(sd->blk, &sd_block_ops, sd); in sd_realize()
2735 sd->spec_version = SD_PHY_SPECv3_01_VERS; /* Actually v4.3 */ in emmc_realize()
2750 DEFINE_PROP_UINT64("boot-partition-size", SDState, boot_part_size, 0),
2751 DEFINE_PROP_UINT8("boot-config", SDState, boot_config, 0x0),
2760 dc->vmsd = &sd_vmstate; in sdmmc_common_class_init()
2762 dc->bus_type = TYPE_SD_BUS; in sdmmc_common_class_init()
2763 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); in sdmmc_common_class_init()
2765 sc->set_voltage = sd_set_voltage; in sdmmc_common_class_init()
2766 sc->get_dat_lines = sd_get_dat_lines; in sdmmc_common_class_init()
2767 sc->get_cmd_line = sd_get_cmd_line; in sdmmc_common_class_init()
2768 sc->do_command = sd_do_command; in sdmmc_common_class_init()
2769 sc->write_byte = sd_write_byte; in sdmmc_common_class_init()
2770 sc->read_byte = sd_read_byte; in sdmmc_common_class_init()
2771 sc->receive_ready = sd_receive_ready; in sdmmc_common_class_init()
2772 sc->data_ready = sd_data_ready; in sdmmc_common_class_init()
2773 sc->get_inserted = sd_get_inserted; in sdmmc_common_class_init()
2774 sc->get_readonly = sd_get_readonly; in sdmmc_common_class_init()
2782 dc->realize = sd_realize; in sd_class_init()
2785 sc->set_cid = sd_set_cid; in sd_class_init()
2786 sc->set_csd = sd_set_csd; in sd_class_init()
2787 sc->proto = &sd_proto_sd; in sd_class_init()
2801 dc->desc = "SD SPI"; in sd_spi_class_init()
2802 sc->proto = &sd_proto_spi; in sd_spi_class_init()
2810 dc->desc = "eMMC"; in emmc_class_init()
2811 dc->realize = emmc_realize; in emmc_class_init()
2814 dc->user_creatable = false; in emmc_class_init()
2816 sc->proto = &sd_proto_emmc; in emmc_class_init()
2818 sc->set_cid = emmc_set_cid; in emmc_class_init()
2819 sc->set_csd = emmc_set_csd; in emmc_class_init()