From patchwork Tue Mar 13 09:52:31 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Fache, Herve" X-Patchwork-Id: 146375 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:4978:20e::2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 27AEDB6EF3 for ; Tue, 13 Mar 2012 20:56:16 +1100 (EST) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1S7OPZ-0004Aq-Dt; Tue, 13 Mar 2012 09:52:57 +0000 Received: from smtp1-g21.free.fr ([2a01:e0c:1:1599::10]) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1S7OPQ-00049d-KH for linux-mtd@lists.infradead.org; Tue, 13 Mar 2012 09:52:55 +0000 Received: from localhost.localdomain (unknown [82.243.161.112]) by smtp1-g21.free.fr (Postfix) with ESMTP id C8DA3940099; Tue, 13 Mar 2012 10:52:41 +0100 (CET) From: h-fache@ti.com To: linux-mtd@lists.infradead.org Subject: [PATCH] mtd: phram: dot not crash when built-in and passing boot param Date: Tue, 13 Mar 2012 10:52:31 +0100 Message-Id: <1331632351-32610-1-git-send-email-h-fache@ti.com> X-Mailer: git-send-email 1.7.9 MIME-Version: 1.0 X-Spam-Note: CRM114 invocation failed X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: joern@logfs.org, joern@lazybastard.org, =?UTF-8?q?Herv=C3=A9=20Fache?= , dedekind1@gmail.com X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Hervé Fache This patch is based on Ville Herva's similar patch to block2mtd. Trying to pass a parameter through the kernel command line when built-in would crash the kernel, as phram_setup() was called so early that kmalloc() was not functional yet. This patch only saves the parameter string at the early boot stage, and parses it later when init_phram() is called. The same happens in both module and built-in cases. 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. This has been tested in built-in and module cases, with and without a parameter string. Signed-off-by: Hervé Fache --- drivers/mtd/devices/phram.c | 28 ++++++++++++++++++++++++++-- 1 files changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c index 23423bd..727cb5d 100644 --- a/drivers/mtd/devices/phram.c +++ b/drivers/mtd/devices/phram.c @@ -1,6 +1,7 @@ /** * Copyright (c) ???? Jochen Schäuble * Copyright (c) 2003-2004 Joern Engel + * Copyright (c) 2012 Hervé Fache * * Usage: * @@ -233,7 +234,16 @@ static inline void kill_final_newline(char *str) return 1; \ } while (0) -static int phram_setup(const char *val, struct kernel_param *kp) +/* This shall contain the module parameter if any. It is of the form: + * phram=,
, for module case + * phram.phram=,
, for built-in case + We leave 64 bytes for the device name, 12 for the address and 12 for the + size. + Example: phram.phram=rootfs,0xa0000000,512Mi +*/ +static __initdata char phram_paramline[64+12+12]; + +static int phram_setup(const char *val) { char buf[64+12+12], *str = buf; char *token[3]; @@ -282,12 +292,26 @@ static int phram_setup(const char *val, struct kernel_param *kp) return ret; } -module_param_call(phram, phram_setup, NULL, NULL, 000); +static int phram_param_call(const char *val, struct kernel_param *kp) +{ + /* This function is always called before 'init_phram()', whether built-in or + module. */ + if (strlen(val) >= sizeof(phram_paramline)) + return -ENOSPC; + strcpy(phram_paramline, val); + + return 0; +} + +module_param_call(phram, phram_param_call, NULL, NULL, 000); MODULE_PARM_DESC(phram, "Memory region to map. \"phram=,,\""); static int __init init_phram(void) { + if (phram_paramline[0]) + return phram_setup(phram_paramline); + return 0; }