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 04:07:36 +0200 [thread overview]
Message-ID: <575A20E8.4030707@denx.de> (raw)
In-Reply-To: <CAPnjgZ1VEwfiom5faO7MvssEuDBOvn15MZFcJsNU6MDsZ2esTg@mail.gmail.com>
On 06/10/2016 03:16 AM, Simon Glass wrote:
> Hi Marek,
Hi,
> On 9 June 2016 at 18:12, Marek Vasut <marex@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@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 ?
>
> 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
prev parent reply other threads:[~2016-06-10 2:07 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
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 ` Marek Vasut [this message]
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=575A20E8.4030707@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.