Re: [PATCH mmc-next v4 2/2] mmc: allow setting slot index via device tree alias

From: Ulf Hansson
Date: Wed Sep 02 2020 - 05:04:21 EST


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
>