* [U-Boot] [PATCH] mmc: Tinification of the mmc code @ 2016-05-26 18:41 Marek Vasut 2016-06-10 0:34 ` Simon Glass 0 siblings, 1 reply; 10+ messages in thread From: Marek Vasut @ 2016-05-26 18:41 UTC (permalink / raw) To: u-boot 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(-) 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 + 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 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] mmc: Tinification of the mmc code 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 0 siblings, 1 reply; 10+ messages in thread From: Simon Glass @ 2016-06-10 0:34 UTC (permalink / raw) To: u-boot Hi Marek, 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. > > 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 > + 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? Regards, Simon ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] mmc: Tinification of the mmc code 2016-06-10 0:34 ` Simon Glass @ 2016-06-10 1:12 ` Marek Vasut 2016-06-10 1:16 ` Simon Glass 0 siblings, 1 reply; 10+ messages in thread From: Marek Vasut @ 2016-06-10 1:12 UTC (permalink / raw) To: u-boot 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] mmc: Tinification of the mmc code 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-06-10 2:07 ` [U-Boot] [PATCH] " Marek Vasut 0 siblings, 2 replies; 10+ messages in thread From: Simon Glass @ 2016-06-10 1:16 UTC (permalink / raw) To: u-boot Hi Marek, 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. > >>> 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] mmc: Tinification of the mmc code 2016-06-10 1:16 ` Simon Glass @ 2016-06-10 2:05 ` Marek Vasut 2016-10-27 23:31 ` Simon Glass 2016-06-10 2:07 ` [U-Boot] [PATCH] " Marek Vasut 1 sibling, 1 reply; 10+ messages in thread From: Marek Vasut @ 2016-06-10 2:05 UTC (permalink / raw) To: u-boot 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> --- V2: Switch the MMC_TINY option to Kconfig --- common/spl/spl_mmc.c | 6 +++++- drivers/mmc/Kconfig | 16 ++++++++++++++ drivers/mmc/Makefile | 6 ++++++ drivers/mmc/mmc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-- include/mmc.h | 1 + 5 files changed, 87 insertions(+), 3 deletions(-) diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index dcfd842..6508b3e 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; - 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 c80efc3..365057b 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -16,6 +16,22 @@ config DM_MMC appear as block devices in U-Boot and can support filesystems such as EXT4 and FAT. +config SPL_MMC_TINY + bool "Tiny MMC framework in SPL" + default n + 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 diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 3da4817..89578d2 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -10,8 +10,14 @@ obj-$(CONFIG_GENERIC_MMC) += mmc-uclass.o endif ifndef CONFIG_BLK +ifdef CONFIG_SPL_BUILD +ifndef CONFIG_SPL_MMC_TINY obj-$(CONFIG_GENERIC_MMC) += mmc_legacy.o endif +else +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 a4a2161..4875f45 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -21,6 +21,29 @@ #include <div64.h> #include "mmc_private.h" +#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 + __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; - 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; @@ -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; @@ -1576,6 +1603,34 @@ int mmc_unbind(struct udevice *dev) return 0; } +#elif 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) { @@ -1825,8 +1880,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/include/mmc.h b/include/mmc.h index 7fdfc32..3f6f9d2 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -443,6 +443,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 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] mmc: Tinification of the mmc code 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 0 siblings, 1 reply; 10+ messages in thread From: Simon Glass @ 2016-10-27 23:31 UTC (permalink / raw) To: u-boot Hi Marek, On 9 June 2016 at 19:05, 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> > --- > V2: Switch the MMC_TINY option to Kconfig > --- > common/spl/spl_mmc.c | 6 +++++- > drivers/mmc/Kconfig | 16 ++++++++++++++ > drivers/mmc/Makefile | 6 ++++++ > drivers/mmc/mmc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-- > include/mmc.h | 1 + > 5 files changed, 87 insertions(+), 3 deletions(-) What's the status of these patches? Can they run with DM and CONFIG_BLK? Regards, Simon ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] mmc: Tinification of the mmc code 2016-10-27 23:31 ` Simon Glass @ 2016-10-27 23:40 ` Marek Vasut 2016-10-28 1:36 ` Simon Glass 0 siblings, 1 reply; 10+ messages in thread From: Marek Vasut @ 2016-10-27 23:40 UTC (permalink / raw) To: u-boot On 10/28/2016 01:31 AM, Simon Glass wrote: > Hi Marek, > > On 9 June 2016 at 19:05, 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> >> --- >> V2: Switch the MMC_TINY option to Kconfig >> --- >> common/spl/spl_mmc.c | 6 +++++- >> drivers/mmc/Kconfig | 16 ++++++++++++++ >> drivers/mmc/Makefile | 6 ++++++ >> drivers/mmc/mmc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-- >> include/mmc.h | 1 + >> 5 files changed, 87 insertions(+), 3 deletions(-) > > What's the status of these patches? Can they run with DM and CONFIG_BLK? Probably broken due to the changes in the MMC subsys. I have a rebased version, but I didn't test it on the hardware itself. If you want to test them, I can send you the patch(es). -- Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] mmc: Tinification of the mmc code 2016-10-27 23:40 ` Marek Vasut @ 2016-10-28 1:36 ` Simon Glass 2016-10-28 3:02 ` Marek Vasut 0 siblings, 1 reply; 10+ messages in thread From: Simon Glass @ 2016-10-28 1:36 UTC (permalink / raw) To: u-boot H iMarek, On 27 October 2016 at 16:40, Marek Vasut <marex@denx.de> wrote: > On 10/28/2016 01:31 AM, Simon Glass wrote: >> Hi Marek, >> >> On 9 June 2016 at 19:05, 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> >>> --- >>> V2: Switch the MMC_TINY option to Kconfig >>> --- >>> common/spl/spl_mmc.c | 6 +++++- >>> drivers/mmc/Kconfig | 16 ++++++++++++++ >>> drivers/mmc/Makefile | 6 ++++++ >>> drivers/mmc/mmc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-- >>> include/mmc.h | 1 + >>> 5 files changed, 87 insertions(+), 3 deletions(-) >> >> What's the status of these patches? Can they run with DM and CONFIG_BLK? > > Probably broken due to the changes in the MMC subsys. I have a rebased > version, but I didn't test it on the hardware itself. If you want to > test them, I can send you the patch(es). Yes I can do that - can you push them to a tree somewhere? Regards, Simon ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] mmc: Tinification of the mmc code 2016-10-28 1:36 ` Simon Glass @ 2016-10-28 3:02 ` Marek Vasut 0 siblings, 0 replies; 10+ messages in thread From: Marek Vasut @ 2016-10-28 3:02 UTC (permalink / raw) To: u-boot On 10/28/2016 03:36 AM, Simon Glass wrote: > H iMarek, Hi, > On 27 October 2016 at 16:40, Marek Vasut <marex@denx.de> wrote: >> On 10/28/2016 01:31 AM, Simon Glass wrote: >>> Hi Marek, >>> >>> On 9 June 2016 at 19:05, 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> >>>> --- >>>> V2: Switch the MMC_TINY option to Kconfig >>>> --- >>>> common/spl/spl_mmc.c | 6 +++++- >>>> drivers/mmc/Kconfig | 16 ++++++++++++++ >>>> drivers/mmc/Makefile | 6 ++++++ >>>> drivers/mmc/mmc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-- >>>> include/mmc.h | 1 + >>>> 5 files changed, 87 insertions(+), 3 deletions(-) >>> >>> What's the status of these patches? Can they run with DM and CONFIG_BLK? >> >> Probably broken due to the changes in the MMC subsys. I have a rebased >> version, but I didn't test it on the hardware itself. If you want to >> test them, I can send you the patch(es). > > Yes I can do that - can you push them to a tree somewhere? I forwarded you the tarball. -- Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] mmc: Tinification of the mmc code 2016-06-10 1:16 ` Simon Glass 2016-06-10 2:05 ` [U-Boot] [PATCH V2] " Marek Vasut @ 2016-06-10 2:07 ` Marek Vasut 1 sibling, 0 replies; 10+ messages in thread From: Marek Vasut @ 2016-06-10 2:07 UTC (permalink / raw) To: u-boot 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2016-10-28 3:02 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 ` [U-Boot] [PATCH] " Marek Vasut
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox