1*c978b524SChris Zankel /*
2*c978b524SChris Zankel * IO header file
3*c978b524SChris Zankel *
4*c978b524SChris Zankel * Copyright (C) 2001-2007 Tensilica Inc.
5*c978b524SChris Zankel * Based on the Linux/Xtensa version of this header.
6*c978b524SChris Zankel *
7*c978b524SChris Zankel * SPDX-License-Identifier: GPL-2.0+
8*c978b524SChris Zankel */
9*c978b524SChris Zankel
10*c978b524SChris Zankel #ifndef _XTENSA_IO_H
11*c978b524SChris Zankel #define _XTENSA_IO_H
12*c978b524SChris Zankel
13*c978b524SChris Zankel #include <linux/types.h>
14*c978b524SChris Zankel #include <asm/byteorder.h>
15*c978b524SChris Zankel
16*c978b524SChris Zankel /*
17*c978b524SChris Zankel * swap functions to change byte order from little-endian to big-endian and
18*c978b524SChris Zankel * vice versa.
19*c978b524SChris Zankel */
20*c978b524SChris Zankel
_swapw(unsigned short v)21*c978b524SChris Zankel static inline unsigned short _swapw(unsigned short v)
22*c978b524SChris Zankel {
23*c978b524SChris Zankel return (v << 8) | (v >> 8);
24*c978b524SChris Zankel }
25*c978b524SChris Zankel
_swapl(unsigned int v)26*c978b524SChris Zankel static inline unsigned int _swapl(unsigned int v)
27*c978b524SChris Zankel {
28*c978b524SChris Zankel return (v << 24) | ((v & 0xff00) << 8) |
29*c978b524SChris Zankel ((v >> 8) & 0xff00) | (v >> 24);
30*c978b524SChris Zankel }
31*c978b524SChris Zankel
32*c978b524SChris Zankel /*
33*c978b524SChris Zankel * Generic I/O
34*c978b524SChris Zankel */
35*c978b524SChris Zankel
36*c978b524SChris Zankel #define readb(addr) \
37*c978b524SChris Zankel ({ unsigned char __v = (*(volatile unsigned char *)(addr)); __v; })
38*c978b524SChris Zankel #define readw(addr) \
39*c978b524SChris Zankel ({ unsigned short __v = (*(volatile unsigned short *)(addr)); __v; })
40*c978b524SChris Zankel #define readl(addr) \
41*c978b524SChris Zankel ({ unsigned int __v = (*(volatile unsigned int *)(addr)); __v; })
42*c978b524SChris Zankel #define writeb(b, addr) (void)((*(volatile unsigned char *)(addr)) = (b))
43*c978b524SChris Zankel #define writew(b, addr) (void)((*(volatile unsigned short *)(addr)) = (b))
44*c978b524SChris Zankel #define writel(b, addr) (void)((*(volatile unsigned int *)(addr)) = (b))
45*c978b524SChris Zankel
46*c978b524SChris Zankel #define __raw_readb readb
47*c978b524SChris Zankel #define __raw_readw readw
48*c978b524SChris Zankel #define __raw_readl readl
49*c978b524SChris Zankel #define __raw_writeb writeb
50*c978b524SChris Zankel #define __raw_writew writew
51*c978b524SChris Zankel #define __raw_writel writel
52*c978b524SChris Zankel
53*c978b524SChris Zankel /* These are the definitions for the x86 IO instructions
54*c978b524SChris Zankel * inb/inw/inl/outb/outw/outl, the "string" versions
55*c978b524SChris Zankel * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions
56*c978b524SChris Zankel * inb_p/inw_p/...
57*c978b524SChris Zankel * The macros don't do byte-swapping.
58*c978b524SChris Zankel */
59*c978b524SChris Zankel
60*c978b524SChris Zankel #define inb(port) readb((u8 *)((port)))
61*c978b524SChris Zankel #define outb(val, port) writeb((val), (u8 *)((unsigned long)(port)))
62*c978b524SChris Zankel #define inw(port) readw((u16 *)((port)))
63*c978b524SChris Zankel #define outw(val, port) writew((val), (u16 *)((unsigned long)(port)))
64*c978b524SChris Zankel #define inl(port) readl((u32 *)((port)))
65*c978b524SChris Zankel #define outl(val, port) writel((val), (u32 *)((unsigned long)(port)))
66*c978b524SChris Zankel
67*c978b524SChris Zankel #define inb_p(port) inb((port))
68*c978b524SChris Zankel #define outb_p(val, port) outb((val), (port))
69*c978b524SChris Zankel #define inw_p(port) inw((port))
70*c978b524SChris Zankel #define outw_p(val, port) outw((val), (port))
71*c978b524SChris Zankel #define inl_p(port) inl((port))
72*c978b524SChris Zankel #define outl_p(val, port) outl((val), (port))
73*c978b524SChris Zankel
74*c978b524SChris Zankel void insb(unsigned long port, void *dst, unsigned long count);
75*c978b524SChris Zankel void insw(unsigned long port, void *dst, unsigned long count);
76*c978b524SChris Zankel void insl(unsigned long port, void *dst, unsigned long count);
77*c978b524SChris Zankel void outsb(unsigned long port, const void *src, unsigned long count);
78*c978b524SChris Zankel void outsw(unsigned long port, const void *src, unsigned long count);
79*c978b524SChris Zankel void outsl(unsigned long port, const void *src, unsigned long count);
80*c978b524SChris Zankel
81*c978b524SChris Zankel #define IO_SPACE_LIMIT ~0
82*c978b524SChris Zankel
83*c978b524SChris Zankel #define memset_io(a, b, c) memset((void *)(a), (b), (c))
84*c978b524SChris Zankel #define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
85*c978b524SChris Zankel #define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
86*c978b524SChris Zankel
87*c978b524SChris Zankel /* At this point the Xtensa doesn't provide byte swap instructions */
88*c978b524SChris Zankel
89*c978b524SChris Zankel #ifdef __XTENSA_EB__
90*c978b524SChris Zankel # define in_8(addr) (*(u8 *)(addr))
91*c978b524SChris Zankel # define in_le16(addr) _swapw(*(u16 *)(addr))
92*c978b524SChris Zankel # define in_le32(addr) _swapl(*(u32 *)(addr))
93*c978b524SChris Zankel # define out_8(b, addr) *(u8 *)(addr) = (b)
94*c978b524SChris Zankel # define out_le16(b, addr) *(u16 *)(addr) = _swapw(b)
95*c978b524SChris Zankel # define out_le32(b, addr) *(u32 *)(addr) = _swapl(b)
96*c978b524SChris Zankel #elif defined(__XTENSA_EL__)
97*c978b524SChris Zankel # define in_8(addr) (*(u8 *)(addr))
98*c978b524SChris Zankel # define in_le16(addr) (*(u16 *)(addr))
99*c978b524SChris Zankel # define in_le32(addr) (*(u32 *)(addr))
100*c978b524SChris Zankel # define out_8(b, addr) *(u8 *)(addr) = (b)
101*c978b524SChris Zankel # define out_le16(b, addr) *(u16 *)(addr) = (b)
102*c978b524SChris Zankel # define out_le32(b, addr) *(u32 *)(addr) = (b)
103*c978b524SChris Zankel #else
104*c978b524SChris Zankel # error processor byte order undefined!
105*c978b524SChris Zankel #endif
106*c978b524SChris Zankel
107*c978b524SChris Zankel
108*c978b524SChris Zankel /*
109*c978b524SChris Zankel * Convert a physical pointer to a virtual kernel pointer for /dev/mem access
110*c978b524SChris Zankel */
111*c978b524SChris Zankel #define xlate_dev_mem_ptr(p) __va(p)
112*c978b524SChris Zankel
113*c978b524SChris Zankel /*
114*c978b524SChris Zankel * Convert a virtual cached pointer to an uncached pointer
115*c978b524SChris Zankel */
116*c978b524SChris Zankel #define xlate_dev_kmem_ptr(p) p
117*c978b524SChris Zankel
118*c978b524SChris Zankel #define MAP_NOCACHE (0)
119*c978b524SChris Zankel #define MAP_WRCOMBINE (0)
120*c978b524SChris Zankel #define MAP_WRBACK (0)
121*c978b524SChris Zankel #define MAP_WRTHROUGH (0)
122*c978b524SChris Zankel
123*c978b524SChris Zankel static inline void *
map_physmem(phys_addr_t paddr,unsigned long len,unsigned long flags)124*c978b524SChris Zankel map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
125*c978b524SChris Zankel {
126*c978b524SChris Zankel return (void *)paddr;
127*c978b524SChris Zankel }
128*c978b524SChris Zankel
129*c978b524SChris Zankel /*
130*c978b524SChris Zankel * Take down a mapping set up by map_physmem().
131*c978b524SChris Zankel */
unmap_physmem(void * vaddr,unsigned long flags)132*c978b524SChris Zankel static inline void unmap_physmem(void *vaddr, unsigned long flags)
133*c978b524SChris Zankel {
134*c978b524SChris Zankel }
135*c978b524SChris Zankel
virt_to_phys(void * vaddr)136*c978b524SChris Zankel static inline phys_addr_t virt_to_phys(void *vaddr)
137*c978b524SChris Zankel {
138*c978b524SChris Zankel return (phys_addr_t)((unsigned long)vaddr);
139*c978b524SChris Zankel }
140*c978b524SChris Zankel
141*c978b524SChris Zankel /*
142*c978b524SChris Zankel * Dummy function to keep U-Boot's cfi_flash.c driver happy.
143*c978b524SChris Zankel */
sync(void)144*c978b524SChris Zankel static inline void sync(void)
145*c978b524SChris Zankel {
146*c978b524SChris Zankel }
147*c978b524SChris Zankel
148*c978b524SChris Zankel #endif /* _XTENSA_IO_H */
149