summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Domsch <matt_domsch@dell.com>2005-01-04 05:31:50 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-04 05:31:50 -0800
commite9855e2c503591bd5118e54c06e3978e69f8857f (patch)
tree2e9b971468e41b03d7ad3a17f75c56839080f85d
parent9506e1975f34e76a18b81aa49cbacb589fa52ee7 (diff)
[PATCH] EDD: add edd=off and edd=skipmbr options
EDD: add edd=off and edd=skipmbr command line options New command line options edd=off (or edd=of) edd=skipmbr (or edd=sk) runtime options for disabling all EDD int13 calls completely, or for skipping the int13 READ SECTOR calls, respectively. These are provided to allow Linux distributions to include CONFIG_EDD=m, yet allow end-users to disable parts of EDD which may not work well with their system's BIOS. I incorporated comments from Randy Dunlap, and got an ack from Andi Kleen. Signed-off-by: Matt Domsch <Matt_Domsch@dell.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--arch/i386/boot/edd.S42
-rw-r--r--include/linux/edd.h4
3 files changed, 49 insertions, 2 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index ab8d7cea7182..8b56f5868c8b 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -29,6 +29,7 @@ restrictions referred to are that the relevant option is valid if:
CD Appropriate CD support is enabled.
DEVFS devfs support is enabled.
DRM Direct Rendering Management support is enabled.
+ EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
EFI EFI Partitioning (GPT) is enabled
EIDE EIDE/ATAPI support is enabled.
FB The frame buffer device is enabled.
@@ -411,6 +412,10 @@ running once the system is up.
edb= [HW,PS2]
+ edd= [EDD]
+ Format: {"of[f]" | "sk[ipmbr]"}
+ See comment in arch/i386/boot/edd.S
+
eicon= [HW,ISDN]
Format: <id>,<membase>,<irq>
diff --git a/arch/i386/boot/edd.S b/arch/i386/boot/edd.S
index 889790693bcd..027d6b354ffb 100644
--- a/arch/i386/boot/edd.S
+++ b/arch/i386/boot/edd.S
@@ -1,5 +1,6 @@
/*
* BIOS Enhanced Disk Drive support
+ * Copyright (C) 2002, 2003, 2004 Dell, Inc.
* by Matt Domsch <Matt_Domsch@dell.com> October 2002
* conformant to T13 Committee www.t13.org
* projects 1572D, 1484D, 1386D, 1226DT
@@ -7,14 +8,52 @@
* and Andrew Wilks <Andrew_Wilks@dell.com> September 2003, June 2004
* legacy CHS retreival by Patrick J. LoPresti <patl@users.sourceforge.net>
* March 2004
+ * Command line option parsing, Matt Domsch, November 2004
*/
#include <linux/edd.h>
+#include <asm/setup.h>
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+ movb $0, (EDD_MBR_SIG_NR_BUF)
+ movb $0, (EDDNR)
+
+# Check the command line for two options:
+# edd=of disables EDD completely (edd=off)
+# edd=sk skips the MBR test (edd=skipmbr)
+ pushl %esi
+ cmpl $0, %cs:cmd_line_ptr
+ jz done_cl
+ movl %cs:(cmd_line_ptr), %esi
+# ds:esi has the pointer to the command line now
+ movl $(COMMAND_LINE_SIZE-7), %ecx
+# loop through kernel command line one byte at a time
+cl_loop:
+ cmpl $EDD_CL_EQUALS, (%si)
+ jz found_edd_equals
+ incl %esi
+ loop cl_loop
+ jmp done_cl
+found_edd_equals:
+# only looking at first two characters after equals
+ addl $4, %esi
+ cmpw $EDD_CL_OFF, (%si) # edd=of
+ jz do_edd_off
+ cmpw $EDD_CL_SKIP, (%si) # edd=sk
+ jz do_edd_skipmbr
+ jmp done_cl
+do_edd_skipmbr:
+ popl %esi
+ jmp edd_start
+do_edd_off:
+ popl %esi
+ jmp edd_done
+done_cl:
+ popl %esi
+
+
# Read the first sector of each BIOS disk device and store the 4-byte signature
edd_mbr_sig_start:
- movb $0, (EDD_MBR_SIG_NR_BUF) # zero value at EDD_MBR_SIG_NR_BUF
movb $0x80, %dl # from device 80
movw $EDD_MBR_SIG_BUF, %bx # store buffer ptr in bx
edd_mbr_sig_read:
@@ -76,7 +115,6 @@ edd_start:
# result buffer for fn48
movw $EDDBUF+EDDEXTSIZE, %si # in ds:si, fn41 results
# kept just before that
- movb $0, (EDDNR) # zero value at EDDNR
movb $0x80, %dl # BIOS device 0x80
edd_check_ext:
diff --git a/include/linux/edd.h b/include/linux/edd.h
index 5f93881106fa..c6e6747a401d 100644
--- a/include/linux/edd.h
+++ b/include/linux/edd.h
@@ -49,6 +49,10 @@
#define EDD_MBR_SIG_MAX 16 /* max number of signatures to store */
#define EDD_MBR_SIG_NR_BUF 0x1ea /* addr of number of MBR signtaures at EDD_MBR_SIG_BUF
in boot_params - treat this as 1 byte */
+#define EDD_CL_EQUALS 0x3d646465 /* "edd=" */
+#define EDD_CL_OFF 0x666f /* "of" for off */
+#define EDD_CL_SKIP 0x6b73 /* "sk" for skipmbr */
+
#ifndef __ASSEMBLY__
#define EDD_EXT_FIXED_DISK_ACCESS (1 << 0)