diff mbox series

[1/2] mmc: add helper to query max enhanced part size

Message ID 1d862733e0d4ae632eb036de13aaf048b31b8bdb.1632313515.git.matthias.schiffer@ew.tq-group.com
State Changes Requested
Delegated to: Jaehoon Chung
Headers show
Series [1/2] mmc: add helper to query max enhanced part size | expand

Commit Message

Matthias Schiffer Sept. 22, 2021, 12:30 p.m. UTC
From: Markus Niebel <Markus.Niebel@ew.tq-group.com>

This helper will be used later on in an extension of the mmc
command.

Signed-off-by: Markus Niebel <Markus.Niebel@ew.tq-group.com>
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
---
 drivers/mmc/mmc.c | 38 ++++++++++++++++++++++++++++++++++++++
 include/mmc.h     |  1 +
 2 files changed, 39 insertions(+)

Comments

Jaehoon Chung Sept. 23, 2021, 11:58 a.m. UTC | #1
Hi,

On 9/22/21 9:30 PM, Matthias Schiffer wrote:
> From: Markus Niebel <Markus.Niebel@ew.tq-group.com>
> 
> This helper will be used later on in an extension of the mmc
> command.
> 
> Signed-off-by: Markus Niebel <Markus.Niebel@ew.tq-group.com>
> Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
> ---
>  drivers/mmc/mmc.c | 38 ++++++++++++++++++++++++++++++++++++++
>  include/mmc.h     |  1 +
>  2 files changed, 39 insertions(+)
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index d3babbfeb1c..c1b1ef7eb0b 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -1039,6 +1039,44 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
>  }
>  
>  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size)
> +{
> +	u64 sz;
> +	int err;
> +
> +	ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
> +
> +	if (IS_SD(mmc) || mmc->version < MMC_VERSION_4_41) {
> +		pr_err("eMMC >= 4.4 required for enhanced user data area\n");

Error log is considering about only eMMC. It can be SD-card.

> +		return -EMEDIUMTYPE;
> +	}
> +
> +	if (!(mmc->part_support & PART_SUPPORT)) {
> +		pr_err("Card does not support partitioning\n");
> +		return -EMEDIUMTYPE;
> +	}
> +
> +	if (!mmc->hc_wp_grp_size) {
> +		pr_err("Card does not define HC WP group size\n");
> +		return -EMEDIUMTYPE;
> +	}
> +
> +	err = mmc_send_ext_csd(mmc, ext_csd);
> +	if (err)
> +		return err;
> +
> +	sz =
> +		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 2] << 16) +
> +		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 1] << 8) +
> +		ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
> +	sz *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
> +	sz *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
> +	sz *= SZ_1K;

To use the num of sector, i think better that is adding Comment.
And using not "sz" as variable. It seems to describe real size, not sector.
According to spec, it's 512kByte. It can be confused.

Best Regards,
Jaehoon Chung

> +	*size = sz;
> +
> +	return 0;
> +}
> +
>  int mmc_hwpart_config(struct mmc *mmc,
>  		      const struct mmc_hwpart_conf *conf,
>  		      enum mmc_hwpart_conf_mode mode)
> diff --git a/include/mmc.h b/include/mmc.h
> index b92e2553402..3e1fc82d9b4 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -846,6 +846,7 @@ void print_mmc_devices(char separator);
>   */
>  int get_mmc_num(void);
>  int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
> +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size);
>  int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
>  		      enum mmc_hwpart_conf_mode mode);
>  
>
Matthias Schiffer Sept. 23, 2021, 12:55 p.m. UTC | #2
On Thu, 2021-09-23 at 20:58 +0900, Jaehoon Chung wrote:
> Hi,
> 
> On 9/22/21 9:30 PM, Matthias Schiffer wrote:
> > From: Markus Niebel <Markus.Niebel@ew.tq-group.com>
> > 
> > This helper will be used later on in an extension of the mmc
> > command.
> > 
> > Signed-off-by: Markus Niebel <Markus.Niebel@ew.tq-group.com>
> > Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
> > ---
> >  drivers/mmc/mmc.c | 38 ++++++++++++++++++++++++++++++++++++++
> >  include/mmc.h     |  1 +
> >  2 files changed, 39 insertions(+)
> > 
> > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> > index d3babbfeb1c..c1b1ef7eb0b 100644
> > --- a/drivers/mmc/mmc.c
> > +++ b/drivers/mmc/mmc.c
> > @@ -1039,6 +1039,44 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
> >  }
> >  
> >  #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
> > +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size)
> > +{
> > +	u64 sz;
> > +	int err;
> > +
> > +	ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
> > +
> > +	if (IS_SD(mmc) || mmc->version < MMC_VERSION_4_41) {
> > +		pr_err("eMMC >= 4.4 required for enhanced user data area\n");
> 
> Error log is considering about only eMMC. It can be SD-card.

This check and message were taken from mmc_hwpart_config(). I think it
is okay (after all it tells you "eMMC [...] required [...]" if you try
the command on an SD card), but I can extend the message if you want.

I also noticed another slight difference between the check and the
message: The check is for eMMC 4.41, while the message talks about eMMC
4.4. I'd like to make both match, but I don't know whether 4.4 or 4.41
is the correct requirement.


> 
> > +		return -EMEDIUMTYPE;
> > +	}
> > +
> > +	if (!(mmc->part_support & PART_SUPPORT)) {
> > +		pr_err("Card does not support partitioning\n");
> > +		return -EMEDIUMTYPE;
> > +	}
> > +
> > +	if (!mmc->hc_wp_grp_size) {
> > +		pr_err("Card does not define HC WP group size\n");
> > +		return -EMEDIUMTYPE;
> > +	}
> > +
> > +	err = mmc_send_ext_csd(mmc, ext_csd);
> > +	if (err)
> > +		return err;
> > +
> > +	sz =
> > +		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 2] << 16) +
> > +		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 1] << 8) +
> > +		ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
> > +	sz *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
> > +	sz *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
> > +	sz *= SZ_1K;
> 
> To use the num of sector, i think better that is adding Comment.
> And using not "sz" as variable. It seems to describe real size, not sector.
> According to spec, it's 512kByte. It can be confused.

Makes sense, I'll change the variable name.

> 
> Best Regards,
> Jaehoon Chung
> 
> > +	*size = sz;
> > +
> > +	return 0;
> > +}
> > +
> >  int mmc_hwpart_config(struct mmc *mmc,
> >  		      const struct mmc_hwpart_conf *conf,
> >  		      enum mmc_hwpart_conf_mode mode)
> > diff --git a/include/mmc.h b/include/mmc.h
> > index b92e2553402..3e1fc82d9b4 100644
> > --- a/include/mmc.h
> > +++ b/include/mmc.h
> > @@ -846,6 +846,7 @@ void print_mmc_devices(char separator);
> >   */
> >  int get_mmc_num(void);
> >  int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
> > +int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size);
> >  int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
> >  		      enum mmc_hwpart_conf_mode mode);
> >  
> > 
> 
>
diff mbox series

Patch

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index d3babbfeb1c..c1b1ef7eb0b 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1039,6 +1039,44 @@  int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
 }
 
 #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
+int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size)
+{
+	u64 sz;
+	int err;
+
+	ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
+
+	if (IS_SD(mmc) || mmc->version < MMC_VERSION_4_41) {
+		pr_err("eMMC >= 4.4 required for enhanced user data area\n");
+		return -EMEDIUMTYPE;
+	}
+
+	if (!(mmc->part_support & PART_SUPPORT)) {
+		pr_err("Card does not support partitioning\n");
+		return -EMEDIUMTYPE;
+	}
+
+	if (!mmc->hc_wp_grp_size) {
+		pr_err("Card does not define HC WP group size\n");
+		return -EMEDIUMTYPE;
+	}
+
+	err = mmc_send_ext_csd(mmc, ext_csd);
+	if (err)
+		return err;
+
+	sz =
+		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 2] << 16) +
+		(ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT + 1] << 8) +
+		ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
+	sz *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
+	sz *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
+	sz *= SZ_1K;
+	*size = sz;
+
+	return 0;
+}
+
 int mmc_hwpart_config(struct mmc *mmc,
 		      const struct mmc_hwpart_conf *conf,
 		      enum mmc_hwpart_conf_mode mode)
diff --git a/include/mmc.h b/include/mmc.h
index b92e2553402..3e1fc82d9b4 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -846,6 +846,7 @@  void print_mmc_devices(char separator);
  */
 int get_mmc_num(void);
 int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
+int mmc_max_enhanced_size_sectors(struct mmc *mmc, u64 *size);
 int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
 		      enum mmc_hwpart_conf_mode mode);