]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Add an option to support SPL in read-only memory
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 04:25:35 +0000 (17:25 +1300)
committerSimon Glass <sjg@chromium.org>
Fri, 26 Mar 2021 04:03:09 +0000 (17:03 +1300)
Some systems (e.g. x86 APL) run SPL from read-only memory. The device
instances created by dtoc are therefore not writeable. To make things work
we would need to copy the devices to read/write memory.

To avoid this, add an option to use a separate runtime struct for devices,
just as is done for drivers. This can be used to hold information that
changes at runtime, avoiding the need for a copy.

Also add a Kconfig option for read-only SPL, which selects this feature.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
common/spl/Kconfig
dts/Kconfig

index 774541c02bc7264117cc17e67a9c6226a6188eb2..584f8483e2e4a2c3405921b07471eb1c7af52bf1 100644 (file)
@@ -276,6 +276,19 @@ config SPL_SEPARATE_BSS
          location is used. Normally we put the device tree at the end of BSS
          but with this option enabled, it goes at _image_binary_end.
 
+config SPL_READ_ONLY
+       bool
+       depends on SPL_OF_PLATDATA
+       # Bind cannot be supported because the udevice structs are in read-only
+       # memory so we cannot update the linked lists.
+       select SPL_OF_PLATDATA_NO_BIND
+       select SPL_OF_PLATDATA_RT
+       help
+         Some platforms (e.g. x86 Apollo Lake) load SPL into a read-only
+         section of memory. This means that of-platdata must make a copy (in
+         writeable memory) of anything it wants to modify, such as
+         device-private data.
+
 config SPL_BANNER_PRINT
        bool "Enable output of the SPL banner 'U-Boot SPL ...'"
        default y
@@ -1440,6 +1453,17 @@ config TPL_STACK
          The address of the initial stack-pointer for the TPL stage.
          Usually this will be the (aligned) top-of-stack.
 
+config TPL_READ_ONLY
+       bool
+       depends on TPL_OF_PLATDATA
+       select TPL_OF_PLATDATA_NO_BIND
+       select TPL_OF_PLATDATA_RT
+       help
+         Some platforms (e.g. x86 Apollo Lake) load SPL into a read-only
+         section of memory. This means that of-platdata must make a copy (in
+         writeable memory) of anything it wants to modify, such as
+         device-private data.
+
 config TPL_BOOTROM_SUPPORT
         bool "Support returning to the BOOTROM (from TPL)"
        help
index d289752a139e692f770d49823315ab3a7a9b17c3..e6bbdc596bdf450b09094ed0e2db5186d43d5f1b 100644 (file)
@@ -380,6 +380,17 @@ config SPL_OF_PLATDATA_NO_BIND
          some code space in U-Boot. This can be disabled if binding is needed,
          at the code of some code size increase.
 
+config SPL_OF_PLATDATA_RT
+       bool "Use a separate struct for device runtime data"
+       depends on SPL_OF_PLATDATA_INST
+       default y
+       help
+         For systems running SPL from read-only memory it is convenient to
+         separate out the runtime information, so that the devices don't need
+         to be copied before being used. This moves the read-write parts of
+         struct udevice (at present just the flags) into a separate struct,
+         which is allocated at runtime.
+
 endif
 
 config TPL_OF_PLATDATA
@@ -429,6 +440,17 @@ config TPL_OF_PLATDATA_NO_BIND
          some code space in U-Boot. This can be disabled if binding is needed,
          at the code of some code size increase.
 
+config TPL_OF_PLATDATA_RT
+       bool "Use a separate struct for device runtime data"
+       depends on TPL_OF_PLATDATA_INST
+       default y
+       help
+         For systems running TPL from read-only memory it is convenient to
+         separate out the runtime information, so that the devices don't need
+         to be copied before being used. This moves the read-write parts of
+         struct udevice (at present just the flags) into a separate struct,
+         which is allocated at runtime.
+
 endif
 
 endmenu