Line data Source code
1 : /*
2 : * ioport.h Definitions of routines for detecting, reserving and
3 : * allocating system resources.
4 : *
5 : * Authors: Linus Torvalds
6 : */
7 :
8 : #ifndef _LINUX_IOPORT_H
9 : #define _LINUX_IOPORT_H
10 :
11 : #ifndef __ASSEMBLY__
12 : #include <linux/compiler.h>
13 : #include <linux/types.h>
14 : /*
15 : * Resources are tree-like, allowing
16 : * nesting etc..
17 : */
18 : struct resource {
19 : resource_size_t start;
20 : resource_size_t end;
21 : const char *name;
22 : unsigned long flags;
23 : struct resource *parent, *sibling, *child;
24 : };
25 :
26 : struct resource_list {
27 : struct resource_list *next;
28 : struct resource *res;
29 : struct pci_dev *dev;
30 : };
31 :
32 : /*
33 : * IO resources have these defined flags.
34 : */
35 : #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
36 :
37 : #define IORESOURCE_TYPE_BITS 0x00000f00 /* Resource type */
38 : #define IORESOURCE_IO 0x00000100
39 : #define IORESOURCE_MEM 0x00000200
40 : #define IORESOURCE_IRQ 0x00000400
41 : #define IORESOURCE_DMA 0x00000800
42 :
43 : #define IORESOURCE_PREFETCH 0x00001000 /* No side effects */
44 : #define IORESOURCE_READONLY 0x00002000
45 : #define IORESOURCE_CACHEABLE 0x00004000
46 : #define IORESOURCE_RANGELENGTH 0x00008000
47 : #define IORESOURCE_SHADOWABLE 0x00010000
48 :
49 : #define IORESOURCE_SIZEALIGN 0x00020000 /* size indicates alignment */
50 : #define IORESOURCE_STARTALIGN 0x00040000 /* start field is alignment */
51 :
52 : #define IORESOURCE_MEM_64 0x00100000
53 :
54 : #define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */
55 : #define IORESOURCE_DISABLED 0x10000000
56 : #define IORESOURCE_UNSET 0x20000000
57 : #define IORESOURCE_AUTO 0x40000000
58 : #define IORESOURCE_BUSY 0x80000000 /* Driver has marked this resource busy */
59 :
60 : /* PnP IRQ specific bits (IORESOURCE_BITS) */
61 : #define IORESOURCE_IRQ_HIGHEDGE (1<<0)
62 : #define IORESOURCE_IRQ_LOWEDGE (1<<1)
63 : #define IORESOURCE_IRQ_HIGHLEVEL (1<<2)
64 : #define IORESOURCE_IRQ_LOWLEVEL (1<<3)
65 : #define IORESOURCE_IRQ_SHAREABLE (1<<4)
66 : #define IORESOURCE_IRQ_OPTIONAL (1<<5)
67 :
68 : /* PnP DMA specific bits (IORESOURCE_BITS) */
69 : #define IORESOURCE_DMA_TYPE_MASK (3<<0)
70 : #define IORESOURCE_DMA_8BIT (0<<0)
71 : #define IORESOURCE_DMA_8AND16BIT (1<<0)
72 : #define IORESOURCE_DMA_16BIT (2<<0)
73 :
74 : #define IORESOURCE_DMA_MASTER (1<<2)
75 : #define IORESOURCE_DMA_BYTE (1<<3)
76 : #define IORESOURCE_DMA_WORD (1<<4)
77 :
78 : #define IORESOURCE_DMA_SPEED_MASK (3<<6)
79 : #define IORESOURCE_DMA_COMPATIBLE (0<<6)
80 : #define IORESOURCE_DMA_TYPEA (1<<6)
81 : #define IORESOURCE_DMA_TYPEB (2<<6)
82 : #define IORESOURCE_DMA_TYPEF (3<<6)
83 :
84 : /* PnP memory I/O specific bits (IORESOURCE_BITS) */
85 : #define IORESOURCE_MEM_WRITEABLE (1<<0) /* dup: IORESOURCE_READONLY */
86 : #define IORESOURCE_MEM_CACHEABLE (1<<1) /* dup: IORESOURCE_CACHEABLE */
87 : #define IORESOURCE_MEM_RANGELENGTH (1<<2) /* dup: IORESOURCE_RANGELENGTH */
88 : #define IORESOURCE_MEM_TYPE_MASK (3<<3)
89 : #define IORESOURCE_MEM_8BIT (0<<3)
90 : #define IORESOURCE_MEM_16BIT (1<<3)
91 : #define IORESOURCE_MEM_8AND16BIT (2<<3)
92 : #define IORESOURCE_MEM_32BIT (3<<3)
93 : #define IORESOURCE_MEM_SHADOWABLE (1<<5) /* dup: IORESOURCE_SHADOWABLE */
94 : #define IORESOURCE_MEM_EXPANSIONROM (1<<6)
95 :
96 : /* PnP I/O specific bits (IORESOURCE_BITS) */
97 : #define IORESOURCE_IO_16BIT_ADDR (1<<0)
98 : #define IORESOURCE_IO_FIXED (1<<1)
99 :
100 : /* PCI ROM control bits (IORESOURCE_BITS) */
101 : #define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
102 : #define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at C000:0 */
103 : #define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */
104 : #define IORESOURCE_ROM_BIOS_COPY (1<<3) /* ROM is BIOS copy, resource field overlaid */
105 :
106 : /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */
107 : #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */
108 :
109 : /* PC/ISA/whatever - the normal PC address spaces: IO and memory */
110 : extern struct resource ioport_resource;
111 : extern struct resource iomem_resource;
112 :
113 : extern int request_resource(struct resource *root, struct resource *new);
114 : extern int release_resource(struct resource *new);
115 : extern void reserve_region_with_split(struct resource *root,
116 : resource_size_t start, resource_size_t end,
117 : const char *name);
118 : extern int insert_resource(struct resource *parent, struct resource *new);
119 : extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
120 : extern int allocate_resource(struct resource *root, struct resource *new,
121 : resource_size_t size, resource_size_t min,
122 : resource_size_t max, resource_size_t align,
123 : void (*alignf)(void *, struct resource *,
124 : resource_size_t, resource_size_t),
125 : void *alignf_data);
126 : int adjust_resource(struct resource *res, resource_size_t start,
127 : resource_size_t size);
128 : resource_size_t resource_alignment(struct resource *res);
129 : static inline resource_size_t resource_size(const struct resource *res)
130 : {
131 : return res->end - res->start + 1;
132 : }
133 : static inline unsigned long resource_type(const struct resource *res)
134 : {
135 : return res->flags & IORESOURCE_TYPE_BITS;
136 : }
137 :
138 : /* Convenience shorthand with allocation */
139 : #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
140 : #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
141 : #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
142 : #define request_mem_region_exclusive(start,n,name) \
143 : __request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
144 : #define rename_region(region, newname) do { (region)->name = (newname); } while (0)
145 :
146 : extern struct resource * __request_region(struct resource *,
147 : resource_size_t start,
148 : resource_size_t n,
149 : const char *name, int flags);
150 :
151 : /* Compatibility cruft */
152 : #define release_region(start,n) __release_region(&ioport_resource, (start), (n))
153 : #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n))
154 : #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))
155 :
156 : extern int __check_region(struct resource *, resource_size_t, resource_size_t);
157 : extern void __release_region(struct resource *, resource_size_t,
158 : resource_size_t);
159 :
160 : static inline int __deprecated check_region(resource_size_t s,
161 : resource_size_t n)
162 : {
163 : return __check_region(&ioport_resource, s, n);
164 : }
165 :
166 : /* Wrappers for managed devices */
167 : struct device;
168 : #define devm_request_region(dev,start,n,name) \
169 : __devm_request_region(dev, &ioport_resource, (start), (n), (name))
170 : #define devm_request_mem_region(dev,start,n,name) \
171 : __devm_request_region(dev, &iomem_resource, (start), (n), (name))
172 :
173 : extern struct resource * __devm_request_region(struct device *dev,
174 : struct resource *parent, resource_size_t start,
175 : resource_size_t n, const char *name);
176 :
177 : #define devm_release_region(dev, start, n) \
178 : __devm_release_region(dev, &ioport_resource, (start), (n))
179 : #define devm_release_mem_region(dev, start, n) \
180 : __devm_release_region(dev, &iomem_resource, (start), (n))
181 :
182 : extern void __devm_release_region(struct device *dev, struct resource *parent,
183 : resource_size_t start, resource_size_t n);
184 : extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
185 : extern int iomem_is_exclusive(u64 addr);
186 :
187 : extern int
188 : walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
189 1 : void *arg, int (*func)(unsigned long, unsigned long, void *));
190 1 :
191 : #endif /* __ASSEMBLY__ */
192 : #endif /* _LINUX_IOPORT_H */
|