/* Read MM I/O Instructions for the iSeries On MM I/O error, all ones are returned and iSeries_pci_IoError is cal else, data is returned in Big Endian format.  */
static u8 iseries_readb(const volatile void __iomem *addr)
/* Read MM I/O Instructions for the iSeries On MM I/O error, all ones are returned and iSeries_pci_IoError is cal else, data is returned in Big Endian format.  */
static u8 iseries_readb(const volatile void __iomem *addr)
{
	u64 bar_offset;
	u64 dsa;
	int retry = 0;
	struct HvCallPci_LoadReturn ret;
	struct device_node *dn =
		xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte");
	if (dn == NULL)
		return 0xff;
	do {
		HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0);
	} while (check_return_code("RDB", dn, &retry, ret.rc) != 0);
	return ret.value;
}