Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 803c2d2f authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt
Browse files

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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 01a9dbcc
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -726,7 +726,7 @@ int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val);
int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
		       uint32_t addr, uint32_t data, uint32_t sz);
		       uint32_t addr, uint32_t data, uint32_t sz);
int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type,
int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type,
		      uint32_t addr, uint32_t *data, uint32_t sz);
		      uint32_t addr, __be32 *data, uint32_t sz);
int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result);
int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result);
int64_t opal_manage_flash(uint8_t op);
int64_t opal_manage_flash(uint8_t op);
int64_t opal_update_flash(uint64_t blk_list);
int64_t opal_update_flash(uint64_t blk_list);
+6 −6
Original line number Original line Diff line number Diff line
@@ -24,25 +24,25 @@ static int opal_lpc_chip_id = -1;
static u8 opal_lpc_inb(unsigned long port)
static u8 opal_lpc_inb(unsigned long port)
{
{
	int64_t rc;
	int64_t rc;
	uint32_t data;
	__be32 data;


	if (opal_lpc_chip_id < 0 || port > 0xffff)
	if (opal_lpc_chip_id < 0 || port > 0xffff)
		return 0xff;
		return 0xff;
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1);
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1);
	return rc ? 0xff : data;
	return rc ? 0xff : be32_to_cpu(data);
}
}


static __le16 __opal_lpc_inw(unsigned long port)
static __le16 __opal_lpc_inw(unsigned long port)
{
{
	int64_t rc;
	int64_t rc;
	uint32_t data;
	__be32 data;


	if (opal_lpc_chip_id < 0 || port > 0xfffe)
	if (opal_lpc_chip_id < 0 || port > 0xfffe)
		return 0xffff;
		return 0xffff;
	if (port & 1)
	if (port & 1)
		return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1);
		return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1);
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2);
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2);
	return rc ? 0xffff : data;
	return rc ? 0xffff : be32_to_cpu(data);
}
}
static u16 opal_lpc_inw(unsigned long port)
static u16 opal_lpc_inw(unsigned long port)
{
{
@@ -52,7 +52,7 @@ static u16 opal_lpc_inw(unsigned long port)
static __le32 __opal_lpc_inl(unsigned long port)
static __le32 __opal_lpc_inl(unsigned long port)
{
{
	int64_t rc;
	int64_t rc;
	uint32_t data;
	__be32 data;


	if (opal_lpc_chip_id < 0 || port > 0xfffc)
	if (opal_lpc_chip_id < 0 || port > 0xfffc)
		return 0xffffffff;
		return 0xffffffff;
@@ -62,7 +62,7 @@ static __le32 __opal_lpc_inl(unsigned long port)
		       (__le32)opal_lpc_inb(port + 2) <<  8 |
		       (__le32)opal_lpc_inb(port + 2) <<  8 |
			       opal_lpc_inb(port + 3);
			       opal_lpc_inb(port + 3);
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4);
	rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4);
	return rc ? 0xffffffff : data;
	return rc ? 0xffffffff : be32_to_cpu(data);
}
}


static u32 opal_lpc_inl(unsigned long port)
static u32 opal_lpc_inl(unsigned long port)