Hi Linus, Could you please pull:
git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git for-linus H. Peter Anvin (4): [x86 setup] APM: BX should be zero when disconnecting [x86 setup] Fix typos in struct efi_info [x86 setup] Make struct ist_info cross-architecture, and use in setup code [x86 setup] Make struct apm_bios_info cross-architecture Mikael Pettersson (1): [x86 setup] APM detection logic bug fix arch/i386/boot/apm.c | 7 ++++--- arch/i386/boot/main.c | 16 ++++++++-------- include/asm-i386/bootparam.h | 9 +++++---- include/asm-i386/ist.h | 10 ++++++---- include/asm-x86_64/ist.h | 1 + include/linux/apm_bios.h | 20 +++++++++++--------- 6 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 include/asm-x86_64/ist.h [Full changelog with diffs follows] commit 4bf3b0bc3e98f77de88b336fd8d673649601b557 Author: H. Peter Anvin <[EMAIL PROTECTED]> Date: Wed Jul 25 11:06:02 2007 -0700 [x86 setup] Make struct apm_bios_info cross-architecture struct apm_bios_info uses "unsigned short" and "unsigned long" to mean u16 and u32 respectively. Correct. Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]> diff --git a/include/linux/apm_bios.h b/include/linux/apm_bios.h index 290aef3..5f921c8 100644 --- a/include/linux/apm_bios.h +++ b/include/linux/apm_bios.h @@ -21,20 +21,22 @@ typedef unsigned short apm_eventinfo_t; #ifdef __KERNEL__ +#include <linux/types.h> + #define APM_CS (GDT_ENTRY_APMBIOS_BASE * 8) #define APM_CS_16 (APM_CS + 8) #define APM_DS (APM_CS_16 + 8) struct apm_bios_info { - unsigned short version; - unsigned short cseg; - unsigned long offset; - unsigned short cseg_16; - unsigned short dseg; - unsigned short flags; - unsigned short cseg_len; - unsigned short cseg_16_len; - unsigned short dseg_len; + u16 version; + u16 cseg; + u32 offset; + u16 cseg_16; + u16 dseg; + u16 flags; + u16 cseg_len; + u16 cseg_16_len; + u16 dseg_len; }; /* Results of APM Installation Check */ commit 238b706da1c6ebacc55986ac8668f3ede4621f2c Author: H. Peter Anvin <[EMAIL PROTECTED]> Date: Wed Jul 18 17:19:30 2007 -0700 [x86 setup] Make struct ist_info cross-architecture, and use in setup code Make "struct ist_info" valid on both i386 and x86-64, and use the structure by name in the setup code. Additionally, "Intel SpeedStep IST" is redundant, refer to it as IST consistently. Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]> diff --git a/arch/i386/boot/main.c b/arch/i386/boot/main.c index 7f01f96..0eeef39 100644 --- a/arch/i386/boot/main.c +++ b/arch/i386/boot/main.c @@ -73,15 +73,15 @@ static void keyboard_set_repeat(void) } /* - * Get Intel SpeedStep IST information. + * Get Intel SpeedStep (IST) information. */ -static void query_speedstep_ist(void) +static void query_ist(void) { asm("int $0x15" - : "=a" (boot_params.speedstep_info[0]), - "=b" (boot_params.speedstep_info[1]), - "=c" (boot_params.speedstep_info[2]), - "=d" (boot_params.speedstep_info[3]) + : "=a" (boot_params.ist_info.signature), + "=b" (boot_params.ist_info.command), + "=c" (boot_params.ist_info.event), + "=d" (boot_params.ist_info.perf_level) : "a" (0x0000e980), /* IST Support */ "d" (0x47534943)); /* Request value */ } @@ -144,8 +144,8 @@ void main(void) query_voyager(); #endif - /* Query SpeedStep IST information */ - query_speedstep_ist(); + /* Query Intel SpeedStep (IST) information */ + query_ist(); /* Query APM information */ #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) diff --git a/include/asm-i386/bootparam.h b/include/asm-i386/bootparam.h index 211f3f9..b91b017 100644 --- a/include/asm-i386/bootparam.h +++ b/include/asm-i386/bootparam.h @@ -4,8 +4,9 @@ #include <linux/types.h> #include <linux/screen_info.h> #include <linux/apm_bios.h> -#include <asm/e820.h> #include <linux/edd.h> +#include <asm/e820.h> +#include <asm/ist.h> #include <video/edid.h> struct setup_header { @@ -59,7 +60,7 @@ struct boot_params { struct screen_info screen_info; /* 0x000 */ struct apm_bios_info apm_bios_info; /* 0x040 */ u8 _pad2[12]; /* 0x054 */ - u32 speedstep_info[4]; /* 0x060 */ + struct ist_info ist_info; /* 0x060 */ u8 _pad3[16]; /* 0x070 */ u8 hd0_info[16]; /* obsolete! */ /* 0x080 */ u8 hd1_info[16]; /* obsolete! */ /* 0x090 */ diff --git a/include/asm-i386/ist.h b/include/asm-i386/ist.h index d13d1e6..ef2003e 100644 --- a/include/asm-i386/ist.h +++ b/include/asm-i386/ist.h @@ -19,11 +19,13 @@ #ifdef __KERNEL__ +#include <linux/types.h> + struct ist_info { - unsigned long signature; - unsigned long command; - unsigned long event; - unsigned long perf_level; + u32 signature; + u32 command; + u32 event; + u32 perf_level; }; extern struct ist_info ist_info; diff --git a/include/asm-x86_64/ist.h b/include/asm-x86_64/ist.h new file mode 100644 index 0000000..338857e --- /dev/null +++ b/include/asm-x86_64/ist.h @@ -0,0 +1 @@ +#include <asm-i386/ist.h> commit f77b1ab383c8745447a3385e25729b92f2ec58a4 Author: H. Peter Anvin <[EMAIL PROTECTED]> Date: Wed Jul 18 17:16:19 2007 -0700 [x86 setup] Fix typos in struct efi_info Fix missing letters in the structure members of struct efi_info. Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]> diff --git a/include/asm-i386/bootparam.h b/include/asm-i386/bootparam.h index 427d865..211f3f9 100644 --- a/include/asm-i386/bootparam.h +++ b/include/asm-i386/bootparam.h @@ -48,9 +48,9 @@ struct efi_info { u32 _pad1; u32 efi_systab; u32 efi_memdesc_size; - u32 efi_memdec_version; + u32 efi_memdesc_version; u32 efi_memmap; - u32 fi_memmap_size; + u32 efi_memmap_size; u32 _pad2[2]; }; commit 1a13286b104faeeb4f4bc3bfbf4d4fcdcd2569ed Author: H. Peter Anvin <[EMAIL PROTECTED]> Date: Mon Jul 23 15:37:14 2007 -0700 [x86 setup] APM: BX should be zero when disconnecting For APM calls, BX contains the device index, which is zero for the system BIOS. Disconnect requres BX = 0. Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]> diff --git a/arch/i386/boot/apm.c b/arch/i386/boot/apm.c index 8be3f56..eab50c5 100644 --- a/arch/i386/boot/apm.c +++ b/arch/i386/boot/apm.c @@ -45,9 +45,10 @@ int query_apm_bios(void) /* Disconnect first, just in case */ ax = 0x5304; + bx = 0; asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp" - : "+a" (ax) - : : "ebx", "ecx", "edx", "esi", "edi"); + : "+a" (ax), "+b" (bx) + : : "ecx", "edx", "esi", "edi"); /* Paranoia */ ebx = esi = 0; commit 1514ab09edb071345fe17cd230c97f9e72c9478e Author: Mikael Pettersson <[EMAIL PROTECTED]> Date: Tue Jul 24 00:25:59 2007 +0200 [x86 setup] APM detection logic bug fix Starting with kernel 2.6.23-rc1, the i386 APM driver fails on several of my machines with the message: apm: BIOS not found This happens because of a bug in the i386 boot code rewrite from assembler to C. The original assembly code had the following code in its APM BIOS presence test (boot/setup.S): andw $0x02, %cx # Is 32 bit supported? je done_apm_bios # No 32-bit, no (good) APM BIOS That is, the code bails out if bit 2 is zero. In the new C version, this is coded as (boot/apm.c): if (cx & 0x02) /* 32 bits supported? */ return -1; Here we see that the test has been accidentally inverted. The fix is to negate the test. I've verified that this allows the APM driver to work again on my affected machines. Signed-off-by: Mikael Pettersson <[EMAIL PROTECTED]> Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]> diff --git a/arch/i386/boot/apm.c b/arch/i386/boot/apm.c index a34087c..8be3f56 100644 --- a/arch/i386/boot/apm.c +++ b/arch/i386/boot/apm.c @@ -40,7 +40,7 @@ int query_apm_bios(void) if (bx != 0x504d) /* "PM" signature */ return -1; - if (cx & 0x02) /* 32 bits supported? */ + if (!(cx & 0x02)) /* 32 bits supported? */ return -1; /* Disconnect first, just in case */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/