|
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_DISABLED 0x10000000 |
|
53 #define IORESOURCE_UNSET 0x20000000 |
|
54 #define IORESOURCE_AUTO 0x40000000 |
|
55 #define IORESOURCE_BUSY 0x80000000 /* Driver has marked this resource busy */ |
|
56 |
|
57 /* PnP IRQ specific bits (IORESOURCE_BITS) */ |
|
58 #define IORESOURCE_IRQ_HIGHEDGE (1<<0) |
|
59 #define IORESOURCE_IRQ_LOWEDGE (1<<1) |
|
60 #define IORESOURCE_IRQ_HIGHLEVEL (1<<2) |
|
61 #define IORESOURCE_IRQ_LOWLEVEL (1<<3) |
|
62 #define IORESOURCE_IRQ_SHAREABLE (1<<4) |
|
63 #define IORESOURCE_IRQ_OPTIONAL (1<<5) |
|
64 |
|
65 /* PnP DMA specific bits (IORESOURCE_BITS) */ |
|
66 #define IORESOURCE_DMA_TYPE_MASK (3<<0) |
|
67 #define IORESOURCE_DMA_8BIT (0<<0) |
|
68 #define IORESOURCE_DMA_8AND16BIT (1<<0) |
|
69 #define IORESOURCE_DMA_16BIT (2<<0) |
|
70 |
|
71 #define IORESOURCE_DMA_MASTER (1<<2) |
|
72 #define IORESOURCE_DMA_BYTE (1<<3) |
|
73 #define IORESOURCE_DMA_WORD (1<<4) |
|
74 |
|
75 #define IORESOURCE_DMA_SPEED_MASK (3<<6) |
|
76 #define IORESOURCE_DMA_COMPATIBLE (0<<6) |
|
77 #define IORESOURCE_DMA_TYPEA (1<<6) |
|
78 #define IORESOURCE_DMA_TYPEB (2<<6) |
|
79 #define IORESOURCE_DMA_TYPEF (3<<6) |
|
80 |
|
81 /* PnP memory I/O specific bits (IORESOURCE_BITS) */ |
|
82 #define IORESOURCE_MEM_WRITEABLE (1<<0) /* dup: IORESOURCE_READONLY */ |
|
83 #define IORESOURCE_MEM_CACHEABLE (1<<1) /* dup: IORESOURCE_CACHEABLE */ |
|
84 #define IORESOURCE_MEM_RANGELENGTH (1<<2) /* dup: IORESOURCE_RANGELENGTH */ |
|
85 #define IORESOURCE_MEM_TYPE_MASK (3<<3) |
|
86 #define IORESOURCE_MEM_8BIT (0<<3) |
|
87 #define IORESOURCE_MEM_16BIT (1<<3) |
|
88 #define IORESOURCE_MEM_8AND16BIT (2<<3) |
|
89 #define IORESOURCE_MEM_32BIT (3<<3) |
|
90 #define IORESOURCE_MEM_SHADOWABLE (1<<5) /* dup: IORESOURCE_SHADOWABLE */ |
|
91 #define IORESOURCE_MEM_EXPANSIONROM (1<<6) |
|
92 |
|
93 /* PnP I/O specific bits (IORESOURCE_BITS) */ |
|
94 #define IORESOURCE_IO_16BIT_ADDR (1<<0) |
|
95 #define IORESOURCE_IO_FIXED (1<<1) |
|
96 |
|
97 /* PCI ROM control bits (IORESOURCE_BITS) */ |
|
98 #define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ |
|
99 #define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at C000:0 */ |
|
100 #define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */ |
|
101 #define IORESOURCE_ROM_BIOS_COPY (1<<3) /* ROM is BIOS copy, resource field overlaid */ |
|
102 |
|
103 /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ |
|
104 #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */ |
|
105 |
|
106 /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ |
|
107 extern struct resource ioport_resource; |
|
108 extern struct resource iomem_resource; |
|
109 |
|
110 extern int request_resource(struct resource *root, struct resource *new); |
|
111 extern int release_resource(struct resource *new); |
|
112 extern void reserve_region_with_split(struct resource *root, |
|
113 resource_size_t start, resource_size_t end, |
|
114 const char *name); |
|
115 extern int insert_resource(struct resource *parent, struct resource *new); |
|
116 extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new); |
|
117 extern int allocate_resource(struct resource *root, struct resource *new, |
|
118 resource_size_t size, resource_size_t min, |
|
119 resource_size_t max, resource_size_t align, |
|
120 void (*alignf)(void *, struct resource *, |
|
121 resource_size_t, resource_size_t), |
|
122 void *alignf_data); |
|
123 int adjust_resource(struct resource *res, resource_size_t start, |
|
124 resource_size_t size); |
|
125 resource_size_t resource_alignment(struct resource *res); |
|
126 static inline resource_size_t resource_size(struct resource *res) |
|
127 { |
|
128 return res->end - res->start + 1; |
|
129 } |
|
130 static inline unsigned long resource_type(struct resource *res) |
|
131 { |
|
132 return res->flags & IORESOURCE_TYPE_BITS; |
|
133 } |
|
134 |
|
135 /* Convenience shorthand with allocation */ |
|
136 #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name)) |
|
137 #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) |
|
138 #define rename_region(region, newname) do { (region)->name = (newname); } while (0) |
|
139 |
|
140 extern struct resource * __request_region(struct resource *, |
|
141 resource_size_t start, |
|
142 resource_size_t n, const char *name); |
|
143 |
|
144 /* Compatibility cruft */ |
|
145 #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) |
|
146 #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n)) |
|
147 #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) |
|
148 |
|
149 extern int __check_region(struct resource *, resource_size_t, resource_size_t); |
|
150 extern void __release_region(struct resource *, resource_size_t, |
|
151 resource_size_t); |
|
152 |
|
153 static inline int __deprecated check_region(resource_size_t s, |
|
154 resource_size_t n) |
|
155 { |
|
156 return __check_region(&ioport_resource, s, n); |
|
157 } |
|
158 |
|
159 /* Wrappers for managed devices */ |
|
160 struct device; |
|
161 #define devm_request_region(dev,start,n,name) \ |
|
162 __devm_request_region(dev, &ioport_resource, (start), (n), (name)) |
|
163 #define devm_request_mem_region(dev,start,n,name) \ |
|
164 __devm_request_region(dev, &iomem_resource, (start), (n), (name)) |
|
165 |
|
166 extern struct resource * __devm_request_region(struct device *dev, |
|
167 struct resource *parent, resource_size_t start, |
|
168 resource_size_t n, const char *name); |
|
169 |
|
170 #define devm_release_region(dev, start, n) \ |
|
171 __devm_release_region(dev, &ioport_resource, (start), (n)) |
|
172 #define devm_release_mem_region(dev, start, n) \ |
|
173 __devm_release_region(dev, &iomem_resource, (start), (n)) |
|
174 |
|
175 extern void __devm_release_region(struct device *dev, struct resource *parent, |
|
176 resource_size_t start, resource_size_t n); |
|
177 extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size); |
|
178 |
|
179 #endif /* __ASSEMBLY__ */ |
|
180 #endif /* _LINUX_IOPORT_H */ |