File: /Users/paulross/dev/linux/linux-3.13/include/linux/ioport.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       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: /*
      27:  * IO resources have these defined flags.
      28:  */
      29: #define IORESOURCE_BITS        0x000000ff    /* Bus-specific bits */
      30: 
      31: #define IORESOURCE_TYPE_BITS    0x00001f00    /* Resource type */
      32: #define IORESOURCE_IO        0x00000100    /* PCI/ISA I/O ports */
      33: #define IORESOURCE_MEM        0x00000200
      34: #define IORESOURCE_REG        0x00000300    /* Register offsets */
      35: #define IORESOURCE_IRQ        0x00000400
      36: #define IORESOURCE_DMA        0x00000800
      37: #define IORESOURCE_BUS        0x00001000
      38: 
      39: #define IORESOURCE_PREFETCH    0x00002000    /* No side effects */
      40: #define IORESOURCE_READONLY    0x00004000
      41: #define IORESOURCE_CACHEABLE    0x00008000
      42: #define IORESOURCE_RANGELENGTH    0x00010000
      43: #define IORESOURCE_SHADOWABLE    0x00020000
      44: 
      45: #define IORESOURCE_SIZEALIGN    0x00040000    /* size indicates alignment */
      46: #define IORESOURCE_STARTALIGN    0x00080000    /* start field is alignment */
      47: 
      48: #define IORESOURCE_MEM_64    0x00100000
      49: #define IORESOURCE_WINDOW    0x00200000    /* forwarded by bridge */
      50: #define IORESOURCE_MUXED    0x00400000    /* Resource is software muxed */
      51: 
      52: #define IORESOURCE_EXCLUSIVE    0x08000000    /* Userland may not map this resource */
      53: #define IORESOURCE_DISABLED    0x10000000
      54: #define IORESOURCE_UNSET    0x20000000
      55: #define IORESOURCE_AUTO        0x40000000
      56: #define IORESOURCE_BUSY        0x80000000    /* Driver has marked this resource busy */
      57: 
      58: /* PnP IRQ specific bits (IORESOURCE_BITS) */
      59: #define IORESOURCE_IRQ_HIGHEDGE        (1<<0)
      60: #define IORESOURCE_IRQ_LOWEDGE        (1<<1)
      61: #define IORESOURCE_IRQ_HIGHLEVEL    (1<<2)
      62: #define IORESOURCE_IRQ_LOWLEVEL        (1<<3)
      63: #define IORESOURCE_IRQ_SHAREABLE    (1<<4)
      64: #define IORESOURCE_IRQ_OPTIONAL     (1<<5)
      65: 
      66: /* PnP DMA specific bits (IORESOURCE_BITS) */
      67: #define IORESOURCE_DMA_TYPE_MASK    (3<<0)
      68: #define IORESOURCE_DMA_8BIT        (0<<0)
      69: #define IORESOURCE_DMA_8AND16BIT    (1<<0)
      70: #define IORESOURCE_DMA_16BIT        (2<<0)
      71: 
      72: #define IORESOURCE_DMA_MASTER        (1<<2)
      73: #define IORESOURCE_DMA_BYTE        (1<<3)
      74: #define IORESOURCE_DMA_WORD        (1<<4)
      75: 
      76: #define IORESOURCE_DMA_SPEED_MASK    (3<<6)
      77: #define IORESOURCE_DMA_COMPATIBLE    (0<<6)
      78: #define IORESOURCE_DMA_TYPEA        (1<<6)
      79: #define IORESOURCE_DMA_TYPEB        (2<<6)
      80: #define IORESOURCE_DMA_TYPEF        (3<<6)
      81: 
      82: /* PnP memory I/O specific bits (IORESOURCE_BITS) */
      83: #define IORESOURCE_MEM_WRITEABLE    (1<<0)    /* dup: IORESOURCE_READONLY */
      84: #define IORESOURCE_MEM_CACHEABLE    (1<<1)    /* dup: IORESOURCE_CACHEABLE */
      85: #define IORESOURCE_MEM_RANGELENGTH    (1<<2)    /* dup: IORESOURCE_RANGELENGTH */
      86: #define IORESOURCE_MEM_TYPE_MASK    (3<<3)
      87: #define IORESOURCE_MEM_8BIT        (0<<3)
      88: #define IORESOURCE_MEM_16BIT        (1<<3)
      89: #define IORESOURCE_MEM_8AND16BIT    (2<<3)
      90: #define IORESOURCE_MEM_32BIT        (3<<3)
      91: #define IORESOURCE_MEM_SHADOWABLE    (1<<5)    /* dup: IORESOURCE_SHADOWABLE */
      92: #define IORESOURCE_MEM_EXPANSIONROM    (1<<6)
      93: 
      94: /* PnP I/O specific bits (IORESOURCE_BITS) */
      95: #define IORESOURCE_IO_16BIT_ADDR    (1<<0)
      96: #define IORESOURCE_IO_FIXED        (1<<1)
      97: 
      98: /* PCI ROM control bits (IORESOURCE_BITS) */
      99: #define IORESOURCE_ROM_ENABLE        (1<<0)    /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
     100: #define IORESOURCE_ROM_SHADOW        (1<<1)    /* ROM is copy at C000:0 */
     101: #define IORESOURCE_ROM_COPY        (1<<2)    /* ROM is alloc'd copy, resource field overlaid */
     102: #define IORESOURCE_ROM_BIOS_COPY    (1<<3)    /* ROM is BIOS copy, resource field overlaid */
     103: 
     104: /* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
     105: #define IORESOURCE_PCI_FIXED        (1<<4)    /* Do not move resource */
     106: 
     107: 
     108: /* helpers to define resources */
     109: #define DEFINE_RES_NAMED(_start, _size, _name, _flags)            \
     110:     {                                \
     111:         .start = (_start),                    \
     112:         .end = (_start) + (_size) - 1,                \
     113:         .name = (_name),                    \
     114:         .flags = (_flags),                    \
     115:     }
     116: 
     117: #define DEFINE_RES_IO_NAMED(_start, _size, _name)            \
     118:     DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_IO)
     119: #define DEFINE_RES_IO(_start, _size)                    \
     120:     DEFINE_RES_IO_NAMED((_start), (_size), NULL)
     121: 
     122: #define DEFINE_RES_MEM_NAMED(_start, _size, _name)            \
     123:     DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_MEM)
     124: #define DEFINE_RES_MEM(_start, _size)                    \
     125:     DEFINE_RES_MEM_NAMED((_start), (_size), NULL)
     126: 
     127: #define DEFINE_RES_IRQ_NAMED(_irq, _name)                \
     128:     DEFINE_RES_NAMED((_irq), 1, (_name), IORESOURCE_IRQ)
     129: #define DEFINE_RES_IRQ(_irq)                        \
     130:     DEFINE_RES_IRQ_NAMED((_irq), NULL)
     131: 
     132: #define DEFINE_RES_DMA_NAMED(_dma, _name)                \
     133:     DEFINE_RES_NAMED((_dma), 1, (_name), IORESOURCE_DMA)
     134: #define DEFINE_RES_DMA(_dma)                        \
     135:     DEFINE_RES_DMA_NAMED((_dma), NULL)
     136: 
     137: /* PC/ISA/whatever - the normal PC address spaces: IO and memory */
     138: extern struct resource ioport_resource;
     139: extern struct resource iomem_resource;
     140: 
     141: extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);
     142: extern int request_resource(struct resource *root, struct resource *new);
     143: extern int release_resource(struct resource *new);
     144: void release_child_resources(struct resource *new);
     145: extern void reserve_region_with_split(struct resource *root,
     146:                  resource_size_t start, resource_size_t end,
     147:                  const char *name);
     148: extern struct resource *insert_resource_conflict(struct resource *parent, struct resource *new);
     149: extern int insert_resource(struct resource *parent, struct resource *new);
     150: extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
     151: extern void arch_remove_reservations(struct resource *avail);
     152: extern int allocate_resource(struct resource *root, struct resource *new,
     153:                  resource_size_t size, resource_size_t min,
     154:                  resource_size_t max, resource_size_t align,
     155:                  resource_size_t (*alignf)(void *,
     156:                                const struct resource *,
     157:                                resource_size_t,
     158:                                resource_size_t),
     159:                  void *alignf_data);
     160: struct resource *lookup_resource(struct resource *root, resource_size_t start);
     161: int adjust_resource(struct resource *res, resource_size_t start,
     162:             resource_size_t size);
     163: resource_size_t resource_alignment(struct resource *res);
     164: static inline resource_size_t resource_size(const struct resource *res)
     165: {
     166:     return res->end - res->start + 1;
     167: }
     168: static inline unsigned long resource_type(const struct resource *res)
     169: {
     170:     return res->flags & IORESOURCE_TYPE_BITS;
     171: }
     172: 
     173: /* Convenience shorthand with allocation */
     174: #define request_region(start,n,name)        __request_region(&ioport_resource, (start), (n), (name), 0)
     175: #define request_muxed_region(start,n,name)    __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
     176: #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
     177: #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
     178: #define request_mem_region_exclusive(start,n,name) \
     179:     __request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
     180: #define rename_region(region, newname) do { (region)->name = (newname); } while (0)
     181: 
     182: extern struct resource * __request_region(struct resource *,
     183:                     resource_size_t start,
     184:                     resource_size_t n,
     185:                     const char *name, int flags);
     186: 
     187: /* Compatibility cruft */
     188: #define release_region(start,n)    __release_region(&ioport_resource, (start), (n))
     189: #define check_mem_region(start,n)    __check_region(&iomem_resource, (start), (n))
     190: #define release_mem_region(start,n)    __release_region(&iomem_resource, (start), (n))
     191: 
     192: extern int __check_region(struct resource *, resource_size_t, resource_size_t);
     193: extern void __release_region(struct resource *, resource_size_t,
     194:                 resource_size_t);
     195: #ifdef CONFIG_MEMORY_HOTREMOVE
     196: extern int release_mem_region_adjustable(struct resource *, resource_size_t,
     197:                 resource_size_t);
     198: #endif
     199: 
     200: static inline int __deprecated check_region(resource_size_t s,
     201:                         resource_size_t n)
     202: {
     203:     return __check_region(&ioport_resource, s, n);
     204: }
     205: 
     206: /* Wrappers for managed devices */
     207: struct device;
     208: #define devm_request_region(dev,start,n,name) \
     209:     __devm_request_region(dev, &ioport_resource, (start), (n), (name))
     210: #define devm_request_mem_region(dev,start,n,name) \
     211:     __devm_request_region(dev, &iomem_resource, (start), (n), (name))
     212: 
     213: extern struct resource * __devm_request_region(struct device *dev,
     214:                 struct resource *parent, resource_size_t start,
     215:                 resource_size_t n, const char *name);
     216: 
     217: #define devm_release_region(dev, start, n) \
     218:     __devm_release_region(dev, &ioport_resource, (start), (n))
     219: #define devm_release_mem_region(dev, start, n) \
     220:     __devm_release_region(dev, &iomem_resource, (start), (n))
     221: 
     222: extern void __devm_release_region(struct device *dev, struct resource *parent,
     223:                   resource_size_t start, resource_size_t n);
     224: extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
     225: extern int iomem_is_exclusive(u64 addr);
     226: 
     227: extern int
     228: walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
     229:         void *arg, int (*func)(unsigned long, unsigned long, void *));
     230: 
     231: /* True if any part of r1 overlaps r2 */
     232: static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
     233: {
     234:        return (r1->start <= r2->end && r1->end >= r2->start);
     235: }
     236: 
     237: 
     238: #endif /* __ASSEMBLY__ */
     239: #endif    /* _LINUX_IOPORT_H */
     240: