powerpc/powernv: Fix endian issues in OPAL console and udbg backend

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 3a1a4661
...@@ -537,12 +537,12 @@ typedef struct oppanel_line { ...@@ -537,12 +537,12 @@ typedef struct oppanel_line {
} oppanel_line_t; } oppanel_line_t;
/* API functions */ /* API functions */
int64_t opal_console_write(int64_t term_number, int64_t *length, int64_t opal_console_write(int64_t term_number, __be64 *length,
const uint8_t *buffer); const uint8_t *buffer);
int64_t opal_console_read(int64_t term_number, int64_t *length, int64_t opal_console_read(int64_t term_number, __be64 *length,
uint8_t *buffer); uint8_t *buffer);
int64_t opal_console_write_buffer_space(int64_t term_number, int64_t opal_console_write_buffer_space(int64_t term_number,
int64_t *length); __be64 *length);
int64_t opal_rtc_read(uint32_t *year_month_day, int64_t opal_rtc_read(uint32_t *year_month_day,
uint64_t *hour_minute_second_millisecond); uint64_t *hour_minute_second_millisecond);
int64_t opal_rtc_write(uint32_t year_month_day, int64_t opal_rtc_write(uint32_t year_month_day,
...@@ -552,7 +552,7 @@ int64_t opal_cec_reboot(void); ...@@ -552,7 +552,7 @@ int64_t opal_cec_reboot(void);
int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset); int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset); int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask); int64_t opal_handle_interrupt(uint64_t isn, uint64_t *outstanding_event_mask);
int64_t opal_poll_events(uint64_t *outstanding_event_mask); int64_t opal_poll_events(__be64 *outstanding_event_mask);
int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr, int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr,
uint64_t tce_mem_size); uint64_t tce_mem_size);
int64_t opal_pci_set_phb_tce_memory(uint64_t phb_id, uint64_t tce_mem_addr, int64_t opal_pci_set_phb_tce_memory(uint64_t phb_id, uint64_t tce_mem_addr,
......
...@@ -164,27 +164,28 @@ void opal_notifier_disable(void) ...@@ -164,27 +164,28 @@ void opal_notifier_disable(void)
int opal_get_chars(uint32_t vtermno, char *buf, int count) int opal_get_chars(uint32_t vtermno, char *buf, int count)
{ {
s64 len, rc; s64 rc;
u64 evt; __be64 evt, len;
if (!opal.entry) if (!opal.entry)
return -ENODEV; return -ENODEV;
opal_poll_events(&evt); opal_poll_events(&evt);
if ((evt & OPAL_EVENT_CONSOLE_INPUT) == 0) if ((be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_INPUT) == 0)
return 0; return 0;
len = count; len = cpu_to_be64(count);
rc = opal_console_read(vtermno, &len, buf); rc = opal_console_read(vtermno, &len, buf);
if (rc == OPAL_SUCCESS) if (rc == OPAL_SUCCESS)
return len; return be64_to_cpu(len);
return 0; return 0;
} }
int opal_put_chars(uint32_t vtermno, const char *data, int total_len) int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
{ {
int written = 0; int written = 0;
__be64 olen;
s64 len, rc; s64 len, rc;
unsigned long flags; unsigned long flags;
u64 evt; __be64 evt;
if (!opal.entry) if (!opal.entry)
return -ENODEV; return -ENODEV;
...@@ -199,13 +200,14 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) ...@@ -199,13 +200,14 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
*/ */
spin_lock_irqsave(&opal_write_lock, flags); spin_lock_irqsave(&opal_write_lock, flags);
if (firmware_has_feature(FW_FEATURE_OPALv2)) { if (firmware_has_feature(FW_FEATURE_OPALv2)) {
rc = opal_console_write_buffer_space(vtermno, &len); rc = opal_console_write_buffer_space(vtermno, &olen);
len = be64_to_cpu(olen);
if (rc || len < total_len) { if (rc || len < total_len) {
spin_unlock_irqrestore(&opal_write_lock, flags); spin_unlock_irqrestore(&opal_write_lock, flags);
/* Closed -> drop characters */ /* Closed -> drop characters */
if (rc) if (rc)
return total_len; return total_len;
opal_poll_events(&evt); opal_poll_events(NULL);
return -EAGAIN; return -EAGAIN;
} }
} }
...@@ -216,8 +218,9 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) ...@@ -216,8 +218,9 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
rc = OPAL_BUSY; rc = OPAL_BUSY;
while(total_len > 0 && (rc == OPAL_BUSY || while(total_len > 0 && (rc == OPAL_BUSY ||
rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) { rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) {
len = total_len; olen = cpu_to_be64(total_len);
rc = opal_console_write(vtermno, &len, data); rc = opal_console_write(vtermno, &olen, data);
len = be64_to_cpu(olen);
/* Closed or other error drop */ /* Closed or other error drop */
if (rc != OPAL_SUCCESS && rc != OPAL_BUSY && 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,7 +240,8 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
*/ */
do do
opal_poll_events(&evt); opal_poll_events(&evt);
while(rc == OPAL_SUCCESS && (evt & OPAL_EVENT_CONSOLE_OUTPUT)); while(rc == OPAL_SUCCESS &&
(be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT));
} }
spin_unlock_irqrestore(&opal_write_lock, flags); spin_unlock_irqrestore(&opal_write_lock, flags);
return written; return written;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment