]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - arch/arm64/include/asm/io.h
arm64: add Cortex-A57 erratum 832075 workaround
[mirror_ubuntu-zesty-kernel.git] / arch / arm64 / include / asm / io.h
index 79f1d519221f839eb8e6488d14e7978ce6a3cd22..75825b63464de58f2d75cc901e4558b7fddc182d 100644 (file)
@@ -28,6 +28,8 @@
 #include <asm/barrier.h>
 #include <asm/pgtable.h>
 #include <asm/early_ioremap.h>
+#include <asm/alternative.h>
+#include <asm/cpufeature.h>
 
 #include <xen/xen.h>
 
@@ -57,28 +59,41 @@ static inline void __raw_writeq(u64 val, volatile void __iomem *addr)
 static inline u8 __raw_readb(const volatile void __iomem *addr)
 {
        u8 val;
-       asm volatile("ldrb %w0, [%1]" : "=r" (val) : "r" (addr));
+       asm volatile(ALTERNATIVE("ldrb %w0, [%1]",
+                                "ldarb %w0, [%1]",
+                                ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
+                    : "=r" (val) : "r" (addr));
        return val;
 }
 
 static inline u16 __raw_readw(const volatile void __iomem *addr)
 {
        u16 val;
-       asm volatile("ldrh %w0, [%1]" : "=r" (val) : "r" (addr));
+
+       asm volatile(ALTERNATIVE("ldrh %w0, [%1]",
+                                "ldarh %w0, [%1]",
+                                ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
+                    : "=r" (val) : "r" (addr));
        return val;
 }
 
 static inline u32 __raw_readl(const volatile void __iomem *addr)
 {
        u32 val;
-       asm volatile("ldr %w0, [%1]" : "=r" (val) : "r" (addr));
+       asm volatile(ALTERNATIVE("ldr %w0, [%1]",
+                                "ldar %w0, [%1]",
+                                ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
+                    : "=r" (val) : "r" (addr));
        return val;
 }
 
 static inline u64 __raw_readq(const volatile void __iomem *addr)
 {
        u64 val;
-       asm volatile("ldr %0, [%1]" : "=r" (val) : "r" (addr));
+       asm volatile(ALTERNATIVE("ldr %0, [%1]",
+                                "ldar %0, [%1]",
+                                ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
+                    : "=r" (val) : "r" (addr));
        return val;
 }