Skip to contentSkip to conversation

dm: mmc: Tidy up handling of block devices

PATCH New Simon Glass 6 participants 29 messages Apr 24, 2017 – Jun 2, 2017

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover dm: mmc: Tidy up handling of block devices

The current MMC block device support has a few deficiencies which show up when both CONFIG_BLK and CONFIG_DM_MMC_OPS are defined:

- Block device numbering does not always following MMC device numbering
- Environment in MMC does not always work correctly

In addition some parts of the code can be implemented in a better way.

This series fixes the above problems, adds a few tests and converts Tegra over to use CONFIG_BLK and CONFIG_DM_MMC_OPS.

Simon Glass (8):
dm: mmc: Don't re-init when accessing environment
dm: blk: Allow finding block devices without probing
dm: blk: Add a function to find the next block device number
dm: blk: Improve block device claiming
dm: mmc: Avoid probing block devices in find_mmc_device()
dm: mmc: Check that drivers have operations
dm: mmc: Rewrite mmc_blk_probe()
tegra: Convert MMC to use driver model for operations

 arch/sandbox/dts/test.dts            | 12 +++++-
 board/toradex/common/tdx-cfg-block.c |  2 +-
 common/env_mmc.c                     |  3 +-
 configs/apalis-tk1_defconfig         |  2 -
 configs/apalis_t30_defconfig         |  2 -
 configs/beaver_defconfig             |  2 -
 configs/cardhu_defconfig             |  2 -
 configs/cei-tk1-som_defconfig        |  2 -
 configs/colibri_t20_defconfig        |  2 -
 configs/colibri_t30_defconfig        |  2 -
 configs/dalmore_defconfig            |  2 -
 configs/e2220-1170_defconfig         |  2 -
 configs/harmony_defconfig            |  2 -
 configs/jetson-tk1_defconfig         |  2 -
 configs/medcom-wide_defconfig        |  2 -
 configs/nyan-big_defconfig           |  2 -
 configs/p2371-0000_defconfig         |  2 -
 configs/p2371-2180_defconfig         |  2 -
 configs/p2571_defconfig              |  2 -
 configs/p2771-0000-000_defconfig     |  2 -
 configs/p2771-0000-500_defconfig     |  2 -
 configs/paz00_defconfig              |  2 -
 configs/plutux_defconfig             |  2 -
 configs/seaboard_defconfig           |  2 -
 configs/tec-ng_defconfig             |  2 -
 configs/tec_defconfig                |  2 -
 configs/trimslice_defconfig          |  2 -
 configs/venice2_defconfig            |  2 -
 configs/ventana_defconfig            |  2 -
 configs/whistler_defconfig           |  2 -
 drivers/block/blk-uclass.c           | 65 ++++++++++++++++++++++++++++----
 drivers/mmc/mmc-uclass.c             | 27 ++++++++++----
 drivers/mmc/tegra_mmc.c              | 72 ++++++++++++++++++++----------------
 include/blk.h                        | 15 +++++++-
 test/dm/blk.c                        | 60 +++++++++++++++++++++++++++++-
 35 files changed, 203 insertions(+), 107 deletions(-)
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#1 lore raw

PATCH 1/8 dm: mmc: Don't re-init when accessing environment

With driver model MMC is probed automatically when needed. We should not re-init MMC each time.

---

 common/env_mmc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +2 -1
index a5d14d448c..1611886e22 100644
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)
 	if (!mmc)
 		return "!No MMC card found";
 
+#ifndef CONFIG_BLK
 	if (mmc_init(mmc))
 		return "!MMC init failed";
-
+#endif
 	if (mmc_set_env_part(mmc))
 		return "!MMC partition switch failed";
 
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#2 lore raw

PATCH 1/8 dm: mmc: Don't re-init when accessing environment

Hi Simon,

Quoted 14 lines · Simon Glass

With driver model MMC is probed automatically when needed. We should not re-init MMC each time.

---

  common/env_mmc.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +0 -0
index a5d14d448c..1611886e22 100644

common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 104

Quoted 8 lines
common/env_mmc.c +2 -1
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)
  	if (!mmc)
  		return "!No MMC card found";
 
+#ifndef CONFIG_BLK
  	if (mmc_init(mmc))
  		return "!MMC init failed";
-
+#endif

I'm not convinced by this. mmc_init() is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and most probe() functions do not call mmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)

Jean-Jacques

Quoted 3 lines
common/env_mmc.c +0 -0
  	if (mmc_set_env_part(mmc))
  		return "!MMC partition switch failed";
 
#3 lore raw

PATCH 1/8 dm: mmc: Don't re-init when accessing environment

Hi Jean-Jacques,

Quoted 26 lines · Jean-Jacques Hiblot

Hi Simon,

Quoted 15 lines · Simon Glass

With driver model MMC is probed automatically when needed. We should not re-init MMC each time.

---

  common/env_mmc.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +0 -0
index a5d14d448c..1611886e22 100644

common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 103

Quoted 7 lines
common/env_mmc.c +1 -1
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)
        if (!mmc)
                return "!No MMC card found";
  +#ifndef CONFIG_BLK
        if (mmc_init(mmc))
                return "!MMC init failed";
-
+#endif
Quoted 7 lines

I'm not convinced by this. mmc_init() is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and most probe() functions do not call mmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)

Yes I would like that too.

One option is to add an init() method to mmc and call that when the block device is probed.

Quoted 9 lines

Jean-Jacques

Quoted 3 lines
common/env_mmc.c +0 -0
        if (mmc_set_env_part(mmc))
                return "!MMC partition switch failed";
 

Regards,
Simon

#4 lore raw

PATCH 1/8 dm: mmc: Don't re-init when accessing environment

Hi,

Quoted 37 lines · Simon Glass

Hi Jean-Jacques,

Quoted 26 lines · Jean-Jacques Hiblot

Hi Simon,

Quoted 15 lines · Simon Glass

With driver model MMC is probed automatically when needed. We should not re-init MMC each time.

---

  common/env_mmc.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +0 -0
index a5d14d448c..1611886e22 100644

common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 103

Quoted 7 lines
common/env_mmc.c +1 -1
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)
        if (!mmc)
                return "!No MMC card found";
  +#ifndef CONFIG_BLK
        if (mmc_init(mmc))
                return "!MMC init failed";
-
+#endif
Quoted 7 lines

I'm not convinced by this. mmc_init() is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and most probe() functions do not call mmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)

Quoted 4 lines

Yes I would like that too.

One option is to add an init() method to mmc and call that when the block device is probed.

Do you think that would work? I can try it out in the next version perhaps.

Then we have:

mmc device probe - very fast, just sets up clocks, etc. blk device probe - slow, tries to read card, partition table, etc.

Quoted 7 lines
Quoted 7 lines

Jean-Jacques

Quoted 2 lines
common/env_mmc.c +0 -0
        if (mmc_set_env_part(mmc))
                return "!MMC partition switch failed";

Regards,
Simon

#5 lore raw

PATCH 1/8 dm: mmc: Don't re-init when accessing environment

Hi Simon,

Quoted 41 lines · Simon Glass

Hi,

Quoted 38 lines · Simon Glass

Hi Jean-Jacques,

Quoted 23 lines · Jean-Jacques Hiblot

Hi Simon,

Quoted 20 lines · Simon Glass

With driver model MMC is probed automatically when needed. We should not re-init MMC each time.

---

   common/env_mmc.c | 3 ++-
   1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +0 -1
index a5d14d448c..1611886e22 100644
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)
         if (!mmc)
                 return "!No MMC card found";
   +#ifndef CONFIG_BLK
         if (mmc_init(mmc))
                 return "!MMC init failed";
-
Quoted 8 lines

common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 104

Quoted 1 line
common/env_mmc.c +1 -0
+#endif

I'm not convinced by this. mmc_init() is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and most probe() functions do not call mmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)

Yes I would like that too.

One option is to add an init() method to mmc and call that when the block device is probed.

I've just discovered that in mmc_init() is now called from the 'blk' probe of the mc device (it wasn't on the code base I had been looking at). So it should be fine to remove the call to mmc_init() from init_mmc_for_env(). I did the test on DRA7 and it's working. So you can ignore my previous comment.

However I tried to go further by removing it from spl_mmc.c as well because mmc_init() is called from there first and then I ran into problems with the detection of the partitions. I don't really have time to look at it right now. It may be related to the fact that my env is not located on the boot device.

Jean-Jacques

Quoted 15 lines

Do you think that would work? I can try it out in the next version perhaps.

Then we have:

mmc device probe - very fast, just sets up clocks, etc. blk device probe - slow, tries to read card, partition table, etc.

Quoted 5 lines
Quoted 5 lines

Jean-Jacques

Quoted 2 lines
common/env_mmc.c +0 -0
         if (mmc_set_env_part(mmc))
                 return "!MMC partition switch failed";

Regards,
Simon

#6 lore raw

PATCH 2/8 dm: blk: Allow finding block devices without probing

In reply to Simon Glass

Sometimes it is useful to be able to find a block device without also probing it. Add a function for this as well as the associated test.

---

 drivers/block/blk-uclass.c | 15 +++++++++++++--
 include/blk.h              | 15 ++++++++++++++-
 test/dm/blk.c              | 21 +++++++++++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)
drivers/block/blk-uclass.c +13 -2
index af3c35f6d0..8b6b28d890 100644
@@ -363,7 +363,7 @@ int blk_next_device(struct udevice **devp)
 	} while (1);
 }
 
-int blk_get_device(int if_type, int devnum, struct udevice **devp)
+int blk_find_device(int if_type, int devnum, struct udevice **devp)
 {
 	struct uclass *uc;
 	struct udevice *dev;
@@ -379,13 +379,24 @@ int blk_get_device(int if_type, int devnum, struct udevice **devp)
 		      if_type, devnum, dev->name, desc->if_type, desc->devnum);
 		if (desc->if_type == if_type && desc->devnum == devnum) {
 			*devp = dev;
-			return device_probe(dev);
+			return 0;
 		}
 	}
 
 	return -ENODEV;
 }
 
+int blk_get_device(int if_type, int devnum, struct udevice **devp)
+{
+	int ret;
+
+	ret = blk_find_device(if_type, devnum, devp);
+	if (ret)
+		return ret;
+
+	return device_probe(*devp);
+}
+
 unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
 			lbaint_t blkcnt, void *buffer)
 {
include/blk.h +14 -1
index 66a1c55cc8..a128ee4841 100644
@@ -253,12 +253,25 @@ unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
 			 lbaint_t blkcnt);
 
 /**
+ * blk_find_device() - Find a block device
+ *
+ * This function does not activate the device. The device will be returned
+ * whether or not it is activated.
+ *
+ * @if_type:	Interface type (enum if_type_t)
+ * @devnum:	Device number (specific to each interface type)
+ * @devp:	the device, if found
+ * @return 0 if found, -ENODEV if no device found, or other -ve error value
+ */
+int blk_find_device(int if_type, int devnum, struct udevice **devp);
+
+/**
  * blk_get_device() - Find and probe a block device ready for use
  *
  * @if_type:	Interface type (enum if_type_t)
  * @devnum:	Device number (specific to each interface type)
  * @devp:	the device, if found
- * @return - if found, -ENODEV if no device found, or other -ve error value
+ * @return 0 if found, -ENODEV if no device found, or other -ve error value
  */
 int blk_get_device(int if_type, int devnum, struct udevice **devp);
 
test/dm/blk.c +21 -0
index 012bf4cab5..3e34336fae 100644
@@ -94,3 +94,24 @@ static int dm_test_blk_usb(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_blk_usb, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test that we can find block devices without probing them */
+static int dm_test_blk_find(struct unit_test_state *uts)
+{
+	struct udevice *blk, *dev;
+
+	ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
+				      IF_TYPE_HOST, 1, 512, 1024, &blk));
+	ut_asserteq(-ENODEV, blk_find_device(IF_TYPE_HOST, 0, &dev));
+	ut_assertok(blk_find_device(IF_TYPE_HOST, 1, &dev));
+	ut_asserteq_ptr(blk, dev);
+	ut_asserteq(false, device_active(dev));
+
+	/* Now activate it */
+	ut_assertok(blk_get_device(IF_TYPE_HOST, 1, &dev));
+	ut_asserteq_ptr(blk, dev);
+	ut_asserteq(true, device_active(dev));
+
+	return 0;
+}
+DM_TEST(dm_test_blk_find, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#7 lore raw

PATCH 2/8 dm: blk: Allow finding block devices without probing

Sometimes it is useful to be able to find a block device without also probing it. Add a function for this as well as the associated test.

---

 drivers/block/blk-uclass.c | 15 +++++++++++++--
 include/blk.h              | 15 ++++++++++++++-
 test/dm/blk.c              | 21 +++++++++++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)

Applied to u-boot-dm

#8 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

In reply to Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

---

 drivers/block/blk-uclass.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)
drivers/block/blk-uclass.c +16 -6
index 8b6b28d890..7947ca6f22 100644
@@ -473,6 +473,19 @@ int blk_find_max_devnum(enum if_type if_type)
 	return max_devnum;
 }
 
+static int blk_next_free_devnum(enum if_type if_type)
+{
+	int ret;
+
+	ret = blk_find_max_devnum(if_type);
+	if (ret == -ENODEV)
+		return 0;
+	else if (ret < 0)
+		return ret;
+	else
+		return ret + 1;
+}
+
 int blk_create_device(struct udevice *parent, const char *drv_name,
 		      const char *name, int if_type, int devnum, int blksz,
 		      lbaint_t size, struct udevice **devp)
@@ -482,13 +495,10 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
 	int ret;
 
 	if (devnum == -1) {
-		ret = blk_find_max_devnum(if_type);
-		if (ret == -ENODEV)
-			devnum = 0;
-		else if (ret < 0)
+		ret = blk_next_free_devnum(if_type);
+		if (ret < 0)
 			return ret;
-		else
-			devnum = ret + 1;
+		devnum = ret;
 	}
 	ret = device_bind_driver(parent, drv_name, name, &dev);
 	if (ret)
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#9 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

Quoted 5 lines · Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483

Quoted 9 lines
drivers/block/blk-uclass.c +8 -0
+static int blk_next_free_devnum(enum if_type if_type)
+{
+       int ret;
+
+       ret = blk_find_max_devnum(if_type);
+       if (ret == -ENODEV)
+               return 0;
 
+       else if (ret < 0)

Useless 'else'.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret;
+       else

Ditto.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret + 1;
+}
Signature · 2 lines
With Best Regards,
Andy Shevchenko
#10 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

Hi Andy,

Quoted 14 lines · Andy Shevchenko
Quoted 12 lines · Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

drivers/block/blk-uclass.c +7 -0
+static int blk_next_free_devnum(enum if_type if_type)
+{
+       int ret;
+
+       ret = blk_find_max_devnum(if_type);
+       if (ret == -ENODEV)
+               return 0;
Quoted 11 lines
Quoted 1 line

+ else if (ret < 0)

Useless 'else'.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret;
+       else

Ditto.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret + 1;
+}

I think it is clearer with these. At least, I would ask for them to be added if they were missing.

What do you think of this series as a whole?

Regards,
Simon

#11 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

Quoted 24 lines · Simon Glass

Hi Andy,

Quoted 21 lines · Andy Shevchenko
Quoted 5 lines · Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483

Quoted 9 lines
drivers/block/blk-uclass.c +8 -0
+static int blk_next_free_devnum(enum if_type if_type)
+{
+       int ret;
+
+       ret = blk_find_max_devnum(if_type);
+       if (ret == -ENODEV)
+               return 0;
 
+       else if (ret < 0)

Useless 'else'.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret;
+       else
Quoted 7 lines
Quoted 4 lines

Ditto.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret + 1;
+}

I think it is clearer with these. At least, I would ask for them to be added if they were missing.

Really? It's just noise in the code which makes it harder to read. In Linux kernel we remove that. If U-Boot has the above style kinda mandatory I would be really surprised.

Quoted 1 line

What do you think of this series as a whole?

It was a while ago. So, if there were no comments from me, that means I have nothing to argue of.

Signature · 2 lines
With Best Regards,
Andy Shevchenko
#12 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

Quoted 24 lines · Simon Glass

Hi Andy,

Quoted 21 lines · Andy Shevchenko
Quoted 5 lines · Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483

Quoted 9 lines
drivers/block/blk-uclass.c +8 -0
+static int blk_next_free_devnum(enum if_type if_type)
+{
+       int ret;
+
+       ret = blk_find_max_devnum(if_type);
+       if (ret == -ENODEV)
+               return 0;
 
+       else if (ret < 0)

Useless 'else'.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret;
+       else
Quoted 7 lines
Quoted 4 lines

Ditto.

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret + 1;
+}

I think it is clearer with these. At least, I would ask for them to be added if they were missing.

Really? It's just noise in the code which makes it harder to read. In Linux kernel we remove that. If U-Boot has the above style kinda mandatory I would be really surprised.

Quoted 1 line

What do you think of this series as a whole?

It was a while ago. So, if there were no comments from me, that means I have nothing to argue of.

Signature · 4 lines
With Best Regards,
Andy Shevchenko

Applied to u-boot-dm
#13 lore raw

PATCH 3/8 dm: blk: Add a function to find the next block device number

Hi Andy,

Quoted 18 lines · On 18 May 2017 at 10:01, <[email protected]> wrote:
Quoted 17 lines · Simon Glass

Hi Andy,

Quoted 14 lines · Andy Shevchenko
Quoted 12 lines · Simon Glass

At present this code is inline. Move it into a function to allow it to be used elsewhere.

drivers/block/blk-uclass.c +7 -0
+static int blk_next_free_devnum(enum if_type if_type)
+{
+       int ret;
+
+       ret = blk_find_max_devnum(if_type);
+       if (ret == -ENODEV)
+               return 0;
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 1 line

+ else if (ret < 0)

Useless 'else'.

drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485

Quoted 2 lines
drivers/block/blk-uclass.c +2 -0
+               return ret;
+       else

Ditto.

I updated these when applying.

- Simon

#14 lore raw

PATCH 4/8 dm: blk: Improve block device claiming

In reply to Simon Glass

The intention with block devices is that the device number (devnum field in its descriptor) matches the alias of its parent device. For example, with:

	aliases {
		mmc0 = "/sdhci at 700b0600";
		mmc1 = "/sdhci at 700b0400";
	}

we expect that the block devices for mmc0 and mmc1 would have device numbers of 0 and 1 respectively.

Unfortunately this does not currently always happen. If there is another MMC device earlier in the driver model data structures its block device will be created first. It will therefore get device number 0 and mmc0 will therefore miss out. In this case the MMC device will have sequence number 0 but its block device will not.

To avoid this, allow a device to request a device number and bump any existing device number that is using it. This all happens during the binding phase so it is safe to change these numbers around. This allows device numbers to match the aliases in all circumstances.

Add a test to verify the behaviour.

---

 arch/sandbox/dts/test.dts  | 12 +++++++++++-
 drivers/block/blk-uclass.c | 34 +++++++++++++++++++++++++++++++---
 test/dm/blk.c              | 39 +++++++++++++++++++++++++++++++++++++--
 3 files changed, 79 insertions(+), 6 deletions(-)
arch/sandbox/dts/test.dts +11 -1
index fff175d1b7..2f6abdbdbc 100644
@@ -12,6 +12,8 @@
 		eth3 = &eth_3;
 		eth5 = &eth_5;
 		i2c0 = "/i2c at 0";
+		mmc0 = "/mmc0";
+		mmc1 = "/mmc1";
 		pci0 = &pci;
 		remoteproc1 = &rproc_1;
 		remoteproc2 = &rproc_2;
@@ -242,7 +244,15 @@
 		mbox-names = "other", "test";
 	};
 
-	mmc {
+	mmc2 {
+		compatible = "sandbox,mmc";
+	};
+
+	mmc1 {
+		compatible = "sandbox,mmc";
+	};
+
+	mmc0 {
 		compatible = "sandbox,mmc";
 	};
 
drivers/block/blk-uclass.c +31 -3
index 7947ca6f22..4ee71a9852 100644
@@ -486,6 +486,31 @@ static int blk_next_free_devnum(enum if_type if_type)
 		return ret + 1;
 }
 
+static int blk_claim_devnum(enum if_type if_type, int devnum)
+{
+	struct udevice *dev;
+	struct uclass *uc;
+	int ret;
+
+	ret = uclass_get(UCLASS_BLK, &uc);
+	if (ret)
+		return ret;
+	uclass_foreach_dev(dev, uc) {
+		struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+		if (desc->if_type == if_type && desc->devnum == devnum) {
+			int next = blk_next_free_devnum(if_type);
+
+			if (next < 0)
+				return next;
+			desc->devnum = next;
+			return 0;
+		}
+	}
+
+	return -ENOENT;
+}
+
 int blk_create_device(struct udevice *parent, const char *drv_name,
 		      const char *name, int if_type, int devnum, int blksz,
 		      lbaint_t size, struct udevice **devp)
@@ -495,11 +520,14 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
 	int ret;
 
 	if (devnum == -1) {
-		ret = blk_next_free_devnum(if_type);
-		if (ret < 0)
+		devnum = blk_next_free_devnum(if_type);
+	} else {
+		ret = blk_claim_devnum(if_type, devnum);
+		if (ret < 0 && ret != -ENOENT)
 			return ret;
-		devnum = ret;
 	}
+	if (devnum < 0)
+		return devnum;
 	ret = device_bind_driver(parent, drv_name, name, &dev);
 	if (ret)
 		return ret;
test/dm/blk.c +37 -2
index 3e34336fae..5c5eb829a0 100644
@@ -83,12 +83,12 @@ static int dm_test_blk_usb(struct unit_test_state *uts)
 	ut_asserteq_ptr(usb_dev, dev_get_parent(dev));
 
 	/* Check we have one block device for each mass storage device */
-	ut_asserteq(4, count_blk_devices());
+	ut_asserteq(6, count_blk_devices());
 
 	/* Now go around again, making sure the old devices were unbound */
 	ut_assertok(usb_stop());
 	ut_assertok(usb_init());
-	ut_asserteq(4, count_blk_devices());
+	ut_asserteq(6, count_blk_devices());
 	ut_assertok(usb_stop());
 
 	return 0;
@@ -115,3 +115,38 @@ static int dm_test_blk_find(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_blk_find, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test that block device numbering works as expected */
+static int dm_test_blk_devnum(struct unit_test_state *uts)
+{
+	struct udevice *dev, *mmc_dev, *parent;
+	int i;
+
+	/*
+	 * Probe the devices, with the first one being probed last. This is the
+	 * one with no alias / sequence numnber.
+	 */
+	ut_assertok(uclass_get_device(UCLASS_MMC, 1, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MMC, 2, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MMC, 0, &dev));
+	for (i = 0; i < 3; i++) {
+		struct blk_desc *desc;
+
+		/* Check that the bblock device is attached */
+		ut_assertok(uclass_get_device_by_seq(UCLASS_MMC, i, &mmc_dev));
+		ut_assertok(blk_find_device(IF_TYPE_MMC, i, &dev));
+		parent = dev_get_parent(dev);
+		ut_asserteq_ptr(parent, mmc_dev);
+		ut_asserteq(trailing_strtol(mmc_dev->name), i);
+
+		/*
+		 * Check that the block device devnum matches its parent's
+		 * sequence number
+		 */
+		desc = dev_get_uclass_platdata(dev);
+		ut_asserteq(desc->devnum, i);
+	}
+
+	return 0;
+}
+DM_TEST(dm_test_blk_devnum, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#15 lore raw

PATCH 4/8 dm: blk: Improve block device claiming

The intention with block devices is that the device number (devnum field in its descriptor) matches the alias of its parent device. For example, with:

	aliases {
		mmc0 = "/sdhci at 700b0600";
		mmc1 = "/sdhci at 700b0400";
	}

we expect that the block devices for mmc0 and mmc1 would have device numbers of 0 and 1 respectively.

Unfortunately this does not currently always happen. If there is another MMC device earlier in the driver model data structures its block device will be created first. It will therefore get device number 0 and mmc0 will therefore miss out. In this case the MMC device will have sequence number 0 but its block device will not.

To avoid this, allow a device to request a device number and bump any existing device number that is using it. This all happens during the binding phase so it is safe to change these numbers around. This allows device numbers to match the aliases in all circumstances.

Add a test to verify the behaviour.

---

 arch/sandbox/dts/test.dts  | 12 +++++++++++-
 drivers/block/blk-uclass.c | 34 +++++++++++++++++++++++++++++++---
 test/dm/blk.c              | 39 +++++++++++++++++++++++++++++++++++++--
 3 files changed, 79 insertions(+), 6 deletions(-)

Applied to u-boot-dm

#16 lore raw

PATCH 5/8 dm: mmc: Avoid probing block devices in find_mmc_device()

In reply to Simon Glass

We do not need to probe the block device here, so avoid doing so. The MMC device itself must be active, but the block device can come later.

---

 drivers/mmc/mmc-uclass.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mmc/mmc-uclass.c +4 -2
index 9c07871d3a..1a84a033ae 100644
@@ -97,7 +97,7 @@ struct mmc *find_mmc_device(int dev_num)
 	struct udevice *dev, *mmc_dev;
 	int ret;
 
-	ret = blk_get_device(IF_TYPE_MMC, dev_num, &dev);
+	ret = blk_find_device(IF_TYPE_MMC, dev_num, &dev);
 
 	if (ret) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
@@ -108,7 +108,9 @@ struct mmc *find_mmc_device(int dev_num)
 
 	mmc_dev = dev_get_parent(dev);
 
-	return mmc_get_mmc_dev(mmc_dev);
+	struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
+
+	return mmc;
 }
 
 int get_mmc_num(void)
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#17 lore raw

PATCH 5/8 dm: mmc: Avoid probing block devices in find_mmc_device()

We do not need to probe the block device here, so avoid doing so. The MMC device itself must be active, but the block device can come later.

---

 drivers/mmc/mmc-uclass.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Applied to u-boot-dm

#18 lore raw

PATCH 6/8 dm: mmc: Check that drivers have operations

In reply to Simon Glass

When binding a new MMC device, make sure that it has the required operations. Since for now we still support *not* having the operations (with CONFIG_DM_MMC_OPS not enabled) it makes sense to add this check.

---

 drivers/mmc/mmc-uclass.c | 4 ++++
 1 file changed, 4 insertions(+)
drivers/mmc/mmc-uclass.c +4 -0
index 1a84a033ae..ae0e22dfeb 100644
@@ -198,6 +198,10 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
 	struct udevice *bdev;
 	int ret, devnum = -1;
 
+#ifdef CONFIG_DM_MMC_OPS
+	if (!mmc_get_ops(dev))
+		return -ENOSYS;
+#endif
 #ifndef CONFIG_SPL_BUILD
 	/* Use the fixed index with aliase node's index */
 	fdtdec_get_alias_seq(gd->fdt_blob, "mmc", dev->of_offset, &devnum);
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#19 lore raw

PATCH 6/8 dm: mmc: Check that drivers have operations

When binding a new MMC device, make sure that it has the required operations. Since for now we still support *not* having the operations (with CONFIG_DM_MMC_OPS not enabled) it makes sense to add this check.

---

 drivers/mmc/mmc-uclass.c | 4 ++++
 1 file changed, 4 insertions(+)

Applied to u-boot-dm

#20 lore raw

PATCH 7/8 dm: mmc: Rewrite mmc_blk_probe()

In reply to Simon Glass

This function is called when the MMC block device is being probed. There is a recursive call in this function since find_mmc_device() itself can cause the MMC device to be probed.

Admittedly the MMC device should already be probed, since we would not be probing its child otherwise, but the current code is unnecessarily convoluted.

Rewrite this to access the MMC structure directly.

---

 drivers/mmc/mmc-uclass.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/mmc/mmc-uclass.c +11 -6
index ae0e22dfeb..63248c3480 100644
@@ -262,13 +262,18 @@ static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
 
 static int mmc_blk_probe(struct udevice *dev)
 {
-	struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
-	int dev_num = block_dev->devnum;
-	struct mmc *mmc = find_mmc_device(dev_num);
+	struct udevice *mmc_dev = dev_get_parent(dev);
+	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc_dev);
+	struct mmc *mmc = upriv->mmc;
+	int ret;
+
+	ret = mmc_init(mmc);
+	if (ret) {
+		debug("%s: mmc_init() failed (err=%d)\n", __func__, ret);
+		return ret;
+	}
 
-	if (!mmc)
-		return -ENODEV;
-	return mmc_init(mmc);
+	return 0;
 }
 
 static const struct blk_ops mmc_blk_ops = {
Signature · 1 line
2.12.2.816.g2cccc81164-goog
#21 lore raw

PATCH 7/8 dm: mmc: Rewrite mmc_blk_probe()

This function is called when the MMC block device is being probed. There is a recursive call in this function since find_mmc_device() itself can cause the MMC device to be probed.

Admittedly the MMC device should already be probed, since we would not be probing its child otherwise, but the current code is unnecessarily convoluted.

Rewrite this to access the MMC structure directly.

---

 drivers/mmc/mmc-uclass.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Applied to u-boot-dm

#22 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

In reply to Simon Glass

Enable CONFIG_DM_MMC_OPS and CONFIG_BLK for all Tegra devices. This moves Tegra to use driver model fully for MMC.

---

 board/toradex/common/tdx-cfg-block.c |  2 +-
 configs/apalis-tk1_defconfig         |  2 -
 configs/apalis_t30_defconfig         |  2 -
 configs/beaver_defconfig             |  2 -
 configs/cardhu_defconfig             |  2 -
 configs/cei-tk1-som_defconfig        |  2 -
 configs/colibri_t20_defconfig        |  2 -
 configs/colibri_t30_defconfig        |  2 -
 configs/dalmore_defconfig            |  2 -
 configs/e2220-1170_defconfig         |  2 -
 configs/harmony_defconfig            |  2 -
 configs/jetson-tk1_defconfig         |  2 -
 configs/medcom-wide_defconfig        |  2 -
 configs/nyan-big_defconfig           |  2 -
 configs/p2371-0000_defconfig         |  2 -
 configs/p2371-2180_defconfig         |  2 -
 configs/p2571_defconfig              |  2 -
 configs/p2771-0000-000_defconfig     |  2 -
 configs/p2771-0000-500_defconfig     |  2 -
 configs/paz00_defconfig              |  2 -
 configs/plutux_defconfig             |  2 -
 configs/seaboard_defconfig           |  2 -
 configs/tec-ng_defconfig             |  2 -
 configs/tec_defconfig                |  2 -
 configs/trimslice_defconfig          |  2 -
 configs/venice2_defconfig            |  2 -
 configs/ventana_defconfig            |  2 -
 configs/whistler_defconfig           |  2 -
 drivers/mmc/tegra_mmc.c              | 72 ++++++++++++++++++++----------------
 29 files changed, 42 insertions(+), 86 deletions(-)
board/toradex/common/tdx-cfg-block.c +1 -1
index 0014ce80a1..2a810c89aa 100644
@@ -110,7 +110,7 @@ static int tdx_cfg_block_mmc_storage(u8 *config_block, int write)
 		ret = -ENODEV;
 		goto out;
 	}
-	if (part != mmc->block_dev.hwpart) {
+	if (part != mmc_get_blk_desc(mmc)->hwpart) {
 		if (blk_select_hwpart_devnum(IF_TYPE_MMC, dev, part)) {
 			puts("MMC partition switch failed\n");
 			ret = -ENODEV;
configs/apalis-tk1_defconfig +0 -2
index 10862e56e7..27ca42c6c3 100644
@@ -24,10 +24,8 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_TEGRA124_MMC_DISABLE_EXT_LOOPBACK=y
 CONFIG_E1000=y
 CONFIG_PCI=y
configs/apalis_t30_defconfig +0 -2
index a31b912968..864f71059f 100644
@@ -25,10 +25,8 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_E1000=y
 CONFIG_PCI=y
 CONFIG_DM_PCI=y
configs/beaver_defconfig +0 -2
index 0365246ee5..cb1018ea16 100644
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/cardhu_defconfig +0 -2
index 77dac784e3..38814c98e7 100644
@@ -24,8 +24,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/cei-tk1-som_defconfig +0 -2
index 88b93cb0ff..1ab1f1fa9f 100644
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/colibri_t20_defconfig +0 -2
index 85956c52ea..f357f7e581 100644
@@ -28,10 +28,8 @@ CONFIG_CMD_UBI=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_MTD_UBI_FASTMAP=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
configs/colibri_t30_defconfig +0 -2
index 0071a923e4..5581390a0c 100644
@@ -25,10 +25,8 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
configs/dalmore_defconfig +0 -2
index 8aae0e15dc..b02cfa578c 100644
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/e2220-1170_defconfig +0 -2
index c5563a4461..89137409b7 100644
@@ -21,11 +21,9 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/harmony_defconfig +0 -2
index 6163353621..e42e2b4dc6 100644
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_PCI=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
configs/jetson-tk1_defconfig +0 -2
index 58d4184600..1c1b4b199b 100644
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/medcom-wide_defconfig +0 -2
index a811506f29..47dc7c46e4 100644
@@ -23,8 +23,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
configs/nyan-big_defconfig +0 -2
index 63f1a6f03f..007702e012 100644
@@ -31,14 +31,12 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
 CONFIG_CROS_EC_KEYB=y
 CONFIG_CROS_EC=y
 CONFIG_CROS_EC_SPI=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_PMIC=y
configs/p2371-0000_defconfig +0 -2
index 0ff4c13aa0..cc87e4298b 100644
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/p2371-2180_defconfig +0 -2
index 4dfb02db20..69bc9a1735 100644
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/p2571_defconfig +0 -2
index e49a42f45b..b88d096728 100644
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/p2771-0000-000_defconfig +0 -2
index b4daa1256a..edf6ce4a93 100644
@@ -19,9 +19,7 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_TEGRA186_BPMP_I2C=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DWC_ETH_QOS=y
 CONFIG_E1000=y
 CONFIG_RTL8169=y
configs/p2771-0000-500_defconfig +0 -2
index 02e974d0e9..c3870c38d6 100644
@@ -19,9 +19,7 @@ CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_BLK is not set
 CONFIG_TEGRA186_BPMP_I2C=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DWC_ETH_QOS=y
 CONFIG_E1000=y
 CONFIG_RTL8169=y
configs/paz00_defconfig +0 -2
index 0ad0974d34..0f1ee66b6d 100644
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
configs/plutux_defconfig +0 -2
index 0c6c65e9d8..aa6b597f1f 100644
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
configs/seaboard_defconfig +0 -2
index 3e5549c073..9a247d554b 100644
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
configs/tec-ng_defconfig +0 -2
index cd9b507803..1c1d835c28 100644
@@ -25,8 +25,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/tec_defconfig +0 -2
index 1dd8a1ec20..74e9b7401a 100644
@@ -23,8 +23,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
configs/trimslice_defconfig +0 -2
index 455f4b2819..9ab15fa3c6 100644
@@ -24,8 +24,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_RTL8169=y
configs/venice2_defconfig +0 -2
index 1b0e646474..7e70875345 100644
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
configs/ventana_defconfig +0 -2
index 486861b461..d4207a1b07 100644
@@ -21,8 +21,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
configs/whistler_defconfig +0 -2
index 6c27b36235..69d435f538 100644
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
-# CONFIG_BLK is not set
-# CONFIG_DM_MMC_OPS is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
drivers/mmc/tegra_mmc.c +41 -31

169 lines not on this page · raw message

Signature · 1 line
2.12.2.816.g2cccc81164-goog
#23 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

Enable CONFIG_DM_MMC_OPS and CONFIG_BLK for all Tegra devices. This moves Tegra to use driver model fully for MMC.

---

 board/toradex/common/tdx-cfg-block.c |  2 +-
 configs/apalis-tk1_defconfig         |  2 -
 configs/apalis_t30_defconfig         |  2 -
 configs/beaver_defconfig             |  2 -
 configs/cardhu_defconfig             |  2 -
 configs/cei-tk1-som_defconfig        |  2 -
 configs/colibri_t20_defconfig        |  2 -
 configs/colibri_t30_defconfig        |  2 -
 configs/dalmore_defconfig            |  2 -
 configs/e2220-1170_defconfig         |  2 -
 configs/harmony_defconfig            |  2 -
 configs/jetson-tk1_defconfig         |  2 -
 configs/medcom-wide_defconfig        |  2 -
 configs/nyan-big_defconfig           |  2 -
 configs/p2371-0000_defconfig         |  2 -
 configs/p2371-2180_defconfig         |  2 -
 configs/p2571_defconfig              |  2 -
 configs/p2771-0000-000_defconfig     |  2 -
 configs/p2771-0000-500_defconfig     |  2 -
 configs/paz00_defconfig              |  2 -
 configs/plutux_defconfig             |  2 -
 configs/seaboard_defconfig           |  2 -
 configs/tec-ng_defconfig             |  2 -
 configs/tec_defconfig                |  2 -
 configs/trimslice_defconfig          |  2 -
 configs/venice2_defconfig            |  2 -
 configs/ventana_defconfig            |  2 -
 configs/whistler_defconfig           |  2 -
 drivers/mmc/tegra_mmc.c              | 72 ++++++++++++++++++++----------------
 29 files changed, 42 insertions(+), 86 deletions(-)

Applied to u-boot-dm

#24 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

Simon,

What testing did you do?

Tom
--
nvpublic

Quoted 54 lines

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com]
Sent: Thursday, May 18, 2017 9:01 AM
To: Simon Glass <[email protected]>
Cc: Alban Bedel <[email protected]>; Max Krummenacher <[email protected]>; Masahiro Yamada <[email protected]>; Tom Warren <[email protected]>; Peter.Chubb at data61.csiro.au; Stephen Warren <[email protected]>; Stefan Agner <[email protected]>; Lucas Stach <[email protected]>; Allen Martin <[email protected]>; Marcel Ziswiler <[email protected]>; Jaehoon Chung <[email protected]>; Stephen Warren <[email protected]>; U-Boot Mailing List <u- boot at lists.denx.de>
Subject: Re: [PATCH 8/8] tegra: Convert MMC to use driver model for operations

Enable CONFIG_DM_MMC_OPS and CONFIG_BLK for all Tegra devices. This moves Tegra to use driver model fully for MMC.

---

 board/toradex/common/tdx-cfg-block.c |  2 +-
 configs/apalis-tk1_defconfig         |  2 -
 configs/apalis_t30_defconfig         |  2 -
 configs/beaver_defconfig             |  2 -
 configs/cardhu_defconfig             |  2 -
 configs/cei-tk1-som_defconfig        |  2 -
 configs/colibri_t20_defconfig        |  2 -
 configs/colibri_t30_defconfig        |  2 -
 configs/dalmore_defconfig            |  2 -
 configs/e2220-1170_defconfig         |  2 -
 configs/harmony_defconfig            |  2 -
 configs/jetson-tk1_defconfig         |  2 -
 configs/medcom-wide_defconfig        |  2 -
 configs/nyan-big_defconfig           |  2 -
 configs/p2371-0000_defconfig         |  2 -
 configs/p2371-2180_defconfig         |  2 -
 configs/p2571_defconfig              |  2 -
 configs/p2771-0000-000_defconfig     |  2 -
 configs/p2771-0000-500_defconfig     |  2 -
 configs/paz00_defconfig              |  2 -
 configs/plutux_defconfig             |  2 -
 configs/seaboard_defconfig           |  2 -
 configs/tec-ng_defconfig             |  2 -
 configs/tec_defconfig                |  2 -
 configs/trimslice_defconfig          |  2 -
 configs/venice2_defconfig            |  2 -
 configs/ventana_defconfig            |  2 -
 configs/whistler_defconfig           |  2 -
 drivers/mmc/tegra_mmc.c              | 72 ++++++++++++++++++++----------------
 29 files changed, 42 insertions(+), 86 deletions(-)

Applied to u-boot-dm

#25 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

Hi Tom,

Quoted 3 lines · Tom Warren

Simon,

What testing did you do?

This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)

Quoted 4 lines

Tom
--
nvpublic

Regards,
Simon

#26 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

Hi Simon

Quoted 9 lines · Simon Glass

Hi Tom,

Quoted 3 lines · Tom Warren

Simon,

What testing did you do?

This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)

Sorry about that, been mighty busy around here.

I just tested dm/master on all our Tegra hardware being Apalis T30, Apalis TK1, Colibri T20 and Colibri T30 and all works fine including e.g. the 3 SD/MMC controllers via driver model now:

Apalis TK1 # dm tree
 Class       Probed   Name
----------------------------------------
 root        [ + ]    root_driver
...

 mmc         [ + ]    |-- sdhci at 700b0000
 blk         [ + ]    |   `-- sdhci at 700b0000.blk
 mmc         [ + ]    |-- sdhci at 700b0400
 blk         [ + ]    |   `-- sdhci at 700b0400.blk
 mmc         [ + ]    |-- sdhci at 700b0600
 blk         [ + ]    |   `-- sdhci at 700b0600.blk
 usb         [   ]    |-- usb at 7d000000
 usb         [   ]    |-- usb at 7d004000
 usb         [   ]    |-- usb at 7d008000

 simple_bus  [   ]    `-- clocks
 clk         [   ]        `-- clock at 0

With the live tree stuff I had less success but will post on resp. message there.

Quoted 1 line
Quoted 1 line

Tom

Cheers

Marcel

Quoted 9 lines
Quoted 2 lines

--
nvpublic

Regards,
Simon
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
https://lists.denx.de/listinfo/u-boot

#27 lore raw

PATCH 8/8 tegra: Convert MMC to use driver model for operations

Hi Marcel,

Quoted 10 lines · Marcel Ziswiler

Hi Simon

Quoted 7 lines · Simon Glass

Hi Tom,

Quoted 3 lines · Tom Warren

Simon,

What testing did you do?

Quoted 8 lines
Quoted 2 lines

This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)

Sorry about that, been mighty busy around here.

I just tested dm/master on all our Tegra hardware being Apalis T30, Apalis TK1, Colibri T20 and Colibri T30 and all works fine including e.g. the 3 SD/MMC controllers via driver model now:

OK good, thanks!

Regards,
Simon

#28 lore raw

cover dm: mmc: Tidy up handling of block devices

In reply to Simon Glass
Quoted 12 lines · Simon Glass

The current MMC block device support has a few deficiencies which show up when both CONFIG_BLK and CONFIG_DM_MMC_OPS are defined:

- Block device numbering does not always following MMC device numbering
- Environment in MMC does not always work correctly

In addition some parts of the code can be implemented in a better way.

This series fixes the above problems, adds a few tests and converts Tegra over to use CONFIG_BLK and CONFIG_DM_MMC_OPS.

As far as I can see this series doesn't change power flow for MMC anyhow. If it's true, take my

Quoted 54 lines

Simon Glass (8):
dm: mmc: Don't re-init when accessing environment
dm: blk: Allow finding block devices without probing
dm: blk: Add a function to find the next block device number
dm: blk: Improve block device claiming
dm: mmc: Avoid probing block devices in find_mmc_device()
dm: mmc: Check that drivers have operations
dm: mmc: Rewrite mmc_blk_probe()
tegra: Convert MMC to use driver model for operations

 arch/sandbox/dts/test.dts            | 12 +++++-
 board/toradex/common/tdx-cfg-block.c |  2 +-
 common/env_mmc.c                     |  3 +-
 configs/apalis-tk1_defconfig         |  2 -
 configs/apalis_t30_defconfig         |  2 -
 configs/beaver_defconfig             |  2 -
 configs/cardhu_defconfig             |  2 -
 configs/cei-tk1-som_defconfig        |  2 -
 configs/colibri_t20_defconfig        |  2 -
 configs/colibri_t30_defconfig        |  2 -
 configs/dalmore_defconfig            |  2 -
 configs/e2220-1170_defconfig         |  2 -
 configs/harmony_defconfig            |  2 -
 configs/jetson-tk1_defconfig         |  2 -
 configs/medcom-wide_defconfig        |  2 -
 configs/nyan-big_defconfig           |  2 -
 configs/p2371-0000_defconfig         |  2 -
 configs/p2371-2180_defconfig         |  2 -
 configs/p2571_defconfig              |  2 -
 configs/p2771-0000-000_defconfig     |  2 -
 configs/p2771-0000-500_defconfig     |  2 -
 configs/paz00_defconfig              |  2 -
 configs/plutux_defconfig             |  2 -
 configs/seaboard_defconfig           |  2 -
 configs/tec-ng_defconfig             |  2 -
 configs/tec_defconfig                |  2 -
 configs/trimslice_defconfig          |  2 -
 configs/venice2_defconfig            |  2 -
 configs/ventana_defconfig            |  2 -
 configs/whistler_defconfig           |  2 -
 drivers/block/blk-uclass.c           | 65 ++++++++++++++++++++++++++++----
 drivers/mmc/mmc-uclass.c             | 27 ++++++++++----
 drivers/mmc/tegra_mmc.c              | 72 ++++++++++++++++++++----------------
 include/blk.h                        | 15 +++++++-
 test/dm/blk.c                        | 60 +++++++++++++++++++++++++++++-
 35 files changed, 203 insertions(+), 107 deletions(-)

--
2.12.2.816.g2cccc81164-goog

_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
https://lists.denx.de/listinfo/u-boot

Signature · 2 lines
With Best Regards,
Andy Shevchenko