linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Parse new-style boot parameters just before initcalls
@ 2003-05-10 16:19 Bartlomiej Zolnierkiewicz
  2003-05-10 16:25 ` [PATCH] Switch ide parameters to new-style and make them unique Bartlomiej Zolnierkiewicz
  2003-05-12  2:05 ` [PATCH] Parse new-style boot parameters just before initcalls Rusty Russell
  0 siblings, 2 replies; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2003-05-10 16:19 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Alan Cox, linux-kernel


Hi,

I've redone this patch. I've tested it and works okay for me.
It is as minimal as possible and I hope it can go in 2.5 soon.

As already pointed by you for 2.7 we should have more flexible choice
of when to do boot parameters parsing: parameters tied with architecture,
with different subsystems, with different level of initcalls etc..

Note that patch breaks ide parameters, second one fixes this.

Testing & comments appreciated, patch below.
--
Bartlomiej

# Move parsing of new-style boot parameters (module_parm() and co.)
# before initcalls. Old-style boot parameters (using __setup())
# are still parsed early, so everything should work normally
# (except ide for which lack of parameters' uniqueness must be fixed).
#
# This change fe. removes requirement of keeping static data for storing
# parameters by drivers (ide, md etc.) because now they can use kmalloc().
#
# Thanks goes to Rusty for the idea and help.
#
# Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>

 include/linux/moduleparam.h |    2 +
 init/main.c                 |   57 +++++++++++++++++++++++++++++++++++---------
 kernel/params.c             |    2 -
 3 files changed, 49 insertions(+), 12 deletions(-)

diff -puN init/main.c~late_boot_params init/main.c
--- linux-2.5.69/init/main.c~late_boot_params	Fri May  9 23:07:38 2003
+++ linux-2.5.69-root/init/main.c	Sat May 10 18:09:55 2003
@@ -105,6 +105,11 @@ int system_running = 0;
 #define MAX_INIT_ARGS 8
 #define MAX_INIT_ENVS 8

+extern struct obs_kernel_param __setup_start, __setup_end;
+extern struct kernel_param __start___param, __stop___param;
+extern char saved_command_line[];
+static char *command_line;
+
 extern void time_init(void);
 extern void softirq_init(void);

@@ -149,20 +154,53 @@ __setup("profile=", profile_setup);
 static int __init obsolete_checksetup(char *line)
 {
 	struct obs_kernel_param *p;
-	extern struct obs_kernel_param __setup_start, __setup_end;

 	p = &__setup_start;
 	do {
 		int n = strlen(p->str);
-		if (!strncmp(line,p->str,n)) {
-			if (p->setup_func(line+n))
+		if (!strncmp(line, p->str, n))
+			/* parameters should be unique! */
+			if (n && (line[n-1] == '=' || line[n] =='\0'))
+				return p->setup_func(line + n);
+		p++;
+	} while (p < &__setup_end);
+	/* not found, probably normal parameter */
+	return 1;
+}
+
+static int __init obsolete_test_checksetup(char *line)
+{
+	struct obs_kernel_param *p;
+
+	p = &__setup_start;
+	do {
+		int n = strlen(p->str);
+		if (!strncmp(line, p->str, n))
+			/* parameters should be unique! */
+			if (n && (line[n-1] == '=' || line[n] =='\0'))
 				return 1;
-		}
 		p++;
 	} while (p < &__setup_end);
 	return 0;
 }

+static void __init parse_early_args(const char *name, char *args)
+{
+	char *param, *val;
+
+	while (*args) {
+		args = next_arg(args, &param, &val);
+		/* make "param" the full string */
+		if (val)
+			val[-1] = '=';
+		if (!obsolete_checksetup(param))
+			printk("%s: invalid parameter `%s'\n", name, param);
+		/* restore ' ' after val */
+		if (args[-1] == '\0')
+			args[-1] = ' ';
+	}
+}
+
 /* this should be approx 2 Bo*oMips to start (note initial shift), and will
    still work even if initially too large, it will just take slightly longer */
 unsigned long loops_per_jiffy = (1<<12);
@@ -241,7 +279,7 @@ static int __init unknown_bootoption(cha
 		val[-1] = '=';

 	/* Handle obsolete-style parameters */
-	if (obsolete_checksetup(param))
+	if (obsolete_test_checksetup(param))
 		return 0;

 	/* Preemptive maintenance for "why didn't my mispelled command
@@ -378,9 +416,6 @@ static void rest_init(void)

 asmlinkage void __init start_kernel(void)
 {
-	char * command_line;
-	extern char saved_command_line[];
-	extern struct kernel_param __start___param, __stop___param;
 /*
  * Interrupts are still disabled. Do necessary setups, then
  * enable them
@@ -399,9 +434,7 @@ asmlinkage void __init start_kernel(void
 	build_all_zonelists();
 	page_alloc_init();
 	printk("Kernel command line: %s\n", saved_command_line);
-	parse_args("Booting kernel", command_line, &__start___param,
-		   &__stop___param - &__start___param,
-		   &unknown_bootoption);
+	parse_early_args("Parsing early boot parameters", command_line);
 	trap_init();
 	rcu_init();
 	init_IRQ();
@@ -528,6 +561,8 @@ static void __init do_basic_setup(void)
 	sock_init();

 	init_workqueues();
+	parse_args("Parsing boot parameters", command_line, &__start___param,
+		   &__stop___param - &__start___param, &unknown_bootoption);
 	do_initcalls();
 }

diff -puN kernel/params.c~late_boot_params kernel/params.c
--- linux-2.5.69/kernel/params.c~late_boot_params	Fri May  9 23:07:42 2003
+++ linux-2.5.69-root/kernel/params.c	Sat May 10 00:15:41 2003
@@ -71,7 +71,7 @@ static int parse_one(char *param,

 /* You can use " around spaces, but can't escape ". */
 /* Hyphens and underscores equivalent in parameter names. */
-static char *next_arg(char *args, char **param, char **val)
+char *next_arg(char *args, char **param, char **val)
 {
 	unsigned int i, equals = 0;
 	int in_quote = 0;
diff -puN include/linux/moduleparam.h~late_boot_params include/linux/moduleparam.h
--- linux-2.5.69/include/linux/moduleparam.h~late_boot_params	Fri May  9 23:13:55 2003
+++ linux-2.5.69-root/include/linux/moduleparam.h	Sat May 10 00:16:22 2003
@@ -63,6 +63,8 @@ struct kparam_string {
 	module_param_call(name, param_set_copystring, param_get_charp,	\
 		   &__param_string_##name, perm)

+extern char *next_arg(char *args, char **param, char **val);
+
 /* Called on module insert or kernel boot */
 extern int parse_args(const char *name,
 		      char *args,

_


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

* [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-10 16:19 [PATCH] Parse new-style boot parameters just before initcalls Bartlomiej Zolnierkiewicz
@ 2003-05-10 16:25 ` Bartlomiej Zolnierkiewicz
  2003-05-11 14:59   ` Jeremy Jackson
  2003-05-12  2:05 ` [PATCH] Parse new-style boot parameters just before initcalls Rusty Russell
  1 sibling, 1 reply; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2003-05-10 16:25 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Alan Cox, linux-kernel


Fixes ide parameters after late_boot_params patch.
Works for me and I would like to know if it doesn't for somebody.
--
Bartlomiej

# Switch ide to new-style kernel parameters.
# Make ide parameters unique.
#
# Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>

 drivers/ide/ide.c |  701 ++++++++++++++++++++++++++++--------------------------
 1 files changed, 370 insertions(+), 331 deletions(-)

diff -puN drivers/ide/ide.c~late_boot_params_ide drivers/ide/ide.c
--- linux-2.5.69/drivers/ide/ide.c~late_boot_params_ide	Sat May 10 17:23:14 2003
+++ linux-2.5.69-root/drivers/ide/ide.c	Sat May 10 17:23:14 2003
@@ -132,6 +132,7 @@

 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
@@ -239,7 +240,7 @@ static void init_hwif_data (unsigned int
 	hwif->noprobe	= !hwif->io_ports[IDE_DATA_OFFSET];
 #ifdef CONFIG_BLK_DEV_HD
 	if (hwif->io_ports[IDE_DATA_OFFSET] == HD_DATA)
-		hwif->noprobe = 1; /* may be overridden by ide_setup() */
+		hwif->noprobe = 1;	/* may be overridden by ideX=noprobe */
 #endif /* CONFIG_BLK_DEV_HD */
 	hwif->major	= ide_hwif_to_major[index];
 	hwif->name[0]	= 'i';
@@ -1638,7 +1639,7 @@ static int __init stridx (const char *s,
 }

 /*
- * match_parm() does parsing for ide_setup():
+ * match_parm() does parsing of boot/module parameters:
  *
  * 1. the first char of s must be '='.
  * 2. if the remainder matches one of the supplied keywords,
@@ -1649,52 +1650,48 @@ static int __init stridx (const char *s,
  *     and base16 is allowed when prefixed with "0x".
  * 4. otherwise, zero is returned.
  */
-static int __init match_parm (char *s, const char *keywords[], int vals[], int max_vals)
+static int __init match_parm (const char *s, const char *keywords[], int vals[], int max_vals)
 {
 	static const char *decimal = "0123456789";
 	static const char *hex = "0123456789abcdef";
 	int i, n;

-	if (*s++ == '=') {
-		/*
-		 * Try matching against the supplied keywords,
-		 * and return -(index+1) if we match one
-		 */
-		if (keywords != NULL) {
-			for (i = 0; *keywords != NULL; ++i) {
-				if (!strcmp(s, *keywords++))
-					return -(i+1);
-			}
+	/*
+	 * Try matching against the supplied keywords,
+	 * and return -(index+1) if we match one
+	 */
+	if (keywords != NULL) {
+		for (i = 0; *keywords != NULL; ++i) {
+			if (!strcmp(s, *keywords++))
+				return -(i+1);
 		}
-		/*
-		 * Look for a series of no more than "max_vals"
-		 * numeric values separated by commas, in base10,
-		 * or base16 when prefixed with "0x".
-		 * Return a count of how many were found.
-		 */
-		for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
-			vals[n] = i;
-			while ((i = stridx(decimal, *++s)) >= 0)
-				vals[n] = (vals[n] * 10) + i;
-			if (*s == 'x' && !vals[n]) {
-				while ((i = stridx(hex, *++s)) >= 0)
-					vals[n] = (vals[n] * 0x10) + i;
-			}
-			if (++n == max_vals)
-				break;
-			if (*s == ',' || *s == ';')
-				++s;
+	}
+	/*
+	 * Look for a series of no more than "max_vals"
+	 * numeric values separated by commas, in base10,
+	 * or base16 when prefixed with "0x".
+	 * Return a count of how many were found.
+	 */
+	for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
+		vals[n] = i;
+		while ((i = stridx(decimal, *++s)) >= 0)
+			vals[n] = (vals[n] * 10) + i;
+		if (*s == 'x' && !vals[n]) {
+			while ((i = stridx(hex, *++s)) >= 0)
+				vals[n] = (vals[n] * 0x10) + i;
 		}
-		if (!*s)
-			return n;
+		if (++n == max_vals)
+			break;
+		if (*s == ',' || *s == ';')
+			++s;
 	}
+	if (!*s)
+		return n;
 	return 0;	/* zero = nothing matched */
 }

 /*
- * ide_setup() gets called VERY EARLY during initialization,
- * to handle kernel "command line" strings beginning with "hdx="
- * or "ide".  Here is the complete set currently supported:
+ * Here is the complete set of currently supported boot/module parameters:
  *
  * "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
  * "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
@@ -1774,328 +1771,363 @@ static int __init match_parm (char *s, c
  * "idex=dc4030"	: probe/support Promise DC4030VL interface
  * "ide=doubler"	: probe/support IDE doublers on Amiga
  */
-int __init ide_setup (char *s)
-{
-	int i, vals[3];
-	ide_hwif_t *hwif;
-	ide_drive_t *drive;
-	unsigned int hw, unit;
-	const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
-	const char max_hwif  = '0' + (MAX_HWIFS - 1);
-
-
-	if (strncmp(s,"hd",2) == 0 && s[2] == '=')	/* hd= is for hd.c   */
-		return 0;				/* driver and not us */

-	if (strncmp(s,"ide",3) &&
-	    strncmp(s,"idebus",6) &&
-	    strncmp(s,"hd",2))		/* hdx= & hdxlun= */
-		return 0;
-
-	printk(KERN_INFO "ide_setup: %s", s);
-	init_ide_data ();
+int __init ide_param_set_fn(const char *val, struct kernel_param *kp)
+{
+	printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
+	init_ide_data();

 #ifdef CONFIG_BLK_DEV_IDEDOUBLER
-	if (!strcmp(s, "ide=doubler")) {
+	if (!strcmp(val, "doubler")) {
 		extern int ide_doubler;

 		printk(" : Enabled support for IDE doublers\n");
 		ide_doubler = 1;
-		return 1;
+		return 0;
 	}
 #endif /* CONFIG_BLK_DEV_IDEDOUBLER */

-	if (!strcmp(s, "ide=nodma")) {
-		printk("IDE: Prevented DMA\n");
+	if (!strcmp(val, "nodma")) {
+		printk(" : Prevented DMA\n");
 		noautodma = 1;
-		return 1;
+		return 0;
 	}

 #ifdef CONFIG_BLK_DEV_IDEPCI
-	if (!strcmp(s, "ide=reverse")) {
+	if (!strcmp(val, "reverse")) {
 		ide_scan_direction = 1;
 		printk(" : Enabled support for IDE inverse scan order.\n");
-		return 1;
+		return 0;
 	}
 #endif /* CONFIG_BLK_DEV_IDEPCI */

-	/*
-	 * Look for drive options:  "hdx="
-	 */
-	if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
-		const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
-				"serialize", "autotune", "noautotune",
-				"slow", "swapdata", "bswap", "flash",
-				"remap", "noremap", "scsi", "biostimings",
-				NULL};
-		unit = s[2] - 'a';
-		hw   = unit / MAX_DRIVES;
-		unit = unit % MAX_DRIVES;
-		hwif = &ide_hwifs[hw];
-		drive = &hwif->drives[unit];
-		if (strncmp(s + 4, "ide-", 4) == 0) {
-			strncpy(drive->driver_req, s + 4, 9);
-			goto done;
-		}
-		/*
-		 * Look for last lun option:  "hdxlun="
-		 */
-		if (s[3] == 'l' && s[4] == 'u' && s[5] == 'n') {
-			if (match_parm(&s[6], NULL, vals, 1) != 1)
-				goto bad_option;
-			if (vals[0] >= 0 && vals[0] <= 7) {
-				drive->last_lun = vals[0];
-				drive->forced_lun = 1;
-			} else
-				printk(" -- BAD LAST LUN! Expected value from 0 to 7");
-			goto done;
-		}
-		switch (match_parm(&s[3], hd_words, vals, 3)) {
-			case -1: /* "none" */
-				drive->nobios = 1;  /* drop into "noprobe" */
-			case -2: /* "noprobe" */
-				drive->noprobe = 1;
-				goto done;
-			case -3: /* "nowerr" */
-				drive->bad_wstat = BAD_R_STAT;
-				hwif->noprobe = 0;
-				goto done;
-			case -4: /* "cdrom" */
-				drive->present = 1;
-				drive->media = ide_cdrom;
-				hwif->noprobe = 0;
-				goto done;
-			case -5: /* "serialize" */
-				printk(" -- USE \"ide%d=serialize\" INSTEAD", hw);
-				goto do_serialize;
-			case -6: /* "autotune" */
-				drive->autotune = IDE_TUNE_AUTO;
-				goto done;
-			case -7: /* "noautotune" */
-				drive->autotune = IDE_TUNE_NOAUTO;
-				goto done;
-			case -8: /* "slow" */
-				drive->slow = 1;
-				goto done;
-			case -9: /* "swapdata" or "bswap" */
-			case -10:
-				drive->bswap = 1;
-				goto done;
-			case -11: /* "flash" */
-				drive->ata_flash = 1;
-				goto done;
-			case -12: /* "remap" */
-				drive->remap_0_to_1 = 1;
-				goto done;
-			case -13: /* "noremap" */
-				drive->remap_0_to_1 = 2;
-				goto done;
-			case -14: /* "scsi" */
-#if defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI)
-				drive->scsi = 1;
-				goto done;
-#else
-				drive->scsi = 0;
-				goto bad_option;
-#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */
-			case -15: /* "biostimings" */
-				drive->autotune = IDE_TUNE_BIOS;
-				goto done;
-			case 3: /* cyl,head,sect */
-				drive->media	= ide_disk;
-				drive->cyl	= drive->bios_cyl  = vals[0];
-				drive->head	= drive->bios_head = vals[1];
-				drive->sect	= drive->bios_sect = vals[2];
-				drive->present	= 1;
-				drive->forced_geom = 1;
-				hwif->noprobe = 0;
-				goto done;
-			default:
-				goto bad_option;
-		}
-	}
+	printk(" -- BAD OPTION\n");
+	return 0;
+}

-	if (s[0] != 'i' || s[1] != 'd' || s[2] != 'e')
+int __init idebus_param_set_fn(const char *val, struct kernel_param *kp)
+{
+	int vals[3];
+
+	printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
+	init_ide_data();
+
+	if (match_parm(val, NULL, vals, 1) != 1)
 		goto bad_option;
+	if (vals[0] >= 20 && vals[0] <= 66)
+		idebus_parameter = vals[0];
+	else
+		printk(" -- BAD BUS SPEED! Expected value from 20 to 66");
+	printk("\n");
+	return 0;
+bad_option:
+	printk(" -- BAD OPTION\n");
+	return 0;
+}
+
+int __init ideX_param_set_fn(const char *val, struct kernel_param *kp)
+{
 	/*
-	 * Look for bus speed option:  "idebus="
-	 */
-	if (s[3] == 'b' && s[4] == 'u' && s[5] == 's') {
-		if (match_parm(&s[6], NULL, vals, 1) != 1)
-			goto bad_option;
-		if (vals[0] >= 20 && vals[0] <= 66) {
-			idebus_parameter = vals[0];
-		} else
-			printk(" -- BAD BUS SPEED! Expected value from 20 to 66");
-		goto done;
-	}
-	/*
-	 * Look for interface options:  "idex="
+	 * Be VERY CAREFUL changing this: note hardcoded indexes below
+	 * -8,-9,-10 : are reserved for future calls to ease the hardcoding.
 	 */
-	if (s[3] >= '0' && s[3] <= max_hwif) {
-		/*
-		 * Be VERY CAREFUL changing this: note hardcoded indexes below
-		 * -8,-9,-10 : are reserved for future idex calls to ease the hardcoding.
-		 */
-		const char *ide_words[] = {
-			"noprobe", "serialize", "autotune", "noautotune",
+	const char *ide_words[] = {
+			"noprobe", "serialize", "autotune", "noautotune",
 			"reset", "dma", "ata66", "minus8", "minus9", "minus10",
-			"four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278",
+			"four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278",
 			"umc8672", "ali14xx", "dc4030", "biostimings", NULL };
-		hw = s[3] - '0';
-		hwif = &ide_hwifs[hw];
-		i = match_parm(&s[4], ide_words, vals, 3);
+	ide_hwif_t *hwif;
+	unsigned int hw;
+	const char max_hwif = '0' + (MAX_HWIFS - 1);
+	int i, vals[3];

-		/*
-		 * Cryptic check to ensure chipset not already set for hwif:
-		 */
-		if (i > 0 || i <= -11) {			/* is parameter a chipset name? */
-			if (hwif->chipset != ide_unknown)
-				goto bad_option;	/* chipset already specified */
-			if (i <= -11 && i != -18 && hw != 0)
-				goto bad_hwif;		/* chipset drivers are for "ide0=" only */
-			if (i <= -11 && i != -18 && ide_hwifs[hw+1].chipset != ide_unknown)
-				goto bad_option;	/* chipset for 2nd port already specified */
-			printk("\n");
-		}
+	printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
+	init_ide_data();
+
+	if (kp->name[3] > max_hwif)
+		goto bad_option;
+
+	hw = kp->name[3] - '0';
+	hwif = &ide_hwifs[hw];
+	i = match_parm(val, ide_words, vals, 3);
+
+	/*
+	 * Cryptic check to ensure chipset not already set for hwif:
+	 */
+	if (i > 0 || i <= -11) {			/* is parameter a chipset name? */
+		if (hwif->chipset != ide_unknown)
+			goto bad_option;	/* chipset already specified */
+		if (i <= -11 && i != -18 && hw != 0)
+			goto bad_hwif;		/* chipset drivers are for "ide0=" only */
+		if (i <= -11 && i != -18 && ide_hwifs[hw+1].chipset != ide_unknown)
+			goto bad_option;	/* chipset for 2nd port already specified */
+		printk("\n");
+	}

-		switch (i) {
-			case -19: /* "biostimings" */
-				hwif->drives[0].autotune = IDE_TUNE_BIOS;
-				hwif->drives[1].autotune = IDE_TUNE_BIOS;
-				goto done;
+	switch (i) {
+		case -19: /* "biostimings" */
+			hwif->drives[0].autotune = IDE_TUNE_BIOS;
+			hwif->drives[1].autotune = IDE_TUNE_BIOS;
+			goto done;
 #ifdef CONFIG_BLK_DEV_PDC4030
-			case -18: /* "dc4030" */
-			{
-				extern void init_pdc4030(void);
-				init_pdc4030();
-				goto done;
-			}
+		case -18: /* "dc4030" */
+		{
+			extern void init_pdc4030(void);
+			init_pdc4030();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_PDC4030 */
 #ifdef CONFIG_BLK_DEV_ALI14XX
-			case -17: /* "ali14xx" */
-			{
-				extern void init_ali14xx (void);
-				init_ali14xx();
-				goto done;
-			}
+		case -17: /* "ali14xx" */
+		{
+			extern void init_ali14xx (void);
+			init_ali14xx();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_ALI14XX */
 #ifdef CONFIG_BLK_DEV_UMC8672
-			case -16: /* "umc8672" */
-			{
-				extern void init_umc8672 (void);
-				init_umc8672();
-				goto done;
-			}
+		case -16: /* "umc8672" */
+		{
+			extern void init_umc8672 (void);
+			init_umc8672();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_UMC8672 */
 #ifdef CONFIG_BLK_DEV_DTC2278
-			case -15: /* "dtc2278" */
-			{
-				extern void init_dtc2278 (void);
-				init_dtc2278();
-				goto done;
-			}
+		case -15: /* "dtc2278" */
+		{
+			extern void init_dtc2278 (void);
+			init_dtc2278();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_DTC2278 */
 #ifdef CONFIG_BLK_DEV_CMD640
-			case -14: /* "cmd640_vlb" */
-			{
-				extern int cmd640_vlb; /* flag for cmd640.c */
-				cmd640_vlb = 1;
-				goto done;
-			}
+		case -14: /* "cmd640_vlb" */
+		{
+			extern int cmd640_vlb; /* flag for cmd640.c */
+			cmd640_vlb = 1;
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_CMD640 */
 #ifdef CONFIG_BLK_DEV_HT6560B
-			case -13: /* "ht6560b" */
-			{
-				extern void init_ht6560b (void);
-				init_ht6560b();
-				goto done;
-			}
+		case -13: /* "ht6560b" */
+		{
+			extern void init_ht6560b (void);
+			init_ht6560b();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_HT6560B */
 #ifdef CONFIG_BLK_DEV_QD65XX
-			case -12: /* "qd65xx" */
-			{
-				extern void init_qd65xx (void);
-				init_qd65xx();
-				goto done;
-			}
+		case -12: /* "qd65xx" */
+		{
+			extern void init_qd65xx (void);
+			init_qd65xx();
+			goto done;
+		}
 #endif /* CONFIG_BLK_DEV_QD65XX */
 #ifdef CONFIG_BLK_DEV_4DRIVES
-			case -11: /* "four" drives on one set of ports */
-			{
-				ide_hwif_t *mate = &ide_hwifs[hw^1];
-				mate->drives[0].select.all ^= 0x20;
-				mate->drives[1].select.all ^= 0x20;
-				hwif->chipset = mate->chipset = ide_4drives;
-				mate->irq = hwif->irq;
-				memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
-				goto do_serialize;
-			}
+		case -11: /* "four" drives on one set of ports */
+		{
+			ide_hwif_t *mate = &ide_hwifs[hw^1];
+			mate->drives[0].select.all ^= 0x20;
+			mate->drives[1].select.all ^= 0x20;
+			hwif->chipset = mate->chipset = ide_4drives;
+			mate->irq = hwif->irq;
+			memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
+			goto do_serialize;
+		}
 #endif /* CONFIG_BLK_DEV_4DRIVES */
-			case -10: /* minus10 */
-			case -9: /* minus9 */
-			case -8: /* minus8 */
-				goto bad_option;
-			case -7: /* ata66 */
+		case -10: /* minus10 */
+		case -9: /* minus9 */
+		case -8: /* minus8 */
+			goto bad_option;
+		case -7: /* ata66 */
 #ifdef CONFIG_BLK_DEV_IDEPCI
-				hwif->udma_four = 1;
-				goto done;
+			hwif->udma_four = 1;
+			goto done;
 #else /* !CONFIG_BLK_DEV_IDEPCI */
-				hwif->udma_four = 0;
-				goto bad_hwif;
+			hwif->udma_four = 0;
+			goto bad_hwif;
 #endif /* CONFIG_BLK_DEV_IDEPCI */
-			case -6: /* dma */
-				hwif->autodma = 1;
-				goto done;
-			case -5: /* "reset" */
-				hwif->reset = 1;
-				goto done;
-			case -4: /* "noautotune" */
-				hwif->drives[0].autotune = IDE_TUNE_NOAUTO;
-				hwif->drives[1].autotune = IDE_TUNE_NOAUTO;
-				goto done;
-			case -3: /* "autotune" */
-				hwif->drives[0].autotune = IDE_TUNE_AUTO;
-				hwif->drives[1].autotune = IDE_TUNE_AUTO;
-				goto done;
-			case -2: /* "serialize" */
-			do_serialize:
-				hwif->mate = &ide_hwifs[hw^1];
-				hwif->mate->mate = hwif;
-				hwif->serialized = hwif->mate->serialized = 1;
-				goto done;
-
-			case -1: /* "noprobe" */
-				hwif->noprobe = 1;
-				goto done;
-
-			case 1:	/* base */
-				vals[1] = vals[0] + 0x206; /* default ctl */
-			case 2: /* base,ctl */
-				vals[2] = 0;	/* default irq = probe for it */
-			case 3: /* base,ctl,irq */
-				hwif->hw.irq = vals[2];
-				ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long) vals[1], &hwif->irq);
-				memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
-				hwif->irq      = vals[2];
-				hwif->noprobe  = 0;
-				hwif->chipset  = ide_generic;
-				goto done;
-
-			case 0: goto bad_option;
-			default:
-				printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
-				return 1;
-		}
+		case -6: /* dma */
+			hwif->autodma = 1;
+			goto done;
+		case -5: /* "reset" */
+			hwif->reset = 1;
+			goto done;
+		case -4: /* "noautotune" */
+			hwif->drives[0].autotune = IDE_TUNE_NOAUTO;
+			hwif->drives[1].autotune = IDE_TUNE_NOAUTO;
+			goto done;
+		case -3: /* "autotune" */
+			hwif->drives[0].autotune = IDE_TUNE_AUTO;
+			hwif->drives[1].autotune = IDE_TUNE_AUTO;
+			goto done;
+		case -2: /* "serialize" */
+			hwif->mate = &ide_hwifs[hw^1];
+			hwif->mate->mate = hwif;
+			hwif->serialized = hwif->mate->serialized = 1;
+			goto done;
+
+		case -1: /* "noprobe" */
+			hwif->noprobe = 1;
+			goto done;
+
+		case 1:	/* base */
+			vals[1] = vals[0] + 0x206; /* default ctl */
+		case 2: /* base,ctl */
+			vals[2] = 0;	/* default irq = probe for it */
+		case 3: /* base,ctl,irq */
+			hwif->hw.irq = vals[2];
+			ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long) vals[1], &hwif->irq);
+			memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
+			hwif->irq      = vals[2];
+			hwif->noprobe  = 0;
+			hwif->chipset  = ide_generic;
+			goto done;
+		case 0: goto bad_option;
+		default:
+			printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
+			return 0;
 	}
 bad_option:
 	printk(" -- BAD OPTION\n");
-	return 1;
+	return 0;
 bad_hwif:
 	printk("-- NOT SUPPORTED ON ide%d", hw);
 done:
 	printk("\n");
-	return 1;
+	return 0;
+}
+
+int __init hdX_param_set_fn(const char *val, struct kernel_param *kp)
+{
+	const char *hd_words[] = { "none", "noprobe", "nowerr", "cdrom",
+				   "serialize", "autotune", "noautotune",
+				   "slow", "swapdata", "bswap", "flash",
+				   "remap", "noremap", "scsi", "biostimings",
+				   NULL };
+	ide_hwif_t *hwif;
+	ide_drive_t *drive;
+	unsigned int hw, unit;
+	const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
+	int vals[3];
+
+	printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
+	init_ide_data();
+
+	if (kp->name[2] > max_drive)
+		goto bad_option;
+
+	unit = kp->name[2] - 'a';
+	hw   = unit / MAX_DRIVES;
+	unit = unit % MAX_DRIVES;
+	hwif = &ide_hwifs[hw];
+	drive = &hwif->drives[unit];
+
+	if (!strncmp(val, "ide-", 4)) {
+		strncpy(drive->driver_req, val, 9);
+		goto done;
+	}
+
+	switch (match_parm(val, hd_words, vals, 3)) {
+		case -1: /* "none" */
+			drive->nobios = 1;  /* drop into "noprobe" */
+		case -2: /* "noprobe" */
+			drive->noprobe = 1;
+			goto done;
+		case -3: /* "nowerr" */
+			drive->bad_wstat = BAD_R_STAT;
+			hwif->noprobe = 0;
+			goto done;
+		case -4: /* "cdrom" */
+			drive->present = 1;
+			drive->media = ide_cdrom;
+			hwif->noprobe = 0;
+			goto done;
+		case -5: /* "serialize" */
+			printk(" -- USE \"ide%d=serialize\" INSTEAD", hw);
+			hwif->mate = &ide_hwifs[hw^1];
+			hwif->mate->mate = hwif;
+			hwif->serialized = hwif->mate->serialized = 1;
+			goto done;
+		case -6: /* "autotune" */
+			drive->autotune = IDE_TUNE_AUTO;
+			goto done;
+		case -7: /* "noautotune" */
+			drive->autotune = IDE_TUNE_NOAUTO;
+			goto done;
+		case -8: /* "slow" */
+			drive->slow = 1;
+			goto done;
+		case -9: /* "swapdata" or "bswap" */
+		case -10:
+			drive->bswap = 1;
+			goto done;
+		case -11: /* "flash" */
+			drive->ata_flash = 1;
+			goto done;
+		case -12: /* "remap" */
+			drive->remap_0_to_1 = 1;
+			goto done;
+		case -13: /* "noremap" */
+			drive->remap_0_to_1 = 2;
+			goto done;
+		case -14: /* "scsi" */
+#if defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI)
+			drive->scsi = 1;
+			goto done;
+#else
+			drive->scsi = 0;
+			goto bad_option;
+#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */
+		case -15: /* "biostimings" */
+			drive->autotune = IDE_TUNE_BIOS;
+			goto done;
+		case 3: /* cyl,head,sect */
+			drive->media	= ide_disk;
+			drive->cyl	= drive->bios_cyl  = vals[0];
+			drive->head	= drive->bios_head = vals[1];
+			drive->sect	= drive->bios_sect = vals[2];
+			drive->present	= 1;
+			drive->forced_geom = 1;
+			hwif->noprobe = 0;
+			goto done;
+		default:
+			goto bad_option;
+	}
+bad_option:
+	printk(" -- BAD OPTION\n");
+	return 0;
+done:
+	printk("\n");
+	return 0;
+}
+
+int __init hdXlun_param_set_fn(const char *val, struct kernel_param *kp)
+{
+	int vals[3];
+	ide_drive_t *drive = NULL;
+	const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
+
+	printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
+	init_ide_data();
+
+	if (kp->name[2] > max_drive)
+		goto bad_option;
+
+	if (match_parm(val, NULL, vals, 1) != 1)
+		goto bad_option;
+	if (vals[0] >= 0 && vals[0] <= 7) {
+		drive->last_lun = vals[0];
+		drive->forced_lun = 1;
+	} else
+		printk(" -- BAD LAST LUN! Expected value from 0 to 7");
+	printk("\n");
+	return 0;
+bad_option:
+	printk(" -- BAD OPTION\n");
+	return 0;
 }

 /*
@@ -2482,30 +2514,8 @@ int __init ide_init (void)
 }

 #ifdef MODULE
-char *options = NULL;
-MODULE_PARM(options,"s");
 MODULE_LICENSE("GPL");

-static void __init parse_options (char *line)
-{
-	char *next = line;
-
-	if (line == NULL || !*line)
-		return;
-	while ((line = next) != NULL) {
- 		if ((next = strchr(line,' ')) != NULL)
-			*next++ = 0;
-		if (!ide_setup(line))
-			printk (KERN_INFO "Unknown option '%s'\n", line);
-	}
-}
-
-int init_module (void)
-{
-	parse_options(options);
-	return ide_init();
-}
-
 void cleanup_module (void)
 {
 	int index;
@@ -2525,11 +2535,40 @@ void cleanup_module (void)

 	bus_unregister(&ide_bus_type);
 }
+#endif /* MODULE */

-#else /* !MODULE */
-
-__setup("", ide_setup);
+/* For 2.4 compatibility, drop "ide." prefix. */
+#undef MODULE_PARAM_PREFIX
+#define MODULE_PARAM_PREFIX ""
+
+module_param_call(ide, ide_param_set_fn, NULL, NULL, 0);
+module_param_call(idebus, idebus_param_set_fn, NULL, NULL, 0);
+
+/*
+ * maximum MAX_HWIFS = 10 (also limited by number of IDE major numbers)
+ */
+#define ideX_param(i) \
+	module_param_call(ide##i##, ideX_param_set_fn, NULL, NULL, 0)
+ideX_param(0); ideX_param(1); ideX_param(2); ideX_param(3); ideX_param(4);
+ideX_param(5); ideX_param(6); ideX_param(7); ideX_param(8); ideX_param(9);
+
+/*
+ * maximum drives = MAX_HWIFS * MAX_DRIVES = 20
+ */
+#define hdX_param(c) \
+	module_param_call(hd##c##, hdX_param_set_fn, NULL, NULL, 0)
+hdX_param(a); hdX_param(b); hdX_param(c); hdX_param(d); hdX_param(e);
+hdX_param(f); hdX_param(g); hdX_param(h); hdX_param(i); hdX_param(j);
+hdX_param(k); hdX_param(l); hdX_param(m); hdX_param(n); hdX_param(o);
+hdX_param(p); hdX_param(q); hdX_param(r); hdX_param(s); hdX_param(t);
+
+#define hdXlun_param(c) \
+	module_param_call(hd##c##lun, hdXlun_param_set_fn, NULL, NULL, 0)
+hdXlun_param(a); hdXlun_param(b); hdXlun_param(c); hdXlun_param(d);
+hdXlun_param(e); hdXlun_param(f); hdXlun_param(g); hdXlun_param(h);
+hdXlun_param(i); hdXlun_param(j); hdXlun_param(k); hdXlun_param(l);
+hdXlun_param(m); hdXlun_param(n); hdXlun_param(o); hdXlun_param(p);
+hdXlun_param(q); hdXlun_param(r); hdXlun_param(s); hdXlun_param(t);

 module_init(ide_init);

-#endif /* MODULE */

_


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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-10 16:25 ` [PATCH] Switch ide parameters to new-style and make them unique Bartlomiej Zolnierkiewicz
@ 2003-05-11 14:59   ` Jeremy Jackson
  2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
  2003-05-12  2:21     ` Rusty Russell
  0 siblings, 2 replies; 11+ messages in thread
From: Jeremy Jackson @ 2003-05-11 14:59 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, Rusty Russell; +Cc: Alan Cox, linux-kernel

Haven't tested, but I have a few comments.

First, I think this is a great step in the right
direction for the ide driver.

I think at some point, the kernel command line parameters should be
consolidated behind a single ata=hda,noprobe or ata=if0,io0x1f0,irq7 type
parameter, instead of the hda= and ide0=.  Taking that one step furthur, a
new syntax is needed, and having it go into 2.6 might pave the way for
removing the old cruft in 2.8?

That would seem necessary, as I see it, to remove static ide_hwifs and
eventually support better hotswap.  (But even if it doesn't it would still
clean up the ide parameters)

Regards,

Jeremy
----- Original Message -----
From: "Bartlomiej Zolnierkiewicz" <B.Zolnierkiewicz@elka.pw.edu.pl>
To: "Rusty Russell" <rusty@rustcorp.com.au>
Cc: "Alan Cox" <alan@lxorguk.ukuu.org.uk>; <linux-kernel@vger.kernel.org>
Sent: Saturday, May 10, 2003 12:25 PM
Subject: [PATCH] Switch ide parameters to new-style and make them unique.


>
> Fixes ide parameters after late_boot_params patch.
> Works for me and I would like to know if it doesn't for somebody.
> --
> Bartlomiej
>
> # Switch ide to new-style kernel parameters.
> # Make ide parameters unique.
> #
> # Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>
>
>  drivers/ide/ide.c |  701
++++++++++++++++++++++++++++--------------------------
>  1 files changed, 370 insertions(+), 331 deletions(-)
>
> diff -puN drivers/ide/ide.c~late_boot_params_ide drivers/ide/ide.c
> --- linux-2.5.69/drivers/ide/ide.c~late_boot_params_ide Sat May 10
17:23:14 2003
> +++ linux-2.5.69-root/drivers/ide/ide.c Sat May 10 17:23:14 2003
> @@ -132,6 +132,7 @@
>
>  #include <linux/config.h>
>  #include <linux/module.h>
> +#include <linux/moduleparam.h>
>  #include <linux/types.h>
>  #include <linux/string.h>
>  #include <linux/kernel.h>
> @@ -239,7 +240,7 @@ static void init_hwif_data (unsigned int
>   hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
>  #ifdef CONFIG_BLK_DEV_HD
>   if (hwif->io_ports[IDE_DATA_OFFSET] == HD_DATA)
> - hwif->noprobe = 1; /* may be overridden by ide_setup() */
> + hwif->noprobe = 1; /* may be overridden by ideX=noprobe */
>  #endif /* CONFIG_BLK_DEV_HD */
>   hwif->major = ide_hwif_to_major[index];
>   hwif->name[0] = 'i';
> @@ -1638,7 +1639,7 @@ static int __init stridx (const char *s,
>  }
>
>  /*
> - * match_parm() does parsing for ide_setup():
> + * match_parm() does parsing of boot/module parameters:
>   *
>   * 1. the first char of s must be '='.
>   * 2. if the remainder matches one of the supplied keywords,
> @@ -1649,52 +1650,48 @@ static int __init stridx (const char *s,
>   *     and base16 is allowed when prefixed with "0x".
>   * 4. otherwise, zero is returned.
>   */
> -static int __init match_parm (char *s, const char *keywords[], int
vals[], int max_vals)
> +static int __init match_parm (const char *s, const char *keywords[], int
vals[], int max_vals)
>  {
>   static const char *decimal = "0123456789";
>   static const char *hex = "0123456789abcdef";
>   int i, n;
>
> - if (*s++ == '=') {
> - /*
> - * Try matching against the supplied keywords,
> - * and return -(index+1) if we match one
> - */
> - if (keywords != NULL) {
> - for (i = 0; *keywords != NULL; ++i) {
> - if (!strcmp(s, *keywords++))
> - return -(i+1);
> - }
> + /*
> + * Try matching against the supplied keywords,
> + * and return -(index+1) if we match one
> + */
> + if (keywords != NULL) {
> + for (i = 0; *keywords != NULL; ++i) {
> + if (!strcmp(s, *keywords++))
> + return -(i+1);
>   }
> - /*
> - * Look for a series of no more than "max_vals"
> - * numeric values separated by commas, in base10,
> - * or base16 when prefixed with "0x".
> - * Return a count of how many were found.
> - */
> - for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
> - vals[n] = i;
> - while ((i = stridx(decimal, *++s)) >= 0)
> - vals[n] = (vals[n] * 10) + i;
> - if (*s == 'x' && !vals[n]) {
> - while ((i = stridx(hex, *++s)) >= 0)
> - vals[n] = (vals[n] * 0x10) + i;
> - }
> - if (++n == max_vals)
> - break;
> - if (*s == ',' || *s == ';')
> - ++s;
> + }
> + /*
> + * Look for a series of no more than "max_vals"
> + * numeric values separated by commas, in base10,
> + * or base16 when prefixed with "0x".
> + * Return a count of how many were found.
> + */
> + for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
> + vals[n] = i;
> + while ((i = stridx(decimal, *++s)) >= 0)
> + vals[n] = (vals[n] * 10) + i;
> + if (*s == 'x' && !vals[n]) {
> + while ((i = stridx(hex, *++s)) >= 0)
> + vals[n] = (vals[n] * 0x10) + i;
>   }
> - if (!*s)
> - return n;
> + if (++n == max_vals)
> + break;
> + if (*s == ',' || *s == ';')
> + ++s;
>   }
> + if (!*s)
> + return n;
>   return 0; /* zero = nothing matched */
>  }
>
>  /*
> - * ide_setup() gets called VERY EARLY during initialization,
> - * to handle kernel "command line" strings beginning with "hdx="
> - * or "ide".  Here is the complete set currently supported:
> + * Here is the complete set of currently supported boot/module
parameters:
>   *
>   * "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
>   * "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
> @@ -1774,328 +1771,363 @@ static int __init match_parm (char *s, c
>   * "idex=dc4030" : probe/support Promise DC4030VL interface
>   * "ide=doubler" : probe/support IDE doublers on Amiga
>   */
> -int __init ide_setup (char *s)
> -{
> - int i, vals[3];
> - ide_hwif_t *hwif;
> - ide_drive_t *drive;
> - unsigned int hw, unit;
> - const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
> - const char max_hwif  = '0' + (MAX_HWIFS - 1);
> -
> -
> - if (strncmp(s,"hd",2) == 0 && s[2] == '=') /* hd= is for hd.c   */
> - return 0; /* driver and not us */
>
> - if (strncmp(s,"ide",3) &&
> -     strncmp(s,"idebus",6) &&
> -     strncmp(s,"hd",2)) /* hdx= & hdxlun= */
> - return 0;
> -
> - printk(KERN_INFO "ide_setup: %s", s);
> - init_ide_data ();
> +int __init ide_param_set_fn(const char *val, struct kernel_param *kp)
> +{
> + printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
> + init_ide_data();
>
>  #ifdef CONFIG_BLK_DEV_IDEDOUBLER
> - if (!strcmp(s, "ide=doubler")) {
> + if (!strcmp(val, "doubler")) {
>   extern int ide_doubler;
>
>   printk(" : Enabled support for IDE doublers\n");
>   ide_doubler = 1;
> - return 1;
> + return 0;
>   }
>  #endif /* CONFIG_BLK_DEV_IDEDOUBLER */
>
> - if (!strcmp(s, "ide=nodma")) {
> - printk("IDE: Prevented DMA\n");
> + if (!strcmp(val, "nodma")) {
> + printk(" : Prevented DMA\n");
>   noautodma = 1;
> - return 1;
> + return 0;
>   }
>
>  #ifdef CONFIG_BLK_DEV_IDEPCI
> - if (!strcmp(s, "ide=reverse")) {
> + if (!strcmp(val, "reverse")) {
>   ide_scan_direction = 1;
>   printk(" : Enabled support for IDE inverse scan order.\n");
> - return 1;
> + return 0;
>   }
>  #endif /* CONFIG_BLK_DEV_IDEPCI */
>
> - /*
> - * Look for drive options:  "hdx="
> - */
> - if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
> - const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
> - "serialize", "autotune", "noautotune",
> - "slow", "swapdata", "bswap", "flash",
> - "remap", "noremap", "scsi", "biostimings",
> - NULL};
> - unit = s[2] - 'a';
> - hw   = unit / MAX_DRIVES;
> - unit = unit % MAX_DRIVES;
> - hwif = &ide_hwifs[hw];
> - drive = &hwif->drives[unit];
> - if (strncmp(s + 4, "ide-", 4) == 0) {
> - strncpy(drive->driver_req, s + 4, 9);
> - goto done;
> - }
> - /*
> - * Look for last lun option:  "hdxlun="
> - */
> - if (s[3] == 'l' && s[4] == 'u' && s[5] == 'n') {
> - if (match_parm(&s[6], NULL, vals, 1) != 1)
> - goto bad_option;
> - if (vals[0] >= 0 && vals[0] <= 7) {
> - drive->last_lun = vals[0];
> - drive->forced_lun = 1;
> - } else
> - printk(" -- BAD LAST LUN! Expected value from 0 to 7");
> - goto done;
> - }
> - switch (match_parm(&s[3], hd_words, vals, 3)) {
> - case -1: /* "none" */
> - drive->nobios = 1;  /* drop into "noprobe" */
> - case -2: /* "noprobe" */
> - drive->noprobe = 1;
> - goto done;
> - case -3: /* "nowerr" */
> - drive->bad_wstat = BAD_R_STAT;
> - hwif->noprobe = 0;
> - goto done;
> - case -4: /* "cdrom" */
> - drive->present = 1;
> - drive->media = ide_cdrom;
> - hwif->noprobe = 0;
> - goto done;
> - case -5: /* "serialize" */
> - printk(" -- USE \"ide%d=serialize\" INSTEAD", hw);
> - goto do_serialize;
> - case -6: /* "autotune" */
> - drive->autotune = IDE_TUNE_AUTO;
> - goto done;
> - case -7: /* "noautotune" */
> - drive->autotune = IDE_TUNE_NOAUTO;
> - goto done;
> - case -8: /* "slow" */
> - drive->slow = 1;
> - goto done;
> - case -9: /* "swapdata" or "bswap" */
> - case -10:
> - drive->bswap = 1;
> - goto done;
> - case -11: /* "flash" */
> - drive->ata_flash = 1;
> - goto done;
> - case -12: /* "remap" */
> - drive->remap_0_to_1 = 1;
> - goto done;
> - case -13: /* "noremap" */
> - drive->remap_0_to_1 = 2;
> - goto done;
> - case -14: /* "scsi" */
> -#if defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI)
> - drive->scsi = 1;
> - goto done;
> -#else
> - drive->scsi = 0;
> - goto bad_option;
> -#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */
> - case -15: /* "biostimings" */
> - drive->autotune = IDE_TUNE_BIOS;
> - goto done;
> - case 3: /* cyl,head,sect */
> - drive->media = ide_disk;
> - drive->cyl = drive->bios_cyl  = vals[0];
> - drive->head = drive->bios_head = vals[1];
> - drive->sect = drive->bios_sect = vals[2];
> - drive->present = 1;
> - drive->forced_geom = 1;
> - hwif->noprobe = 0;
> - goto done;
> - default:
> - goto bad_option;
> - }
> - }
> + printk(" -- BAD OPTION\n");
> + return 0;
> +}
>
> - if (s[0] != 'i' || s[1] != 'd' || s[2] != 'e')
> +int __init idebus_param_set_fn(const char *val, struct kernel_param *kp)
> +{
> + int vals[3];
> +
> + printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
> + init_ide_data();
> +
> + if (match_parm(val, NULL, vals, 1) != 1)
>   goto bad_option;
> + if (vals[0] >= 20 && vals[0] <= 66)
> + idebus_parameter = vals[0];
> + else
> + printk(" -- BAD BUS SPEED! Expected value from 20 to 66");
> + printk("\n");
> + return 0;
> +bad_option:
> + printk(" -- BAD OPTION\n");
> + return 0;
> +}
> +
> +int __init ideX_param_set_fn(const char *val, struct kernel_param *kp)
> +{
>   /*
> - * Look for bus speed option:  "idebus="
> - */
> - if (s[3] == 'b' && s[4] == 'u' && s[5] == 's') {
> - if (match_parm(&s[6], NULL, vals, 1) != 1)
> - goto bad_option;
> - if (vals[0] >= 20 && vals[0] <= 66) {
> - idebus_parameter = vals[0];
> - } else
> - printk(" -- BAD BUS SPEED! Expected value from 20 to 66");
> - goto done;
> - }
> - /*
> - * Look for interface options:  "idex="
> + * Be VERY CAREFUL changing this: note hardcoded indexes below
> + * -8,-9,-10 : are reserved for future calls to ease the hardcoding.
>   */
> - if (s[3] >= '0' && s[3] <= max_hwif) {
> - /*
> - * Be VERY CAREFUL changing this: note hardcoded indexes below
> - * -8,-9,-10 : are reserved for future idex calls to ease the hardcoding.
> - */
> - const char *ide_words[] = {
> - "noprobe", "serialize", "autotune", "noautotune",
> + const char *ide_words[] = {
> + "noprobe", "serialize", "autotune", "noautotune",
>   "reset", "dma", "ata66", "minus8", "minus9", "minus10",
> - "four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278",
> + "four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278",
>   "umc8672", "ali14xx", "dc4030", "biostimings", NULL };
> - hw = s[3] - '0';
> - hwif = &ide_hwifs[hw];
> - i = match_parm(&s[4], ide_words, vals, 3);
> + ide_hwif_t *hwif;
> + unsigned int hw;
> + const char max_hwif = '0' + (MAX_HWIFS - 1);
> + int i, vals[3];
>
> - /*
> - * Cryptic check to ensure chipset not already set for hwif:
> - */
> - if (i > 0 || i <= -11) { /* is parameter a chipset name? */
> - if (hwif->chipset != ide_unknown)
> - goto bad_option; /* chipset already specified */
> - if (i <= -11 && i != -18 && hw != 0)
> - goto bad_hwif; /* chipset drivers are for "ide0=" only */
> - if (i <= -11 && i != -18 && ide_hwifs[hw+1].chipset != ide_unknown)
> - goto bad_option; /* chipset for 2nd port already specified */
> - printk("\n");
> - }
> + printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
> + init_ide_data();
> +
> + if (kp->name[3] > max_hwif)
> + goto bad_option;
> +
> + hw = kp->name[3] - '0';
> + hwif = &ide_hwifs[hw];
> + i = match_parm(val, ide_words, vals, 3);
> +
> + /*
> + * Cryptic check to ensure chipset not already set for hwif:
> + */
> + if (i > 0 || i <= -11) { /* is parameter a chipset name? */
> + if (hwif->chipset != ide_unknown)
> + goto bad_option; /* chipset already specified */
> + if (i <= -11 && i != -18 && hw != 0)
> + goto bad_hwif; /* chipset drivers are for "ide0=" only */
> + if (i <= -11 && i != -18 && ide_hwifs[hw+1].chipset != ide_unknown)
> + goto bad_option; /* chipset for 2nd port already specified */
> + printk("\n");
> + }
>
> - switch (i) {
> - case -19: /* "biostimings" */
> - hwif->drives[0].autotune = IDE_TUNE_BIOS;
> - hwif->drives[1].autotune = IDE_TUNE_BIOS;
> - goto done;
> + switch (i) {
> + case -19: /* "biostimings" */
> + hwif->drives[0].autotune = IDE_TUNE_BIOS;
> + hwif->drives[1].autotune = IDE_TUNE_BIOS;
> + goto done;
>  #ifdef CONFIG_BLK_DEV_PDC4030
> - case -18: /* "dc4030" */
> - {
> - extern void init_pdc4030(void);
> - init_pdc4030();
> - goto done;
> - }
> + case -18: /* "dc4030" */
> + {
> + extern void init_pdc4030(void);
> + init_pdc4030();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_PDC4030 */
>  #ifdef CONFIG_BLK_DEV_ALI14XX
> - case -17: /* "ali14xx" */
> - {
> - extern void init_ali14xx (void);
> - init_ali14xx();
> - goto done;
> - }
> + case -17: /* "ali14xx" */
> + {
> + extern void init_ali14xx (void);
> + init_ali14xx();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_ALI14XX */
>  #ifdef CONFIG_BLK_DEV_UMC8672
> - case -16: /* "umc8672" */
> - {
> - extern void init_umc8672 (void);
> - init_umc8672();
> - goto done;
> - }
> + case -16: /* "umc8672" */
> + {
> + extern void init_umc8672 (void);
> + init_umc8672();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_UMC8672 */
>  #ifdef CONFIG_BLK_DEV_DTC2278
> - case -15: /* "dtc2278" */
> - {
> - extern void init_dtc2278 (void);
> - init_dtc2278();
> - goto done;
> - }
> + case -15: /* "dtc2278" */
> + {
> + extern void init_dtc2278 (void);
> + init_dtc2278();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_DTC2278 */
>  #ifdef CONFIG_BLK_DEV_CMD640
> - case -14: /* "cmd640_vlb" */
> - {
> - extern int cmd640_vlb; /* flag for cmd640.c */
> - cmd640_vlb = 1;
> - goto done;
> - }
> + case -14: /* "cmd640_vlb" */
> + {
> + extern int cmd640_vlb; /* flag for cmd640.c */
> + cmd640_vlb = 1;
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_CMD640 */
>  #ifdef CONFIG_BLK_DEV_HT6560B
> - case -13: /* "ht6560b" */
> - {
> - extern void init_ht6560b (void);
> - init_ht6560b();
> - goto done;
> - }
> + case -13: /* "ht6560b" */
> + {
> + extern void init_ht6560b (void);
> + init_ht6560b();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_HT6560B */
>  #ifdef CONFIG_BLK_DEV_QD65XX
> - case -12: /* "qd65xx" */
> - {
> - extern void init_qd65xx (void);
> - init_qd65xx();
> - goto done;
> - }
> + case -12: /* "qd65xx" */
> + {
> + extern void init_qd65xx (void);
> + init_qd65xx();
> + goto done;
> + }
>  #endif /* CONFIG_BLK_DEV_QD65XX */
>  #ifdef CONFIG_BLK_DEV_4DRIVES
> - case -11: /* "four" drives on one set of ports */
> - {
> - ide_hwif_t *mate = &ide_hwifs[hw^1];
> - mate->drives[0].select.all ^= 0x20;
> - mate->drives[1].select.all ^= 0x20;
> - hwif->chipset = mate->chipset = ide_4drives;
> - mate->irq = hwif->irq;
> - memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
> - goto do_serialize;
> - }
> + case -11: /* "four" drives on one set of ports */
> + {
> + ide_hwif_t *mate = &ide_hwifs[hw^1];
> + mate->drives[0].select.all ^= 0x20;
> + mate->drives[1].select.all ^= 0x20;
> + hwif->chipset = mate->chipset = ide_4drives;
> + mate->irq = hwif->irq;
> + memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
> + goto do_serialize;
> + }
>  #endif /* CONFIG_BLK_DEV_4DRIVES */
> - case -10: /* minus10 */
> - case -9: /* minus9 */
> - case -8: /* minus8 */
> - goto bad_option;
> - case -7: /* ata66 */
> + case -10: /* minus10 */
> + case -9: /* minus9 */
> + case -8: /* minus8 */
> + goto bad_option;
> + case -7: /* ata66 */
>  #ifdef CONFIG_BLK_DEV_IDEPCI
> - hwif->udma_four = 1;
> - goto done;
> + hwif->udma_four = 1;
> + goto done;
>  #else /* !CONFIG_BLK_DEV_IDEPCI */
> - hwif->udma_four = 0;
> - goto bad_hwif;
> + hwif->udma_four = 0;
> + goto bad_hwif;
>  #endif /* CONFIG_BLK_DEV_IDEPCI */
> - case -6: /* dma */
> - hwif->autodma = 1;
> - goto done;
> - case -5: /* "reset" */
> - hwif->reset = 1;
> - goto done;
> - case -4: /* "noautotune" */
> - hwif->drives[0].autotune = IDE_TUNE_NOAUTO;
> - hwif->drives[1].autotune = IDE_TUNE_NOAUTO;
> - goto done;
> - case -3: /* "autotune" */
> - hwif->drives[0].autotune = IDE_TUNE_AUTO;
> - hwif->drives[1].autotune = IDE_TUNE_AUTO;
> - goto done;
> - case -2: /* "serialize" */
> - do_serialize:
> - hwif->mate = &ide_hwifs[hw^1];
> - hwif->mate->mate = hwif;
> - hwif->serialized = hwif->mate->serialized = 1;
> - goto done;
> -
> - case -1: /* "noprobe" */
> - hwif->noprobe = 1;
> - goto done;
> -
> - case 1: /* base */
> - vals[1] = vals[0] + 0x206; /* default ctl */
> - case 2: /* base,ctl */
> - vals[2] = 0; /* default irq = probe for it */
> - case 3: /* base,ctl,irq */
> - hwif->hw.irq = vals[2];
> - ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long)
vals[1], &hwif->irq);
> - memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
> - hwif->irq      = vals[2];
> - hwif->noprobe  = 0;
> - hwif->chipset  = ide_generic;
> - goto done;
> -
> - case 0: goto bad_option;
> - default:
> - printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
> - return 1;
> - }
> + case -6: /* dma */
> + hwif->autodma = 1;
> + goto done;
> + case -5: /* "reset" */
> + hwif->reset = 1;
> + goto done;
> + case -4: /* "noautotune" */
> + hwif->drives[0].autotune = IDE_TUNE_NOAUTO;
> + hwif->drives[1].autotune = IDE_TUNE_NOAUTO;
> + goto done;
> + case -3: /* "autotune" */
> + hwif->drives[0].autotune = IDE_TUNE_AUTO;
> + hwif->drives[1].autotune = IDE_TUNE_AUTO;
> + goto done;
> + case -2: /* "serialize" */
> + hwif->mate = &ide_hwifs[hw^1];
> + hwif->mate->mate = hwif;
> + hwif->serialized = hwif->mate->serialized = 1;
> + goto done;
> +
> + case -1: /* "noprobe" */
> + hwif->noprobe = 1;
> + goto done;
> +
> + case 1: /* base */
> + vals[1] = vals[0] + 0x206; /* default ctl */
> + case 2: /* base,ctl */
> + vals[2] = 0; /* default irq = probe for it */
> + case 3: /* base,ctl,irq */
> + hwif->hw.irq = vals[2];
> + ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long)
vals[1], &hwif->irq);
> + memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
> + hwif->irq      = vals[2];
> + hwif->noprobe  = 0;
> + hwif->chipset  = ide_generic;
> + goto done;
> + case 0: goto bad_option;
> + default:
> + printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
> + return 0;
>   }
>  bad_option:
>   printk(" -- BAD OPTION\n");
> - return 1;
> + return 0;
>  bad_hwif:
>   printk("-- NOT SUPPORTED ON ide%d", hw);
>  done:
>   printk("\n");
> - return 1;
> + return 0;
> +}
> +
> +int __init hdX_param_set_fn(const char *val, struct kernel_param *kp)
> +{
> + const char *hd_words[] = { "none", "noprobe", "nowerr", "cdrom",
> +    "serialize", "autotune", "noautotune",
> +    "slow", "swapdata", "bswap", "flash",
> +    "remap", "noremap", "scsi", "biostimings",
> +    NULL };
> + ide_hwif_t *hwif;
> + ide_drive_t *drive;
> + unsigned int hw, unit;
> + const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
> + int vals[3];
> +
> + printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
> + init_ide_data();
> +
> + if (kp->name[2] > max_drive)
> + goto bad_option;
> +
> + unit = kp->name[2] - 'a';
> + hw   = unit / MAX_DRIVES;
> + unit = unit % MAX_DRIVES;
> + hwif = &ide_hwifs[hw];
> + drive = &hwif->drives[unit];
> +
> + if (!strncmp(val, "ide-", 4)) {
> + strncpy(drive->driver_req, val, 9);
> + goto done;
> + }
> +
> + switch (match_parm(val, hd_words, vals, 3)) {
> + case -1: /* "none" */
> + drive->nobios = 1;  /* drop into "noprobe" */
> + case -2: /* "noprobe" */
> + drive->noprobe = 1;
> + goto done;
> + case -3: /* "nowerr" */
> + drive->bad_wstat = BAD_R_STAT;
> + hwif->noprobe = 0;
> + goto done;
> + case -4: /* "cdrom" */
> + drive->present = 1;
> + drive->media = ide_cdrom;
> + hwif->noprobe = 0;
> + goto done;
> + case -5: /* "serialize" */
> + printk(" -- USE \"ide%d=serialize\" INSTEAD", hw);
> + hwif->mate = &ide_hwifs[hw^1];
> + hwif->mate->mate = hwif;
> + hwif->serialized = hwif->mate->serialized = 1;
> + goto done;
> + case -6: /* "autotune" */
> + drive->autotune = IDE_TUNE_AUTO;
> + goto done;
> + case -7: /* "noautotune" */
> + drive->autotune = IDE_TUNE_NOAUTO;
> + goto done;
> + case -8: /* "slow" */
> + drive->slow = 1;
> + goto done;
> + case -9: /* "swapdata" or "bswap" */
> + case -10:
> + drive->bswap = 1;
> + goto done;
> + case -11: /* "flash" */
> + drive->ata_flash = 1;
> + goto done;
> + case -12: /* "remap" */
> + drive->remap_0_to_1 = 1;
> + goto done;
> + case -13: /* "noremap" */
> + drive->remap_0_to_1 = 2;
> + goto done;
> + case -14: /* "scsi" */
> +#if defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI)
> + drive->scsi = 1;
> + goto done;
> +#else
> + drive->scsi = 0;
> + goto bad_option;
> +#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */
> + case -15: /* "biostimings" */
> + drive->autotune = IDE_TUNE_BIOS;
> + goto done;
> + case 3: /* cyl,head,sect */
> + drive->media = ide_disk;
> + drive->cyl = drive->bios_cyl  = vals[0];
> + drive->head = drive->bios_head = vals[1];
> + drive->sect = drive->bios_sect = vals[2];
> + drive->present = 1;
> + drive->forced_geom = 1;
> + hwif->noprobe = 0;
> + goto done;
> + default:
> + goto bad_option;
> + }
> +bad_option:
> + printk(" -- BAD OPTION\n");
> + return 0;
> +done:
> + printk("\n");
> + return 0;
> +}
> +
> +int __init hdXlun_param_set_fn(const char *val, struct kernel_param *kp)
> +{
> + int vals[3];
> + ide_drive_t *drive = NULL;
> + const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
> +
> + printk(KERN_INFO "IDE parameter: %s=%s", kp->name, val);
> + init_ide_data();
> +
> + if (kp->name[2] > max_drive)
> + goto bad_option;
> +
> + if (match_parm(val, NULL, vals, 1) != 1)
> + goto bad_option;
> + if (vals[0] >= 0 && vals[0] <= 7) {
> + drive->last_lun = vals[0];
> + drive->forced_lun = 1;
> + } else
> + printk(" -- BAD LAST LUN! Expected value from 0 to 7");
> + printk("\n");
> + return 0;
> +bad_option:
> + printk(" -- BAD OPTION\n");
> + return 0;
>  }
>
>  /*
> @@ -2482,30 +2514,8 @@ int __init ide_init (void)
>  }
>
>  #ifdef MODULE
> -char *options = NULL;
> -MODULE_PARM(options,"s");
>  MODULE_LICENSE("GPL");
>
> -static void __init parse_options (char *line)
> -{
> - char *next = line;
> -
> - if (line == NULL || !*line)
> - return;
> - while ((line = next) != NULL) {
> - if ((next = strchr(line,' ')) != NULL)
> - *next++ = 0;
> - if (!ide_setup(line))
> - printk (KERN_INFO "Unknown option '%s'\n", line);
> - }
> -}
> -
> -int init_module (void)
> -{
> - parse_options(options);
> - return ide_init();
> -}
> -
>  void cleanup_module (void)
>  {
>   int index;
> @@ -2525,11 +2535,40 @@ void cleanup_module (void)
>
>   bus_unregister(&ide_bus_type);
>  }
> +#endif /* MODULE */
>
> -#else /* !MODULE */
> -
> -__setup("", ide_setup);
> +/* For 2.4 compatibility, drop "ide." prefix. */
> +#undef MODULE_PARAM_PREFIX
> +#define MODULE_PARAM_PREFIX ""
> +
> +module_param_call(ide, ide_param_set_fn, NULL, NULL, 0);
> +module_param_call(idebus, idebus_param_set_fn, NULL, NULL, 0);
> +
> +/*
> + * maximum MAX_HWIFS = 10 (also limited by number of IDE major numbers)
> + */
> +#define ideX_param(i) \
> + module_param_call(ide##i##, ideX_param_set_fn, NULL, NULL, 0)
> +ideX_param(0); ideX_param(1); ideX_param(2); ideX_param(3);
ideX_param(4);
> +ideX_param(5); ideX_param(6); ideX_param(7); ideX_param(8);
ideX_param(9);
> +
> +/*
> + * maximum drives = MAX_HWIFS * MAX_DRIVES = 20
> + */
> +#define hdX_param(c) \
> + module_param_call(hd##c##, hdX_param_set_fn, NULL, NULL, 0)
> +hdX_param(a); hdX_param(b); hdX_param(c); hdX_param(d); hdX_param(e);
> +hdX_param(f); hdX_param(g); hdX_param(h); hdX_param(i); hdX_param(j);
> +hdX_param(k); hdX_param(l); hdX_param(m); hdX_param(n); hdX_param(o);
> +hdX_param(p); hdX_param(q); hdX_param(r); hdX_param(s); hdX_param(t);
> +
> +#define hdXlun_param(c) \
> + module_param_call(hd##c##lun, hdXlun_param_set_fn, NULL, NULL, 0)
> +hdXlun_param(a); hdXlun_param(b); hdXlun_param(c); hdXlun_param(d);
> +hdXlun_param(e); hdXlun_param(f); hdXlun_param(g); hdXlun_param(h);
> +hdXlun_param(i); hdXlun_param(j); hdXlun_param(k); hdXlun_param(l);
> +hdXlun_param(m); hdXlun_param(n); hdXlun_param(o); hdXlun_param(p);
> +hdXlun_param(q); hdXlun_param(r); hdXlun_param(s); hdXlun_param(t);
>
>  module_init(ide_init);
>
> -#endif /* MODULE */
>
> _
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>


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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-11 14:59   ` Jeremy Jackson
@ 2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
  2003-05-11 16:35       ` Alan Cox
  2003-05-12  1:49       ` Jeremy Jackson
  2003-05-12  2:21     ` Rusty Russell
  1 sibling, 2 replies; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2003-05-11 15:32 UTC (permalink / raw)
  To: Jeremy Jackson; +Cc: Rusty Russell, Alan Cox, linux-kernel


On Sun, 11 May 2003, Jeremy Jackson wrote:

> Haven't tested, but I have a few comments.
>
> First, I think this is a great step in the right
> direction for the ide driver.

Thanks.

> I think at some point, the kernel command line parameters should be
> consolidated behind a single ata=hda,noprobe or ata=if0,io0x1f0,irq7 type
> parameter, instead of the hda= and ide0=.  Taking that one step furthur, a
> new syntax is needed, and having it go into 2.6 might pave the way for
> removing the old cruft in 2.8?

Yes, I was thinking about it.
I prefer as easily parsable parameters as possible :-)
fe. ata.dev_noprobe=hda and ata.if_io_irq=0,0x1f0,7.

It is a question of shorter command line vs shorter parsing code.

About a 2.6:
I want to mark old command line plus HDIO_DRIVE_CMD and HDIO_DRIVE_TASK
ioctls as obsoleted for 2.6.x and remove these cruft early in 2.7.x.
I hope I will manage to do it, but it depends on Linus.

> That would seem necessary, as I see it, to remove static ide_hwifs and
> eventually support better hotswap.  (But even if it doesn't it would still
> clean up the ide parameters)

FYI I have just done dynamic ide_hwifs allocations, patch needs
    finishing (pdc4030 special case), polishing and testing.

Regards,
--
Bartlomiej


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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
@ 2003-05-11 16:35       ` Alan Cox
  2003-05-12  1:49       ` Jeremy Jackson
  1 sibling, 0 replies; 11+ messages in thread
From: Alan Cox @ 2003-05-11 16:35 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: Jeremy Jackson, Rusty Russell, Linux Kernel Mailing List

On Sul, 2003-05-11 at 16:32, Bartlomiej Zolnierkiewicz wrote:
> FYI I have just done dynamic ide_hwifs allocations, patch needs
>     finishing (pdc4030 special case), polishing and testing.

Excellent. I killed the other pdc4030 special case in 2.4.21rc2-ac.
I'll push updates for that along once the taskfile stuff is stable
as it requires being able to hook the rw_disk function. HPT372N also
requires this to do the clock switching



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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
  2003-05-11 16:35       ` Alan Cox
@ 2003-05-12  1:49       ` Jeremy Jackson
  2003-05-12  6:37         ` Rusty Russell
  1 sibling, 1 reply; 11+ messages in thread
From: Jeremy Jackson @ 2003-05-12  1:49 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz; +Cc: Rusty Russell, Alan Cox, linux-kernel

Cool stuff.

As far as making the parameters easy to parse, I think you would want to
have a single static tag before the = (equal) sign.  The kernel command line
parsing stuff provides parsing up to that point and dispatches to each
subsystem (or at least it used to), so:

ata.dev_noprobe=hda

should be

ata=dev_noprobe:hda,if_io_irq:0,0x1f0,7

or some such to use the generic code that's already there.

and possibly instead of io/irq pass PCI bus:device:fn and make passing raw
ioports a special case

Cheers,

Jeremy
----- Original Message -----
From: "Bartlomiej Zolnierkiewicz" <B.Zolnierkiewicz@elka.pw.edu.pl>
To: "Jeremy Jackson" <jerj@coplanar.net>
Cc: "Rusty Russell" <rusty@rustcorp.com.au>; "Alan Cox"
<alan@lxorguk.ukuu.org.uk>; <linux-kernel@vger.kernel.org>
Sent: Sunday, May 11, 2003 11:32 AM
Subject: Re: [PATCH] Switch ide parameters to new-style and make them
unique.


>
> On Sun, 11 May 2003, Jeremy Jackson wrote:
>
> > Haven't tested, but I have a few comments.
> >
> > First, I think this is a great step in the right
> > direction for the ide driver.
>
> Thanks.
>
> > I think at some point, the kernel command line parameters should be
> > consolidated behind a single ata=hda,noprobe or ata=if0,io0x1f0,irq7
type
> > parameter, instead of the hda= and ide0=.  Taking that one step furthur,
a
> > new syntax is needed, and having it go into 2.6 might pave the way for
> > removing the old cruft in 2.8?
>
> Yes, I was thinking about it.
> I prefer as easily parsable parameters as possible :-)
> fe. ata.dev_noprobe=hda and ata.if_io_irq=0,0x1f0,7.
>
> It is a question of shorter command line vs shorter parsing code.
>
> About a 2.6:
> I want to mark old command line plus HDIO_DRIVE_CMD and HDIO_DRIVE_TASK
> ioctls as obsoleted for 2.6.x and remove these cruft early in 2.7.x.
> I hope I will manage to do it, but it depends on Linus.
>
> > That would seem necessary, as I see it, to remove static ide_hwifs and
> > eventually support better hotswap.  (But even if it doesn't it would
still
> > clean up the ide parameters)
>
> FYI I have just done dynamic ide_hwifs allocations, patch needs
>     finishing (pdc4030 special case), polishing and testing.
>
> Regards,
> --
> Bartlomiej
>


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

* Re: [PATCH] Parse new-style boot parameters just before initcalls
  2003-05-10 16:19 [PATCH] Parse new-style boot parameters just before initcalls Bartlomiej Zolnierkiewicz
  2003-05-10 16:25 ` [PATCH] Switch ide parameters to new-style and make them unique Bartlomiej Zolnierkiewicz
@ 2003-05-12  2:05 ` Rusty Russell
  2003-05-12 12:05   ` Bartlomiej Zolnierkiewicz
  1 sibling, 1 reply; 11+ messages in thread
From: Rusty Russell @ 2003-05-12  2:05 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz; +Cc: Alan Cox, linux-kernel

In message <Pine.SOL.4.30.0305101735410.20755-100000@mion.elka.pw.edu.pl> you w
rite:
> 
> Hi,
> 
> I've redone this patch. I've tested it and works okay for me.
> It is as minimal as possible and I hope it can go in 2.5 soon.

Only one request, that you push this slightly more, and make
setup_arch() call parse_early_args().  Does that break something?

That way the arch-specific parsing in setup_arch() can be converted to
__setup (but doesn't need to be: archs can take their time).

ie. we already have two-stage parsing, it'd be nice not to make it
three.

Minor nitpick:

> @@ -241,7 +279,7 @@ static int __init unknown_bootoption(cha
>  		val[-1] = '=';
> 
>  	/* Handle obsolete-style parameters */
> -	if (obsolete_checksetup(param))
> +	if (obsolete_test_checksetup(param))
>  		return 0;
> 

Change comment to /* Ignore early params: already done in
parse_early_args */ or something, and maybe rename
obsolete_test_checksetup() to is_early_setup().

Thanks!
Rusty.
--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-11 14:59   ` Jeremy Jackson
  2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
@ 2003-05-12  2:21     ` Rusty Russell
  1 sibling, 0 replies; 11+ messages in thread
From: Rusty Russell @ 2003-05-12  2:21 UTC (permalink / raw)
  To: Jeremy Jackson, Bartlomiej Zolnierkiewicz; +Cc: Alan Cox, linux-kernel

In message <005201c317cd$febb2d00$7c07a8c0@kennet.coplanar.net> you write:
> I think at some point, the kernel command line parameters should be
> consolidated behind a single ata=hda,noprobe or ata=if0,io0x1f0,irq7 type
> parameter, instead of the hda= and ide0=.  Taking that one step furthur, a
> new syntax is needed, and having it go into 2.6 might pave the way for
> removing the old cruft in 2.8?

The idea behind module_param* is to promote conformity, so a module
foo will have command line params starting with "foo.", as well as
easing the burden of double-implementation on kernel coders.

Naturally, this transition will take a long time (ie. forever):
breaking command line params is not something to be done lightly, even
in a major point transition.

Cheers,
Rusty.
--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-12  1:49       ` Jeremy Jackson
@ 2003-05-12  6:37         ` Rusty Russell
  2003-05-12 12:34           ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 11+ messages in thread
From: Rusty Russell @ 2003-05-12  6:37 UTC (permalink / raw)
  To: Jeremy Jackson; +Cc: Alan Cox, linux-kernel, Bartlomiej Zolnierkiewicz

In message <003f01c31828$c8e9f480$7c07a8c0@kennet.coplanar.net> you write:
> Cool stuff.
> 
> As far as making the parameters easy to parse, I think you would want to
> have a single static tag before the = (equal) sign.  The kernel command line
> parsing stuff provides parsing up to that point and dispatches to each
> subsystem (or at least it used to), so:
> 
> ata.dev_noprobe=hda
> 
> should be
> 
> ata=dev_noprobe:hda,if_io_irq:0,0x1f0,7
> 
> or some such to use the generic code that's already there.

Sure, some more complex generic parsing thing certainly makes sense.
I think whoever produces the code will probably get to decide what it
looks like.

Cheers!
Rusty.
--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

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

* Re: [PATCH] Parse new-style boot parameters just before initcalls
  2003-05-12  2:05 ` [PATCH] Parse new-style boot parameters just before initcalls Rusty Russell
@ 2003-05-12 12:05   ` Bartlomiej Zolnierkiewicz
  0 siblings, 0 replies; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2003-05-12 12:05 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Alan Cox, linux-kernel


On Mon, 12 May 2003, Rusty Russell wrote:

> In message <Pine.SOL.4.30.0305101735410.20755-100000@mion.elka.pw.edu.pl> you w
> rite:
> >
> > Hi,
> >
> > I've redone this patch. I've tested it and works okay for me.
> > It is as minimal as possible and I hope it can go in 2.5 soon.
>
> Only one request, that you push this slightly more, and make
> setup_arch() call parse_early_args().  Does that break something?

Okay.
Shouldn't break anything, but it requires updating setup.c for each arch.

> That way the arch-specific parsing in setup_arch() can be converted to
> __setup (but doesn't need to be: archs can take their time).
>
> ie. we already have two-stage parsing, it'd be nice not to make it
> three.

Yep.

> Minor nitpick:
>
> > @@ -241,7 +279,7 @@ static int __init unknown_bootoption(cha
> >  		val[-1] = '=';
> >
> >  	/* Handle obsolete-style parameters */
> > -	if (obsolete_checksetup(param))
> > +	if (obsolete_test_checksetup(param))
> >  		return 0;
> >
>
> Change comment to /* Ignore early params: already done in
> parse_early_args */ or something, and maybe rename
> obsolete_test_checksetup() to is_early_setup().

Okay.

> Thanks!
> Rusty.
> --
>   Anyone who quotes me in their sig is an idiot. -- Rusty Russell.


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

* Re: [PATCH] Switch ide parameters to new-style and make them unique.
  2003-05-12  6:37         ` Rusty Russell
@ 2003-05-12 12:34           ` Bartlomiej Zolnierkiewicz
  0 siblings, 0 replies; 11+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2003-05-12 12:34 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Jeremy Jackson, Alan Cox, linux-kernel


On Mon, 12 May 2003, Rusty Russell wrote:

> In message <003f01c31828$c8e9f480$7c07a8c0@kennet.coplanar.net> you write:
> > Cool stuff.
> >
> > As far as making the parameters easy to parse, I think you would want to
> > have a single static tag before the = (equal) sign.  The kernel command line
> > parsing stuff provides parsing up to that point and dispatches to each
> > subsystem (or at least it used to), so:
> >
> > ata.dev_noprobe=hda
> >
> > should be
> >
> > ata=dev_noprobe:hda,if_io_irq:0,0x1f0,7
> >
> > or some such to use the generic code that's already there.

Already there? :-)
Generic code to do this would be nice.

> Sure, some more complex generic parsing thing certainly makes sense.
> I think whoever produces the code will probably get to decide what it
> looks like.

For the beginning generic helper which grabs table of strings
(driver params) and pointers to parsing functions ('char *s' arg,
'int' return) would be useful for many drivers...

--
Bartlomiej

> Cheers!
> Rusty.
> --
>   Anyone who quotes me in their sig is an idiot. -- Rusty Russell.


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

end of thread, other threads:[~2003-05-12 12:22 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-10 16:19 [PATCH] Parse new-style boot parameters just before initcalls Bartlomiej Zolnierkiewicz
2003-05-10 16:25 ` [PATCH] Switch ide parameters to new-style and make them unique Bartlomiej Zolnierkiewicz
2003-05-11 14:59   ` Jeremy Jackson
2003-05-11 15:32     ` Bartlomiej Zolnierkiewicz
2003-05-11 16:35       ` Alan Cox
2003-05-12  1:49       ` Jeremy Jackson
2003-05-12  6:37         ` Rusty Russell
2003-05-12 12:34           ` Bartlomiej Zolnierkiewicz
2003-05-12  2:21     ` Rusty Russell
2003-05-12  2:05 ` [PATCH] Parse new-style boot parameters just before initcalls Rusty Russell
2003-05-12 12:05   ` Bartlomiej Zolnierkiewicz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).