1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ioport.h	Definitions of routines for detecting, reserving and
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		allocating system resources.
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Authors:	Linus Torvalds
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_IOPORT_H
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_IOPORT_H
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h>
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Resources are tree-like, allowing
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * nesting etc..
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct resource {
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	resource_size_t start;
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	resource_size_t end;
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const char *name;
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct resource *parent, *sibling, *child;
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct resource_list {
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct resource_list *next;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct resource *res;
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct pci_dev *dev;
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IO resources have these defined flags.
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IO		0x00000100	/* Resource type */
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM		0x00000200
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ		0x00000400
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA		0x00000800
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_PREFETCH	0x00001000	/* No side effects */
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_READONLY	0x00002000
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_CACHEABLE	0x00004000
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_RANGELENGTH	0x00008000
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_SHADOWABLE	0x00010000
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_BUS_HAS_VGA	0x00080000
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DISABLED	0x10000000
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_UNSET	0x20000000
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_AUTO		0x40000000
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* ISA PnP IRQ specific bits (IORESOURCE_BITS) */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ_HIGHEDGE		(1<<0)
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ_LOWEDGE		(1<<1)
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ_HIGHLEVEL	(1<<2)
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ_LOWLEVEL		(1<<3)
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_IRQ_SHAREABLE	(1<<4)
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* ISA PnP DMA specific bits (IORESOURCE_BITS) */
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_TYPE_MASK	(3<<0)
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_8BIT		(0<<0)
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_8AND16BIT	(1<<0)
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_16BIT		(2<<0)
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_MASTER		(1<<2)
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_BYTE		(1<<3)
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_WORD		(1<<4)
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_SPEED_MASK	(3<<6)
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_COMPATIBLE	(0<<6)
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_TYPEA		(1<<6)
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_TYPEB		(2<<6)
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_DMA_TYPEF		(3<<6)
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* ISA PnP memory I/O specific bits (IORESOURCE_BITS) */
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_TYPE_MASK	(3<<3)
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_8BIT		(0<<3)
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_16BIT		(1<<3)
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_8AND16BIT	(2<<3)
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_32BIT		(3<<3)
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_MEM_EXPANSIONROM	(1<<6)
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* PCI ROM control bits (IORESOURCE_BITS) */
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_ROM_ENABLE		(1<<0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_ROM_SHADOW		(1<<1)	/* ROM is copy at C000:0 */
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IORESOURCE_ROM_COPY		(1<<2)	/* ROM is alloc'd copy, resource field overlaid */
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* PC/ISA/whatever - the normal PC address spaces: IO and memory */
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct resource ioport_resource;
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct resource iomem_resource;
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int request_resource(struct resource *root, struct resource *new);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct resource * ____request_resource(struct resource *root, struct resource *new);
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int release_resource(struct resource *new);
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int insert_resource(struct resource *parent, struct resource *new);
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int allocate_resource(struct resource *root, struct resource *new,
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     resource_size_t size, resource_size_t min,
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     resource_size_t max, resource_size_t align,
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     void (*alignf)(void *, struct resource *,
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    resource_size_t, resource_size_t),
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     void *alignf_data);
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint adjust_resource(struct resource *res, resource_size_t start,
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		    resource_size_t size);
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* get registered SYSTEM_RAM resources in specified area */
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int find_next_system_ram(struct resource *res);
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Convenience shorthand with allocation */
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name))
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define rename_region(region, newname) do { (region)->name = (newname); } while (0)
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct resource * __request_region(struct resource *,
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					resource_size_t start,
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					resource_size_t n, const char *name);
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Compatibility cruft */
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define release_region(start,n)	__release_region(&ioport_resource, (start), (n))
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define check_mem_region(start,n)	__check_region(&iomem_resource, (start), (n))
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __check_region(struct resource *, resource_size_t, resource_size_t);
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __release_region(struct resource *, resource_size_t,
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				resource_size_t);
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int __deprecated check_region(resource_size_t s,
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						resource_size_t n)
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return __check_region(&ioport_resource, s, n);
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif	/* _LINUX_IOPORT_H */
137