1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ASM_SH_IO_TRAPPED_H
3*4882a593Smuzhiyun #define __ASM_SH_IO_TRAPPED_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/list.h>
6*4882a593Smuzhiyun #include <linux/ioport.h>
7*4882a593Smuzhiyun #include <asm/page.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define IO_TRAPPED_MAGIC 0xfeedbeef
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun struct trapped_io {
12*4882a593Smuzhiyun unsigned int magic;
13*4882a593Smuzhiyun struct resource *resource;
14*4882a593Smuzhiyun unsigned int num_resources;
15*4882a593Smuzhiyun unsigned int minimum_bus_width;
16*4882a593Smuzhiyun struct list_head list;
17*4882a593Smuzhiyun void __iomem *virt_base;
18*4882a593Smuzhiyun } __aligned(PAGE_SIZE);
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #ifdef CONFIG_IO_TRAPPED
21*4882a593Smuzhiyun int register_trapped_io(struct trapped_io *tiop);
22*4882a593Smuzhiyun int handle_trapped_io(struct pt_regs *regs, unsigned long address);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun void __iomem *match_trapped_io_handler(struct list_head *list,
25*4882a593Smuzhiyun unsigned long offset,
26*4882a593Smuzhiyun unsigned long size);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #ifdef CONFIG_HAS_IOMEM
29*4882a593Smuzhiyun extern struct list_head trapped_mem;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static inline void __iomem *
__ioremap_trapped(unsigned long offset,unsigned long size)32*4882a593Smuzhiyun __ioremap_trapped(unsigned long offset, unsigned long size)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun return match_trapped_io_handler(&trapped_mem, offset, size);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun #else
37*4882a593Smuzhiyun #define __ioremap_trapped(offset, size) NULL
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #ifdef CONFIG_HAS_IOPORT_MAP
41*4882a593Smuzhiyun extern struct list_head trapped_io;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun static inline void __iomem *
__ioport_map_trapped(unsigned long offset,unsigned long size)44*4882a593Smuzhiyun __ioport_map_trapped(unsigned long offset, unsigned long size)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun return match_trapped_io_handler(&trapped_io, offset, size);
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun #else
49*4882a593Smuzhiyun #define __ioport_map_trapped(offset, size) NULL
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun #else
53*4882a593Smuzhiyun #define register_trapped_io(tiop) (-1)
54*4882a593Smuzhiyun #define handle_trapped_io(tiop, address) 0
55*4882a593Smuzhiyun #define __ioremap_trapped(offset, size) NULL
56*4882a593Smuzhiyun #define __ioport_map_trapped(offset, size) NULL
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #endif /* __ASM_SH_IO_TRAPPED_H */
60