diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-09-22 22:05:02 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-10-11 01:48:48 -0400 |
commit | 4f89363b1187ca0cc36ee6aebe0bee550f74288d (patch) | |
tree | e0f7254fb81e1b75a92c1afaad9d8f18b6b4c466 | |
parent | 3a1a46612d4882462e8d06866df717e1707abbba (diff) |
powerpc/powernv: Fix endian issues in OPAL console and udbg backend
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/include/asm/opal.h | 8 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal.c | 28 |
2 files changed, 20 insertions, 16 deletions
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index c5cd72833d6e..6622ea438f0e 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -537,12 +537,12 @@ typedef struct oppanel_line { | |||
537 | } oppanel_line_t; | 537 | } oppanel_line_t; |
538 | 538 | ||
539 | /* API functions */ | 539 | /* API functions */ |
540 | int64_t opal_console_write(int64_t term_number, int64_t *length, | 540 | int64_t opal_console_write(int64_t term_number, __be64 *length, |
541 | const uint8_t *buffer); | 541 | const uint8_t *buffer); |
542 | int64_t opal_console_read(int64_t term_number, int64_t *length, | 542 | int64_t opal_console_read(int64_t term_number, __be64 *length, |
543 | uint8_t *buffer); | 543 | uint8_t *buffer); |
544 | int64_t opal_console_write_buffer_space(int64_t term_number, | 544 | int64_t opal_console_write_buffer_space(int64_t term_number, |
545 | int64_t *length); | 545 | __be64 *length); |
546 | int64_t opal_rtc_read(uint32_t *year_month_day, | 546 | int64_t opal_rtc_read(uint32_t *year_month_day, |
547 | uint64_t *hour_minute_second_millisecond); | 547 | uint64_t *hour_minute_second_millisecond); |
548 | int64_t opal_rtc_write(uint32_t year_month_day, | 548 | int64_t opal_rtc_write(uint32_t year_month_day, |
@@ -552,7 +552,7 @@ int64_t opal_cec_reboot(void); | |||
552 | int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset); | 552 | int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset); |
553 | int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset); | 553 | int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset); |
554 | int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask); | 554 | int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask); |
555 | int64_t opal_poll_events(uint64_t *outstanding_event_mask); | 555 | int64_t opal_poll_events(__be64 *outstanding_event_mask); |
556 | int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr, | 556 | int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr, |
557 | uint64_t tce_mem_size); | 557 | uint64_t tce_mem_size); |
558 | int64_t opal_pci_set_phb_tce_memory(uint64_t phb_id, uint64_t tce_mem_addr, | 558 | int64_t opal_pci_set_phb_tce_memory(uint64_t phb_id, uint64_t tce_mem_addr, |
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 4ffa75ef284b..eb7bf3bf604b 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c | |||
@@ -164,27 +164,28 @@ void opal_notifier_disable(void) | |||
164 | 164 | ||
165 | int opal_get_chars(uint32_t vtermno, char *buf, int count) | 165 | int opal_get_chars(uint32_t vtermno, char *buf, int count) |
166 | { | 166 | { |
167 | s64 len, rc; | 167 | s64 rc; |
168 | u64 evt; | 168 | __be64 evt, len; |
169 | 169 | ||
170 | if (!opal.entry) | 170 | if (!opal.entry) |
171 | return -ENODEV; | 171 | return -ENODEV; |
172 | opal_poll_events(&evt); | 172 | opal_poll_events(&evt); |
173 | if ((evt & OPAL_EVENT_CONSOLE_INPUT) == 0) | 173 | if ((be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_INPUT) == 0) |
174 | return 0; | 174 | return 0; |
175 | len = count; | 175 | len = cpu_to_be64(count); |
176 | rc = opal_console_read(vtermno, &len, buf); | 176 | rc = opal_console_read(vtermno, &len, buf); |
177 | if (rc == OPAL_SUCCESS) | 177 | if (rc == OPAL_SUCCESS) |
178 | return len; | 178 | return be64_to_cpu(len); |
179 | return 0; | 179 | return 0; |
180 | } | 180 | } |
181 | 181 | ||
182 | int opal_put_chars(uint32_t vtermno, const char *data, int total_len) | 182 | int opal_put_chars(uint32_t vtermno, const char *data, int total_len) |
183 | { | 183 | { |
184 | int written = 0; | 184 | int written = 0; |
185 | __be64 olen; | ||
185 | s64 len, rc; | 186 | s64 len, rc; |
186 | unsigned long flags; | 187 | unsigned long flags; |
187 | u64 evt; | 188 | __be64 evt; |
188 | 189 | ||
189 | if (!opal.entry) | 190 | if (!opal.entry) |
190 | return -ENODEV; | 191 | return -ENODEV; |
@@ -199,13 +200,14 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) | |||
199 | */ | 200 | */ |
200 | spin_lock_irqsave(&opal_write_lock, flags); | 201 | spin_lock_irqsave(&opal_write_lock, flags); |
201 | if (firmware_has_feature(FW_FEATURE_OPALv2)) { | 202 | if (firmware_has_feature(FW_FEATURE_OPALv2)) { |
202 | rc = opal_console_write_buffer_space(vtermno, &len); | 203 | rc = opal_console_write_buffer_space(vtermno, &olen); |
204 | len = be64_to_cpu(olen); | ||
203 | if (rc || len < total_len) { | 205 | if (rc || len < total_len) { |
204 | spin_unlock_irqrestore(&opal_write_lock, flags); | 206 | spin_unlock_irqrestore(&opal_write_lock, flags); |
205 | /* Closed -> drop characters */ | 207 | /* Closed -> drop characters */ |
206 | if (rc) | 208 | if (rc) |
207 | return total_len; | 209 | return total_len; |
208 | opal_poll_events(&evt); | 210 | opal_poll_events(NULL); |
209 | return -EAGAIN; | 211 | return -EAGAIN; |
210 | } | 212 | } |
211 | } | 213 | } |
@@ -216,8 +218,9 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) | |||
216 | rc = OPAL_BUSY; | 218 | rc = OPAL_BUSY; |
217 | while(total_len > 0 && (rc == OPAL_BUSY || | 219 | while(total_len > 0 && (rc == OPAL_BUSY || |
218 | rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) { | 220 | rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) { |
219 | len = total_len; | 221 | olen = cpu_to_be64(total_len); |
220 | rc = opal_console_write(vtermno, &len, data); | 222 | rc = opal_console_write(vtermno, &olen, data); |
223 | len = be64_to_cpu(olen); | ||
221 | 224 | ||
222 | /* Closed or other error drop */ | 225 | /* Closed or other error drop */ |
223 | if (rc != OPAL_SUCCESS && rc != OPAL_BUSY && | 226 | if (rc != OPAL_SUCCESS && rc != OPAL_BUSY && |
@@ -237,7 +240,8 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) | |||
237 | */ | 240 | */ |
238 | do | 241 | do |
239 | opal_poll_events(&evt); | 242 | opal_poll_events(&evt); |
240 | while(rc == OPAL_SUCCESS && (evt & OPAL_EVENT_CONSOLE_OUTPUT)); | 243 | while(rc == OPAL_SUCCESS && |
244 | (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT)); | ||
241 | } | 245 | } |
242 | spin_unlock_irqrestore(&opal_write_lock, flags); | 246 | spin_unlock_irqrestore(&opal_write_lock, flags); |
243 | return written; | 247 | return written; |