Home | History | Annotate | Download | only in linux
      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 		void *arg, int (*func)(unsigned long, unsigned long, void *));
    190 
    191 #endif /* __ASSEMBLY__ */
    192 #endif	/* _LINUX_IOPORT_H */
    193