Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 822ce019 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mmc: core: set REL_WR_SEC_C register to 0x1 per eMMC5.0 spec"

parents f27551bd 0ec4b188
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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.
		 */
@@ -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 */
@@ -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;
@@ -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);
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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);
}

+1 −0
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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)