[RFC PATCH v2 0/3] RFC: tiny-dm: Proposal for using driver model in SPL

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Jul 3 04:19:24 CEST 2020



Am 2. Juli 2020 23:10:01 MESZ schrieb Simon Glass <sjg at chromium.org>:
>This series provides a proposed enhancement to driver model to reduce
>overhead in SPL.
>
>These patches should not be reviewed other than to comment on the
>approach. The code is all lumped together in a few patches and so
>cannot
>be applied as is.
>
>For now, the source tree is available at:
>
> https://gitlab.denx.de/u-boot/custodians/u-boot-dm/-/tree/dtoc-working
>
>Comments welcome!
>
>Benefits (good news)
>--------------------
>
>As an example of the impact of tiny-dm, chromebook_jerry is converted
>to
>use it. This shows approximately a 30% reduction in code and data size
>and
>a 85% reduction in malloc() space over of-platdata:
>
>   text	   data	    bss	    dec	    hex	filename
>25248	   1836	     12	  27096	   69d8	spl/u-boot-spl (original with DT)
>  19727	   3436	     12	  23175	   5a87	spl/u-boot-spl (OF_PLATDATA)
>    78%    187%    100%     86%         as %age of original
>
>  13784	   1408	     12	  15204	   3b64	spl/u-boot-spl (SPL_TINY)
>    70%     41%    100%     66%         as %age of platdata
>    55%     77%    100%     56%         as %age of original
>
>SPL malloc() usage drops from 944 bytes (OF_PLATDATA) to 116
>(SPL_TINY).
>
>Overall the 'overhead' of tiny-dm is much less than the full driver
>model. Code size is currently about 600 bytes for these functions on
>Thumb2:
>
>   00000054 T tiny_dev_probe
>   00000034 T tiny_dev_get_by_drvdata
>   00000024 T tiny_dev_find
>   0000001a T tiny_dev_get
>   0000003c T tinydev_alloc_data
>   0000002a t tinydev_lookup_data
>   00000022 T tinydev_ensure_data
>   00000014 T tinydev_get_data
>   00000004 T tinydev_get_parent
>
>Effort (bad news)
>-----------------
>
>Unfortunately it is quite a bit of work to convert drivers over to
>tiny-dm. First, the of-platdata conversion must be done. But on top of
>that, tiny-dm needs entirely separate code for dealing with devices.
>This
>means that instead of 'struct udevice' and 'struct uclass' there is
>just
>'struct tinydev'. Each driver and uclass must be modified to support
>both, pulling common code into internal static functions.


The code size reductions sound quite impressive. 

Somehow I have missed the start of your investigation. Could you, please, summarize what the main differences between tiny DM and the current DM are and explain why tiny DM cannot be used in main U-Boot.

Best regards

Heinrich

>
>Another option
>--------------
>
>Note: It is assumed that any board that is space-contrained should use
>of-platdata in SPL (see doc/driver-model/of-plat.rst). This is shown to
>reduce device-tree overhead by approximately 4KB.
>
>Designing tiny-dm has suggested a number of things that could be
>changed
>in the current driver model to make it more space-efficient for TPL and
>SPL. The ones with least impact on driver code are (CS=reduces code
>size,
>DS=reduces data size):
>
>   CS - drop driver_bind() and create devices (struct udevice) at
>        build-time
>   CS - allocate all device- and uclass-private data at build-time
>   CS - remove all but the basic operations for each uclass (e.g. SPI
>        flash only supports reading)
>   DS - use 8-bit indexes instead of 32/64-bit pointers for device
>        pointers possible since these are created at build-time)
>   DS - use singly-linked lists
> DS - use 16-bit offsets to private data, instead of 32/64-bit pointers
>        (possible since it is all in SRAM relative to malloc() base,
>        presumably word-aligned and < 256KB)
>DS - move private pointers into a separate data structure so that NULLs
>        are not stored
>   CS / DS - Combine req_seq and seq and calculate the new value at
>        build-time
>
>More difficult are:
>
>   DS - drop some of the lesser-used driver and uclass methods
>   DS - drop all uclass methods except init()
>   DS - drop all driver methods except probe()
>   CS / DS - drop uclasses and require drivers to manually call uclass
>        functions
>
>Even with all of this we would not reach tiny-dm and it would muddy up
>the
>driver-model datas structures. But we might come close to tiny-dm on
>size
>and there are some advantages:
>
>- much of the benefit would apply to all boards that use of-platdata
>(i.e.
>  with very little effort on behalf of board maintainers)
>- the impact on the code base is much less (we keep a single, unified
>  driver mode in SPL and U-Boot proper)
>
>Overall I think it is worth looking at this option. While it doesn't
>have
>the 'nuclear' impact of tiny-dm, neither does it mess with the U-Boot
>driver code as much and it is easier to learn.
>
>Changes in v2:
>- Various updates, and ported to chromebook_jerry (rockchip)
>
>Simon Glass (3):
>  dm: Driver and uclass changes for tiny-dm
>  dm: Arch-specific changes for tiny-dm
>  dm: Core changes for tiny-dm
>
> arch/arm/dts/rk3288-u-boot.dtsi               |  17 +-
> arch/arm/dts/rk3288-veyron.dtsi               |  26 +-
> arch/arm/dts/rk3288.dtsi                      |   3 +
> arch/arm/include/asm/arch-rockchip/clock.h    |   9 +
> .../include/asm/arch-rockchip/sdram_rk3288.h  |  21 ++
> arch/arm/include/asm/arch-rockchip/spi.h      |   1 +
> arch/arm/include/asm/io.h                     |  18 +
> arch/arm/mach-rockchip/rk3288/clk_rk3288.c    |  46 +++
> arch/arm/mach-rockchip/rk3288/rk3288.c        |   2 +
> arch/arm/mach-rockchip/rk3288/syscon_rk3288.c |  45 +--
> arch/arm/mach-rockchip/sdram.c                |  33 +-
> arch/sandbox/cpu/u-boot-spl.lds               |  12 +
> arch/sandbox/dts/sandbox.dts                  |   3 +-
> arch/sandbox/dts/sandbox.dtsi                 |   2 +-
> arch/x86/cpu/apollolake/cpu_spl.c             |   5 +-
> arch/x86/cpu/apollolake/uart.c                |  56 ++++
> arch/x86/dts/chromebook_coral.dts             |   1 +
> arch/x86/lib/tpl.c                            |   4 +-
> board/Synology/ds109/ds109.c                  |   3 +-
> common/console.c                              |   2 +-
> common/log.c                                  |  36 +-
> common/malloc_simple.c                        |  31 ++
> common/spl/spl.c                              |  17 +-
> common/spl/spl_spi.c                          |  91 +++--
> configs/chromebook_coral_defconfig            |   1 +
> configs/chromebook_jerry_defconfig            |  11 +
> configs/rock2_defconfig                       |   3 +
> doc/develop/debugging.rst                     |  35 ++
> doc/driver-model/tiny-dm.rst                  | 315 +++++++++++++++++
> drivers/clk/Kconfig                           |  54 +++
> drivers/clk/Makefile                          |   4 +-
> drivers/clk/clk-uclass.c                      |  53 ++-
> drivers/clk/rockchip/clk_rk3288.c             | 106 ++++--
> drivers/core/Kconfig                          | 106 ++++++
> drivers/core/Makefile                         |   3 +
> drivers/core/of_extra.c                       |  49 ++-
> drivers/core/regmap.c                         |   3 +-
> drivers/core/syscon-uclass.c                  |  68 +++-
> drivers/core/tiny.c                           | 249 ++++++++++++++
> drivers/mtd/spi/Kconfig                       |  18 +
> drivers/mtd/spi/sf-uclass.c                   |  76 +++++
> drivers/mtd/spi/sf_probe.c                    |   4 +
> drivers/mtd/spi/spi-nor-tiny.c                | 166 ++++++++-
> drivers/ram/Kconfig                           |  18 +
> drivers/ram/ram-uclass.c                      |  12 +
> drivers/ram/rockchip/sdram_rk3188.c           |   2 +-
> drivers/ram/rockchip/sdram_rk322x.c           |   2 +-
> drivers/ram/rockchip/sdram_rk3288.c           | 231 ++++++++-----
> drivers/ram/rockchip/sdram_rk3328.c           |   2 +-
> drivers/ram/rockchip/sdram_rk3399.c           |   2 +-
> drivers/reset/reset-rockchip.c                |   4 +-
> drivers/serial/Kconfig                        |  38 +++
> drivers/serial/ns16550.c                      | 195 +++++++++--
> drivers/serial/sandbox.c                      |  59 +++-
> drivers/serial/serial-uclass.c                |  77 +++++
> drivers/serial/serial_omap.c                  |   2 +-
> drivers/serial/serial_rockchip.c              |  59 ++++
> drivers/spi/Kconfig                           |  18 +
> drivers/spi/Makefile                          |   2 +
> drivers/spi/rk_spi.c                          | 301 ++++++++++++-----
> drivers/spi/spi-uclass.c                      |  77 +++++
> drivers/sysreset/Kconfig                      |  18 +
> drivers/sysreset/sysreset-uclass.c            | 124 ++++---
> drivers/sysreset/sysreset_rockchip.c          |  61 +++-
> include/asm-generic/global_data.h             |   7 +-
> include/clk-uclass.h                          |  11 +
> include/clk.h                                 |  32 +-
> include/dm/device.h                           | 121 +++++++
> include/dm/of_extra.h                         |   6 +
> include/dm/platdata.h                         |  20 +-
> include/dm/tiny_struct.h                      |  42 +++
> include/linker_lists.h                        |   6 +
> include/linux/mtd/mtd.h                       |  23 +-
> include/linux/mtd/spi-nor.h                   |  22 ++
> include/log.h                                 |   6 +
> include/malloc.h                              |   3 +
> include/ns16550.h                             |   7 +-
> include/ram.h                                 |  25 ++
> include/regmap.h                              |   4 +-
> include/serial.h                              |  45 ++-
> include/spi.h                                 |  31 ++
> include/spi_flash.h                           |   7 +
> include/spl.h                                 |   8 +-
> include/syscon.h                              |   2 +
> include/sysreset.h                            |   9 +
> scripts/Makefile.spl                          |   6 +-
> tools/dtoc/dtb_platdata.py                    | 316 +++++++++++++++---
> tools/dtoc/dtoc_test_simple.dts               |  12 +-
> tools/dtoc/fdt.py                             |   7 +-
> tools/dtoc/main.py                            |   9 +-
> tools/dtoc/test_dtoc.py                       |  91 ++++-
> tools/patman/tools.py                         |   4 +-
> 92 files changed, 3454 insertions(+), 540 deletions(-)
> create mode 100644 doc/develop/debugging.rst
> create mode 100644 doc/driver-model/tiny-dm.rst
> create mode 100644 drivers/core/tiny.c
> create mode 100644 include/dm/tiny_struct.h

-- 
Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.


More information about the U-Boot mailing list