(this is series 2 of 3 for live tree support - the final series will fully convert a real board and provide size comparisons)
So far U-Boot uses a 'flat' device tree, which means that it is decoded on the fly as needed. This uses the libfdt library and avoids needing extra memory for additional tables. For some time there has been discussion about moving U-Boot to use a 'live' tree, where the device tree is decoded at start-up into a set of hierarchical structures with pointers. The advantages are: - It is somewhat faster to access (in particular scanning and looking for a parent) - It permits the device tree to be changed at run-time (this is not recommended with the flat device tree since devices store the offset of their device tree node and updating the tree may invalidate that). Enabling this feature could be useful for overlays, for example. - It allows nodes to be referenced by a single pointer, instead of the current device tree pointer plus offset The disadvantages are: - It requires more memory - It takes (a little) time to build the live tree - It adds more complexity under the hood, including an additional abstraction layer This series is an attempt to introduce a useful live tree feature into U-Boot. There are many options and trade-offs. This series is the culmination of quite a bit of thought and experimentation. The approach used in this series is: - Before relocation the flat tree is used, to avoid extra memory usage and time. In general, there is not much access before relocation since most drivers are not started up. So there is little benefit in having a live tree - After relocation the live tree is built. At this point the CPU should be running quickly and there is plenty of memory. All available devices will be bound so the overhead of building the live tree may be outweighed by its greater efficiency. As a simplification, this series supports only one tree or the other. When the live tree is active, the flat tree cannot be used. That makes it easy to know the current state and avoids confusion over mixing offset and node pointers. Some drivers will need to be used both before and after relocation. This means that they must support both the flat and the live tree. To support this, the concept of a node 'reference' is defined. A reference can hold either a node offset (for the flat tree) or a node pointer (for the live tree). This allows drivers to access values from the tree regardless of which tree is in use. In addition, since most device tree access happens in the context of a device (struct udevice), a new 'dev_read' layer is provided to read device tree configuration associated with a device. This encapsulates the details of exactly how this information is read. I have taken the view that code compatibility with Linux is desirable. So the of_access.c file brings in code from Linux with very little modification. As new access methods are needed we should be able to bring in more code and avoid writing it ourselves in U-Boot. Conversion of drivers and subsystems to support the live tree (as well as flat tree) is fairly easy. Patch are included to add support to subsystems for which tests exist, to ensure that 'make tests' still passes. Future work will enable the live device tree on a real board and include code size comparisons. For now here is a code size comparison for firefly (within inlining of ofnode which I intend to implement): arm: (for 1/1 boards) all +268.0 bss -24.0 data -4.0 spl/u-boot-spl:all +240.0 spl/u-boot-spl:text +240.0 text +296.0 firefly-rk3288 : all +268 bss -24 data -4 spl/u-boot-spl:all +240 spl/u-boot-spl:text +240 text +296 u-boot: add: 18/-4, grow: 2/-22 bytes: 764/-490 (274) function old new delta gpio_request_tail - 132 +132 ofnode_parse_phandle_with_args - 66 +66 uclass_find_device_by_ofnode - 64 +64 ofnode_pre_reloc - 64 +64 ofnode_read_string - 52 +52 fdt_support_default_count_cells - 52 +52 ofnode_read_u32 - 48 +48 gpio_request_by_name 32 72 +40 ofnode_read_size - 34 +34 uclass_get_device_by_ofnode - 28 +28 ofnode_read_u32_array - 28 +28 ofnode_read_bool - 26 +26 ofnode_read_prop - 24 +24 ofnode_get_addr_size - 24 +24 ofnode_read_u32_default - 22 +22 ofnode_find_subnode - 18 +18 ofnode_next_subnode - 14 +14 ofnode_first_subnode - 14 +14 ofnode_get_name - 12 +12 dm_init_and_scan 42 44 +2 uclass_get_device_by_phandle 106 104 -2 spi_child_post_bind 32 30 -2 i2c_child_post_bind 32 30 -2 spi_post_probe 36 32 -4 spi_flash_scan 520 516 -4 serial_init 212 208 -4 i2c_post_probe 48 44 -4 clk_fixed_rate_ofdata_to_platdata 36 32 -4 act8846_bind 48 44 -4 simple_bus_post_bind 60 52 -8 lists_bind_fdt 240 232 -8 i2c_chip_ofdata_to_platdata 64 56 -8 clk_get_by_index 108 100 -8 usb_child_post_bind 92 80 -12 regmap_init_mem 228 216 -12 fixed_regulator_ofdata_to_platdata 108 96 -12 pmic_bind_children 158 144 -14 spi_slave_ofdata_to_platdata 256 240 -16 pinconfig_post_bind 136 116 -20 led_gpio_bind 108 88 -20 regulator_post_bind 148 124 -24 gpio_request_by_name_nodev 28 - -28 fdtdec_get_uint 30 - -30 regulator_pre_probe 220 184 -36 of_bus_default_count_cells 52 - -52 _gpio_request_by_name_nodev 152 - -152 spl-u-boot-spl: add: 8/-1, grow: 1/-5 bytes: 300/-56 (244) function old new delta ofnode_parse_phandle_with_args - 66 +66 uclass_find_device_by_ofnode - 64 +64 ofnode_read_u32 - 48 +48 ofnode_read_size - 34 +34 uclass_get_device_by_ofnode - 28 +28 ofnode_read_prop - 24 +24 ofnode_read_u32_default - 22 +22 ofnode_get_name - 12 +12 dm_init_and_scan 42 44 +2 dm_scan_fdt_node 96 94 -2 clk_fixed_rate_ofdata_to_platdata 36 32 -4 lists_bind_fdt 224 216 -8 clk_get_by_index 108 100 -8 regmap_init_mem 220 208 -12 device_bind 22 - -22 (no errors to report) Changes in v2: - Rewrite based on testing and refining the v1 series - Convert various subsystems to enable sandbox tests to pass Simon Glass (71): dm: core: Set return value first in lists_bind_fdt() Update WARN_ON() to return a value dm: core: Add livetree definitions dm: core: Add livetree access functions dm: Add a function to create a 'live' device tree dm: Build a live tree after relocation dm: core: Rename of_device_is_compatible() dm: core: Add operations on device tree references dm: core: Add livetree address functions fdt: Update fdt_get_base_address() to use const dm: core: Add address operations on device tree references dm: core: Add a place to put extra device-tree reading functions dm: core: Add device-based 'read' functions to access DT dm: core: Implement live tree 'read' functions dm: core: Allow binding a device from a live tree dm: core: Update lists_bind_fdt() to use ofnode dm: core: Update device_bind_driver_to_node() to use ofnode dm: core: Scan the live tree when setting up driver model dm: core: Add a way to find a device by ofnode dm: regmap: Add support for livetree dm: simple-bus: Add support for livetree dm: core: Update uclass_find_device_by_phandle() for livetree sandbox: Add a way to reset sandbox state for tests dm: test: Move test running code into a separate function dm: test: Show the test filename when running dm: test: Add support for running tests with livetree dm: core: Run tests with both livetree and flat tree dm: gpio: Refactor to prepare for live tree support dm: gpio: Drop blank line in gpio_xlate_offs_flags() comment dm: gpio: sandbox: Use dev_read...() functions to access DT dm: gpio: Add live tree support cros_ec: Fix debug() statement in ec_command_inptr() cros_ec: Convert to support live tree sandbox: Add a new sandbox_flattree board test: Update 'make test' to run more tests fdt: Rename a few functions in fdt_support dm: Add more livetree helpers and definitions string: Add strchrnul() string: Add strcspn() dm: i2c: Convert uclass to livetree dm: pmic: Convert uclass to livetree sandbox: pmic: Convert pmic emulator to support livetree dm: regulator: Convert regulator uclass to support livetree dm: regulator: Update fixed regulator to support livetree. dm: mmc: Convert uclass to livetree dm: adc: Convert uclass to livetree dm: usb: Convert uclass to livetree sandbox: usb: Convert emulators to livetree clk: Modify xlate() method for livetree dm: clk: Update uclass to support livetree dm: clk: fixed: Update to support livetree dm: test: Separate out the bus DT offset test dm: test: Disable the fdt_offset test with livetree dm: phy: Update tests to use ut_asserteq() dm: mailbox: Update uclass to support livetree dm: phy: Update uclass to support livetree sandbox: phy: Update driver for livetree dm: power-domain: Update uclass to support livetree dm: reset: Update uclass to support livetree dm: pci: Update uclass to support livetree dm: Update the I2C eeprom driver for livetree cros_ec: Update the cros_ec keyboard driver to livetree dm: spi: Convert uclass to livetree dm: sandbox: i2c: Drop fdtdec.h header dm: sandbox: i2c_rtc: Drop fdtdec.h header dm: spi-flash: Convert uclass to livetree dm: sandbox: spi: Convert driver to support livetree dm: sandbox: sysreset: Convert driver to livetree dm: test: Fix nit with position of backslash dm: gpio: power: Convert pm8916 drivers to livetree sandbox: Move to use live tree arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 4 +- arch/arm/mach-tegra/tegra186/nvtboot_mem.c | 4 +- arch/sandbox/cpu/state.c | 14 +- arch/sandbox/include/asm/state.h | 7 + board/qualcomm/dragonboard410c/dragonboard410c.c | 12 +- board/samsung/common/board.c | 4 +- board/samsung/common/exynos5-dt.c | 2 +- board/sandbox/MAINTAINERS | 7 + common/board_r.c | 12 + common/fdt_support.c | 28 +- configs/sandbox_defconfig | 1 + configs/sandbox_flattree_defconfig | 179 ++++++ drivers/adc/adc-uclass.c | 14 +- drivers/clk/at91/pmc.c | 4 +- drivers/clk/at91/pmc.h | 2 +- drivers/clk/clk-uclass.c | 14 +- drivers/clk/clk_fixed_rate.c | 5 +- drivers/clk/clk_stm32f7.c | 3 +- drivers/core/Kconfig | 4 + drivers/core/Makefile | 5 + drivers/core/device.c | 20 +- drivers/core/lists.c | 29 +- drivers/core/of_access.c | 736 +++++++++++++++++++++++ drivers/core/of_addr.c | 359 +++++++++++ drivers/core/of_extra.c | 37 ++ drivers/core/ofnode.c | 579 ++++++++++++++++++ drivers/core/read.c | 140 +++++ drivers/core/regmap.c | 37 +- drivers/core/root.c | 60 +- drivers/core/simple-bus.c | 3 +- drivers/core/uclass.c | 42 +- drivers/cpu/cpu-uclass.c | 6 +- drivers/firmware/psci.c | 4 +- drivers/gpio/74x164_gpio.c | 2 +- drivers/gpio/gpio-uclass.c | 82 +-- drivers/gpio/pca953x_gpio.c | 2 +- drivers/gpio/pm8916_gpio.c | 8 +- drivers/gpio/sandbox.c | 12 +- drivers/gpio/sunxi_gpio.c | 2 +- drivers/gpio/tegra186_gpio.c | 2 +- drivers/gpio/tegra_gpio.c | 2 +- drivers/i2c/i2c-uclass.c | 28 +- drivers/i2c/muxes/i2c-mux-uclass.c | 11 +- drivers/i2c/mxc_i2c.c | 12 +- drivers/i2c/sandbox_i2c.c | 1 - drivers/input/cros_ec_keyb.c | 24 +- drivers/input/key_matrix.c | 19 +- drivers/input/tegra-kbc.c | 3 +- drivers/led/led_gpio.c | 13 +- drivers/mailbox/mailbox-uclass.c | 20 +- drivers/mailbox/tegra-hsp.c | 2 +- drivers/misc/cros_ec.c | 36 +- drivers/misc/cros_ec_sandbox.c | 23 +- drivers/misc/i2c_eeprom_emul.c | 7 +- drivers/misc/tegra186_bpmp.c | 6 +- drivers/misc/tegra_car.c | 4 +- drivers/mmc/fsl_esdhc.c | 6 +- drivers/mmc/mmc-uclass.c | 3 +- drivers/mmc/s5p_sdhci.c | 8 +- drivers/mmc/xenon_sdhci.c | 2 +- drivers/mtd/altera_qspi.c | 2 +- drivers/mtd/cfi_flash.c | 2 +- drivers/mtd/nand/sunxi_nand.c | 2 +- drivers/mtd/nand/tegra_nand.c | 4 +- drivers/mtd/pic32_flash.c | 2 +- drivers/mtd/spi/sandbox.c | 6 +- drivers/mtd/spi/spi_flash.c | 7 +- drivers/net/altera_tse.c | 2 +- drivers/net/cpsw-common.c | 4 +- drivers/net/keystone_net.c | 6 +- drivers/net/mvneta.c | 2 +- drivers/net/pic32_eth.c | 3 +- drivers/pci/pci-uclass.c | 26 +- drivers/phy/marvell/comphy_core.c | 4 +- drivers/phy/phy-uclass.c | 21 +- drivers/phy/sandbox-phy.c | 3 +- drivers/pinctrl/pinctrl-uclass.c | 15 +- drivers/power/domain/power-domain-uclass.c | 19 +- drivers/power/pmic/act8846.c | 8 +- drivers/power/pmic/i2c_pmic_emul.c | 6 +- drivers/power/pmic/lp873x.c | 12 +- drivers/power/pmic/max77686.c | 8 +- drivers/power/pmic/palmas.c | 16 +- drivers/power/pmic/pfuze100.c | 8 +- drivers/power/pmic/pm8916.c | 2 +- drivers/power/pmic/pmic-uclass.c | 22 +- drivers/power/pmic/rk808.c | 8 +- drivers/power/pmic/s5m8767.c | 7 +- drivers/power/pmic/sandbox.c | 2 +- drivers/power/pmic/tps65090.c | 8 +- drivers/power/regulator/fixed.c | 17 +- drivers/power/regulator/regulator-uclass.c | 39 +- drivers/reset/reset-uclass.c | 21 +- drivers/rtc/i2c_rtc_emul.c | 1 - drivers/serial/serial-uclass.c | 3 +- drivers/sound/max98095.c | 2 + drivers/sound/wm8994.c | 2 +- drivers/spi/pic32_spi.c | 2 +- drivers/spi/spi-uclass.c | 31 +- drivers/sysreset/sysreset_sandbox.c | 2 +- drivers/timer/timer-uclass.c | 3 +- drivers/usb/emul/sandbox_flash.c | 4 +- drivers/usb/emul/sandbox_hub.c | 3 +- drivers/usb/host/ehci-marvell.c | 2 +- drivers/usb/host/ehci-tegra.c | 7 +- drivers/usb/host/ehci-vf.c | 5 +- drivers/usb/host/usb-uclass.c | 8 +- drivers/usb/host/xhci-rockchip.c | 2 +- drivers/usb/musb-new/ti-musb.c | 2 +- dts/Kconfig | 11 + include/asm-generic/global_data.h | 3 + include/asm-generic/gpio.h | 17 +- include/clk-uclass.h | 5 +- include/cros_ec.h | 8 +- include/dm.h | 2 + include/dm/device-internal.h | 10 +- include/dm/device.h | 4 +- include/dm/lists.h | 9 +- include/dm/of.h | 139 +++++ include/dm/of_access.h | 347 +++++++++++ include/dm/of_addr.h | 64 ++ include/dm/of_extra.h | 46 ++ include/dm/ofnode.h | 487 ++++++++++++++- include/dm/read.h | 439 ++++++++++++++ include/dm/root.h | 3 +- include/dm/test.h | 2 + include/dm/uclass-internal.h | 16 + include/dm/uclass.h | 16 + include/fdt_support.h | 6 +- include/fdtdec.h | 34 -- include/generic-phy.h | 3 +- include/i2c.h | 3 +- include/key_matrix.h | 3 +- include/linux/compat.h | 8 +- include/linux/string.h | 28 + include/mailbox-uclass.h | 2 +- include/of_live.h | 24 + include/power-domain-uclass.h | 2 +- include/power/pmic.h | 2 +- include/reset-uclass.h | 4 +- include/spi.h | 2 +- include/test/test.h | 4 + include/test/ut.h | 2 +- lib/Makefile | 1 + lib/fdtdec.c | 33 +- lib/of_live.c | 333 ++++++++++ lib/string.c | 32 + test/dm/bus.c | 16 +- test/dm/phy.c | 15 +- test/dm/test-fdt.c | 3 +- test/dm/test-main.c | 105 +++- test/run | 8 +- 152 files changed, 4749 insertions(+), 662 deletions(-) create mode 100644 configs/sandbox_flattree_defconfig create mode 100644 drivers/core/of_access.c create mode 100644 drivers/core/of_addr.c create mode 100644 drivers/core/of_extra.c create mode 100644 drivers/core/ofnode.c create mode 100644 drivers/core/read.c create mode 100644 include/dm/of.h create mode 100644 include/dm/of_access.h create mode 100644 include/dm/of_addr.h create mode 100644 include/dm/of_extra.h create mode 100644 include/dm/read.h create mode 100644 include/of_live.h create mode 100644 lib/of_live.c -- 2.13.0.rc2.291.g57267f2277-goog _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot