|
@@ -260,6 +260,21 @@ int acpi_post_unmap_gar(struct acpi_generic_address *reg)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(acpi_post_unmap_gar);
|
|
|
|
|
|
+#ifdef readq
|
|
|
+static inline u64 read64(const volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ return readq(addr);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline u64 read64(const volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ u64 l, h;
|
|
|
+ l = readl(addr);
|
|
|
+ h = readl(addr+4);
|
|
|
+ return l | (h << 32);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Can be used in atomic (including NMI) or process context. RCU read
|
|
|
* lock can only be released after the IO memory area accessing.
|
|
@@ -280,11 +295,9 @@ static int acpi_atomic_read_mem(u64 paddr, u64 *val, u32 width)
|
|
|
case 32:
|
|
|
*val = readl(addr);
|
|
|
break;
|
|
|
-#ifdef readq
|
|
|
case 64:
|
|
|
- *val = readq(addr);
|
|
|
+ *val = read64(addr);
|
|
|
break;
|
|
|
-#endif
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -293,6 +306,19 @@ static int acpi_atomic_read_mem(u64 paddr, u64 *val, u32 width)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef writeq
|
|
|
+static inline void write64(u64 val, volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ writeq(val, addr);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void write64(u64 val, volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ writel(val, addr);
|
|
|
+ writel(val>>32, addr+4);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static int acpi_atomic_write_mem(u64 paddr, u64 val, u32 width)
|
|
|
{
|
|
|
void __iomem *addr;
|
|
@@ -309,11 +335,9 @@ static int acpi_atomic_write_mem(u64 paddr, u64 val, u32 width)
|
|
|
case 32:
|
|
|
writel(val, addr);
|
|
|
break;
|
|
|
-#ifdef writeq
|
|
|
case 64:
|
|
|
- writeq(val, addr);
|
|
|
+ write64(val, addr);
|
|
|
break;
|
|
|
-#endif
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|