
This series explores using the (not yet applied) tag support in driver model to reduce memory usage in SPL.
This is particularly important on 64-bit machines, which use a ridiculously large 8 bytes for each pointer into what what is sometimes only 64KB of available memory.
The primary focus of this series is struct udevice, which can be shrunk in various ways:
- Including devres_head only when DEVRES is enabled (i.e. not in SPL) - Using tags instead of pointers for attached data like plat_, priv_ and driver_data - Using singly linked lists, currently not supported in U-Boot - Using a table index for the driver pointer and uclass pointer
Together these bring the size of struct udevice down from 0xa0 (160) bytes to 0x30 (48) bytes.
Another option is to drop the device name, although this is a pain for debugging.
It would also be possible to implement doubly linked lists with a 16-bit index into malloc space, in SPL, thus reducing the overhead in each node from 16 bytes to 2, or just using a fixed-size list for each data structure, since the number of items is quite limited in SPL.
To implement the tag side of things, functions like dev_set_parent_priv() need to be modified to call dev_tag_set_ptr(), and dev_get_parent_priv() needs to call dev_tag_get_ptr().
Note there has been some previous work:
- tiny-dm analysis[1] which we decided was too disruptive - build-time instantiation, to reduce SPL code size[2].
[1] https://patchwork.ozlabs.org/project/uboot/cover/20200702211004.1491489-1-sj... [2] https://u-boot.readthedocs.io/en/latest/develop/driver-model/of-plat.html#bu...
AKASHI Takahiro (1): RFC: dm: add tag support
Simon Glass (9): Makefile: v2 Allow LTO to be disabled for a build sandbox: Correct loss of early output in SPL Makefile: Drop a stale comment about linking Makefile: Avoid resetting link flags in config.mk sandbox: Allow link flags to be given sandbox: Align linker lists to a 32-byte boundary dm: core: Allow devres to be disabled in SPL dm: core: Deal with a wrinkle with linker lists WIP: dm: core: Add a command to calculate memory usage
Makefile | 22 ++-- arch/arm/config.mk | 4 +- arch/arm/include/asm/global_data.h | 2 +- arch/sandbox/config.mk | 4 +- arch/sandbox/cpu/os.c | 2 +- arch/sandbox/cpu/u-boot-spl.lds | 2 +- arch/sandbox/cpu/u-boot.lds | 2 +- cmd/dm.c | 15 ++- common/spl/spl.c | 9 ++ config.mk | 1 - doc/build/gcc.rst | 17 +++ drivers/core/Makefile | 4 +- drivers/core/device.c | 70 +++++++++++- drivers/core/dump.c | 73 +++++++++++++ drivers/core/root.c | 63 ++++++++++- drivers/core/tag.c | 168 +++++++++++++++++++++++++++++ include/asm-generic/global_data.h | 4 + include/dm/device-internal.h | 6 +- include/dm/device.h | 16 ++- include/dm/devres.h | 4 +- include/dm/root.h | 45 ++++++++ include/dm/tag.h | 126 ++++++++++++++++++++++ include/dm/util.h | 9 ++ scripts/Makefile.spl | 2 +- test/dm/Makefile | 2 +- 25 files changed, 640 insertions(+), 32 deletions(-) create mode 100644 drivers/core/tag.c create mode 100644 include/dm/tag.h