]> xenbits.xensource.com Git - freebsd.git/commitdiff
Use DEVICE memory instead of UNCACHEABLE on aarch64 in ioremap() in the LinuxKPI.
authorhselasky <hselasky@FreeBSD.org>
Mon, 2 Sep 2019 08:34:45 +0000 (08:34 +0000)
committerhselasky <hselasky@FreeBSD.org>
Mon, 2 Sep 2019 08:34:45 +0000 (08:34 +0000)
This fixes system hangs on reading device registers on aarch64.

Tested with: Marvell MACCHIATObin (Armada8k) + mlx4en, amdgpu
Submitted by: Greg V <greg@unrelenting.technology>
Differential Revision: https://reviews.freebsd.org/D20789
MFC after: 1 week
Sponsored by: Mellanox Technologies

sys/compat/linuxkpi/common/include/linux/io.h

index 8dc0308a5e7dcb0acd550893cf8f983a49ea14ac..5cffe9b080e344bab0e27332d56fbdb3ccfd845c 100644 (file)
@@ -396,16 +396,25 @@ void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr);
 #define        _ioremap_attr(...) NULL
 #endif
 
+#ifdef VM_MEMATTR_DEVICE
+#define        ioremap_nocache(addr, size)                                     \
+    _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE)
+#define        ioremap_wt(addr, size)                                          \
+    _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE)
+#define        ioremap(addr, size)                                             \
+    _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE)
+#else
 #define        ioremap_nocache(addr, size)                                     \
     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
-#define        ioremap_wc(addr, size)                                          \
-    _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
-#define        ioremap_wb(addr, size)                                          \
-    _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK)
 #define        ioremap_wt(addr, size)                                          \
     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH)
 #define        ioremap(addr, size)                                             \
     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
+#endif
+#define        ioremap_wc(addr, size)                                          \
+    _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
+#define        ioremap_wb(addr, size)                                          \
+    _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK)
 void iounmap(void *addr);
 
 #define        memset_io(a, b, c)      memset((a), (b), (c))