1744d9859SSimon Glass /*
2744d9859SSimon Glass * Copyright (c) 2011 The Chromium OS Authors.
3744d9859SSimon Glass *
41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
5744d9859SSimon Glass */
6744d9859SSimon Glass
7a733b06bSSimon Glass #ifndef __SANDBOX_ASM_IO_H
8a733b06bSSimon Glass #define __SANDBOX_ASM_IO_H
9a733b06bSSimon Glass
10744d9859SSimon Glass /*
11744d9859SSimon Glass * Given a physical address and a length, return a virtual address
12744d9859SSimon Glass * that can be used to access the memory range with the caching
13744d9859SSimon Glass * properties specified by "flags".
14744d9859SSimon Glass */
15744d9859SSimon Glass #define MAP_NOCACHE (0)
16744d9859SSimon Glass #define MAP_WRCOMBINE (0)
17744d9859SSimon Glass #define MAP_WRBACK (0)
18744d9859SSimon Glass #define MAP_WRTHROUGH (0)
19744d9859SSimon Glass
20744d9859SSimon Glass void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags);
21744d9859SSimon Glass
22744d9859SSimon Glass /*
23744d9859SSimon Glass * Take down a mapping set up by map_physmem().
24744d9859SSimon Glass */
259569c406SSimon Glass void unmap_physmem(const void *vaddr, unsigned long flags);
264213fc29SSimon Glass
274213fc29SSimon Glass /* For sandbox, we want addresses to point into our RAM buffer */
map_sysmem(phys_addr_t paddr,unsigned long len)284213fc29SSimon Glass static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
294213fc29SSimon Glass {
304213fc29SSimon Glass return map_physmem(paddr, len, MAP_WRBACK);
314213fc29SSimon Glass }
324213fc29SSimon Glass
339569c406SSimon Glass /* Remove a previous mapping */
unmap_sysmem(const void * vaddr)344213fc29SSimon Glass static inline void unmap_sysmem(const void *vaddr)
354213fc29SSimon Glass {
369569c406SSimon Glass unmap_physmem(vaddr, MAP_WRBACK);
374213fc29SSimon Glass }
38781adb57SSimon Glass
39781adb57SSimon Glass /* Map from a pointer to our RAM buffer */
40ed072b96SSimon Glass phys_addr_t map_to_sysmem(const void *ptr);
41a733b06bSSimon Glass
4242d3b29dSSimon Glass /* Define nops for sandbox I/O access */
4380793db9SSimon Glass #define readb(addr) ((void)addr, 0)
4480793db9SSimon Glass #define readw(addr) ((void)addr, 0)
4580793db9SSimon Glass #define readl(addr) ((void)addr, 0)
4680793db9SSimon Glass #define writeb(v, addr) ((void)addr)
4780793db9SSimon Glass #define writew(v, addr) ((void)addr)
4880793db9SSimon Glass #define writel(v, addr) ((void)addr)
4942d3b29dSSimon Glass
509569c406SSimon Glass /* I/O access functions */
519569c406SSimon Glass int inl(unsigned int addr);
529569c406SSimon Glass int inw(unsigned int addr);
539569c406SSimon Glass int inb(unsigned int addr);
549569c406SSimon Glass
559569c406SSimon Glass void outl(unsigned int value, unsigned int addr);
569569c406SSimon Glass void outw(unsigned int value, unsigned int addr);
579569c406SSimon Glass void outb(unsigned int value, unsigned int addr);
589569c406SSimon Glass
59*a55428f7SMaxime Ripard #define out_arch(type,endian,a,v) write##type(cpu_to_##endian(v),a)
60*a55428f7SMaxime Ripard #define in_arch(type,endian,a) endian##_to_cpu(read##type(a))
61*a55428f7SMaxime Ripard
62*a55428f7SMaxime Ripard #define out_le32(a,v) out_arch(l,le32,a,v)
63*a55428f7SMaxime Ripard #define out_le16(a,v) out_arch(w,le16,a,v)
64*a55428f7SMaxime Ripard
65*a55428f7SMaxime Ripard #define in_le32(a) in_arch(l,le32,a)
66*a55428f7SMaxime Ripard #define in_le16(a) in_arch(w,le16,a)
67*a55428f7SMaxime Ripard
68*a55428f7SMaxime Ripard #define out_be32(a,v) out_arch(l,be32,a,v)
69*a55428f7SMaxime Ripard #define out_be16(a,v) out_arch(w,be16,a,v)
70*a55428f7SMaxime Ripard
71*a55428f7SMaxime Ripard #define in_be32(a) in_arch(l,be32,a)
72*a55428f7SMaxime Ripard #define in_be16(a) in_arch(w,be16,a)
73*a55428f7SMaxime Ripard
74*a55428f7SMaxime Ripard #define out_8(a,v) writeb(v,a)
75*a55428f7SMaxime Ripard #define in_8(a) readb(a)
76*a55428f7SMaxime Ripard
77*a55428f7SMaxime Ripard #define clrbits(type, addr, clear) \
78*a55428f7SMaxime Ripard out_##type((addr), in_##type(addr) & ~(clear))
79*a55428f7SMaxime Ripard
80*a55428f7SMaxime Ripard #define setbits(type, addr, set) \
81*a55428f7SMaxime Ripard out_##type((addr), in_##type(addr) | (set))
82*a55428f7SMaxime Ripard
83*a55428f7SMaxime Ripard #define clrsetbits(type, addr, clear, set) \
84*a55428f7SMaxime Ripard out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
85*a55428f7SMaxime Ripard
86*a55428f7SMaxime Ripard #define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
87*a55428f7SMaxime Ripard #define setbits_be32(addr, set) setbits(be32, addr, set)
88*a55428f7SMaxime Ripard #define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
89*a55428f7SMaxime Ripard
90*a55428f7SMaxime Ripard #define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
91*a55428f7SMaxime Ripard #define setbits_le32(addr, set) setbits(le32, addr, set)
92*a55428f7SMaxime Ripard #define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
93*a55428f7SMaxime Ripard
94*a55428f7SMaxime Ripard #define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
95*a55428f7SMaxime Ripard #define setbits_be16(addr, set) setbits(be16, addr, set)
96*a55428f7SMaxime Ripard #define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
97*a55428f7SMaxime Ripard
98*a55428f7SMaxime Ripard #define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
99*a55428f7SMaxime Ripard #define setbits_le16(addr, set) setbits(le16, addr, set)
100*a55428f7SMaxime Ripard #define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
101*a55428f7SMaxime Ripard
102*a55428f7SMaxime Ripard #define clrbits_8(addr, clear) clrbits(8, addr, clear)
103*a55428f7SMaxime Ripard #define setbits_8(addr, set) setbits(8, addr, set)
104*a55428f7SMaxime Ripard #define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
105*a55428f7SMaxime Ripard
_insw(volatile u16 * port,void * buf,int ns)106e54094f2SSimon Glass static inline void _insw(volatile u16 *port, void *buf, int ns)
107e54094f2SSimon Glass {
108e54094f2SSimon Glass }
109e54094f2SSimon Glass
_outsw(volatile u16 * port,const void * buf,int ns)110e54094f2SSimon Glass static inline void _outsw(volatile u16 *port, const void *buf, int ns)
111e54094f2SSimon Glass {
112e54094f2SSimon Glass }
113e54094f2SSimon Glass
114e54094f2SSimon Glass #define insw(port, buf, ns) _insw((u16 *)port, buf, ns)
115e54094f2SSimon Glass #define outsw(port, buf, ns) _outsw((u16 *)port, buf, ns)
116e54094f2SSimon Glass
117e54094f2SSimon Glass /* For systemace.c */
118e54094f2SSimon Glass #define out16(addr, val)
119e54094f2SSimon Glass #define in16(addr) 0
120e54094f2SSimon Glass
12142d3b29dSSimon Glass #include <iotrace.h>
122690d8a92STom Rini #include <asm/types.h>
12342d3b29dSSimon Glass
124a733b06bSSimon Glass #endif
125