public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* Make phram work with kernel cmdline args when built-in
@ 2011-10-11  9:46 Fache, Herve
  2011-10-12 16:48 ` Jörn Engel
  0 siblings, 1 reply; 9+ messages in thread
From: Fache, Herve @ 2011-10-11  9:46 UTC (permalink / raw)
  To: Joern Engel, linux-mtd


[-- Attachment #1.1: Type: text/plain, Size: 547 bytes --]

Hi guys,

Please find attached a patch that make it possible to use phram built-in
with a kernel command line argument.
This is basically the same patch that was applied in 2006 by Villa Herva to
block2mtd, which saves the argument for later, when kmalloc is available.
This allows us to put kernel and rootfs into physical RAM and boot without
any further copy, hence very fast.

Best regards,
Hervé
-- 
Texas Instruments France SA, 821 Avenue Jack Kilby, 06270 Villeneuve Loubet.
036 420 040 R.C.S Antibes. Capital de EUR 753.920

[-- Attachment #1.2: Type: text/html, Size: 696 bytes --]

[-- Attachment #2: 0001-phram-make-kernel-boot-command-line-arguments-work.patch --]
[-- Type: application/octet-stream, Size: 3245 bytes --]

From 71f011fa326c494629b9d2fd4f9fdad8dd215d6d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Fache?= <h-fache@ti.com>
Date: Tue, 4 Oct 2011 18:35:46 +0200
Subject: [PATCH] phram: make kernel boot command line arguments work
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This patch is based on Ville Herva's similar patch to block2mtd.

Trying to pass kernel command line arguments at boot-time did not work, as
phram_setup() was called so early that kmalloc() was not functional.

This patch only saves the option string at the early boot stage, and parses
it later when init_phram() is called.

With this patch, I can boot with a statically-compiled phram, and mount a
ext2 root fs from physical RAM, without the need for a initrd.

Signed-off-by: Hervé Fache <h-fache@ti.com>
---
 drivers/mtd/devices/phram.c |   44 ++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c
index 23423bd..6b839f0 100644
--- a/drivers/mtd/devices/phram.c
+++ b/drivers/mtd/devices/phram.c
@@ -33,6 +33,10 @@ struct phram_mtd_list {
 
 static LIST_HEAD(phram_list);
 
+#ifndef MODULE
+static int phram_init_called;
+static __initdata char phram_paramline[64+12+12];
+#endif
 
 static int phram_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
@@ -134,7 +138,7 @@ static int register_device(char *name, unsigned long start, unsigned long len)
 	ret = -EIO;
 	new->mtd.priv = ioremap(start, len);
 	if (!new->mtd.priv) {
-		pr_err("ioremap failed\n");
+		pr_err("ioremap failed for %ld@0x%lx\n", len, start);
 		goto out1;
 	}
 
@@ -233,7 +237,7 @@ static inline void kill_final_newline(char *str)
 	return 1;		\
 } while (0)
 
-static int phram_setup(const char *val, struct kernel_param *kp)
+static int phram_setup_late(const char *val)
 {
 	char buf[64+12+12], *str = buf;
 	char *token[3];
@@ -282,13 +286,47 @@ static int phram_setup(const char *val, struct kernel_param *kp)
 	return ret;
 }
 
+static int phram_setup(const char *val, struct kernel_param *kp)
+{
+#ifdef MODULE
+	return phram_setup_late(val);
+#else
+	/* If more parameters are later passed in via
+	   /sys/module/phram/parameters/phram
+	   and init_phram() has already been called,
+	   we can parse the argument directly. */
+
+	if (phram_init_called)
+		return phram_setup_late(val);
+
+	/* During early boot stage, we only save the parameters
+	   here. We must parse them later: if the param passed
+	   from kernel boot command line, phram_setup() is
+	   called so early that it is not possible to resolve
+	   the device (kmalloc() fails). Defer that work to
+	   phram_setup_late(), called by init_phram(). */
+
+	strlcpy(phram_paramline, val, sizeof(phram_paramline));
+
+	return 0;
+#endif
+}
+
 module_param_call(phram, phram_setup, NULL, NULL, 000);
 MODULE_PARM_DESC(phram, "Memory region to map. \"phram=<name>,<start>,<length>\"");
 
 
 static int __init init_phram(void)
 {
-	return 0;
+	int ret = 0;
+
+#ifndef MODULE
+	if (strlen(phram_paramline))
+		ret = phram_setup_late(phram_paramline);
+	phram_init_called = 1;
+#endif
+
+	return ret;
 }
 
 static void __exit cleanup_phram(void)
-- 
1.7.0.4


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

end of thread, other threads:[~2011-10-16 11:56 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-11  9:46 Make phram work with kernel cmdline args when built-in Fache, Herve
2011-10-12 16:48 ` Jörn Engel
2011-10-13 13:30   ` Fache, Herve
2011-10-14 13:03     ` Artem Bityutskiy
2011-10-14 13:44       ` Fache, Herve
2011-10-16 11:55         ` Artem Bityutskiy
     [not found]       ` <CA+Xn3W2P_+xdwwrvcBKREZmsj2O6=GOfyaywW-N2HhGwo0WzVg@mail.gmail.com>
2011-10-14 14:38         ` Jörn Engel
2011-10-14 14:48           ` Fache, Herve
2011-10-14 15:18             ` Jörn Engel

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