public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] mmc: Tinification of the mmc code
Date: Fri, 10 Jun 2016 03:12:03 +0200	[thread overview]
Message-ID: <575A13E3.7040601@denx.de> (raw)
In-Reply-To: <CAPnjgZ0Dn4KWp7ntydd7GjiUcAMsMDHYAME7k+=MzqvQmpDAqA@mail.gmail.com>

On 06/10/2016 02:34 AM, Simon Glass wrote:
> Hi Marek,

Hi!

> On 26 May 2016 at 12:41, Marek Vasut <marex@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@denx.de>
>> Cc: Tom Rini <trini@konsulko.com>
>> Cc: Simon Glass <sjg@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 ?

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

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


-- 
Best regards,
Marek Vasut

  reply	other threads:[~2016-06-10  1:12 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-26 18:41 [U-Boot] [PATCH] mmc: Tinification of the mmc code Marek Vasut
2016-06-10  0:34 ` Simon Glass
2016-06-10  1:12   ` Marek Vasut [this message]
2016-06-10  1:16     ` Simon Glass
2016-06-10  2:05       ` [U-Boot] [PATCH V2] " Marek Vasut
2016-10-27 23:31         ` Simon Glass
2016-10-27 23:40           ` Marek Vasut
2016-10-28  1:36             ` Simon Glass
2016-10-28  3:02               ` Marek Vasut
2016-06-10  2:07       ` [U-Boot] [PATCH] " Marek Vasut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=575A13E3.7040601@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox