|  | .. Copyright 2001 Matthew Wilcox | 
|  | .. | 
|  | ..     This documentation is free software; you can redistribute | 
|  | ..     it and/or modify it under the terms of the GNU General Public | 
|  | ..     License as published by the Free Software Foundation; either | 
|  | ..     version 2 of the License, or (at your option) any later | 
|  | ..     version. | 
|  |  | 
|  | =============================== | 
|  | Bus-Independent Device Accesses | 
|  | =============================== | 
|  |  | 
|  | :Author: Matthew Wilcox | 
|  | :Author: Alan Cox | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | Linux provides an API which abstracts performing IO across all busses | 
|  | and devices, allowing device drivers to be written independently of bus | 
|  | type. | 
|  |  | 
|  | Memory Mapped IO | 
|  | ================ | 
|  |  | 
|  | Getting Access to the Device | 
|  | ---------------------------- | 
|  |  | 
|  | The most widely supported form of IO is memory mapped IO. That is, a | 
|  | part of the CPU's address space is interpreted not as accesses to | 
|  | memory, but as accesses to a device. Some architectures define devices | 
|  | to be at a fixed address, but most have some method of discovering | 
|  | devices. The PCI bus walk is a good example of such a scheme. This | 
|  | document does not cover how to receive such an address, but assumes you | 
|  | are starting with one. Physical addresses are of type unsigned long. | 
|  |  | 
|  | This address should not be used directly. Instead, to get an address | 
|  | suitable for passing to the accessor functions described below, you | 
|  | should call :c:func:`ioremap()`. An address suitable for accessing | 
|  | the device will be returned to you. | 
|  |  | 
|  | After you've finished using the device (say, in your module's exit | 
|  | routine), call :c:func:`iounmap()` in order to return the address | 
|  | space to the kernel. Most architectures allocate new address space each | 
|  | time you call :c:func:`ioremap()`, and they can run out unless you | 
|  | call :c:func:`iounmap()`. | 
|  |  | 
|  | Accessing the device | 
|  | -------------------- | 
|  |  | 
|  | The part of the interface most used by drivers is reading and writing | 
|  | memory-mapped registers on the device. Linux provides interfaces to read | 
|  | and write 8-bit, 16-bit, 32-bit and 64-bit quantities. Due to a | 
|  | historical accident, these are named byte, word, long and quad accesses. | 
|  | Both read and write accesses are supported; there is no prefetch support | 
|  | at this time. | 
|  |  | 
|  | The functions are named readb(), readw(), readl(), readq(), | 
|  | readb_relaxed(), readw_relaxed(), readl_relaxed(), readq_relaxed(), | 
|  | writeb(), writew(), writel() and writeq(). | 
|  |  | 
|  | Some devices (such as framebuffers) would like to use larger transfers than | 
|  | 8 bytes at a time. For these devices, the :c:func:`memcpy_toio()`, | 
|  | :c:func:`memcpy_fromio()` and :c:func:`memset_io()` functions are | 
|  | provided. Do not use memset or memcpy on IO addresses; they are not | 
|  | guaranteed to copy data in order. | 
|  |  | 
|  | The read and write functions are defined to be ordered. That is the | 
|  | compiler is not permitted to reorder the I/O sequence. When the ordering | 
|  | can be compiler optimised, you can use __readb() and friends to | 
|  | indicate the relaxed ordering. Use this with care. | 
|  |  | 
|  | While the basic functions are defined to be synchronous with respect to | 
|  | each other and ordered with respect to each other the busses the devices | 
|  | sit on may themselves have asynchronicity. In particular many authors | 
|  | are burned by the fact that PCI bus writes are posted asynchronously. A | 
|  | driver author must issue a read from the same device to ensure that | 
|  | writes have occurred in the specific cases the author cares. This kind | 
|  | of property cannot be hidden from driver writers in the API. In some | 
|  | cases, the read used to flush the device may be expected to fail (if the | 
|  | card is resetting, for example). In that case, the read should be done | 
|  | from config space, which is guaranteed to soft-fail if the card doesn't | 
|  | respond. | 
|  |  | 
|  | The following is an example of flushing a write to a device when the | 
|  | driver would like to ensure the write's effects are visible prior to | 
|  | continuing execution:: | 
|  |  | 
|  | static inline void | 
|  | qla1280_disable_intrs(struct scsi_qla_host *ha) | 
|  | { | 
|  | struct device_reg *reg; | 
|  |  | 
|  | reg = ha->iobase; | 
|  | /* disable risc and host interrupts */ | 
|  | WRT_REG_WORD(®->ictrl, 0); | 
|  | /* | 
|  | * The following read will ensure that the above write | 
|  | * has been received by the device before we return from this | 
|  | * function. | 
|  | */ | 
|  | RD_REG_WORD(®->ictrl); | 
|  | ha->flags.ints_enabled = 0; | 
|  | } | 
|  |  | 
|  | In addition to write posting, on some large multiprocessing systems | 
|  | (e.g. SGI Challenge, Origin and Altix machines) posted writes won't be | 
|  | strongly ordered coming from different CPUs. Thus it's important to | 
|  | properly protect parts of your driver that do memory-mapped writes with | 
|  | locks and use the :c:func:`mmiowb()` to make sure they arrive in the | 
|  | order intended. Issuing a regular readX() will also ensure write ordering, | 
|  | but should only be used when the | 
|  | driver has to be sure that the write has actually arrived at the device | 
|  | (not that it's simply ordered with respect to other writes), since a | 
|  | full readX() is a relatively expensive operation. | 
|  |  | 
|  | Generally, one should use :c:func:`mmiowb()` prior to releasing a spinlock | 
|  | that protects regions using :c:func:`writeb()` or similar functions that | 
|  | aren't surrounded by readb() calls, which will ensure ordering | 
|  | and flushing. The following pseudocode illustrates what might occur if | 
|  | write ordering isn't guaranteed via :c:func:`mmiowb()` or one of the | 
|  | readX() functions:: | 
|  |  | 
|  | CPU A:  spin_lock_irqsave(&dev_lock, flags) | 
|  | CPU A:  ... | 
|  | CPU A:  writel(newval, ring_ptr); | 
|  | CPU A:  spin_unlock_irqrestore(&dev_lock, flags) | 
|  | ... | 
|  | CPU B:  spin_lock_irqsave(&dev_lock, flags) | 
|  | CPU B:  writel(newval2, ring_ptr); | 
|  | CPU B:  ... | 
|  | CPU B:  spin_unlock_irqrestore(&dev_lock, flags) | 
|  |  | 
|  | In the case above, newval2 could be written to ring_ptr before newval. | 
|  | Fixing it is easy though:: | 
|  |  | 
|  | CPU A:  spin_lock_irqsave(&dev_lock, flags) | 
|  | CPU A:  ... | 
|  | CPU A:  writel(newval, ring_ptr); | 
|  | CPU A:  mmiowb(); /* ensure no other writes beat us to the device */ | 
|  | CPU A:  spin_unlock_irqrestore(&dev_lock, flags) | 
|  | ... | 
|  | CPU B:  spin_lock_irqsave(&dev_lock, flags) | 
|  | CPU B:  writel(newval2, ring_ptr); | 
|  | CPU B:  ... | 
|  | CPU B:  mmiowb(); | 
|  | CPU B:  spin_unlock_irqrestore(&dev_lock, flags) | 
|  |  | 
|  | See tg3.c for a real world example of how to use :c:func:`mmiowb()` | 
|  |  | 
|  | PCI ordering rules also guarantee that PIO read responses arrive after any | 
|  | outstanding DMA writes from that bus, since for some devices the result of | 
|  | a readb() call may signal to the driver that a DMA transaction is | 
|  | complete. In many cases, however, the driver may want to indicate that the | 
|  | next readb() call has no relation to any previous DMA writes | 
|  | performed by the device. The driver can use readb_relaxed() for | 
|  | these cases, although only some platforms will honor the relaxed | 
|  | semantics. Using the relaxed read functions will provide significant | 
|  | performance benefits on platforms that support it. The qla2xxx driver | 
|  | provides examples of how to use readX_relaxed(). In many cases, a majority | 
|  | of the driver's readX() calls can safely be converted to readX_relaxed() | 
|  | calls, since only a few will indicate or depend on DMA completion. | 
|  |  | 
|  | Port Space Accesses | 
|  | =================== | 
|  |  | 
|  | Port Space Explained | 
|  | -------------------- | 
|  |  | 
|  | Another form of IO commonly supported is Port Space. This is a range of | 
|  | addresses separate to the normal memory address space. Access to these | 
|  | addresses is generally not as fast as accesses to the memory mapped | 
|  | addresses, and it also has a potentially smaller address space. | 
|  |  | 
|  | Unlike memory mapped IO, no preparation is required to access port | 
|  | space. | 
|  |  | 
|  | Accessing Port Space | 
|  | -------------------- | 
|  |  | 
|  | Accesses to this space are provided through a set of functions which | 
|  | allow 8-bit, 16-bit and 32-bit accesses; also known as byte, word and | 
|  | long. These functions are :c:func:`inb()`, :c:func:`inw()`, | 
|  | :c:func:`inl()`, :c:func:`outb()`, :c:func:`outw()` and | 
|  | :c:func:`outl()`. | 
|  |  | 
|  | Some variants are provided for these functions. Some devices require | 
|  | that accesses to their ports are slowed down. This functionality is | 
|  | provided by appending a ``_p`` to the end of the function. | 
|  | There are also equivalents to memcpy. The :c:func:`ins()` and | 
|  | :c:func:`outs()` functions copy bytes, words or longs to the given | 
|  | port. | 
|  |  | 
|  | Public Functions Provided | 
|  | ========================= | 
|  |  | 
|  | .. kernel-doc:: arch/x86/include/asm/io.h | 
|  | :internal: | 
|  |  | 
|  | .. kernel-doc:: lib/pci_iomap.c | 
|  | :export: |