2004-11-23 23:04:31

by Matt Domsch

[permalink] [raw]
Subject: [PATCH 2.6] EDD: add edd=off and edd=skipmbr options

Carl-Daniel, David, Jeff, Alan:
I'd appreciate your testing of the following EDD code in your system
configurations where your adapter BIOSes would fail.

Peter, Andi: I've built this for x86 and x86-64, and run this on x86.
I'd appreciate your review of the assembly code, and suggestions for
improvement, prior to my submitting it to akpm for 2.6.11.

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.

Signed-off-by: Matt Domsch <[email protected]>

Documentation/kernel-parameters.txt | 5 ++++
arch/i386/boot/edd.S | 42 ++++++++++++++++++++++++++++++++++--
include/linux/edd.h | 4 +++
3 files changed, 49 insertions, 2 deletions

--
Matt Domsch
Sr. Software Engineer, Lead Engineer
Dell Linux Solutions linux.dell.com & http://www.dell.com/linux
Linux on Dell mailing lists @ http://lists.us.dell.com

--- ../linux-2.6/arch/i386/boot/edd.S Sat Nov 13 20:22:44 2004
+++ linux-2.6-edd-options/arch/i386/boot/edd.S Tue Nov 23 15:26:28 2004
@@ -1,5 +1,6 @@
/*
* BIOS Enhanced Disk Drive support
+ * Copyright (C) 2002, 2003, 2004 Dell, Inc.
* by Matt Domsch <[email protected]> October 2002
* conformant to T13 Committee http://www.t13.org
* projects 1572D, 1484D, 1386D, 1226DT
@@ -7,14 +8,52 @@
* and Andrew Wilks <[email protected]> September 2003, June 2004
* legacy CHS retreival by Patrick J. LoPresti <[email protected]>
* 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) # zero value at EDD_MBR_SIG_NR_BUF
+ movb $0, (EDDNR) # zero value at 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-6), %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:
--- ../linux-2.6/include/linux/edd.h Sat Nov 13 20:22:46 2004
+++ linux-2.6-edd-options/include/linux/edd.h Tue Nov 23 15:03:51 2004
@@ -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)
--- ../linux-2.6/Documentation/kernel-parameters.txt Tue Nov 23 10:56:18 2004
+++ linux-2.6-edd-options/Documentation/kernel-parameters.txt Tue Nov 23 16:28:53 2004
@@ -29,6 +29,7 @@ restrictions referred to are that the re
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.
@@ -407,6 +408,10 @@ running once the system is up.
eda= [HW,PS2]

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>


2004-11-24 03:14:36

by Randy.Dunlap

[permalink] [raw]
Subject: Re: [PATCH 2.6] EDD: add edd=off and edd=skipmbr options

Matt Domsch wrote:
>
> Peter, Andi: I've built this for x86 and x86-64, and run this on x86.
> I'd appreciate your review of the assembly code, and suggestions for
> improvement, prior to my submitting it to akpm for 2.6.11.
>
> EDD: add edd=off and edd=skipmbr command line options
>
> New command line options
> edd=off (or edd=of)
> edd=skipmbr (or edd=sk)
>
> 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.

Sorry to nitpick this, but the doc. should include an
'=' sign like the ones before and after it:

edb= [HW,PS2]
+
+ edd [EDD]
+ Format: {"of[f]" | "sk[ipmbr]"}
+ See comment in arch/i386/boot/edd.S


in edd.S:
+ movb $0, (EDD_MBR_SIG_NR_BUF) # zero value at EDD_MBR_SIG_NR_BUF
+ movb $0, (EDDNR) # zero value at EDDNR

Such obvious comments aren't needed, even if they were just
moved from other places....

Rest of the .S code makes sense to me.

~Randy

2004-11-24 10:39:41

by Andi Kleen

[permalink] [raw]
Subject: Re: [PATCH 2.6] EDD: add edd=off and edd=skipmbr options

> Peter, Andi: I've built this for x86 and x86-64, and run this on x86.
> I'd appreciate your review of the assembly code, and suggestions for
> improvement, prior to my submitting it to akpm for 2.6.11.

Looks ok to me.

-Andi