Loading drivers/mmc/core/mmc.c +23 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,19 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; /* * Some eMMC vendors violate eMMC 5.0 spec and set * REL_WR_SEC_C register to 0x10 to indicate the * ability of RPMB throughput improvement thus lead * to failure when TZ module write data to RPMB * partition. So check bit[4] of EXT_CSD[166] and * if it is not set then change value of REL_WR_SEC_C * to 0x1 directly ignoring value of EXT_CSD[222]. */ if (!(card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR)) card->ext_csd.rel_sectors = 0x1; /* * RPMB regions are defined in multiples of 128K. */ Loading Loading @@ -668,6 +681,10 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]; card->ext_csd.device_life_time_est_typ_b = ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]; card->ext_csd.fw_version = ext_csd[EXT_CSD_FIRMWARE_VERSION]; pr_info("%s: eMMC FW version: 0x%02x\n", mmc_hostname(card->host), card->ext_csd.fw_version); } /* eMMC v5.1 or later */ Loading @@ -686,6 +703,9 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) mmc_hostname(card->host), card->ext_csd.cmdq_depth); } card->ext_csd.enhanced_rpmb_supported = (card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR); } out: return err; Loading Loading @@ -828,6 +848,8 @@ MMC_DEV_ATTR(enhanced_area_offset, "%llu\n", card->ext_csd.enhanced_area_offset); MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size); MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); MMC_DEV_ATTR(enhanced_rpmb_supported, "%#x\n", card->ext_csd.enhanced_rpmb_supported); MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); MMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr); MMC_DEV_ATTR(rca, "0x%04x\n", card->rca); Loading Loading @@ -885,6 +907,7 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_enhanced_area_offset.attr, &dev_attr_enhanced_area_size.attr, &dev_attr_raw_rpmb_size_mult.attr, &dev_attr_enhanced_rpmb_supported.attr, &dev_attr_rel_sectors.attr, &dev_attr_ocr.attr, &dev_attr_rca.attr, Loading drivers/mmc/host/sdhci.c +2 −0 Original line number Diff line number Diff line Loading @@ -2053,6 +2053,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) mrq->cmd->error = -EIO; if (mrq->data) mrq->data->error = -EIO; host->mrq = NULL; sdhci_dumpregs(host); mmc_request_done(host->mmc, mrq); } Loading include/linux/mmc/card.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ struct mmc_ext_csd { u8 sec_feature_support; u8 rel_sectors; u8 rel_param; bool enhanced_rpmb_supported; u8 part_config; u8 cache_ctrl; u8 rst_n_function; Loading include/linux/mmc/mmc.h +2 −1 Original line number Diff line number Diff line Loading @@ -316,6 +316,7 @@ static inline bool mmc_op_multi(u32 opcode) */ #define EXT_CSD_WR_REL_PARAM_EN (1<<2) #define EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR (1<<4) #define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40) #define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10) Loading Loading
drivers/mmc/core/mmc.c +23 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,19 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; /* * Some eMMC vendors violate eMMC 5.0 spec and set * REL_WR_SEC_C register to 0x10 to indicate the * ability of RPMB throughput improvement thus lead * to failure when TZ module write data to RPMB * partition. So check bit[4] of EXT_CSD[166] and * if it is not set then change value of REL_WR_SEC_C * to 0x1 directly ignoring value of EXT_CSD[222]. */ if (!(card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR)) card->ext_csd.rel_sectors = 0x1; /* * RPMB regions are defined in multiples of 128K. */ Loading Loading @@ -668,6 +681,10 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]; card->ext_csd.device_life_time_est_typ_b = ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]; card->ext_csd.fw_version = ext_csd[EXT_CSD_FIRMWARE_VERSION]; pr_info("%s: eMMC FW version: 0x%02x\n", mmc_hostname(card->host), card->ext_csd.fw_version); } /* eMMC v5.1 or later */ Loading @@ -686,6 +703,9 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) mmc_hostname(card->host), card->ext_csd.cmdq_depth); } card->ext_csd.enhanced_rpmb_supported = (card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR); } out: return err; Loading Loading @@ -828,6 +848,8 @@ MMC_DEV_ATTR(enhanced_area_offset, "%llu\n", card->ext_csd.enhanced_area_offset); MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size); MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); MMC_DEV_ATTR(enhanced_rpmb_supported, "%#x\n", card->ext_csd.enhanced_rpmb_supported); MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); MMC_DEV_ATTR(ocr, "0x%08x\n", card->ocr); MMC_DEV_ATTR(rca, "0x%04x\n", card->rca); Loading Loading @@ -885,6 +907,7 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_enhanced_area_offset.attr, &dev_attr_enhanced_area_size.attr, &dev_attr_raw_rpmb_size_mult.attr, &dev_attr_enhanced_rpmb_supported.attr, &dev_attr_rel_sectors.attr, &dev_attr_ocr.attr, &dev_attr_rca.attr, Loading
drivers/mmc/host/sdhci.c +2 −0 Original line number Diff line number Diff line Loading @@ -2053,6 +2053,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) mrq->cmd->error = -EIO; if (mrq->data) mrq->data->error = -EIO; host->mrq = NULL; sdhci_dumpregs(host); mmc_request_done(host->mmc, mrq); } Loading
include/linux/mmc/card.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ struct mmc_ext_csd { u8 sec_feature_support; u8 rel_sectors; u8 rel_param; bool enhanced_rpmb_supported; u8 part_config; u8 cache_ctrl; u8 rst_n_function; Loading
include/linux/mmc/mmc.h +2 −1 Original line number Diff line number Diff line Loading @@ -316,6 +316,7 @@ static inline bool mmc_op_multi(u32 opcode) */ #define EXT_CSD_WR_REL_PARAM_EN (1<<2) #define EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR (1<<4) #define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40) #define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10) Loading