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

Marek Vasut marex at denx.de
Fri Jun 10 04:07:36 CEST 2016


On 06/10/2016 03:16 AM, Simon Glass wrote:
> Hi Marek,

Hi,

> 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.

Ah right, thanks.

>>>> 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.

Must've been some oddity indeed.

>>>> +                       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().

But it does require convoluted list handling, which takes a lot of space.

> 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.

Sent off-list.

-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list