Re: [PATCH v6 05/11] drivers: of: add automated assignment of reserved regions to client devices

2014-05-14 Thread Grant Likely
On Wed, 14 May 2014 10:15:38 +0100, "Jon Medhurst (Tixy)"  
wrote:
> On Sun, 2014-03-02 at 13:40 +0800, Grant Likely wrote:
> > On Fri, 28 Feb 2014 14:42:50 +0100, Marek Szyprowski 
> >  wrote:
> > > This patch adds code for automated assignment of reserved memory regions
> > > to struct device. reserved_mem->ops->device_init()/device_cleanup()
> > > callbacks are called to perform reserved memory driver specific
> > > initialization and cleanup
> > > 
> > > Based on previous code provided by Josh Cartwright 
> > > 
> > > Signed-off-by: Marek Szyprowski 
> > 
> > Hi Marek,
> > 
> > I've not applied this one yet, only because there is still the open
> > issue of whether or not these functions should be called from drivers or
> > from core code. I don't actually have any problems with the content of
> > this patch. Once the user is sorted out I'll merge it.
> 
> Has anything more come of these patches? I see some of the series is now
> in Linux 3.15, but the actual patches to let people use the feature
> aren't there yet, namely patches 5 though 8.
> 
> My personal immediate interest in these is as a mechanism on arm64 to
> limit CMA to a region of memory that is actually DMA-able devices (e.g.
> below 4GB for 32-bit devices without an iommu).
> 
> For reference, the mail archives for this series is at
> http://lkml.org/lkml/2014/2/28/237

IIRC, the issue I have with patch 5-8 is that I don't like the driver core
going off and doing automagical things to attach regions to devices.
I've not seen any more discussion on this topic since I merged the
patches I was okay with, but I may have missed something.

g.

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v6 05/11] drivers: of: add automated assignment of reserved regions to client devices

2014-05-14 Thread Jon Medhurst (Tixy)
On Sun, 2014-03-02 at 13:40 +0800, Grant Likely wrote:
> On Fri, 28 Feb 2014 14:42:50 +0100, Marek Szyprowski 
>  wrote:
> > This patch adds code for automated assignment of reserved memory regions
> > to struct device. reserved_mem->ops->device_init()/device_cleanup()
> > callbacks are called to perform reserved memory driver specific
> > initialization and cleanup
> > 
> > Based on previous code provided by Josh Cartwright 
> > 
> > Signed-off-by: Marek Szyprowski 
> 
> Hi Marek,
> 
> I've not applied this one yet, only because there is still the open
> issue of whether or not these functions should be called from drivers or
> from core code. I don't actually have any problems with the content of
> this patch. Once the user is sorted out I'll merge it.

Has anything more come of these patches? I see some of the series is now
in Linux 3.15, but the actual patches to let people use the feature
aren't there yet, namely patches 5 though 8.

My personal immediate interest in these is as a mechanism on arm64 to
limit CMA to a region of memory that is actually DMA-able devices (e.g.
below 4GB for 32-bit devices without an iommu).

For reference, the mail archives for this series is at
http://lkml.org/lkml/2014/2/28/237

-- 
Tixy

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v6 05/11] drivers: of: add automated assignment of reserved regions to client devices

2014-03-02 Thread Grant Likely
On Fri, 28 Feb 2014 14:42:50 +0100, Marek Szyprowski  
wrote:
> This patch adds code for automated assignment of reserved memory regions
> to struct device. reserved_mem->ops->device_init()/device_cleanup()
> callbacks are called to perform reserved memory driver specific
> initialization and cleanup
> 
> Based on previous code provided by Josh Cartwright 
> 
> Signed-off-by: Marek Szyprowski 

Hi Marek,

I've not applied this one yet, only because there is still the open
issue of whether or not these functions should be called from drivers or
from core code. I don't actually have any problems with the content of
this patch. Once the user is sorted out I'll merge it.

g.

> ---
>  drivers/of/of_reserved_mem.c|   70 
> +++
>  include/linux/of_reserved_mem.h |7 
>  2 files changed, 77 insertions(+)
> 
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index daaaf935911d..5c45016efd31 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -206,8 +206,16 @@ void __init fdt_init_reserved_mem(void)
>   for (i = 0; i < reserved_mem_count; i++) {
>   struct reserved_mem *rmem = &reserved_mem[i];
>   unsigned long node = rmem->fdt_node;
> + unsigned long len;
> + __be32 *prop;
>   int err = 0;
>  
> + prop = of_get_flat_dt_prop(node, "phandle", &len);
> + if (!prop)
> + prop = of_get_flat_dt_prop(node, "linux,phandle", &len);
> + if (prop)
> + rmem->phandle = of_read_number(prop, len/4);
> +
>   if (rmem->size == 0)
>   err = __reserved_mem_alloc_size(node, rmem->name,
>&rmem->base, &rmem->size);
> @@ -215,3 +223,65 @@ void __init fdt_init_reserved_mem(void)
>   __reserved_mem_init_node(rmem);
>   }
>  }
> +
> +static inline struct reserved_mem *__find_rmem(struct device_node *node)
> +{
> + unsigned int i;
> +
> + if (!node->phandle)
> + return NULL;
> +
> + for (i = 0; i < reserved_mem_count; i++)
> + if (reserved_mem[i].phandle == node->phandle)
> + return &reserved_mem[i];
> + return NULL;
> +}
> +
> +/**
> + * of_reserved_mem_device_init() - assign reserved memory region to given 
> device
> + *
> + * This function assign memory region pointed by "memory-region" device tree
> + * property to the given device.
> + */
> +void of_reserved_mem_device_init(struct device *dev)
> +{
> + struct reserved_mem *rmem;
> + struct device_node *np;
> +
> + np = of_parse_phandle(dev->of_node, "memory-region", 0);
> + if (!np)
> + return;
> +
> + rmem = __find_rmem(np);
> + of_node_put(np);
> +
> + if (!rmem || !rmem->ops || !rmem->ops->device_init)
> + return;
> +
> + rmem->ops->device_init(rmem, dev);
> + dev_info(dev, "assigned reserved memory node %s\n", rmem->name);
> +}
> +
> +/**
> + * of_reserved_mem_device_release() - release reserved memory device 
> structures
> + *
> + * This function releases structures allocated for memory region handling for
> + * the given device.
> + */
> +void of_reserved_mem_device_release(struct device *dev)
> +{
> + struct reserved_mem *rmem;
> + struct device_node *np;
> +
> + np = of_parse_phandle(dev->of_node, "memory-region", 0);
> + if (!np)
> + return;
> +
> + rmem = __find_rmem(np);
> + of_node_put(np);
> +
> + if (!rmem || !rmem->ops || !rmem->ops->device_release)
> + return;
> +
> + rmem->ops->device_release(rmem, dev);
> +}
> diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
> index 9b1fbb7f29fc..6a54e6565b89 100644
> --- a/include/linux/of_reserved_mem.h
> +++ b/include/linux/of_reserved_mem.h
> @@ -8,6 +8,7 @@ struct reserved_mem_ops;
>  struct reserved_mem {
>   const char  *name;
>   unsigned long   fdt_node;
> + unsigned long   phandle;
>   const struct reserved_mem_ops   *ops;
>   phys_addr_t base;
>   phys_addr_t size;
> @@ -25,6 +26,9 @@ typedef int (*reservedmem_of_init_fn)(struct reserved_mem 
> *rmem,
> unsigned long node, const char *uname);
>  
>  #ifdef CONFIG_OF_RESERVED_MEM
> +void of_reserved_mem_device_init(struct device *dev);
> +void of_reserved_mem_device_release(struct device *dev);
> +
>  void fdt_init_reserved_mem(void);
>  void fdt_reserved_mem_save_node(unsigned long node, const char *uname,
>  phys_addr_t base, phys_addr_t size);
> @@ -37,6 +41,9 @@ void fdt_reserved_mem_save_node(unsigned long node, const 
> char *uname,
>   init : init }
>  
>  #else
> +static inline void of_reserved_mem_device_init(stru

[PATCH v6 05/11] drivers: of: add automated assignment of reserved regions to client devices

2014-02-28 Thread Marek Szyprowski
This patch adds code for automated assignment of reserved memory regions
to struct device. reserved_mem->ops->device_init()/device_cleanup()
callbacks are called to perform reserved memory driver specific
initialization and cleanup

Based on previous code provided by Josh Cartwright 

Signed-off-by: Marek Szyprowski 
---
 drivers/of/of_reserved_mem.c|   70 +++
 include/linux/of_reserved_mem.h |7 
 2 files changed, 77 insertions(+)

diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index daaaf935911d..5c45016efd31 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -206,8 +206,16 @@ void __init fdt_init_reserved_mem(void)
for (i = 0; i < reserved_mem_count; i++) {
struct reserved_mem *rmem = &reserved_mem[i];
unsigned long node = rmem->fdt_node;
+   unsigned long len;
+   __be32 *prop;
int err = 0;
 
+   prop = of_get_flat_dt_prop(node, "phandle", &len);
+   if (!prop)
+   prop = of_get_flat_dt_prop(node, "linux,phandle", &len);
+   if (prop)
+   rmem->phandle = of_read_number(prop, len/4);
+
if (rmem->size == 0)
err = __reserved_mem_alloc_size(node, rmem->name,
 &rmem->base, &rmem->size);
@@ -215,3 +223,65 @@ void __init fdt_init_reserved_mem(void)
__reserved_mem_init_node(rmem);
}
 }
+
+static inline struct reserved_mem *__find_rmem(struct device_node *node)
+{
+   unsigned int i;
+
+   if (!node->phandle)
+   return NULL;
+
+   for (i = 0; i < reserved_mem_count; i++)
+   if (reserved_mem[i].phandle == node->phandle)
+   return &reserved_mem[i];
+   return NULL;
+}
+
+/**
+ * of_reserved_mem_device_init() - assign reserved memory region to given 
device
+ *
+ * This function assign memory region pointed by "memory-region" device tree
+ * property to the given device.
+ */
+void of_reserved_mem_device_init(struct device *dev)
+{
+   struct reserved_mem *rmem;
+   struct device_node *np;
+
+   np = of_parse_phandle(dev->of_node, "memory-region", 0);
+   if (!np)
+   return;
+
+   rmem = __find_rmem(np);
+   of_node_put(np);
+
+   if (!rmem || !rmem->ops || !rmem->ops->device_init)
+   return;
+
+   rmem->ops->device_init(rmem, dev);
+   dev_info(dev, "assigned reserved memory node %s\n", rmem->name);
+}
+
+/**
+ * of_reserved_mem_device_release() - release reserved memory device structures
+ *
+ * This function releases structures allocated for memory region handling for
+ * the given device.
+ */
+void of_reserved_mem_device_release(struct device *dev)
+{
+   struct reserved_mem *rmem;
+   struct device_node *np;
+
+   np = of_parse_phandle(dev->of_node, "memory-region", 0);
+   if (!np)
+   return;
+
+   rmem = __find_rmem(np);
+   of_node_put(np);
+
+   if (!rmem || !rmem->ops || !rmem->ops->device_release)
+   return;
+
+   rmem->ops->device_release(rmem, dev);
+}
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 9b1fbb7f29fc..6a54e6565b89 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -8,6 +8,7 @@ struct reserved_mem_ops;
 struct reserved_mem {
const char  *name;
unsigned long   fdt_node;
+   unsigned long   phandle;
const struct reserved_mem_ops   *ops;
phys_addr_t base;
phys_addr_t size;
@@ -25,6 +26,9 @@ typedef int (*reservedmem_of_init_fn)(struct reserved_mem 
*rmem,
  unsigned long node, const char *uname);
 
 #ifdef CONFIG_OF_RESERVED_MEM
+void of_reserved_mem_device_init(struct device *dev);
+void of_reserved_mem_device_release(struct device *dev);
+
 void fdt_init_reserved_mem(void);
 void fdt_reserved_mem_save_node(unsigned long node, const char *uname,
   phys_addr_t base, phys_addr_t size);
@@ -37,6 +41,9 @@ void fdt_reserved_mem_save_node(unsigned long node, const 
char *uname,
init : init }
 
 #else
+static inline void of_reserved_mem_device_init(struct device *dev) { }
+static inline void of_reserved_mem_device_release(struct device *pdev) { }
+
 static inline void fdt_init_reserved_mem(void) { }
 static inline void fdt_reserved_mem_save_node(unsigned long node,
const char *uname, phys_addr_t base, phys_addr_t size) { }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html