ioport.h 6.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * ioport.h	Definitions of routines for detecting, reserving and
 *		allocating system resources.
 *
 * Authors:	Linus Torvalds
 */

#ifndef _LINUX_IOPORT_H
#define _LINUX_IOPORT_H

11
#ifndef __ASSEMBLY__
L
Linus Torvalds 已提交
12
#include <linux/compiler.h>
13
#include <linux/types.h>
L
Linus Torvalds 已提交
14 15 16 17 18
/*
 * Resources are tree-like, allowing
 * nesting etc..
 */
struct resource {
19 20
	resource_size_t start;
	resource_size_t end;
L
Linus Torvalds 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
	const char *name;
	unsigned long flags;
	struct resource *parent, *sibling, *child;
};

struct resource_list {
	struct resource_list *next;
	struct resource *res;
	struct pci_dev *dev;
};

/*
 * IO resources have these defined flags.
 */
#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */

#define IORESOURCE_IO		0x00000100	/* Resource type */
#define IORESOURCE_MEM		0x00000200
#define IORESOURCE_IRQ		0x00000400
#define IORESOURCE_DMA		0x00000800

#define IORESOURCE_PREFETCH	0x00001000	/* No side effects */
#define IORESOURCE_READONLY	0x00002000
#define IORESOURCE_CACHEABLE	0x00004000
#define IORESOURCE_RANGELENGTH	0x00008000
#define IORESOURCE_SHADOWABLE	0x00010000
47 48 49

#define IORESOURCE_SIZEALIGN	0x00020000	/* size indicates alignment */
#define IORESOURCE_STARTALIGN	0x00040000	/* start field is alignment */
L
Linus Torvalds 已提交
50 51 52 53 54 55

#define IORESOURCE_DISABLED	0x10000000
#define IORESOURCE_UNSET	0x20000000
#define IORESOURCE_AUTO		0x40000000
#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */

B
Bjorn Helgaas 已提交
56
/* PnP IRQ specific bits (IORESOURCE_BITS) */
L
Linus Torvalds 已提交
57 58 59 60
#define IORESOURCE_IRQ_HIGHEDGE		(1<<0)
#define IORESOURCE_IRQ_LOWEDGE		(1<<1)
#define IORESOURCE_IRQ_HIGHLEVEL	(1<<2)
#define IORESOURCE_IRQ_LOWLEVEL		(1<<3)
61
#define IORESOURCE_IRQ_SHAREABLE	(1<<4)
62
#define IORESOURCE_IRQ_OPTIONAL 	(1<<5)
L
Linus Torvalds 已提交
63

B
Bjorn Helgaas 已提交
64
/* PnP DMA specific bits (IORESOURCE_BITS) */
L
Linus Torvalds 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
#define IORESOURCE_DMA_TYPE_MASK	(3<<0)
#define IORESOURCE_DMA_8BIT		(0<<0)
#define IORESOURCE_DMA_8AND16BIT	(1<<0)
#define IORESOURCE_DMA_16BIT		(2<<0)

#define IORESOURCE_DMA_MASTER		(1<<2)
#define IORESOURCE_DMA_BYTE		(1<<3)
#define IORESOURCE_DMA_WORD		(1<<4)

#define IORESOURCE_DMA_SPEED_MASK	(3<<6)
#define IORESOURCE_DMA_COMPATIBLE	(0<<6)
#define IORESOURCE_DMA_TYPEA		(1<<6)
#define IORESOURCE_DMA_TYPEB		(2<<6)
#define IORESOURCE_DMA_TYPEF		(3<<6)

B
Bjorn Helgaas 已提交
80
/* PnP memory I/O specific bits (IORESOURCE_BITS) */
L
Linus Torvalds 已提交
81 82 83 84 85 86 87 88 89 90 91
#define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */
#define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */
#define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */
#define IORESOURCE_MEM_TYPE_MASK	(3<<3)
#define IORESOURCE_MEM_8BIT		(0<<3)
#define IORESOURCE_MEM_16BIT		(1<<3)
#define IORESOURCE_MEM_8AND16BIT	(2<<3)
#define IORESOURCE_MEM_32BIT		(3<<3)
#define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */
#define IORESOURCE_MEM_EXPANSIONROM	(1<<6)

92 93 94 95
/* PnP I/O specific bits (IORESOURCE_BITS) */
#define IORESOURCE_IO_16BIT_ADDR	(1<<0)
#define IORESOURCE_IO_FIXED		(1<<1)

L
Linus Torvalds 已提交
96 97 98 99
/* PCI ROM control bits (IORESOURCE_BITS) */
#define IORESOURCE_ROM_ENABLE		(1<<0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
#define IORESOURCE_ROM_SHADOW		(1<<1)	/* ROM is copy at C000:0 */
#define IORESOURCE_ROM_COPY		(1<<2)	/* ROM is alloc'd copy, resource field overlaid */
100
#define IORESOURCE_ROM_BIOS_COPY	(1<<3)	/* ROM is BIOS copy, resource field overlaid */
L
Linus Torvalds 已提交
101

R
Ralf Baechle 已提交
102 103 104
/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
#define IORESOURCE_PCI_FIXED		(1<<4)	/* Do not move resource */

L
Linus Torvalds 已提交
105 106 107 108 109 110
/* PC/ISA/whatever - the normal PC address spaces: IO and memory */
extern struct resource ioport_resource;
extern struct resource iomem_resource;

extern int request_resource(struct resource *root, struct resource *new);
extern int release_resource(struct resource *new);
111
extern int insert_resource(struct resource *parent, struct resource *new);
L
Linus Torvalds 已提交
112
extern int allocate_resource(struct resource *root, struct resource *new,
113 114
			     resource_size_t size, resource_size_t min,
			     resource_size_t max, resource_size_t align,
L
Linus Torvalds 已提交
115
			     void (*alignf)(void *, struct resource *,
116
					    resource_size_t, resource_size_t),
L
Linus Torvalds 已提交
117
			     void *alignf_data);
118 119
int adjust_resource(struct resource *res, resource_size_t start,
		    resource_size_t size);
120
resource_size_t resource_alignment(struct resource *res);
M
Magnus Damm 已提交
121 122 123 124
static inline resource_size_t resource_size(struct resource *res)
{
	return res->end - res->start + 1;
}
L
Linus Torvalds 已提交
125 126 127 128 129 130

/* Convenience shorthand with allocation */
#define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name))
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))
#define rename_region(region, newname) do { (region)->name = (newname); } while (0)

131 132 133
extern struct resource * __request_region(struct resource *,
					resource_size_t start,
					resource_size_t n, const char *name);
L
Linus Torvalds 已提交
134 135 136 137 138 139

/* Compatibility cruft */
#define release_region(start,n)	__release_region(&ioport_resource, (start), (n))
#define check_mem_region(start,n)	__check_region(&iomem_resource, (start), (n))
#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))

140 141 142
extern int __check_region(struct resource *, resource_size_t, resource_size_t);
extern void __release_region(struct resource *, resource_size_t,
				resource_size_t);
L
Linus Torvalds 已提交
143

144 145
static inline int __deprecated check_region(resource_size_t s,
						resource_size_t n)
L
Linus Torvalds 已提交
146 147 148
{
	return __check_region(&ioport_resource, s, n);
}
T
Tejun Heo 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168

/* Wrappers for managed devices */
struct device;
#define devm_request_region(dev,start,n,name) \
	__devm_request_region(dev, &ioport_resource, (start), (n), (name))
#define devm_request_mem_region(dev,start,n,name) \
	__devm_request_region(dev, &iomem_resource, (start), (n), (name))

extern struct resource * __devm_request_region(struct device *dev,
				struct resource *parent, resource_size_t start,
				resource_size_t n, const char *name);

#define devm_release_region(start,n) \
	__devm_release_region(dev, &ioport_resource, (start), (n))
#define devm_release_mem_region(start,n) \
	__devm_release_region(dev, &iomem_resource, (start), (n))

extern void __devm_release_region(struct device *dev, struct resource *parent,
				  resource_size_t start, resource_size_t n);

169
#endif /* __ASSEMBLY__ */
L
Linus Torvalds 已提交
170
#endif	/* _LINUX_IOPORT_H */