@@ -605,6 +605,18 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
605605 card -> ext_csd .device_life_time_est_typ_b =
606606 ext_csd [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B ];
607607 }
608+
609+ /* eMMC v5.0 or later */
610+ if (card -> ext_csd .rev > 6 ) {
611+ card -> ext_csd .health [0 ] = ext_csd [EXT_CSD_HEALTH + 0 ];
612+ card -> ext_csd .health [1 ] = ext_csd [EXT_CSD_HEALTH + 1 ];
613+ card -> ext_csd .health [2 ] = ext_csd [EXT_CSD_HEALTH + 2 ];
614+ }else {
615+ card -> ext_csd .health [0 ] = 0xff ;
616+ card -> ext_csd .health [1 ] = 0xff ;
617+ card -> ext_csd .health [2 ] = 0xff ;
618+ }
619+
608620out :
609621 return err ;
610622}
@@ -720,6 +732,19 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)
720732 return err ;
721733}
722734
735+ int emmc_total_size (struct mmc_card * card )
736+ {
737+ int i ;
738+ i = fls (card -> ext_csd .sectors );
739+ if (i > 21 ) {
740+ /* 4GB or above */
741+ return (int )(card -> ext_csd .sectors >> (i - 1 )) << (i - 21 );
742+ } else {
743+ pr_err ("mmc0: wrong sector count\n" );
744+ return 0 ;
745+ }
746+ }
747+
723748MMC_DEV_ATTR (cid , "%08x%08x%08x%08x\n" , card -> raw_cid [0 ], card -> raw_cid [1 ],
724749 card -> raw_cid [2 ], card -> raw_cid [3 ]);
725750MMC_DEV_ATTR (csd , "%08x%08x%08x%08x\n" , card -> raw_csd [0 ], card -> raw_csd [1 ],
@@ -745,6 +770,9 @@ MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size);
745770MMC_DEV_ATTR (raw_rpmb_size_mult , "%#x\n" , card -> ext_csd .raw_rpmb_size_mult );
746771MMC_DEV_ATTR (rel_sectors , "%#x\n" , card -> ext_csd .rel_sectors );
747772MMC_DEV_ATTR (ocr , "%08x\n" , card -> ocr );
773+ MMC_DEV_ATTR (total_size , "%d\n" , card -> ext_csd .sectors / 2 );
774+ MMC_DEV_ATTR (emmc_total_size , "%d\n" , emmc_total_size (card ));
775+ MMC_DEV_ATTR (health ,"0x%x 0x%x 0x%x\n" ,card -> ext_csd .health [0 ],card -> ext_csd .health [1 ],card -> ext_csd .health [2 ]);
748776
749777static ssize_t mmc_fwrev_show (struct device * dev ,
750778 struct device_attribute * attr ,
@@ -801,6 +829,9 @@ static struct attribute *mmc_std_attrs[] = {
801829 & dev_attr_rel_sectors .attr ,
802830 & dev_attr_ocr .attr ,
803831 & dev_attr_dsr .attr ,
832+ & dev_attr_total_size .attr ,
833+ & dev_attr_emmc_total_size .attr ,
834+ & dev_attr_health .attr ,
804835 NULL ,
805836};
806837ATTRIBUTE_GROUPS (mmc_std );
0 commit comments