mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/3] common: driver: Allow for I/O mapped I/O in resource requests
@ 2014-03-25 11:11 Michel Stam
  2014-03-26  6:46 ` Sascha Hauer
  0 siblings, 1 reply; 2+ messages in thread
From: Michel Stam @ 2014-03-25 11:11 UTC (permalink / raw)
  To: barebox

The current resource framework is fully geared towards memory
mapped I/O.
This patch adds support for other types of I/O in the resource
structures / function calls.
---
  common/memory.c        |  2 +-
  common/resource.c      | 18 ++++++++++++++++--
  drivers/base/driver.c  | 36 ++++++++++++++++++------------------
  include/driver.h       | 24 +++++++++++++++++-------
  include/linux/ioport.h |  5 ++++-
  5 files changed, 56 insertions(+), 29 deletions(-)

diff --git a/common/memory.c b/common/memory.c
index c82bbaa..d36c8df 100644
--- a/common/memory.c
+++ b/common/memory.c
@@ -148,7 +148,7 @@ struct resource *request_sdram_region(const char 
*name, resource_size_t start,
  	for_each_memory_bank(bank) {
  		struct resource *res;
  -		res = request_region(bank->res, name, start, start + size - 1);
+		res = request_region(bank->res, name, start, start + size - 1, 
IORESOURCE_MEM);
  		if (res)
  			return res;
  	}
diff --git a/common/resource.c b/common/resource.c
index 5795e79..6600444 100644
--- a/common/resource.c
+++ b/common/resource.c
@@ -38,7 +38,7 @@ static int init_resource(struct resource *res, const 
char *name)
   */
  struct resource *request_region(struct resource *parent,
  		const char *name, resource_size_t start,
-		resource_size_t end)
+		resource_size_t end, int type)
  {
  	struct resource *r, *new;
  @@ -70,6 +70,10 @@ struct resource *request_region(struct resource 
*parent,
  			goto ok;
  		if (start > r->end)
  			continue;
+
+		if (type != resource_type(r->parent))
+			continue;
+
  		debug("%s: 0x%08llx:0x%08llx conflicts with 0x%08llx:0x%08llx\n",
  				__func__,
  				(unsigned long long)start,
@@ -89,6 +93,7 @@ ok:
  	new->start = start;
  	new->end = end;
  	new->parent = parent;
+	new->flags = type;
  	list_add_tail(&new->sibling, &r->sibling);
   	return new;
@@ -123,5 +128,14 @@ struct resource iomem_resource = {
  struct resource *request_iomem_region(const char *name,
  		resource_size_t start, resource_size_t end)
  {
-	return request_region(&iomem_resource, name, start, end);
+	return request_region(&iomem_resource, name, start, end, IORESOURCE_MEM);
+}
+
+/*
+ * request an io region inside the io space
+ */
+struct resource *request_io_region(const char *name,
+		resource_size_t start, resource_size_t end,int type)
+{
+	return request_region(&iomem_resource, name, start, end, type);
  }
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 37560fd..560579a 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -241,13 +241,13 @@ int register_driver(struct driver_d *drv)
  }
  EXPORT_SYMBOL(register_driver);
  -struct resource *dev_get_resource(struct device_d *dev, int num)
+struct resource *dev_get_resource(struct device_d *dev, int num, int type)
  {
  	int i, n = 0;
   	for (i = 0; i < dev->num_resources; i++) {
  		struct resource *res = &dev->resource[i];
-		if (resource_type(res) == IORESOURCE_MEM) {
+		if (!type || (resource_type(res) == type)) {
  			if (n == num)
  				return res;
  			n++;
@@ -257,26 +257,26 @@ struct resource *dev_get_resource(struct device_d 
*dev, int num)
  	return NULL;
  }
  -void *dev_get_mem_region(struct device_d *dev, int num)
+void *dev_get_region(struct device_d *dev, int num, int type)
  {
  	struct resource *res;
  -	res = dev_get_resource(dev, num);
+	res = dev_get_resource(dev, num, type);
  	if (!res)
  		return NULL;
   	return (void __force *)res->start;
  }
-EXPORT_SYMBOL(dev_get_mem_region);
+EXPORT_SYMBOL(dev_get_region);
   struct resource *dev_get_resource_by_name(struct device_d *dev,
-					  const char *name)
+					  const char *name, int type)
  {
  	int i;
   	for (i = 0; i < dev->num_resources; i++) {
  		struct resource *res = &dev->resource[i];
-		if (resource_type(res) != IORESOURCE_MEM)
+		if (!type && (resource_type(res) != type))
  			continue;
  		if (!res->name)
  			continue;
@@ -287,49 +287,49 @@ struct resource *dev_get_resource_by_name(struct 
device_d *dev,
  	return NULL;
  }
  -void *dev_get_mem_region_by_name(struct device_d *dev, const char *name)
+void *dev_get_region_by_name(struct device_d *dev, const char *name, 
int type)
  {
  	struct resource *res;
  -	res = dev_get_resource_by_name(dev, name);
+	res = dev_get_resource_by_name(dev, name, type);
  	if (!res)
  		return NULL;
   	return (void __force *)res->start;
  }
-EXPORT_SYMBOL(dev_get_mem_region_by_name);
+EXPORT_SYMBOL(dev_get_region_by_name);
  -void __iomem *dev_request_mem_region_by_name(struct device_d *dev, 
const char *name)
+void __iomem *dev_request_region_by_name(struct device_d *dev, const 
char *name, int type)
  {
  	struct resource *res;
  -	res = dev_get_resource_by_name(dev, name);
+	res = dev_get_resource_by_name(dev, name, type);
  	if (!res)
  		return NULL;
  -	res = request_iomem_region(dev_name(dev), res->start, res->end);
+	res = request_io_region(dev_name(dev), res->start, res->end, type);
  	if (!res)
  		return NULL;
   	return (void __force __iomem *)res->start;
  }
-EXPORT_SYMBOL(dev_request_mem_region_by_name);
+EXPORT_SYMBOL(dev_request_region_by_name);
  -void __iomem *dev_request_mem_region(struct device_d *dev, int num)
+void __iomem *dev_request_region(struct device_d *dev, int num,int type)
  {
  	struct resource *res;
  -	res = dev_get_resource(dev, num);
+	res = dev_get_resource(dev, num, type);
  	if (!res)
  		return NULL;
  -	res = request_iomem_region(dev_name(dev), res->start, res->end);
+	res = request_io_region(dev_name(dev), res->start, res->end, type);
  	if (!res)
  		return NULL;
   	return (void __force __iomem *)res->start;
  }
-EXPORT_SYMBOL(dev_request_mem_region);
+EXPORT_SYMBOL(dev_request_region);
   int dev_protect(struct device_d *dev, size_t count, unsigned long 
offset, int prot)
  {
diff --git a/include/driver.h b/include/driver.h
index 01b181d..2eb4cf8 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -203,31 +203,41 @@ static inline const char *dev_name(const struct 
device_d *dev)
  /*
   * get resource 'num' for a device
   */
-struct resource *dev_get_resource(struct device_d *dev, int num);
+struct resource *dev_get_resource(struct device_d *dev, int num, int type);
  /*
   * get resource base 'name' for a device
   */
  struct resource *dev_get_resource_by_name(struct device_d *dev,
-					  const char *name);
+					  const char *name, int type);
+
  /*
+ *
   * get register base 'name' for a device
   */
-void *dev_get_mem_region_by_name(struct device_d *dev, const char *name);
+void *dev_get_region_by_name(struct device_d *dev, const char *name, 
int type);
   /*
   * exlusively request register base 'name' for a device
   */
-void __iomem *dev_request_mem_region_by_name(struct device_d *dev,
-					     const char *name);
+void __iomem *dev_request_region_by_name(struct device_d *dev,
+					 const char *name, int type);
  /*
   * get register base 'num' for a device
   */
-void *dev_get_mem_region(struct device_d *dev, int num);
+void *dev_get_region(struct device_d *dev, int num, int type);
   /*
   * exlusively request register base 'num' for a device
   */
-void __iomem *dev_request_mem_region(struct device_d *dev, int num);
+void __iomem *dev_request_region(struct device_d *dev, int num, int type);
+
+/*
+ * Macros for requesting memory resources
+ */
+#define dev_get_mem_region(dev, num)			dev_get_region(dev, num, 
IORESOURCE_MEM)
+#define dev_get_mem_region_by_name(dev, name)	 
dev_get_region_by_name(dev, name, IORESOURCE_MEM)
+#define dev_request_mem_region_by_name(dev, name) 
dev_request_region_by_name(dev, name, IORESOURCE_MEM)
+#define dev_request_mem_region(dev, num)		dev_request_region(dev, num, 
IORESOURCE_MEM)
   struct device_d *device_alloc(const char *devname, int id);
  diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index ff0cba0..3fc2665 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -138,9 +138,12 @@ static inline unsigned long resource_type(const 
struct resource *res)
  struct resource *request_iomem_region(const char *name,
  		resource_size_t start, resource_size_t end);
  +struct resource *request_io_region(const char *name,
+		resource_size_t start, resource_size_t end, int type);
+
  struct resource *request_region(struct resource *parent,
  		const char *name, resource_size_t end,
-		resource_size_t size);
+		resource_size_t size,int type);
   int release_region(struct resource *res);
  -- 1.8.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 1/3] common: driver: Allow for I/O mapped I/O in resource requests
  2014-03-25 11:11 [PATCH 1/3] common: driver: Allow for I/O mapped I/O in resource requests Michel Stam
@ 2014-03-26  6:46 ` Sascha Hauer
  0 siblings, 0 replies; 2+ messages in thread
From: Sascha Hauer @ 2014-03-26  6:46 UTC (permalink / raw)
  To: Michel Stam; +Cc: barebox

On Tue, Mar 25, 2014 at 12:11:44PM +0100, Michel Stam wrote:
> The current resource framework is fully geared towards memory
> mapped I/O.
> This patch adds support for other types of I/O in the resource
> structures / function calls.
> ---
>  common/memory.c        |  2 +-
>  common/resource.c      | 18 ++++++++++++++++--
>  drivers/base/driver.c  | 36 ++++++++++++++++++------------------
>  include/driver.h       | 24 +++++++++++++++++-------
>  include/linux/ioport.h |  5 ++++-
>  5 files changed, 56 insertions(+), 29 deletions(-)
> 
> diff --git a/common/memory.c b/common/memory.c
> index c82bbaa..d36c8df 100644
> --- a/common/memory.c
> +++ b/common/memory.c
> @@ -148,7 +148,7 @@ struct resource *request_sdram_region(const char
> *name, resource_size_t start,
>  	for_each_memory_bank(bank) {
>  		struct resource *res;
>  -		res = request_region(bank->res, name, start, start + size - 1);
> +		res = request_region(bank->res, name, start, start + size - 1,
> IORESOURCE_MEM);
>  		if (res)
>  			return res;
>  	}
> diff --git a/common/resource.c b/common/resource.c
> index 5795e79..6600444 100644
> --- a/common/resource.c
> +++ b/common/resource.c
> @@ -38,7 +38,7 @@ static int init_resource(struct resource *res,
> const char *name)
>   */
>  struct resource *request_region(struct resource *parent,
>  		const char *name, resource_size_t start,
> -		resource_size_t end)
> +		resource_size_t end, int type)
>  {
>  	struct resource *r, *new;
>  @@ -70,6 +70,10 @@ struct resource *request_region(struct resource
> *parent,
>  			goto ok;
>  		if (start > r->end)
>  			continue;
> +
> +		if (type != resource_type(r->parent))
> +			continue;
> +
>  		debug("%s: 0x%08llx:0x%08llx conflicts with 0x%08llx:0x%08llx\n",
>  				__func__,
>  				(unsigned long long)start,
> @@ -89,6 +93,7 @@ ok:
>  	new->start = start;
>  	new->end = end;
>  	new->parent = parent;
> +	new->flags = type;
>  	list_add_tail(&new->sibling, &r->sibling);
>   	return new;
> @@ -123,5 +128,14 @@ struct resource iomem_resource = {
>  struct resource *request_iomem_region(const char *name,
>  		resource_size_t start, resource_size_t end)
>  {
> -	return request_region(&iomem_resource, name, start, end);
> +	return request_region(&iomem_resource, name, start, end, IORESOURCE_MEM);
> +}
> +
> +/*
> + * request an io region inside the io space
> + */
> +struct resource *request_io_region(const char *name,
> +		resource_size_t start, resource_size_t end,int type)
> +{
> +	return request_region(&iomem_resource, name, start, end, type);
>  }

iomem and memory really are two different resource trees. There is
memory from 0x0 to 0xffff and there are also ioports in this region. We
really have two toplevel resources. Also the iports do not span the
whole 32bit area, on x86 they are only up to 0xffff.
You would have to create a ioport command equivalent to the iomem
command we have now.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2014-03-26  6:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-25 11:11 [PATCH 1/3] common: driver: Allow for I/O mapped I/O in resource requests Michel Stam
2014-03-26  6:46 ` Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox