diff options
Diffstat (limited to 'arch/powerpc/sysdev/xics')
-rw-r--r-- | arch/powerpc/sysdev/xics/icp-hv.c | 10 | ||||
-rw-r--r-- | arch/powerpc/sysdev/xics/icp-native.c | 10 | ||||
-rw-r--r-- | arch/powerpc/sysdev/xics/xics-common.c | 30 |
3 files changed, 8 insertions, 42 deletions
diff --git a/arch/powerpc/sysdev/xics/icp-hv.c b/arch/powerpc/sysdev/xics/icp-hv.c index 234764c189a4..9518d367a64f 100644 --- a/arch/powerpc/sysdev/xics/icp-hv.c +++ b/arch/powerpc/sysdev/xics/icp-hv.c | |||
@@ -118,12 +118,8 @@ static void icp_hv_set_cpu_priority(unsigned char cppr) | |||
118 | 118 | ||
119 | #ifdef CONFIG_SMP | 119 | #ifdef CONFIG_SMP |
120 | 120 | ||
121 | static void icp_hv_message_pass(int cpu, int msg) | 121 | static void icp_hv_cause_ipi(int cpu, unsigned long data) |
122 | { | 122 | { |
123 | unsigned long *tgt = &per_cpu(xics_ipi_message, cpu); | ||
124 | |||
125 | set_bit(msg, tgt); | ||
126 | mb(); | ||
127 | icp_hv_set_qirr(cpu, IPI_PRIORITY); | 123 | icp_hv_set_qirr(cpu, IPI_PRIORITY); |
128 | } | 124 | } |
129 | 125 | ||
@@ -133,7 +129,7 @@ static irqreturn_t icp_hv_ipi_action(int irq, void *dev_id) | |||
133 | 129 | ||
134 | icp_hv_set_qirr(cpu, 0xff); | 130 | icp_hv_set_qirr(cpu, 0xff); |
135 | 131 | ||
136 | return xics_ipi_dispatch(cpu); | 132 | return smp_ipi_demux(); |
137 | } | 133 | } |
138 | 134 | ||
139 | #endif /* CONFIG_SMP */ | 135 | #endif /* CONFIG_SMP */ |
@@ -146,7 +142,7 @@ static const struct icp_ops icp_hv_ops = { | |||
146 | .flush_ipi = icp_hv_flush_ipi, | 142 | .flush_ipi = icp_hv_flush_ipi, |
147 | #ifdef CONFIG_SMP | 143 | #ifdef CONFIG_SMP |
148 | .ipi_action = icp_hv_ipi_action, | 144 | .ipi_action = icp_hv_ipi_action, |
149 | .message_pass = icp_hv_message_pass, | 145 | .cause_ipi = icp_hv_cause_ipi, |
150 | #endif | 146 | #endif |
151 | }; | 147 | }; |
152 | 148 | ||
diff --git a/arch/powerpc/sysdev/xics/icp-native.c b/arch/powerpc/sysdev/xics/icp-native.c index 246500eefbfd..1f15ad436140 100644 --- a/arch/powerpc/sysdev/xics/icp-native.c +++ b/arch/powerpc/sysdev/xics/icp-native.c | |||
@@ -134,12 +134,8 @@ static unsigned int icp_native_get_irq(void) | |||
134 | 134 | ||
135 | #ifdef CONFIG_SMP | 135 | #ifdef CONFIG_SMP |
136 | 136 | ||
137 | static void icp_native_message_pass(int cpu, int msg) | 137 | static void icp_native_cause_ipi(int cpu, unsigned long data) |
138 | { | 138 | { |
139 | unsigned long *tgt = &per_cpu(xics_ipi_message, cpu); | ||
140 | |||
141 | set_bit(msg, tgt); | ||
142 | mb(); | ||
143 | icp_native_set_qirr(cpu, IPI_PRIORITY); | 139 | icp_native_set_qirr(cpu, IPI_PRIORITY); |
144 | } | 140 | } |
145 | 141 | ||
@@ -149,7 +145,7 @@ static irqreturn_t icp_native_ipi_action(int irq, void *dev_id) | |||
149 | 145 | ||
150 | icp_native_set_qirr(cpu, 0xff); | 146 | icp_native_set_qirr(cpu, 0xff); |
151 | 147 | ||
152 | return xics_ipi_dispatch(cpu); | 148 | return smp_ipi_demux(); |
153 | } | 149 | } |
154 | 150 | ||
155 | #endif /* CONFIG_SMP */ | 151 | #endif /* CONFIG_SMP */ |
@@ -267,7 +263,7 @@ static const struct icp_ops icp_native_ops = { | |||
267 | .flush_ipi = icp_native_flush_ipi, | 263 | .flush_ipi = icp_native_flush_ipi, |
268 | #ifdef CONFIG_SMP | 264 | #ifdef CONFIG_SMP |
269 | .ipi_action = icp_native_ipi_action, | 265 | .ipi_action = icp_native_ipi_action, |
270 | .message_pass = icp_native_message_pass, | 266 | .cause_ipi = icp_native_cause_ipi, |
271 | #endif | 267 | #endif |
272 | }; | 268 | }; |
273 | 269 | ||
diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c index a0576b705ddd..a31a7103218f 100644 --- a/arch/powerpc/sysdev/xics/xics-common.c +++ b/arch/powerpc/sysdev/xics/xics-common.c | |||
@@ -126,32 +126,6 @@ void xics_mask_unknown_vec(unsigned int vec) | |||
126 | 126 | ||
127 | #ifdef CONFIG_SMP | 127 | #ifdef CONFIG_SMP |
128 | 128 | ||
129 | DEFINE_PER_CPU_SHARED_ALIGNED(unsigned long, xics_ipi_message); | ||
130 | |||
131 | irqreturn_t xics_ipi_dispatch(int cpu) | ||
132 | { | ||
133 | unsigned long *tgt = &per_cpu(xics_ipi_message, cpu); | ||
134 | |||
135 | mb(); /* order mmio clearing qirr */ | ||
136 | while (*tgt) { | ||
137 | if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION, tgt)) { | ||
138 | smp_message_recv(PPC_MSG_CALL_FUNCTION); | ||
139 | } | ||
140 | if (test_and_clear_bit(PPC_MSG_RESCHEDULE, tgt)) { | ||
141 | smp_message_recv(PPC_MSG_RESCHEDULE); | ||
142 | } | ||
143 | if (test_and_clear_bit(PPC_MSG_CALL_FUNC_SINGLE, tgt)) { | ||
144 | smp_message_recv(PPC_MSG_CALL_FUNC_SINGLE); | ||
145 | } | ||
146 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) | ||
147 | if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, tgt)) { | ||
148 | smp_message_recv(PPC_MSG_DEBUGGER_BREAK); | ||
149 | } | ||
150 | #endif | ||
151 | } | ||
152 | return IRQ_HANDLED; | ||
153 | } | ||
154 | |||
155 | static void xics_request_ipi(void) | 129 | static void xics_request_ipi(void) |
156 | { | 130 | { |
157 | unsigned int ipi; | 131 | unsigned int ipi; |
@@ -170,8 +144,8 @@ static void xics_request_ipi(void) | |||
170 | 144 | ||
171 | int __init xics_smp_probe(void) | 145 | int __init xics_smp_probe(void) |
172 | { | 146 | { |
173 | /* Setup message_pass callback based on which ICP is used */ | 147 | /* Setup cause_ipi callback based on which ICP is used */ |
174 | smp_ops->message_pass = icp_ops->message_pass; | 148 | smp_ops->cause_ipi = icp_ops->cause_ipi; |
175 | 149 | ||
176 | /* Register all the IPIs */ | 150 | /* Register all the IPIs */ |
177 | xics_request_ipi(); | 151 | xics_request_ipi(); |