162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __ASM_CSKY_IO_H 462306a36Sopenharmony_ci#define __ASM_CSKY_IO_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/pgtable.h> 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* 1062306a36Sopenharmony_ci * I/O memory access primitives. Reads are ordered relative to any 1162306a36Sopenharmony_ci * following Normal memory access. Writes are ordered relative to any prior 1262306a36Sopenharmony_ci * Normal memory access. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * For CACHEV1 (807, 810), store instruction could fast retire, so we need 1562306a36Sopenharmony_ci * another mb() to prevent st fast retire. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * For CACHEV2 (860), store instruction with PAGE_ATTR_NO_BUFFERABLE won't 1862306a36Sopenharmony_ci * fast retire. 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci#define readb(c) ({ u8 __v = readb_relaxed(c); rmb(); __v; }) 2162306a36Sopenharmony_ci#define readw(c) ({ u16 __v = readw_relaxed(c); rmb(); __v; }) 2262306a36Sopenharmony_ci#define readl(c) ({ u32 __v = readl_relaxed(c); rmb(); __v; }) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#ifdef CONFIG_CPU_HAS_CACHEV2 2562306a36Sopenharmony_ci#define writeb(v,c) ({ wmb(); writeb_relaxed((v),(c)); }) 2662306a36Sopenharmony_ci#define writew(v,c) ({ wmb(); writew_relaxed((v),(c)); }) 2762306a36Sopenharmony_ci#define writel(v,c) ({ wmb(); writel_relaxed((v),(c)); }) 2862306a36Sopenharmony_ci#else 2962306a36Sopenharmony_ci#define writeb(v,c) ({ wmb(); writeb_relaxed((v),(c)); mb(); }) 3062306a36Sopenharmony_ci#define writew(v,c) ({ wmb(); writew_relaxed((v),(c)); mb(); }) 3162306a36Sopenharmony_ci#define writel(v,c) ({ wmb(); writel_relaxed((v),(c)); mb(); }) 3262306a36Sopenharmony_ci#endif 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* 3562306a36Sopenharmony_ci * String version of I/O memory access operations. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ciextern void __memcpy_fromio(void *, const volatile void __iomem *, size_t); 3862306a36Sopenharmony_ciextern void __memcpy_toio(volatile void __iomem *, const void *, size_t); 3962306a36Sopenharmony_ciextern void __memset_io(volatile void __iomem *, int, size_t); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define memset_io(c,v,l) __memset_io((c),(v),(l)) 4262306a36Sopenharmony_ci#define memcpy_fromio(a,c,l) __memcpy_fromio((a),(c),(l)) 4362306a36Sopenharmony_ci#define memcpy_toio(c,a,l) __memcpy_toio((c),(a),(l)) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* 4662306a36Sopenharmony_ci * I/O memory mapping functions. 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci#define ioremap_wc(addr, size) \ 4962306a36Sopenharmony_ci ioremap_prot((addr), (size), \ 5062306a36Sopenharmony_ci (_PAGE_IOREMAP & ~_CACHE_MASK) | _CACHE_UNCACHED) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#include <asm-generic/io.h> 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#endif /* __ASM_CSKY_IO_H */ 55