All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Hans J. Koch" <hjk@hansjkoch.de>
To: Greg KH <gregkh@suse.de>
Cc: linuxppc-dev@ozlabs.org, "Hans J. Koch" <hjk@hansjkoch.de>,
	Kai Jiang <Kai.Jiang@freescale.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] uio: Support 36-bit physical addresses on 32-bit systems
Date: Fri, 14 Oct 2011 20:46:36 +0200	[thread overview]
Message-ID: <20111014184636.GA6466@local> (raw)
In-Reply-To: <20111014183633.GA30068@suse.de>

On Fri, Oct 14, 2011 at 12:36:33PM -0600, Greg KH wrote:
> On Fri, Oct 14, 2011 at 08:31:45PM +0200, Hans J. Koch wrote:
> > On Thu, Oct 13, 2011 at 10:50:58AM -0500, Kumar Gala wrote:
> > > From: Kai Jiang <Kai.Jiang@freescale.com>
> > > 
> > > To support >32-bit physical addresses for UIO_MEM_PHYS type we need to
> > > extend the width of 'addr' in struct uio_mem.  Numerous platforms like
> > > embedded PPC, ARM, and X86 have support for systems with larger physical
> > > address than logical.
> > > 
> > > Since 'addr' may contain a physical, logical, or virtual address the
> > > easiest solution is to just change the type to 'phys_addr_t' which
> > > should always be greater than or equal to the sizeof(void *) such that
> > > it can properly hold any of the address types.
> > > 
> > > For physical address we can support up to a 44-bit physical address on a
> > > typical 32-bit system as we utilize remap_pfn_range() for the mapping of
> > > the memory region and pfn's are represnted by shifting the address by
> > > the page size (typically 4k).
> > > 
> > > Signed-off-by: Kai Jiang <Kai.Jiang@freescale.com>
> > > Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
> > > Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> > 
> > Signed-off-by: "Hans J. Koch" <hjk@hansjkoch.de>
> > 
> > That looks good to me. There's an unnecessary cast (see below), but I fixed that
> > on the way.
> > 
> > Greg, please pull this from branch uio-for-gregkh from
> > 
> > git://hansjkoch.de/git/linux-hjk
> 
> Care to send it as an email?  I can apply it easier that way as I have
> limited internet access while on the road.
> 
> greg k-h


>From b00f4ca33322a48928624ae3c34dc5fe9d2f40ff Mon Sep 17 00:00:00 2001
From: Kai Jiang <Kai.Jiang@freescale.com>
Date: Fri, 14 Oct 2011 20:04:43 +0200
Subject: [PATCH] uio: Support physical addresses >32 bits on 32-bit systems

From: Kai Jiang <Kai.Jiang@freescale.com>

To support >32-bit physical addresses for UIO_MEM_PHYS type we need to
extend the width of 'addr' in struct uio_mem.  Numerous platforms like
embedded PPC, ARM, and X86 have support for systems with larger physical
address than logical.

Since 'addr' may contain a physical, logical, or virtual address the
easiest solution is to just change the type to 'phys_addr_t' which
should always be greater than or equal to the sizeof(void *) such that
it can properly hold any of the address types.

For physical address we can support up to a 44-bit physical address on a
typical 32-bit system as we utilize remap_pfn_range() for the mapping of
the memory region and pfn's are represnted by shifting the address by
the page size (typically 4k).

Signed-off-by: Kai Jiang <Kai.Jiang@freescale.com>
Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Hans J. Koch <hjk@hansjkoch.de>
---
 Documentation/DocBook/uio-howto.tmpl |    2 +-
 drivers/uio/uio.c                    |    7 +++----
 include/linux/uio_driver.h           |    7 +++++--
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/Documentation/DocBook/uio-howto.tmpl b/Documentation/DocBook/uio-howto.tmpl
index 7c4b514d..54883de 100644
--- a/Documentation/DocBook/uio-howto.tmpl
+++ b/Documentation/DocBook/uio-howto.tmpl
@@ -529,7 +529,7 @@ memory (e.g. allocated with <function>kmalloc()</function>). There's also
 </para></listitem>
 
 <listitem><para>
-<varname>unsigned long addr</varname>: Required if the mapping is used.
+<varname>phys_addr_t addr</varname>: Required if the mapping is used.
 Fill in the address of your memory block. This address is the one that
 appears in sysfs.
 </para></listitem>
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index d2efe82..c0626ea 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -69,7 +69,7 @@ static ssize_t map_name_show(struct uio_mem *mem, char *buf)
 
 static ssize_t map_addr_show(struct uio_mem *mem, char *buf)
 {
-	return sprintf(buf, "0x%lx\n", mem->addr);
+	return sprintf(buf, "0x%llx\n", (unsigned long long)mem->addr);
 }
 
 static ssize_t map_size_show(struct uio_mem *mem, char *buf)
@@ -79,7 +79,7 @@ static ssize_t map_size_show(struct uio_mem *mem, char *buf)
 
 static ssize_t map_offset_show(struct uio_mem *mem, char *buf)
 {
-	return sprintf(buf, "0x%lx\n", mem->addr & ~PAGE_MASK);
+	return sprintf(buf, "0x%llx\n", (unsigned long long)mem->addr & ~PAGE_MASK);
 }
 
 struct map_sysfs_entry {
@@ -634,8 +634,7 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 	if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
 		page = virt_to_page(idev->info->mem[mi].addr + offset);
 	else
-		page = vmalloc_to_page((void *)idev->info->mem[mi].addr
-							+ offset);
+		page = vmalloc_to_page((void *)idev->info->mem[mi].addr + offset);
 	get_page(page);
 	vmf->page = page;
 	return 0;
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h
index 665517c..fd99ff9 100644
--- a/include/linux/uio_driver.h
+++ b/include/linux/uio_driver.h
@@ -23,7 +23,10 @@ struct uio_map;
 /**
  * struct uio_mem - description of a UIO memory region
  * @name:		name of the memory region for identification
- * @addr:		address of the device's memory
+ * @addr:		address of the device's memory (phys_addr is used since
+ * 			addr can be logical, virtual, or physical & phys_addr_t
+ * 			should always be large enough to handle any of the
+ * 			address types)
  * @size:		size of IO
  * @memtype:		type of memory addr points to
  * @internal_addr:	ioremap-ped version of addr, for driver internal use
@@ -31,7 +34,7 @@ struct uio_map;
  */
 struct uio_mem {
 	const char		*name;
-	unsigned long		addr;
+	phys_addr_t		addr;
 	unsigned long		size;
 	int			memtype;
 	void __iomem		*internal_addr;
-- 
1.7.6.3

WARNING: multiple messages have this Message-ID (diff)
From: "Hans J. Koch" <hjk@hansjkoch.de>
To: Greg KH <gregkh@suse.de>
Cc: "Hans J. Koch" <hjk@hansjkoch.de>,
	Kumar Gala <galak@kernel.crashing.org>,
	linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
	Kai Jiang <Kai.Jiang@freescale.com>
Subject: Re: [PATCH] uio: Support 36-bit physical addresses on 32-bit systems
Date: Fri, 14 Oct 2011 20:46:36 +0200	[thread overview]
Message-ID: <20111014184636.GA6466@local> (raw)
In-Reply-To: <20111014183633.GA30068@suse.de>

On Fri, Oct 14, 2011 at 12:36:33PM -0600, Greg KH wrote:
> On Fri, Oct 14, 2011 at 08:31:45PM +0200, Hans J. Koch wrote:
> > On Thu, Oct 13, 2011 at 10:50:58AM -0500, Kumar Gala wrote:
> > > From: Kai Jiang <Kai.Jiang@freescale.com>
> > > 
> > > To support >32-bit physical addresses for UIO_MEM_PHYS type we need to
> > > extend the width of 'addr' in struct uio_mem.  Numerous platforms like
> > > embedded PPC, ARM, and X86 have support for systems with larger physical
> > > address than logical.
> > > 
> > > Since 'addr' may contain a physical, logical, or virtual address the
> > > easiest solution is to just change the type to 'phys_addr_t' which
> > > should always be greater than or equal to the sizeof(void *) such that
> > > it can properly hold any of the address types.
> > > 
> > > For physical address we can support up to a 44-bit physical address on a
> > > typical 32-bit system as we utilize remap_pfn_range() for the mapping of
> > > the memory region and pfn's are represnted by shifting the address by
> > > the page size (typically 4k).
> > > 
> > > Signed-off-by: Kai Jiang <Kai.Jiang@freescale.com>
> > > Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
> > > Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> > 
> > Signed-off-by: "Hans J. Koch" <hjk@hansjkoch.de>
> > 
> > That looks good to me. There's an unnecessary cast (see below), but I fixed that
> > on the way.
> > 
> > Greg, please pull this from branch uio-for-gregkh from
> > 
> > git://hansjkoch.de/git/linux-hjk
> 
> Care to send it as an email?  I can apply it easier that way as I have
> limited internet access while on the road.
> 
> greg k-h


>From b00f4ca33322a48928624ae3c34dc5fe9d2f40ff Mon Sep 17 00:00:00 2001
From: Kai Jiang <Kai.Jiang@freescale.com>
Date: Fri, 14 Oct 2011 20:04:43 +0200
Subject: [PATCH] uio: Support physical addresses >32 bits on 32-bit systems

From: Kai Jiang <Kai.Jiang@freescale.com>

To support >32-bit physical addresses for UIO_MEM_PHYS type we need to
extend the width of 'addr' in struct uio_mem.  Numerous platforms like
embedded PPC, ARM, and X86 have support for systems with larger physical
address than logical.

Since 'addr' may contain a physical, logical, or virtual address the
easiest solution is to just change the type to 'phys_addr_t' which
should always be greater than or equal to the sizeof(void *) such that
it can properly hold any of the address types.

For physical address we can support up to a 44-bit physical address on a
typical 32-bit system as we utilize remap_pfn_range() for the mapping of
the memory region and pfn's are represnted by shifting the address by
the page size (typically 4k).

Signed-off-by: Kai Jiang <Kai.Jiang@freescale.com>
Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Hans J. Koch <hjk@hansjkoch.de>
---
 Documentation/DocBook/uio-howto.tmpl |    2 +-
 drivers/uio/uio.c                    |    7 +++----
 include/linux/uio_driver.h           |    7 +++++--
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/Documentation/DocBook/uio-howto.tmpl b/Documentation/DocBook/uio-howto.tmpl
index 7c4b514d..54883de 100644
--- a/Documentation/DocBook/uio-howto.tmpl
+++ b/Documentation/DocBook/uio-howto.tmpl
@@ -529,7 +529,7 @@ memory (e.g. allocated with <function>kmalloc()</function>). There's also
 </para></listitem>
 
 <listitem><para>
-<varname>unsigned long addr</varname>: Required if the mapping is used.
+<varname>phys_addr_t addr</varname>: Required if the mapping is used.
 Fill in the address of your memory block. This address is the one that
 appears in sysfs.
 </para></listitem>
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index d2efe82..c0626ea 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -69,7 +69,7 @@ static ssize_t map_name_show(struct uio_mem *mem, char *buf)
 
 static ssize_t map_addr_show(struct uio_mem *mem, char *buf)
 {
-	return sprintf(buf, "0x%lx\n", mem->addr);
+	return sprintf(buf, "0x%llx\n", (unsigned long long)mem->addr);
 }
 
 static ssize_t map_size_show(struct uio_mem *mem, char *buf)
@@ -79,7 +79,7 @@ static ssize_t map_size_show(struct uio_mem *mem, char *buf)
 
 static ssize_t map_offset_show(struct uio_mem *mem, char *buf)
 {
-	return sprintf(buf, "0x%lx\n", mem->addr & ~PAGE_MASK);
+	return sprintf(buf, "0x%llx\n", (unsigned long long)mem->addr & ~PAGE_MASK);
 }
 
 struct map_sysfs_entry {
@@ -634,8 +634,7 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 	if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
 		page = virt_to_page(idev->info->mem[mi].addr + offset);
 	else
-		page = vmalloc_to_page((void *)idev->info->mem[mi].addr
-							+ offset);
+		page = vmalloc_to_page((void *)idev->info->mem[mi].addr + offset);
 	get_page(page);
 	vmf->page = page;
 	return 0;
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h
index 665517c..fd99ff9 100644
--- a/include/linux/uio_driver.h
+++ b/include/linux/uio_driver.h
@@ -23,7 +23,10 @@ struct uio_map;
 /**
  * struct uio_mem - description of a UIO memory region
  * @name:		name of the memory region for identification
- * @addr:		address of the device's memory
+ * @addr:		address of the device's memory (phys_addr is used since
+ * 			addr can be logical, virtual, or physical & phys_addr_t
+ * 			should always be large enough to handle any of the
+ * 			address types)
  * @size:		size of IO
  * @memtype:		type of memory addr points to
  * @internal_addr:	ioremap-ped version of addr, for driver internal use
@@ -31,7 +34,7 @@ struct uio_map;
  */
 struct uio_mem {
 	const char		*name;
-	unsigned long		addr;
+	phys_addr_t		addr;
 	unsigned long		size;
 	int			memtype;
 	void __iomem		*internal_addr;
-- 
1.7.6.3


  reply	other threads:[~2011-10-14 18:47 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-13 15:50 [PATCH] uio: Support 36-bit physical addresses on 32-bit systems Kumar Gala
2011-10-13 15:50 ` Kumar Gala
2011-10-14 18:31 ` Hans J. Koch
2011-10-14 18:31   ` Hans J. Koch
2011-10-14 18:36   ` Greg KH
2011-10-14 18:36     ` Greg KH
2011-10-14 18:46     ` Hans J. Koch [this message]
2011-10-14 18:46       ` Hans J. Koch
2011-10-17 16:00   ` Kumar Gala
2011-10-17 16:00     ` Kumar Gala
2011-10-17 17:18     ` Hans J. Koch
2011-10-17 17:18       ` Hans J. Koch
2011-10-17 18:03       ` Hans J. Koch
2011-10-17 18:03         ` Hans J. Koch
2011-10-17 18:23         ` Greg KH
2011-10-17 18:23           ` Greg KH
2011-10-17 18:50           ` Hans J. Koch
2011-10-17 18:50             ` Hans J. Koch
  -- strict thread matches above, loose matches on Subject: below --
2011-10-12 14:35 Kumar Gala
2011-10-12 14:35 ` Kumar Gala
2011-10-12 15:32 ` Hans J. Koch
2011-10-12 15:32   ` Hans J. Koch
2011-10-12 16:07   ` Kumar Gala
2011-10-12 16:07     ` Kumar Gala
2011-10-12 16:15     ` Geert Uytterhoeven
2011-10-12 16:15       ` Geert Uytterhoeven
2011-10-13 14:10       ` Tabi Timur-B04825
2011-10-13 14:10         ` Tabi Timur-B04825
2011-10-13 14:25         ` Geert Uytterhoeven
2011-10-13 14:25           ` Geert Uytterhoeven
2011-10-13 14:35           ` Timur Tabi
2011-10-13 14:35             ` Timur Tabi
2011-10-12 16:16     ` Hans J. Koch
2011-10-12 16:16       ` Hans J. Koch
2011-10-12 16:19   ` Hans J. Koch
2011-10-12 16:19     ` Hans J. Koch
2011-10-12 18:40     ` Kumar Gala
2011-10-12 18:40       ` Kumar Gala
2011-10-12 20:23       ` Hans J. Koch
2011-10-12 20:23         ` Hans J. Koch
2011-10-12 20:58         ` Kumar Gala
2011-10-12 20:58           ` Kumar Gala

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111014184636.GA6466@local \
    --to=hjk@hansjkoch.de \
    --cc=Kai.Jiang@freescale.com \
    --cc=gregkh@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.