]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Revert "mtd: maps: remove uclinux map driver"
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 3 Jul 2026 11:35:47 +0000 (13:35 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 3 Jul 2026 13:46:28 +0000 (15:46 +0200)
The uclinux MTD map driver is still actively used on ColdFire (m68k)
platforms. The ColdFire startup code in arch/m68k/coldfire/head.S copies
an attached filesystem blob to _bss_stop, and the uclinux driver picks
it up from there. Most ColdFire defconfigs enable CONFIG_MTD_UCLINUX, as
the driver seems to serve as a replacement for CONFIG_BLK_DEV_INITRD on
these non-MMU targets.

The driver was removed as part of a series cleaning up AMD Élan specific
drivers, but unlike the other three drivers in that series, this driver
seemed to not be as Élan specific (nor unused) as initially thought.

This reverts commit c584b8a7ad01a334a89732f3c5791ba14e58642b.

Reported-by: Greg Ungerer <gregungerer@westnet.com.au>
Closes: https://lore.kernel.org/all/b55ac37f-4523-46d0-8e77-3a17d7235ffe@westnet.com.au/
Acked-by: Arnd Bergmann <arnd@kernel.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/maps/Kconfig
drivers/mtd/maps/Makefile
drivers/mtd/maps/uclinux.c [new file with mode: 0644]

index dce5e67ce3c2b68ef5a3f035b21243c9402791c0..f447902d707e147dce81ee69e690c22fbba2f4a9 100644 (file)
@@ -277,6 +277,12 @@ config MTD_PCMCIA_ANONYMOUS
 
          If unsure, say N.
 
+config MTD_UCLINUX
+       bool "Generic uClinux RAM/ROM filesystem support"
+       depends on (MTD_RAM=y || MTD_ROM=y) && (!MMU || COLDFIRE)
+       help
+         Map driver to support image based filesystems for uClinux.
+
 config MTD_PLATRAM
        tristate "Map driver for platform device RAM (mtd-ram)"
        select MTD_RAM
index fbed278157f68d9c3864556120fe5a6fcddc564a..01745eca1f7303eede03d4859767aeb2a2918927 100644 (file)
@@ -30,6 +30,7 @@ obj-$(CONFIG_MTD_SUN_UFLASH)  += sun_uflash.o
 obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
 obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
 obj-$(CONFIG_MTD_PCI)          += pci.o
+obj-$(CONFIG_MTD_UCLINUX)      += uclinux.o
 obj-$(CONFIG_MTD_SCB2_FLASH)   += scb2_flash.o
 obj-$(CONFIG_MTD_PLATRAM)      += plat-ram.o
 obj-$(CONFIG_MTD_VMU)          += vmu-flash.o
diff --git a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c
new file mode 100644 (file)
index 0000000..de4c463
--- /dev/null
@@ -0,0 +1,118 @@
+/****************************************************************************/
+
+/*
+ *     uclinux.c -- generic memory mapped MTD driver for uclinux
+ *
+ *     (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com)
+ *
+ *      License: GPL
+ */
+
+/****************************************************************************/
+
+#include <linux/moduleparam.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/major.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+#include <asm/io.h>
+#include <asm/sections.h>
+
+/****************************************************************************/
+
+#ifdef CONFIG_MTD_ROM
+#define MAP_NAME "rom"
+#else
+#define MAP_NAME "ram"
+#endif
+
+static struct map_info uclinux_ram_map = {
+       .name = MAP_NAME,
+       .size = 0,
+};
+
+static unsigned long physaddr = -1;
+module_param(physaddr, ulong, S_IRUGO);
+
+static struct mtd_info *uclinux_ram_mtdinfo;
+
+/****************************************************************************/
+
+static const struct mtd_partition uclinux_romfs[] = {
+       { .name = "ROMfs" }
+};
+
+#define        NUM_PARTITIONS  ARRAY_SIZE(uclinux_romfs)
+
+/****************************************************************************/
+
+static int uclinux_point(struct mtd_info *mtd, loff_t from, size_t len,
+       size_t *retlen, void **virt, resource_size_t *phys)
+{
+       struct map_info *map = mtd->priv;
+       *virt = map->virt + from;
+       if (phys)
+               *phys = map->phys + from;
+       *retlen = len;
+       return(0);
+}
+
+/****************************************************************************/
+
+static int __init uclinux_mtd_init(void)
+{
+       struct mtd_info *mtd;
+       struct map_info *mapp;
+
+       mapp = &uclinux_ram_map;
+
+       if (physaddr == -1)
+               mapp->phys = (resource_size_t)__bss_stop;
+       else
+               mapp->phys = physaddr;
+
+       if (!mapp->size)
+               mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(mapp->phys + 8))));
+       mapp->bankwidth = 4;
+
+       printk("uclinux[mtd]: probe address=0x%x size=0x%x\n",
+               (int) mapp->phys, (int) 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]: no virtual mapping?\n");
+               return(-EIO);
+       }
+
+       simple_map_init(mapp);
+
+       mtd = do_map_probe("map_" MAP_NAME, mapp);
+       if (!mtd) {
+               printk("uclinux[mtd]: failed to find a mapping?\n");
+               return(-ENXIO);
+       }
+
+       mtd->owner = THIS_MODULE;
+       mtd->_point = uclinux_point;
+       mtd->priv = mapp;
+
+       uclinux_ram_mtdinfo = mtd;
+       mtd_device_register(mtd, uclinux_romfs, NUM_PARTITIONS);
+
+       return(0);
+}
+device_initcall(uclinux_mtd_init);
+
+/****************************************************************************/