dm: core: Deal with a wrinkle with linker lists
authorSimon Glass <sjg@chromium.org>
Sun, 27 Mar 2022 20:26:20 +0000 (14:26 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 18 Apr 2022 21:53:56 +0000 (17:53 -0400)
commitcdd73e7215b838095984f02554fc1bc4186124af
tree3a1b5cdaf53927f248bace6f6face7155788687f
parent092d5c2a83b730844aeaa5ac300ddc7f13a75f49
dm: core: Deal with a wrinkle with linker lists

When every member of a linker list is aligned by the compiler, we can no
longer rely on the sizeof of the struct to determine the number of
entries.

For example, if the struct size is 0x90 but every entry is aligned to 0xa0
by the compiler, the linker list entries takes more space in memory and
the calculation of the number of entries is incorrect. For example, we may
see 0x12 entries when there are only 0x11.

This is a real problem. There may be a general solution, although I cannot
currently think of one. So far it only bites with OF_PLATDATA_RT which
creates a pointer to each entry of the 'struct udevice' linker_list. This
does not happen without that option, so it only affects SPL.

Work around it by manually calculating the aligned size of struct udevice,
then using that for the n_ent calculation.

Note: the alignment fix to linker list was here:

   0b2fa98aa5e linker_lists: Fix alignment issue

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/device.c
drivers/core/root.c
include/dm/device.h