diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-09-22 22:04:59 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-10-11 01:48:46 -0400 |
commit | bf8e0f891a32ba24fa8811e496fabb449589d942 (patch) | |
tree | 2a42bfbffff6183addc41f0752fa253aa440b888 /arch/powerpc/sysdev | |
parent | 46d319e5d8c8add09378a67e27237504d0132283 (diff) |
powerpc/powernv: Fix endian issues in OPAL ICS backend
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r-- | arch/powerpc/sysdev/xics/ics-opal.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c b/arch/powerpc/sysdev/xics/ics-opal.c index 39d72212655e..3c6ee1b64e5d 100644 --- a/arch/powerpc/sysdev/xics/ics-opal.c +++ b/arch/powerpc/sysdev/xics/ics-opal.c | |||
@@ -112,6 +112,7 @@ static int ics_opal_set_affinity(struct irq_data *d, | |||
112 | bool force) | 112 | bool force) |
113 | { | 113 | { |
114 | unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); | 114 | unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); |
115 | __be16 oserver; | ||
115 | int16_t server; | 116 | int16_t server; |
116 | int8_t priority; | 117 | int8_t priority; |
117 | int64_t rc; | 118 | int64_t rc; |
@@ -120,13 +121,13 @@ static int ics_opal_set_affinity(struct irq_data *d, | |||
120 | if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) | 121 | if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) |
121 | return -1; | 122 | return -1; |
122 | 123 | ||
123 | rc = opal_get_xive(hw_irq, &server, &priority); | 124 | rc = opal_get_xive(hw_irq, &oserver, &priority); |
124 | if (rc != OPAL_SUCCESS) { | 125 | if (rc != OPAL_SUCCESS) { |
125 | pr_err("%s: opal_set_xive(irq=%d [hw 0x%x] server=%x)" | 126 | pr_err("%s: opal_get_xive(irq=%d [hw 0x%x]) error %lld\n", |
126 | " error %lld\n", | 127 | __func__, d->irq, hw_irq, rc); |
127 | __func__, d->irq, hw_irq, server, rc); | ||
128 | return -1; | 128 | return -1; |
129 | } | 129 | } |
130 | server = be16_to_cpu(oserver); | ||
130 | 131 | ||
131 | wanted_server = xics_get_irq_server(d->irq, cpumask, 1); | 132 | wanted_server = xics_get_irq_server(d->irq, cpumask, 1); |
132 | if (wanted_server < 0) { | 133 | if (wanted_server < 0) { |
@@ -181,7 +182,7 @@ static int ics_opal_map(struct ics *ics, unsigned int virq) | |||
181 | { | 182 | { |
182 | unsigned int hw_irq = (unsigned int)virq_to_hw(virq); | 183 | unsigned int hw_irq = (unsigned int)virq_to_hw(virq); |
183 | int64_t rc; | 184 | int64_t rc; |
184 | int16_t server; | 185 | __be16 server; |
185 | int8_t priority; | 186 | int8_t priority; |
186 | 187 | ||
187 | if (WARN_ON(hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)) | 188 | if (WARN_ON(hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)) |
@@ -201,7 +202,7 @@ static int ics_opal_map(struct ics *ics, unsigned int virq) | |||
201 | static void ics_opal_mask_unknown(struct ics *ics, unsigned long vec) | 202 | static void ics_opal_mask_unknown(struct ics *ics, unsigned long vec) |
202 | { | 203 | { |
203 | int64_t rc; | 204 | int64_t rc; |
204 | int16_t server; | 205 | __be16 server; |
205 | int8_t priority; | 206 | int8_t priority; |
206 | 207 | ||
207 | /* Check if HAL knows about this interrupt */ | 208 | /* Check if HAL knows about this interrupt */ |
@@ -215,14 +216,14 @@ static void ics_opal_mask_unknown(struct ics *ics, unsigned long vec) | |||
215 | static long ics_opal_get_server(struct ics *ics, unsigned long vec) | 216 | static long ics_opal_get_server(struct ics *ics, unsigned long vec) |
216 | { | 217 | { |
217 | int64_t rc; | 218 | int64_t rc; |
218 | int16_t server; | 219 | __be16 server; |
219 | int8_t priority; | 220 | int8_t priority; |
220 | 221 | ||
221 | /* Check if HAL knows about this interrupt */ | 222 | /* Check if HAL knows about this interrupt */ |
222 | rc = opal_get_xive(vec, &server, &priority); | 223 | rc = opal_get_xive(vec, &server, &priority); |
223 | if (rc != OPAL_SUCCESS) | 224 | if (rc != OPAL_SUCCESS) |
224 | return -1; | 225 | return -1; |
225 | return ics_opal_unmangle_server(server); | 226 | return ics_opal_unmangle_server(be16_to_cpu(server)); |
226 | } | 227 | } |
227 | 228 | ||
228 | int __init ics_opal_init(void) | 229 | int __init ics_opal_init(void) |