svn commit: r299364 - head/sys/compat/linuxkpi/common/include/linux
Hans Petter Selasky
hselasky at FreeBSD.org
Tue May 10 12:04:58 UTC 2016
Author: hselasky
Date: Tue May 10 12:04:57 2016
New Revision: 299364
URL: https://svnweb.freebsd.org/changeset/base/299364
Log:
Add more LinuxKPI I/O functions.
Obtained from: kmacy @
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/compat/linuxkpi/common/include/linux/io.h
Modified: head/sys/compat/linuxkpi/common/include/linux/io.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/io.h Tue May 10 11:39:36 2016 (r299363)
+++ head/sys/compat/linuxkpi/common/include/linux/io.h Tue May 10 12:04:57 2016 (r299364)
@@ -35,6 +35,8 @@
#include <sys/endian.h>
#include <sys/types.h>
+#include <linux/compiler.h>
+
static inline uint32_t
__raw_readl(const volatile void *addr)
{
@@ -62,7 +64,7 @@ __raw_writeq(uint64_t b, volatile void *
/*
* XXX This is all x86 specific. It should be bus space access.
*/
-#define mmiowb()
+#define mmiowb() barrier()
#undef writel
static inline void
@@ -92,6 +94,27 @@ writew(uint16_t b, void *addr)
*(volatile uint16_t *)addr = b;
}
+#undef ioread8
+static inline uint8_t
+ioread8(const volatile void *addr)
+{
+ return *(const volatile uint8_t *)addr;
+}
+
+#undef ioread16
+static inline uint16_t
+ioread16(const volatile void *addr)
+{
+ return *(const volatile uint16_t *)addr;
+}
+
+#undef ioread32
+static inline uint32_t
+ioread32(const volatile void *addr)
+{
+ return *(const volatile uint32_t *)addr;
+}
+
#undef ioread32be
static inline uint32_t
ioread32be(const volatile void *addr)
@@ -99,6 +122,27 @@ ioread32be(const volatile void *addr)
return be32toh(*(const volatile uint32_t *)addr);
}
+#undef iowrite8
+static inline void
+iowrite8(uint8_t v, volatile void *addr)
+{
+ *(volatile uint8_t *)addr = v;
+}
+
+#undef iowrite16
+static inline void
+iowrite16(uint16_t v, volatile void *addr)
+{
+ *(volatile uint16_t *)addr = v;
+}
+
+#undef iowrite32
+static inline void
+iowrite32(uint32_t v, volatile void *addr)
+{
+ *(volatile uint32_t *)addr = v;
+}
+
#undef iowrite32be
static inline void
iowrite32be(uint32_t v, volatile void *addr)
@@ -137,6 +181,8 @@ void *_ioremap_attr(vm_paddr_t phys_addr
_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(addr, size) \
_ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
void iounmap(void *addr);
@@ -166,5 +212,35 @@ __iowrite64_copy(void *to, void *from, s
#endif
}
+enum {
+ MEMREMAP_WB = 1 << 0,
+ MEMREMAP_WT = 1 << 1,
+ MEMREMAP_WC = 1 << 2,
+};
+
+static inline void *
+memremap(resource_size_t offset, size_t size, unsigned long flags)
+{
+ void *addr = NULL;
+
+ if ((flags & MEMREMAP_WB) &&
+ (addr = ioremap_wb(offset, size)) != NULL)
+ goto done;
+ if ((flags & MEMREMAP_WT) &&
+ (addr = ioremap_nocache(offset, size)) != NULL)
+ goto done;
+ if ((flags & MEMREMAP_WC) &&
+ (addr = ioremap_wc(offset, size)) != NULL)
+ goto done;
+done:
+ return (addr);
+}
+
+static inline void
+memunmap(void *addr)
+{
+ /* XXX May need to check if this is RAM */
+ iounmap(addr);
+}
#endif /* _LINUX_IO_H_ */
More information about the svn-src-all
mailing list