aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch')
-rw-r--r--recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch b/recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch
new file mode 100644
index 00000000..b7d179f8
--- /dev/null
+++ b/recipes-bsp/u-boot/u-boot/0001-fdt-add-memory-bank-decoding-functions-for-board-set.patch
@@ -0,0 +1,144 @@
+From 623f60198b38c4fdae596038cd5956e44b6224a4 Mon Sep 17 00:00:00 2001
+From: Nathan Rossi <nathan@nathanrossi.com>
+Date: Mon, 19 Dec 2016 00:03:34 +1000
+Subject: [PATCH 1/3] fdt: add memory bank decoding functions for board setup
+
+Add two functions for use by board implementations to decode the memory
+banks of the /memory node so as to populate the global data with
+ram_size and board info for memory banks.
+
+The fdtdec_setup_memory_size() function decodes the first memory bank
+and sets up the gd->ram_size with the size of the memory bank. This
+function should be called from the boards dram_init().
+
+The fdtdec_setup_memory_banksize() function decode the memory banks
+(up to the CONFIG_NR_DRAM_BANKS) and populates the base address and size
+into the gd->bd->bi_dram array of banks. This function should be called
+from the boards dram_init_banksize().
+
+Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Michal Simek <monstr@monstr.eu>
+Reviewed-by: Simon Glass <sjg@chromium.org>
+Signed-off-by: Michal Simek <michal.simek@xilinx.com>
+Upstream-Status: Backport
+---
+ include/fdtdec.h | 34 ++++++++++++++++++++++++++++++++++
+ lib/fdtdec.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 90 insertions(+)
+
+diff --git a/include/fdtdec.h b/include/fdtdec.h
+index 27887c8c21..d074478f14 100644
+--- a/include/fdtdec.h
++++ b/include/fdtdec.h
+@@ -976,6 +976,40 @@ struct display_timing {
+ */
+ int fdtdec_decode_display_timing(const void *blob, int node, int index,
+ struct display_timing *config);
++
++/**
++ * fdtdec_setup_memory_size() - decode and setup gd->ram_size
++ *
++ * Decode the /memory 'reg' property to determine the size of the first memory
++ * bank, populate the global data with the size of the first bank of memory.
++ *
++ * This function should be called from a boards dram_init(). This helper
++ * function allows for boards to query the device tree for DRAM size instead of
++ * hard coding the value in the case where the memory size cannot be detected
++ * automatically.
++ *
++ * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
++ * invalid
++ */
++int fdtdec_setup_memory_size(void);
++
++/**
++ * fdtdec_setup_memory_banksize() - decode and populate gd->bd->bi_dram
++ *
++ * Decode the /memory 'reg' property to determine the address and size of the
++ * memory banks. Use this data to populate the global data board info with the
++ * phys address and size of memory banks.
++ *
++ * This function should be called from a boards dram_init_banksize(). This
++ * helper function allows for boards to query the device tree for memory bank
++ * information instead of hard coding the information in cases where it cannot
++ * be detected automatically.
++ *
++ * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
++ * invalid
++ */
++int fdtdec_setup_memory_banksize(void);
++
+ /**
+ * Set up the device tree ready for use
+ */
+diff --git a/lib/fdtdec.c b/lib/fdtdec.c
+index 4e619c49a2..81f47ef2c7 100644
+--- a/lib/fdtdec.c
++++ b/lib/fdtdec.c
+@@ -1174,6 +1174,62 @@ int fdtdec_decode_display_timing(const void *blob, int parent, int index,
+ return ret;
+ }
+
++int fdtdec_setup_memory_size(void)
++{
++ int ret, mem;
++ struct fdt_resource res;
++
++ mem = fdt_path_offset(gd->fdt_blob, "/memory");
++ if (mem < 0) {
++ debug("%s: Missing /memory node\n", __func__);
++ return -EINVAL;
++ }
++
++ ret = fdt_get_resource(gd->fdt_blob, mem, "reg", 0, &res);
++ if (ret != 0) {
++ debug("%s: Unable to decode first memory bank\n", __func__);
++ return -EINVAL;
++ }
++
++ gd->ram_size = (phys_size_t)(res.end - res.start + 1);
++ debug("%s: Initial DRAM size %llx\n", __func__, (u64)gd->ram_size);
++
++ return 0;
++}
++
++#if defined(CONFIG_NR_DRAM_BANKS)
++int fdtdec_setup_memory_banksize(void)
++{
++ int bank, ret, mem;
++ struct fdt_resource res;
++
++ mem = fdt_path_offset(gd->fdt_blob, "/memory");
++ if (mem < 0) {
++ debug("%s: Missing /memory node\n", __func__);
++ return -EINVAL;
++ }
++
++ for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
++ ret = fdt_get_resource(gd->fdt_blob, mem, "reg", bank, &res);
++ if (ret == -FDT_ERR_NOTFOUND)
++ break;
++ if (ret != 0)
++ return -EINVAL;
++
++ gd->bd->bi_dram[bank].start = (phys_addr_t)res.start;
++ gd->bd->bi_dram[bank].size =
++ (phys_size_t)(res.end - res.start + 1);
++
++ debug("%s: DRAM Bank #%d: start = 0x%llx, size = 0x%llx\n",
++ __func__, bank,
++ (unsigned long long)gd->bd->bi_dram[bank].start,
++ (unsigned long long)gd->bd->bi_dram[bank].size);
++ }
++
++ return 0;
++}
++#endif
++
+ int fdtdec_setup(void)
+ {
+ #if CONFIG_IS_ENABLED(OF_CONTROL)
+--
+2.11.0
+