0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LINUX_IOPORT_H
0010 #define _LINUX_IOPORT_H
0011
0012 #ifndef __ASSEMBLY__
0013 #include <linux/bits.h>
0014 #include <linux/compiler.h>
0015 #include <linux/minmax.h>
0016 #include <linux/types.h>
0017
0018
0019
0020
0021 struct resource {
0022 resource_size_t start;
0023 resource_size_t end;
0024 const char *name;
0025 unsigned long flags;
0026 unsigned long desc;
0027 struct resource *parent, *sibling, *child;
0028 };
0029
0030
0031
0032
0033
0034
0035
0036 #define IORESOURCE_BITS 0x000000ff
0037
0038 #define IORESOURCE_TYPE_BITS 0x00001f00
0039 #define IORESOURCE_IO 0x00000100
0040 #define IORESOURCE_MEM 0x00000200
0041 #define IORESOURCE_REG 0x00000300
0042 #define IORESOURCE_IRQ 0x00000400
0043 #define IORESOURCE_DMA 0x00000800
0044 #define IORESOURCE_BUS 0x00001000
0045
0046 #define IORESOURCE_PREFETCH 0x00002000
0047 #define IORESOURCE_READONLY 0x00004000
0048 #define IORESOURCE_CACHEABLE 0x00008000
0049 #define IORESOURCE_RANGELENGTH 0x00010000
0050 #define IORESOURCE_SHADOWABLE 0x00020000
0051
0052 #define IORESOURCE_SIZEALIGN 0x00040000
0053 #define IORESOURCE_STARTALIGN 0x00080000
0054
0055 #define IORESOURCE_MEM_64 0x00100000
0056 #define IORESOURCE_WINDOW 0x00200000
0057 #define IORESOURCE_MUXED 0x00400000
0058
0059 #define IORESOURCE_EXT_TYPE_BITS 0x01000000
0060 #define IORESOURCE_SYSRAM 0x01000000
0061
0062
0063 #define IORESOURCE_SYSRAM_DRIVER_MANAGED 0x02000000
0064 #define IORESOURCE_SYSRAM_MERGEABLE 0x04000000
0065
0066 #define IORESOURCE_EXCLUSIVE 0x08000000
0067
0068 #define IORESOURCE_DISABLED 0x10000000
0069 #define IORESOURCE_UNSET 0x20000000
0070 #define IORESOURCE_AUTO 0x40000000
0071 #define IORESOURCE_BUSY 0x80000000
0072
0073
0074 #define IORESOURCE_SYSTEM_RAM (IORESOURCE_MEM|IORESOURCE_SYSRAM)
0075
0076
0077 #define IORESOURCE_IRQ_HIGHEDGE (1<<0)
0078 #define IORESOURCE_IRQ_LOWEDGE (1<<1)
0079 #define IORESOURCE_IRQ_HIGHLEVEL (1<<2)
0080 #define IORESOURCE_IRQ_LOWLEVEL (1<<3)
0081 #define IORESOURCE_IRQ_SHAREABLE (1<<4)
0082 #define IORESOURCE_IRQ_OPTIONAL (1<<5)
0083
0084
0085 #define IORESOURCE_DMA_TYPE_MASK (3<<0)
0086 #define IORESOURCE_DMA_8BIT (0<<0)
0087 #define IORESOURCE_DMA_8AND16BIT (1<<0)
0088 #define IORESOURCE_DMA_16BIT (2<<0)
0089
0090 #define IORESOURCE_DMA_MASTER (1<<2)
0091 #define IORESOURCE_DMA_BYTE (1<<3)
0092 #define IORESOURCE_DMA_WORD (1<<4)
0093
0094 #define IORESOURCE_DMA_SPEED_MASK (3<<6)
0095 #define IORESOURCE_DMA_COMPATIBLE (0<<6)
0096 #define IORESOURCE_DMA_TYPEA (1<<6)
0097 #define IORESOURCE_DMA_TYPEB (2<<6)
0098 #define IORESOURCE_DMA_TYPEF (3<<6)
0099
0100
0101 #define IORESOURCE_MEM_WRITEABLE (1<<0)
0102 #define IORESOURCE_MEM_CACHEABLE (1<<1)
0103 #define IORESOURCE_MEM_RANGELENGTH (1<<2)
0104 #define IORESOURCE_MEM_TYPE_MASK (3<<3)
0105 #define IORESOURCE_MEM_8BIT (0<<3)
0106 #define IORESOURCE_MEM_16BIT (1<<3)
0107 #define IORESOURCE_MEM_8AND16BIT (2<<3)
0108 #define IORESOURCE_MEM_32BIT (3<<3)
0109 #define IORESOURCE_MEM_SHADOWABLE (1<<5)
0110 #define IORESOURCE_MEM_EXPANSIONROM (1<<6)
0111 #define IORESOURCE_MEM_NONPOSTED (1<<7)
0112
0113
0114 #define IORESOURCE_IO_16BIT_ADDR (1<<0)
0115 #define IORESOURCE_IO_FIXED (1<<1)
0116 #define IORESOURCE_IO_SPARSE (1<<2)
0117
0118
0119 #define IORESOURCE_ROM_ENABLE (1<<0)
0120 #define IORESOURCE_ROM_SHADOW (1<<1)
0121
0122
0123 #define IORESOURCE_PCI_FIXED (1<<4)
0124 #define IORESOURCE_PCI_EA_BEI (1<<5)
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 enum {
0135 IORES_DESC_NONE = 0,
0136 IORES_DESC_CRASH_KERNEL = 1,
0137 IORES_DESC_ACPI_TABLES = 2,
0138 IORES_DESC_ACPI_NV_STORAGE = 3,
0139 IORES_DESC_PERSISTENT_MEMORY = 4,
0140 IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5,
0141 IORES_DESC_DEVICE_PRIVATE_MEMORY = 6,
0142 IORES_DESC_RESERVED = 7,
0143 IORES_DESC_SOFT_RESERVED = 8,
0144 IORES_DESC_CXL = 9,
0145 };
0146
0147
0148
0149
0150 enum {
0151 IORES_MAP_SYSTEM_RAM = BIT(0),
0152 IORES_MAP_ENCRYPTED = BIT(1),
0153 };
0154
0155
0156 #define DEFINE_RES_NAMED(_start, _size, _name, _flags) \
0157 { \
0158 .start = (_start), \
0159 .end = (_start) + (_size) - 1, \
0160 .name = (_name), \
0161 .flags = (_flags), \
0162 .desc = IORES_DESC_NONE, \
0163 }
0164
0165 #define DEFINE_RES_IO_NAMED(_start, _size, _name) \
0166 DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_IO)
0167 #define DEFINE_RES_IO(_start, _size) \
0168 DEFINE_RES_IO_NAMED((_start), (_size), NULL)
0169
0170 #define DEFINE_RES_MEM_NAMED(_start, _size, _name) \
0171 DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_MEM)
0172 #define DEFINE_RES_MEM(_start, _size) \
0173 DEFINE_RES_MEM_NAMED((_start), (_size), NULL)
0174
0175 #define DEFINE_RES_IRQ_NAMED(_irq, _name) \
0176 DEFINE_RES_NAMED((_irq), 1, (_name), IORESOURCE_IRQ)
0177 #define DEFINE_RES_IRQ(_irq) \
0178 DEFINE_RES_IRQ_NAMED((_irq), NULL)
0179
0180 #define DEFINE_RES_DMA_NAMED(_dma, _name) \
0181 DEFINE_RES_NAMED((_dma), 1, (_name), IORESOURCE_DMA)
0182 #define DEFINE_RES_DMA(_dma) \
0183 DEFINE_RES_DMA_NAMED((_dma), NULL)
0184
0185
0186 extern struct resource ioport_resource;
0187 extern struct resource iomem_resource;
0188
0189 extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);
0190 extern int request_resource(struct resource *root, struct resource *new);
0191 extern int release_resource(struct resource *new);
0192 void release_child_resources(struct resource *new);
0193 extern void reserve_region_with_split(struct resource *root,
0194 resource_size_t start, resource_size_t end,
0195 const char *name);
0196 extern struct resource *insert_resource_conflict(struct resource *parent, struct resource *new);
0197 extern int insert_resource(struct resource *parent, struct resource *new);
0198 extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
0199 extern int remove_resource(struct resource *old);
0200 extern void arch_remove_reservations(struct resource *avail);
0201 extern int allocate_resource(struct resource *root, struct resource *new,
0202 resource_size_t size, resource_size_t min,
0203 resource_size_t max, resource_size_t align,
0204 resource_size_t (*alignf)(void *,
0205 const struct resource *,
0206 resource_size_t,
0207 resource_size_t),
0208 void *alignf_data);
0209 struct resource *lookup_resource(struct resource *root, resource_size_t start);
0210 int adjust_resource(struct resource *res, resource_size_t start,
0211 resource_size_t size);
0212 resource_size_t resource_alignment(struct resource *res);
0213 static inline resource_size_t resource_size(const struct resource *res)
0214 {
0215 return res->end - res->start + 1;
0216 }
0217 static inline unsigned long resource_type(const struct resource *res)
0218 {
0219 return res->flags & IORESOURCE_TYPE_BITS;
0220 }
0221 static inline unsigned long resource_ext_type(const struct resource *res)
0222 {
0223 return res->flags & IORESOURCE_EXT_TYPE_BITS;
0224 }
0225
0226 static inline bool resource_contains(struct resource *r1, struct resource *r2)
0227 {
0228 if (resource_type(r1) != resource_type(r2))
0229 return false;
0230 if (r1->flags & IORESOURCE_UNSET || r2->flags & IORESOURCE_UNSET)
0231 return false;
0232 return r1->start <= r2->start && r1->end >= r2->end;
0233 }
0234
0235
0236 static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
0237 {
0238 return r1->start <= r2->end && r1->end >= r2->start;
0239 }
0240
0241 static inline bool
0242 resource_intersection(struct resource *r1, struct resource *r2, struct resource *r)
0243 {
0244 if (!resource_overlaps(r1, r2))
0245 return false;
0246 r->start = max(r1->start, r2->start);
0247 r->end = min(r1->end, r2->end);
0248 return true;
0249 }
0250
0251 static inline bool
0252 resource_union(struct resource *r1, struct resource *r2, struct resource *r)
0253 {
0254 if (!resource_overlaps(r1, r2))
0255 return false;
0256 r->start = min(r1->start, r2->start);
0257 r->end = max(r1->end, r2->end);
0258 return true;
0259 }
0260
0261
0262 #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
0263 #define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
0264 #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
0265 #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
0266 #define request_mem_region_muxed(start, n, name) \
0267 __request_region(&iomem_resource, (start), (n), (name), IORESOURCE_MUXED)
0268 #define request_mem_region_exclusive(start,n,name) \
0269 __request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
0270 #define rename_region(region, newname) do { (region)->name = (newname); } while (0)
0271
0272 extern struct resource * __request_region(struct resource *,
0273 resource_size_t start,
0274 resource_size_t n,
0275 const char *name, int flags);
0276
0277
0278 #define release_region(start,n) __release_region(&ioport_resource, (start), (n))
0279 #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))
0280
0281 extern void __release_region(struct resource *, resource_size_t,
0282 resource_size_t);
0283 #ifdef CONFIG_MEMORY_HOTREMOVE
0284 extern void release_mem_region_adjustable(resource_size_t, resource_size_t);
0285 #endif
0286 #ifdef CONFIG_MEMORY_HOTPLUG
0287 extern void merge_system_ram_resource(struct resource *res);
0288 #endif
0289
0290
0291 struct device;
0292
0293 extern int devm_request_resource(struct device *dev, struct resource *root,
0294 struct resource *new);
0295 extern void devm_release_resource(struct device *dev, struct resource *new);
0296
0297 #define devm_request_region(dev,start,n,name) \
0298 __devm_request_region(dev, &ioport_resource, (start), (n), (name))
0299 #define devm_request_mem_region(dev,start,n,name) \
0300 __devm_request_region(dev, &iomem_resource, (start), (n), (name))
0301
0302 extern struct resource * __devm_request_region(struct device *dev,
0303 struct resource *parent, resource_size_t start,
0304 resource_size_t n, const char *name);
0305
0306 #define devm_release_region(dev, start, n) \
0307 __devm_release_region(dev, &ioport_resource, (start), (n))
0308 #define devm_release_mem_region(dev, start, n) \
0309 __devm_release_region(dev, &iomem_resource, (start), (n))
0310
0311 extern void __devm_release_region(struct device *dev, struct resource *parent,
0312 resource_size_t start, resource_size_t n);
0313 extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
0314 extern bool iomem_is_exclusive(u64 addr);
0315
0316 extern int
0317 walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
0318 void *arg, int (*func)(unsigned long, unsigned long, void *));
0319 extern int
0320 walk_mem_res(u64 start, u64 end, void *arg,
0321 int (*func)(struct resource *, void *));
0322 extern int
0323 walk_system_ram_res(u64 start, u64 end, void *arg,
0324 int (*func)(struct resource *, void *));
0325 extern int
0326 walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end,
0327 void *arg, int (*func)(struct resource *, void *));
0328
0329 struct resource *devm_request_free_mem_region(struct device *dev,
0330 struct resource *base, unsigned long size);
0331 struct resource *request_free_mem_region(struct resource *base,
0332 unsigned long size, const char *name);
0333 struct resource *alloc_free_mem_region(struct resource *base,
0334 unsigned long size, unsigned long align, const char *name);
0335
0336 static inline void irqresource_disabled(struct resource *res, u32 irq)
0337 {
0338 res->start = irq;
0339 res->end = irq;
0340 res->flags |= IORESOURCE_IRQ | IORESOURCE_DISABLED | IORESOURCE_UNSET;
0341 }
0342
0343 extern struct address_space *iomem_get_mapping(void);
0344
0345 #endif
0346 #endif