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

powerpc/powernv: Fix endian issue in opal_xscom_read

opal_xscom_read uses a pointer to return the data so we need
to byteswap it on LE builds.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Anton Blanchard and committed by
Benjamin Herrenschmidt
01a9dbcc a29e30ef

+4 -2
+1 -1
arch/powerpc/include/asm/opal.h
··· 720 720 int64_t opal_pci_poll(uint64_t phb_id); 721 721 int64_t opal_return_cpu(void); 722 722 723 - int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, uint64_t *val); 723 + int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val); 724 724 int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val); 725 725 726 726 int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
+3 -1
arch/powerpc/platforms/powernv/opal-xscom.c
··· 96 96 { 97 97 struct opal_scom_map *m = map; 98 98 int64_t rc; 99 + __be64 v; 99 100 100 101 reg = opal_scom_unmangle(reg); 101 - rc = opal_xscom_read(m->chip, m->addr + reg, (uint64_t *)__pa(value)); 102 + rc = opal_xscom_read(m->chip, m->addr + reg, (__be64 *)__pa(&v)); 103 + *value = be64_to_cpu(v); 102 104 return opal_xscom_err_xlate(rc); 103 105 } 104 106