[U-Boot] [PATCH 05/13] mmc: Tinification of the mmc code

Jaehoon Chung jh80.chung at samsung.com
Thu Dec 1 06:07:27 CET 2016


On 12/01/2016 10:06 AM, Marek Vasut wrote:
> Add new configuration option CONFIG_MMC_TINY which strips away all
> memory allocation within the MMC code and code for handling multiple
> cards. This allows extremely space-constrained SPL code use the MMC
> framework.
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Jaehoon Chung <jh80.chung at samsung.com>

Applied on u-boot-mmc. Thanks!

Best Regards,
Jaehoon Chung

> ---
> V2: Switch the MMC_TINY option to Kconfig
> ---
>  common/spl/spl_mmc.c     |  6 +++++-
>  drivers/mmc/Kconfig      | 15 +++++++++++++++
>  drivers/mmc/mmc.c        | 31 ++++++++++++++++++++++++++++++-
>  drivers/mmc/mmc_legacy.c | 32 ++++++++++++++++++++++++++++++++
>  include/mmc.h            |  1 +
>  5 files changed, 83 insertions(+), 2 deletions(-)
> 
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index a3d6b36..7dfcd0b 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -306,7 +306,11 @@ static int spl_mmc_load_image(struct spl_image_info *spl_image,
>  			if (part == 7)
>  				part = 0;
>  
> -			err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
> +			if (CONFIG_IS_ENABLED(MMC_TINY))
> +				err = mmc_switch_part(mmc, part);
> +			else
> +				err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
> +
>  			if (err) {
>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>  				puts("spl: mmc partition switch failed\n");
> diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
> index 24f4b28..5e84a41 100644
> --- a/drivers/mmc/Kconfig
> +++ b/drivers/mmc/Kconfig
> @@ -26,6 +26,21 @@ config DM_MMC_OPS
>  	  option will be removed as soon as all DM_MMC drivers use it, as it
>  	  will the only supported behaviour.
>  
> +config SPL_MMC_TINY
> +	bool "Tiny MMC framework in SPL"
> +	help
> +	  Enable MMC framework tinification support. This option is useful if
> +	  if your SPL is extremely size constrained. Heed the warning, enable
> +	  this option if and only if you know exactly what you are doing, if
> +	  you are reading this help text, you most likely have no idea :-)
> +
> +	  The MMC framework is reduced to bare minimum to be useful. No malloc
> +	  support is needed for the MMC framework operation with this option
> +	  enabled. The framework supports exactly one MMC device and exactly
> +	  one MMC driver. The MMC driver can be adjusted to avoid any malloc
> +	  operations too, which can remove the need for malloc support in SPL
> +	  and thus further reduce footprint.
> +
>  config MSM_SDHCI
>  	bool "Qualcomm SDHCI controller"
>  	depends on DM_MMC && BLK && DM_MMC_OPS
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 6e25b67..19c4225 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -30,6 +30,29 @@ static const unsigned int sd_au_size[] = {
>  	SZ_16M / 512,	(SZ_16M + SZ_8M) / 512,	SZ_32M / 512,	SZ_64M / 512,
>  };
>  
> +#if CONFIG_IS_ENABLED(MMC_TINY)
> +static struct mmc mmc_static;
> +struct mmc *find_mmc_device(int dev_num)
> +{
> +	return &mmc_static;
> +}
> +
> +void mmc_do_preinit(void)
> +{
> +	struct mmc *m = &mmc_static;
> +#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
> +	mmc_set_preinit(m, 1);
> +#endif
> +	if (m->preinit)
> +		mmc_start_init(m);
> +}
> +
> +struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
> +{
> +	return &mmc->block_dev;
> +}
> +#endif
> +
>  #ifndef CONFIG_DM_MMC_OPS
>  __weak int board_mmc_getwp(struct mmc *mmc)
>  {
> @@ -259,7 +282,11 @@ ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
>  	if (!mmc)
>  		return 0;
>  
> -	err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
> +	if (CONFIG_IS_ENABLED(MMC_TINY))
> +		err = mmc_switch_part(mmc, block_dev->hwpart);
> +	else
> +		err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
> +
>  	if (err < 0)
>  		return 0;
>  
> @@ -1804,8 +1831,10 @@ int mmc_initialize(bd_t *bis)
>  	initialized = 1;
>  
>  #ifndef CONFIG_BLK
> +#if !CONFIG_IS_ENABLED(MMC_TINY)
>  	mmc_list_init();
>  #endif
> +#endif
>  	ret = mmc_probe(bis);
>  	if (ret)
>  		return ret;
> diff --git a/drivers/mmc/mmc_legacy.c b/drivers/mmc/mmc_legacy.c
> index 25361d1..bdf9d98 100644
> --- a/drivers/mmc/mmc_legacy.c
> +++ b/drivers/mmc/mmc_legacy.c
> @@ -13,6 +13,7 @@
>  static struct list_head mmc_devices;
>  static int cur_dev_num = -1;
>  
> +#if !CONFIG_IS_ENABLED(MMC_TINY)
>  struct mmc *find_mmc_device(int dev_num)
>  {
>  	struct mmc *m;
> @@ -62,6 +63,7 @@ void mmc_do_preinit(void)
>  			mmc_start_init(m);
>  	}
>  }
> +#endif
>  
>  void mmc_list_init(void)
>  {
> @@ -109,6 +111,35 @@ void print_mmc_devices(char separator)
>  void print_mmc_devices(char separator) { }
>  #endif
>  
> +#if CONFIG_IS_ENABLED(MMC_TINY)
> +static struct mmc mmc_static = {
> +	.dsr_imp		= 0,
> +	.dsr			= 0xffffffff,
> +	.block_dev = {
> +		.if_type	= IF_TYPE_MMC,
> +		.removable	= 1,
> +		.devnum		= 0,
> +		.block_read	= mmc_bread,
> +		.block_write	= mmc_bwrite,
> +		.block_erase	= mmc_berase,
> +		.part_type	= 0,
> +	},
> +};
> +
> +struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
> +{
> +	struct mmc *mmc = &mmc_static;
> +
> +	mmc->cfg = cfg;
> +	mmc->priv = priv;
> +
> +	return mmc;
> +}
> +
> +void mmc_destroy(struct mmc *mmc)
> +{
> +}
> +#else
>  struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
>  {
>  	struct blk_desc *bdesc;
> @@ -157,6 +188,7 @@ void mmc_destroy(struct mmc *mmc)
>  	/* only freeing memory for now */
>  	free(mmc);
>  }
> +#endif
>  
>  static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
>  {
> diff --git a/include/mmc.h b/include/mmc.h
> index e815eb3..f39be3c 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -513,6 +513,7 @@ void print_mmc_devices(char separator);
>   * @return 0 if there is no MMC device, else the number of devices
>   */
>  int get_mmc_num(void);
> +int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
>  int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
>  		      enum mmc_hwpart_conf_mode mode);
>  
> 



More information about the U-Boot mailing list