All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data
@ 2016-06-13  5:32 Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 01/55] sandbox: Don't print a warning for CONFIG_I2C_COMPAT Simon Glass
                   ` (54 more replies)
  0 siblings, 55 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Note: This v2 series has some minor updates and improvements, mostly as new
patches in the series.

This series provides a way to compile in the contents of a device tree as C
code into U-Boot, implementing an idea that Tom Rini came up with. It is
intended to deal with extremely tight environments where there is not enough
space for the ~3KB device tree code overhead. Examples include SPL where
there is only 16KB of available RAM yet a full MMC stack is required.

To provide a reasonable test environment, SPL support is added to sandbox,
through a new 'sandbox_spl' target. A new tool 'dtoc' converts device tree
data to C code (and structure definitions).

To check its effectiveness for a real application, the v2 series includes
support for enabling of-platdata for a rockchip board (firefly-rk3288). The
results are as follows:

                          Code       Data      u-boot-spl.bin size
of-platdata disabled      23159	     1624      28864
of-platdata enabled       19093      2616      21761

Overall the saving is 7103 bytes, about 7KB. Approximately 4KB of this comes
from removing the device tree data from SPL although this is offset by
the size of the of-platdata itself (around 1KB). On top of this effective
3KB reduction, another ~3KB reduction comes from dropping libfdt and a
further 1KB from dropping unused setup and driver-model code.

Clearly this approach does have value. Looked at with a favourable light it
provides the best of both worlds: configuration using standard device tree
bindings without the run-time overhead.

Looking under the hood shows a less rosy picture. Effectively we end up
with a new set of C structures which must be handled by the driver. This
series suggests a suitable approach for dealing with this (see of-plat.txt)
which is workable. However there are a number of serious caveats. See that
file for details.

If this feature makes it to mainline it should be used sparingly. Rockchip
is to some extent an unusual case: lots of features, no MMC stack available
to SPL from the internal ROM* and a very limited maximum SPL size. Most SoCs
will not benefit from this.

However, for an SoC with very small SRAM where only a few drivers are needed
in SPL (such as serial and MMC) then of-platdata could provide a useful
benefit, without a significant increase in complexity.

More work is needed before this feature is ready for use, but this series
contains enough to attract initial comments and testing. It is available at
u-boot-dm/dt-working.

* Note that the rockchip internal ROM does include an MMC stack but it only
permits loading of data in its own format, outside control of U-Boot.

Changes in v2:
- Add a comment to the effect that 64-bit machines are not supported
- Add support for rockchip
- Various minor enhancements to the v1 implementation

Simon Glass (55):
  sandbox: Don't print a warning for CONFIG_I2C_COMPAT
  README: Remove CONFIG_SYS_MALLOC_F_LEN comment
  spl: Drop include of i2c.h
  Makefile: Allow the SPL final link rule to be overridden
  sandbox: Allow chaining from SPL to U-Boot proper
  sandbox: Support building an SPL image
  sandbox: Correct header file order in cpu.c
  sandbox: Add some missing headers in cpu.c
  sandbox: Don't use PCI in SPL
  sandbox: Don't include the main loop in SPL
  sandbox: Add basic SPL implementation
  sandbox: Don't use IDE and iotrace in SPL
  sandbox: serial: Don't sync video in SPL
  sandbox: Add a new sandbox_spl board
  sandbox: Add a test device that uses of-platdata
  dm: spl: Don't set up device tree with of-platdata
  dm: Makefile: Build of-platdata before SPL
  dm: core: Don't use device tree with of-platdata
  dm: regmap: Add a dummy implementation for of-platdata
  dm: syscon: Add support for of-platdata
  dm: sandbox: Add a simple driver to test of-platdata
  dm: Add a header that provides access to the of-platdata structs
  dm: clk: Add support for of-platdata
  dm: serial: Add support for of-platdata
  dm: Don't include fdtdec functions when of-platdata is enabled
  dm: Add an option to enable the of-platdata feature
  dm: Add a README for of-platdata
  dm: Add a library to provide simple device-tree access
  dm: Add a tool to generate C code from a device tree
  dm: Makefile: Build of-platdata files when the feature is enabled
  dm: Add a more efficient libfdt library
  Only build the libfdt python module if 'swig' is available
  tiny-printf: Support assert()
  dm: spl: Bind in all devices in SPL with of-platdata
  dm: core: Rename DM_NAME_ALLOCED to DM_FLAG_NAME_ALLOCED
  dtoc: Ignore the u-boot,dm-pre-reloc property
  dm: Don't attach the device tree to SPL with of-platdata
  dm: core: Expand platdata for of-platdata devices
  dm: core: Move regmap allocation into a separate function
  dm: core: Add an implementation of regmap_init_mem_platdata()
  dm: serial: ns16550: Update to support of-platdata
  rockchip: serial: Add an of-platdata driver for rockchip
  rockchip: Update the sdram-channel property to support of-platdata
  rockchip: mmc: Move all DT decoding to ofdata_to_platdata()
  rockchip: mmc: Update the driver to support of-platdata
  rockchip: clk: Move all DT decoding to ofdata_to_platdata()
  rockchip: clk: Update the rk3288 driver to support of-platdata
  rockchip: pinctrl: Update the rk3288 driver to support of-platdata
  rockchip: Move the MMC setup check earlier
  rockchip: Don't use spl_boot_device() with of-platdata
  rockchip: syscon: Update to work with of-platdata
  rockchip: sdram: Move all DT decoding to ofdata_to_platdata()
  rockchip: sdram: Update the driver to support of-platdata
  rockchip: Use of-platdata for firefly-rk3288
  dm: Update the of-platdata README for the new features

 Makefile                                      |   5 +-
 README                                        |   3 -
 arch/arm/dts/rk3288-firefly.dts               |   3 +-
 arch/arm/include/asm/arch-rockchip/sdram.h    |  14 +-
 arch/arm/mach-rockchip/rk3288-board-spl.c     |  25 +-
 arch/arm/mach-rockchip/rk3288/sdram_rk3288.c  | 125 +++++++--
 arch/arm/mach-rockchip/rk3288/syscon_rk3288.c |  38 +++
 arch/sandbox/Kconfig                          |   7 +-
 arch/sandbox/config.mk                        |   5 +
 arch/sandbox/cpu/Makefile                     |   1 +
 arch/sandbox/cpu/cpu.c                        |   6 +-
 arch/sandbox/cpu/os.c                         |  51 ++++
 arch/sandbox/cpu/spl.c                        |  60 +++++
 arch/sandbox/cpu/start.c                      |   2 +
 arch/sandbox/cpu/u-boot-spl.lds               |  24 ++
 arch/sandbox/dts/sandbox.dts                  |  13 +
 arch/sandbox/include/asm/spl.h                |  23 ++
 arch/sandbox/lib/Makefile                     |   2 +
 board/sandbox/MAINTAINERS                     |   7 +
 common/spl/spl.c                              |   6 +-
 configs/firefly-rk3288_defconfig              |   3 +
 configs/sandbox_spl_defconfig                 | 177 +++++++++++++
 doc/driver-model/of-plat.txt                  | 311 ++++++++++++++++++++++
 drivers/clk/clk-uclass.c                      |  20 ++
 drivers/clk/clk_fixed_rate.c                  |   2 +
 drivers/clk/clk_rk3288.c                      |  38 ++-
 drivers/core/device-remove.c                  |   2 +-
 drivers/core/device.c                         |  45 +++-
 drivers/core/lists.c                          |   2 +-
 drivers/core/regmap.c                         |  57 +++-
 drivers/core/root.c                           |   4 +-
 drivers/core/syscon-uclass.c                  |  13 +
 drivers/misc/Makefile                         |   5 +
 drivers/misc/spltest_sandbox.c                |  28 ++
 drivers/mmc/rockchip_dw_mmc.c                 |  60 +++--
 drivers/pinctrl/rockchip/pinctrl_rk3288.c     |   8 +-
 drivers/serial/Kconfig                        |   9 +
 drivers/serial/Makefile                       |   3 +
 drivers/serial/ns16550.c                      |   4 +-
 drivers/serial/sandbox.c                      |   2 +
 drivers/serial/serial-uclass.c                |   8 +-
 drivers/serial/serial_rockchip.c              |  43 +++
 dts/Kconfig                                   |  21 ++
 include/clk.h                                 |   4 +
 include/configs/sandbox.h                     |   4 +
 include/configs/sandbox_spl.h                 |  20 ++
 include/dm/device.h                           |   6 +-
 include/dm/platdata.h                         |   5 +
 include/dt-structs.h                          |  19 ++
 include/os.h                                  |  25 ++
 include/regmap.h                              |  16 ++
 include/syscon.h                              |  11 +
 lib/Makefile                                  |   5 +-
 lib/libfdt/libfdt.swig                        |  81 ++++++
 lib/libfdt/setup.py                           |  38 +++
 lib/libfdt/test_libfdt.py                     |  14 +
 lib/tiny-printf.c                             |   9 +
 scripts/Makefile.host                         |   9 +-
 scripts/Makefile.spl                          |  47 +++-
 tools/Makefile                                |  14 +
 tools/dtoc/.gitignore                         |   1 +
 tools/dtoc/dtoc                               |   1 +
 tools/dtoc/dtoc.py                            | 368 ++++++++++++++++++++++++++
 tools/dtoc/fdt.py                             | 174 ++++++++++++
 tools/dtoc/fdt_fallback.py                    | 207 +++++++++++++++
 tools/dtoc/fdt_util.py                        |  71 +++++
 66 files changed, 2303 insertions(+), 131 deletions(-)
 create mode 100644 arch/sandbox/cpu/spl.c
 create mode 100644 arch/sandbox/cpu/u-boot-spl.lds
 create mode 100644 arch/sandbox/include/asm/spl.h
 create mode 100644 configs/sandbox_spl_defconfig
 create mode 100644 doc/driver-model/of-plat.txt
 create mode 100644 drivers/misc/spltest_sandbox.c
 create mode 100644 drivers/serial/serial_rockchip.c
 create mode 100644 include/configs/sandbox_spl.h
 create mode 100644 include/dt-structs.h
 create mode 100644 lib/libfdt/libfdt.swig
 create mode 100644 lib/libfdt/setup.py
 create mode 100644 lib/libfdt/test_libfdt.py
 create mode 100644 tools/dtoc/.gitignore
 create mode 120000 tools/dtoc/dtoc
 create mode 100755 tools/dtoc/dtoc.py
 create mode 100644 tools/dtoc/fdt.py
 create mode 100644 tools/dtoc/fdt_fallback.py
 create mode 100644 tools/dtoc/fdt_util.py

-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 01/55] sandbox: Don't print a warning for CONFIG_I2C_COMPAT
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 02/55] README: Remove CONFIG_SYS_MALLOC_F_LEN comment Simon Glass
                   ` (53 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Sandbox includes this code to provide build coverage. While we retain this
feature we should have sandbox build it. Sandbox does not in fact use the
I2C compatibility mode. Showing a warning for sandbox is just confusing,
since no conversion is expected.

Drop the warning for sandbox.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 0f7d6f3..5b03095 100644
--- a/Makefile
+++ b/Makefile
@@ -801,7 +801,7 @@ quiet_cmd_pad_cat = CAT     $@
 cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@
 
 all:		$(ALL-y)
-ifeq ($(CONFIG_DM_I2C_COMPAT),y)
+ifeq ($(CONFIG_DM_I2C_COMPAT)$(CONFIG_SANDBOX),y)
 	@echo "===================== WARNING ======================"
 	@echo "This board uses CONFIG_DM_I2C_COMPAT. Please remove"
 	@echo "(possibly in a subsequent patch in your series)"
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 02/55] README: Remove CONFIG_SYS_MALLOC_F_LEN comment
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 01/55] sandbox: Don't print a warning for CONFIG_I2C_COMPAT Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 03/55] spl: Drop include of i2c.h Simon Glass
                   ` (52 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

This option is now widely available, so remove the comment that it is only
available on ARM and sandbox.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 README | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/README b/README
index 1d0b946..c3dcfbd 100644
--- a/README
+++ b/README
@@ -3852,9 +3852,6 @@ Configuration Settings:
 		The memory will be freed (or in fact just forgotten) when
 		U-Boot relocates itself.
 
-		Pre-relocation malloc() is only supported on ARM and sandbox
-		at present but is fairly easy to enable for other archs.
-
 - CONFIG_SYS_MALLOC_SIMPLE
 		Provides a simple and small malloc() and calloc() for those
 		boards which do not use the full malloc in SPL (which is
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 03/55] spl: Drop include of i2c.h
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 01/55] sandbox: Don't print a warning for CONFIG_I2C_COMPAT Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 02/55] README: Remove CONFIG_SYS_MALLOC_F_LEN comment Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 04/55] Makefile: Allow the SPL final link rule to be overridden Simon Glass
                   ` (51 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

This file does not appear to use I2C, so drop this include.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 common/spl/spl.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 840910a..5fbf101 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -13,7 +13,6 @@
 #include <nand.h>
 #include <fat.h>
 #include <version.h>
-#include <i2c.h>
 #include <image.h>
 #include <malloc.h>
 #include <dm/root.h>
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 04/55] Makefile: Allow the SPL final link rule to be overridden
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (2 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 03/55] spl: Drop include of i2c.h Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 05/55] sandbox: Allow chaining from SPL to U-Boot proper Simon Glass
                   ` (50 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Overriding the final link rule is possible with U-Boot proper. It us used to
create a sandbox image links with host libraries. To build a sandbox SPL
image we need the same feature for SPL.

To support this, update the SPL link rule so sandbox can override it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 scripts/Makefile.spl | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
index 0997fd9..2b5c995 100644
--- a/scripts/Makefile.spl
+++ b/scripts/Makefile.spl
@@ -241,8 +241,10 @@ cmd_mksunxiboot = $(objtree)/tools/mksunxiboot $< $@
 $(obj)/sunxi-spl.bin: $(obj)/$(SPL_BIN).bin FORCE
 	$(call if_changed,mksunxiboot)
 
-quiet_cmd_u-boot-spl = LD      $@
-      cmd_u-boot-spl = (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
+# Rule to link u-boot-spl
+# May be overridden by arch/$(ARCH)/config.mk
+quiet_cmd_u-boot-spl ?= LD      $@
+      cmd_u-boot-spl ?= (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
 		       $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \
 		       $(patsubst $(obj)/%,%,$(u-boot-spl-main)) --end-group \
 		       $(PLATFORM_LIBS) -Map $(SPL_BIN).map -o $(SPL_BIN))
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 05/55] sandbox: Allow chaining from SPL to U-Boot proper
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (3 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 04/55] Makefile: Allow the SPL final link rule to be overridden Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 06/55] sandbox: Support building an SPL image Simon Glass
                   ` (49 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

SPL is expected to load and run U-Boot. This needs to work with sandbox also.
Provide a function to locate the U-Boot image, and another to start it. This
allows SPL to function on sandbox as it does on other archs.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/os.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 include/os.h          | 25 +++++++++++++++++++++++++
 2 files changed, 76 insertions(+)

diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index 8a4d719..2d63dd8 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -541,6 +541,57 @@ int os_jump_to_image(const void *dest, int size)
 	return unlink(fname);
 }
 
+int os_find_u_boot(char *fname, int maxlen)
+{
+	struct sandbox_state *state = state_get_current();
+	const char *progname = state->argv[0];
+	int len = strlen(progname);
+	char *p;
+	int fd;
+
+	if (len >= maxlen || len < 4)
+		return -ENOSPC;
+
+	/* Look for 'u-boot' in the same directory as 'u-boot-spl' */
+	strcpy(fname, progname);
+	if (!strcmp(fname + len - 4, "-spl")) {
+		fname[len - 4] = '\0';
+		fd = os_open(fname, O_RDONLY);
+		if (fd >= 0) {
+			close(fd);
+			return 0;
+		}
+	}
+
+	/* Look for 'u-boot' in the parent directory of spl/ */
+	p = strstr(fname, "/spl/");
+	if (p) {
+		strcpy(p, p + 4);
+		fd = os_open(fname, O_RDONLY);
+		if (fd >= 0) {
+			close(fd);
+			return 0;
+		}
+	}
+
+	return -ENOENT;
+}
+
+int os_spl_to_uboot(const char *fname)
+{
+	struct sandbox_state *state = state_get_current();
+	char *argv[state->argc + 1];
+	int ret;
+
+	memcpy(argv, state->argv, sizeof(char *) * (state->argc + 1));
+	argv[0] = (char *)fname;
+	ret = execv(fname, argv);
+	if (ret)
+		return ret;
+
+	return unlink(fname);
+}
+
 void os_localtime(struct rtc_time *rt)
 {
 	time_t t = time(NULL);
diff --git a/include/os.h b/include/os.h
index 954a48c..1782e50 100644
--- a/include/os.h
+++ b/include/os.h
@@ -287,6 +287,31 @@ int os_read_ram_buf(const char *fname);
 int os_jump_to_image(const void *dest, int size);
 
 /**
+ * os_find_u_boot() - Determine the path to U-Boot proper
+ *
+ * This function is intended to be called from within sandbox SPL. It uses
+ * a few heuristics to find U-Boot proper. Normally it is either in the same
+ * directory, or the directory above (since u-boot-spl is normally in an
+ * spl/ subdirectory when built).
+ *
+ * @fname:	Place to put full path to U-Boot
+ * @maxlen:	Maximum size of @fname
+ * @return 0 if OK, -NOSPC if the filename is too large, -ENOENT if not found
+ */
+int os_find_u_boot(char *fname, int maxlen);
+
+/**
+ * os_spl_to_uboot() - Run U-Boot proper
+ *
+ * When called from SPL, this runs U-Boot proper. The filename is obtained by
+ * calling os_find_u_boot().
+ *
+ * @fname:	Full pathname to U-Boot executable
+ * @return 0 if OK, -ve on error
+ */
+int os_spl_to_uboot(const char *fname);
+
+/**
  * Read the current system time
  *
  * This reads the current Local Time and places it into the provided
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 06/55] sandbox: Support building an SPL image
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (4 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 05/55] sandbox: Allow chaining from SPL to U-Boot proper Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 07/55] sandbox: Correct header file order in cpu.c Simon Glass
                   ` (48 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

When building an SPL image, override the link flags so that it uses the
system libraries. This is similar to the way the non-SPL image is built.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/config.mk | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk
index 16fd6d5..6d62abb 100644
--- a/arch/sandbox/config.mk
+++ b/arch/sandbox/config.mk
@@ -20,4 +20,9 @@ cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds \
 	-Wl,--start-group $(u-boot-main) -Wl,--end-group \
 	$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map
 
+cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
+	-Wl,--start-group $(patsubst $(obj)/%,%,$(u-boot-spl-main)) \
+	$(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) -Wl,--end-group \
+	$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot-spl.map -Wl,--gc-sections)
+
 CONFIG_ARCH_DEVICE_TREE := sandbox
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 07/55] sandbox: Correct header file order in cpu.c
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (5 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 06/55] sandbox: Support building an SPL image Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 08/55] sandbox: Add some missing headers " Simon Glass
                   ` (47 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

The dm/ file should go at the end. Move it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/cpu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index 196f3e1..7a622c8 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -4,10 +4,10 @@
  */
 #define DEBUG
 #include <common.h>
-#include <dm/root.h>
 #include <os.h>
 #include <asm/io.h>
 #include <asm/state.h>
+#include <dm/root.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 08/55] sandbox: Add some missing headers in cpu.c
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (6 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 07/55] sandbox: Correct header file order in cpu.c Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 09/55] sandbox: Don't use PCI in SPL Simon Glass
                   ` (46 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

These headers are needed in case they are not transitively included.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/cpu.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index 7a622c8..4975eb2 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -4,6 +4,8 @@
  */
 #define DEBUG
 #include <common.h>
+#include <errno.h>
+#include <libfdt.h>
 #include <os.h>
 #include <asm/io.h>
 #include <asm/state.h>
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 09/55] sandbox: Don't use PCI in SPL
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (7 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 08/55] sandbox: Add some missing headers " Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 10/55] sandbox: Don't include the main loop " Simon Glass
                   ` (45 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

PCI is not supported in SPL for sandbox, so avoid using it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/cpu.c    | 2 +-
 arch/sandbox/lib/Makefile | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index 4975eb2..2def722 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -57,7 +57,7 @@ int cleanup_before_linux_select(int flags)
 
 void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
 {
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && !defined(CONFIG_SPL_BUILD)
 	unsigned long plen = len;
 	void *ptr;
 
diff --git a/arch/sandbox/lib/Makefile b/arch/sandbox/lib/Makefile
index 96761e2..7820c55 100644
--- a/arch/sandbox/lib/Makefile
+++ b/arch/sandbox/lib/Makefile
@@ -8,5 +8,7 @@
 #
 
 obj-y	+= interrupts.o
+ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_PCI)	+= pci_io.o
+endif
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 10/55] sandbox: Don't include the main loop in SPL
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (8 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 09/55] sandbox: Don't use PCI in SPL Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 11/55] sandbox: Add basic SPL implementation Simon Glass
                   ` (44 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

SPL does not have a command interface so we should not include the main loop
code.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/start.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index 969618e..6e4ec01 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -73,6 +73,7 @@ static int sandbox_cmdline_cb_help(struct sandbox_state *state, const char *arg)
 }
 SANDBOX_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help");
 
+#ifndef CONFIG_SPL_BUILD
 int sandbox_main_loop_init(void)
 {
 	struct sandbox_state *state = state_get_current();
@@ -97,6 +98,7 @@ int sandbox_main_loop_init(void)
 
 	return 0;
 }
+#endif
 
 static int sandbox_cmdline_cb_boot(struct sandbox_state *state,
 				      const char *arg)
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 11/55] sandbox: Add basic SPL implementation
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (9 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 10/55] sandbox: Don't include the main loop " Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 12/55] sandbox: Don't use IDE and iotrace in SPL Simon Glass
                   ` (43 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Add an sandbox implementation for the generic SPL framework. This supports
locating and running U-Boot proper.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/Makefile      |  1 +
 arch/sandbox/cpu/spl.c         | 51 ++++++++++++++++++++++++++++++++++++++++++
 arch/sandbox/include/asm/spl.h | 23 +++++++++++++++++++
 3 files changed, 75 insertions(+)
 create mode 100644 arch/sandbox/cpu/spl.c
 create mode 100644 arch/sandbox/include/asm/spl.h

diff --git a/arch/sandbox/cpu/Makefile b/arch/sandbox/cpu/Makefile
index 1b42fee..db43633 100644
--- a/arch/sandbox/cpu/Makefile
+++ b/arch/sandbox/cpu/Makefile
@@ -8,6 +8,7 @@
 #
 
 obj-y	:= cpu.o os.o start.o state.o
+obj-$(CONFIG_SPL_BUILD)	+= spl.o
 obj-$(CONFIG_ETH_SANDBOX_RAW)	+= eth-raw-os.o
 obj-$(CONFIG_SANDBOX_SDL)	+= sdl.o
 
diff --git a/arch/sandbox/cpu/spl.c b/arch/sandbox/cpu/spl.c
new file mode 100644
index 0000000..e17c0ed
--- /dev/null
+++ b/arch/sandbox/cpu/spl.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016 Google, Inc
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <os.h>
+#include <asm/spl.h>
+#include <asm/state.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void board_init_f(ulong flag)
+{
+	struct sandbox_state *state = state_get_current();
+
+	gd->arch.ram_buf = state->ram_buf;
+	gd->ram_size = state->ram_size;
+}
+
+u32 spl_boot_device(void)
+{
+	return BOOT_DEVICE_BOARD;
+}
+
+void spl_board_announce_boot_device(void)
+{
+	char fname[256];
+	int ret;
+
+	ret = os_find_u_boot(fname, sizeof(fname));
+	if (ret) {
+		printf("(%s not found, error %d)\n", fname, ret);
+		return;
+	}
+	printf("%s\n", fname);
+}
+
+int spl_board_load_image(void)
+{
+	char fname[256];
+	int ret;
+
+	ret = os_find_u_boot(fname, sizeof(fname));
+	if (ret)
+		return ret;
+
+	/* Hopefully this will not return */
+	return os_spl_to_uboot(fname);
+}
diff --git a/arch/sandbox/include/asm/spl.h b/arch/sandbox/include/asm/spl.h
new file mode 100644
index 0000000..59f2401
--- /dev/null
+++ b/arch/sandbox/include/asm/spl.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2016 Google, Inc
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __asm_spl_h
+#define __asm_spl_h
+
+#define CONFIG_SPL_BOARD_LOAD_IMAGE
+
+/**
+ * Board-specific load method for boards that have a special way of loading
+ * U-Boot, which does not fit with the existing SPL code.
+ *
+ * @return 0 on success, negative errno value on failure.
+ */
+int spl_board_load_image(void);
+
+enum {
+	BOOT_DEVICE_BOARD,
+};
+
+#endif
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 12/55] sandbox: Don't use IDE and iotrace in SPL
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (10 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 11/55] sandbox: Add basic SPL implementation Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 13/55] sandbox: serial: Don't sync video " Simon Glass
                   ` (42 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

These functions are not supported in SPL, so drop them.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 include/configs/sandbox.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
index 23a0c40..4de89f8 100644
--- a/include/configs/sandbox.h
+++ b/include/configs/sandbox.h
@@ -16,8 +16,10 @@
 
 #endif
 
+#ifndef CONFIG_SPL_BUILD
 #define CONFIG_IO_TRACE
 #define CONFIG_CMD_IOTRACE
+#endif
 
 #ifndef CONFIG_TIMER
 #define CONFIG_SYS_TIMER_RATE		1000000
@@ -192,6 +194,7 @@
 #define CONFIG_CMD_LZMADEC
 #define CONFIG_CMD_DATE
 
+#ifndef CONFIG_SPL_BUILD
 #define CONFIG_CMD_IDE
 #define CONFIG_SYS_IDE_MAXBUS		1
 #define CONFIG_SYS_ATA_IDE0_OFFSET	0
@@ -201,6 +204,7 @@
 #define CONFIG_SYS_ATA_REG_OFFSET	1
 #define CONFIG_SYS_ATA_ALT_OFFSET	2
 #define CONFIG_SYS_ATA_STRIDE		4
+#endif
 
 #define CONFIG_SCSI
 #define CONFIG_SCSI_AHCI_PLAT
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 13/55] sandbox: serial: Don't sync video in SPL
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (11 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 12/55] sandbox: Don't use IDE and iotrace in SPL Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 14/55] sandbox: Add a new sandbox_spl board Simon Glass
                   ` (41 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

SPL does not support an LCD display so there is no need to sync the video
when there is serial output.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/serial/sandbox.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c
index 58f882b..bcc3465 100644
--- a/drivers/serial/sandbox.c
+++ b/drivers/serial/sandbox.c
@@ -115,7 +115,9 @@ static int sandbox_serial_pending(struct udevice *dev, bool input)
 		return 0;
 
 	os_usleep(100);
+#ifndef CONFIG_SPL_BUILD
 	video_sync_all();
+#endif
 	if (next_index == serial_buf_read)
 		return 1;	/* buffer full */
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 14/55] sandbox: Add a new sandbox_spl board
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (12 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 13/55] sandbox: serial: Don't sync video " Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 15/55] sandbox: Add a test device that uses of-platdata Simon Glass
                   ` (40 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

It is useful to be able to build SPL for sandbox. It provides additional
build coverage and allows SPL features to be tested in sandbox. However
it does not need worthwhile to always create an SPL build. It nearly
doubles the build time and the feature is (so far) seldom used.

So for now, create a separate build target for sandbox SPL. This allows
experimentation with this new feature without impacting existing workflows.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/Kconfig            |   7 +-
 arch/sandbox/cpu/u-boot-spl.lds |  24 ++++++
 board/sandbox/MAINTAINERS       |   7 ++
 configs/sandbox_spl_defconfig   | 177 ++++++++++++++++++++++++++++++++++++++++
 include/configs/sandbox_spl.h   |  18 ++++
 5 files changed, 232 insertions(+), 1 deletion(-)
 create mode 100644 arch/sandbox/cpu/u-boot-spl.lds
 create mode 100644 configs/sandbox_spl_defconfig
 create mode 100644 include/configs/sandbox_spl.h

diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig
index a8a90cb..d4c1ee0 100644
--- a/arch/sandbox/Kconfig
+++ b/arch/sandbox/Kconfig
@@ -10,8 +10,13 @@ config SYS_BOARD
 config SYS_CPU
 	default "sandbox"
 
+config SANDBOX_SPL
+	bool "Enable SPL for sandbox"
+	select SUPPORT_SPL
+
 config SYS_CONFIG_NAME
-	default "sandbox"
+	default "sandbox_spl" if SANDBOX_SPL
+	default "sandbox" if !SANDBOX_SPL
 
 config PCI
 	bool "PCI support"
diff --git a/arch/sandbox/cpu/u-boot-spl.lds b/arch/sandbox/cpu/u-boot-spl.lds
new file mode 100644
index 0000000..7e92b4a
--- /dev/null
+++ b/arch/sandbox/cpu/u-boot-spl.lds
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2011-2012 The Chromium OS Authors.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+SECTIONS
+{
+
+	. = ALIGN(4);
+	.u_boot_list : {
+		KEEP(*(SORT(.u_boot_list*)));
+	}
+
+	__u_boot_sandbox_option_start = .;
+	_u_boot_sandbox_getopt : { *(.u_boot_sandbox_getopt) }
+	__u_boot_sandbox_option_end = .;
+
+	__bss_start = .;
+}
+
+INSERT BEFORE .data;
diff --git a/board/sandbox/MAINTAINERS b/board/sandbox/MAINTAINERS
index f5db773..4dcbf4b 100644
--- a/board/sandbox/MAINTAINERS
+++ b/board/sandbox/MAINTAINERS
@@ -11,3 +11,10 @@ S:	Maintained
 F:	board/sandbox/
 F:	include/configs/sandbox.h
 F:	configs/sandbox_noblk_defconfig
+
+SANDBOX SPL BOARD
+M:	Simon Glass <sjg@chromium.org>
+S:	Maintained
+F:	board/sandbox/
+F:	include/configs/sandbox_spl.h
+F:	configs/sandbox_spl_defconfig
diff --git a/configs/sandbox_spl_defconfig b/configs/sandbox_spl_defconfig
new file mode 100644
index 0000000..ac30d6b
--- /dev/null
+++ b/configs/sandbox_spl_defconfig
@@ -0,0 +1,177 @@
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_DM=y
+CONFIG_BLK=y
+CONFIG_MMC=y
+CONFIG_SANDBOX_SPL=y
+CONFIG_PCI=y
+CONFIG_DEFAULT_DEVICE_TREE="sandbox"
+CONFIG_I8042_KEYB=y
+CONFIG_SPL=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FIT_SIGNATURE=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_BOOTSTAGE=y
+CONFIG_BOOTSTAGE_REPORT=y
+CONFIG_BOOTSTAGE_USER_COUNT=0x20
+CONFIG_BOOTSTAGE_FDT=y
+CONFIG_BOOTSTAGE_STASH=y
+CONFIG_BOOTSTAGE_STASH_ADDR=0x0
+CONFIG_BOOTSTAGE_STASH_SIZE=0x4096
+CONFIG_CONSOLE_RECORD=y
+CONFIG_CONSOLE_RECORD_OUT_SIZE=0x1000
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+CONFIG_CMD_LICENSE=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_ASKENV=y
+CONFIG_CMD_GREPENV=y
+CONFIG_LOOPW=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_MX_CYCLIC=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_DEMO=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_REMOTEPROC=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_TFTPSRV=y
+CONFIG_CMD_RARP=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CDP=y
+CONFIG_CMD_SNTP=y
+CONFIG_CMD_DNS=y
+CONFIG_CMD_LINK_LOCAL=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_TIMER=y
+CONFIG_CMD_SOUND=y
+CONFIG_CMD_QFW=y
+CONFIG_CMD_BOOTSTAGE=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_TPM=y
+CONFIG_CMD_TPM_TEST=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_HOSTFILE=y
+CONFIG_NETCONSOLE=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_DEVRES=y
+CONFIG_DEBUG_DEVRES=y
+CONFIG_ADC=y
+CONFIG_ADC_SANDBOX=y
+CONFIG_CLK=y
+CONFIG_CPU=y
+CONFIG_DM_DEMO=y
+CONFIG_DM_DEMO_SIMPLE=y
+CONFIG_DM_DEMO_SHAPE=y
+CONFIG_PM8916_GPIO=y
+CONFIG_SANDBOX_GPIO=y
+CONFIG_DM_I2C_COMPAT=y
+CONFIG_I2C_CROS_EC_TUNNEL=y
+CONFIG_I2C_CROS_EC_LDO=y
+CONFIG_DM_I2C_GPIO=y
+CONFIG_SYS_I2C_SANDBOX=y
+CONFIG_I2C_MUX=y
+CONFIG_SPL_I2C_MUX=y
+CONFIG_I2C_ARB_GPIO_CHALLENGE=y
+CONFIG_CROS_EC_KEYB=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_DM_MAILBOX=y
+CONFIG_SANDBOX_MBOX=y
+CONFIG_MISC=y
+CONFIG_CMD_CROS_EC=y
+CONFIG_CROS_EC=y
+CONFIG_CROS_EC_I2C=y
+CONFIG_CROS_EC_LPC=y
+CONFIG_CROS_EC_SANDBOX=y
+CONFIG_CROS_EC_SPI=y
+CONFIG_PWRSEQ=y
+CONFIG_SPL_PWRSEQ=y
+CONFIG_SYSRESET=y
+CONFIG_DM_MMC=y
+CONFIG_SANDBOX_MMC=y
+CONFIG_SPI_FLASH_SANDBOX=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_DM_ETH=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_PCI_SANDBOX=y
+CONFIG_PINCTRL=y
+CONFIG_PINCONF=y
+CONFIG_ROCKCHIP_PINCTRL=y
+CONFIG_ROCKCHIP_3036_PINCTRL=y
+CONFIG_PINCTRL_SANDBOX=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_ACT8846=y
+CONFIG_DM_PMIC_PFUZE100=y
+CONFIG_DM_PMIC_MAX77686=y
+CONFIG_PMIC_PM8916=y
+CONFIG_PMIC_RK808=y
+CONFIG_PMIC_S2MPS11=y
+CONFIG_DM_PMIC_SANDBOX=y
+CONFIG_PMIC_S5M8767=y
+CONFIG_PMIC_TPS65090=y
+CONFIG_DM_REGULATOR=y
+CONFIG_REGULATOR_ACT8846=y
+CONFIG_DM_REGULATOR_PFUZE100=y
+CONFIG_DM_REGULATOR_MAX77686=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_REGULATOR_RK808=y
+CONFIG_REGULATOR_S5M8767=y
+CONFIG_DM_REGULATOR_SANDBOX=y
+CONFIG_REGULATOR_TPS65090=y
+CONFIG_RAM=y
+CONFIG_REMOTEPROC_SANDBOX=y
+CONFIG_DM_RTC=y
+CONFIG_SANDBOX_SERIAL=y
+CONFIG_SOUND=y
+CONFIG_SOUND_SANDBOX=y
+CONFIG_SANDBOX_SPI=y
+CONFIG_SPMI=y
+CONFIG_SPMI_SANDBOX=y
+CONFIG_TIMER=y
+CONFIG_TIMER_EARLY=y
+CONFIG_SANDBOX_TIMER=y
+CONFIG_TPM_TIS_SANDBOX=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EMUL=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_SYS_USB_EVENT_POLL=y
+CONFIG_DM_VIDEO=y
+CONFIG_CONSOLE_ROTATION=y
+CONFIG_CONSOLE_TRUETYPE=y
+CONFIG_CONSOLE_TRUETYPE_CANTORAONE=y
+CONFIG_VIDEO_SANDBOX_SDL=y
+CONFIG_CMD_DHRYSTONE=y
+CONFIG_TPM=y
+CONFIG_LZ4=y
+CONFIG_ERRNO_STR=y
+CONFIG_UNIT_TEST=y
+CONFIG_UT_TIME=y
+CONFIG_UT_DM=y
+CONFIG_UT_ENV=y
diff --git a/include/configs/sandbox_spl.h b/include/configs/sandbox_spl.h
new file mode 100644
index 0000000..7b5c3f3
--- /dev/null
+++ b/include/configs/sandbox_spl.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2016 Google, Inc
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __SANDBOX_SPL_CONFIG_H
+#define __SANDBOX_SPL_CONFIG_H
+
+#include <configs/sandbox.h>
+
+#define CONFIG_SPL_DRIVERS_MISC_SUPPORT
+#define CONFIG_SPL_ENV_SUPPORT
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+
+#endif
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 15/55] sandbox: Add a test device that uses of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (13 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 14/55] sandbox: Add a new sandbox_spl board Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 16/55] dm: spl: Don't set up device tree with of-platdata Simon Glass
                   ` (39 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Add a simple test device that provides a check that the of-platdata
feature is working correctly.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/sandbox/cpu/spl.c        |  9 +++++++++
 arch/sandbox/dts/sandbox.dts  | 13 +++++++++++++
 include/configs/sandbox_spl.h |  2 ++
 3 files changed, 24 insertions(+)

diff --git a/arch/sandbox/cpu/spl.c b/arch/sandbox/cpu/spl.c
index e17c0ed..b064709 100644
--- a/arch/sandbox/cpu/spl.c
+++ b/arch/sandbox/cpu/spl.c
@@ -49,3 +49,12 @@ int spl_board_load_image(void)
 	/* Hopefully this will not return */
 	return os_spl_to_uboot(fname);
 }
+
+void spl_board_init(void)
+{
+	struct udevice *dev;
+	int ret;
+
+	ret = uclass_first_device(UCLASS_MISC, &dev);
+	printf("ret=%d, dev=%p\n", ret, dev);
+}
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 2ae4014..3455bc0 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -172,6 +172,19 @@
 		};
 	};
 
+	spl-test {
+		u-boot,dm-pre-reloc;
+		compatible = "sandbox,spl-test";
+		boolval;
+		intval = <1>;
+		intarray = <2 3 4>;
+		byteval = [05];
+		bytearray = [06 07 08];
+		longbytearray = [09 0a 0b 0c 0d 0e 0f 10 11];
+		string = "message";
+		stringarray = "multi-word", "message";
+	};
+
 	square {
 		compatible = "demo-shape";
 		colour = "blue";
diff --git a/include/configs/sandbox_spl.h b/include/configs/sandbox_spl.h
index 7b5c3f3..ffc3098 100644
--- a/include/configs/sandbox_spl.h
+++ b/include/configs/sandbox_spl.h
@@ -8,6 +8,8 @@
 
 #include <configs/sandbox.h>
 
+#define CONFIG_SPL_BOARD_INIT
+
 #define CONFIG_SPL_DRIVERS_MISC_SUPPORT
 #define CONFIG_SPL_ENV_SUPPORT
 #define CONFIG_SPL_FRAMEWORK
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 16/55] dm: spl: Don't set up device tree with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (14 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 15/55] sandbox: Add a test device that uses of-platdata Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 17/55] dm: Makefile: Build of-platdata before SPL Simon Glass
                   ` (38 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

When this feature is enabled, we should not access the device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 common/spl/spl.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 5fbf101..59f41a1 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -202,7 +202,7 @@ int spl_init(void)
 	gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
 	gd->malloc_ptr = 0;
 #endif
-	if (CONFIG_IS_ENABLED(OF_CONTROL)) {
+	if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
 		ret = fdtdec_setup();
 		if (ret) {
 			debug("fdtdec_setup() returned error %d\n", ret);
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 17/55] dm: Makefile: Build of-platdata before SPL
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (15 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 16/55] dm: spl: Don't set up device tree with of-platdata Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 18/55] dm: core: Don't use device tree with of-platdata Simon Glass
                   ` (37 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

Since SPL needs the of-platdata structures, build these before starting
to build any SPL components.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 5b03095..edefc0b 100644
--- a/Makefile
+++ b/Makefile
@@ -1316,7 +1316,8 @@ u-boot.lds: $(LDSCRIPT) prepare FORCE
 
 spl/u-boot-spl.bin: spl/u-boot-spl
 	@:
-spl/u-boot-spl: tools prepare $(if $(CONFIG_OF_SEPARATE),dts/dt.dtb)
+spl/u-boot-spl: tools prepare \
+		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb)
 	$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all
 
 spl/sunxi-spl.bin: spl/u-boot-spl
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 18/55] dm: core: Don't use device tree with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (16 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 17/55] dm: Makefile: Build of-platdata before SPL Simon Glass
@ 2016-06-13  5:32 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 19/55] dm: regmap: Add a dummy implementation for of-platdata Simon Glass
                   ` (36 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:32 UTC (permalink / raw)
  To: u-boot

When CONFIG_SPL_OF_PLATDATA is enabled we should not access the device
tree. Remove all references to this in the core driver-model code.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/device.c | 2 +-
 drivers/core/lists.c  | 2 +-
 drivers/core/root.c   | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/core/device.c b/drivers/core/device.c
index eb75b17..de52f07 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -607,7 +607,7 @@ const char *dev_get_uclass_name(struct udevice *dev)
 
 fdt_addr_t dev_get_addr_index(struct udevice *dev, int index)
 {
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 	fdt_addr_t addr;
 
 	if (CONFIG_IS_ENABLED(OF_TRANSLATE)) {
diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index 0c27717..6a634e6 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -99,7 +99,7 @@ int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
 	return 0;
 }
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 /**
  * driver_check_compatible() - Check if a driver is compatible with this node
  *
diff --git a/drivers/core/root.c b/drivers/core/root.c
index 13c2713..0743aeb 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -173,7 +173,7 @@ int dm_scan_platdata(bool pre_reloc_only)
 	return ret;
 }
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 int dm_scan_fdt_node(struct udevice *parent, const void *blob, int offset,
 		     bool pre_reloc_only)
 {
@@ -229,7 +229,7 @@ int dm_init_and_scan(bool pre_reloc_only)
 		return ret;
 	}
 
-	if (CONFIG_IS_ENABLED(OF_CONTROL)) {
+	if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
 		ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
 		if (ret) {
 			debug("dm_scan_fdt() failed: %d\n", ret);
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 19/55] dm: regmap: Add a dummy implementation for of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (17 preceding siblings ...)
  2016-06-13  5:32 ` [U-Boot] [PATCH v2 18/55] dm: core: Don't use device tree with of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 20/55] dm: syscon: Add support " Simon Glass
                   ` (35 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add a placeholder for now so that this code will compile. It currently does
nothing.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/regmap.c | 9 +++++++++
 include/regmap.h      | 3 +++
 2 files changed, 12 insertions(+)

diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
index 519832f..7e073cf 100644
--- a/drivers/core/regmap.c
+++ b/drivers/core/regmap.c
@@ -15,6 +15,14 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
+			     struct regmap **mapp)
+{
+	/* TODO(sjg at chromium.org): Implement this when needed */
+	return 0;
+}
+#else
 int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
 {
 	const void *blob = gd->fdt_blob;
@@ -64,6 +72,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
 
 	return 0;
 }
+#endif
 
 void *regmap_get_range(struct regmap *map, unsigned int range_num)
 {
diff --git a/include/regmap.h b/include/regmap.h
index eccf770..922b39f 100644
--- a/include/regmap.h
+++ b/include/regmap.h
@@ -56,6 +56,9 @@ int regmap_read(struct regmap *map, uint offset, uint *valp);
  */
 int regmap_init_mem(struct udevice *dev, struct regmap **mapp);
 
+int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
+			     struct regmap **mapp);
+
 /**
  * regmap_get_range() - Obtain the base memory address of a regmap range
  *
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 20/55] dm: syscon: Add support for of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (18 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 19/55] dm: regmap: Add a dummy implementation for of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 21/55] dm: sandbox: Add a simple driver to test of-platdata Simon Glass
                   ` (34 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Provide a new function which can cope with obtaining information from
of-platdata instead of the device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Add a comment to the effect that 64-bit machines are not supported

 drivers/core/syscon-uclass.c | 13 +++++++++++++
 include/syscon.h             | 11 +++++++++++
 2 files changed, 24 insertions(+)

diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c
index e03f46a..01bd968 100644
--- a/drivers/core/syscon-uclass.c
+++ b/drivers/core/syscon-uclass.c
@@ -29,7 +29,20 @@ static int syscon_pre_probe(struct udevice *dev)
 {
 	struct syscon_uc_info *priv = dev_get_uclass_priv(dev);
 
+	/*
+	 * With OF_PLATDATA we really have no way of knowing the format of
+	 * the device-specific platform data. So we assume that it starts with
+	 * a 'reg' member, and this holds a single address and size. Drivers
+	 * using OF_PLATDATA will need to ensure that this is true.
+	 */
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct syscon_base_platdata *plat = dev_get_platdata(dev);
+
+	return regmap_init_mem_platdata(dev, plat->reg, ARRAY_SIZE(plat->reg),
+					&priv->regmap);
+#else
 	return regmap_init_mem(dev, &priv->regmap);
+#endif
 }
 
 int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp)
diff --git a/include/syscon.h b/include/syscon.h
index 4593b6e..34842aa 100644
--- a/include/syscon.h
+++ b/include/syscon.h
@@ -23,6 +23,17 @@ struct syscon_ops {
 
 #define syscon_get_ops(dev)        ((struct syscon_ops *)(dev)->driver->ops)
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+/*
+ * We don't support 64-bit machines. If they are so resource-contrained that
+ * they need to use OF_PLATDATA, something is horribly wrong with the
+ * education of our hardware engineers.
+ */
+struct syscon_base_platdata {
+	u32 reg[2];
+};
+#endif
+
 /**
  * syscon_get_regmap() - Get access to a register map
  *
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 21/55] dm: sandbox: Add a simple driver to test of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (19 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 20/55] dm: syscon: Add support " Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 22/55] dm: Add a header that provides access to the of-platdata structs Simon Glass
                   ` (33 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add a driver which uses of-platdata to obtain its platform data. This can
be used to test the feature in sandbox.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/misc/Makefile          |  5 +++++
 drivers/misc/spltest_sandbox.c | 28 ++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 drivers/misc/spltest_sandbox.c

diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 066639b..3eac024 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -35,6 +35,11 @@ obj-$(CONFIG_SMSC_LPC47M) += smsc_lpc47m.o
 obj-$(CONFIG_SMSC_SIO1007) += smsc_sio1007.o
 obj-$(CONFIG_STATUS_LED) += status_led.o
 obj-$(CONFIG_SANDBOX) += swap_case.o
+ifdef CONFIG_SPL_OF_PLATDATA
+ifdef CONFIG_SPL_BUILD
+obj-$(CONFIG_SANDBOX) += spltest_sandbox.o
+endif
+endif
 obj-$(CONFIG_SANDBOX) += syscon_sandbox.o
 obj-$(CONFIG_TWL4030_LED) += twl4030_led.o
 obj-$(CONFIG_FSL_IFC) += fsl_ifc.o
diff --git a/drivers/misc/spltest_sandbox.c b/drivers/misc/spltest_sandbox.c
new file mode 100644
index 0000000..ac4d10c
--- /dev/null
+++ b/drivers/misc/spltest_sandbox.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dt-structs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int sandbox_spl_probe(struct udevice *dev)
+{
+	struct dtd_sandbox_spl_test *plat = dev_get_platdata(dev);
+
+	printf("here %s\n", plat->string);
+
+	return 0;
+}
+
+U_BOOT_DRIVER(sandbox_spl_test) = {
+	.name	= "sandbox_spl_test",
+	.id	= UCLASS_MISC,
+	.flags	= DM_FLAG_PRE_RELOC,
+	.probe	= sandbox_spl_probe,
+};
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 22/55] dm: Add a header that provides access to the of-platdata structs
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (20 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 21/55] dm: sandbox: Add a simple driver to test of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 23/55] dm: clk: Add support for of-platdata Simon Glass
                   ` (32 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This header can be included from anywhere, but will only pull in the
of-platdata struct definitions when this feature is enabled (and only in
SPL).

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 include/dt-structs.h | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 include/dt-structs.h

diff --git a/include/dt-structs.h b/include/dt-structs.h
new file mode 100644
index 0000000..e13afa6
--- /dev/null
+++ b/include/dt-structs.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2016 Google, Inc
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __DT_STTUCTS
+#define __DT_STTUCTS
+
+/* These structures may only be used in SPL */
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+struct phandle_2_cell {
+	const void *node;
+	int id;
+};
+#include <generated/dt-structs.h>
+#endif
+
+#endif
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 23/55] dm: clk: Add support for of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (21 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 22/55] dm: Add a header that provides access to the of-platdata structs Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 24/55] dm: serial: " Simon Glass
                   ` (31 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add support for this feature in the core clock code.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/clk/clk-uclass.c     | 20 ++++++++++++++++++++
 drivers/clk/clk_fixed_rate.c |  2 ++
 include/clk.h                |  4 ++++
 3 files changed, 26 insertions(+)

diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index b483c1e..efe2d4e 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <errno.h>
 #include <dm/lists.h>
 #include <dm/root.h>
@@ -65,6 +66,22 @@ ulong clk_set_periph_rate(struct udevice *dev, int periph, ulong rate)
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
+# if CONFIG_IS_ENABLED(OF_PLATDATA)
+int clk_get_by_index_platdata(struct udevice *dev, int index,
+			      struct phandle_2_cell *cells,
+			      struct udevice **clk_devp)
+{
+	int ret;
+
+	if (index != 0)
+		return -ENOSYS;
+	assert(*clk_devp);
+	ret = uclass_get_device(UCLASS_CLK, 0, clk_devp);
+	if (ret)
+		return ret;
+	return cells[0].id;
+}
+# else
 int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp)
 {
 	int ret;
@@ -104,6 +121,9 @@ int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp)
 	return args.args_count > 0 ? args.args[0] : 0;
 #endif
 }
+# endif /* OF_PLATDATA */
+#else
+
 #endif
 
 UCLASS_DRIVER(clk) = {
diff --git a/drivers/clk/clk_fixed_rate.c b/drivers/clk/clk_fixed_rate.c
index 8beda9c..8c3fb8f 100644
--- a/drivers/clk/clk_fixed_rate.c
+++ b/drivers/clk/clk_fixed_rate.c
@@ -33,9 +33,11 @@ const struct clk_ops clk_fixed_rate_ops = {
 
 static int clk_fixed_rate_ofdata_to_platdata(struct udevice *dev)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	to_clk_fixed_rate(dev)->fixed_rate =
 				fdtdec_get_int(gd->fdt_blob, dev->of_offset,
 					       "clock-frequency", 0);
+#endif
 
 	return 0;
 }
diff --git a/include/clk.h b/include/clk.h
index ca20c3d..e4d23be 100644
--- a/include/clk.h
+++ b/include/clk.h
@@ -120,6 +120,10 @@ ulong clk_set_periph_rate(struct udevice *dev, int periph, ulong rate);
  *		argument after the clock node phandle. If there is no arguemnt,
  *		returns 0. Return -ve error code on any error
  */
+struct phandle_2_cell;
+int clk_get_by_index_platdata(struct udevice *dev, int index,
+			      struct phandle_2_cell *cells,
+			      struct udevice **clk_devp);
 int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp);
 #else
 static inline int clk_get_by_index(struct udevice *dev, int index,
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 24/55] dm: serial: Add support for of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (22 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 23/55] dm: clk: Add support for of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 25/55] dm: Don't include fdtdec functions when of-platdata is enabled Simon Glass
                   ` (30 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

When this feature is enabled, we cannot access the device tree to find out
which serial device to use. Just use the first serial driver we find.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/serial/serial-uclass.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 0ce5c44..19f38e1 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -33,7 +33,13 @@ static void serial_find_console_or_panic(void)
 	struct udevice *dev;
 	int node;
 
-	if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
+	if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
+		uclass_first_device(UCLASS_SERIAL, &dev);
+		if (dev) {
+			gd->cur_serial_dev = dev;
+			return;
+		}
+	} else if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
 		/* Check for a chosen console */
 		node = fdtdec_get_chosen_node(blob, "stdout-path");
 		if (node < 0) {
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 25/55] dm: Don't include fdtdec functions when of-platdata is enabled
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (23 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 24/55] dm: serial: " Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 26/55] dm: Add an option to enable the of-platdata feature Simon Glass
                   ` (29 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

We cannot access the device tree in this case, so avoid compiling in the
various device-tree helper functions.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 lib/Makefile | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/lib/Makefile b/lib/Makefile
index f77befe..2fc0272 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -49,11 +49,10 @@ obj-y += list_sort.o
 endif
 
 obj-$(CONFIG_$(SPL_)OF_LIBFDT) += libfdt/
-ifdef CONFIG_SPL_OF_CONTROL
-obj-$(CONFIG_OF_LIBFDT) += libfdt/
-endif
+ifneq ($(CONFIG_SPL_BUILD)$(CONFIG_SPL_OF_PLATDATA),yy)
 obj-$(CONFIG_$(SPL_)OF_CONTROL) += fdtdec_common.o
 obj-$(CONFIG_$(SPL_)OF_CONTROL) += fdtdec.o
+endif
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 26/55] dm: Add an option to enable the of-platdata feature
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (24 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 25/55] dm: Don't include fdtdec functions when of-platdata is enabled Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 27/55] dm: Add a README for of-platdata Simon Glass
                   ` (28 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add a Kconfig option to enable this feature.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 dts/Kconfig | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/dts/Kconfig b/dts/Kconfig
index c56c129..4b7d8b1 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -85,4 +85,25 @@ config OF_SPL_REMOVE_PROPS
 	  can be discarded. This option defines the list of properties to
 	  discard.
 
+config SPL_OF_PLATDATA
+	bool "Generate platform data for use in SPL"
+	depends on SPL_OF_CONTROL
+	help
+	  For very constrained SPL environments the overhead of decoding
+	  device tree nodes and converting their contents into platform data
+	  is too large. This overhead includes libfdt code as well as the
+	  device tree contents itself. The latter is fairly compact, but the
+	  former can add 3KB or more to a Thumb 2 Image.
+
+	  This option enables generation of platform data from the device
+	  tree as C code. This code creates devices using U_BOOT_DEVICE()
+	  declarations. The benefit is that it allows driver code to access
+	  the platform data directly in C structures, avoidin the libfdt
+	  overhead.
+
+	  This option works by generating C structure declarations for each
+	  compatible string, then adding platform data and U_BOOT_DEVICE
+	  declarations for each node. See README.platdata for more
+	  information.
+
 endmenu
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 27/55] dm: Add a README for of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (25 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 26/55] dm: Add an option to enable the of-platdata feature Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 28/55] dm: Add a library to provide simple device-tree access Simon Glass
                   ` (27 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add documentation on how this works, including the benefits and drawbacks.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 doc/driver-model/of-plat.txt | 268 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 268 insertions(+)
 create mode 100644 doc/driver-model/of-plat.txt

diff --git a/doc/driver-model/of-plat.txt b/doc/driver-model/of-plat.txt
new file mode 100644
index 0000000..96b9b46
--- /dev/null
+++ b/doc/driver-model/of-plat.txt
@@ -0,0 +1,268 @@
+Driver Model Compiled-in Device Tree / Platform Data
+====================================================
+
+
+Introduction
+------------
+
+Device tree is the standard configuration method in U-Boot. It is used to
+define what devices are in the system and provide configuration information
+to these devices.
+
+The overhead of adding device tree access to U-Boot is fairly modest,
+approximately 3KB on Thumb 2 (plus the size of the DT itself). This means
+that in most cases it is best to use device tree for configuration.
+
+However there are some very constrained environments where U-Boot needs to
+work. These include SPL with severe memory limitations. For example, some
+SoCs require a 16KB SPL image which must include a full MMC stack. In this
+case the overhead of device tree access may be too great.
+
+It is possible to create platform data manually by defining C structures
+for it, and referencing that data in a U_BOOT_DEVICE() declaration. This
+bypasses the use of device tree completely, but is an available option for
+SPL.
+
+As an alternative, a new 'of-platdata' feature is provided. This converts
+device tree contents into C code which can be compiled into the SPL binary.
+This saves the 3KB of code overhead and perhaps a few hundred more bytes due
+to more efficient storage of the data.
+
+
+Caveats
+-------
+
+There are many problems with this features. It should only be used when
+stricly necessary. Notable problems include:
+
+   - Device tree does not describe data types but the C code must define a
+        type for each property. Thesee are guessed using heuristics which
+        are wrong in several fairly common cases. For example an 8-byte value
+        is considered to be a 2-item integer array, and is byte-swapped. A
+        boolean value that is not present means 'false', but cannot be
+        included in the structures since there is generally no mention of it
+        in the device tree file.
+
+   - Naming of nodes and properties is automatic. This means that they follow
+        the naming in the device tree, which may result in C identifiers that
+        look a bit strange
+
+   - It is not possible to find a value given a property name. Code must use
+        the associated C member variable directly in the code. This makes
+        the code less robust in the face of device-tree changes. It also
+        makes it very unlikely that your driver code will be useful for more
+        than one SoC. Even if the code is common, each SoC will end up with
+        a different C struct and format for the platform data.
+
+   - The platform data is provided to drivers as a C structure. The driver
+        must use the same structure to access the data. Since a driver
+        normally also supports device tree it must use #ifdef to separate
+        out this code, since the structures are only available in SPL.
+
+
+How it works
+------------
+
+The feature is enabled by CONFIG SPL_OF_PLATDATA. This is only available
+in SPL and should be tested with:
+
+        #if CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+
+A new tool called 'dtoc' converts a device tree file either into a set of
+struct declarations, one for each compatible node, or a set of
+U_BOOT_DEVICE() declarations along with the actual platform data for each
+device. As an example, consider this MMC node:
+
+        sdmmc: dwmmc at ff0c0000 {
+                compatible = "rockchip,rk3288-dw-mshc";
+                clock-freq-min-max = <400000 150000000>;
+                clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
+                         <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
+                clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+                fifo-depth = <0x100>;
+                interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                reg = <0xff0c0000 0x4000>;
+                bus-width = <4>;
+                cap-mmc-highspeed;
+                cap-sd-highspeed;
+                card-detect-delay = <200>;
+                disable-wp;
+                num-slots = <1>;
+                pinctrl-names = "default";
+                pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
+                vmmc-supply = <&vcc_sd>;
+                status = "okay";
+                u-boot,dm-pre-reloc;
+        };
+
+
+Some of these properties are dropped by U-Boot under control of the
+CONFIG_OF_SPL_REMOVE_PROPS option. The rest are processed. This will produce
+the following C struct declaration:
+
+struct dtd_rockchip_rk3288_dw_mshc {
+        fdt32_t         bus_width;
+        bool            cap_mmc_highspeed;
+        bool            cap_sd_highspeed;
+        fdt32_t         card_detect_delay;
+        fdt32_t         clock_freq_min_max[2];
+        struct phandle_2_cell clocks[4];
+        bool            disable_wp;
+        fdt32_t         fifo_depth;
+        fdt32_t         interrupts[3];
+        fdt32_t         num_slots;
+        fdt32_t         reg[2];
+        bool            u_boot_dm_pre_reloc;
+        fdt32_t         vmmc_supply;
+};
+
+and the following device declaration:
+
+static struct dtd_rockchip_rk3288_dw_mshc dtv_dwmmc_at_ff0c0000 = {
+        .fifo_depth             = 0x100,
+        .cap_sd_highspeed       = true,
+        .interrupts             = {0x0, 0x20, 0x4},
+        .clock_freq_min_max     = {0x61a80, 0x8f0d180},
+        .vmmc_supply            = 0xb,
+        .num_slots              = 0x1,
+        .clocks                 = {{&dtv_clock_controller_at_ff760000, 456}, {&dtv_clock_controller_at_ff760000, 68}, {&dtv_clock_controller_at_ff760000, 114}, {&dtv_clock_controller_at_ff760000, 118}},
+        .cap_mmc_highspeed      = true,
+        .disable_wp             = true,
+        .bus_width              = 0x4,
+        .u_boot_dm_pre_reloc    = true,
+        .reg                    = {0xff0c0000, 0x4000},
+        .card_detect_delay      = 0xc8,
+};
+U_BOOT_DEVICE(dwmmc_at_ff0c0000) = {
+        .name           = "rockchip_rk3288_dw_mshc",
+        .platdata       = &dtv_dwmmc_at_ff0c0000,
+};
+
+The device is then instantiated at run-time and the platform data can be
+accessed using:
+
+        struct udevice *dev;
+        struct dtd_rockchip_rk3288_dw_mshc *plat = dev_get_platdata(dev);
+
+This avoids the code overhead of converting the device tree data to
+platform data in the driver. The ofdata_to_platdata() method should
+therefore do nothing in such a driver.
+
+
+How to structure your driver
+----------------------------
+
+Drivers should always support device tree as an option. The of-platdata
+feature is intended as a add-on to existing drivers.
+
+Your driver should directly access the platdata struct in its probe()
+method. The existing device tree decoding logic should be kept in the
+ofdata_to_platdata() and wrapped with #ifdef.
+
+For example:
+
+    #include <dt-structs.h>
+
+    struct mmc_platdata {
+    #if CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+            /* Put this first */
+            struct dtd_mmc dtplat;
+    #endif
+            /*
+             * Other fields can go here, to be filled in by decoding from
+             * the device tree. They will point to random memory in the
+             * of-plat case.
+             */
+            int fifo_depth;
+    };
+
+    static int mmc_ofdata_to_platdata(struct udevice *dev)
+    {
+    #if !CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+            struct mmc_platdata *plat = dev_get_platdata(dev);
+            const void *blob = gd->fdt_blob;
+            int node = dev->of_offset;
+
+            plat->fifo_depth = fdtdec_get_int(blob, node, "fifo-depth", 0);
+    #endif
+
+            return 0;
+    }
+
+    static int mmc_probe(struct udevice *dev)
+    {
+            struct mmc_platdata *plat = dev_get_platdata(dev);
+    #if CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+            struct dtd_mmc *dtplat = &plat->dtplat;
+
+            /* Set up the device from the dtplat data */
+            writel(dtplat->fifo_depth, ...)
+    #else
+            /* Set up the device from the plat data */
+            writel(plat->fifo_depth, ...)
+    #endif
+    }
+
+    static const struct udevice_id mmc_ids[] = {
+            { .compatible = "vendor,mmc" },
+            { }
+    };
+
+    U_BOOT_DRIVER(mmc_drv) = {
+            .name           = "mmc",
+            .id             = UCLASS_MMC,
+            .of_match       = mmc_ids,
+            .ofdata_to_platdata = mmc_ofdata_to_platdata,
+            .probe          = mmc_probe,
+            .priv_auto_alloc_size = sizeof(struct mmc_priv),
+            .platdata_auto_alloc_size = sizeof(struct mmc_platdata),
+    };
+
+
+In the case where SPL_OF_PLATDATA is enabled, platdata_auto_alloc_size is
+ignored, and the platform data points to the C structure data. In the case
+where device tree is used, the platform data is allocated, and starts
+zeroed. In this case the ofdata_to_platdata() method should set up the
+platform data.
+
+SPL must use either of-platdata or device tree. Drivers cannot use both.
+The device tree becomes in accessible when CONFIG_SPL_OF_PLATDATA is enabled,
+since the device-tree access code is not compiled in.
+
+
+Internals
+---------
+
+The dt-structs.h file includes the generated file
+(include/generated//dt-structs.h) if CONFIG_SPL_OF_PLATDATA is enabled.
+Otherwise (such as in U-Boot proper) these structs are not available. This
+prevents them being used inadvertently.
+
+The dt-platdata.c file contains the device declarations and is is built in
+spl/dt-platdata.c.
+
+Some phandles (thsoe that are recognised as such) are converted into
+points to platform data. This pointer can potentially be used to access the
+referenced device (by searching for the pointer value). This feature is not
+yet implemented, however.
+
+The beginnings of a libfdt Python module are provided. So far this only
+implements a subset of the features.
+
+The 'swig' tool is needed to build the libfdt Python module.
+
+
+Future work
+-----------
+- Add unit tests
+- Add a sandbox_spl functional test
+- Consider programmatically reading binding files instead of device tree
+     contents
+- Drop the device tree data from the SPL image
+- Complete the phandle feature
+- Get this running on a Rockchip board
+- Move to using a full Python libfdt module
+
+--
+Simon Glass <sjg@chromium.org>
+6/6/16
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 28/55] dm: Add a library to provide simple device-tree access
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (26 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 27/55] dm: Add a README for of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 29/55] dm: Add a tool to generate C code from a device tree Simon Glass
                   ` (26 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This Python library provides a way to access the contents of the device
tree. It uses fdtget, so is inefficient for larger device tree files.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 tools/dtoc/.gitignore      |   1 +
 tools/dtoc/fdt_fallback.py | 207 +++++++++++++++++++++++++++++++++++++++++++++
 tools/dtoc/fdt_util.py     |  71 ++++++++++++++++
 3 files changed, 279 insertions(+)
 create mode 100644 tools/dtoc/.gitignore
 create mode 100644 tools/dtoc/fdt_fallback.py
 create mode 100644 tools/dtoc/fdt_util.py

diff --git a/tools/dtoc/.gitignore b/tools/dtoc/.gitignore
new file mode 100644
index 0000000..0d20b64
--- /dev/null
+++ b/tools/dtoc/.gitignore
@@ -0,0 +1 @@
+*.pyc
diff --git a/tools/dtoc/fdt_fallback.py b/tools/dtoc/fdt_fallback.py
new file mode 100644
index 0000000..14decf3
--- /dev/null
+++ b/tools/dtoc/fdt_fallback.py
@@ -0,0 +1,207 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+import command
+import fdt_util
+import sys
+
+# This deals with a device tree, presenting it as a list of Node and Prop
+# objects, representing nodes and properties, respectively.
+#
+# This implementation uses the fdtget tool to access the device tree, so it
+# is not very efficient for larger trees. The tool is called once for each
+# node and property in the tree.
+
+class Prop:
+    """A device tree property
+
+    Properties:
+        name: Property name (as per the device tree)
+        value: Property value as a string of bytes, or a list of strings of
+            bytes
+        type: Value type
+    """
+    def __init__(self, name, byte_list_str):
+        self.name = name
+        self.value = None
+        if not byte_list_str.strip():
+            self.type = fdt_util.TYPE_BOOL
+            return
+        bytes = [chr(int(byte, 16)) for byte in byte_list_str.strip().split(' ')]
+        self.type, self.value = fdt_util.BytesToValue(''.join(bytes))
+
+    def GetPhandle(self):
+        """Get a (single) phandle value from a property
+
+        Gets the phandle valuie from a property and returns it as an integer
+        """
+        return fdt_util.fdt32_to_cpu(self.value[:4])
+
+    def Widen(self, newprop):
+        """Figure out which property type is more general
+
+        Given a current property and a new property, this function returns the
+        one that is less specific as to type. The less specific property will
+        be ble to represent the data in the more specific property. This is
+        used for things like:
+
+            node1 {
+                compatible = "fred";
+                value = <1>;
+            };
+            node1 {
+                compatible = "fred";
+                value = <1 2>;
+            };
+
+        He we want to use an int array for 'value'. The first property
+        suggests that a single int is enough, but the second one shows that
+        it is not. Calling this function with these two propertes would
+        update the current property to be like the second, since it is less
+        specific.
+        """
+        if newprop.type < self.type:
+            self.type = newprop.type
+
+        if type(newprop.value) == list and type(self.value) != list:
+            self.value = newprop.value
+
+class Node:
+    """A device tree node
+
+    Properties:
+        name: Device tree node tname
+        path: Full path to node, along with the node name itself
+        _fdt: Device tree object
+        subnodes: A list of subnodes for this node, each a Node object
+        props: A dict of properties for this node, each a Prop object.
+            Keyed by property name
+    """
+    def __init__(self, fdt, name, path):
+        self.name = name
+        self.path = path
+        self._fdt = fdt
+        self.subnodes = []
+        self.props = {}
+
+    def Scan(self):
+        """Scan a node's properties and subnodes
+
+        This fills in the props and subnodes properties, recursively
+        searching into subnodes so that the entire tree is built.
+        """
+        for name, byte_list_str in self._fdt.GetProps(self.path).iteritems():
+            prop = Prop(name, byte_list_str)
+            self.props[name] = prop
+
+        for name in self._fdt.GetSubNodes(self.path):
+            sep = '' if self.path[-1] == '/' else '/'
+            path = self.path + sep + name
+            node = Node(self._fdt, name, path)
+            self.subnodes.append(node)
+
+            node.Scan()
+
+
+class Fdt:
+    """Provides simple access to a flat device tree blob.
+
+    Properties:
+      fname: Filename of fdt
+      _root: Root of device tree (a Node object)
+    """
+
+    def __init__(self, fname):
+        self.fname = fname
+
+    def Scan(self):
+        """Scan a device tree, building up a tree of Node objects
+
+        This fills in the self._root property
+        """
+        self._root = Node(self, '/', '/')
+        self._root.Scan()
+
+    def GetRoot(self):
+        """Get the root Node of the device tree
+
+        Returns:
+            The root Node object
+        """
+        return self._root
+
+    def GetSubNodes(self, node):
+        """Returns a list of sub-nodes of a given node
+
+        Args:
+            node: Node name to return children from
+
+        Returns:
+            List of children in the node (each a string node name)
+
+        Raises:
+            CmdError: if the node does not exist.
+        """
+        out = command.Output('fdtget', self.fname, '-l', node)
+        return out.strip().splitlines()
+
+    def GetProps(self, node, convert_dashes=False):
+        """Get all properties from a node
+
+        Args:
+            node: full path to node name to look in
+            convert_dashes: True to convert - to _ in node names
+
+        Returns:
+            A dictionary containing all the properties, indexed by node name.
+            The entries are simply strings - no decoding of lists or numbers
+            is done.
+
+        Raises:
+            CmdError: if the node does not exist.
+        """
+        out = command.Output('fdtget', self.fname, node, '-p')
+        props = out.strip().splitlines()
+        props_dict = {}
+        for prop in props:
+            name = prop
+            if convert_dashes:
+                prop = re.sub('-', '_', prop)
+            props_dict[prop] = self.GetProp(node, name)
+        return props_dict
+
+    def GetProp(self, node, prop, default=None, typespec=None):
+        """Get a property from a device tree.
+
+        This looks up the given node and property, and returns the value as a
+        string,
+
+        If the node or property does not exist, this will return the default
+        value.
+
+        Args:
+            node: Full path to node to look up.
+            prop: Property name to look up.
+            default: Default value to return if nothing is present in the fdt,
+                or None to raise in this case. This will be converted to a
+                string.
+            typespec: Type character to use (None for default, 's' for string)
+
+        Returns:
+            string containing the property value.
+
+        Raises:
+            CmdError: if the property does not exist and no default is provided.
+        """
+        args = [self.fname, node, prop, '-t', 'bx']
+        if default is not None:
+          args += ['-d', str(default)]
+        if typespec is not None:
+          args += ['-t%s' % typespec]
+        out = command.Output('fdtget', *args)
+        return out.strip()
diff --git a/tools/dtoc/fdt_util.py b/tools/dtoc/fdt_util.py
new file mode 100644
index 0000000..dd689fb
--- /dev/null
+++ b/tools/dtoc/fdt_util.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+import struct
+
+# A list of types we support
+(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4)
+
+def BytesToValue(bytes):
+    """Converts a string of bytes into a type and value
+
+    Args:
+        A string containing bytes
+
+    Return:
+        A tuple:
+            Type of data
+            Data, either a single element or a list of elements. Each element
+            is one of:
+                TYPE_STRING: string value from the property
+                TYPE_INT: a byte-swapped integer
+                TYPE_BYTE: a byte
+    """
+    size = len(bytes)
+    strings = bytes.split('\0')
+    is_string = True
+    count = len(strings) - 1
+    if count > 0 and not strings[-1]:
+        for string in strings[:-1]:
+            if not string:
+                is_string = False
+                break
+            for ch in string:
+                if ch < ' ' or ch > '~':
+                    is_string = False
+                    break
+    else:
+        is_string = False
+    if is_string:
+        if count == 1:
+            return TYPE_STRING, strings[0]
+        else:
+            return TYPE_STRING, strings[:-1]
+    if size % 4:
+        if size == 1:
+            return TYPE_BYTE, bytes[0]
+        else:
+            return TYPE_BYTE, list(bytes)
+    val = []
+    for i in range(0, size, 4):
+        val.append(bytes[i:i + 4])
+    if size == 4:
+        return TYPE_INT, val[0]
+    else:
+        return TYPE_INT, val
+
+def fdt32_to_cpu(val):
+    """Convert a device tree cell to an integer
+
+    Args:
+        Value to convert (4-character string representing the cell value)
+
+    Return:
+        A native-endian integer value
+    """
+    return struct.unpack(">I", val)[0]
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 29/55] dm: Add a tool to generate C code from a device tree
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (27 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 28/55] dm: Add a library to provide simple device-tree access Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 30/55] dm: Makefile: Build of-platdata files when the feature is enabled Simon Glass
                   ` (25 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This tool can produce C struct definitions and C platform data tables.
This is used to support the of-platdata feature.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 tools/dtoc/dtoc    |   1 +
 tools/dtoc/dtoc.py | 365 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 366 insertions(+)
 create mode 120000 tools/dtoc/dtoc
 create mode 100755 tools/dtoc/dtoc.py

diff --git a/tools/dtoc/dtoc b/tools/dtoc/dtoc
new file mode 120000
index 0000000..896ca44
--- /dev/null
+++ b/tools/dtoc/dtoc
@@ -0,0 +1 @@
+dtoc.py
\ No newline at end of file
diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py
new file mode 100755
index 0000000..6a2f6ef
--- /dev/null
+++ b/tools/dtoc/dtoc.py
@@ -0,0 +1,365 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+from optparse import OptionError, OptionParser
+import os
+import sys
+
+import fdt_util
+
+# Bring in the patman libraries
+our_path = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(our_path, '../patman'))
+
+# Bring in either the normal fdt library (which relies on libfdt) or the
+# fallback one (which uses fdtget and is slower). Both provide the same
+# interfface for this file to use.
+try:
+    from fdt import Fdt
+    import fdt
+    have_libfdt = True
+except ImportError:
+    have_libfdt = False
+    from fdt_fallback import Fdt
+    import fdt_fallback as fdt
+
+import struct
+
+# When we see these properties we ignore them - i.e. do not create a structure member
+PROP_IGNORE_LIST = [
+    '#address-cells',
+    '#gpio-cells',
+    '#size-cells',
+    'compatible',
+    'linux,phandle',
+    "status",
+    'phandle',
+]
+
+# C type declarations for the tyues we support
+TYPE_NAMES = {
+    fdt_util.TYPE_INT: 'fdt32_t',
+    fdt_util.TYPE_BYTE: 'unsigned char',
+    fdt_util.TYPE_STRING: 'const char *',
+    fdt_util.TYPE_BOOL: 'bool',
+};
+
+STRUCT_PREFIX = 'dtd_'
+VAL_PREFIX = 'dtv_'
+
+def Conv_name_to_c(name):
+    """Convert a device-tree name to a C identifier
+
+    Args:
+        name:   Name to convert
+    Return:
+        String containing the C version of this name
+    """
+    str = name.replace('@', '_at_')
+    str = str.replace('-', '_')
+    str = str.replace(',', '_')
+    str = str.replace('/', '__')
+    return str
+
+def TabTo(num_tabs, str):
+    if len(str) >= num_tabs * 8:
+        return str + ' '
+    return str + '\t' * (num_tabs - len(str) / 8)
+
+class DtbPlatdata:
+    """Provide a means to convert device tree binary data to platform data
+
+    The output of this process is C structures which can be used in space-
+    constrained encvironments where the ~3KB code overhead of device tree
+    code is not affordable.
+
+    Properties:
+        fdt: Fdt object, referencing the device tree
+        _dtb_fname: Filename of the input device tree binary file
+        _valid_nodes: A list of Node object with compatible strings
+        _options: Command-line options
+        _phandle_node: A dict of nodes indexed by phandle number (1, 2...)
+        _outfile: The current output file (sys.stdout or a real file)
+        _lines: Stashed list of output lines for outputting in the future
+        _phandle_node: A dict of Nodes indexed by phandle (an integer)
+    """
+    def __init__(self, dtb_fname, options):
+        self._dtb_fname = dtb_fname
+        self._valid_nodes = None
+        self._options = options
+        self._phandle_node = {}
+        self._outfile = None
+        self._lines = []
+
+    def SetupOutput(self, fname):
+        """Set up the output destination
+
+        Once this is done, future calls to self.Out() will output to this
+        file.
+
+        Args:
+            fname: Filename to send output to, or '-' for stdout
+        """
+        if fname == '-':
+            self._outfile = sys.stdout
+        else:
+            self._outfile = open(fname, 'w')
+
+    def Out(self, str):
+        """Output a string to the output file
+
+        Args:
+            str: String to output
+        """
+        self._outfile.write(str)
+
+    def Buf(self, str):
+        """Buffer up a string to send later
+
+        Args:
+            str: String to add to our 'buffer' list
+        """
+        self._lines.append(str)
+
+    def GetBuf(self):
+        """Get the contents of the output buffer, and clear it
+
+        Returns:
+            The output buffer, which is then cleared for future use
+        """
+        lines = self._lines
+        self._lines = []
+        return lines
+
+    def GetValue(self, type, value):
+        """Get a value as a C expression
+
+        For integers this returns a byte-swapped (little-endian) hex string
+        For bytes this returns a hex string, e.g. 0x12
+        For strings this returns a literal string enclosed in quotes
+        For booleans this return 'true'
+
+        Args:
+            type: Data type (fdt_util)
+            value: Data value, as a string of bytes
+        """
+        if type == fdt_util.TYPE_INT:
+            return '%#x' % fdt_util.fdt32_to_cpu(value)
+        elif type == fdt_util.TYPE_BYTE:
+            return '%#x' % ord(value[0])
+        elif type == fdt_util.TYPE_STRING:
+            return '"%s"' % value
+        elif type == fdt_util.TYPE_BOOL:
+            return 'true'
+
+    def GetCompatName(self, node):
+        """Get a node's first compatible string as a C identifier
+
+        Args:
+            node: Node object to check
+        Return:
+            C identifier for the first compatible string
+        """
+        compat = node.props['compatible'].value
+        if type(compat) == list:
+            compat = compat[0]
+        return Conv_name_to_c(compat)
+
+    def ScanDtb(self):
+        """Scan the device tree to obtain a tree of notes and properties
+
+        Once this is done, self.fdt.GetRoot() can be called to obtain the
+        device tree root node, and progress from there.
+        """
+        self.fdt = Fdt(self._dtb_fname)
+        self.fdt.Scan()
+
+    def ScanTree(self):
+        """Scan the device tree for useful information
+
+        This fills in the following properties:
+            _phandle_node: A dict of Nodes indexed by phandle (an integer)
+            _valid_nodes: A list of nodes we wish to consider include in the
+                platform data
+        """
+        node_list = []
+        self._phandle_node = {}
+        for node in self.fdt.GetRoot().subnodes:
+            if 'compatible' in node.props:
+                status = node.props.get('status')
+                if (not options.include_disabled and not status or
+                    status.value != 'disabled'):
+                    node_list.append(node)
+                    phandle_prop = node.props.get('phandle')
+                    if phandle_prop:
+                        phandle = phandle_prop.GetPhandle()
+                        self._phandle_node[phandle] = node
+
+        self._valid_nodes = node_list
+
+    def IsPhandle(self, prop):
+        """Check if a node contains phandles
+
+        We have no reliable way of detecting whether a node uses a phandle
+        or not. As an interim measure, use a list of known property names.
+
+        Args:
+            prop: Prop object to check
+        Return:
+            True if the object value contains phandles, else False
+        """
+        if prop.name in ['clocks']:
+            return True
+        return False
+
+    def GenerateStructs(self):
+        """Generate struct defintions for the platform data
+
+        This writes out the body of a header file consisting of structure
+        definitions for node in self._valid_nodes. See the documentation in
+        README.of-plat for more information.
+        """
+        self.Out('#include <stdbool.h>\n')
+        self.Out('#include <libfdt.h>\n')
+
+        # Build a dict keyed by C struct name containing a dict of Prop
+        # object for each struct field (keyed by property name). Where the
+        # same struct appears multiple times, try to use the 'widest'
+        # property, i.e. the one with a type which can express all others.
+        structs = {}
+        for node in self._valid_nodes:
+            node_name = self.GetCompatName(node)
+            fields = {}
+            for name, prop in node.props.iteritems():
+                if name not in PROP_IGNORE_LIST and name[0] != '#':
+                    fields[name] = prop
+            if node_name in structs:
+                struct = structs[node_name]
+                for name, prop in fields.iteritems():
+                    oldprop = struct.get(name)
+                    if oldprop:
+                        struct[name].Widen(oldprop)
+                    else:
+                        struct[name] = prop
+            else:
+                structs[node_name] = fields
+
+        # Output the struct definition
+        for name in sorted(structs):
+            self.Out('struct %s%s {\n' % (STRUCT_PREFIX, name));
+            for pname in sorted(structs[name]):
+                prop = structs[name][pname]
+                if self.IsPhandle(prop):
+                    # For phandles, include a reference to the target
+                    self.Out('\t%s%s[%d]' % (TabTo(2, 'struct phandle_2_cell'),
+                                             Conv_name_to_c(prop.name),
+                                             len(prop.value) / 2))
+                else:
+                    ptype = TYPE_NAMES[prop.type]
+                    self.Out('\t%s%s' % (TabTo(2, ptype), Conv_name_to_c(prop.name)))
+                    if type(prop.value) == list:
+                        self.Out('[%d]' % len(prop.value))
+                self.Out(';\n')
+            self.Out('};\n')
+
+    def GenerateTables(self):
+        """Generate device defintions for the platform data
+
+        This writes out C platform data initialisation data and
+        U_BOOT_DEVICE() declarations for each valid node. See the
+        documentation in README.of-plat for more information.
+        """
+        self.Out('#include <common.h>\n')
+        self.Out('#include <dm.h>\n')
+        self.Out('#include <dt-structs.h>\n')
+        self.Out('\n')
+        node_txt_list = []
+        for node in self._valid_nodes:
+            struct_name = self.GetCompatName(node)
+            var_name = Conv_name_to_c(node.name)
+            self.Buf('static struct %s%s %s%s = {\n' %
+                (STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name))
+            for pname, prop in node.props.iteritems():
+                if pname in PROP_IGNORE_LIST or pname[0] == '#':
+                    continue
+                ptype = TYPE_NAMES[prop.type]
+                member_name = Conv_name_to_c(prop.name)
+                self.Buf('\t%s= ' % TabTo(3, '.' + member_name))
+
+                # Special handling for lists
+                if type(prop.value) == list:
+                    self.Buf('{')
+                    vals = []
+                    # For phandles, output a reference to the platform data
+                    # of the target node.
+                    if self.IsPhandle(prop):
+                        # Process the list as pairs of (phandle, id)
+                        it = iter(prop.value)
+                        for phandle_cell, id_cell in zip(it, it):
+                            phandle = fdt_util.fdt32_to_cpu(phandle_cell)
+                            id = fdt_util.fdt32_to_cpu(id_cell)
+                            target_node = self._phandle_node[phandle]
+                            name = Conv_name_to_c(target_node.name)
+                            vals.append('{&%s%s, %d}' % (VAL_PREFIX, name, id))
+                    else:
+                        for val in prop.value:
+                            vals.append(self.GetValue(prop.type, val))
+                    self.Buf(', '.join(vals))
+                    self.Buf('}')
+                else:
+                    self.Buf(self.GetValue(prop.type, prop.value))
+                self.Buf(',\n')
+            self.Buf('};\n')
+
+            # Add a device declaration
+            self.Buf('U_BOOT_DEVICE(%s) = {\n' % var_name)
+            self.Buf('\t.name\t\t= "%s",\n' % struct_name)
+            self.Buf('\t.platdata\t= &%s%s,\n' % (VAL_PREFIX, var_name))
+            self.Buf('};\n')
+            self.Buf('\n')
+
+            # Output phandle target nodes first, since they may be referenced
+            # by others
+            if 'phandle' in node.props:
+                self.Out(''.join(self.GetBuf()))
+            else:
+                node_txt_list.append(self.GetBuf())
+
+        # Output all the nodes which are not phandle targets themselves, but
+        # may reference them. This avoids the need for forward declarations.
+        for node_txt in node_txt_list:
+            self.Out(''.join(node_txt))
+
+
+if __name__ != "__main__":
+    pass
+
+parser = OptionParser()
+parser.add_option('-d', '--dtb-file', action='store',
+                  help='Specify the .dtb input file')
+parser.add_option('--include-disabled', action='store_true',
+                  help='Include disabled nodes')
+parser.add_option('-o', '--output', action='store', default='-',
+                  help='Select output filename')
+(options, args) = parser.parse_args()
+
+if not args:
+    raise ValueError('Please specify a command: struct, platdata')
+
+plat = DtbPlatdata(options.dtb_file, options)
+plat.ScanDtb()
+plat.ScanTree()
+plat.SetupOutput(options.output)
+
+for cmd in args[0].split(','):
+    if cmd == 'struct':
+        plat.GenerateStructs()
+    elif cmd == 'platdata':
+        plat.GenerateTables()
+    else:
+        raise ValueError("Unknown command '%s': (use: struct, platdata)" % cmd)
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 30/55] dm: Makefile: Build of-platdata files when the feature is enabled
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (28 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 29/55] dm: Add a tool to generate C code from a device tree Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 31/55] dm: Add a more efficient libfdt library Simon Glass
                   ` (24 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Update the Makefile to call dtoc to create the C header and source files,
then build these into the image.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 scripts/Makefile.spl | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
index 2b5c995..324b03f 100644
--- a/scripts/Makefile.spl
+++ b/scripts/Makefile.spl
@@ -45,6 +45,7 @@ LDFLAGS_FINAL += --gc-sections
 # FIX ME
 cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) \
 							$(NOSTDINC_FLAGS)
+c_flags := $(KBUILD_CFLAGS) $(cpp_flags)
 
 HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makefile),y,n)
 
@@ -76,6 +77,9 @@ endif
 
 u-boot-spl-init := $(head-y)
 u-boot-spl-main := $(libs-y)
+ifdef CONFIG_SPL_OF_PLATDATA
+u-boot-spl-platdata := $(obj)/dts/dt-platdata.o
+endif
 
 # Linker Script
 ifdef CONFIG_SPL_LDSCRIPT
@@ -207,6 +211,32 @@ cmd_cpp_cfg = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) -ansi \
 $(obj)/$(SPL_BIN).cfg:	include/config.h FORCE
 	$(call if_changed,cpp_cfg)
 
+pythonpath = PYTHONPATH=tools
+
+quiet_cmd_dtocc = DTOC C  $@
+cmd_dtocc = $(pythonpath) $(srctree)/tools/dtoc/dtoc -d $(obj)/$(SPL_BIN).dtb -o $@ platdata
+
+quiet_cmd_dtoch = DTOC H  $@
+cmd_dtoch = $(pythonpath) $(srctree)/tools/dtoc/dtoc -d $(obj)/$(SPL_BIN).dtb -o $@ struct
+
+quiet_cmd_plat = PLAT    $@
+cmd_plat = $(CC) $(c_flags) -c $< -o $@
+
+$(obj)/dts/dt-platdata.o: $(obj)/dts/dt-platdata.c include/generated/dt-structs.h
+	$(call if_changed,plat)
+
+PHONY += dts_dir
+dts_dir:
+	$(shell [ -d $(obj)/dts ] || mkdir -p $(obj)/dts)
+
+include/generated/dt-structs.h: $(obj)/$(SPL_BIN).dtb dts_dir dtoc
+	$(call if_changed,dtoch)
+
+$(obj)/dts/dt-platdata.c: $(obj)/$(SPL_BIN).dtb dts_dir dtoc
+	$(call if_changed,dtocc)
+
+dtoc: #$(objtree)/tools/_libfdt.so
+
 ifdef CONFIG_SAMSUNG
 ifdef CONFIG_VAR_SIZE_SPL
 VAR_SIZE_PARAM = --vs
@@ -246,16 +276,19 @@ $(obj)/sunxi-spl.bin: $(obj)/$(SPL_BIN).bin FORCE
 quiet_cmd_u-boot-spl ?= LD      $@
       cmd_u-boot-spl ?= (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
 		       $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \
-		       $(patsubst $(obj)/%,%,$(u-boot-spl-main)) --end-group \
+		       $(patsubst $(obj)/%,%,$(u-boot-spl-main))  \
+		       $(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) \
+		       --end-group \
 		       $(PLATFORM_LIBS) -Map $(SPL_BIN).map -o $(SPL_BIN))
 
-$(obj)/$(SPL_BIN): $(u-boot-spl-init) $(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE
+$(obj)/$(SPL_BIN): $(u-boot-spl-platdata) $(u-boot-spl-init) \
+		$(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE
 	$(call if_changed,u-boot-spl)
 
 $(sort $(u-boot-spl-init) $(u-boot-spl-main)): $(u-boot-spl-dirs) ;
 
 PHONY += $(u-boot-spl-dirs)
-$(u-boot-spl-dirs):
+$(u-boot-spl-dirs): $(u-boot-spl-platdata)
 	$(Q)$(MAKE) $(build)=$@
 
 quiet_cmd_cpp_lds = LDS     $@
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 31/55] dm: Add a more efficient libfdt library
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (29 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 30/55] dm: Makefile: Build of-platdata files when the feature is enabled Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 32/55] Only build the libfdt python module if 'swig' is available Simon Glass
                   ` (23 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add a Python version of the libfdt library which contains enough features to
support the dtoc tool. This is only a very bare-bones implementation. It
requires the 'swig' to build.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 lib/libfdt/libfdt.swig    |  81 +++++++++++++++++++++
 lib/libfdt/setup.py       |  38 ++++++++++
 lib/libfdt/test_libfdt.py |  14 ++++
 scripts/Makefile.host     |   9 ++-
 tools/Makefile            |  11 +++
 tools/dtoc/fdt.py         | 174 ++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 325 insertions(+), 2 deletions(-)
 create mode 100644 lib/libfdt/libfdt.swig
 create mode 100644 lib/libfdt/setup.py
 create mode 100644 lib/libfdt/test_libfdt.py
 create mode 100644 tools/dtoc/fdt.py

diff --git a/lib/libfdt/libfdt.swig b/lib/libfdt/libfdt.swig
new file mode 100644
index 0000000..95c3e9e
--- /dev/null
+++ b/lib/libfdt/libfdt.swig
@@ -0,0 +1,81 @@
+/* File: libfdt.i */
+%module libfdt
+
+%{
+#define SWIG_FILE_WITH_INIT
+#include "libfdt.h"
+%}
+
+%pythoncode %{
+def Raise(errnum):
+    raise ValueError('Error %s' % fdt_strerror(errnum))
+
+def Name(fdt, offset):
+    name, len = fdt_get_name(fdt, offset)
+    return name
+
+def String(fdt, offset):
+    offset = fdt32_to_cpu(offset)
+    name = fdt_string(fdt, offset)
+    return name
+
+def swap32(x):
+    return (((x << 24) & 0xFF000000) |
+            ((x <<  8) & 0x00FF0000) |
+            ((x >>  8) & 0x0000FF00) |
+            ((x >> 24) & 0x000000FF))
+
+def fdt32_to_cpu(x):
+    return swap32(x)
+
+def Data(prop):
+    set_prop(prop)
+    return get_prop_data()
+%}
+
+%include "typemaps.i"
+%include "cstring.i"
+
+%typemap(in) void* = char*;
+
+typedef int fdt32_t;
+
+struct fdt_property {
+        fdt32_t tag;
+        fdt32_t len;
+        fdt32_t nameoff;
+        char data[0];
+};
+
+%inline %{
+    static struct fdt_property *cur_prop;
+
+    void set_prop(struct fdt_property *prop) {
+        cur_prop = prop;
+    }
+%}
+
+%cstring_output_allocate_size(char **s, int *sz, free(*$1));
+%inline %{
+    void get_prop_data(char **s, int *sz) {
+        *sz = fdt32_to_cpu(cur_prop->len);
+        *s = (char *)malloc(*sz);
+        if (!*s)
+            *sz = 0;
+        else
+            memcpy(*s, cur_prop + 1, *sz);
+    }
+%}
+
+const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
+int fdt_path_offset(const void *fdt, const char *path);
+int fdt_first_property_offset(const void *fdt, int nodeoffset);
+int fdt_next_property_offset(const void *fdt, int offset);
+const char *fdt_strerror(int errval);
+const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
+                                                      int offset,
+                                                      int *OUTPUT);
+const char *fdt_get_name(const void *fdt, int nodeoffset, int *OUTPUT);
+const char *fdt_string(const void *fdt, int stroffset);
+int fdt_first_subnode(const void *fdt, int offset);
+int fdt_next_subnode(const void *fdt, int offset);
diff --git a/lib/libfdt/setup.py b/lib/libfdt/setup.py
new file mode 100644
index 0000000..62e7bcc
--- /dev/null
+++ b/lib/libfdt/setup.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+
+"""
+setup.py file for SWIG libfdt
+"""
+
+from distutils.core import setup, Extension
+import os
+import sys
+
+# Don't cross-compile - always use the host compiler.
+del os.environ['CROSS_COMPILE']
+del os.environ['CC']
+
+progname = sys.argv[0]
+cflags = sys.argv[1]
+files = sys.argv[2:]
+
+if cflags:
+    cflags = [flag for flag in cflags.split(' ') if flag]
+else:
+    cflags = None
+
+libfdt_module = Extension(
+    '_libfdt',
+    sources = files,
+    extra_compile_args =  cflags
+)
+
+sys.argv = [progname, '--quiet', 'build_ext', '--inplace']
+
+setup (name = 'libfdt',
+       version = '0.1',
+       author      = "SWIG Docs",
+       description = """Simple swig libfdt from docs""",
+       ext_modules = [libfdt_module],
+       py_modules = ["libfdt"],
+       )
diff --git a/lib/libfdt/test_libfdt.py b/lib/libfdt/test_libfdt.py
new file mode 100644
index 0000000..14d0da4
--- /dev/null
+++ b/lib/libfdt/test_libfdt.py
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+
+import os
+import sys
+
+our_path = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(our_path, '../../b/sandbox_spl/tools'))
+
+import libfdt
+
+with open('b/sandbox_spl/u-boot.dtb') as fd:
+    fdt = fd.read()
+
+print libfdt.fdt_path_offset(fdt, "/aliases")
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
index bff8b5b..763a699 100644
--- a/scripts/Makefile.host
+++ b/scripts/Makefile.host
@@ -28,12 +28,16 @@ __hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
 # C code
 # Executables compiled from a single .c file
 host-csingle	:= $(foreach m,$(__hostprogs), \
-			$(if $($(m)-objs)$($(m)-cxxobjs),,$(m)))
+			$(if $($(m)-objs)$($(m)-cxxobjs)$($(m)-sharedobjs),,$(m)))
 
 # C executables linked based on several .o files
 host-cmulti	:= $(foreach m,$(__hostprogs),\
 		   $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
 
+# Shared object libraries
+host-shared	:= $(foreach m,$(__hostprogs),\
+		   $(if $($(m)-sharedobjs),$(m))))
+
 # Object (.o) files compiled from .c files
 host-cobjs	:= $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
 
@@ -59,6 +63,7 @@ host-cmulti	:= $(addprefix $(obj)/,$(host-cmulti))
 host-cobjs	:= $(addprefix $(obj)/,$(host-cobjs))
 host-cxxmulti	:= $(addprefix $(obj)/,$(host-cxxmulti))
 host-cxxobjs	:= $(addprefix $(obj)/,$(host-cxxobjs))
+host-shared	:= $(addprefix $(obj)/,$(host-shared))
 host-objdirs    := $(addprefix $(obj)/,$(host-objdirs))
 
 obj-dirs += $(host-objdirs)
@@ -128,4 +133,4 @@ $(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
 	$(call if_changed_dep,host-cxxobjs)
 
 targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
-	   $(host-cxxmulti) $(host-cxxobjs)
+	   $(host-cxxmulti) $(host-cxxobjs) $(host-shared)
diff --git a/tools/Makefile b/tools/Makefile
index 63355aa..a813217 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -107,6 +107,17 @@ mkimage-objs   := $(dumpimage-mkimage-objs) mkimage.o
 fit_info-objs   := $(dumpimage-mkimage-objs) fit_info.o
 fit_check_sign-objs   := $(dumpimage-mkimage-objs) fit_check_sign.o
 
+hostprogs-$(CONFIG_SPL_OF_PLATDATA) += _libfdt.so
+_libfdt.so-sharedobjs += $(LIBFDT_OBJS)
+libfdt:
+
+tools/_libfdt.so: $(patsubst %.o,%.c,$(LIBFDT_OBJS)) tools/libfdt_wrap.c
+	python $(srctree)/lib/libfdt/setup.py "$(_hostc_flags)" $^
+	mv _libfdt.so $@
+
+tools/libfdt_wrap.c: $(srctree)/lib/libfdt/libfdt.swig
+	swig -python -o $@ $<
+
 # TODO(sjg at chromium.org): Is this correct on Mac OS?
 
 ifneq ($(CONFIG_MX23)$(CONFIG_MX28),)
diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py
new file mode 100644
index 0000000..3787cb5
--- /dev/null
+++ b/tools/dtoc/fdt.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+import fdt_util
+import libfdt
+import sys
+
+# This deals with a device tree, presenting it as a list of Node and Prop
+# objects, representing nodes and properties, respectively.
+#
+# This implementation uses a libfdt Python library to access the device tree,
+# so it is fairly efficient.
+
+class Prop:
+    """A device tree property
+
+    Properties:
+        name: Property name (as per the device tree)
+        value: Property value as a string of bytes, or a list of strings of
+            bytes
+        type: Value type
+    """
+    def __init__(self, name, bytes):
+        self.name = name
+        self.value = None
+        if not bytes:
+            self.type = fdt_util.TYPE_BOOL
+            return
+        self.type, self.value = fdt_util.BytesToValue(bytes)
+
+    def GetPhandle(self):
+        """Get a (single) phandle value from a property
+
+        Gets the phandle valuie from a property and returns it as an integer
+        """
+        return fdt_util.fdt32_to_cpu(self.value[:4])
+
+    def Widen(self, newprop):
+        """Figure out which property type is more general
+
+        Given a current property and a new property, this function returns the
+        one that is less specific as to type. The less specific property will
+        be ble to represent the data in the more specific property. This is
+        used for things like:
+
+            node1 {
+                compatible = "fred";
+                value = <1>;
+            };
+            node1 {
+                compatible = "fred";
+                value = <1 2>;
+            };
+
+        He we want to use an int array for 'value'. The first property
+        suggests that a single int is enough, but the second one shows that
+        it is not. Calling this function with these two propertes would
+        update the current property to be like the second, since it is less
+        specific.
+        """
+        if newprop.type < self.type:
+            self.type = newprop.type
+
+        if type(newprop.value) == list and type(self.value) != list:
+            self.value = newprop.value
+
+
+class Node:
+    """A device tree node
+
+    Properties:
+        offset: Integer offset in the device tree
+        name: Device tree node tname
+        path: Full path to node, along with the node name itself
+        _fdt: Device tree object
+        subnodes: A list of subnodes for this node, each a Node object
+        props: A dict of properties for this node, each a Prop object.
+            Keyed by property name
+    """
+    def __init__(self, fdt, offset, name, path):
+        self.offset = offset
+        self.name = name
+        self.path = path
+        self._fdt = fdt
+        self.subnodes = []
+        self.props = {}
+
+    def Scan(self):
+        """Scan a node's properties and subnodes
+
+        This fills in the props and subnodes properties, recursively
+        searching into subnodes so that the entire tree is built.
+        """
+        self.props = self._fdt.GetProps(self.path)
+
+        offset = libfdt.fdt_first_subnode(self._fdt.GetFdt(), self.offset)
+        while offset >= 0:
+            sep = '' if self.path[-1] == '/' else '/'
+            name = libfdt.Name(self._fdt.GetFdt(), offset)
+            path = self.path + sep + name
+            node = Node(self._fdt, offset, name, path)
+            self.subnodes.append(node)
+
+            node.Scan()
+            offset = libfdt.fdt_next_subnode(self._fdt.GetFdt(), offset)
+
+
+class Fdt:
+    """Provides simple access to a flat device tree blob.
+
+    Properties:
+      fname: Filename of fdt
+      _root: Root of device tree (a Node object)
+    """
+
+    def __init__(self, fname):
+        self.fname = fname
+        with open(fname) as fd:
+            self._fdt = fd.read()
+
+    def GetFdt(self):
+        """Get the contents of the FDT
+
+        Returns:
+            The FDT contents as a string of bytes
+        """
+        return self._fdt
+
+    def Scan(self):
+        """Scan a device tree, building up a tree of Node objects
+
+        This fills in the self._root property
+        """
+        self._root = Node(self, 0, '/', '/')
+        self._root.Scan()
+
+    def GetRoot(self):
+        """Get the root Node of the device tree
+
+        Returns:
+            The root Node object
+        """
+        return self._root
+
+    def GetProps(self, node):
+        """Get all properties from a node.
+
+        Args:
+            node: Full path to node name to look in.
+
+        Returns:
+            A dictionary containing all the properties, indexed by node name.
+            The entries are Prop objects.
+
+        Raises:
+            ValueError: if the node does not exist.
+        """
+        offset = libfdt.fdt_path_offset(self._fdt, node)
+        if offset < 0:
+            libfdt.Raise(offset)
+        props_dict = {}
+        poffset = libfdt.fdt_first_property_offset(self._fdt, offset)
+        while poffset >= 0:
+            dprop, plen = libfdt.fdt_get_property_by_offset(self._fdt, poffset)
+            prop = Prop(libfdt.String(self._fdt, dprop.nameoff), libfdt.Data(dprop))
+            props_dict[prop.name] = prop
+
+            poffset = libfdt.fdt_next_property_offset(self._fdt, poffset)
+        return props_dict
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 32/55] Only build the libfdt python module if 'swig' is available
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (30 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 31/55] dm: Add a more efficient libfdt library Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 33/55] tiny-printf: Support assert() Simon Glass
                   ` (22 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

When swig is not available, we can still build correctly. So make this
optional. Add a comment about how to enable this build.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 tools/Makefile | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/Makefile b/tools/Makefile
index a813217..0300e38 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -107,7 +107,10 @@ mkimage-objs   := $(dumpimage-mkimage-objs) mkimage.o
 fit_info-objs   := $(dumpimage-mkimage-objs) fit_info.o
 fit_check_sign-objs   := $(dumpimage-mkimage-objs) fit_check_sign.o
 
-hostprogs-$(CONFIG_SPL_OF_PLATDATA) += _libfdt.so
+# Build a libfdt Python module if swig is available
+# Use 'sudo apt-get install swig libpython-dev' to enable this
+hostprogs-$(CONFIG_SPL_OF_PLATDATA) += \
+	$(if $(shell which swig),_libfdt.so)
 _libfdt.so-sharedobjs += $(LIBFDT_OBJS)
 libfdt:
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 33/55] tiny-printf: Support assert()
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (31 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 32/55] Only build the libfdt python module if 'swig' is available Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 34/55] dm: spl: Bind in all devices in SPL with of-platdata Simon Glass
                   ` (21 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

At present assert() is not supported with tiny-printf, so when DEBUG is
enabled a build error is generated for each assert().

Add an __assert_fail() function to correct this. It prints a message and
then hangs.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 lib/tiny-printf.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 3c65fc9..2aeee2a 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -175,3 +175,12 @@ int snprintf(char *buf, size_t size, const char *fmt, ...)
 
 	return ret;
 }
+
+void __assert_fail(const char *assertion, const char *file, unsigned line,
+		   const char *function)
+{
+	/* This will not return */
+	printf("%s:%u: %s: Assertion `%s' failed.", file, line, function,
+	       assertion);
+	hang();
+}
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 34/55] dm: spl: Bind in all devices in SPL with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (32 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 33/55] tiny-printf: Support assert() Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 35/55] dm: core: Rename DM_NAME_ALLOCED to DM_FLAG_NAME_ALLOCED Simon Glass
                   ` (20 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

When CONFIG_OF_PLATDATA is enabled, we cannot use the u-boot,dm-pre-reloc
device tree property since the device tree is not available. However,
dt-platdata.c only includes devices which would have been present in the
device tree, and we can assume that all such devices are needed for SPL.
If they were not needed, they would have been omitted to save space.

So in this case, bind all devices regardless of the u-boot,dm-pre-reloc
setting. This avoids needing to add a DM_FLAG_PRE_RELOC to every driver,
thus affecting U-Boot proper also.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 common/spl/spl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 59f41a1..12aed02 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -210,7 +210,8 @@ int spl_init(void)
 		}
 	}
 	if (IS_ENABLED(CONFIG_SPL_DM)) {
-		ret = dm_init_and_scan(true);
+		/* With CONFIG_OF_PLATDATA, bring in all devices */
+		ret = dm_init_and_scan(!CONFIG_IS_ENABLED(OF_PLATDATA));
 		if (ret) {
 			debug("dm_init_and_scan() returned error %d\n", ret);
 			return ret;
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 35/55] dm: core: Rename DM_NAME_ALLOCED to DM_FLAG_NAME_ALLOCED
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (33 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 34/55] dm: spl: Bind in all devices in SPL with of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 36/55] dtoc: Ignore the u-boot, dm-pre-reloc property Simon Glass
                   ` (19 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This is a flag. Adjust the name to be consistent with the other flags.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/device-remove.c | 2 +-
 drivers/core/device.c        | 2 +-
 include/dm/device.h          | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
index 0e56b23..a7f77b4 100644
--- a/drivers/core/device-remove.c
+++ b/drivers/core/device-remove.c
@@ -112,7 +112,7 @@ int device_unbind(struct udevice *dev)
 
 	devres_release_all(dev);
 
-	if (dev->flags & DM_NAME_ALLOCED)
+	if (dev->flags & DM_FLAG_NAME_ALLOCED)
 		free((char *)dev->name);
 	free(dev);
 
diff --git a/drivers/core/device.c b/drivers/core/device.c
index de52f07..d3b731e 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -727,7 +727,7 @@ bool device_is_last_sibling(struct udevice *dev)
 
 void device_set_name_alloced(struct udevice *dev)
 {
-	dev->flags |= DM_NAME_ALLOCED;
+	dev->flags |= DM_FLAG_NAME_ALLOCED;
 }
 
 int device_set_name(struct udevice *dev, const char *name)
diff --git a/include/dm/device.h b/include/dm/device.h
index f03bcd3..0259627 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -42,7 +42,7 @@ struct driver_info;
 #define DM_FLAG_BOUND			(1 << 6)
 
 /* Device name is allocated and should be freed on unbind() */
-#define DM_NAME_ALLOCED			(1 << 7)
+#define DM_FLAG_NAME_ALLOCED		(1 << 7)
 
 /**
  * struct udevice - An instance of a driver
@@ -540,7 +540,7 @@ int device_set_name(struct udevice *dev, const char *name);
 /**
  * device_set_name_alloced() - note that a device name is allocated
  *
- * This sets the DM_NAME_ALLOCED flag for the device, so that when it is
+ * This sets the DM_FLAG_NAME_ALLOCED flag for the device, so that when it is
  * unbound the name will be freed. This avoids memory leaks.
  *
  * @dev:	Device to update
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 36/55] dtoc: Ignore the u-boot, dm-pre-reloc property
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (34 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 35/55] dm: core: Rename DM_NAME_ALLOCED to DM_FLAG_NAME_ALLOCED Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 37/55] dm: Don't attach the device tree to SPL with of-platdata Simon Glass
                   ` (18 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This property is not useful for of-platdata, so omit it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 tools/dtoc/dtoc.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py
index 6a2f6ef..9f14e3f 100755
--- a/tools/dtoc/dtoc.py
+++ b/tools/dtoc/dtoc.py
@@ -39,6 +39,7 @@ PROP_IGNORE_LIST = [
     'linux,phandle',
     "status",
     'phandle',
+    'u-boot,dm-pre-reloc',
 ]
 
 # C type declarations for the tyues we support
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 37/55] dm: Don't attach the device tree to SPL with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (35 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 36/55] dtoc: Ignore the u-boot, dm-pre-reloc property Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 38/55] dm: core: Expand platdata for of-platdata devices Simon Glass
                   ` (17 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

When of-platdata is used in SPL we don't use the device tree. So there is no
point in attaching it. Adjust the Makefile to skip attaching the device tree
when of-platdata is enabled.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 scripts/Makefile.spl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
index 324b03f..3ba9742 100644
--- a/scripts/Makefile.spl
+++ b/scripts/Makefile.spl
@@ -173,7 +173,7 @@ cmd_cat = cat $(filter-out $(PHONY), $^) > $@
 quiet_cmd_copy = COPY    $@
       cmd_copy = cp $< $@
 
-ifeq ($(CONFIG_SPL_OF_CONTROL)$(CONFIG_OF_SEPARATE),yy)
+ifeq ($(CONFIG_SPL_OF_CONTROL)$(CONFIG_OF_SEPARATE)$(CONFIG_SPL_OF_PLATDATA),yy)
 $(obj)/$(SPL_BIN)-dtb.bin: $(obj)/$(SPL_BIN)-nodtb.bin $(obj)/$(SPL_BIN)-pad.bin \
 		$(obj)/$(SPL_BIN).dtb FORCE
 	$(call if_changed,cat)
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 38/55] dm: core: Expand platdata for of-platdata devices
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (36 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 37/55] dm: Don't attach the device tree to SPL with of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 39/55] dm: core: Move regmap allocation into a separate function Simon Glass
                   ` (16 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Devices which use of-platdata have their own platdata. However, in many
cases the driver will have its own auto-alloced platdata, for use with the
device tree. The ofdata_to_platdata() method converts the device tree
settings to platdata.

With of-platdata we would not normally allocate the platdata since it is
provided by the U_BOOT_DEVICE() declaration. However this is inconvenient
since the of-platdata struct is closely tied to the device tree properties.
It is unlikely to exactly match the platdata needed by the driver.

In fact a useful approach is to declare platdata in the driver like this:

struct r3288_mmc_platdata {
	struct dtd_rockchip_rk3288_dw_mshc of_platdata;
	/* the 'normal' fields go here */
};

In this case we have dt_platadata available, but the normal fields are not
present, since ofdata_to_platdata() is never called. In fact driver model
doesn't allocate any space for the 'normal' fields, since it sees that there
is already platform data attached to the device.

To make this easier, adjust driver model to allocate the full size of the
struct (i.e. platdata_auto_alloc_size from the driver) and copy in the
of-platdata. This means that when the driver's bind() method is called,
the of-platdata will be present, followed by zero bytes for the empty
'normal field' portion.

A new DM_FLAG_OF_PLATDATA flag is available that indicates that the platdata
came from of-platdata. When the allocation/copy happens, the
DM_FLAG_ALLOC_PDATA flag will be set as well. The dtoc tool is updated to
output the platdata_size field, since U-Boot has no other way of knowing
the size of the of-platdata struct.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/device.c | 41 ++++++++++++++++++++++++++++++-----------
 include/dm/device.h   |  2 ++
 include/dm/platdata.h |  5 +++++
 tools/dtoc/dtoc.py    |  2 ++
 4 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/drivers/core/device.c b/drivers/core/device.c
index d3b731e..f6d867c 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -29,7 +29,7 @@ DECLARE_GLOBAL_DATA_PTR;
 static int device_bind_common(struct udevice *parent, const struct driver *drv,
 			      const char *name, void *platdata,
 			      ulong driver_data, int of_offset,
-			      struct udevice **devp)
+			      uint of_platdata_size, struct udevice **devp)
 {
 	struct udevice *dev;
 	struct uclass *uc;
@@ -83,12 +83,27 @@ static int device_bind_common(struct udevice *parent, const struct driver *drv,
 		}
 	}
 
-	if (!dev->platdata && drv->platdata_auto_alloc_size) {
-		dev->flags |= DM_FLAG_ALLOC_PDATA;
-		dev->platdata = calloc(1, drv->platdata_auto_alloc_size);
-		if (!dev->platdata) {
-			ret = -ENOMEM;
-			goto fail_alloc1;
+	if (drv->platdata_auto_alloc_size) {
+		bool alloc = !platdata;
+
+		if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
+			if (of_platdata_size)
+				dev->flags |= DM_FLAG_OF_PLATDATA;
+			if (of_platdata_size < drv->platdata_auto_alloc_size)
+				alloc = true;
+		}
+		if (alloc) {
+			dev->flags |= DM_FLAG_ALLOC_PDATA;
+			dev->platdata = calloc(1,
+					       drv->platdata_auto_alloc_size);
+			if (!dev->platdata) {
+				ret = -ENOMEM;
+				goto fail_alloc1;
+			}
+			if (CONFIG_IS_ENABLED(OF_PLATDATA) && platdata) {
+				memcpy(dev->platdata, platdata,
+				       of_platdata_size);
+			}
 		}
 	}
 
@@ -201,14 +216,14 @@ int device_bind_with_driver_data(struct udevice *parent,
 				 struct udevice **devp)
 {
 	return device_bind_common(parent, drv, name, NULL, driver_data,
-				  of_offset, devp);
+				  of_offset, 0, devp);
 }
 
 int device_bind(struct udevice *parent, const struct driver *drv,
 		const char *name, void *platdata, int of_offset,
 		struct udevice **devp)
 {
-	return device_bind_common(parent, drv, name, platdata, 0, of_offset,
+	return device_bind_common(parent, drv, name, platdata, 0, of_offset, 0,
 				  devp);
 }
 
@@ -216,6 +231,7 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
 			const struct driver_info *info, struct udevice **devp)
 {
 	struct driver *drv;
+	uint platdata_size = 0;
 
 	drv = lists_driver_lookup_name(info->name);
 	if (!drv)
@@ -223,8 +239,11 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
 	if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
 		return -EPERM;
 
-	return device_bind(parent, drv, info->name, (void *)info->platdata,
-			   -1, devp);
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	platdata_size = info->platdata_size;
+#endif
+	return device_bind_common(parent, drv, info->name,
+			(void *)info->platdata, 0, -1, platdata_size, devp);
 }
 
 static void *alloc_priv(int size, uint flags)
diff --git a/include/dm/device.h b/include/dm/device.h
index 0259627..654e3eb 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -44,6 +44,8 @@ struct driver_info;
 /* Device name is allocated and should be freed on unbind() */
 #define DM_FLAG_NAME_ALLOCED		(1 << 7)
 
+#define DM_FLAG_OF_PLATDATA		(1 << 8)
+
 /**
  * struct udevice - An instance of a driver
  *
diff --git a/include/dm/platdata.h b/include/dm/platdata.h
index 6f4f001..488b2ab 100644
--- a/include/dm/platdata.h
+++ b/include/dm/platdata.h
@@ -22,10 +22,15 @@
  *
  * @name:	Driver name
  * @platdata:	Driver-specific platform data
+ * @platdata_size: Size of platform data structure
+ * @flags:	Platform data flags (DM_FLAG_...)
  */
 struct driver_info {
 	const char *name;
 	const void *platdata;
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	uint platdata_size;
+#endif
 };
 
 /**
diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py
index 9f14e3f..31f0e94 100755
--- a/tools/dtoc/dtoc.py
+++ b/tools/dtoc/dtoc.py
@@ -321,6 +321,8 @@ class DtbPlatdata:
             self.Buf('U_BOOT_DEVICE(%s) = {\n' % var_name)
             self.Buf('\t.name\t\t= "%s",\n' % struct_name)
             self.Buf('\t.platdata\t= &%s%s,\n' % (VAL_PREFIX, var_name))
+            self.Buf('\t.platdata_size\t= sizeof(%s%s),\n' %
+                     (VAL_PREFIX, var_name))
             self.Buf('};\n')
             self.Buf('\n')
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 39/55] dm: core: Move regmap allocation into a separate function
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (37 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 38/55] dm: core: Expand platdata for of-platdata devices Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 40/55] dm: core: Add an implementation of regmap_init_mem_platdata() Simon Glass
                   ` (15 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

We plan to add a new way of creating a regmap for of-platdata. Move the
allocation code into a separate function so that it can be shared.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/regmap.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
index 7e073cf..dcb1a30 100644
--- a/drivers/core/regmap.c
+++ b/drivers/core/regmap.c
@@ -15,6 +15,27 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static struct regmap *regmap_alloc_count(int count)
+{
+	struct regmap *map;
+
+	map = malloc(sizeof(struct regmap));
+	if (!map)
+		return NULL;
+	if (count <= 1) {
+		map->range = &map->base_range;
+	} else {
+		map->range = malloc(count * sizeof(struct regmap_range));
+		if (!map->range) {
+			free(map);
+			return NULL;
+		}
+	}
+	map->range_count = count;
+
+	return map;
+}
+
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
 int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
 			     struct regmap **mapp)
@@ -45,22 +66,11 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
 	if (!cell || !count)
 		return -EINVAL;
 
-	map = malloc(sizeof(struct regmap));
+	map = regmap_alloc_count(count);
 	if (!map)
 		return -ENOMEM;
 
-	if (count <= 1) {
-		map->range = &map->base_range;
-	} else {
-		map->range = malloc(count * sizeof(struct regmap_range));
-		if (!map->range) {
-			free(map);
-			return -ENOMEM;
-		}
-	}
-
 	map->base = fdtdec_get_number(cell, addr_len);
-	map->range_count = count;
 
 	for (range = map->range; count > 0;
 	     count--, cell += both_len, range++) {
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 40/55] dm: core: Add an implementation of regmap_init_mem_platdata()
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (38 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 39/55] dm: core: Move regmap allocation into a separate function Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 41/55] dm: serial: ns16550: Update to support of-platdata Simon Glass
                   ` (14 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add an implementation of this function which mirrors the functions of the
automatic device-tree implementation. This can be used with of-platdata to
create regmaps.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/core/regmap.c | 18 ++++++++++++++++--
 include/regmap.h      | 15 ++++++++++++++-
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
index dcb1a30..0299ff0 100644
--- a/drivers/core/regmap.c
+++ b/drivers/core/regmap.c
@@ -37,10 +37,24 @@ static struct regmap *regmap_alloc_count(int count)
 }
 
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
-int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
+int regmap_init_mem_platdata(struct udevice *dev, u32 *reg, int count,
 			     struct regmap **mapp)
 {
-	/* TODO(sjg at chromium.org): Implement this when needed */
+	struct regmap_range *range;
+	struct regmap *map;
+
+	map = regmap_alloc_count(count);
+	if (!map)
+		return -ENOMEM;
+
+	map->base = *reg;
+	for (range = map->range; count > 0; reg += 2, range++, count--) {
+		range->start = *reg;
+		range->size = reg[1];
+	}
+
+	*mapp = map;
+
 	return 0;
 }
 #else
diff --git a/include/regmap.h b/include/regmap.h
index 922b39f..1eed94e 100644
--- a/include/regmap.h
+++ b/include/regmap.h
@@ -56,7 +56,20 @@ int regmap_read(struct regmap *map, uint offset, uint *valp);
  */
 int regmap_init_mem(struct udevice *dev, struct regmap **mapp);
 
-int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
+/**
+ * regmap_init_mem_platdata() - Set up a new memory register map for of-platdata
+ *
+ * This creates a new regmap with a list of regions passed in, rather than
+ * using the device tree. It only supports 32-bit machines.
+ *
+ * Use regmap_uninit() to free it.
+ *
+ * @dev:	Device that uses this map
+ * @reg:	List of address, size pairs
+ * @count:	Number of pairs (e.g. 1 if the regmap has a single entry)
+ * @mapp:	Returns allocated map
+ */
+int regmap_init_mem_platdata(struct udevice *dev, u32 *reg, int count,
 			     struct regmap **mapp);
 
 /**
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 41/55] dm: serial: ns16550: Update to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (39 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 40/55] dm: core: Add an implementation of regmap_init_mem_platdata() Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 42/55] rockchip: serial: Add an of-platdata driver for rockchip Simon Glass
                   ` (13 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

With of-platdata this driver cannot know the format of the of-platdata
struct, so we cannot use generic code for accessing the of-platdata. Each
SoC that uses this driver will need to set up ns16550's platdata for it.
So don't compile in the generic code.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/serial/ns16550.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index c6cb3eb..88fca15 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -347,7 +347,7 @@ int ns16550_serial_probe(struct udevice *dev)
 	return 0;
 }
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
 {
 	struct ns16550_platdata *plat = dev->platdata;
@@ -416,6 +416,7 @@ const struct dm_serial_ops ns16550_serial_ops = {
 	.setbrg = ns16550_serial_setbrg,
 };
 
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 /*
  * Please consider existing compatible strings before adding a new
@@ -452,4 +453,5 @@ U_BOOT_DRIVER(ns16550_serial) = {
 	.flags	= DM_FLAG_PRE_RELOC,
 };
 #endif
+#endif /* !OF_PLATDATA */
 #endif /* CONFIG_DM_SERIAL */
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 42/55] rockchip: serial: Add an of-platdata driver for rockchip
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (40 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 41/55] dm: serial: ns16550: Update to support of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 43/55] rockchip: Update the sdram-channel property to support of-platdata Simon Glass
                   ` (12 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add a driver that works with of-platdata. It sets up the platform data and
calls the standard ns16550 driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/serial/Kconfig           |  9 +++++++++
 drivers/serial/Makefile          |  3 +++
 drivers/serial/serial_rockchip.c | 43 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+)
 create mode 100644 drivers/serial/serial_rockchip.c

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 0e38903..9ff7234 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -312,6 +312,15 @@ config SYS_NS16550
 	  be used. It can be a constant or a function to get clock, eg,
 	  get_serial_clock().
 
+config ROCKCHIP_SERIAL
+	bool "Rockchip on-chip UART support"
+	depends on DM_SERIAL && SPL_OF_PLATDATA
+	help
+	  Select this to enable a debug UART for Rockchip devices when using
+	  CONFIG_OF_PLATDATA (i.e. a compiled-in device tree replacemenmt).
+	  This uses the ns16550 driver, converting the platdata from of-platdata
+	  to the ns16550 format.
+
 config SANDBOX_SERIAL
 	bool "Sandbox UART support"
 	depends on SANDBOX
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index e1e28de..2ea9a70 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -28,6 +28,9 @@ obj-$(CONFIG_S5P) += serial_s5p.o
 obj-$(CONFIG_MXC_UART) += serial_mxc.o
 obj-$(CONFIG_PXA_SERIAL) += serial_pxa.o
 obj-$(CONFIG_MESON_SERIAL) += serial_meson.o
+ifdef CONFIG_SPL_BUILD
+obj-$(CONFIG_ROCKCHIP_SERIAL) += serial_rockchip.o
+endif
 obj-$(CONFIG_S3C24X0_SERIAL) += serial_s3c24x0.o
 obj-$(CONFIG_XILINX_UARTLITE) += serial_xuartlite.o
 obj-$(CONFIG_SANDBOX_SERIAL) += sandbox.o
diff --git a/drivers/serial/serial_rockchip.c b/drivers/serial/serial_rockchip.c
new file mode 100644
index 0000000..6bac95a
--- /dev/null
+++ b/drivers/serial/serial_rockchip.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <dm.h>
+#include <dt-structs.h>
+#include <ns16550.h>
+#include <serial.h>
+#include <asm/arch/clock.h>
+
+struct rockchip_uart_platdata {
+	struct dtd_rockchip_rk3288_uart dtplat;
+	struct ns16550_platdata plat;
+};
+
+struct dtd_rockchip_rk3288_uart *dtplat, s_dtplat;
+
+static int rockchip_serial_probe(struct udevice *dev)
+{
+	struct rockchip_uart_platdata *plat = dev_get_platdata(dev);
+
+	/* Create some new platform data for the standard driver */
+	plat->plat.base = plat->dtplat.reg[0];
+	plat->plat.reg_shift = plat->dtplat.reg_shift;
+	plat->plat.clock = plat->dtplat.clock_frequency;
+	dev->platdata = &plat->plat;
+
+	return ns16550_serial_probe(dev);
+}
+
+U_BOOT_DRIVER(rockchip_rk3288_uart) = {
+	.name	= "rockchip_rk3288_uart",
+	.id	= UCLASS_SERIAL,
+	.priv_auto_alloc_size = sizeof(struct NS16550),
+	.platdata_auto_alloc_size = sizeof(struct rockchip_uart_platdata),
+	.probe	= rockchip_serial_probe,
+	.ops	= &ns16550_serial_ops,
+	.flags	= DM_FLAG_PRE_RELOC,
+};
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 43/55] rockchip: Update the sdram-channel property to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (41 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 42/55] rockchip: serial: Add an of-platdata driver for rockchip Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 44/55] rockchip: mmc: Move all DT decoding to ofdata_to_platdata() Simon Glass
                   ` (11 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add an extra byte so that this data is not byteswapped. Add a comment to
the code to explain the purpose.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/dts/rk3288-firefly.dts            | 3 ++-
 arch/arm/include/asm/arch-rockchip/sdram.h | 6 ++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/arm/dts/rk3288-firefly.dts b/arch/arm/dts/rk3288-firefly.dts
index aed8d3a..3176d50 100644
--- a/arch/arm/dts/rk3288-firefly.dts
+++ b/arch/arm/dts/rk3288-firefly.dts
@@ -30,7 +30,8 @@
 		0x5 0x0>;
 	rockchip,phy-timing = <0x48f9aab4 0xea0910 0x1002c200
 		0xa60 0x40 0x10 0x0>;
-	rockchip,sdram-channel = /bits/ 8 <0x1 0xa 0x3 0x2 0x1 0x0 0xf 0xf>;
+	/* Add a dummy value to cause of-platdata think this is bytes */
+	rockchip,sdram-channel = /bits/ 8 <0x1 0xa 0x3 0x2 0x1 0x0 0xf 0xf 0xff>;
 	rockchip,sdram-params = <0x30B25564 0x627 3 666000000 3 9 1>;
 };
 
diff --git a/arch/arm/include/asm/arch-rockchip/sdram.h b/arch/arm/include/asm/arch-rockchip/sdram.h
index d3de42d..c9e3001 100644
--- a/arch/arm/include/asm/arch-rockchip/sdram.h
+++ b/arch/arm/include/asm/arch-rockchip/sdram.h
@@ -24,6 +24,12 @@ struct rk3288_sdram_channel {
 	u8 row_3_4;
 	u8 cs0_row;
 	u8 cs1_row;
+	/*
+	 * For of-platdata, which would otherwise convert this into two
+	 * byte-swapped integers. With a size of 9 bytes, this struct will
+	 * appear in of-platdata as a byte array.
+	 */
+	u8 dummy;
 };
 
 struct rk3288_sdram_pctl_timing {
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 44/55] rockchip: mmc: Move all DT decoding to ofdata_to_platdata()
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (42 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 43/55] rockchip: Update the sdram-channel property to support of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 45/55] rockchip: mmc: Update the driver to support of-platdata Simon Glass
                   ` (10 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

It is more correct to avoid touching the device tree in the probe() method.
Update the driver to work this way.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/mmc/rockchip_dw_mmc.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
index 750ab9f..26004be 100644
--- a/drivers/mmc/rockchip_dw_mmc.c
+++ b/drivers/mmc/rockchip_dw_mmc.c
@@ -27,6 +27,9 @@ struct rockchip_dwmmc_priv {
 	struct udevice *clk;
 	int periph;
 	struct dwmci_host host;
+	int fifo_depth;
+	bool fifo_mode;
+	u32 minmax[2];
 };
 
 static uint rockchip_dwmmc_get_mmc_clk(struct dwmci_host *host, uint freq)
@@ -62,6 +65,16 @@ static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
 	else
 		host->dev_index = 1;
 
+	priv->fifo_depth = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+				    "fifo-depth", 0);
+	if (priv->fifo_depth < 0)
+		return -EINVAL;
+	priv->fifo_mode = fdtdec_get_bool(gd->fdt_blob, dev->of_offset,
+					  "fifo-mode");
+	if (fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
+				 "clock-freq-min-max", priv->minmax, 2))
+		return -EINVAL;
+
 	return 0;
 }
 
@@ -74,29 +87,18 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
 	struct rockchip_dwmmc_priv *priv = dev_get_priv(dev);
 	struct dwmci_host *host = &priv->host;
 	struct udevice *pwr_dev __maybe_unused;
-	u32 minmax[2];
 	int ret;
-	int fifo_depth;
 
 	ret = clk_get_by_index(dev, 0, &priv->clk);
 	if (ret < 0)
 		return ret;
 	priv->periph = ret;
 
-	if (fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
-				 "clock-freq-min-max", minmax, 2))
-		return -EINVAL;
-
-	fifo_depth = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
-				    "fifo-depth", 0);
-	if (fifo_depth < 0)
-		return -EINVAL;
-
 	host->fifoth_val = MSIZE(0x2) |
-		RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
+		RX_WMARK(priv->fifo_depth / 2 - 1) |
+		TX_WMARK(priv->fifo_depth / 2);
 
-	if (fdtdec_get_bool(gd->fdt_blob, dev->of_offset, "fifo-mode"))
-		host->fifo_mode = true;
+	host->fifo_mode = priv->fifo_mode;
 
 #ifdef CONFIG_PWRSEQ
 	/* Enable power if needed */
@@ -110,10 +112,10 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
 #endif
 #ifdef CONFIG_BLK
 	dwmci_setup_cfg(&plat->cfg, dev->name, host->buswidth, host->caps,
-			minmax[1], minmax[0]);
+			priv->minmax[1], priv->minmax[0]);
 	host->mmc = &plat->mmc;
 #else
-	ret = add_dwmci(host, minmax[1], minmax[0]);
+	ret = add_dwmci(host, priv->minmax[1], priv->minmax[0]);
 	if (ret)
 		return ret;
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 45/55] rockchip: mmc: Update the driver to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (43 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 44/55] rockchip: mmc: Move all DT decoding to ofdata_to_platdata() Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 46/55] rockchip: clk: Move all DT decoding to ofdata_to_platdata() Simon Glass
                   ` (9 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add support for of-platdata with rk3288. This requires decoding the
of-platdata struct and setting up the device from that. Also the driver
needs to be renamed to match the string that of-platdata will search for.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/mmc/rockchip_dw_mmc.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
index 26004be..cc16aed 100644
--- a/drivers/mmc/rockchip_dw_mmc.c
+++ b/drivers/mmc/rockchip_dw_mmc.c
@@ -7,8 +7,10 @@
 #include <common.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <dwmmc.h>
 #include <errno.h>
+#include <mapmem.h>
 #include <pwrseq.h>
 #include <syscon.h>
 #include <asm/gpio.h>
@@ -19,6 +21,9 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 struct rockchip_mmc_plat {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct dtd_rockchip_rk3288_dw_mshc dtplat;
+#endif
 	struct mmc_config cfg;
 	struct mmc mmc;
 };
@@ -49,6 +54,7 @@ static uint rockchip_dwmmc_get_mmc_clk(struct dwmci_host *host, uint freq)
 
 static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	struct rockchip_dwmmc_priv *priv = dev_get_priv(dev);
 	struct dwmci_host *host = &priv->host;
 
@@ -74,7 +80,7 @@ static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
 	if (fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
 				 "clock-freq-min-max", priv->minmax, 2))
 		return -EINVAL;
-
+#endif
 	return 0;
 }
 
@@ -89,9 +95,27 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
 	struct udevice *pwr_dev __maybe_unused;
 	int ret;
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct dtd_rockchip_rk3288_dw_mshc *dtplat = &plat->dtplat;
+
+	host->name = dev->name;
+	host->ioaddr = map_sysmem(dtplat->reg[0], dtplat->reg[1]);
+	host->buswidth = dtplat->bus_width;
+	host->get_mmc_clk = rockchip_dwmmc_get_mmc_clk;
+	host->priv = dev;
+	host->dev_index = 0;
+	priv->fifo_depth = dtplat->fifo_depth;
+	priv->fifo_mode = 0;
+	memcpy(priv->minmax, dtplat->clock_freq_min_max, sizeof(priv->minmax));
+
+	ret = clk_get_by_index_platdata(dev, 0, dtplat->clocks, &priv->clk);
+	if (ret < 0)
+		return ret;
+#else
 	ret = clk_get_by_index(dev, 0, &priv->clk);
 	if (ret < 0)
 		return ret;
+#endif
 	priv->periph = ret;
 
 	host->fifoth_val = MSIZE(0x2) |
@@ -147,7 +171,7 @@ static const struct udevice_id rockchip_dwmmc_ids[] = {
 };
 
 U_BOOT_DRIVER(rockchip_dwmmc_drv) = {
-	.name		= "rockchip_dwmmc",
+	.name		= "rockchip_rk3288_dw_mshc",
 	.id		= UCLASS_MMC,
 	.of_match	= rockchip_dwmmc_ids,
 	.ofdata_to_platdata = rockchip_dwmmc_ofdata_to_platdata,
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 46/55] rockchip: clk: Move all DT decoding to ofdata_to_platdata()
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (44 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 45/55] rockchip: mmc: Update the driver to support of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 47/55] rockchip: clk: Update the rk3288 driver to support of-platdata Simon Glass
                   ` (8 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

It is more correct to avoid touching the device tree in the probe() method.
Update the driver to work this way. Also add an error check on grf since if
that fails then we should not use it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/clk/clk_rk3288.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/clk/clk_rk3288.c b/drivers/clk/clk_rk3288.c
index d88893c..8a62b3d 100644
--- a/drivers/clk/clk_rk3288.c
+++ b/drivers/clk/clk_rk3288.c
@@ -835,6 +835,17 @@ static struct clk_ops rk3288_clk_ops = {
 	.get_periph_rate = rk3288_get_periph_rate,
 };
 
+static int rk3288_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3288_clk_plat *plat = dev_get_platdata(dev);
+	struct rk3288_clk_priv *priv = dev_get_priv(dev);
+
+	if (plat->clk_id == CLK_OSC)
+		priv->cru = (struct rk3288_cru *)dev_get_addr(dev);
+
+	return 0;
+}
+
 static int rk3288_clk_probe(struct udevice *dev)
 {
 	struct rk3288_clk_plat *plat = dev_get_platdata(dev);
@@ -847,8 +858,9 @@ static int rk3288_clk_probe(struct udevice *dev)
 		priv->grf = parent_priv->grf;
 		return 0;
 	}
-	priv->cru = (struct rk3288_cru *)dev_get_addr(dev);
 	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	if (IS_ERR(priv->grf))
+		return PTR_ERR(priv->grf);
 #ifdef CONFIG_SPL_BUILD
 	rkclk_init(priv->cru, priv->grf);
 #endif
@@ -867,14 +879,11 @@ static const char *const clk_name[CLK_COUNT] = {
 
 static int rk3288_clk_bind(struct udevice *dev)
 {
-	struct rk3288_clk_plat *plat = dev_get_platdata(dev);
 	int pll, ret;
 
 	/* We only need to set up the root clock */
-	if (dev->of_offset == -1) {
-		plat->clk_id = CLK_OSC;
+	if (device_get_uclass_id(dev_get_parent(dev)) == UCLASS_CLK)
 		return 0;
-	}
 
 	/* Create devices for P main clocks */
 	for (pll = 1; pll < CLK_COUNT; pll++) {
@@ -911,5 +920,6 @@ U_BOOT_DRIVER(clk_rk3288) = {
 	.platdata_auto_alloc_size = sizeof(struct rk3288_clk_plat),
 	.ops		= &rk3288_clk_ops,
 	.bind		= rk3288_clk_bind,
+	.ofdata_to_platdata	= rk3288_clk_ofdata_to_platdata,
 	.probe		= rk3288_clk_probe,
 };
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 47/55] rockchip: clk: Update the rk3288 driver to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (45 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 46/55] rockchip: clk: Move all DT decoding to ofdata_to_platdata() Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 48/55] rockchip: pinctrl: " Simon Glass
                   ` (7 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add support for of-platdata with rk3288. This requires decoding the
of-platdata struct and setting up the devices from that. Also the driver
needs to be renamed to match the string that of-platdata will search for.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/clk/clk_rk3288.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/clk_rk3288.c b/drivers/clk/clk_rk3288.c
index 8a62b3d..05912ff 100644
--- a/drivers/clk/clk_rk3288.c
+++ b/drivers/clk/clk_rk3288.c
@@ -7,7 +7,9 @@
 #include <common.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <errno.h>
+#include <mapmem.h>
 #include <syscon.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
@@ -22,6 +24,9 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 struct rk3288_clk_plat {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct dtd_rockchip_rk3288_cru dtd;
+#endif
 	enum rk_clk_id clk_id;
 };
 
@@ -837,11 +842,13 @@ static struct clk_ops rk3288_clk_ops = {
 
 static int rk3288_clk_ofdata_to_platdata(struct udevice *dev)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	struct rk3288_clk_plat *plat = dev_get_platdata(dev);
 	struct rk3288_clk_priv *priv = dev_get_priv(dev);
 
 	if (plat->clk_id == CLK_OSC)
 		priv->cru = (struct rk3288_cru *)dev_get_addr(dev);
+#endif
 
 	return 0;
 }
@@ -861,6 +868,9 @@ static int rk3288_clk_probe(struct udevice *dev)
 	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
 	if (IS_ERR(priv->grf))
 		return PTR_ERR(priv->grf);
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	priv->cru = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]);
+#endif
 #ifdef CONFIG_SPL_BUILD
 	rkclk_init(priv->cru, priv->grf);
 #endif
@@ -891,8 +901,8 @@ static int rk3288_clk_bind(struct udevice *dev)
 		struct rk3288_clk_plat *cplat;
 
 		debug("%s %s\n", __func__, clk_name[pll]);
-		ret = device_bind_driver(dev, "clk_rk3288", clk_name[pll],
-					 &child);
+		ret = device_bind_driver(dev, "rockchip_rk3288_cru",
+					 clk_name[pll], &child);
 		if (ret)
 			return ret;
 		cplat = dev_get_platdata(child);
@@ -912,8 +922,8 @@ static const struct udevice_id rk3288_clk_ids[] = {
 	{ }
 };
 
-U_BOOT_DRIVER(clk_rk3288) = {
-	.name		= "clk_rk3288",
+U_BOOT_DRIVER(rockchip_rk3288_cru) = {
+	.name		= "rockchip_rk3288_cru",
 	.id		= UCLASS_CLK,
 	.of_match	= rk3288_clk_ids,
 	.priv_auto_alloc_size = sizeof(struct rk3288_clk_priv),
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 48/55] rockchip: pinctrl: Update the rk3288 driver to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (46 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 47/55] rockchip: clk: Update the rk3288 driver to support of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 49/55] rockchip: Move the MMC setup check earlier Simon Glass
                   ` (6 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add support for of-platdata with rk3288. This requires disabling access to
the device tree and renaming the driver to match the string that of-platdata
will search for.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/pinctrl/rockchip/pinctrl_rk3288.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/pinctrl/rockchip/pinctrl_rk3288.c b/drivers/pinctrl/rockchip/pinctrl_rk3288.c
index 1fa1daa..8cb3b82 100644
--- a/drivers/pinctrl/rockchip/pinctrl_rk3288.c
+++ b/drivers/pinctrl/rockchip/pinctrl_rk3288.c
@@ -476,6 +476,7 @@ static int rk3288_pinctrl_request(struct udevice *dev, int func, int flags)
 static int rk3288_pinctrl_get_periph_id(struct udevice *dev,
 					struct udevice *periph)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	u32 cell[3];
 	int ret;
 
@@ -506,6 +507,7 @@ static int rk3288_pinctrl_get_periph_id(struct udevice *dev,
 	case 103:
 		return PERIPH_ID_HDMI;
 	}
+#endif
 
 	return -ENOENT;
 }
@@ -664,8 +666,12 @@ static struct pinctrl_ops rk3288_pinctrl_ops = {
 
 static int rk3288_pinctrl_bind(struct udevice *dev)
 {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	return 0;
+#else
 	/* scan child GPIO banks */
 	return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
+#endif
 }
 
 #ifndef CONFIG_SPL_BUILD
@@ -719,7 +725,7 @@ static const struct udevice_id rk3288_pinctrl_ids[] = {
 };
 
 U_BOOT_DRIVER(pinctrl_rk3288) = {
-	.name		= "pinctrl_rk3288",
+	.name		= "rockchip_rk3288_pinctrl",
 	.id		= UCLASS_PINCTRL,
 	.of_match	= rk3288_pinctrl_ids,
 	.priv_auto_alloc_size = sizeof(struct rk3288_pinctrl_priv),
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 49/55] rockchip: Move the MMC setup check earlier
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (47 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 48/55] rockchip: pinctrl: " Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 50/55] rockchip: Don't use spl_boot_device() with of-platdata Simon Glass
                   ` (5 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

When the boot ROM sets up MMC we don't need to do it again. Remove the
MMC setup code entirely.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/mach-rockchip/rk3288-board-spl.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/arch/arm/mach-rockchip/rk3288-board-spl.c b/arch/arm/mach-rockchip/rk3288-board-spl.c
index e133cca..30f874a 100644
--- a/arch/arm/mach-rockchip/rk3288-board-spl.c
+++ b/arch/arm/mach-rockchip/rk3288-board-spl.c
@@ -114,7 +114,6 @@ static void configure_l2ctlr(void)
 #ifdef CONFIG_SPL_MMC_SUPPORT
 static int configure_emmc(struct udevice *pinctrl)
 {
-#if !defined(CONFIG_TARGET_ROCK2) && !defined(CONFIG_TARGET_FIREFLY_RK3288)
 	struct gpio_desc desc;
 	int ret;
 
@@ -144,7 +143,6 @@ static int configure_emmc(struct udevice *pinctrl)
 		debug("gpio value ret=%d\n", ret);
 		return ret;
 	}
-#endif
 
 	return 0;
 }
@@ -247,15 +245,18 @@ void spl_board_init(void)
 		goto err;
 	}
 #ifdef CONFIG_SPL_MMC_SUPPORT
-	ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
-	if (ret) {
-		debug("%s: Failed to set up SD card\n", __func__);
-		goto err;
-	}
-	ret = configure_emmc(pinctrl);
-	if (ret) {
-		debug("%s: Failed to set up eMMC\n", __func__);
-		goto err;
+	if (!IS_ENABLED(CONFIG_TARGET_ROCK2) &&
+	    !IS_ENABLED(CONFIG_TARGET_FIREFLY_RK3288)) {
+		ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
+		if (ret) {
+			debug("%s: Failed to set up SD card\n", __func__);
+			goto err;
+		}
+		ret = configure_emmc(pinctrl);
+		if (ret) {
+			debug("%s: Failed to set up eMMC\n", __func__);
+			goto err;
+		}
 	}
 #endif
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 50/55] rockchip: Don't use spl_boot_device() with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (48 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 49/55] rockchip: Move the MMC setup check earlier Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 51/55] rockchip: syscon: Update to work " Simon Glass
                   ` (4 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

This function cannot look at the device tree when of-platdata is used.
Update the code to handle this.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/mach-rockchip/rk3288-board-spl.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/mach-rockchip/rk3288-board-spl.c b/arch/arm/mach-rockchip/rk3288-board-spl.c
index 30f874a..6d3b38c 100644
--- a/arch/arm/mach-rockchip/rk3288-board-spl.c
+++ b/arch/arm/mach-rockchip/rk3288-board-spl.c
@@ -29,6 +29,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 u32 spl_boot_device(void)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	const void *blob = gd->fdt_blob;
 	struct udevice *dev;
 	const char *bootdev;
@@ -63,6 +64,7 @@ u32 spl_boot_device(void)
 	}
 
 fallback:
+#endif
 	return BOOT_DEVICE_MMC1;
 }
 
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 51/55] rockchip: syscon: Update to work with of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (49 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 50/55] rockchip: Don't use spl_boot_device() with of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 52/55] rockchip: sdram: Move all DT decoding to ofdata_to_platdata() Simon Glass
                   ` (3 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

The syscon devices all end up having diffent driver names with of-platdata,
since the driver name comes from the first string in the compatible list.
Add separate device declarations for each one, and add a bind method to set
up driver_data correctly.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/mach-rockchip/rk3288/syscon_rk3288.c | 38 +++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c b/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
index c9f7c4e..be4b2b0 100644
--- a/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
@@ -23,3 +23,41 @@ U_BOOT_DRIVER(syscon_rk3288) = {
 	.id = UCLASS_SYSCON,
 	.of_match = rk3288_syscon_ids,
 };
+
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+static int rk3288_syscon_bind_of_platdata(struct udevice *dev)
+{
+	dev->driver_data = dev->driver->of_match->data;
+	debug("syscon: %s %d\n", dev->name, (uint)dev->driver_data);
+
+	return 0;
+}
+
+U_BOOT_DRIVER(rockchip_rk3288_noc) = {
+	.name = "rockchip_rk3288_noc",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3288_syscon_ids,
+	.bind = rk3288_syscon_bind_of_platdata,
+};
+
+U_BOOT_DRIVER(rockchip_rk3288_grf) = {
+	.name = "rockchip_rk3288_grf",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3288_syscon_ids + 1,
+	.bind = rk3288_syscon_bind_of_platdata,
+};
+
+U_BOOT_DRIVER(rockchip_rk3288_sgrf) = {
+	.name = "rockchip_rk3288_sgrf",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3288_syscon_ids + 2,
+	.bind = rk3288_syscon_bind_of_platdata,
+};
+
+U_BOOT_DRIVER(rockchip_rk3288_pmu) = {
+	.name = "rockchip_rk3288_pmu",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3288_syscon_ids + 3,
+	.bind = rk3288_syscon_bind_of_platdata,
+};
+#endif
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 52/55] rockchip: sdram: Move all DT decoding to ofdata_to_platdata()
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (50 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 51/55] rockchip: syscon: Update to work " Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 53/55] rockchip: sdram: Update the driver to support of-platdata Simon Glass
                   ` (2 subsequent siblings)
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

It is more correct to avoid touching the device tree in the probe() method.
Update the driver to work this way. Note that only SPL needs to fiddle with
the SDRAM registers, so decoding the platform data fully is not necessary in
U-Boot proper.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/include/asm/arch-rockchip/sdram.h   |  8 ---
 arch/arm/mach-rockchip/rk3288/sdram_rk3288.c | 91 ++++++++++++++++++----------
 2 files changed, 60 insertions(+), 39 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/sdram.h b/arch/arm/include/asm/arch-rockchip/sdram.h
index c9e3001..e08e28f 100644
--- a/arch/arm/include/asm/arch-rockchip/sdram.h
+++ b/arch/arm/include/asm/arch-rockchip/sdram.h
@@ -87,12 +87,4 @@ struct rk3288_base_params {
 	u32 odt;
 };
 
-struct rk3288_sdram_params {
-	struct rk3288_sdram_channel ch[2];
-	struct rk3288_sdram_pctl_timing pctl_timing;
-	struct rk3288_sdram_phy_timing phy_timing;
-	struct rk3288_base_params base;
-	int num_channels;
-};
-
 #endif
diff --git a/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c b/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
index 2e21282..4e5186e 100644
--- a/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
@@ -43,6 +43,15 @@ struct dram_info {
 	struct rk3288_pmu *pmu;
 };
 
+struct rk3288_sdram_params {
+	struct rk3288_sdram_channel ch[2];
+	struct rk3288_sdram_pctl_timing pctl_timing;
+	struct rk3288_sdram_phy_timing phy_timing;
+	struct rk3288_base_params base;
+	int num_channels;
+	struct regmap *map;
+};
+
 #ifdef CONFIG_SPL_BUILD
 static void copy_to_reg(u32 *dest, const u32 *src, u32 n)
 {
@@ -703,7 +712,7 @@ static int sdram_init(const struct dram_info *dram,
 
 	return 0;
 }
-#endif
+#endif /* CONFIG_SPL_BUILD */
 
 size_t sdram_size_mb(struct rk3288_pmu *pmu)
 {
@@ -779,18 +788,33 @@ static int veyron_init(struct dram_info *priv)
 static int setup_sdram(struct udevice *dev)
 {
 	struct dram_info *priv = dev_get_priv(dev);
-	struct rk3288_sdram_params params;
+	struct rk3288_sdram_params *params = dev_get_platdata(dev);
+
+# ifdef CONFIG_ROCKCHIP_FAST_SPL
+	if (priv->is_veyron) {
+		ret = veyron_init(priv);
+		if (ret)
+			return ret;
+	}
+# endif
+
+	return sdram_init(priv, params);
+}
+
+static int rk3288_dmc_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3288_sdram_params *params = dev_get_platdata(dev);
 	const void *blob = gd->fdt_blob;
 	int node = dev->of_offset;
 	int i, ret;
 
-	params.num_channels = fdtdec_get_int(blob, node,
-					     "rockchip,num-channels", 1);
-	for (i = 0; i < params.num_channels; i++) {
+	params->num_channels = fdtdec_get_int(blob, node,
+					      "rockchip,num-channels", 1);
+	for (i = 0; i < params->num_channels; i++) {
 		ret = fdtdec_get_byte_array(blob, node,
 					    "rockchip,sdram-channel",
-					    (u8 *)&params.ch[i],
-					    sizeof(params.ch[i]));
+					    (u8 *)&params->ch[i],
+					    sizeof(params->ch[i]));
 		if (ret) {
 			debug("%s: Cannot read rockchip,sdram-channel\n",
 			      __func__);
@@ -798,41 +822,42 @@ static int setup_sdram(struct udevice *dev)
 		}
 	}
 	ret = fdtdec_get_int_array(blob, node, "rockchip,pctl-timing",
-				   (u32 *)&params.pctl_timing,
-				   sizeof(params.pctl_timing) / sizeof(u32));
+				   (u32 *)&params->pctl_timing,
+				   sizeof(params->pctl_timing) / sizeof(u32));
 	if (ret) {
 		debug("%s: Cannot read rockchip,pctl-timing\n", __func__);
 		return -EINVAL;
 	}
 	ret = fdtdec_get_int_array(blob, node, "rockchip,phy-timing",
-				   (u32 *)&params.phy_timing,
-				   sizeof(params.phy_timing) / sizeof(u32));
+				   (u32 *)&params->phy_timing,
+				   sizeof(params->phy_timing) / sizeof(u32));
 	if (ret) {
 		debug("%s: Cannot read rockchip,phy-timing\n", __func__);
 		return -EINVAL;
 	}
 	ret = fdtdec_get_int_array(blob, node, "rockchip,sdram-params",
-				   (u32 *)&params.base,
-				   sizeof(params.base) / sizeof(u32));
+				   (u32 *)&params->base,
+				   sizeof(params->base) / sizeof(u32));
 	if (ret) {
 		debug("%s: Cannot read rockchip,sdram-params\n", __func__);
 		return -EINVAL;
 	}
+#ifdef CONFIG_ROCKCHIP_FAST_SPL
+	priv->is_veyron = !fdt_node_check_compatible(blob, 0, "google,veyron");
+#endif
+	ret = regmap_init_mem(dev, &params->map);
+	if (ret)
+		return ret;
 
-# ifdef CONFIG_ROCKCHIP_FAST_SPL
-	if (!fdt_node_check_compatible(blob, 0, "google,veyron")) {
-		ret = veyron_init(priv);
-		if (ret)
-			return ret;
-	}
-# endif
-
-	return sdram_init(priv, &params);
+	return 0;
 }
-#endif
+#endif /* CONFIG_SPL_BUILD */
 
 static int rk3288_dmc_probe(struct udevice *dev)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct rk3288_sdram_params *plat = dev_get_platdata(dev);
+#endif
 	struct dram_info *priv = dev_get_priv(dev);
 	struct regmap *map;
 	int ret;
@@ -848,14 +873,12 @@ static int rk3288_dmc_probe(struct udevice *dev)
 	priv->sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_SGRF);
 	priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
 
-	ret = regmap_init_mem(dev, &map);
-	if (ret)
-		return ret;
-	priv->chan[0].pctl = regmap_get_range(map, 0);
-	priv->chan[0].publ = regmap_get_range(map, 1);
-	priv->chan[1].pctl = regmap_get_range(map, 2);
-	priv->chan[1].publ = regmap_get_range(map, 3);
-
+#ifdef CONFIG_SPL_BUILD
+	priv->chan[0].pctl = regmap_get_range(plat->map, 0);
+	priv->chan[0].publ = regmap_get_range(plat->map, 1);
+	priv->chan[1].pctl = regmap_get_range(plat->map, 2);
+	priv->chan[1].publ = regmap_get_range(plat->map, 3);
+#endif
 	ret = uclass_get_device(UCLASS_CLK, CLK_DDR, &priv->ddr_clk);
 	if (ret)
 		return ret;
@@ -897,6 +920,12 @@ U_BOOT_DRIVER(dmc_rk3288) = {
 	.id = UCLASS_RAM,
 	.of_match = rk3288_dmc_ids,
 	.ops = &rk3288_dmc_ops,
+#ifdef CONFIG_SPL_BUILD
+        .ofdata_to_platdata = rk3288_dmc_ofdata_to_platdata,
+#endif
 	.probe = rk3288_dmc_probe,
 	.priv_auto_alloc_size = sizeof(struct dram_info),
+#ifdef CONFIG_SPL_BUILD
+	.platdata_auto_alloc_size = sizeof(struct rk3288_sdram_params),
+#endif
 };
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 53/55] rockchip: sdram: Update the driver to support of-platdata
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (51 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 52/55] rockchip: sdram: Move all DT decoding to ofdata_to_platdata() Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 54/55] rockchip: Use of-platdata for firefly-rk3288 Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features Simon Glass
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Add support for of-platdata with rk3288 SDRAM initr. This requires decoding
the of-platdata struct and setting up the device from that. Also the driver
needs to be renamed to match the string that of-platdata will search for.

The platform data is copied from the of-platdata structure to the one used
by the driver. This allows the same code to be used with device tree and
of-platdata.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 arch/arm/mach-rockchip/rk3288/sdram_rk3288.c | 40 +++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c b/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
index 4e5186e..355c332 100644
--- a/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/sdram_rk3288.c
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <errno.h>
 #include <ram.h>
 #include <regmap.h>
@@ -44,6 +45,9 @@ struct dram_info {
 };
 
 struct rk3288_sdram_params {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct dtd_rockchip_rk3288_dmc of_plat;
+#endif
 	struct rk3288_sdram_channel ch[2];
 	struct rk3288_sdram_pctl_timing pctl_timing;
 	struct rk3288_sdram_phy_timing phy_timing;
@@ -803,6 +807,7 @@ static int setup_sdram(struct udevice *dev)
 
 static int rk3288_dmc_ofdata_to_platdata(struct udevice *dev)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	struct rk3288_sdram_params *params = dev_get_platdata(dev);
 	const void *blob = gd->fdt_blob;
 	int node = dev->of_offset;
@@ -848,11 +853,39 @@ static int rk3288_dmc_ofdata_to_platdata(struct udevice *dev)
 	ret = regmap_init_mem(dev, &params->map);
 	if (ret)
 		return ret;
+#endif
 
 	return 0;
 }
 #endif /* CONFIG_SPL_BUILD */
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+static int conv_of_platdata(struct udevice *dev)
+{
+	struct rk3288_sdram_params *plat = dev_get_platdata(dev);
+	struct dtd_rockchip_rk3288_dmc *of_plat = &plat->of_plat;
+	int i, ret;
+
+	for (i = 0; i < 2; i++) {
+		memcpy(&plat->ch[i], of_plat->rockchip_sdram_channel,
+		       sizeof(plat->ch[i]));
+	}
+	memcpy(&plat->pctl_timing, of_plat->rockchip_pctl_timing,
+	       sizeof(plat->pctl_timing));
+	memcpy(&plat->phy_timing, of_plat->rockchip_phy_timing,
+	       sizeof(plat->phy_timing));
+	memcpy(&plat->base, of_plat->rockchip_sdram_params, sizeof(plat->base));
+	plat->num_channels = of_plat->rockchip_num_channels;
+	ret = regmap_init_mem_platdata(dev, of_plat->reg,
+				       ARRAY_SIZE(of_plat->reg) / 2,
+                                       &plat->map);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+#endif
+
 static int rk3288_dmc_probe(struct udevice *dev)
 {
 #ifdef CONFIG_SPL_BUILD
@@ -862,6 +895,11 @@ static int rk3288_dmc_probe(struct udevice *dev)
 	struct regmap *map;
 	int ret;
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	ret = conv_of_platdata(dev);
+	if (ret)
+		return ret;
+#endif
 	map = syscon_get_regmap_by_driver_data(ROCKCHIP_SYSCON_NOC);
 	if (IS_ERR(map))
 		return PTR_ERR(map);
@@ -916,7 +954,7 @@ static const struct udevice_id rk3288_dmc_ids[] = {
 };
 
 U_BOOT_DRIVER(dmc_rk3288) = {
-	.name = "rk3288_dmc",
+	.name = "rockchip_rk3288_dmc",
 	.id = UCLASS_RAM,
 	.of_match = rk3288_dmc_ids,
 	.ops = &rk3288_dmc_ops,
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 54/55] rockchip: Use of-platdata for firefly-rk3288
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (52 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 53/55] rockchip: sdram: Update the driver to support of-platdata Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features Simon Glass
  54 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

As an experiment, move this board over to use of-platdata. This means that
its SPL configuration will come from C structures generated at build-time
from the device tree, instead of coming from the device tree at run-time.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 configs/firefly-rk3288_defconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/configs/firefly-rk3288_defconfig b/configs/firefly-rk3288_defconfig
index a64f6de..b84f918 100644
--- a/configs/firefly-rk3288_defconfig
+++ b/configs/firefly-rk3288_defconfig
@@ -68,3 +68,6 @@ CONFIG_VIDEO_ROCKCHIP=y
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_CMD_DHRYSTONE=y
 CONFIG_ERRNO_STR=y
+CONFIG_SPL_OF_PLATDATA=y
+# CONFIG_SPL_OF_LIBFDT is not set
+CONFIG_ROCKCHIP_SERIAL=y
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features
  2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
                   ` (53 preceding siblings ...)
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 54/55] rockchip: Use of-platdata for firefly-rk3288 Simon Glass
@ 2016-06-13  5:33 ` Simon Glass
  2016-06-23 20:04   ` Tom Rini
  54 siblings, 1 reply; 60+ messages in thread
From: Simon Glass @ 2016-06-13  5:33 UTC (permalink / raw)
  To: u-boot

Revise the content based on the v2 additions. This is kept as a separate
patch to avoid confusing those who have already reviewed the v1 series.

Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Tom Rini <trini@konsulko.com>
---

Changes in v2:
- Add support for rockchip
- Various minor enhancements to the v1 implementation

 doc/driver-model/of-plat.txt | 107 ++++++++++++++++++++++++++++++-------------
 1 file changed, 75 insertions(+), 32 deletions(-)

diff --git a/doc/driver-model/of-plat.txt b/doc/driver-model/of-plat.txt
index 96b9b46..01b835f 100644
--- a/doc/driver-model/of-plat.txt
+++ b/doc/driver-model/of-plat.txt
@@ -19,24 +19,28 @@ SoCs require a 16KB SPL image which must include a full MMC stack. In this
 case the overhead of device tree access may be too great.
 
 It is possible to create platform data manually by defining C structures
-for it, and referencing that data in a U_BOOT_DEVICE() declaration. This
-bypasses the use of device tree completely, but is an available option for
-SPL.
+for it, and reference that data in a U_BOOT_DEVICE() declaration. This
+bypasses the use of device tree completely, effectively creating a parallel
+configuration mechanism. But it is an available option for SPL.
 
-As an alternative, a new 'of-platdata' feature is provided. This converts
+As an alternative, a new 'of-platdata' feature is provided. This converts the
 device tree contents into C code which can be compiled into the SPL binary.
 This saves the 3KB of code overhead and perhaps a few hundred more bytes due
 to more efficient storage of the data.
 
+Note: Quite a bit of thought has gone into the design of this feature.
+However it still has many rough edges and comments and suggestions are
+strongly encouraged! Quite possibly there is a much better approach.
+
 
 Caveats
 -------
 
 There are many problems with this features. It should only be used when
-stricly necessary. Notable problems include:
+strictly necessary. Notable problems include:
 
-   - Device tree does not describe data types but the C code must define a
-        type for each property. Thesee are guessed using heuristics which
+   - Device tree does not describe data types. But the C code must define a
+        type for each property. These are guessed using heuristics which
         are wrong in several fairly common cases. For example an 8-byte value
         is considered to be a 2-item integer array, and is byte-swapped. A
         boolean value that is not present means 'false', but cannot be
@@ -45,14 +49,15 @@ stricly necessary. Notable problems include:
 
    - Naming of nodes and properties is automatic. This means that they follow
         the naming in the device tree, which may result in C identifiers that
-        look a bit strange
+        look a bit strange.
 
    - It is not possible to find a value given a property name. Code must use
         the associated C member variable directly in the code. This makes
         the code less robust in the face of device-tree changes. It also
         makes it very unlikely that your driver code will be useful for more
         than one SoC. Even if the code is common, each SoC will end up with
-        a different C struct and format for the platform data.
+        a different C struct name, and a likely a different format for the
+        platform data.
 
    - The platform data is provided to drivers as a C structure. The driver
         must use the same structure to access the data. Since a driver
@@ -112,7 +117,6 @@ struct dtd_rockchip_rk3288_dw_mshc {
         fdt32_t         interrupts[3];
         fdt32_t         num_slots;
         fdt32_t         reg[2];
-        bool            u_boot_dm_pre_reloc;
         fdt32_t         vmmc_supply;
 };
 
@@ -125,7 +129,10 @@ static struct dtd_rockchip_rk3288_dw_mshc dtv_dwmmc_at_ff0c0000 = {
         .clock_freq_min_max     = {0x61a80, 0x8f0d180},
         .vmmc_supply            = 0xb,
         .num_slots              = 0x1,
-        .clocks                 = {{&dtv_clock_controller_at_ff760000, 456}, {&dtv_clock_controller_at_ff760000, 68}, {&dtv_clock_controller_at_ff760000, 114}, {&dtv_clock_controller_at_ff760000, 118}},
+        .clocks                 = {{&dtv_clock_controller_at_ff760000, 456},
+                                   {&dtv_clock_controller_at_ff760000, 68},
+                                   {&dtv_clock_controller_at_ff760000, 114},
+                                   {&dtv_clock_controller_at_ff760000, 118}},
         .cap_mmc_highspeed      = true,
         .disable_wp             = true,
         .bus_width              = 0x4,
@@ -136,6 +143,7 @@ static struct dtd_rockchip_rk3288_dw_mshc dtv_dwmmc_at_ff0c0000 = {
 U_BOOT_DEVICE(dwmmc_at_ff0c0000) = {
         .name           = "rockchip_rk3288_dw_mshc",
         .platdata       = &dtv_dwmmc_at_ff0c0000,
+        .platdata_size  = sizeof(dtv_dwmmc_at_ff0c0000),
 };
 
 The device is then instantiated at run-time and the platform data can be
@@ -149,15 +157,31 @@ platform data in the driver. The ofdata_to_platdata() method should
 therefore do nothing in such a driver.
 
 
+Converting of-platdata to a useful form
+---------------------------------------
+
+Of course it would be possible use the of-platdata directly in your driver
+whenever configuration information is required. However this meands that the
+driver will not be able to support device tree, since the of-platdata
+structure is not available when device tree is used. It would make no sense
+to use this structure if device tree were available, since the structure has
+all the limitations metioned in caveats above.
+
+Therefore it is recommended that the of-platdata structure should be used
+only in the probe() method of your driver. It cannot be used in the
+ofdata_to_platdata() method since this is not called when platform data is
+already present.
+
+
 How to structure your driver
 ----------------------------
 
 Drivers should always support device tree as an option. The of-platdata
 feature is intended as a add-on to existing drivers.
 
-Your driver should directly access the platdata struct in its probe()
-method. The existing device tree decoding logic should be kept in the
-ofdata_to_platdata() and wrapped with #ifdef.
+Your driver should convert the platdata struct in its probe() method. The
+existing device tree decoding logic should be kept in the
+ofdata_to_platdata() method and wrapped with #if.
 
 For example:
 
@@ -165,13 +189,12 @@ For example:
 
     struct mmc_platdata {
     #if CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
-            /* Put this first */
+            /* Put this first since driver model will copy the data here */
             struct dtd_mmc dtplat;
     #endif
             /*
              * Other fields can go here, to be filled in by decoding from
-             * the device tree. They will point to random memory in the
-             * of-plat case.
+             * the device tree (or the C structures when of-platdata is used).
              */
             int fifo_depth;
     };
@@ -179,6 +202,7 @@ For example:
     static int mmc_ofdata_to_platdata(struct udevice *dev)
     {
     #if !CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+            /* Decode the device tree data */
             struct mmc_platdata *plat = dev_get_platdata(dev);
             const void *blob = gd->fdt_blob;
             int node = dev->of_offset;
@@ -192,15 +216,15 @@ For example:
     static int mmc_probe(struct udevice *dev)
     {
             struct mmc_platdata *plat = dev_get_platdata(dev);
+
     #if CONFIG_IS_ENABLED(SPL_OF_PLATDATA)
+            /* Decode the of-platdata from the C structures */
             struct dtd_mmc *dtplat = &plat->dtplat;
 
-            /* Set up the device from the dtplat data */
-            writel(dtplat->fifo_depth, ...)
-    #else
+            plat->fifo_depth = dtplat->fifo_depth;
+    #endif
             /* Set up the device from the plat data */
             writel(plat->fifo_depth, ...)
-    #endif
     }
 
     static const struct udevice_id mmc_ids[] = {
@@ -220,15 +244,26 @@ For example:
 
 
 In the case where SPL_OF_PLATDATA is enabled, platdata_auto_alloc_size is
-ignored, and the platform data points to the C structure data. In the case
-where device tree is used, the platform data is allocated, and starts
-zeroed. In this case the ofdata_to_platdata() method should set up the
-platform data.
+still used to allocate space for the platform data. This is different from
+the normal behaviour and is triggered by the use of of-platdata (strictly
+speaking it is a non-zero platdata_size which triggers this).
 
-SPL must use either of-platdata or device tree. Drivers cannot use both.
-The device tree becomes in accessible when CONFIG_SPL_OF_PLATDATA is enabled,
-since the device-tree access code is not compiled in.
+The of-platdata struct contents is copied from the C structure data to the
+start of the newly allocated area. In the case where device tree is used,
+the platform data is allocated, and starts zeroed. In this case the
+ofdata_to_platdata() method should still set up the platform data (and the
+of-platdata struct will not be present).
+
+SPL must use either of-platdata or device tree. Drivers cannot use both at
+the same time, but they must support device tree. Supporting of-platdata is
+optional.
 
+The device tree becomes in accessible when CONFIG_SPL_OF_PLATDATA is enabled,
+since the device-tree access code is not compiled in. A corollary is that
+a board can only move to using of-platdata if all the drivers it uses support
+it. There would be little point in having some drivers require the device
+tree data, since then libfdt would still be needed for those drivers and
+there would be no code-size benefit.
 
 Internals
 ---------
@@ -236,7 +271,8 @@ Internals
 The dt-structs.h file includes the generated file
 (include/generated//dt-structs.h) if CONFIG_SPL_OF_PLATDATA is enabled.
 Otherwise (such as in U-Boot proper) these structs are not available. This
-prevents them being used inadvertently.
+prevents them being used inadvertently. All usage must be bracketed with
+#if CONFIG_IS_ENABLED(SPL_OF_PLATDATA).
 
 The dt-platdata.c file contains the device declarations and is is built in
 spl/dt-platdata.c.
@@ -249,7 +285,15 @@ yet implemented, however.
 The beginnings of a libfdt Python module are provided. So far this only
 implements a subset of the features.
 
-The 'swig' tool is needed to build the libfdt Python module.
+The 'swig' tool is needed to build the libfdt Python module. If this is not
+found then the Python model is not used and a fallback is used instead, which
+makes use of fdtget.
+
+
+Credits
+-------
+
+This is an implementation of an idea by Tom Rini <trini@konsulko.com>.
 
 
 Future work
@@ -258,11 +302,10 @@ Future work
 - Add a sandbox_spl functional test
 - Consider programmatically reading binding files instead of device tree
      contents
-- Drop the device tree data from the SPL image
 - Complete the phandle feature
-- Get this running on a Rockchip board
 - Move to using a full Python libfdt module
 
 --
 Simon Glass <sjg@chromium.org>
+Google, Inc
 6/6/16
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features
  2016-06-13  5:33 ` [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features Simon Glass
@ 2016-06-23 20:04   ` Tom Rini
  2016-06-23 20:36     ` Simon Glass
  0 siblings, 1 reply; 60+ messages in thread
From: Tom Rini @ 2016-06-23 20:04 UTC (permalink / raw)
  To: u-boot

On Sun, Jun 12, 2016 at 11:33:36PM -0600, Simon Glass wrote:

> Revise the content based on the v2 additions. This is kept as a separate
> patch to avoid confusing those who have already reviewed the v1 series.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Suggested-by: Tom Rini <trini@konsulko.com>
[snip]
> +Converting of-platdata to a useful form
> +---------------------------------------
> +
> +Of course it would be possible use the of-platdata directly in your driver
> +whenever configuration information is required. However this meands that the

"means"

[snip]
> +The of-platdata struct contents is copied from the C structure data to the

"is copied" -> "are copied"

And thanks again for doing all of this!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160623/bc8c658c/attachment.sig>

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features
  2016-06-23 20:04   ` Tom Rini
@ 2016-06-23 20:36     ` Simon Glass
  2016-06-23 22:55       ` Tom Rini
  0 siblings, 1 reply; 60+ messages in thread
From: Simon Glass @ 2016-06-23 20:36 UTC (permalink / raw)
  To: u-boot

Hi Tom,

On 23 June 2016 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> On Sun, Jun 12, 2016 at 11:33:36PM -0600, Simon Glass wrote:
>
>> Revise the content based on the v2 additions. This is kept as a separate
>> patch to avoid confusing those who have already reviewed the v1 series.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> Suggested-by: Tom Rini <trini@konsulko.com>
> [snip]
>> +Converting of-platdata to a useful form
>> +---------------------------------------
>> +
>> +Of course it would be possible use the of-platdata directly in your driver
>> +whenever configuration information is required. However this meands that the
>
> "means"
>
> [snip]
>> +The of-platdata struct contents is copied from the C structure data to the
>
> "is copied" -> "are copied"
>
> And thanks again for doing all of this!

Obviously I still have a test to write, but other than that, what do
you think of this feature?

I put quite a bit of info in the caveats. The benefit is clear but it
is also a bit wonky - e.g. the structure / member naming. I'm really a
little bit nervous about it all. Do you think we can make sure it is
used sparingly?

Regards,
Simon

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features
  2016-06-23 20:36     ` Simon Glass
@ 2016-06-23 22:55       ` Tom Rini
  2016-06-26  3:00         ` Simon Glass
  0 siblings, 1 reply; 60+ messages in thread
From: Tom Rini @ 2016-06-23 22:55 UTC (permalink / raw)
  To: u-boot

On Thu, Jun 23, 2016 at 02:36:55PM -0600, Simon Glass wrote:
> Hi Tom,
> 
> On 23 June 2016 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> > On Sun, Jun 12, 2016 at 11:33:36PM -0600, Simon Glass wrote:
> >
> >> Revise the content based on the v2 additions. This is kept as a separate
> >> patch to avoid confusing those who have already reviewed the v1 series.
> >>
> >> Signed-off-by: Simon Glass <sjg@chromium.org>
> >> Suggested-by: Tom Rini <trini@konsulko.com>
> > [snip]
> >> +Converting of-platdata to a useful form
> >> +---------------------------------------
> >> +
> >> +Of course it would be possible use the of-platdata directly in your driver
> >> +whenever configuration information is required. However this meands that the
> >
> > "means"
> >
> > [snip]
> >> +The of-platdata struct contents is copied from the C structure data to the
> >
> > "is copied" -> "are copied"
> >
> > And thanks again for doing all of this!
> 
> Obviously I still have a test to write, but other than that, what do
> you think of this feature?

Well, I like it.  But I'm also not great at spotting problems before we
run into them sometimes.

> I put quite a bit of info in the caveats. The benefit is clear but it
> is also a bit wonky - e.g. the structure / member naming. I'm really a
> little bit nervous about it all. Do you think we can make sure it is
> used sparingly?

Given the number of places (it feels like) that run in to, or nearly run
in to size limits today in SPL with tiny-printf enabled, no, I can't say
that I think this will be used sparingly.  So is there anything we can
do about the structure / member naming to make it less wonky?  Or just
wait and see how things work out in the end when people start using it
more?

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160623/b3966e96/attachment.sig>

^ permalink raw reply	[flat|nested] 60+ messages in thread

* [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features
  2016-06-23 22:55       ` Tom Rini
@ 2016-06-26  3:00         ` Simon Glass
  0 siblings, 0 replies; 60+ messages in thread
From: Simon Glass @ 2016-06-26  3:00 UTC (permalink / raw)
  To: u-boot

Hi Tom,

On 23 June 2016 at 16:55, Tom Rini <trini@konsulko.com> wrote:
> On Thu, Jun 23, 2016 at 02:36:55PM -0600, Simon Glass wrote:
>> Hi Tom,
>>
>> On 23 June 2016 at 14:04, Tom Rini <trini@konsulko.com> wrote:
>> > On Sun, Jun 12, 2016 at 11:33:36PM -0600, Simon Glass wrote:
>> >
>> >> Revise the content based on the v2 additions. This is kept as a separate
>> >> patch to avoid confusing those who have already reviewed the v1 series.
>> >>
>> >> Signed-off-by: Simon Glass <sjg@chromium.org>
>> >> Suggested-by: Tom Rini <trini@konsulko.com>
>> > [snip]
>> >> +Converting of-platdata to a useful form
>> >> +---------------------------------------
>> >> +
>> >> +Of course it would be possible use the of-platdata directly in your driver
>> >> +whenever configuration information is required. However this meands that the
>> >
>> > "means"
>> >
>> > [snip]
>> >> +The of-platdata struct contents is copied from the C structure data to the
>> >
>> > "is copied" -> "are copied"
>> >
>> > And thanks again for doing all of this!
>>
>> Obviously I still have a test to write, but other than that, what do
>> you think of this feature?
>
> Well, I like it.  But I'm also not great at spotting problems before we
> run into them sometimes.

We need to find someone with a crystal ball...

>
>> I put quite a bit of info in the caveats. The benefit is clear but it
>> is also a bit wonky - e.g. the structure / member naming. I'm really a
>> little bit nervous about it all. Do you think we can make sure it is
>> used sparingly?
>
> Given the number of places (it feels like) that run in to, or nearly run
> in to size limits today in SPL with tiny-printf enabled, no, I can't say
> that I think this will be used sparingly.  So is there anything we can
> do about the structure / member naming to make it less wonky?  Or just
> wait and see how things work out in the end when people start using it
> more?

The only option I think is to allow people to provide a config file to
map the compatible strings and property names to better names. To me
that did not seem worth it, since it is a pain to add this file. It
would need as much maintenance as changes to the device-tree binding.

My main concern is that people will use it to make SPL small when they
can actually afford the ~4-6KB size increase. But I agree we need to
be as efficient as possible and this helps bridge the gap with device
tree.

I'll do another spin in a week or two and we'll see how it looks. Let
me know if you have any comments.

Regards,
Simon

^ permalink raw reply	[flat|nested] 60+ messages in thread

end of thread, other threads:[~2016-06-26  3:00 UTC | newest]

Thread overview: 60+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-13  5:32 [U-Boot] [PATCH v2 00/55] RFC: dm: rockchip: Add support for compiled-in platform data Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 01/55] sandbox: Don't print a warning for CONFIG_I2C_COMPAT Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 02/55] README: Remove CONFIG_SYS_MALLOC_F_LEN comment Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 03/55] spl: Drop include of i2c.h Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 04/55] Makefile: Allow the SPL final link rule to be overridden Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 05/55] sandbox: Allow chaining from SPL to U-Boot proper Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 06/55] sandbox: Support building an SPL image Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 07/55] sandbox: Correct header file order in cpu.c Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 08/55] sandbox: Add some missing headers " Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 09/55] sandbox: Don't use PCI in SPL Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 10/55] sandbox: Don't include the main loop " Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 11/55] sandbox: Add basic SPL implementation Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 12/55] sandbox: Don't use IDE and iotrace in SPL Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 13/55] sandbox: serial: Don't sync video " Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 14/55] sandbox: Add a new sandbox_spl board Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 15/55] sandbox: Add a test device that uses of-platdata Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 16/55] dm: spl: Don't set up device tree with of-platdata Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 17/55] dm: Makefile: Build of-platdata before SPL Simon Glass
2016-06-13  5:32 ` [U-Boot] [PATCH v2 18/55] dm: core: Don't use device tree with of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 19/55] dm: regmap: Add a dummy implementation for of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 20/55] dm: syscon: Add support " Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 21/55] dm: sandbox: Add a simple driver to test of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 22/55] dm: Add a header that provides access to the of-platdata structs Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 23/55] dm: clk: Add support for of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 24/55] dm: serial: " Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 25/55] dm: Don't include fdtdec functions when of-platdata is enabled Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 26/55] dm: Add an option to enable the of-platdata feature Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 27/55] dm: Add a README for of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 28/55] dm: Add a library to provide simple device-tree access Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 29/55] dm: Add a tool to generate C code from a device tree Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 30/55] dm: Makefile: Build of-platdata files when the feature is enabled Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 31/55] dm: Add a more efficient libfdt library Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 32/55] Only build the libfdt python module if 'swig' is available Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 33/55] tiny-printf: Support assert() Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 34/55] dm: spl: Bind in all devices in SPL with of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 35/55] dm: core: Rename DM_NAME_ALLOCED to DM_FLAG_NAME_ALLOCED Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 36/55] dtoc: Ignore the u-boot, dm-pre-reloc property Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 37/55] dm: Don't attach the device tree to SPL with of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 38/55] dm: core: Expand platdata for of-platdata devices Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 39/55] dm: core: Move regmap allocation into a separate function Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 40/55] dm: core: Add an implementation of regmap_init_mem_platdata() Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 41/55] dm: serial: ns16550: Update to support of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 42/55] rockchip: serial: Add an of-platdata driver for rockchip Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 43/55] rockchip: Update the sdram-channel property to support of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 44/55] rockchip: mmc: Move all DT decoding to ofdata_to_platdata() Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 45/55] rockchip: mmc: Update the driver to support of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 46/55] rockchip: clk: Move all DT decoding to ofdata_to_platdata() Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 47/55] rockchip: clk: Update the rk3288 driver to support of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 48/55] rockchip: pinctrl: " Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 49/55] rockchip: Move the MMC setup check earlier Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 50/55] rockchip: Don't use spl_boot_device() with of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 51/55] rockchip: syscon: Update to work " Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 52/55] rockchip: sdram: Move all DT decoding to ofdata_to_platdata() Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 53/55] rockchip: sdram: Update the driver to support of-platdata Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 54/55] rockchip: Use of-platdata for firefly-rk3288 Simon Glass
2016-06-13  5:33 ` [U-Boot] [PATCH v2 55/55] dm: Update the of-platdata README for the new features Simon Glass
2016-06-23 20:04   ` Tom Rini
2016-06-23 20:36     ` Simon Glass
2016-06-23 22:55       ` Tom Rini
2016-06-26  3:00         ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.