mtd: fix wrong usage of ioremap_nocache() in uclinux.c map driver

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Sat Sep 29 10:59:06 EDT 2012


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=08a3c4bc23e2b71191ed95d4fd3177c23660e34f
Commit:     08a3c4bc23e2b71191ed95d4fd3177c23660e34f
Parent:     f938bc563b4ca04013d02961dd423be10eee418a
Author:     Greg Ungerer <gerg at uclinux.org>
AuthorDate: Thu Jul 19 15:42:45 2012 +1000
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Sat Sep 29 14:58:05 2012 +0100

    mtd: fix wrong usage of ioremap_nocache() in uclinux.c map driver
    
    The uclinux.c mapping driver uses ioremap_nocache() to map its physical
    mapping address to a system virtual address. Problem is that the region
    it is mapping is not device memory. It is ordinary system RAM. On most
    non-MMU systems this doesn't matter, and the mapping is always a 1:1
    translation of the address. On paged memory systems on some architectures
    the page table mappings are not compatible between normal RAM and device
    memory.
    
    If we want to use the uclinux.c mapping driver on real MMU enabled systems
    we should be using the kernel virtual address that the mapping is at. For
    architectures that support the traditional initrd they use phys_to_virt or
    __va to convert the physical start initrd address to a kernel usable virtual
    address. The uclinux filesystem mapping is even more restrictive than the
    typical initrd, it always follows the kernels own bss section (so always in
    directly mapped memory). Therefore we can use the usual phys_to_virt to
    translate the physical start address to a virtual address.
    
    Signed-off-by: Greg Ungerer <gerg at uclinux.org>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 drivers/mtd/maps/uclinux.c |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c
index c3bb304..299bf88 100644
--- a/drivers/mtd/maps/uclinux.c
+++ b/drivers/mtd/maps/uclinux.c
@@ -67,10 +67,16 @@ static int __init uclinux_mtd_init(void)
 	printk("uclinux[mtd]: RAM probe address=0x%x size=0x%x\n",
 	       	(int) mapp->phys, (int) mapp->size);
 
-	mapp->virt = ioremap_nocache(mapp->phys, mapp->size);
+	/*
+	 * The filesystem is guaranteed to be in direct mapped memory. It is
+	 * directly following the kernels own bss region. Following the same
+	 * mechanism used by architectures setting up traditional initrds we
+	 * use phys_to_virt to get the virtual address of its start.
+	 */
+	mapp->virt = phys_to_virt(mapp->phys);
 
 	if (mapp->virt == 0) {
-		printk("uclinux[mtd]: ioremap_nocache() failed\n");
+		printk("uclinux[mtd]: no virtual mapping?\n");
 		return(-EIO);
 	}
 
@@ -79,7 +85,6 @@ static int __init uclinux_mtd_init(void)
 	mtd = do_map_probe("map_ram", mapp);
 	if (!mtd) {
 		printk("uclinux[mtd]: failed to find a mapping?\n");
-		iounmap(mapp->virt);
 		return(-ENXIO);
 	}
 
@@ -102,10 +107,8 @@ static void __exit uclinux_mtd_cleanup(void)
 		map_destroy(uclinux_ram_mtdinfo);
 		uclinux_ram_mtdinfo = NULL;
 	}
-	if (uclinux_ram_map.virt) {
-		iounmap((void *) uclinux_ram_map.virt);
+	if (uclinux_ram_map.virt)
 		uclinux_ram_map.virt = 0;
-	}
 }
 
 /****************************************************************************/



More information about the linux-mtd-cvs mailing list