From: Michal Simek <michal.simek@xilinx.com>
To: u-boot@lists.denx.de
Subject: [PATCH v3] dm: uclass: don't assign aliased seq numbers
Date: Thu, 20 Feb 2020 09:30:50 +0100 [thread overview]
Message-ID: <0329abd9-16bf-5c71-dc90-ccc05b79b7cf@xilinx.com> (raw)
In-Reply-To: <20200203171152.1639-1-michael@walle.cc>
On 03. 02. 20 18:11, Michael Walle wrote:
> If there are aliases for an uclass, set the base for the "dynamically"
> allocated numbers next to the highest alias.
>
> Please note, that this might lead to holes in the sequences, depending
> on the device tree. For example if there is only an alias "ethernet1",
> the next device seq number would be 2.
>
> In particular this fixes a problem with boards which are using ethernet
> aliases but also might have network add-in cards like the E1000. If the
> board is started with the add-in card and depending on the order of the
> drivers, the E1000 might occupy the first ethernet device and mess up
> all the hardware addresses, because the devices are now shifted by one.
>
> Also adapt the test cases to the new handling and add test cases
> checking the holes in the seq numbers.
>
> Signed-off-by: Michael Walle <michael@walle.cc>
> Reviewed-by: Alex Marginean <alexandru.marginean@nxp.com>
> Tested-by: Alex Marginean <alexandru.marginean@nxp.com>
> Acked-by: Vladimir Oltean <olteanv@gmail.com>
> ---
>
> Please note that I've kept the R-b, T-b, and A-b tags although they were
> for an older version. They only affects the drivers/core/uclass.c not the
> test/dm/ part. OTOH none of the actual implementation has changed.
>
> I couldn't split the patch, otherwise the tests would fail.
>
> As a side effect, this should also make the following commits
> superfluous:
> - 7f3289bf6d ("dm: device: Request next sequence number")
> - 61607225d1 ("i2c: Fill req_seq in i2c_post_bind()")
> Although I don't understand the root cause of the said problem.
>
> Thomas, Michal, could you please test this and then I'd add a second
> patch removing the old code.
>
> changes since v2:
> - adapt/new test cases, thanks Simon
>
> changes since v1:
> - move notice about superfluous commits from commit message to this
> section.
> - fix the comment style
>
> arch/sandbox/dts/test.dts | 4 ++--
> drivers/core/uclass.c | 21 +++++++++++++++------
> include/configs/sandbox.h | 6 +++---
> test/dm/eth.c | 14 +++++++-------
> test/dm/test-fdt.c | 22 +++++++++++++++++-----
> 5 files changed, 44 insertions(+), 23 deletions(-)
>
> diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
> index e529c54d8d..d448892a65 100644
> --- a/arch/sandbox/dts/test.dts
> +++ b/arch/sandbox/dts/test.dts
> @@ -19,8 +19,8 @@
> pci0 = &pci0;
> pci1 = &pci1;
> pci2 = &pci2;
> - remoteproc1 = &rproc_1;
> - remoteproc2 = &rproc_2;
> + remoteproc0 = &rproc_1;
> + remoteproc1 = &rproc_2;
> rtc0 = &rtc_0;
> rtc1 = &rtc_1;
> spi0 = "/spi at 0";
> diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
> index c520ef113a..3c216221e0 100644
> --- a/drivers/core/uclass.c
> +++ b/drivers/core/uclass.c
> @@ -675,13 +675,14 @@ int uclass_unbind_device(struct udevice *dev)
>
> int uclass_resolve_seq(struct udevice *dev)
> {
> + struct uclass *uc = dev->uclass;
> + struct uclass_driver *uc_drv = uc->uc_drv;
> struct udevice *dup;
> - int seq;
> + int seq = 0;
> int ret;
>
> assert(dev->seq == -1);
> - ret = uclass_find_device_by_seq(dev->uclass->uc_drv->id, dev->req_seq,
> - false, &dup);
> + ret = uclass_find_device_by_seq(uc_drv->id, dev->req_seq, false, &dup);
> if (!ret) {
> dm_warn("Device '%s': seq %d is in use by '%s'\n",
> dev->name, dev->req_seq, dup->name);
> @@ -693,9 +694,17 @@ int uclass_resolve_seq(struct udevice *dev)
> return ret;
> }
>
> - for (seq = 0; seq < DM_MAX_SEQ; seq++) {
> - ret = uclass_find_device_by_seq(dev->uclass->uc_drv->id, seq,
> - false, &dup);
> + if (CONFIG_IS_ENABLED(DM_SEQ_ALIAS) &&
> + (uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS)) {
> + /*
> + * dev_read_alias_highest_id() will return -1 if there no
> + * alias. Thus we can always add one.
> + */
> + seq = dev_read_alias_highest_id(uc_drv->name) + 1;
> + }
> +
> + for (; seq < DM_MAX_SEQ; seq++) {
> + ret = uclass_find_device_by_seq(uc_drv->id, seq, false, &dup);
> if (ret == -ENODEV)
> break;
> if (ret)
> diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> index 1c13055cdc..b02c362fed 100644
> --- a/include/configs/sandbox.h
> +++ b/include/configs/sandbox.h
> @@ -97,9 +97,9 @@
> #endif
>
> #define SANDBOX_ETH_SETTINGS "ethaddr=00:00:11:22:33:44\0" \
> - "eth1addr=00:00:11:22:33:45\0" \
> - "eth3addr=00:00:11:22:33:46\0" \
> - "eth5addr=00:00:11:22:33:47\0" \
> + "eth3addr=00:00:11:22:33:45\0" \
> + "eth5addr=00:00:11:22:33:46\0" \
> + "eth6addr=00:00:11:22:33:47\0" \
> "ipaddr=1.2.3.4\0"
>
> #define MEM_LAYOUT_ENV_SETTINGS \
> diff --git a/test/dm/eth.c b/test/dm/eth.c
> index ad5354b4bf..75315a0c6d 100644
> --- a/test/dm/eth.c
> +++ b/test/dm/eth.c
> @@ -47,7 +47,7 @@ static int dm_test_eth_alias(struct unit_test_state *uts)
> ut_assertok(net_loop(PING));
> ut_asserteq_str("eth at 10002000", env_get("ethact"));
>
> - env_set("ethact", "eth1");
> + env_set("ethact", "eth6");
> ut_assertok(net_loop(PING));
> ut_asserteq_str("eth at 10004000", env_get("ethact"));
>
> @@ -104,7 +104,7 @@ static int dm_test_eth_act(struct unit_test_state *uts)
> const char *ethname[DM_TEST_ETH_NUM] = {"eth at 10002000", "eth at 10003000",
> "sbe5", "eth at 10004000"};
> const char *addrname[DM_TEST_ETH_NUM] = {"ethaddr", "eth5addr",
> - "eth3addr", "eth1addr"};
> + "eth3addr", "eth6addr"};
> char ethaddr[DM_TEST_ETH_NUM][18];
> int i;
>
> @@ -187,15 +187,15 @@ static int dm_test_eth_rotate(struct unit_test_state *uts)
>
> /* Invalidate eth1's MAC address */
> memset(ethaddr, '\0', sizeof(ethaddr));
> - strncpy(ethaddr, env_get("eth1addr"), 17);
> - /* Must disable access protection for eth1addr before clearing */
> - env_set(".flags", "eth1addr");
> - env_set("eth1addr", NULL);
> + strncpy(ethaddr, env_get("eth6addr"), 17);
> + /* Must disable access protection for eth6addr before clearing */
> + env_set(".flags", "eth6addr");
> + env_set("eth6addr", NULL);
>
> retval = _dm_test_eth_rotate1(uts);
>
> /* Restore the env */
> - env_set("eth1addr", ethaddr);
> + env_set("eth6addr", ethaddr);
> env_set("ethrotate", NULL);
>
> if (!retval) {
> diff --git a/test/dm/test-fdt.c b/test/dm/test-fdt.c
> index d59c449ce0..a4e5c64a1f 100644
> --- a/test/dm/test-fdt.c
> +++ b/test/dm/test-fdt.c
> @@ -359,20 +359,32 @@ static int dm_test_fdt_uclass_seq(struct unit_test_state *uts)
> ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 2, &dev));
> ut_asserteq_str("d-test", dev->name);
>
> - /* d-test actually gets 0 */
> - ut_assertok(uclass_get_device_by_seq(UCLASS_TEST_FDT, 0, &dev));
> + /*
> + * d-test actually gets 9, because thats the next free one after the
> + * aliases.
> + */
> + ut_assertok(uclass_get_device_by_seq(UCLASS_TEST_FDT, 9, &dev));
> ut_asserteq_str("d-test", dev->name);
>
> - /* initially no one wants seq 1 */
> - ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_TEST_FDT, 1,
> + /* initially no one wants seq 10 */
> + ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_TEST_FDT, 10,
> &dev));
> ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
> ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 4, &dev));
>
> /* But now that it is probed, we can find it */
> - ut_assertok(uclass_get_device_by_seq(UCLASS_TEST_FDT, 1, &dev));
> + ut_assertok(uclass_get_device_by_seq(UCLASS_TEST_FDT, 10, &dev));
> ut_asserteq_str("f-test", dev->name);
>
> + /*
> + * And we should still have holes in our sequence numbers, that is 2
> + * and 4 should not be used.
> + */
> + ut_asserteq(-ENODEV, uclass_find_device_by_seq(UCLASS_TEST_FDT, 2,
> + true, &dev));
> + ut_asserteq(-ENODEV, uclass_find_device_by_seq(UCLASS_TEST_FDT, 4,
> + true, &dev));
> +
> return 0;
> }
> DM_TEST(dm_test_fdt_uclass_seq, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
>
Tested-by: Michal Simek <michal.simek@xilinx.com>
Thanks,
Michal
next prev parent reply other threads:[~2020-02-20 8:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-03 17:11 [PATCH v3] dm: uclass: don't assign aliased seq numbers Michael Walle
2020-02-05 20:05 ` Simon Glass
2020-03-03 2:39 ` Simon Glass
2020-02-20 8:30 ` Michal Simek [this message]
2020-02-20 9:52 ` Michael Walle
2020-02-20 10:14 ` Michal Simek
2020-02-20 20:16 ` Michael Walle
2020-02-21 7:00 ` Michal Simek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0329abd9-16bf-5c71-dc90-ccc05b79b7cf@xilinx.com \
--to=michal.simek@xilinx.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.