On Tue, 1 Sep 2020 at 10:50, Matthias Schiffer <matthias.schiffer@xxxxxxxxxxxxxxx> wrote: > > As with GPIO, UART and others, allow specifying the device index via the > aliases node in the device tree. > > On embedded devices, there is often a combination of removable (e.g. > SD card) and non-removable MMC devices (e.g. eMMC). > Therefore the index might change depending on > > * host of removable device > * removable card present or not > > This makes it difficult to hardcode the root device, if it is on the > non-removable device. E.g. if SD card is present eMMC will be mmcblk1, > if SD card is not present at boot, eMMC will be mmcblk0. > > Alternative solutions like PARTUUIDs do not cover the case where multiple > mmcblk devices contain the same image. This is a common issue on devices > that can boot both from eMMC (for regular boot) and SD cards (as a > temporary boot medium for development). When a firmware image is > installed to eMMC after a test boot via SD card, there will be no > reliable way to refer to a specific device using (PART)UUIDs oder > LABELs. > > The demand for this feature has led to multiple attempts to implement > it, dating back at least to 2012 (see > https://www.spinics.net/lists/linux-mmc/msg26586.html for a previous > discussion from 2014). > > All indices defined in the aliases node will be reserved for use by the > respective MMC device, moving the indices of devices that don't have an > alias up into the non-reserved range. If the aliases node is not found, > the driver will act as before. > > This is a rebased and cleaned up version of > https://www.spinics.net/lists/linux-mmc/msg26588.html . > > Based-on-patch-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > Link: https://lkml.org/lkml/2020/8/5/194 > Signed-off-by: Matthias Schiffer <matthias.schiffer@xxxxxxxxxxxxxxx> Applied for next, thanks! Kind regards Uffe > --- > > v4: > - minor adjustments to commit message > > v3: > - remove unneeded mmcblock changes > - remove most helper functions to simplify code > - extended commit message > > v2: > - fix missing symbols for modular mmcblock > > > > drivers/mmc/core/host.c | 26 +++++++++++++++++++++++++- > 1 file changed, 25 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c8fae6611b73..96b2ca1f1b06 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -376,6 +376,20 @@ int mmc_of_parse_voltage(struct device_node *np, u32 *mask) > } > EXPORT_SYMBOL(mmc_of_parse_voltage); > > +/** > + * mmc_first_nonreserved_index() - get the first index that is not reserved > + */ > +static int mmc_first_nonreserved_index(void) > +{ > + int max; > + > + max = of_alias_get_highest_id("mmc"); > + if (max < 0) > + return 0; > + > + return max + 1; > +} > + > /** > * mmc_alloc_host - initialise the per-host structure. > * @extra: sizeof private data structure > @@ -387,6 +401,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > { > int err; > struct mmc_host *host; > + int alias_id, min_idx, max_idx; > > host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); > if (!host) > @@ -395,7 +410,16 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > /* scanning will be enabled when we're ready */ > host->rescan_disable = 1; > > - err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL); > + alias_id = of_alias_get_id(dev->of_node, "mmc"); > + if (alias_id >= 0) { > + min_idx = alias_id; > + max_idx = alias_id + 1; > + } else { > + min_idx = mmc_first_nonreserved_index(); > + max_idx = 0; > + } > + > + err = ida_simple_get(&mmc_host_ida, min_idx, max_idx, GFP_KERNEL); > if (err < 0) { > kfree(host); > return NULL; > -- > 2.17.1 >