diff options
| author | Matt Domsch <matt_domsch@dell.com> | 2005-01-04 05:31:50 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-04 05:31:50 -0800 |
| commit | e9855e2c503591bd5118e54c06e3978e69f8857f (patch) | |
| tree | 2e9b971468e41b03d7ad3a17f75c56839080f85d | |
| parent | 9506e1975f34e76a18b81aa49cbacb589fa52ee7 (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.txt | 5 | ||||
| -rw-r--r-- | arch/i386/boot/edd.S | 42 | ||||
| -rw-r--r-- | include/linux/edd.h | 4 |
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) |
