Lines Matching +full:broken +full:- +full:hpi
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2003-2004 Russell King, All Rights Reserved.
6 * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
57 const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
58 const int __off = 3 - ((start) / 32); \
64 __res |= resp[__off-1] << ((32 - __shft) % 32); \
73 u32 *resp = card->raw_cid; in mmc_decode_cid()
79 add_device_randomness(&card->raw_cid, sizeof(card->raw_cid)); in mmc_decode_cid()
85 switch (card->csd.mmca_vsn) { in mmc_decode_cid()
86 case 0: /* MMC v1.0 - v1.2 */ in mmc_decode_cid()
88 card->cid.manfid = UNSTUFF_BITS(resp, 104, 24); in mmc_decode_cid()
89 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
90 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
91 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
92 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
93 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
94 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
95 card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
96 card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4); in mmc_decode_cid()
97 card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4); in mmc_decode_cid()
98 card->cid.serial = UNSTUFF_BITS(resp, 16, 24); in mmc_decode_cid()
99 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
100 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
103 case 2: /* MMC v2.0 - v2.2 */ in mmc_decode_cid()
104 case 3: /* MMC v3.1 - v3.3 */ in mmc_decode_cid()
106 card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); in mmc_decode_cid()
107 card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); in mmc_decode_cid()
108 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); in mmc_decode_cid()
109 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); in mmc_decode_cid()
110 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); in mmc_decode_cid()
111 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); in mmc_decode_cid()
112 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); in mmc_decode_cid()
113 card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); in mmc_decode_cid()
114 card->cid.prv = UNSTUFF_BITS(resp, 48, 8); in mmc_decode_cid()
115 card->cid.serial = UNSTUFF_BITS(resp, 16, 32); in mmc_decode_cid()
116 card->cid.month = UNSTUFF_BITS(resp, 12, 4); in mmc_decode_cid()
117 card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; in mmc_decode_cid()
122 mmc_hostname(card->host), card->csd.mmca_vsn); in mmc_decode_cid()
123 return -EINVAL; in mmc_decode_cid()
131 if (card->ext_csd.erase_group_def & 1) in mmc_set_erase_size()
132 card->erase_size = card->ext_csd.hc_erase_size; in mmc_set_erase_size()
134 card->erase_size = card->csd.erase_size; in mmc_set_erase_size()
142 if (card->ext_csd.erase_group_def & 1) in mmc_set_wp_grp_size()
143 card->wp_grp_size = card->ext_csd.hc_erase_size * in mmc_set_wp_grp_size()
144 card->ext_csd.raw_hc_erase_gap_size; in mmc_set_wp_grp_size()
146 card->wp_grp_size = card->csd.erase_size * in mmc_set_wp_grp_size()
147 (card->csd.wp_grp_size + 1); in mmc_set_wp_grp_size()
151 * Given a 128-bit response, decode to our card CSD structure.
155 struct mmc_csd *csd = &card->csd; in mmc_decode_csd()
157 u32 *resp = card->raw_csd; in mmc_decode_csd()
164 csd->structure = UNSTUFF_BITS(resp, 126, 2); in mmc_decode_csd()
165 if (csd->structure == 0) { in mmc_decode_csd()
167 mmc_hostname(card->host), csd->structure); in mmc_decode_csd()
168 return -EINVAL; in mmc_decode_csd()
171 csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4); in mmc_decode_csd()
174 csd->taac_ns = (taac_exp[e] * taac_mant[m] + 9) / 10; in mmc_decode_csd()
175 csd->taac_clks = UNSTUFF_BITS(resp, 104, 8) * 100; in mmc_decode_csd()
179 csd->max_dtr = tran_exp[e] * tran_mant[m]; in mmc_decode_csd()
180 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); in mmc_decode_csd()
184 csd->capacity = (1 + m) << (e + 2); in mmc_decode_csd()
186 csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); in mmc_decode_csd()
187 csd->read_partial = UNSTUFF_BITS(resp, 79, 1); in mmc_decode_csd()
188 csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); in mmc_decode_csd()
189 csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); in mmc_decode_csd()
190 csd->dsr_imp = UNSTUFF_BITS(resp, 76, 1); in mmc_decode_csd()
191 csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); in mmc_decode_csd()
192 csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); in mmc_decode_csd()
193 csd->write_partial = UNSTUFF_BITS(resp, 21, 1); in mmc_decode_csd()
195 if (csd->write_blkbits >= 9) { in mmc_decode_csd()
198 csd->erase_size = (a + 1) * (b + 1); in mmc_decode_csd()
199 csd->erase_size <<= csd->write_blkbits - 9; in mmc_decode_csd()
200 csd->wp_grp_size = UNSTUFF_BITS(resp, 32, 5); in mmc_decode_csd()
208 struct mmc_host *host = card->host; in mmc_select_card_type()
209 u8 card_type = card->ext_csd.raw_card_type; in mmc_select_card_type()
210 u32 caps = host->caps, caps2 = host->caps2; in mmc_select_card_type()
263 card->ext_csd.strobe_support && in mmc_select_card_type()
267 card->ext_csd.hs_max_dtr = hs_max_dtr; in mmc_select_card_type()
268 card->ext_csd.hs200_max_dtr = hs200_max_dtr; in mmc_select_card_type()
269 card->mmc_avail_type = avail_type; in mmc_select_card_type()
279 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_manage_enhanced_area()
280 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_manage_enhanced_area()
283 * Enhanced area feature support -- check whether the eMMC in mmc_manage_enhanced_area()
289 if (card->ext_csd.partition_setting_completed) { in mmc_manage_enhanced_area()
298 card->ext_csd.enhanced_area_offset = in mmc_manage_enhanced_area()
304 card->ext_csd.enhanced_area_offset <<= 9; in mmc_manage_enhanced_area()
308 card->ext_csd.enhanced_area_size = in mmc_manage_enhanced_area()
311 card->ext_csd.enhanced_area_size *= in mmc_manage_enhanced_area()
313 card->ext_csd.enhanced_area_size <<= 9; in mmc_manage_enhanced_area()
316 mmc_hostname(card->host)); in mmc_manage_enhanced_area()
325 card->part[card->nr_parts].size = size; in mmc_part_add()
326 card->part[card->nr_parts].part_cfg = part_cfg; in mmc_part_add()
327 sprintf(card->part[card->nr_parts].name, name, idx); in mmc_part_add()
328 card->part[card->nr_parts].force_ro = ro; in mmc_part_add()
329 card->part[card->nr_parts].area_type = area_type; in mmc_part_add()
330 card->nr_parts++; in mmc_part_add()
340 * General purpose partition feature support -- in mmc_manage_gp_partitions()
356 if (card->ext_csd.partition_setting_completed == 0) { in mmc_manage_gp_partitions()
358 mmc_hostname(card->host)); in mmc_manage_gp_partitions()
390 card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; in mmc_decode_ext_csd()
391 if (card->csd.structure == 3) { in mmc_decode_ext_csd()
392 if (card->ext_csd.raw_ext_csd_structure > 2) { in mmc_decode_ext_csd()
394 "version %d\n", mmc_hostname(card->host), in mmc_decode_ext_csd()
395 card->ext_csd.raw_ext_csd_structure); in mmc_decode_ext_csd()
396 err = -EINVAL; in mmc_decode_ext_csd()
401 np = mmc_of_find_child_device(card->host, 0); in mmc_decode_ext_csd()
402 if (np && of_device_is_compatible(np, "mmc-card")) in mmc_decode_ext_csd()
403 broken_hpi = of_property_read_bool(np, "broken-hpi"); in mmc_decode_ext_csd()
409 * are authorized, see JEDEC JESD84-B50 section B.8. in mmc_decode_ext_csd()
411 card->ext_csd.rev = ext_csd[EXT_CSD_REV]; in mmc_decode_ext_csd()
416 card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; in mmc_decode_ext_csd()
417 card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; in mmc_decode_ext_csd()
418 card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; in mmc_decode_ext_csd()
419 card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; in mmc_decode_ext_csd()
420 if (card->ext_csd.rev >= 2) { in mmc_decode_ext_csd()
421 card->ext_csd.sectors = in mmc_decode_ext_csd()
428 if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) in mmc_decode_ext_csd()
432 card->ext_csd.strobe_support = ext_csd[EXT_CSD_STROBE_SUPPORT]; in mmc_decode_ext_csd()
433 card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; in mmc_decode_ext_csd()
435 card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; in mmc_decode_ext_csd()
436 card->ext_csd.raw_erase_timeout_mult = in mmc_decode_ext_csd()
438 card->ext_csd.raw_hc_erase_grp_size = in mmc_decode_ext_csd()
440 card->ext_csd.raw_boot_mult = in mmc_decode_ext_csd()
442 if (card->ext_csd.rev >= 3) { in mmc_decode_ext_csd()
444 card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; in mmc_decode_ext_csd()
447 card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; in mmc_decode_ext_csd()
451 card->ext_csd.sa_timeout = in mmc_decode_ext_csd()
453 card->ext_csd.erase_group_def = in mmc_decode_ext_csd()
455 card->ext_csd.hc_erase_timeout = 300 * in mmc_decode_ext_csd()
457 card->ext_csd.hc_erase_size = in mmc_decode_ext_csd()
460 card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C]; in mmc_decode_ext_csd()
466 if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) { in mmc_decode_ext_csd()
477 card->ext_csd.raw_hc_erase_gap_size = in mmc_decode_ext_csd()
479 card->ext_csd.raw_sec_trim_mult = in mmc_decode_ext_csd()
481 card->ext_csd.raw_sec_erase_mult = in mmc_decode_ext_csd()
483 card->ext_csd.raw_sec_feature_support = in mmc_decode_ext_csd()
485 card->ext_csd.raw_trim_mult = in mmc_decode_ext_csd()
487 card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; in mmc_decode_ext_csd()
488 card->ext_csd.raw_driver_strength = ext_csd[EXT_CSD_DRIVER_STRENGTH]; in mmc_decode_ext_csd()
489 if (card->ext_csd.rev >= 4) { in mmc_decode_ext_csd()
492 card->ext_csd.partition_setting_completed = 1; in mmc_decode_ext_csd()
494 card->ext_csd.partition_setting_completed = 0; in mmc_decode_ext_csd()
500 card->ext_csd.sec_trim_mult = in mmc_decode_ext_csd()
502 card->ext_csd.sec_erase_mult = in mmc_decode_ext_csd()
504 card->ext_csd.sec_feature_support = in mmc_decode_ext_csd()
506 card->ext_csd.trim_timeout = 300 * in mmc_decode_ext_csd()
514 card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP]; in mmc_decode_ext_csd()
515 card->ext_csd.boot_ro_lockable = true; in mmc_decode_ext_csd()
518 card->ext_csd.raw_pwr_cl_52_195 = in mmc_decode_ext_csd()
520 card->ext_csd.raw_pwr_cl_26_195 = in mmc_decode_ext_csd()
522 card->ext_csd.raw_pwr_cl_52_360 = in mmc_decode_ext_csd()
524 card->ext_csd.raw_pwr_cl_26_360 = in mmc_decode_ext_csd()
526 card->ext_csd.raw_pwr_cl_200_195 = in mmc_decode_ext_csd()
528 card->ext_csd.raw_pwr_cl_200_360 = in mmc_decode_ext_csd()
530 card->ext_csd.raw_pwr_cl_ddr_52_195 = in mmc_decode_ext_csd()
532 card->ext_csd.raw_pwr_cl_ddr_52_360 = in mmc_decode_ext_csd()
534 card->ext_csd.raw_pwr_cl_ddr_200_360 = in mmc_decode_ext_csd()
538 if (card->ext_csd.rev >= 5) { in mmc_decode_ext_csd()
539 /* Adjust production date as per JEDEC JESD84-B451 */ in mmc_decode_ext_csd()
540 if (card->cid.year < 2010) in mmc_decode_ext_csd()
541 card->cid.year += 16; in mmc_decode_ext_csd()
545 card->ext_csd.bkops = 1; in mmc_decode_ext_csd()
546 card->ext_csd.man_bkops_en = in mmc_decode_ext_csd()
549 card->ext_csd.raw_bkops_status = in mmc_decode_ext_csd()
551 if (card->ext_csd.man_bkops_en) in mmc_decode_ext_csd()
553 mmc_hostname(card->host)); in mmc_decode_ext_csd()
554 card->ext_csd.auto_bkops_en = in mmc_decode_ext_csd()
557 if (card->ext_csd.auto_bkops_en) in mmc_decode_ext_csd()
559 mmc_hostname(card->host)); in mmc_decode_ext_csd()
562 /* check whether the eMMC card supports HPI */ in mmc_decode_ext_csd()
565 card->ext_csd.hpi = 1; in mmc_decode_ext_csd()
567 card->ext_csd.hpi_cmd = MMC_STOP_TRANSMISSION; in mmc_decode_ext_csd()
569 card->ext_csd.hpi_cmd = MMC_SEND_STATUS; in mmc_decode_ext_csd()
572 * a command interrupted by HPI in mmc_decode_ext_csd()
574 card->ext_csd.out_of_int_time = in mmc_decode_ext_csd()
578 card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; in mmc_decode_ext_csd()
579 card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; in mmc_decode_ext_csd()
584 card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT]; in mmc_decode_ext_csd()
585 if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) { in mmc_decode_ext_csd()
593 card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT]; in mmc_decode_ext_csd()
595 card->erased_byte = 0xFF; in mmc_decode_ext_csd()
597 card->erased_byte = 0x0; in mmc_decode_ext_csd()
600 card->ext_csd.generic_cmd6_time = DEFAULT_CMD6_TIMEOUT_MS; in mmc_decode_ext_csd()
601 if (card->ext_csd.rev >= 6) { in mmc_decode_ext_csd()
602 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; in mmc_decode_ext_csd()
604 card->ext_csd.generic_cmd6_time = 10 * in mmc_decode_ext_csd()
606 card->ext_csd.power_off_longtime = 10 * in mmc_decode_ext_csd()
609 card->ext_csd.cache_size = in mmc_decode_ext_csd()
616 card->ext_csd.data_sector_size = 4096; in mmc_decode_ext_csd()
618 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
622 card->ext_csd.data_tag_unit_size = in mmc_decode_ext_csd()
624 (card->ext_csd.data_sector_size); in mmc_decode_ext_csd()
626 card->ext_csd.data_tag_unit_size = 0; in mmc_decode_ext_csd()
629 card->ext_csd.data_sector_size = 512; in mmc_decode_ext_csd()
637 if (!card->ext_csd.part_time) in mmc_decode_ext_csd()
638 card->ext_csd.part_time = card->ext_csd.generic_cmd6_time; in mmc_decode_ext_csd()
640 if (card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) in mmc_decode_ext_csd()
641 card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; in mmc_decode_ext_csd()
644 if (card->ext_csd.rev >= 7) { in mmc_decode_ext_csd()
645 memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION], in mmc_decode_ext_csd()
647 card->ext_csd.ffu_capable = in mmc_decode_ext_csd()
651 card->ext_csd.pre_eol_info = ext_csd[EXT_CSD_PRE_EOL_INFO]; in mmc_decode_ext_csd()
652 card->ext_csd.device_life_time_est_typ_a = in mmc_decode_ext_csd()
654 card->ext_csd.device_life_time_est_typ_b = in mmc_decode_ext_csd()
659 if (card->ext_csd.rev >= 8) { in mmc_decode_ext_csd()
660 card->ext_csd.cmdq_support = ext_csd[EXT_CSD_CMDQ_SUPPORT] & in mmc_decode_ext_csd()
662 card->ext_csd.cmdq_depth = (ext_csd[EXT_CSD_CMDQ_DEPTH] & in mmc_decode_ext_csd()
665 if (card->ext_csd.cmdq_depth <= 2) { in mmc_decode_ext_csd()
666 card->ext_csd.cmdq_support = false; in mmc_decode_ext_csd()
667 card->ext_csd.cmdq_depth = 0; in mmc_decode_ext_csd()
669 if (card->ext_csd.cmdq_support) { in mmc_decode_ext_csd()
671 mmc_hostname(card->host), in mmc_decode_ext_csd()
672 card->ext_csd.cmdq_depth); in mmc_decode_ext_csd()
674 card->ext_csd.enhanced_rpmb_supported = in mmc_decode_ext_csd()
675 (card->ext_csd.rel_param & in mmc_decode_ext_csd()
694 if ((err != -EINVAL) in mmc_read_ext_csd()
695 && (err != -ENOSYS) in mmc_read_ext_csd()
696 && (err != -EFAULT)) in mmc_read_ext_csd()
703 if (card->csd.capacity == (4096 * 512)) { in mmc_read_ext_csd()
705 mmc_hostname(card->host)); in mmc_read_ext_csd()
708 mmc_hostname(card->host)); in mmc_read_ext_csd()
733 err = !((card->ext_csd.raw_partition_support == in mmc_compare_ext_csds()
735 (card->ext_csd.raw_erased_mem_count == in mmc_compare_ext_csds()
737 (card->ext_csd.rev == in mmc_compare_ext_csds()
739 (card->ext_csd.raw_ext_csd_structure == in mmc_compare_ext_csds()
741 (card->ext_csd.raw_card_type == in mmc_compare_ext_csds()
743 (card->ext_csd.raw_s_a_timeout == in mmc_compare_ext_csds()
745 (card->ext_csd.raw_hc_erase_gap_size == in mmc_compare_ext_csds()
747 (card->ext_csd.raw_erase_timeout_mult == in mmc_compare_ext_csds()
749 (card->ext_csd.raw_hc_erase_grp_size == in mmc_compare_ext_csds()
751 (card->ext_csd.raw_sec_trim_mult == in mmc_compare_ext_csds()
753 (card->ext_csd.raw_sec_erase_mult == in mmc_compare_ext_csds()
755 (card->ext_csd.raw_sec_feature_support == in mmc_compare_ext_csds()
757 (card->ext_csd.raw_trim_mult == in mmc_compare_ext_csds()
759 (card->ext_csd.raw_sectors[0] == in mmc_compare_ext_csds()
761 (card->ext_csd.raw_sectors[1] == in mmc_compare_ext_csds()
763 (card->ext_csd.raw_sectors[2] == in mmc_compare_ext_csds()
765 (card->ext_csd.raw_sectors[3] == in mmc_compare_ext_csds()
767 (card->ext_csd.raw_pwr_cl_52_195 == in mmc_compare_ext_csds()
769 (card->ext_csd.raw_pwr_cl_26_195 == in mmc_compare_ext_csds()
771 (card->ext_csd.raw_pwr_cl_52_360 == in mmc_compare_ext_csds()
773 (card->ext_csd.raw_pwr_cl_26_360 == in mmc_compare_ext_csds()
775 (card->ext_csd.raw_pwr_cl_200_195 == in mmc_compare_ext_csds()
777 (card->ext_csd.raw_pwr_cl_200_360 == in mmc_compare_ext_csds()
779 (card->ext_csd.raw_pwr_cl_ddr_52_195 == in mmc_compare_ext_csds()
781 (card->ext_csd.raw_pwr_cl_ddr_52_360 == in mmc_compare_ext_csds()
783 (card->ext_csd.raw_pwr_cl_ddr_200_360 == in mmc_compare_ext_csds()
787 err = -EINVAL; in mmc_compare_ext_csds()
793 MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
794 card->raw_cid[2], card->raw_cid[3]);
795 MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
796 card->raw_csd[2], card->raw_csd[3]);
797 MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
798 MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9);
799 MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9);
800 MMC_DEV_ATTR(wp_grp_size, "%u\n", card->wp_grp_size << 9);
801 MMC_DEV_ATTR(ffu_capable, "%d\n", card->ext_csd.ffu_capable);
802 MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
803 MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
804 MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
805 MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
806 MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);
807 MMC_DEV_ATTR(rev, "0x%x\n", card->ext_csd.rev);
808 MMC_DEV_ATTR(pre_eol_info, "0x%02x\n", card->ext_csd.pre_eol_info);
810 card->ext_csd.device_life_time_est_typ_a,
811 card->ext_csd.device_life_time_est_typ_b);
812 MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
814 card->ext_csd.enhanced_area_offset);
815 MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
816 MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
818 card->ext_csd.enhanced_rpmb_supported);
819 MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
820 MMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr);
821 MMC_DEV_ATTR(rca, "0x%04x\n", card->rca);
822 MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en);
830 if (card->ext_csd.rev < 7) in mmc_fwrev_show()
831 return sysfs_emit(buf, "0x%x\n", card->cid.fwrev); in mmc_fwrev_show()
834 card->ext_csd.fwrev); in mmc_fwrev_show()
844 struct mmc_host *host = card->host; in mmc_dsr_show()
846 if (card->csd.dsr_imp && host->dsr_req) in mmc_dsr_show()
847 return sysfs_emit(buf, "0x%x\n", host->dsr); in mmc_dsr_show()
899 struct mmc_host *host = card->host; in __mmc_select_powerclass()
900 struct mmc_ext_csd *ext_csd = &card->ext_csd; in __mmc_select_powerclass()
904 switch (1 << host->ios.vdd) { in __mmc_select_powerclass()
906 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) in __mmc_select_powerclass()
907 pwrclass_val = ext_csd->raw_pwr_cl_26_195; in __mmc_select_powerclass()
908 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) in __mmc_select_powerclass()
910 ext_csd->raw_pwr_cl_52_195 : in __mmc_select_powerclass()
911 ext_csd->raw_pwr_cl_ddr_52_195; in __mmc_select_powerclass()
912 else if (host->ios.clock <= MMC_HS200_MAX_DTR) in __mmc_select_powerclass()
913 pwrclass_val = ext_csd->raw_pwr_cl_200_195; in __mmc_select_powerclass()
924 if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) in __mmc_select_powerclass()
925 pwrclass_val = ext_csd->raw_pwr_cl_26_360; in __mmc_select_powerclass()
926 else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) in __mmc_select_powerclass()
928 ext_csd->raw_pwr_cl_52_360 : in __mmc_select_powerclass()
929 ext_csd->raw_pwr_cl_ddr_52_360; in __mmc_select_powerclass()
930 else if (host->ios.clock <= MMC_HS200_MAX_DTR) in __mmc_select_powerclass()
932 ext_csd->raw_pwr_cl_ddr_200_360 : in __mmc_select_powerclass()
933 ext_csd->raw_pwr_cl_200_360; in __mmc_select_powerclass()
938 return -EINVAL; in __mmc_select_powerclass()
953 card->ext_csd.generic_cmd6_time); in __mmc_select_powerclass()
961 struct mmc_host *host = card->host; in mmc_select_powerclass()
969 bus_width = host->ios.bus_width; in mmc_select_powerclass()
974 ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52; in mmc_select_powerclass()
995 unsigned int max_dtr = (unsigned int)-1; in mmc_set_bus_speed()
998 max_dtr > card->ext_csd.hs200_max_dtr) in mmc_set_bus_speed()
999 max_dtr = card->ext_csd.hs200_max_dtr; in mmc_set_bus_speed()
1000 else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr) in mmc_set_bus_speed()
1001 max_dtr = card->ext_csd.hs_max_dtr; in mmc_set_bus_speed()
1002 else if (max_dtr > card->csd.max_dtr) in mmc_set_bus_speed()
1003 max_dtr = card->csd.max_dtr; in mmc_set_bus_speed()
1005 mmc_set_clock(card->host, max_dtr); in mmc_set_bus_speed()
1009 * Select the bus width amoung 4-bit and 8-bit(SDR).
1025 struct mmc_host *host = card->host; in mmc_select_bus_width()
1030 !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) in mmc_select_bus_width()
1033 idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1; in mmc_select_bus_width()
1052 card->ext_csd.generic_cmd6_time); in mmc_select_bus_width()
1064 if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST)) in mmc_select_bus_width()
1082 * Switch to the high-speed mode
1090 card->ext_csd.generic_cmd6_time, MMC_TIMING_MMC_HS, in mmc_select_hs()
1093 pr_warn("%s: switch to high-speed failed, err:%d\n", in mmc_select_hs()
1094 mmc_hostname(card->host), err); in mmc_select_hs()
1104 struct mmc_host *host = card->host; in mmc_select_hs_ddr()
1108 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52)) in mmc_select_hs_ddr()
1111 bus_width = host->ios.bus_width; in mmc_select_hs_ddr()
1121 card->ext_csd.generic_cmd6_time, in mmc_select_hs_ddr()
1155 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { in mmc_select_hs_ddr()
1161 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V && in mmc_select_hs_ddr()
1162 host->caps & MMC_CAP_1_8V_DDR) in mmc_select_hs_ddr()
1174 struct mmc_host *host = card->host; in mmc_select_hs400()
1180 * HS400 mode requires 8-bit bus width in mmc_select_hs400()
1182 if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_select_hs400()
1183 host->ios.bus_width == MMC_BUS_WIDTH_8)) in mmc_select_hs400()
1190 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1193 pr_err("%s: switch to high-speed from hs200 failed, err:%d\n", in mmc_select_hs400()
1199 if (host->ops->hs400_downgrade) in mmc_select_hs400()
1200 host->ops->hs400_downgrade(host); in mmc_select_hs400()
1206 max_dtr = card->ext_csd.hs_max_dtr; in mmc_select_hs400()
1213 if (host->ops->hs400_prepare_ddr) in mmc_select_hs400()
1214 host->ops->hs400_prepare_ddr(host); in mmc_select_hs400()
1220 card->ext_csd.generic_cmd6_time); in mmc_select_hs400()
1229 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400()
1232 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400()
1244 if (host->ops->execute_hs400_tuning) { in mmc_select_hs400()
1246 err = host->ops->execute_hs400_tuning(host, card); in mmc_select_hs400()
1252 if (host->ops->hs400_complete) in mmc_select_hs400()
1253 host->ops->hs400_complete(host); in mmc_select_hs400()
1262 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400()
1274 struct mmc_host *host = card->host; in mmc_hs400_to_hs200()
1280 max_dtr = card->ext_csd.hs_max_dtr; in mmc_hs400_to_hs200()
1286 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1291 if (host->ops->hs400_downgrade) in mmc_hs400_to_hs200()
1292 host->ops->hs400_downgrade(host); in mmc_hs400_to_hs200()
1302 EXT_CSD_BUS_WIDTH_8, card->ext_csd.generic_cmd6_time, in mmc_hs400_to_hs200()
1315 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_hs400_to_hs200()
1317 val, card->ext_csd.generic_cmd6_time, 0, in mmc_hs400_to_hs200()
1336 if (host->ops->prepare_hs400_tuning) in mmc_hs400_to_hs200()
1337 host->ops->prepare_hs400_tuning(host, &host->ios); in mmc_hs400_to_hs200()
1342 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_hs400_to_hs200()
1350 int fixed_drv_type = card->host->fixed_drv_type; in mmc_select_driver_type()
1352 card_drv_type = card->ext_csd.raw_driver_strength | in mmc_select_driver_type()
1360 card->ext_csd.hs200_max_dtr, in mmc_select_driver_type()
1363 card->drive_strength = drive_strength; in mmc_select_driver_type()
1366 mmc_set_driver_type(card->host, drv_type); in mmc_select_driver_type()
1371 struct mmc_host *host = card->host; in mmc_select_hs400es()
1372 int err = -EINVAL; in mmc_select_hs400es()
1375 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_2V) in mmc_select_hs400es()
1378 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_8V) in mmc_select_hs400es()
1389 err = err < 0 ? err : -ENOTSUPP; in mmc_select_hs400es()
1396 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1420 card->ext_csd.generic_cmd6_time); in mmc_select_hs400es()
1431 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs400es()
1434 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs400es()
1446 host->ios.enhanced_strobe = true; in mmc_select_hs400es()
1447 if (host->ops->hs400_enhanced_strobe) in mmc_select_hs400es()
1448 host->ops->hs400_enhanced_strobe(host, &host->ios); in mmc_select_hs400es()
1457 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs400es()
1465 * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported)
1471 struct mmc_host *host = card->host; in mmc_select_hs200()
1473 int err = -EINVAL; in mmc_select_hs200()
1476 old_signal_voltage = host->ios.signal_voltage; in mmc_select_hs200()
1477 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V) in mmc_select_hs200()
1480 if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V) in mmc_select_hs200()
1496 card->drive_strength << EXT_CSD_DRV_STR_SHIFT; in mmc_select_hs200()
1499 card->ext_csd.generic_cmd6_time, 0, in mmc_select_hs200()
1510 old_timing = host->ios.timing; in mmc_select_hs200()
1511 old_clock = host->ios.clock; in mmc_select_hs200()
1513 mmc_set_clock(card->host, card->ext_csd.hs_max_dtr); in mmc_select_hs200()
1526 if (err == -EBADMSG) { in mmc_select_hs200()
1535 err = -EIO; in mmc_select_hs200()
1537 pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), in mmc_select_hs200()
1553 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES) { in mmc_select_timing()
1558 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) { in mmc_select_timing()
1560 if (err == -EBADMSG) in mmc_select_timing()
1561 card->mmc_avail_type &= ~EXT_CSD_CARD_TYPE_HS200; in mmc_select_timing()
1566 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS) in mmc_select_timing()
1570 if (err && err != -EBADMSG) in mmc_select_timing()
1588 struct mmc_host *host = card->host; in mmc_hs200_tuning()
1594 if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && in mmc_hs200_tuning()
1595 host->ios.bus_width == MMC_BUS_WIDTH_8) in mmc_hs200_tuning()
1596 if (host->ops->prepare_hs400_tuning) in mmc_hs200_tuning()
1597 host->ops->prepare_hs400_tuning(host, &host->ios); in mmc_hs200_tuning()
1616 WARN_ON(!host->claimed); in mmc_init_card()
1653 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) { in mmc_init_card()
1656 err = -ENOENT; in mmc_init_card()
1671 card->ocr = ocr; in mmc_init_card()
1672 card->type = MMC_TYPE_MMC; in mmc_init_card()
1673 card->rca = 1; in mmc_init_card()
1674 memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); in mmc_init_card()
1680 if (host->ops->init_card) in mmc_init_card()
1681 host->ops->init_card(host, card); in mmc_init_card()
1698 err = mmc_send_csd(card, card->raw_csd); in mmc_init_card()
1714 if (card->csd.dsr_imp && host->dsr_req) in mmc_init_card()
1735 * addressing. See section 8.1 JEDEC Standard JED84-A441; in mmc_init_card()
1752 if (card->ext_csd.rev >= 3) { in mmc_init_card()
1755 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1757 if (err && err != -EBADMSG) in mmc_init_card()
1766 card->ext_csd.enhanced_area_offset = -EINVAL; in mmc_init_card()
1767 card->ext_csd.enhanced_area_size = -EINVAL; in mmc_init_card()
1769 card->ext_csd.erase_group_def = 1; in mmc_init_card()
1782 if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) { in mmc_init_card()
1783 card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; in mmc_init_card()
1785 card->ext_csd.part_config, in mmc_init_card()
1786 card->ext_csd.part_time); in mmc_init_card()
1787 if (err && err != -EBADMSG) in mmc_init_card()
1794 if (card->ext_csd.rev >= 6) { in mmc_init_card()
1798 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1799 if (err && err != -EBADMSG) in mmc_init_card()
1803 * The err can be -EBADMSG or 0, in mmc_init_card()
1807 card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; in mmc_init_card()
1812 card->erase_arg = MMC_DISCARD_ARG; in mmc_init_card()
1814 card->erase_arg = MMC_TRIM_ARG; in mmc_init_card()
1816 card->erase_arg = MMC_ERASE_ARG; in mmc_init_card()
1826 host->doing_init_tune = 1; in mmc_init_card()
1832 host->doing_init_tune = 0; in mmc_init_card()
1837 if (host->ops->execute_hs400_tuning) { in mmc_init_card()
1838 err = host->ops->execute_hs400_tuning(host, card); in mmc_init_card()
1858 * Enable HPI feature (if supported) in mmc_init_card()
1860 if (card->ext_csd.hpi) { in mmc_init_card()
1863 card->ext_csd.generic_cmd6_time); in mmc_init_card()
1864 if (err && err != -EBADMSG) in mmc_init_card()
1867 pr_warn("%s: Enabling HPI failed\n", in mmc_init_card()
1868 mmc_hostname(card->host)); in mmc_init_card()
1869 card->ext_csd.hpi_en = 0; in mmc_init_card()
1871 card->ext_csd.hpi_en = 1; in mmc_init_card()
1882 if (card->ext_csd.cache_size > 0) { in mmc_init_card()
1885 timeout_ms = max(card->ext_csd.generic_cmd6_time, timeout_ms); in mmc_init_card()
1888 if (err && err != -EBADMSG) in mmc_init_card()
1896 mmc_hostname(card->host), err); in mmc_init_card()
1897 card->ext_csd.cache_ctrl = 0; in mmc_init_card()
1899 card->ext_csd.cache_ctrl = 1; in mmc_init_card()
1907 card->ext_csd.cmdq_en = false; in mmc_init_card()
1908 if (card->ext_csd.cmdq_support && host->caps2 & MMC_CAP2_CQE) { in mmc_init_card()
1910 if (err && err != -EBADMSG) in mmc_init_card()
1914 mmc_hostname(card->host)); in mmc_init_card()
1915 card->ext_csd.cmdq_support = false; in mmc_init_card()
1916 card->ext_csd.cmdq_depth = 0; in mmc_init_card()
1921 * disabled for a time, so a flag is needed to indicate to re-enable the in mmc_init_card()
1924 card->reenable_cmdq = card->ext_csd.cmdq_en; in mmc_init_card()
1926 if (host->cqe_ops && !host->cqe_enabled) { in mmc_init_card()
1927 err = host->cqe_ops->cqe_enable(host, card); in mmc_init_card()
1929 host->cqe_enabled = true; in mmc_init_card()
1931 if (card->ext_csd.cmdq_en) { in mmc_init_card()
1935 host->hsq_enabled = true; in mmc_init_card()
1942 if (host->caps2 & MMC_CAP2_AVOID_3_3V && in mmc_init_card()
1943 host->ios.signal_voltage == MMC_SIGNAL_VOLTAGE_330) { in mmc_init_card()
1946 err = -EINVAL; in mmc_init_card()
1951 host->card = card; in mmc_init_card()
1964 return card->ext_csd.rev >= 3; in mmc_can_sleep()
1971 *busy = host->ops->card_busy(host); in mmc_sleep_busy_cb()
1978 struct mmc_card *card = host->card; in mmc_sleep()
1979 unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000); in mmc_sleep()
1983 /* Re-tuning can't be done once the card is deselected */ in mmc_sleep()
1991 cmd.arg = card->rca << 16; in mmc_sleep()
2005 if (host->caps & MMC_CAP_WAIT_WHILE_BUSY && use_r1b_resp) in mmc_sleep()
2008 if (!host->ops->card_busy) { in mmc_sleep()
2024 (card->ext_csd.power_off_notification == EXT_CSD_POWER_ON); in mmc_can_poweroff_notify()
2029 unsigned int timeout = card->ext_csd.generic_cmd6_time; in mmc_poweroff_notify()
2034 timeout = card->ext_csd.power_off_longtime; in mmc_poweroff_notify()
2041 mmc_hostname(card->host), timeout); in mmc_poweroff_notify()
2044 card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION; in mmc_poweroff_notify()
2054 mmc_remove_card(host->card); in mmc_remove()
2055 host->card = NULL; in mmc_remove()
2059 * Card detection - card is alive.
2063 return mmc_send_status(host->card, NULL); in mmc_alive()
2073 mmc_get_card(host->card, NULL); in mmc_detect()
2080 mmc_put_card(host->card, NULL); in mmc_detect()
2094 return host->card->ext_csd.cache_size > 0 && in _mmc_cache_enabled()
2095 host->card->ext_csd.cache_ctrl & 1; in _mmc_cache_enabled()
2099 * Flush the internal cache of the eMMC to non-volatile storage.
2105 if (mmc_card_broken_cache_flush(host->card) && !host->card->written_flag) in _mmc_flush_cache()
2109 err = mmc_switch(host->card, EXT_CSD_CMD_SET_NORMAL, in _mmc_flush_cache()
2115 host->card->written_flag = false; in _mmc_flush_cache()
2129 if (mmc_card_suspended(host->card)) in _mmc_suspend()
2136 if (mmc_can_poweroff_notify(host->card) && in _mmc_suspend()
2137 ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend || in _mmc_suspend()
2138 (host->caps2 & MMC_CAP2_FULL_PWR_CYCLE_IN_SUSPEND))) in _mmc_suspend()
2139 err = mmc_poweroff_notify(host->card, notify_type); in _mmc_suspend()
2140 else if (mmc_can_sleep(host->card)) in _mmc_suspend()
2147 mmc_card_set_suspended(host->card); in _mmc_suspend()
2163 pm_runtime_disable(&host->card->dev); in mmc_suspend()
2164 pm_runtime_set_suspended(&host->card->dev); in mmc_suspend()
2180 if (!mmc_card_suspended(host->card)) in _mmc_resume()
2183 mmc_power_up(host, host->card->ocr); in _mmc_resume()
2184 err = mmc_init_card(host, host->card->ocr, host->card); in _mmc_resume()
2185 mmc_card_clr_suspended(host->card); in _mmc_resume()
2203 if (mmc_can_poweroff_notify(host->card) && in mmc_shutdown()
2204 !(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE)) in mmc_shutdown()
2218 pm_runtime_enable(&host->card->dev); in mmc_resume()
2229 if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) in mmc_runtime_suspend()
2248 if (err && err != -ENOMEDIUM) in mmc_runtime_resume()
2259 rst_n_function = card->ext_csd.rst_n_function; in mmc_can_reset()
2267 struct mmc_card *card = host->card; in _mmc_hw_reset()
2275 if ((host->caps & MMC_CAP_HW_RESET) && host->ops->card_hw_reset && in _mmc_hw_reset()
2278 mmc_set_clock(host, host->f_init); in _mmc_hw_reset()
2279 host->ops->card_hw_reset(host); in _mmc_hw_reset()
2284 mmc_power_cycle(host, card->ocr); in _mmc_hw_reset()
2287 return mmc_init_card(host, card->ocr, card); in _mmc_hw_reset()
2312 WARN_ON(!host->claimed); in mmc_attach_mmc()
2323 if (host->ocr_avail_mmc) in mmc_attach_mmc()
2324 host->ocr_avail = host->ocr_avail_mmc; in mmc_attach_mmc()
2341 err = -EINVAL; in mmc_attach_mmc()
2353 err = mmc_add_card(host->card); in mmc_attach_mmc()
2361 mmc_remove_card(host->card); in mmc_attach_mmc()
2363 host->card = NULL; in mmc_attach_mmc()