aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-04-06 10:13:39 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-04-06 10:13:39 +0000
commit407b90a9ee556e8d5509e45a32625d61bde00646 (patch)
treea8759f34b73a4c6f18e949cbee93fc9fddecf533
parent4edd616282deffa095e4046f7a1f31e7128df167 (diff)
downloadxen-407b90a9ee556e8d5509e45a32625d61bde00646.tar.gz
xen-407b90a9ee556e8d5509e45a32625d61bde00646.tar.bz2
xen-407b90a9ee556e8d5509e45a32625d61bde00646.zip
bitkeeper revision 1.853 (407282d3tJwEyg57cPIuOEErciWHgA)
Port missing file updates from Linux 2.4.25.
-rw-r--r--xen/arch/i386/io_apic.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/xen/arch/i386/io_apic.c b/xen/arch/i386/io_apic.c
index 4cec08fc22..3f0c81be7a 100644
--- a/xen/arch/i386/io_apic.c
+++ b/xen/arch/i386/io_apic.c
@@ -937,6 +937,7 @@ void __init print_IO_APIC(void)
printk(KERN_DEBUG "....... : IO APIC version: %04X\n", reg_01.version);
if ( (reg_01.version != 0x01) && /* 82489DX IO-APICs */
(reg_01.version != 0x02) && /* VIA */
+ (reg_01.version != 0x03) && /* later VIA */
(reg_01.version != 0x10) && /* oldest IO-APICs */
(reg_01.version != 0x11) && /* Pentium/Pro IO-APICs */
(reg_01.version != 0x13) && /* Xeon IO-APICs */
@@ -946,13 +947,31 @@ void __init print_IO_APIC(void)
if (reg_01.__reserved_1 || reg_01.__reserved_2)
UNEXPECTED_IO_APIC();
- if (reg_01.version >= 0x10) {
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
+ * but the value of reg_02 is read as the previous read register
+ * value, so ignore it if reg_02 == reg_01.
+ */
+ if (reg_01.version >= 0x10 && *(int *)&reg_02 != *(int *)&reg_01) {
printk(KERN_DEBUG ".... register #02: %08X\n", *(int *)&reg_02);
printk(KERN_DEBUG "....... : arbitration: %02X\n", reg_02.arbitration);
if (reg_02.__reserved_1 || reg_02.__reserved_2)
UNEXPECTED_IO_APIC();
}
+ /*
+ * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
+ * or reg_03, but the value of reg_0[23] is read as the previous read
+ * register value, so ignore it if reg_03 == reg_0[12].
+ */
+ if (reg_01.version >= 0x20 && *(int *)&reg_03 != *(int *)&reg_02 &&
+ *(int *)&reg_03 != *(int *)&reg_01) {
+ printk(KERN_DEBUG ".... register #03: %08X\n", *(int *)&reg_03);
+ printk(KERN_DEBUG "....... : Boot DT : %X\n", reg_03.boot_DT);
+ if (reg_03.__reserved_1)
+ UNEXPECTED_IO_APIC();
+ }
+
printk(KERN_DEBUG ".... IRQ redirection table:\n");
printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"