*/
static inline struct device_node *xlate_iomm_address(
const volatile void __iomem *addr,
- u64 *dsaptr, u64 *bar_offset)
+ u64 *dsaptr, u64 *bar_offset, const char *func)
{
unsigned long orig_addr;
unsigned long base_addr;
struct device_node *dn;
orig_addr = (unsigned long __force)addr;
- if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory))
+ if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) {
+ static unsigned long last_jiffies;
+ static int num_printed;
+
+ if ((jiffies - last_jiffies) > 60 * HZ) {
+ last_jiffies = jiffies;
+ num_printed = 0;
+ }
+ if (num_printed++ < 10)
+ printk(KERN_ERR
+ "iSeries_%s: invalid access at IO address %p\n",
+ func, addr);
return NULL;
+ }
base_addr = orig_addr - BASE_IO_MEMORY;
ind = base_addr / IOMM_TABLE_ENTRY_SIZE;
dn = iomm_table[ind];
int retry = 0;
struct HvCallPci_LoadReturn ret;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
-
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte");
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_read_byte: invalid access at IO address %p\n",
- addr);
+ if (dn == NULL)
return 0xff;
- }
do {
HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0);
} while (check_return_code("RDB", dn, &retry, ret.rc) != 0);
int retry = 0;
struct HvCallPci_LoadReturn ret;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
-
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_word");
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_read_word: invalid access at IO address %p\n",
- addr);
+ if (dn == NULL)
return 0xffff;
- }
do {
HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa,
bar_offset, 0);
int retry = 0;
struct HvCallPci_LoadReturn ret;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
-
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_long");
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_read_long: invalid access at IO address %p\n",
- addr);
+ if (dn == NULL)
return 0xffffffff;
- }
do {
HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa,
bar_offset, 0);
int retry = 0;
u64 rc;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_byte");
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
-
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_write_byte: invalid access at IO address %p\n", addr);
+ if (dn == NULL)
return;
- }
do {
rc = HvCall4(HvCallPciBarStore8, dsa, bar_offset, data, 0);
} while (check_return_code("WWB", dn, &retry, rc) != 0);
int retry = 0;
u64 rc;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
-
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_word");
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_write_word: invalid access at IO address %p\n",
- addr);
+ if (dn == NULL)
return;
- }
do {
rc = HvCall4(HvCallPciBarStore16, dsa, bar_offset, data, 0);
} while (check_return_code("WWW", dn, &retry, rc) != 0);
int retry = 0;
u64 rc;
struct device_node *dn =
- xlate_iomm_address(addr, &dsa, &bar_offset);
+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_long");
- if (dn == NULL) {
- static unsigned long last_jiffies;
- static int num_printed;
-
- if ((jiffies - last_jiffies) > 60 * HZ) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
- if (num_printed++ < 10)
- printk(KERN_ERR "iSeries_write_long: invalid access at IO address %p\n",
- addr);
+ if (dn == NULL)
return;
- }
do {
rc = HvCall4(HvCallPciBarStore32, dsa, bar_offset, data, 0);
} while (check_return_code("WWL", dn, &retry, rc) != 0);