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

Simon Glass sjg at chromium.org
Fri Jun 10 03:16:59 CEST 2016


Hi Marek,

On 9 June 2016 at 18:12, Marek Vasut <marex at denx.de> wrote:
> On 06/10/2016 02:34 AM, Simon Glass wrote:
>> Hi Marek,
>
> Hi!
>
>> On 26 May 2016 at 12:41, Marek Vasut <marex at denx.de> 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>
>>> ---
>>>  common/spl/spl_mmc.c |  4 ++++
>>>  drivers/mmc/Makefile |  2 ++
>>>  drivers/mmc/mmc.c    | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++-
>>>  include/mmc.h        |  1 +
>>>  4 files changed, 65 insertions(+), 1 deletion(-)
>>
>> Can CONFIG_MMC_TINY be a Kconfig? Also I suggest CONFIG_SPL_MMC_TINY.
>
> It can, but how do I assure it's enabled only for SPL build ?

depends on SPL

and in the code:

#if CONFIG_IS_ENABLED(MMC_TINY)

will do it.

>
>>> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
>>> index ae42221..51f0f24 100644
>>> --- a/common/spl/spl_mmc.c
>>> +++ b/common/spl/spl_mmc.c
>>> @@ -300,7 +300,11 @@ int spl_mmc_load_image(u32 boot_device)
>>>                         if (part == 7)
>>>                                 part = 0;
>>>
>>> +#ifdef CONFIG_MMC_TINY
>>
>> if (CONFIG_IS_ENABLED(MMC_TINY))
>>
>> to avoid #ifdef
>
> The compiler complains about missing symbols blk_dselect_hwpart() and
> such, so I will opt for the ifdef .

That's odd. It should not care about things which are not compiled in.

>
>>> +                       err = mmc_switch_part(mmc, part);
>>> +#else
>>>                         err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
>>> +#endif
>>>                         if (err) {
>>>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>>>                                 puts("spl: mmc partition switch failed\n");
>>> diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
>>> index 3da4817..4d986cb 100644
>>> --- a/drivers/mmc/Makefile
>>> +++ b/drivers/mmc/Makefile
>>> @@ -10,8 +10,10 @@ obj-$(CONFIG_GENERIC_MMC) += mmc-uclass.o
>>>  endif
>>>
>>>  ifndef CONFIG_BLK
>>> +ifndef CONFIG_MMC_TINY
>>>  obj-$(CONFIG_GENERIC_MMC) += mmc_legacy.o
>>>  endif
>>> +endif
>>>
>>>  obj-$(CONFIG_ARM_PL180_MMCI) += arm_pl180_mmci.o
>>>  obj-$(CONFIG_ATMEL_SDHCI) += atmel_sdhci.o
>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>>> index d687345..1f240ed 100644
>>> --- a/drivers/mmc/mmc.c
>>> +++ b/drivers/mmc/mmc.c
>>> @@ -21,6 +21,29 @@
>>>  #include <div64.h>
>>>  #include "mmc_private.h"
>>>
>>> +#if defined(CONFIG_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
>>> +
>>>  __weak int board_mmc_getwp(struct mmc *mmc)
>>>  {
>>>         return -1;
>>> @@ -238,7 +261,11 @@ static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
>>>         if (!mmc)
>>>                 return 0;
>>>
>>> +#ifdef CONFIG_MMC_TINY
>>> +       err = mmc_switch_part(mmc, block_dev->hwpart);
>>> +#else
>>>         err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
>>> +#endif
>>>         if (err < 0)
>>>                 return 0;
>>>
>>> @@ -568,7 +595,7 @@ static int mmc_set_capacity(struct mmc *mmc, int part_num)
>>>         return 0;
>>>  }
>>>
>>> -static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
>>> +int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
>>>  {
>>>         int ret;
>>>
>>> @@ -1585,6 +1612,34 @@ int mmc_unbind(struct udevice *dev)
>>>         return 0;
>>>  }
>>>
>>> +#elif defined(CONFIG_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)
>>>  {
>>> @@ -1834,8 +1889,10 @@ int mmc_initialize(bd_t *bis)
>>>         initialized = 1;
>>>
>>>  #ifndef CONFIG_BLK
>>> +#ifndef CONFIG_MMC_TINY
>>>         mmc_list_init();
>>>  #endif
>>> +#endif
>>>         ret = mmc_probe(bis);
>>>         if (ret)
>>>                 return ret;
>>> diff --git a/include/mmc.h b/include/mmc.h
>>> index a5c6573..08a59c2 100644
>>> --- a/include/mmc.h
>>> +++ b/include/mmc.h
>>> @@ -444,6 +444,7 @@ struct mmc *find_mmc_device(int dev_num);
>>>  int mmc_set_dev(int dev_num);
>>>  void print_mmc_devices(char separator);
>>>  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);
>>>  int mmc_getcd(struct mmc *mmc);
>>> --
>>> 2.7.0
>>>
>>
>> This is partially undoing the legacy block device work. How much does
>> this patch save?
>
> It does save enough to make my SPL fit on my device, which is a few kiB.
> I didn't measure it precisely because the block stuff starts requiring
> malloc support (which my SPL does not have) and pulls in more and more
> code which blows the SPL size.

The legacy block support should not require malloc().

Can you give me instructions on how to try all this (perhaps point me
to a tree?). I'd like to dig into it a little.

Regards,
Simon


More information about the U-Boot mailing list