Message ID | 20161201010641.11529-5-marex@denx.de |
---|---|
State | Accepted |
Commit | b5b838f1a726e9ab7eea505740e8169b55e90ed6 |
Headers | show |
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@denx.de> > Cc: Tom Rini <trini@konsulko.com> > Cc: Simon Glass <sjg@chromium.org> > Cc: Jaehoon Chung <jh80.chung@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); > >
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);
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> Cc: Jaehoon Chung <jh80.chung@samsung.com> --- 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(-)