aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-09-22 22:05:02 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-10-11 01:48:48 -0400
commit4f89363b1187ca0cc36ee6aebe0bee550f74288d (patch)
treee0f7254fb81e1b75a92c1afaad9d8f18b6b4c466
parent3a1a46612d4882462e8d06866df717e1707abbba (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.h8
-rw-r--r--arch/powerpc/platforms/powernv/opal.c28
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 */
540int64_t opal_console_write(int64_t term_number, int64_t *length, 540int64_t opal_console_write(int64_t term_number, __be64 *length,
541 const uint8_t *buffer); 541 const uint8_t *buffer);
542int64_t opal_console_read(int64_t term_number, int64_t *length, 542int64_t opal_console_read(int64_t term_number, __be64 *length,
543 uint8_t *buffer); 543 uint8_t *buffer);
544int64_t opal_console_write_buffer_space(int64_t term_number, 544int64_t opal_console_write_buffer_space(int64_t term_number,
545 int64_t *length); 545 __be64 *length);
546int64_t opal_rtc_read(uint32_t *year_month_day, 546int64_t opal_rtc_read(uint32_t *year_month_day,
547 uint64_t *hour_minute_second_millisecond); 547 uint64_t *hour_minute_second_millisecond);
548int64_t opal_rtc_write(uint32_t year_month_day, 548int64_t opal_rtc_write(uint32_t year_month_day,
@@ -552,7 +552,7 @@ int64_t opal_cec_reboot(void);
552int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset); 552int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
553int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset); 553int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
554int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask); 554int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask);
555int64_t opal_poll_events(uint64_t *outstanding_event_mask); 555int64_t opal_poll_events(__be64 *outstanding_event_mask);
556int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr, 556int64_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);
558int64_t opal_pci_set_phb_tce_memory(uint64_t phb_id, uint64_t tce_mem_addr, 558int64_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
165int opal_get_chars(uint32_t vtermno, char *buf, int count) 165int 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
182int opal_put_chars(uint32_t vtermno, const char *data, int total_len) 182int 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;