Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/powernv: Fix OPAL LPC access in Little Endian

We are passing pointers to the firmware for reads, we need to properly
convert the result as OPAL is always BE.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

+7 -7
+1 -1
arch/powerpc/include/asm/opal.h
··· 726 726 int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, 727 727 uint32_t addr, uint32_t data, uint32_t sz); 728 728 int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, 729 - uint32_t addr, uint32_t *data, uint32_t sz); 729 + uint32_t addr, __be32 *data, uint32_t sz); 730 730 int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result); 731 731 int64_t opal_manage_flash(uint8_t op); 732 732 int64_t opal_update_flash(uint64_t blk_list);
+6 -6
arch/powerpc/platforms/powernv/opal-lpc.c
··· 24 24 static u8 opal_lpc_inb(unsigned long port) 25 25 { 26 26 int64_t rc; 27 - uint32_t data; 27 + __be32 data; 28 28 29 29 if (opal_lpc_chip_id < 0 || port > 0xffff) 30 30 return 0xff; 31 31 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1); 32 - return rc ? 0xff : data; 32 + return rc ? 0xff : be32_to_cpu(data); 33 33 } 34 34 35 35 static __le16 __opal_lpc_inw(unsigned long port) 36 36 { 37 37 int64_t rc; 38 - uint32_t data; 38 + __be32 data; 39 39 40 40 if (opal_lpc_chip_id < 0 || port > 0xfffe) 41 41 return 0xffff; 42 42 if (port & 1) 43 43 return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1); 44 44 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2); 45 - return rc ? 0xffff : data; 45 + return rc ? 0xffff : be32_to_cpu(data); 46 46 } 47 47 static u16 opal_lpc_inw(unsigned long port) 48 48 { ··· 52 52 static __le32 __opal_lpc_inl(unsigned long port) 53 53 { 54 54 int64_t rc; 55 - uint32_t data; 55 + __be32 data; 56 56 57 57 if (opal_lpc_chip_id < 0 || port > 0xfffc) 58 58 return 0xffffffff; ··· 62 62 (__le32)opal_lpc_inb(port + 2) << 8 | 63 63 opal_lpc_inb(port + 3); 64 64 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4); 65 - return rc ? 0xffffffff : data; 65 + return rc ? 0xffffffff : be32_to_cpu(data); 66 66 } 67 67 68 68 static u32 opal_lpc_inl(unsigned long port)