mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 22:53:55 +08:00
powerpc/powernv: Fix endian issues in OPAL console and udbg backend
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
3a1a46612d
commit
4f89363b11
@ -537,12 +537,12 @@ typedef struct oppanel_line {
|
||||
} oppanel_line_t;
|
||||
|
||||
/* 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);
|
||||
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);
|
||||
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,
|
||||
uint64_t *hour_minute_second_millisecond);
|
||||
int64_t opal_rtc_write(uint32_t year_month_day,
|
||||
@ -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_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_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,
|
||||
uint64_t tce_mem_size);
|
||||
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)
|
||||
|
||||
int opal_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
{
|
||||
s64 len, rc;
|
||||
u64 evt;
|
||||
s64 rc;
|
||||
__be64 evt, len;
|
||||
|
||||
if (!opal.entry)
|
||||
return -ENODEV;
|
||||
opal_poll_events(&evt);
|
||||
if ((evt & OPAL_EVENT_CONSOLE_INPUT) == 0)
|
||||
if ((be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_INPUT) == 0)
|
||||
return 0;
|
||||
len = count;
|
||||
rc = opal_console_read(vtermno, &len, buf);
|
||||
len = cpu_to_be64(count);
|
||||
rc = opal_console_read(vtermno, &len, buf);
|
||||
if (rc == OPAL_SUCCESS)
|
||||
return len;
|
||||
return be64_to_cpu(len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
{
|
||||
int written = 0;
|
||||
__be64 olen;
|
||||
s64 len, rc;
|
||||
unsigned long flags;
|
||||
u64 evt;
|
||||
__be64 evt;
|
||||
|
||||
if (!opal.entry)
|
||||
return -ENODEV;
|
||||
@ -199,13 +200,14 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
*/
|
||||
spin_lock_irqsave(&opal_write_lock, flags);
|
||||
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) {
|
||||
spin_unlock_irqrestore(&opal_write_lock, flags);
|
||||
/* Closed -> drop characters */
|
||||
if (rc)
|
||||
return total_len;
|
||||
opal_poll_events(&evt);
|
||||
opal_poll_events(NULL);
|
||||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
@ -216,8 +218,9 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
rc = OPAL_BUSY;
|
||||
while(total_len > 0 && (rc == OPAL_BUSY ||
|
||||
rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) {
|
||||
len = total_len;
|
||||
rc = opal_console_write(vtermno, &len, data);
|
||||
olen = cpu_to_be64(total_len);
|
||||
rc = opal_console_write(vtermno, &olen, data);
|
||||
len = be64_to_cpu(olen);
|
||||
|
||||
/* Closed or other error drop */
|
||||
if (rc != OPAL_SUCCESS && rc != OPAL_BUSY &&
|
||||
@ -237,7 +240,8 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
|
||||
*/
|
||||
do
|
||||
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);
|
||||
return written;
|
||||
|
Loading…
Reference in New Issue
Block a user