[PATCH 00/27] dm: Change the way sequence numbers are implemented
Michael Walle
michael at walle.cc
Tue Dec 8 23:52:07 CET 2020
Hi Simon,
Am 2020-11-30 02:53, schrieb Simon Glass:
> At present each device has two sequence numbers, with 'req_seq' being
> set up at bind time and 'seq' at probe time. The idea is that devices
> can 'request' a sequence number and then the conflicts are resolved
> when
> the device is probed.
>
> This makes things complicated in a few cases, since we don't really
> know
> (at bind time) what the sequence number will end up being. We want to
> honour the bind-time requests if at all possible, but in fact the only
> source of these at present is the devicetree aliases.
>
> Apart from the obvious need for sequence numbers to supports U-Boot's
> numbering on devices on the command line, the current scheme was
> designed to:
>
> - avoid calculating the sequence number until it is needed, to save
> execution time
> - allow multiple devices to obtain a particular sequence number as they
> are probed and removed
> - retain a record of the 'requested' sequence number even if it turns
> out
> that a device could not get it (to allow debugging and retrying)
>
> After some years using the current scheme it seems on balance that
> these
> goals don't have as much merit as first thought. The first point would
> be persuasive except that we end up reading the devicetree aliases at
> bind-time anyway. So the work of resolving the sequence numbers during
> probing is not that great. The second point hasn't really been an
> issue,
> as there is typically no contention for sequence numbers (boards tend
> to
> allocate them statically in the devicetree). Re the third point, we can
> often figure out what was requested by looking at aliases, and in the
> cases where we can't, it doesn't seem to matter much.
>
> Since we have the devicetree available at bind time, we may as well
> just
> use it, in the hope that the required processing will turn out to be
> useful later (i.e. the device actually gets used). In addition, it is
> simpler to use a single sequence number, since it avoids confusion and
> some extra code.
>
> This series moves U-Boot to use a single, bind-time sequence number.
> All
> uclasses with the DM_UC_FLAG_SEQ_ALIAS flag enabled will assign
> sequence
> numbers to their devices, so that as soon as a device is bound, it has
> a
> sequence number. If a devicetree alias provides the number, it will be
> used. Otherwise, during initial binding, the first free number is used.
What does "first free number mean"?
I have a device tree with the following aliases for network:
aliases {
ethernet0 = &enetc0;
ethernet1 = &enetc1;
ethernet2 = &enetc2;
ethernet3 = &enetc6;
};
The individual devices might be disabled, depending on the board variant
(which might also be dynamically determined during startup).
My first smoke test with this series show the following:
uclass 32: eth
0 * enetc-0 @ ffd40e60, seq 0
1 * ax88179_eth @ ffd51f50, seq 1
Looks like the usb ethernet device will get seq 1 assigned (after "usb
start"). Is this intended?
If so, this is a problem, because for ethernet devices, the MAC address
is assigned according to the ethNaddr variable. And at least for this
board (kontron_sl28) the first four are reserved for the ones with the
alias entries. Thus I'd have expected that the usb device will get seq 4
assigned.
> For ad-hoc calls to device_bind() afterwards (e.g. from driver code),
> the
> sequence is set to the maximum sequence number for the uclass + 1.
>
> Apart from the simplicity gains, overall these changes seem to reduce
> the
> number of tweaks and workarounds needed to get the desired behaviour.
>
> However there will certainly be some problems created, so board
> maintainers should test this out.
-michael
More information about the U-Boot
mailing list