Index: uspace/lib/c/arch/abs32le/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/abs32le/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/abs32le/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -50,4 +50,9 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -65,3 +70,8 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return *port;
+}
+
 #endif
Index: uspace/lib/c/arch/arm32/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/arm32/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/arm32/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -51,4 +51,9 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -66,3 +71,8 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return *port;
+}
+
 #endif
Index: uspace/lib/c/arch/ia32/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/ia32/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/ia32/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -86,4 +86,9 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return (uint64_t) *port;
+}
+
 static inline void arch_pio_write_8(ioport8_t *port, uint8_t val)
 {
@@ -119,3 +124,8 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t val)
+{
+	*port = val;
+}
+
 #endif
Index: uspace/lib/c/arch/ia64/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/ia64/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/ia64/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -94,4 +94,12 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+
+	asm volatile ("mf\n" ::: "memory");
+	asm volatile ("mf.a\n" ::: "memory");
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -154,4 +162,17 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	uint64_t v;
+
+	asm volatile ("mf\n" ::: "memory");
+
+	v = *port;
+
+	asm volatile ("mf.a\n" ::: "memory");
+
+	return v;
+}
+
 #endif
 
Index: uspace/lib/c/arch/mips32/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/mips32/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/mips32/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -51,4 +51,9 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -66,3 +71,8 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return *port;
+}
+
 #endif
Index: uspace/lib/c/arch/ppc32/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/ppc32/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/ppc32/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -51,4 +51,9 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -66,3 +71,8 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return *port;
+}
+
 #endif
Index: uspace/lib/c/arch/riscv64/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/riscv64/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/riscv64/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -50,4 +50,9 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+}
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -65,3 +70,8 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	return *port;
+}
+
 #endif
Index: uspace/lib/c/arch/sparc64/include/libarch/ddi.h
===================================================================
--- uspace/lib/c/arch/sparc64/include/libarch/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/arch/sparc64/include/libarch/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -62,4 +62,11 @@
 }
 
+static inline void arch_pio_write_64(ioport64_t *port, uint64_t v)
+{
+	*port = v;
+	memory_barrier();
+}
+
+
 static inline uint8_t arch_pio_read_8(const ioport8_t *port)
 {
@@ -92,3 +99,13 @@
 }
 
+static inline uint64_t arch_pio_read_64(const ioport64_t *port)
+{
+	uint64_t rv;
+
+	rv = *port;
+	memory_barrier();
+
+	return rv;
+}
+
 #endif
Index: uspace/lib/c/generic/ddi.c
===================================================================
--- uspace/lib/c/generic/ddi.c	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/generic/ddi.c	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -338,4 +338,10 @@
 }
 
+void pio_write_64(ioport64_t *reg, uint64_t val)
+{
+	pio_trace_log(reg, val, true);
+	arch_pio_write_64(reg, val);
+}
+
 uint8_t pio_read_8(const ioport8_t *reg)
 {
@@ -359,4 +365,11 @@
 }
 
+uint64_t pio_read_64(const ioport64_t *reg)
+{
+	const uint64_t val = arch_pio_read_64(reg);
+	pio_trace_log(reg, val, false);
+	return val;
+}
+
 /** @}
  */
Index: uspace/lib/c/generic/pio_trace.c
===================================================================
--- uspace/lib/c/generic/pio_trace.c	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/generic/pio_trace.c	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -91,5 +91,5 @@
 
 
-void pio_trace_log(const volatile void *r, uint32_t val, bool write)
+void pio_trace_log(const volatile void *r, uint64_t val, bool write)
 {
 	pio_regions_t *regions = get_regions();
Index: uspace/lib/c/include/ddi.h
===================================================================
--- uspace/lib/c/include/ddi.h	(revision eca820c68a88b21d4b9fef3a00447516bc3f7684)
+++ uspace/lib/c/include/ddi.h	(revision d0cbfd394fe9314c00a4d50969d60a32db04ac8a)
@@ -52,4 +52,5 @@
 typedef volatile uint16_t ioport16_t;
 typedef volatile uint32_t ioport32_t;
+typedef volatile uint64_t ioport64_t;
 
 extern int device_assign_devno(void);
@@ -69,9 +70,9 @@
 extern int pio_disable(void *, size_t);
 
-typedef void (*trace_fnc)(const volatile void *place, uint32_t val,
+typedef void (*trace_fnc)(const volatile void *place, uint64_t val,
     volatile void* base, size_t size, void *data, bool write);
 
 extern int pio_trace_enable(void *, size_t, trace_fnc, void *);
-extern void pio_trace_log(const volatile void *, uint32_t val, bool write);
+extern void pio_trace_log(const volatile void *, uint64_t val, bool write);
 extern void pio_trace_disable(void *);
 
@@ -79,8 +80,10 @@
 extern void pio_write_16(ioport16_t *, uint16_t);
 extern void pio_write_32(ioport32_t *, uint32_t);
+extern void pio_write_64(ioport64_t *, uint64_t);
 
 extern uint8_t pio_read_8(const ioport8_t *);
 extern uint16_t pio_read_16(const ioport16_t *);
 extern uint32_t pio_read_32(const ioport32_t *);
+extern uint64_t pio_read_64(const ioport64_t *);
 
 static inline uint8_t pio_change_8(ioport8_t *reg, uint8_t val, uint8_t mask,
@@ -111,4 +114,13 @@
 }
 
+static inline uint64_t pio_change_64(ioport64_t *reg, uint64_t val,
+    uint64_t mask, useconds_t delay)
+{
+	uint64_t v = pio_read_64(reg);
+	udelay(delay);
+	pio_write_64(reg, (v & ~mask) | val);
+	return v;
+}
+
 static inline uint8_t pio_set_8(ioport8_t *r, uint8_t v, useconds_t d)
 {
@@ -122,4 +134,8 @@
 {
 	return pio_change_32(r, v, 0, d);
+}
+static inline uint64_t pio_set_64(ioport64_t *r, uint64_t v, useconds_t d)
+{
+	return pio_change_64(r, v, 0, d);
 }
 
@@ -136,4 +152,8 @@
 	return pio_change_32(r, 0, v, d);
 }
+static inline uint64_t pio_clear_64(ioport64_t *r, uint64_t v, useconds_t d)
+{
+	return pio_change_64(r, 0, v, d);
+}
 
 #endif
