Re: [PATCH v5 03/11] drivers: of: add initialization code for dynamic reserved memory

2014-02-26 Thread Grant Likely
On Fri, 21 Feb 2014 13:25:19 +0100, Marek Szyprowski m.szyprow...@samsung.com 
wrote:
 This patch adds support for dynamically allocated reserved memory regions
 declared in device tree. Such regions are defined by 'size', 'alignment'
 and 'alloc-ranges' properties.
 
 Based on previous code provided by Josh Cartwright jo...@codeaurora.org
 
 Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com

Acked-by: Grant Likely grant.lik...@linaro.org

 ---
  drivers/of/Kconfig  |6 ++
  drivers/of/Makefile |1 +
  drivers/of/fdt.c|   13 ++-
  drivers/of/of_reserved_mem.c|  188 
 +++
  include/linux/of_reserved_mem.h |   21 +
  5 files changed, 227 insertions(+), 2 deletions(-)
  create mode 100644 drivers/of/of_reserved_mem.c
  create mode 100644 include/linux/of_reserved_mem.h
 
 diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
 index c6973f101a3e..30a7d87a8077 100644
 --- a/drivers/of/Kconfig
 +++ b/drivers/of/Kconfig
 @@ -75,4 +75,10 @@ config OF_MTD
   depends on MTD
   def_bool y
  
 +config OF_RESERVED_MEM
 + depends on OF_EARLY_FLATTREE
 + bool
 + help
 +   Helpers to allow for reservation of memory regions
 +
  endmenu # OF
 diff --git a/drivers/of/Makefile b/drivers/of/Makefile
 index efd05102c405..ed9660adad77 100644
 --- a/drivers/of/Makefile
 +++ b/drivers/of/Makefile
 @@ -9,3 +9,4 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o
  obj-$(CONFIG_OF_PCI) += of_pci.o
  obj-$(CONFIG_OF_PCI_IRQ)  += of_pci_irq.o
  obj-$(CONFIG_OF_MTD) += of_mtd.o
 +obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
 diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
 index 12809e20ef71..eafe5805257a 100644
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
 @@ -15,6 +15,7 @@
  #include linux/module.h
  #include linux/of.h
  #include linux/of_fdt.h
 +#include linux/of_reserved_mem.h
  #include linux/string.h
  #include linux/errno.h
  #include linux/slab.h
 @@ -449,7 +450,7 @@ static int __init __reserved_mem_reserve_reg(unsigned 
 long node,
   phys_addr_t base, size;
   unsigned long len;
   __be32 *prop;
 - int nomap;
 + int nomap, first = 1;
  
   prop = of_get_flat_dt_prop(node, reg, len);
   if (!prop)
 @@ -476,6 +477,10 @@ static int __init __reserved_mem_reserve_reg(unsigned 
 long node,
   uname, base, (unsigned long)size / SZ_1M);
  
   len -= t_len;
 + if (first) {
 + fdt_reserved_mem_save_node(node, uname, base, size);
 + first = 0;
 + }
   }
   return 0;
  }
 @@ -506,6 +511,7 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
 node, const char *uname,
  {
   static int found;
   const char *status;
 + int err;
  
   if (!found  depth == 1  strcmp(uname, reserved-memory) == 0) {
   if (__reserved_mem_check_root(node) != 0) {
 @@ -528,7 +534,9 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
 node, const char *uname,
   if (status  strcmp(status, okay) != 0  strcmp(status, ok) != 0)
   return 0;
  
 - __reserved_mem_reserve_reg(node, uname);
 + err = __reserved_mem_reserve_reg(node, uname);
 + if (err == -ENOENT  of_get_flat_dt_prop(node, size, NULL))
 + fdt_reserved_mem_save_node(node, uname, 0, 0);
  
   /* scan next node */
   return 0;
 @@ -544,6 +552,7 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
 node, const char *uname,
  void __init early_init_fdt_scan_reserved_mem(void)
  {
   of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
 + fdt_init_reserved_mem();
  }
  
  /**
 diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
 new file mode 100644
 index ..c7ca6a4a42d1
 --- /dev/null
 +++ b/drivers/of/of_reserved_mem.c
 @@ -0,0 +1,188 @@
 +/*
 + * Device tree based initialization code for reserved memory.
 + *
 + * Copyright (c) 2013, The Linux Foundation. All Rights Reserved.
 + * Copyright (c) 2013,2014 Samsung Electronics Co., Ltd.
 + *   http://www.samsung.com
 + * Author: Marek Szyprowski m.szyprow...@samsung.com
 + * Author: Josh Cartwright jo...@codeaurora.org
 + *
 + * This program is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License as
 + * published by the Free Software Foundation; either version 2 of the
 + * License or (at your optional) any later version of the license.
 + */
 +
 +#include linux/err.h
 +#include linux/of.h
 +#include linux/of_fdt.h
 +#include linux/of_platform.h
 +#include linux/mm.h
 +#include linux/sizes.h
 +#include linux/of_reserved_mem.h
 +
 +#define MAX_RESERVED_REGIONS 16
 +static struct reserved_mem reserved_mem[MAX_RESERVED_REGIONS];
 +static int reserved_mem_count;
 +
 +#if defined(CONFIG_HAVE_MEMBLOCK)
 +#include linux/memblock.h
 +int __init __weak early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
 + 

[PATCH v5 03/11] drivers: of: add initialization code for dynamic reserved memory

2014-02-21 Thread Marek Szyprowski
This patch adds support for dynamically allocated reserved memory regions
declared in device tree. Such regions are defined by 'size', 'alignment'
and 'alloc-ranges' properties.

Based on previous code provided by Josh Cartwright jo...@codeaurora.org

Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com
---
 drivers/of/Kconfig  |6 ++
 drivers/of/Makefile |1 +
 drivers/of/fdt.c|   13 ++-
 drivers/of/of_reserved_mem.c|  188 +++
 include/linux/of_reserved_mem.h |   21 +
 5 files changed, 227 insertions(+), 2 deletions(-)
 create mode 100644 drivers/of/of_reserved_mem.c
 create mode 100644 include/linux/of_reserved_mem.h

diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
index c6973f101a3e..30a7d87a8077 100644
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
@@ -75,4 +75,10 @@ config OF_MTD
depends on MTD
def_bool y
 
+config OF_RESERVED_MEM
+   depends on OF_EARLY_FLATTREE
+   bool
+   help
+ Helpers to allow for reservation of memory regions
+
 endmenu # OF
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index efd05102c405..ed9660adad77 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -9,3 +9,4 @@ obj-$(CONFIG_OF_MDIO)   += of_mdio.o
 obj-$(CONFIG_OF_PCI)   += of_pci.o
 obj-$(CONFIG_OF_PCI_IRQ)  += of_pci_irq.o
 obj-$(CONFIG_OF_MTD)   += of_mtd.o
+obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 12809e20ef71..eafe5805257a 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -15,6 +15,7 @@
 #include linux/module.h
 #include linux/of.h
 #include linux/of_fdt.h
+#include linux/of_reserved_mem.h
 #include linux/string.h
 #include linux/errno.h
 #include linux/slab.h
@@ -449,7 +450,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long 
node,
phys_addr_t base, size;
unsigned long len;
__be32 *prop;
-   int nomap;
+   int nomap, first = 1;
 
prop = of_get_flat_dt_prop(node, reg, len);
if (!prop)
@@ -476,6 +477,10 @@ static int __init __reserved_mem_reserve_reg(unsigned long 
node,
uname, base, (unsigned long)size / SZ_1M);
 
len -= t_len;
+   if (first) {
+   fdt_reserved_mem_save_node(node, uname, base, size);
+   first = 0;
+   }
}
return 0;
 }
@@ -506,6 +511,7 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
node, const char *uname,
 {
static int found;
const char *status;
+   int err;
 
if (!found  depth == 1  strcmp(uname, reserved-memory) == 0) {
if (__reserved_mem_check_root(node) != 0) {
@@ -528,7 +534,9 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
node, const char *uname,
if (status  strcmp(status, okay) != 0  strcmp(status, ok) != 0)
return 0;
 
-   __reserved_mem_reserve_reg(node, uname);
+   err = __reserved_mem_reserve_reg(node, uname);
+   if (err == -ENOENT  of_get_flat_dt_prop(node, size, NULL))
+   fdt_reserved_mem_save_node(node, uname, 0, 0);
 
/* scan next node */
return 0;
@@ -544,6 +552,7 @@ static int __init __fdt_scan_reserved_mem(unsigned long 
node, const char *uname,
 void __init early_init_fdt_scan_reserved_mem(void)
 {
of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
+   fdt_init_reserved_mem();
 }
 
 /**
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
new file mode 100644
index ..c7ca6a4a42d1
--- /dev/null
+++ b/drivers/of/of_reserved_mem.c
@@ -0,0 +1,188 @@
+/*
+ * Device tree based initialization code for reserved memory.
+ *
+ * Copyright (c) 2013, The Linux Foundation. All Rights Reserved.
+ * Copyright (c) 2013,2014 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com
+ * Author: Marek Szyprowski m.szyprow...@samsung.com
+ * Author: Josh Cartwright jo...@codeaurora.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License or (at your optional) any later version of the license.
+ */
+
+#include linux/err.h
+#include linux/of.h
+#include linux/of_fdt.h
+#include linux/of_platform.h
+#include linux/mm.h
+#include linux/sizes.h
+#include linux/of_reserved_mem.h
+
+#define MAX_RESERVED_REGIONS   16
+static struct reserved_mem reserved_mem[MAX_RESERVED_REGIONS];
+static int reserved_mem_count;
+
+#if defined(CONFIG_HAVE_MEMBLOCK)
+#include linux/memblock.h
+int __init __weak early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
+   phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap,
+   phys_addr_t *res_base)
+{
+   /*
+* We use __memblock_alloc_base() because memblock_alloc_base()
+*