|
@@ -897,12 +897,50 @@ void __init init_bsp_APIC(void)
|
|
|
apic_write_around(APIC_LVT1, value);
|
|
|
}
|
|
|
|
|
|
+void __cpuinit lapic_setup_esr(void)
|
|
|
+{
|
|
|
+ unsigned long oldvalue, value, maxlvt;
|
|
|
+ if (lapic_is_integrated() && !esr_disable) {
|
|
|
+ /* !82489DX */
|
|
|
+ maxlvt = lapic_get_maxlvt();
|
|
|
+ if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
|
|
+ apic_write(APIC_ESR, 0);
|
|
|
+ oldvalue = apic_read(APIC_ESR);
|
|
|
+
|
|
|
+ /* enables sending errors */
|
|
|
+ value = ERROR_APIC_VECTOR;
|
|
|
+ apic_write_around(APIC_LVTERR, value);
|
|
|
+ /*
|
|
|
+ * spec says clear errors after enabling vector.
|
|
|
+ */
|
|
|
+ if (maxlvt > 3)
|
|
|
+ apic_write(APIC_ESR, 0);
|
|
|
+ value = apic_read(APIC_ESR);
|
|
|
+ if (value != oldvalue)
|
|
|
+ apic_printk(APIC_VERBOSE, "ESR value before enabling "
|
|
|
+ "vector: 0x%08lx after: 0x%08lx\n",
|
|
|
+ oldvalue, value);
|
|
|
+ } else {
|
|
|
+ if (esr_disable)
|
|
|
+ /*
|
|
|
+ * Something untraceable is creating bad interrupts on
|
|
|
+ * secondary quads ... for the moment, just leave the
|
|
|
+ * ESR disabled - we can't do anything useful with the
|
|
|
+ * errors anyway - mbligh
|
|
|
+ */
|
|
|
+ printk(KERN_INFO "Leaving ESR disabled.\n");
|
|
|
+ else
|
|
|
+ printk(KERN_INFO "No ESR for 82489DX.\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* setup_local_APIC - setup the local APIC
|
|
|
*/
|
|
|
void __cpuinit setup_local_APIC(void)
|
|
|
{
|
|
|
- unsigned long oldvalue, value, maxlvt, integrated;
|
|
|
+ unsigned long value, integrated;
|
|
|
int i, j;
|
|
|
|
|
|
/* Pound the ESR really hard over the head with a big hammer - mbligh */
|
|
@@ -1027,38 +1065,7 @@ void __cpuinit setup_local_APIC(void)
|
|
|
value |= APIC_LVT_LEVEL_TRIGGER;
|
|
|
apic_write_around(APIC_LVT1, value);
|
|
|
|
|
|
- if (integrated && !esr_disable) {
|
|
|
- /* !82489DX */
|
|
|
- maxlvt = lapic_get_maxlvt();
|
|
|
- if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|
|
|
- apic_write(APIC_ESR, 0);
|
|
|
- oldvalue = apic_read(APIC_ESR);
|
|
|
-
|
|
|
- /* enables sending errors */
|
|
|
- value = ERROR_APIC_VECTOR;
|
|
|
- apic_write_around(APIC_LVTERR, value);
|
|
|
- /*
|
|
|
- * spec says clear errors after enabling vector.
|
|
|
- */
|
|
|
- if (maxlvt > 3)
|
|
|
- apic_write(APIC_ESR, 0);
|
|
|
- value = apic_read(APIC_ESR);
|
|
|
- if (value != oldvalue)
|
|
|
- apic_printk(APIC_VERBOSE, "ESR value before enabling "
|
|
|
- "vector: 0x%08lx after: 0x%08lx\n",
|
|
|
- oldvalue, value);
|
|
|
- } else {
|
|
|
- if (esr_disable)
|
|
|
- /*
|
|
|
- * Something untraceable is creating bad interrupts on
|
|
|
- * secondary quads ... for the moment, just leave the
|
|
|
- * ESR disabled - we can't do anything useful with the
|
|
|
- * errors anyway - mbligh
|
|
|
- */
|
|
|
- printk(KERN_INFO "Leaving ESR disabled.\n");
|
|
|
- else
|
|
|
- printk(KERN_INFO "No ESR for 82489DX.\n");
|
|
|
- }
|
|
|
+ lapic_setup_esr();
|
|
|
|
|
|
/* Disable the local apic timer */
|
|
|
value = apic_read(APIC_LVTT);
|