diff options
Diffstat (limited to 'arch/ia64/kernel/mca.c')
-rw-r--r-- | arch/ia64/kernel/mca.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index a0220dc5ff42..84fb405eee87 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -582,6 +582,8 @@ out: | |||
582 | /* Get the CPE error record and log it */ | 582 | /* Get the CPE error record and log it */ |
583 | ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); | 583 | ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); |
584 | 584 | ||
585 | local_irq_disable(); | ||
586 | |||
585 | return IRQ_HANDLED; | 587 | return IRQ_HANDLED; |
586 | } | 588 | } |
587 | 589 | ||
@@ -1859,7 +1861,8 @@ ia64_mca_cpu_init(void *cpu_data) | |||
1859 | data = mca_bootmem(); | 1861 | data = mca_bootmem(); |
1860 | first_time = 0; | 1862 | first_time = 0; |
1861 | } else | 1863 | } else |
1862 | data = __get_free_pages(GFP_KERNEL, get_order(sz)); | 1864 | data = (void *)__get_free_pages(GFP_KERNEL, |
1865 | get_order(sz)); | ||
1863 | if (!data) | 1866 | if (!data) |
1864 | panic("Could not allocate MCA memory for cpu %d\n", | 1867 | panic("Could not allocate MCA memory for cpu %d\n", |
1865 | cpu); | 1868 | cpu); |
@@ -2055,25 +2058,6 @@ ia64_mca_init(void) | |||
2055 | 2058 | ||
2056 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__); | 2059 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__); |
2057 | 2060 | ||
2058 | /* | ||
2059 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
2060 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
2061 | */ | ||
2062 | register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); | ||
2063 | register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); | ||
2064 | ia64_mca_cmc_vector_setup(); /* Setup vector on BSP */ | ||
2065 | |||
2066 | /* Setup the MCA rendezvous interrupt vector */ | ||
2067 | register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); | ||
2068 | |||
2069 | /* Setup the MCA wakeup interrupt vector */ | ||
2070 | register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); | ||
2071 | |||
2072 | #ifdef CONFIG_ACPI | ||
2073 | /* Setup the CPEI/P handler */ | ||
2074 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
2075 | #endif | ||
2076 | |||
2077 | /* Initialize the areas set aside by the OS to buffer the | 2061 | /* Initialize the areas set aside by the OS to buffer the |
2078 | * platform/processor error states for MCA/INIT/CMC | 2062 | * platform/processor error states for MCA/INIT/CMC |
2079 | * handling. | 2063 | * handling. |
@@ -2103,6 +2087,25 @@ ia64_mca_late_init(void) | |||
2103 | if (!mca_init) | 2087 | if (!mca_init) |
2104 | return 0; | 2088 | return 0; |
2105 | 2089 | ||
2090 | /* | ||
2091 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
2092 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
2093 | */ | ||
2094 | register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); | ||
2095 | register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); | ||
2096 | ia64_mca_cmc_vector_setup(); /* Setup vector on BSP */ | ||
2097 | |||
2098 | /* Setup the MCA rendezvous interrupt vector */ | ||
2099 | register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); | ||
2100 | |||
2101 | /* Setup the MCA wakeup interrupt vector */ | ||
2102 | register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); | ||
2103 | |||
2104 | #ifdef CONFIG_ACPI | ||
2105 | /* Setup the CPEI/P handler */ | ||
2106 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
2107 | #endif | ||
2108 | |||
2106 | register_hotcpu_notifier(&mca_cpu_notifier); | 2109 | register_hotcpu_notifier(&mca_cpu_notifier); |
2107 | 2110 | ||
2108 | /* Setup the CMCI/P vector and handler */ | 2111 | /* Setup the CMCI/P vector and handler */ |
@@ -2122,7 +2125,6 @@ ia64_mca_late_init(void) | |||
2122 | cpe_poll_timer.function = ia64_mca_cpe_poll; | 2125 | cpe_poll_timer.function = ia64_mca_cpe_poll; |
2123 | 2126 | ||
2124 | { | 2127 | { |
2125 | struct irq_desc *desc; | ||
2126 | unsigned int irq; | 2128 | unsigned int irq; |
2127 | 2129 | ||
2128 | if (cpe_vector >= 0) { | 2130 | if (cpe_vector >= 0) { |
@@ -2130,8 +2132,7 @@ ia64_mca_late_init(void) | |||
2130 | irq = local_vector_to_irq(cpe_vector); | 2132 | irq = local_vector_to_irq(cpe_vector); |
2131 | if (irq > 0) { | 2133 | if (irq > 0) { |
2132 | cpe_poll_enabled = 0; | 2134 | cpe_poll_enabled = 0; |
2133 | desc = irq_desc + irq; | 2135 | irq_set_status_flags(irq, IRQ_PER_CPU); |
2134 | desc->status |= IRQ_PER_CPU; | ||
2135 | setup_irq(irq, &mca_cpe_irqaction); | 2136 | setup_irq(irq, &mca_cpe_irqaction); |
2136 | ia64_cpe_irq = irq; | 2137 | ia64_cpe_irq = irq; |
2137 | ia64_mca_register_cpev(cpe_vector); | 2138 | ia64_mca_register_cpev(cpe_vector); |