|
@@ -269,3 +269,65 @@ static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size,
|
|
*/
|
|
*/
|
|
#define ioremap_cachable(offset, size) \
|
|
#define ioremap_cachable(offset, size) \
|
|
__ioremap_mode((offset), (size), _page_cachable_default)
|
|
__ioremap_mode((offset), (size), _page_cachable_default)
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * These two are MIPS specific ioremap variant. ioremap_cacheable_cow
|
|
|
|
+ * requests a cachable mapping, ioremap_uncached_accelerated requests a
|
|
|
|
+ * mapping using the uncached accelerated mode which isn't supported on
|
|
|
|
+ * all processors.
|
|
|
|
+ */
|
|
|
|
+#define ioremap_cacheable_cow(offset, size) \
|
|
|
|
+ __ioremap_mode((offset), (size), _CACHE_CACHABLE_COW)
|
|
|
|
+#define ioremap_uncached_accelerated(offset, size) \
|
|
|
|
+ __ioremap_mode((offset), (size), _CACHE_UNCACHED_ACCELERATED)
|
|
|
|
+
|
|
|
|
+static inline void iounmap(const volatile void __iomem *addr)
|
|
|
|
+{
|
|
|
|
+ if (plat_iounmap(addr))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+#define __IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == CKSEG1)
|
|
|
|
+
|
|
|
|
+ if (cpu_has_64bit_addresses ||
|
|
|
|
+ (__builtin_constant_p(addr) && __IS_KSEG1(addr)))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ __iounmap(addr);
|
|
|
|
+
|
|
|
|
+#undef __IS_KSEG1
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
|
|
|
+#define war_octeon_io_reorder_wmb() wmb()
|
|
|
|
+#else
|
|
|
|
+#define war_octeon_io_reorder_wmb() do { } while (0)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define __BUILD_MEMORY_SINGLE(pfx, bwlq, type, irq) \
|
|
|
|
+ \
|
|
|
|
+static inline void pfx##write##bwlq(type val, \
|
|
|
|
+ volatile void __iomem *mem) \
|
|
|
|
+{ \
|
|
|
|
+ volatile type *__mem; \
|
|
|
|
+ type __val; \
|
|
|
|
+ \
|
|
|
|
+ war_octeon_io_reorder_wmb(); \
|
|
|
|
+ \
|
|
|
|
+ __mem = (void *)__swizzle_addr_##bwlq((unsigned long)(mem)); \
|
|
|
|
+ \
|
|
|
|
+ __val = pfx##ioswab##bwlq(__mem, val); \
|
|
|
|
+ \
|
|
|
|
+ if (sizeof(type) != sizeof(u64) || sizeof(u64) == sizeof(long)) \
|
|
|
|
+ *__mem = __val; \
|
|
|
|
+ else if (cpu_has_64bits) { \
|
|
|
|
+ unsigned long __flags; \
|
|
|
|
+ type __tmp; \
|
|
|
|
+ \
|
|
|
|
+ if (irq) \
|
|
|
|
+ local_irq_save(__flags); \
|
|
|
|
+ __asm__ __volatile__( \
|
|
|
|
+ ".set mips3" "\t\t# __writeq""\n\t" \
|
|
|
|
+ "dsll32 %L0, %L0, 0" "\n\t" \
|
|
|
|
+ "dsrl32 %L0, %L0, 0" "\n\t" \
|
|
|
|
+ "dsll32 %M0, %M0, 0" "\n\t" \
|
|
|
|
+ "or %L0, %L0, %M0" "\n\t" \
|