€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ(/translations/zh_CN/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/pt_BR/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/sp_SP/driver-api/device-io”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒCopyright 2001 Matthew Wilcox”h]”hŒCopyright 2001 Matthew Wilcox”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒB/var/lib/git/docbuild/linux/Documentation/driver-api/device-io.rst”h´Kubh¶)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´Kubh¶)�”}”(hŒ9This documentation is free software; you can redistribute”h]”hŒ9This documentation is free software; you can redistribute”…”�”}”hhÑsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´Kubh¶)�”}”(hŒ=it and/or modify it under the terms of the GNU General Public”h]”hŒ=it and/or modify it under the terms of the GNU General Public”…”�”}”hhßsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´Kubh¶)�”}”(hŒhjh²hubjM)�”}”(hŒÿ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.”h]”hŒÿ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.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KDhjh²hubjM)�”}”(hXÎWhile the basic functions are defined to be synchronous with respect to each other and ordered with respect to each other the buses 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.”h]”hXÐWhile the basic functions are defined to be synchronous with respect to each other and ordered with respect to each other the buses 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.”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KIhjh²hubjM)�”}”(hŒ 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::”h]”hŒ¡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:”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KUhjh²hubhŒ literal_block”“”)�”}”(hX¡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; }”h]”hX¡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; }”…”�”}”hj~sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j|h³hÇh´KYhjh²hubjM)�”}”(hXBPCI 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.”h]”hXDPCI 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.”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Kjhjh²hubeh}”(h]”Œaccessing-the-device”ah ]”h"]”Œaccessing the device”ah$]”h&]”uh1jhjÃh²hh³hÇh´K1Œ referenced”Kubeh}”(h]”Œmemory-mapped-io”ah ]”h"]”Œmemory mapped io”ah$]”h&]”uh1jhjh²hh³hÇh´Kubj)�”}”(hhh]”(j)�”}”(hŒPort Space Accesses”h]”hŒPort Space Accesses”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj«h²hh³hÇh´Kxubj)�”}”(hhh]”(j)�”}”(hŒPort Space Explained”h]”hŒPort Space Explained”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼h²hh³hÇh´K{ubjM)�”}”(hXAnother 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.”h]”hXAnother 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.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K}hj¼h²hubjM)�”}”(hŒIUnlike memory mapped IO, no preparation is required to access port space.”h]”hŒIUnlike memory mapped IO, no preparation is required to access port space.”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K‚hj¼h²hubeh}”(h]”Œport-space-explained”ah ]”h"]”Œport space explained”ah$]”h&]”uh1jhj«h²hh³hÇh´K{ubj)�”}”(hhh]”(j)�”}”(hŒAccessing Port Space”h]”hŒAccessing Port Space”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjñh²hh³hÇh´K†ubjM)�”}”(hŒÔ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 inb(), inw(), inl(), outb(), outw() and outl().”h]”hŒÔ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 inb(), inw(), inl(), outb(), outw() and outl().”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Kˆhjñh²hubjM)�”}”(hX6Some 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 ins() and outs() functions copy bytes, words or longs to the given port.”h]”(hŒ¡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 ”…”�”}”(hjh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``_p``”h]”hŒ_p”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ� to the end of the function. There are also equivalents to memcpy. The ins() and outs() functions copy bytes, words or longs to the given port.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KŽhjñh²hubeh}”(h]”Œaccessing-port-space”ah ]”h"]”Œaccessing port space”ah$]”h&]”uh1jhj«h²hh³hÇh´K†ubeh}”(h]”Œport-space-accesses”ah ]”h"]”Œport space accesses”ah$]”h&]”uh1jhjh²hh³hÇh´Kxubj)�”}”(hhh]”(j)�”}”(hŒ__iomem pointer tokens”h]”hŒ__iomem pointer tokens”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBh²hh³hÇh´K–ubjM)�”}”(hXåThe data type for an MMIO address is an ``__iomem`` qualified pointer, such as ``void __iomem *reg``. On most architectures it is a regular pointer that points to a virtual memory address and can be offset or dereferenced, but in portable code, it must only be passed from and to functions that explicitly operated on an ``__iomem`` token, in particular the ioremap() and readl()/writel() functions. The 'sparse' semantic code checker can be used to verify that this is done correctly.”h]”(hŒ(The data type for an MMIO address is an ”…”�”}”(hjSh²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSubhŒ qualified pointer, such as ”…”�”}”(hjSh²hh³Nh´Nubj)�”}”(hŒ``void __iomem *reg``”h]”hŒvoid __iomem *reg”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSubhŒÝ. On most architectures it is a regular pointer that points to a virtual memory address and can be offset or dereferenced, but in portable code, it must only be passed from and to functions that explicitly operated on an ”…”�”}”(hjSh²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSubhŒ� token, in particular the ioremap() and readl()/writel() functions. The ‘sparse’ semantic code checker can be used to verify that this is done correctly.”…”�”}”(hjSh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K˜hjBh²hubjM)�”}”(hXBWhile on most architectures, ioremap() creates a page table entry for an uncached virtual address pointing to the physical MMIO address, some architectures require special instructions for MMIO, and the ``__iomem`` pointer just encodes the physical address or an offsettable cookie that is interpreted by readl()/writel().”h]”(hŒËWhile on most architectures, ioremap() creates a page table entry for an uncached virtual address pointing to the physical MMIO address, some architectures require special instructions for MMIO, and the ”…”�”}”(hj—h²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj—ubhŒl pointer just encodes the physical address or an offsettable cookie that is interpreted by readl()/writel().”…”�”}”(hj—h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K hjBh²hubeh}”(h]”Œiomem-pointer-tokens”ah ]”h"]”Œ__iomem pointer tokens”ah$]”h&]”uh1jhjh²hh³hÇh´K–ubj)�”}”(hhh]”(j)�”}”(hŒ(Differences between I/O access functions”h]”hŒ(Differences between I/O access functions”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¿h²hh³hÇh´K§ubjM)�”}”(hŒJreadq(), readl(), readw(), readb(), writeq(), writel(), writew(), writeb()”h]”hŒJreadq(), readl(), readw(), readb(), writeq(), writel(), writew(), writeb()”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K©hj¿h²hubhŒ block_quote”“”)�”}”(hX—These are the most generic accessors, providing serialization against other MMIO accesses and DMA accesses as well as fixed endianness for accessing little-endian PCI devices and on-chip peripherals. Portable device drivers should generally use these for any access to ``__iomem`` pointers. Note that posted writes are not strictly ordered against a spinlock, see Documentation/driver-api/io_ordering.rst. ”h]”(jM)�”}”(hX"These are the most generic accessors, providing serialization against other MMIO accesses and DMA accesses as well as fixed endianness for accessing little-endian PCI devices and on-chip peripherals. Portable device drivers should generally use these for any access to ``__iomem`` pointers.”h]”(hX These are the most generic accessors, providing serialization against other MMIO accesses and DMA accesses as well as fixed endianness for accessing little-endian PCI devices and on-chip peripherals. Portable device drivers should generally use these for any access to ”…”�”}”(hjäh²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjäubhŒ pointers.”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K«hjàubjM)�”}”(hŒrNote that posted writes are not strictly ordered against a spinlock, see Documentation/driver-api/io_ordering.rst.”h]”hŒrNote that posted writes are not strictly ordered against a spinlock, see Documentation/driver-api/io_ordering.rst.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K°hjàubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´K«hj¿h²hubjM)�”}”(hŒŠreadq_relaxed(), readl_relaxed(), readw_relaxed(), readb_relaxed(), writeq_relaxed(), writel_relaxed(), writew_relaxed(), writeb_relaxed()”h]”hŒŠreadq_relaxed(), readl_relaxed(), readw_relaxed(), readb_relaxed(), writeq_relaxed(), writel_relaxed(), writew_relaxed(), writeb_relaxed()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K³hj¿h²hubjß)�”}”(hXOn architectures that require an expensive barrier for serializing against DMA, these "relaxed" versions of the MMIO accessors only serialize against each other, but contain a less expensive barrier operation. A device driver might use these in a particularly performance sensitive fast path, with a comment that explains why the usage in a specific location is safe without the extra barriers. See memory-barriers.txt for a more detailed discussion on the precise ordering guarantees of the non-relaxed and relaxed versions. ”h]”(jM)�”}”(hXŠOn architectures that require an expensive barrier for serializing against DMA, these "relaxed" versions of the MMIO accessors only serialize against each other, but contain a less expensive barrier operation. A device driver might use these in a particularly performance sensitive fast path, with a comment that explains why the usage in a specific location is safe without the extra barriers.”h]”hXŽOn architectures that require an expensive barrier for serializing against DMA, these “relaxedâ€� versions of the MMIO accessors only serialize against each other, but contain a less expensive barrier operation. A device driver might use these in a particularly performance sensitive fast path, with a comment that explains why the usage in a specific location is safe without the extra barriers.”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K¶hj&ubjM)�”}”(hŒ‚See memory-barriers.txt for a more detailed discussion on the precise ordering guarantees of the non-relaxed and relaxed versions.”h]”hŒ‚See memory-barriers.txt for a more detailed discussion on the precise ordering guarantees of the non-relaxed and relaxed versions.”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K½hj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´K¶hj¿h²hubjM)�”}”(hŒ`ioread64(), ioread32(), ioread16(), ioread8(), iowrite64(), iowrite32(), iowrite16(), iowrite8()”h]”hŒ`ioread64(), ioread32(), ioread16(), ioread8(), iowrite64(), iowrite32(), iowrite16(), iowrite8()”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÀhj¿h²hubjß)�”}”(hX­These are an alternative to the normal readl()/writel() functions, with almost identical behavior, but they can also operate on ``__iomem`` tokens returned for mapping PCI I/O space with pci_iomap() or ioport_map(). On architectures that require special instructions for I/O port access, this adds a small overhead for an indirect function call implemented in lib/iomap.c, while on other architectures, these are simply aliases. ”h]”jM)�”}”(hX¬These are an alternative to the normal readl()/writel() functions, with almost identical behavior, but they can also operate on ``__iomem`` tokens returned for mapping PCI I/O space with pci_iomap() or ioport_map(). On architectures that require special instructions for I/O port access, this adds a small overhead for an indirect function call implemented in lib/iomap.c, while on other architectures, these are simply aliases.”h]”(hŒ€These are an alternative to the normal readl()/writel() functions, with almost identical behavior, but they can also operate on ”…”�”}”(hj^h²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^ubhX! tokens returned for mapping PCI I/O space with pci_iomap() or ioport_map(). On architectures that require special instructions for I/O port access, this adds a small overhead for an indirect function call implemented in lib/iomap.c, while on other architectures, these are simply aliases.”…”�”}”(hj^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÃhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´KÃhj¿h²hubjM)�”}”(hŒTioread64be(), ioread32be(), ioread16be() iowrite64be(), iowrite32be(), iowrite16be()”h]”hŒTioread64be(), ioread32be(), ioread16be() iowrite64be(), iowrite32be(), iowrite16be()”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÊhj¿h²hubjß)�”}”(hXªThese behave in the same way as the ioread32()/iowrite32() family, but with reversed byte order, for accessing devices with big-endian MMIO registers. Device drivers that can operate on either big-endian or little-endian registers may have to implement a custom wrapper function that picks one or the other depending on which device was found. Note: On some architectures, the normal readl()/writel() functions traditionally assume that devices are the same endianness as the CPU, while using a hardware byte-reverse on the PCI bus when running a big-endian kernel. Drivers that use readl()/writel() this way are generally not portable, but tend to be limited to a particular SoC. ”h]”(jM)�”}”(hXWThese behave in the same way as the ioread32()/iowrite32() family, but with reversed byte order, for accessing devices with big-endian MMIO registers. Device drivers that can operate on either big-endian or little-endian registers may have to implement a custom wrapper function that picks one or the other depending on which device was found.”h]”hXWThese behave in the same way as the ioread32()/iowrite32() family, but with reversed byte order, for accessing devices with big-endian MMIO registers. Device drivers that can operate on either big-endian or little-endian registers may have to implement a custom wrapper function that picks one or the other depending on which device was found.”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÍhj’ubjM)�”}”(hXPNote: On some architectures, the normal readl()/writel() functions traditionally assume that devices are the same endianness as the CPU, while using a hardware byte-reverse on the PCI bus when running a big-endian kernel. Drivers that use readl()/writel() this way are generally not portable, but tend to be limited to a particular SoC.”h]”hXPNote: On some architectures, the normal readl()/writel() functions traditionally assume that devices are the same endianness as the CPU, while using a hardware byte-reverse on the PCI bus when running a big-endian kernel. Drivers that use readl()/writel() this way are generally not portable, but tend to be limited to a particular SoC.”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÓhj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´KÍhj¿h²hubjM)�”}”(hX6hi_lo_readq(), lo_hi_readq(), hi_lo_readq_relaxed(), lo_hi_readq_relaxed(), ioread64_lo_hi(), ioread64_hi_lo(), ioread64be_lo_hi(), ioread64be_hi_lo(), hi_lo_writeq(), lo_hi_writeq(), hi_lo_writeq_relaxed(), lo_hi_writeq_relaxed(), iowrite64_lo_hi(), iowrite64_hi_lo(), iowrite64be_lo_hi(), iowrite64be_hi_lo()”h]”hX6hi_lo_readq(), lo_hi_readq(), hi_lo_readq_relaxed(), lo_hi_readq_relaxed(), ioread64_lo_hi(), ioread64_hi_lo(), ioread64be_lo_hi(), ioread64be_hi_lo(), hi_lo_writeq(), lo_hi_writeq(), hi_lo_writeq_relaxed(), lo_hi_writeq_relaxed(), iowrite64_lo_hi(), iowrite64_hi_lo(), iowrite64be_lo_hi(), iowrite64be_hi_lo()”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÙhj¿h²hubjß)�”}”(hXkSome device drivers have 64-bit registers that cannot be accessed atomically on 32-bit architectures but allow two consecutive 32-bit accesses instead. Since it depends on the particular device which of the two halves has to be accessed first, a helper is provided for each combination of 64-bit accessors with either low/high or high/low word ordering. A device driver must include either or to get the function definitions along with helpers that redirect the normal readq()/writeq() to them on architectures that do not provide 64-bit access natively. ”h]”jM)�”}”(hXjSome device drivers have 64-bit registers that cannot be accessed atomically on 32-bit architectures but allow two consecutive 32-bit accesses instead. Since it depends on the particular device which of the two halves has to be accessed first, a helper is provided for each combination of 64-bit accessors with either low/high or high/low word ordering. A device driver must include either or to get the function definitions along with helpers that redirect the normal readq()/writeq() to them on architectures that do not provide 64-bit access natively.”h]”hXjSome device drivers have 64-bit registers that cannot be accessed atomically on 32-bit architectures but allow two consecutive 32-bit accesses instead. Since it depends on the particular device which of the two halves has to be accessed first, a helper is provided for each combination of 64-bit accessors with either low/high or high/low word ordering. A device driver must include either or to get the function definitions along with helpers that redirect the normal readq()/writeq() to them on architectures that do not provide 64-bit access natively.”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KÞhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´KÞhj¿h²hubjM)�”}”(hŒz__raw_readq(), __raw_readl(), __raw_readw(), __raw_readb(), __raw_writeq(), __raw_writel(), __raw_writew(), __raw_writeb()”h]”hŒz__raw_readq(), __raw_readl(), __raw_readw(), __raw_readb(), __raw_writeq(), __raw_writel(), __raw_writew(), __raw_writeb()”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Kèhj¿h²hubjß)�”}”(hXŠThese are low-level MMIO accessors without barriers or byteorder changes and architecture specific behavior. Accesses are usually atomic in the sense that a four-byte __raw_readl() does not get split into individual byte loads, but multiple consecutive accesses can be combined on the bus. In portable code, it is only safe to use these to access memory behind a device bus but not MMIO registers, as there are no ordering guarantees with regard to other MMIO accesses or even spinlocks. The byte order is generally the same as for normal memory, so unlike the other functions, these can be used to copy data between kernel memory and device memory. ”h]”jM)�”}”(hX‰These are low-level MMIO accessors without barriers or byteorder changes and architecture specific behavior. Accesses are usually atomic in the sense that a four-byte __raw_readl() does not get split into individual byte loads, but multiple consecutive accesses can be combined on the bus. In portable code, it is only safe to use these to access memory behind a device bus but not MMIO registers, as there are no ordering guarantees with regard to other MMIO accesses or even spinlocks. The byte order is generally the same as for normal memory, so unlike the other functions, these can be used to copy data between kernel memory and device memory.”h]”hX‰These are low-level MMIO accessors without barriers or byteorder changes and architecture specific behavior. Accesses are usually atomic in the sense that a four-byte __raw_readl() does not get split into individual byte loads, but multiple consecutive accesses can be combined on the bus. In portable code, it is only safe to use these to access memory behind a device bus but not MMIO registers, as there are no ordering guarantees with regard to other MMIO accesses or even spinlocks. The byte order is generally the same as for normal memory, so unlike the other functions, these can be used to copy data between kernel memory and device memory.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Këhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Këhj¿h²hubjM)�”}”(hŒ+inl(), inw(), inb(), outl(), outw(), outb()”h]”hŒ+inl(), inw(), inb(), outl(), outw(), outb()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Kõhj¿h²hubjß)�”}”(hXRPCI I/O port resources traditionally require separate helpers as they are implemented using special instructions on the x86 architecture. On most other architectures, these are mapped to readl()/writel() style accessors internally, usually pointing to a fixed area in virtual memory. Instead of an ``__iomem`` pointer, the address is a 32-bit integer token to identify a port number. PCI requires I/O port access to be non-posted, meaning that an outb() must complete before the following code executes, while a normal writeb() may still be in progress. On architectures that correctly implement this, I/O port access is therefore ordered against spinlocks. Many non-x86 PCI host bridge implementations and CPU architectures however fail to implement non-posted I/O space on PCI, so they can end up being posted on such hardware. In some architectures, the I/O port number space has a 1:1 mapping to ``__iomem`` pointers, but this is not recommended and device drivers should not rely on that for portability. Similarly, an I/O port number as described in a PCI base address register may not correspond to the port number as seen by a device driver. Portable drivers need to read the port number for the resource provided by the kernel. There are no direct 64-bit I/O port accessors, but pci_iomap() in combination with ioread64/iowrite64 can be used instead. ”h]”(jM)�”}”(hX=PCI I/O port resources traditionally require separate helpers as they are implemented using special instructions on the x86 architecture. On most other architectures, these are mapped to readl()/writel() style accessors internally, usually pointing to a fixed area in virtual memory. Instead of an ``__iomem`` pointer, the address is a 32-bit integer token to identify a port number. PCI requires I/O port access to be non-posted, meaning that an outb() must complete before the following code executes, while a normal writeb() may still be in progress. On architectures that correctly implement this, I/O port access is therefore ordered against spinlocks. Many non-x86 PCI host bridge implementations and CPU architectures however fail to implement non-posted I/O space on PCI, so they can end up being posted on such hardware.”h]”(hX*PCI I/O port resources traditionally require separate helpers as they are implemented using special instructions on the x86 architecture. On most other architectures, these are mapped to readl()/writel() style accessors internally, usually pointing to a fixed area in virtual memory. Instead of an ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhX pointer, the address is a 32-bit integer token to identify a port number. PCI requires I/O port access to be non-posted, meaning that an outb() must complete before the following code executes, while a normal writeb() may still be in progress. On architectures that correctly implement this, I/O port access is therefore ordered against spinlocks. Many non-x86 PCI host bridge implementations and CPU architectures however fail to implement non-posted I/O space on PCI, so they can end up being posted on such hardware.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´K÷hjubjM)�”}”(hX–In some architectures, the I/O port number space has a 1:1 mapping to ``__iomem`` pointers, but this is not recommended and device drivers should not rely on that for portability. Similarly, an I/O port number as described in a PCI base address register may not correspond to the port number as seen by a device driver. Portable drivers need to read the port number for the resource provided by the kernel.”h]”(hŒFIn some architectures, the I/O port number space has a 1:1 mapping to ”…”�”}”(hj6h²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6ubhXE pointers, but this is not recommended and device drivers should not rely on that for portability. Similarly, an I/O port number as described in a PCI base address register may not correspond to the port number as seen by a device driver. Portable drivers need to read the port number for the resource provided by the kernel.”…”�”}”(hj6h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MhjubjM)�”}”(hŒzThere are no direct 64-bit I/O port accessors, but pci_iomap() in combination with ioread64/iowrite64 can be used instead.”h]”hŒzThere are no direct 64-bit I/O port accessors, but pci_iomap() in combination with ioread64/iowrite64 can be used instead.”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´K÷hj¿h²hubjM)�”}”(hŒ7inl_p(), inw_p(), inb_p(), outl_p(), outw_p(), outb_p()”h]”hŒ7inl_p(), inw_p(), inb_p(), outl_p(), outw_p(), outb_p()”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M hj¿h²hubjß)�”}”(hŒÄOn ISA devices that require specific timing, the _p versions of the I/O accessors add a small delay. On architectures that do not have ISA buses, these are aliases to the normal inb/outb helpers. ”h]”jM)�”}”(hŒÃOn ISA devices that require specific timing, the _p versions of the I/O accessors add a small delay. On architectures that do not have ISA buses, these are aliases to the normal inb/outb helpers.”h]”hŒÃOn ISA devices that require specific timing, the _p versions of the I/O accessors add a small delay. On architectures that do not have ISA buses, these are aliases to the normal inb/outb helpers.”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mhjxubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Mhj¿h²hubjM)�”}”(hŒ×readsq, readsl, readsw, readsb writesq, writesl, writesw, writesb ioread64_rep, ioread32_rep, ioread16_rep, ioread8_rep iowrite64_rep, iowrite32_rep, iowrite16_rep, iowrite8_rep insl, insw, insb, outsl, outsw, outsb”h]”hŒ×readsq, readsl, readsw, readsb writesq, writesl, writesw, writesb ioread64_rep, ioread32_rep, ioread16_rep, ioread8_rep iowrite64_rep, iowrite32_rep, iowrite16_rep, iowrite8_rep insl, insw, insb, outsl, outsw, outsb”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mhj¿h²hubjß)�”}”(hX\These are helpers that access the same address multiple times, usually to copy data between kernel memory byte stream and a FIFO buffer. Unlike the normal MMIO accessors, these do not perform a byteswap on big-endian kernels, so the first byte in the FIFO register corresponds to the first byte in the memory buffer regardless of the architecture. ”h]”jM)�”}”(hX[These are helpers that access the same address multiple times, usually to copy data between kernel memory byte stream and a FIFO buffer. Unlike the normal MMIO accessors, these do not perform a byteswap on big-endian kernels, so the first byte in the FIFO register corresponds to the first byte in the memory buffer regardless of the architecture.”h]”hX[These are helpers that access the same address multiple times, usually to copy data between kernel memory byte stream and a FIFO buffer. Unlike the normal MMIO accessors, these do not perform a byteswap on big-endian kernels, so the first byte in the FIFO register corresponds to the first byte in the memory buffer regardless of the architecture.”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Mhj¿h²hubeh}”(h]”Œ(differences-between-i-o-access-functions”ah ]”h"]”Œ(differences between i/o access functions”ah$]”h&]”uh1jhjh²hh³hÇh´K§ubj)�”}”(hhh]”(j)�”}”(hŒDevice memory mapping modes”h]”hŒDevice memory mapping modes”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¾h²hh³hÇh´M ubjM)�”}”(hŒÀSome architectures support multiple modes for mapping device memory. ioremap_*() variants provide a common abstraction around these architecture-specific modes, with a shared set of semantics.”h]”hŒÀSome architectures support multiple modes for mapping device memory. ioremap_*() variants provide a common abstraction around these architecture-specific modes, with a shared set of semantics.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M"hj¾h²hubjM)�”}”(hŒòioremap() is the most common mapping type, and is applicable to typical device memory (e.g. I/O registers). Other modes can offer weaker or stronger guarantees, if supported by the architecture. From most to least common, they are as follows:”h]”hŒòioremap() is the most common mapping type, and is applicable to typical device memory (e.g. I/O registers). Other modes can offer weaker or stronger guarantees, if supported by the architecture. From most to least common, they are as follows:”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M&hj¾h²hubj)�”}”(hhh]”(j)�”}”(hŒ ioremap()”h]”hŒ ioremap()”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjëh²hh³hÇh´M,ubjM)�”}”(hŒ“The default mode, suitable for most memory-mapped devices, e.g. control registers. Memory mapped using ioremap() has the following characteristics:”h]”hŒ“The default mode, suitable for most memory-mapped devices, e.g. control registers. Memory mapped using ioremap() has the following characteristics:”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M.hjëh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒdUncached - CPU-side caches are bypassed, and all reads and writes are handled directly by the device”h]”jM)�”}”(hŒdUncached - CPU-side caches are bypassed, and all reads and writes are handled directly by the device”h]”hŒdUncached - CPU-side caches are bypassed, and all reads and writes are handled directly by the device”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M1hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubj)�”}”(hŒ¡No speculative operations - the CPU may not issue a read or write to this memory, unless the instruction that does so has been reached in committed program flow.”h]”jM)�”}”(hŒ¡No speculative operations - the CPU may not issue a read or write to this memory, unless the instruction that does so has been reached in committed program flow.”h]”hŒ¡No speculative operations - the CPU may not issue a read or write to this memory, unless the instruction that does so has been reached in committed program flow.”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M3hj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubj)�”}”(hŒ·No reordering - The CPU may not reorder accesses to this memory mapping with respect to each other. On some architectures, this relies on barriers in readl_relaxed()/writel_relaxed().”h]”jM)�”}”(hŒ·No reordering - The CPU may not reorder accesses to this memory mapping with respect to each other. On some architectures, this relies on barriers in readl_relaxed()/writel_relaxed().”h]”hŒ·No reordering - The CPU may not reorder accesses to this memory mapping with respect to each other. On some architectures, this relies on barriers in readl_relaxed()/writel_relaxed().”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M6hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubj)�”}”(hŒ`No repetition - The CPU may not issue multiple reads or writes for a single program instruction.”h]”jM)�”}”(hŒ`No repetition - The CPU may not issue multiple reads or writes for a single program instruction.”h]”hŒ`No repetition - The CPU may not issue multiple reads or writes for a single program instruction.”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M9hjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubj)�”}”(hŒúNo write-combining - Each I/O operation results in one discrete read or write being issued to the device, and multiple writes are not combined into larger writes. This may or may not be enforced when using __raw I/O accessors or pointer dereferences.”h]”jM)�”}”(hŒúNo write-combining - Each I/O operation results in one discrete read or write being issued to the device, and multiple writes are not combined into larger writes. This may or may not be enforced when using __raw I/O accessors or pointer dereferences.”h]”hŒúNo write-combining - Each I/O operation results in one discrete read or write being issued to the device, and multiple writes are not combined into larger writes. This may or may not be enforced when using __raw I/O accessors or pointer dereferences.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M;hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubj)�”}”(hŒ·Non-executable - The CPU is not allowed to speculate instruction execution from this memory (it probably goes without saying, but you're also not allowed to jump into device memory). ”h]”jM)�”}”(hŒ¶Non-executable - The CPU is not allowed to speculate instruction execution from this memory (it probably goes without saying, but you're also not allowed to jump into device memory).”h]”hŒ¸Non-executable - The CPU is not allowed to speculate instruction execution from this memory (it probably goes without saying, but you’re also not allowed to jump into device memory).”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M?hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j h³hÇh´M1hjëh²hubjM)�”}”(hŒÜOn many platforms and buses (e.g. PCI), writes issued through ioremap() mappings are posted, which means that the CPU does not wait for the write to actually reach the target device before retiring the write instruction.”h]”hŒÜOn many platforms and buses (e.g. PCI), writes issued through ioremap() mappings are posted, which means that the CPU does not wait for the write to actually reach the target device before retiring the write instruction.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MChjëh²hubjM)�”}”(hŒ—On many platforms, I/O accesses must be aligned with respect to the access size; failure to do so will result in an exception or unpredictable results.”h]”hŒ—On many platforms, I/O accesses must be aligned with respect to the access size; failure to do so will result in an exception or unpredictable results.”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MGhjëh²hubeh}”(h]”Œioremap”ah ]”h"]”Œ ioremap()”ah$]”h&]”uh1jhj¾h²hh³hÇh´M,ubj)�”}”(hhh]”(j)�”}”(hŒ ioremap_wc()”h]”hŒ ioremap_wc()”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÍh²hh³hÇh´MKubjM)�”}”(hŒHMaps I/O memory as normal memory with write combining. Unlike ioremap(),”h]”hŒHMaps I/O memory as normal memory with write combining. Unlike ioremap(),”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MMhjÍh²hubj )�”}”(hhh]”(j)�”}”(hŒ“The CPU may speculatively issue reads from the device that the program didn't actually execute, and may choose to basically read whatever it wants.”h]”jM)�”}”(hŒ“The CPU may speculatively issue reads from the device that the program didn't actually execute, and may choose to basically read whatever it wants.”h]”hŒ•The CPU may speculatively issue reads from the device that the program didn’t actually execute, and may choose to basically read whatever it wants.”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MOhjïubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjìh²hh³hÇh´Nubj)�”}”(hŒdThe CPU may reorder operations as long as the result is consistent from the program's point of view.”h]”jM)�”}”(hŒdThe CPU may reorder operations as long as the result is consistent from the program's point of view.”h]”hŒfThe CPU may reorder operations as long as the result is consistent from the program’s point of view.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjìh²hh³hÇh´Nubj)�”}”(hŒcThe CPU may write to the same location multiple times, even when the program issued a single write.”h]”jM)�”}”(hŒcThe CPU may write to the same location multiple times, even when the program issued a single write.”h]”hŒcThe CPU may write to the same location multiple times, even when the program issued a single write.”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MShjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjìh²hh³hÇh´Nubj)�”}”(hŒ?The CPU may combine several writes into a single larger write. ”h]”jM)�”}”(hŒ>The CPU may combine several writes into a single larger write.”h]”hŒ>The CPU may combine several writes into a single larger write.”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MUhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjìh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j§j¨uh1j h³hÇh´MOhjÍh²hubjM)�”}”(hXRThis mode is typically used for video framebuffers, where it can increase performance of writes. It can also be used for other blocks of memory in devices (e.g. buffers or shared memory), but care must be taken as accesses are not guaranteed to be ordered with respect to normal ioremap() MMIO register accesses without explicit barriers.”h]”hXRThis mode is typically used for video framebuffers, where it can increase performance of writes. It can also be used for other blocks of memory in devices (e.g. buffers or shared memory), but care must be taken as accesses are not guaranteed to be ordered with respect to normal ioremap() MMIO register accesses without explicit barriers.”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MWhjÍh²hubjM)�”}”(hXOn a PCI bus, it is usually safe to use ioremap_wc() on MMIO areas marked as ``IORESOURCE_PREFETCH``, but it may not be used on those without the flag. For on-chip devices, there is no corresponding flag, but a driver can use ioremap_wc() on a device that is known to be safe.”h]”(hŒMOn a PCI bus, it is usually safe to use ioremap_wc() on MMIO areas marked as ”…”�”}”(hjch²hh³Nh´Nubj)�”}”(hŒ``IORESOURCE_PREFETCH``”h]”hŒIORESOURCE_PREFETCH”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjcubhŒ°, but it may not be used on those without the flag. For on-chip devices, there is no corresponding flag, but a driver can use ioremap_wc() on a device that is known to be safe.”…”�”}”(hjch²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M]hjÍh²hubeh}”(h]”Œ ioremap-wc”ah ]”h"]”Œ ioremap_wc()”ah$]”h&]”uh1jhj¾h²hh³hÇh´MKubj)�”}”(hhh]”(j)�”}”(hŒ ioremap_wt()”h]”hŒ ioremap_wt()”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‹h²hh³hÇh´McubjM)�”}”(hŒYMaps I/O memory as normal memory with write-through caching. Like ioremap_wc(), but also,”h]”hŒYMaps I/O memory as normal memory with write-through caching. Like ioremap_wc(), but also,”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mehj‹h²hubj )�”}”(hhh]”j)�”}”(hŒ_The CPU may cache writes issued to and reads from the device, and serve reads from that cache. ”h]”jM)�”}”(hŒ^The CPU may cache writes issued to and reads from the device, and serve reads from that cache.”h]”hŒ^The CPU may cache writes issued to and reads from the device, and serve reads from that cache.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mhhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjªh²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j§j¨uh1j h³hÇh´Mhhj‹h²hubjM)�”}”(hX¬This mode is sometimes used for video framebuffers, where drivers still expect writes to reach the device in a timely manner (and not be stuck in the CPU cache), but reads may be served from the cache for efficiency. However, it is rarely useful these days, as framebuffer drivers usually perform writes only, for which ioremap_wc() is more efficient (as it doesn't needlessly trash the cache). Most drivers should not use this.”h]”hX®This mode is sometimes used for video framebuffers, where drivers still expect writes to reach the device in a timely manner (and not be stuck in the CPU cache), but reads may be served from the cache for efficiency. However, it is rarely useful these days, as framebuffer drivers usually perform writes only, for which ioremap_wc() is more efficient (as it doesn’t needlessly trash the cache). Most drivers should not use this.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mkhj‹h²hubeh}”(h]”Œ ioremap-wt”ah ]”h"]”Œ ioremap_wt()”ah$]”h&]”uh1jhj¾h²hh³hÇh´Mcubj)�”}”(hhh]”(j)�”}”(hŒ ioremap_np()”h]”hŒ ioremap_np()”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjáh²hh³hÇh´MsubjM)�”}”(hXµLike ioremap(), but explicitly requests non-posted write semantics. On some architectures and buses, ioremap() mappings have posted write semantics, which means that writes can appear to "complete" from the point of view of the CPU before the written data actually arrives at the target device. Writes are still ordered with respect to other writes and reads from the same device, but due to the posted write semantics, this is not the case with respect to other devices. ioremap_np() explicitly requests non-posted semantics, which means that the write instruction will not appear to complete until the device has received (and to some platform-specific extent acknowledged) the written data.”h]”hX¹Like ioremap(), but explicitly requests non-posted write semantics. On some architectures and buses, ioremap() mappings have posted write semantics, which means that writes can appear to “completeâ€� from the point of view of the CPU before the written data actually arrives at the target device. Writes are still ordered with respect to other writes and reads from the same device, but due to the posted write semantics, this is not the case with respect to other devices. ioremap_np() explicitly requests non-posted semantics, which means that the write instruction will not appear to complete until the device has received (and to some platform-specific extent acknowledged) the written data.”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Muhjáh²hubjM)�”}”(hX’This mapping mode primarily exists to cater for platforms with bus fabrics that require this particular mapping mode to work correctly. These platforms set the ``IORESOURCE_MEM_NONPOSTED`` flag for a resource that requires ioremap_np() semantics and portable drivers should use an abstraction that automatically selects it where appropriate (see the `Higher-level ioremap abstractions`_ section below).”h]”(hŒ This mapping mode primarily exists to cater for platforms with bus fabrics that require this particular mapping mode to work correctly. These platforms set the ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ``IORESOURCE_MEM_NONPOSTED``”h]”hŒIORESOURCE_MEM_NONPOSTED”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ¢ flag for a resource that requires ioremap_np() semantics and portable drivers should use an abstraction that automatically selects it where appropriate (see the ”…”�”}”(hjh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ$`Higher-level ioremap abstractions`_”h]”hŒ!Higher-level ioremap abstractions”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ!Higher-level ioremap abstractions”Œrefid”Œ!higher-level-ioremap-abstractions”uh1jhjŒresolved”KubhŒ section below).”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mhjáh²hubjM)�”}”(hXÀThe bare ioremap_np() is only available on some architectures; on others, it always returns NULL. Drivers should not normally use it, unless they are platform-specific or they derive benefit from non-posted writes where supported, and can fall back to ioremap() otherwise. The normal approach to ensure posted write completion is to do a dummy read after a write as explained in `Accessing the device`_, which works with ioremap() on all platforms.”h]”(hX{The bare ioremap_np() is only available on some architectures; on others, it always returns NULL. Drivers should not normally use it, unless they are platform-specific or they derive benefit from non-posted writes where supported, and can fall back to ioremap() otherwise. The normal approach to ensure posted write completion is to do a dummy read after a write as explained in ”…”�”}”(hj9h²hh³Nh´Nubj)�”}”(hŒ`Accessing the device`_”h]”hŒAccessing the device”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒAccessing the device”j,jœuh1jhj9j.KubhŒ., which works with ioremap() on all platforms.”…”�”}”(hj9h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M†hjáh²hubjM)�”}”(hXioremap_np() should never be used for PCI drivers. PCI memory space writes are always posted, even on architectures that otherwise implement ioremap_np(). Using ioremap_np() for PCI BARs will at best result in posted write semantics, and at worst result in complete breakage.”h]”hXioremap_np() should never be used for PCI drivers. PCI memory space writes are always posted, even on architectures that otherwise implement ioremap_np(). Using ioremap_np() for PCI BARs will at best result in posted write semantics, and at worst result in complete breakage.”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MŽhjáh²hubjM)�”}”(hXNote that non-posted write semantics are orthogonal to CPU-side ordering guarantees. A CPU may still choose to issue other reads or writes before a non-posted write instruction retires. See the previous section on MMIO access functions for details on the CPU side of things.”h]”hXNote that non-posted write semantics are orthogonal to CPU-side ordering guarantees. A CPU may still choose to issue other reads or writes before a non-posted write instruction retires. See the previous section on MMIO access functions for details on the CPU side of things.”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M“hjáh²hubeh}”(h]”Œ ioremap-np”ah ]”h"]”Œ ioremap_np()”ah$]”h&]”uh1jhj¾h²hh³hÇh´Msubj)�”}”(hhh]”(j)�”}”(hŒ ioremap_uc()”h]”hŒ ioremap_uc()”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjh²hh³hÇh´M™ubjM)�”}”(hŒÄioremap_uc() is only meaningful on old x86-32 systems with the PAT extension, and on ia64 with its slightly unconventional ioremap() behavior, everywhere elss ioremap_uc() defaults to return NULL.”h]”hŒÄioremap_uc() is only meaningful on old x86-32 systems with the PAT extension, and on ia64 with its slightly unconventional ioremap() behavior, everywhere elss ioremap_uc() defaults to return NULL.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M›hjh²hubjM)�”}”(hŒMPortable drivers should avoid the use of ioremap_uc(), use ioremap() instead.”h]”hŒMPortable drivers should avoid the use of ioremap_uc(), use ioremap() instead.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M hjh²hubeh}”(h]”Œ ioremap-uc”ah ]”h"]”Œ ioremap_uc()”ah$]”h&]”uh1jhj¾h²hh³hÇh´M™ubj)�”}”(hhh]”(j)�”}”(hŒioremap_cache()”h]”hŒioremap_cache()”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj´h²hh³hÇh´M£ubjM)�”}”(hX1ioremap_cache() effectively maps I/O memory as normal RAM. CPU write-back caches can be used, and the CPU is free to treat the device as if it were a block of RAM. This should never be used for device memory which has side effects of any kind, or which does not return the data previously written on read.”h]”hX1ioremap_cache() effectively maps I/O memory as normal RAM. CPU write-back caches can be used, and the CPU is free to treat the device as if it were a block of RAM. This should never be used for device memory which has side effects of any kind, or which does not return the data previously written on read.”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¥hj´h²hubjM)�”}”(hŒÐIt should also not be used for actual RAM, as the returned pointer is an ``__iomem`` token. memremap() can be used for mapping normal RAM that is outside of the linear kernel memory area to a regular pointer.”h]”(hŒIIt should also not be used for actual RAM, as the returned pointer is an ”…”�”}”(hjÓh²hh³Nh´Nubj)�”}”(hŒ ``__iomem``”h]”hŒ__iomem”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÓubhŒ| token. memremap() can be used for mapping normal RAM that is outside of the linear kernel memory area to a regular pointer.”…”�”}”(hjÓh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M«hj´h²hubjM)�”}”(hŒ9Portable drivers should avoid the use of ioremap_cache().”h]”hŒ9Portable drivers should avoid the use of ioremap_cache().”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¯hj´h²hubeh}”(h]”Œ ioremap-cache”ah ]”h"]”Œioremap_cache()”ah$]”h&]”uh1jhj¾h²hh³hÇh´M£ubj)�”}”(hhh]”(j)�”}”(hŒArchitecture example”h]”hŒArchitecture example”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³hÇh´M²ubjM)�”}”(hŒWHere is how the above modes map to memory attribute settings on the ARM64 architecture:”h]”hŒWHere is how the above modes map to memory attribute settings on the ARM64 architecture:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M´hj h²hubhŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j2 hj/ ubj3 )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K,uh1j2 hj/ ubhŒtbody”“”)�”}”(hhh]”(hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”jM)�”}”(hŒAPI”h]”hŒAPI”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¸hjT ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjO ubjS )�”}”(hhh]”jM)�”}”(hŒ#Memory region type and cacheability”h]”hŒ#Memory region type and cacheability”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¸hjk ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjO ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ub•jN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ ioremap_np()”h]”hŒ ioremap_np()”…”�”}”(hjŽ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mºhj‹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjˆ ubjS )�”}”(hhh]”jM)�”}”(hŒ Device-nGnRnE”h]”hŒ Device-nGnRnE”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mºhj¢ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjˆ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ ioremap()”h]”hŒ ioremap()”…”�”}”(hjÅ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¼hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj¿ ubjS )�”}”(hhh]”jM)�”}”(hŒ Device-nGnRE”h]”hŒ Device-nGnRE”…”�”}”(hjÜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¼hjÙ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj¿ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ ioremap_uc()”h]”hŒ ioremap_uc()”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¾hjù ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjö ubjS )�”}”(hhh]”jM)�”}”(hŒ(not implemented)”h]”hŒ(not implemented)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M¾hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjö ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ ioremap_wc()”h]”hŒ ioremap_wc()”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÀhj0 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj- ubjS )�”}”(hhh]”jM)�”}”(hŒNormal-Non Cacheable”h]”hŒNormal-Non Cacheable”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÀhjG ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj- ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ ioremap_wt()”h]”hŒ ioremap_wt()”…”�”}”(hjj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÂhjg ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjd ubjS )�”}”(hhh]”jM)�”}”(hŒ&(not implemented; fallback to ioremap)”h]”hŒ&(not implemented; fallback to ioremap)”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÂhj~ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjd ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒioremap_cache()”h]”hŒioremap_cache()”…”�”}”(hj¡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÄhjž ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj› ubjS )�”}”(hhh]”jM)�”}”(hŒNormal-Write-Back Cacheable”h]”hŒNormal-Write-Back Cacheable”…”�”}”(hj¸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÄhjµ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj› ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hjJ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jH hj/ ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j- hj* ubah}”(h]”h ]”h"]”h$]”h&]”uh1j( hj h²hh³hÇh´Nubeh}”(h]”Œarchitecture-example”ah ]”h"]”Œarchitecture example”ah$]”h&]”uh1jhj¾h²hh³hÇh´M²ubeh}”(h]”Œdevice-memory-mapping-modes”ah ]”h"]”Œdevice memory mapping modes”ah$]”h&]”uh1jhjh²hh³hÇh´M ubj)�”}”(hhh]”(j)�”}”(hŒ!Higher-level ioremap abstractions”h]”hŒ!Higher-level ioremap abstractions”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjõ h²hh³hÇh´MÈubjM)�”}”(hX„Instead of using the above raw ioremap() modes, drivers are encouraged to use higher-level APIs. These APIs may implement platform-specific logic to automatically choose an appropriate ioremap mode on any given bus, allowing for a platform-agnostic driver to work on those platforms without any special cases. At the time of this writing, the following ioremap() wrappers have such logic:”h]”hX„Instead of using the above raw ioremap() modes, drivers are encouraged to use higher-level APIs. These APIs may implement platform-specific logic to automatically choose an appropriate ioremap mode on any given bus, allowing for a platform-agnostic driver to work on those platforms without any special cases. At the time of this writing, the following ioremap() wrappers have such logic:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÊhjõ h²hubjM)�”}”(hŒdevm_ioremap_resource()”h]”hŒdevm_ioremap_resource()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÑhjõ h²hubjß)�”}”(hXaCan automatically select ioremap_np() over ioremap() according to platform requirements, if the ``IORESOURCE_MEM_NONPOSTED`` flag is set on the struct resource. Uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver. Documented in Documentation/driver-api/driver-model/devres.rst. ”h]”(jM)�”}”(hXCan automatically select ioremap_np() over ioremap() according to platform requirements, if the ``IORESOURCE_MEM_NONPOSTED`` flag is set on the struct resource. Uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver.”h]”(hŒ`Can automatically select ioremap_np() over ioremap() according to platform requirements, if the ”…”�”}”(hj& h²hh³Nh´Nubj)�”}”(hŒ``IORESOURCE_MEM_NONPOSTED``”h]”hŒIORESOURCE_MEM_NONPOSTED”…”�”}”(hj. h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj& ubhŒ£ flag is set on the struct resource. Uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver.”…”�”}”(hj& h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÓhj" ubjM)�”}”(hŒ?Documented in Documentation/driver-api/driver-model/devres.rst.”h]”hŒ?Documented in Documentation/driver-api/driver-model/devres.rst.”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MØhj" ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´MÓhjõ h²hubjM)�”}”(hŒof_address_to_resource()”h]”hŒof_address_to_resource()”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÚhjõ h²hubjß)�”}”(hŒ¹Automatically sets the ``IORESOURCE_MEM_NONPOSTED`` flag for platforms that require non-posted writes for certain buses (see the nonposted-mmio and posted-mmio device tree properties). ”h]”jM)�”}”(hŒ¸Automatically sets the ``IORESOURCE_MEM_NONPOSTED`` flag for platforms that require non-posted writes for certain buses (see the nonposted-mmio and posted-mmio device tree properties).”h]”(hŒAutomatically sets the ”…”�”}”(hjl h²hh³Nh´Nubj)�”}”(hŒ``IORESOURCE_MEM_NONPOSTED``”h]”hŒIORESOURCE_MEM_NONPOSTED”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjl ubhŒ… flag for platforms that require non-posted writes for certain buses (see the nonposted-mmio and posted-mmio device tree properties).”…”�”}”(hjl h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MÜhjh ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´MÜhjõ h²hubjM)�”}”(hŒ of_iomap()”h]”hŒ of_iomap()”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Màhjõ h²hubjß)�”}”(hŒ¸Maps the resource described in a ``reg`` property in the device tree, doing all required translations. Automatically selects ioremap_np() according to platform requirements, as above. ”h]”jM)�”}”(hŒ·Maps the resource described in a ``reg`` property in the device tree, doing all required translations. Automatically selects ioremap_np() according to platform requirements, as above.”h]”(hŒ!Maps the resource described in a ”…”�”}”(hj¤ h²hh³Nh´Nubj)�”}”(hŒ``reg``”h]”hŒreg”…”�”}”(hj¬ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¤ ubhŒ� property in the device tree, doing all required translations. Automatically selects ioremap_np() according to platform requirements, as above.”…”�”}”(hj¤ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mâhj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Mâhjõ h²hubjM)�”}”(hŒ'pci_ioremap_bar(), pci_ioremap_wc_bar()”h]”hŒ'pci_ioremap_bar(), pci_ioremap_wc_bar()”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mæhjõ h²hubjß)�”}”(hŒhMaps the resource described in a PCI base address without having to extract the physical address first. ”h]”jM)�”}”(hŒgMaps the resource described in a PCI base address without having to extract the physical address first.”h]”hŒgMaps the resource described in a PCI base address without having to extract the physical address first.”…”�”}”(hjÜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´MèhjØ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Mèhjõ h²hubjM)�”}”(hŒpci_iomap(), pci_iomap_wc()”h]”hŒpci_iomap(), pci_iomap_wc()”…”�”}”(hjð h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mëhjõ h²hubjß)�”}”(hŒ‹Like pci_ioremap_bar()/pci_ioremap_bar(), but also works on I/O space when used together with ioread32()/iowrite32() and similar accessors ”h]”jM)�”}”(hŒŠLike pci_ioremap_bar()/pci_ioremap_bar(), but also works on I/O space when used together with ioread32()/iowrite32() and similar accessors”h]”hŒŠLike pci_ioremap_bar()/pci_ioremap_bar(), but also works on I/O space when used together with ioread32()/iowrite32() and similar accessors”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Míhjþ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Míhjõ h²hubjM)�”}”(hŒ pcim_iomap()”h]”hŒ pcim_iomap()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mðhjõ h²hubjß)�”}”(hŒÕLike pci_iomap(), but uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver Documented in Documentation/driver-api/driver-model/devres.rst. ”h]”(jM)�”}”(hŒ“Like pci_iomap(), but uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver”h]”hŒ“Like pci_iomap(), but uses devres to automatically unmap the resource when the driver probe() function fails or a device in unbound from its driver”…”�”}”(hj( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mòhj$ ubjM)�”}”(hŒ?Documented in Documentation/driver-api/driver-model/devres.rst.”h]”hŒ?Documented in Documentation/driver-api/driver-model/devres.rst.”…”�”}”(hj6 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Mõhj$ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³hÇh´Mòhjõ h²hubjM)�”}”(hŒsNot using these wrappers may make drivers unusable on certain platforms with stricter rules for mapping I/O memory.”h]”hŒsNot using these wrappers may make drivers unusable on certain platforms with stricter rules for mapping I/O memory.”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´M÷hjõ h²hubeh}”(h]”j-ah ]”h"]”Œ!higher-level ioremap abstractions”ah$]”h&]”uh1jhjh²hh³hÇh´MÈj¢Kubj)�”}”(hhh]”(j)�”}”(hŒ,Generalizing Access to System and I/O Memory”h]”hŒ,Generalizing Access to System and I/O Memory”…”�”}”(hjb h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ h²hh³hÇh´MûubjM)�”}”(hXWhen accessing a memory region, depending on its location, users may have to access it with I/O operations or memory load/store operations. For example, copying to system memory could be done with memcpy(), copying to I/O memory would be done with memcpy_toio().”h]”hXWhen accessing a memory region, depending on its location, users may have to access it with I/O operations or memory load/store operations. For example, copying to system memory could be done with memcpy(), copying to I/O memory would be done with memcpy_toio().”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´Khj_ h²hubj})�”}”(hŒžvoid *vaddr = ...; // pointer to system memory memcpy(vaddr, src, len); void *vaddr_iomem = ...; // pointer to I/O memory memcpy_toio(vaddr_iomem, src, len);”h]”hŒžvoid *vaddr = ...; // pointer to system memory memcpy(vaddr, src, len); void *vaddr_iomem = ...; // pointer to I/O memory memcpy_toio(vaddr_iomem, src, len);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´Khj_ h²hubjM)�”}”(hX­The user of such pointer may not have information about the mapping of that region or may want to have a single code path to handle operations on that buffer, regardless if it's located in system or IO memory. The type :c:type:`struct iosys_map ` and its helpers abstract that so the buffer can be passed around to other drivers or have separate duties inside the same driver for allocation, read and write operations.”h]”(hŒÝThe user of such pointer may not have information about the mapping of that region or may want to have a single code path to handle operations on that buffer, regardless if it’s located in system or IO memory. The type ”…”�”}”(hj“ h²hh³Nh´Nubh)�”}”(hŒ&:c:type:`struct iosys_map `”h]”j)�”}”(hj� h]”hŒstruct iosys_map”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”(Œxref”j� Œc-type”eh"]”h$]”h&]”uh1jhj› ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œdriver-api/device-io”Œ refdomain”j� Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰Œ reftarget”Œ iosys_map”uh1hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´Khj“ ubhŒ¬ and its helpers abstract that so the buffer can be passed around to other drivers or have separate duties inside the same driver for allocation, read and write operations.”…”�”}”(hj“ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j½ h´Khj_ h²hubjM)�”}”(hX›Open-coding access to :c:type:`struct iosys_map ` is considered bad style. Rather than accessing its fields directly, use one of the provided helper functions, or implement your own. For example, instances of :c:type:`struct iosys_map ` can be initialized statically with IOSYS_MAP_INIT_VADDR(), or at runtime with iosys_map_set_vaddr(). These helpers will set an address in system memory.”h]”(hŒOpen-coding access to ”…”�”}”(hjÈ h²hh³Nh´Nubh)�”}”(hŒ&:c:type:`struct iosys_map `”h]”j)�”}”(hjÒ h]”hŒstruct iosys_map”…”�”}”(hjÔ h²hh³Nh´Nubah}”(h]”h ]”(j© j� Œc-type”eh"]”h$]”h&]”uh1jhjÐ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jµ Œ refdomain”j� Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j» Œ iosys_map”uh1hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K"hjÈ ubhŒ  is considered bad style. Rather than accessing its fields directly, use one of the provided helper functions, or implement your own. For example, instances of ”…”�”}”(hjÈ h²hh³Nh´Nubh)�”}”(hŒ&:c:type:`struct iosys_map `”h]”j)�”}”(hjö h]”hŒstruct iosys_map”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”(j© j� Œc-type”eh"]”h$]”h&]”uh1jhjô ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jµ Œ refdomain”j� Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j» Œ iosys_map”uh1hh³jï h´K"hjÈ ubhŒ™ can be initialized statically with IOSYS_MAP_INIT_VADDR(), or at runtime with iosys_map_set_vaddr(). These helpers will set an address in system memory.”…”�”}”(hjÈ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jï h´K"hj_ h²hubj})�”}”(hŒ`struct iosys_map map = IOSYS_MAP_INIT_VADDR(0xdeadbeaf); iosys_map_set_vaddr(&map, 0xdeadbeaf);”h]”hŒ`struct iosys_map map = IOSYS_MAP_INIT_VADDR(0xdeadbeaf); iosys_map_set_vaddr(&map, 0xdeadbeaf);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K)hj_ h²hubjM)�”}”(hŒaTo set an address in I/O memory, use IOSYS_MAP_INIT_VADDR_IOMEM() or iosys_map_set_vaddr_iomem().”h]”hŒaTo set an address in I/O memory, use IOSYS_MAP_INIT_VADDR_IOMEM() or iosys_map_set_vaddr_iomem().”…”�”}”(hj- h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K/hj_ h²hubj})�”}”(hŒlstruct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(0xdeadbeaf); iosys_map_set_vaddr_iomem(&map, 0xdeadbeaf);”h]”hŒlstruct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(0xdeadbeaf); iosys_map_set_vaddr_iomem(&map, 0xdeadbeaf);”…”�”}”hj< sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K2hj_ h²hubjM)�”}”(hŒžInstances of struct iosys_map do not have to be cleaned up, but can be cleared to NULL with iosys_map_clear(). Cleared mappings always refer to system memory.”h]”hŒžInstances of struct iosys_map do not have to be cleaned up, but can be cleared to NULL with iosys_map_clear(). Cleared mappings always refer to system memory.”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K8hj_ h²hubj})�”}”(hŒiosys_map_clear(&map);”h]”hŒiosys_map_clear(&map);”…”�”}”hj[ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K` can be compared for equality with iosys_map_is_equal(). Mappings that point to different memory spaces, system or I/O, are never equal. That's even true if both spaces are located in the same address space, both mappings contain the same address value, or both mappings refer to NULL.”h]”(hŒ Instances of ”…”�”}”(hjŠ h²hh³Nh´Nubh)�”}”(hŒ&:c:type:`struct iosys_map `”h]”j)�”}”(hj” h]”hŒstruct iosys_map”…”�”}”(hj– h²hh³Nh´Nubah}”(h]”h ]”(j© j� Œc-type”eh"]”h$]”h&]”uh1jhj’ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jµ Œ refdomain”j� Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j» Œ iosys_map”uh1hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´KHhjŠ ubhX can be compared for equality with iosys_map_is_equal(). Mappings that point to different memory spaces, system or I/O, are never equal. That’s even true if both spaces are located in the same address space, both mappings contain the same address value, or both mappings refer to NULL.”…”�”}”(hjŠ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j± h´KHhj_ h²hubj})�”}”(hŒ©struct iosys_map sys_map; // refers to system memory struct iosys_map io_map; // refers to I/O memory if (iosys_map_is_equal(&sys_map, &io_map)) // always false”h]”hŒ©struct iosys_map sys_map; // refers to system memory struct iosys_map io_map; // refers to I/O memory if (iosys_map_is_equal(&sys_map, &io_map)) // always false”…”�”}”hj¼ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´KNhj_ h²hubjM)�”}”(hX1A set up instance of struct iosys_map can be used to access or manipulate the buffer memory. Depending on the location of the memory, the provided helpers will pick the correct operations. Data can be copied into the memory with iosys_map_memcpy_to(). The address can be manipulated with iosys_map_incr().”h]”hX1A set up instance of struct iosys_map can be used to access or manipulate the buffer memory. Depending on the location of the memory, the provided helpers will pick the correct operations. Data can be copied into the memory with iosys_map_memcpy_to(). The address can be manipulated with iosys_map_incr().”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´KVhj_ h²hubj})�”}”(hŒ°const void *src = ...; // source buffer size_t len = ...; // length of src iosys_map_memcpy_to(&map, src, len); iosys_map_incr(&map, len); // go to first byte after the memcpy”h]”hŒ°const void *src = ...; // source buffer size_t len = ...; // length of src iosys_map_memcpy_to(&map, src, len); iosys_map_incr(&map, len); // go to first byte after the memcpy”…”�”}”hjÛ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:509: ./include/linux/iosys-map.h”h´K[hj_ h²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œiosys_map (C struct)”Œ c.iosys_map”hNt”auh1jë hj_ h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ iosys_map”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct iosys_map”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j hj h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jhj h²hh³jh´KubhŒ desc_name”“”)�”}”(hŒ iosys_map”h]”hŒ desc_sig_name”“”)�”}”(hjh]”hŒ iosys_map”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1j6hj2ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j0hj h²hh³jh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jŒsphinx_line_type”Œ declarator”hjh²hh³jh´Kubah}”(h]”jú ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jh³jh´Khjþ h²hubhŒ desc_content”“”)�”}”(hhh]”jM)�”}”(hŒPointer to IO/system memory”h]”hŒPointer to IO/system memory”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kghjdh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjþ h²hh³jh´Kubeh}”(h]”h ]”(j� Œstruct”eh"]”h$]”h&]”Œdomain”j� Œobjtype”jŒdesctype”jŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jü h²hhj_ h³Nh´NubhŒ container”“”)�”}”(hXƒ**Definition**:: struct iosys_map { union { void __iomem *vaddr_iomem; void *vaddr; }; bool is_iomem; }; **Members** ``{unnamed_union}`` anonymous ``vaddr_iomem`` The buffer's address if in I/O memory ``vaddr`` The buffer's address if in system memory ``is_iomem`` True if the buffer is located in I/O memory, or false otherwise.”h]”(jM)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj�ubhŒ:”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kkhj‹ubj})�”}”(hŒsstruct iosys_map { union { void __iomem *vaddr_iomem; void *vaddr; }; bool is_iomem; };”h]”hŒsstruct iosys_map { union { void __iomem *vaddr_iomem; void *vaddr; }; bool is_iomem; };”…”�”}”hj®sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kmhj‹ubjM)�”}”(hŒ **Members**”h]”j”)�”}”(hj¿h]”hŒMembers”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kuhj‹ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(hŒterm”“”)�”}”(hŒ``{unnamed_union}``”h]”j)�”}”(hjäh]”hŒ{unnamed_union}”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´KhjÜubhŒ definition”“”)�”}”(hhh]”jM)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jùh´Khjüubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jùh´Khj×ubjÛ)�”}”(hŒ6``vaddr_iomem`` The buffer's address if in I/O memory ”h]”(já)�”}”(hŒ``vaddr_iomem``”h]”j)�”}”(hjh]”hŒ vaddr_iomem”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kihjubjû)�”}”(hhh]”jM)�”}”(hŒ%The buffer's address if in I/O memory”h]”hŒ'The buffer’s address if in I/O memory”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j4h´Kihj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j4h´Kihj×ubjÛ)�”}”(hŒ3``vaddr`` The buffer's address if in system memory ”h]”(já)�”}”(hŒ ``vaddr``”h]”j)�”}”(hjXh]”hŒvaddr”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´KjhjRubjû)�”}”(hhh]”jM)�”}”(hŒ(The buffer's address if in system memory”h]”hŒ*The buffer’s address if in system memory”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jmh´Kjhjnubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjRubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jmh´Kjhj×ubjÛ)�”}”(hŒM``is_iomem`` True if the buffer is located in I/O memory, or false otherwise.”h]”(já)�”}”(hŒ ``is_iomem``”h]”j)�”}”(hj‘h]”hŒis_iomem”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kkhj‹ubjû)�”}”(hhh]”jM)�”}”(hŒ@True if the buffer is located in I/O memory, or false otherwise.”h]”hŒ@True if the buffer is located in I/O memory, or false otherwise.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¦h´Kkhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j¦h´Kkhj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj‹ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø ŒIOSYS_MAP_INIT_VADDR (C macro)”Œc.IOSYS_MAP_INIT_VADDR”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒIOSYS_MAP_INIT_VADDR”h]”j)�”}”(hŒIOSYS_MAP_INIT_VADDR”h]”j1)�”}”(hŒIOSYS_MAP_INIT_VADDR”h]”j7)�”}”(hjäh]”hŒIOSYS_MAP_INIT_VADDR”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjêubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjæh²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kvubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjâh²hh³jh´Kvubah}”(h]”jÝah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³jh´Kvhjßh²hubjc)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jbhjßh²hh³jh´Kvubeh}”(h]”h ]”(j� Œmacro”eh"]”h$]”h&]”jƒj� j„jj…jj†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjM)�”}”(hŒ!``IOSYS_MAP_INIT_VADDR (vaddr_)``”h]”j)�”}”(hj h]”hŒIOSYS_MAP_INIT_VADDR (vaddr_)”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kxhj_ h²hubjß)�”}”(hŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K‹hj6ubjû)�”}”(hhh]”jM)�”}”(hŒ*The dma-buf mapping structure to copy from”h]”hŒ*The dma-buf mapping structure to copy from”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jQh´K‹hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj6ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jQh´K‹hj3ubjÛ)�”}”(hŒ/``offset_`` Offset to add to the other mapping ”h]”(já)�”}”(hŒ ``offset_``”h]”j)�”}”(hjuh]”hŒoffset_”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´KŒhjoubjû)�”}”(hhh]”jM)�”}”(hŒ"Offset to add to the other mapping”h]”hŒ"Offset to add to the other mapping”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jŠh´KŒhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jŠh´KŒhj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj°h]”hŒ Description”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´KŽhjubjM)�”}”(hŒêInitializes a new iosys_map struct based on another passed as argument. It does a shallow copy of the struct so it's possible to update the back storage without changing where the original map points to. It is the equivalent of doing:”h]”hŒìInitializes a new iosys_map struct based on another passed as argument. It does a shallow copy of the struct so it’s possible to update the back storage without changing where the original map points to. It is the equivalent of doing:”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K�hjubj})�”}”(hŒ9iosys_map map = other_map; iosys_map_incr(&map, &offset);”h]”hŒ9iosys_map map = other_map; iosys_map_incr(&map, &offset);”…”�”}”hjÕsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K’hjubjM)�”}”(hŒExample usage:”h]”hŒExample usage:”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K—hjubj})�”}”(hŒ¢void foo(struct device *dev, struct iosys_map *base_map) { ... struct iosys_map map = IOSYS_MAP_INIT_OFFSET(base_map, FIELD_OFFSET); ... }”h]”hŒ¢void foo(struct device *dev, struct iosys_map *base_map) { ... struct iosys_map map = IOSYS_MAP_INIT_OFFSET(base_map, FIELD_OFFSET); ... }”…”�”}”hjôsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K™hjubjM)�”}”(hX¢The advantage of using the initializer over just increasing the offset with iosys_map_incr() like above is that the new map will always point to the right place of the buffer during its scope. It reduces the risk of updating the wrong part of the buffer and having no compiler warning about that. If the assignment to IOSYS_MAP_INIT_OFFSET() is forgotten, the compiler can warn about the use of uninitialized variable.”h]”hX¢The advantage of using the initializer over just increasing the offset with iosys_map_incr() like above is that the new map will always point to the right place of the buffer during its scope. It reduces the risk of updating the wrong part of the buffer and having no compiler warning about that. If the assignment to IOSYS_MAP_INIT_OFFSET() is forgotten, the compiler can warn about the use of uninitialized variable.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K¢hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œ iosys_map_set_vaddr (C function)”Œc.iosys_map_set_vaddr”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ=void iosys_map_set_vaddr (struct iosys_map *map, void *vaddr)”h]”j)�”}”(hŒNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ3bool iosys_map_is_set (const struct iosys_map *map)”h]”j)�”}”(hŒ2bool iosys_map_is_set(const struct iosys_map *map)”h]”(j4)�”}”(hjQh]”hŒbool”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj•h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kóubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj•h²hh³j¦h´Kóubj1)�”}”(hŒiosys_map_is_set”h]”j7)�”}”(hŒiosys_map_is_set”h]”hŒiosys_map_is_set”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjµubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj•h²hh³j¦h´Kóubjl)�”}”(hŒ(const struct iosys_map *map)”h]”jr)�”}”(hŒconst struct iosys_map *map”h]”(j)�”}”(hjŽh]”hŒconst”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjÑubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÑubj)�”}”(hjh]”hŒstruct”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjÑubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÑubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jŒmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j»sbŒc.iosys_map_is_set”†”asbuh1hhjÑubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÑubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjÑubj7)�”}”(hŒmap”h]”hŒmap”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjÑubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjÍubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhj•h²hh³j¦h´Kóubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj‘h²hh³j¦h´Kóubah}”(h]”jŒah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j¦h´KóhjŽh²hubjc)�”}”(hhh]”jM)�”}”(hŒ'Tests if the iosys mapping has been set”h]”hŒ'Tests if the iosys mapping has been set”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kóhjph²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjŽh²hh³j¦h´Kóubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j‹j…j‹j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hŒõ**Parameters** ``const struct iosys_map *map`` The iosys_map structure **Description** Depending on the state of struct iosys_map.is_iomem, tests if the mapping has been set. **Return** True if the mapping is been set, or false otherwise.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj•h]”hŒ Parameters”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´K÷hj�ubjÖ)�”}”(hhh]”jÛ)�”}”(hŒ8``const struct iosys_map *map`` The iosys_map structure ”h]”(já)�”}”(hŒ``const struct iosys_map *map``”h]”j)�”}”(hj´h]”hŒconst struct iosys_map *map”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kôhj®ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÉh´KôhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jÉh´Kôhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj�ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjïh]”hŒ Description”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjíubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Köhj�ubjM)�”}”(hŒWDepending on the state of struct iosys_map.is_iomem, tests if the mapping has been set.”h]”hŒWDepending on the state of struct iosys_map.is_iomem, tests if the mapping has been set.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kõhj�ubjM)�”}”(hŒ **Return**”h]”j”)�”}”(hjh]”hŒReturn”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Køhj�ubjM)�”}”(hŒ4True if the mapping is been set, or false otherwise.”h]”hŒ4True if the mapping is been set, or false otherwise.”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Kùhj�ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_clear (C function)”Œc.iosys_map_clear”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ,void iosys_map_clear (struct iosys_map *map)”h]”j)�”}”(hŒ+void iosys_map_clear(struct iosys_map *map)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjWh²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjWh²hh³jih´Mubj1)�”}”(hŒiosys_map_clear”h]”j7)�”}”(hŒiosys_map_clear”h]”hŒiosys_map_clear”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjxubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjWh²hh³jih´Mubjl)�”}”(hŒ(struct iosys_map *map)”h]”jr)�”}”(hŒstruct iosys_map *map”h]”(j)�”}”(hjh]”hŒstruct”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hj”ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj”ubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj³ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j¸Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j~sbŒc.iosys_map_clear”†”asbuh1hhj”ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj”ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhj”ubj7)�”}”(hŒmap”h]”hŒmap”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj”ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj�ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhjWh²hh³jih´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjSh²hh³jih´Mubah}”(h]”jNah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³jih´MhjPh²hubjc)�”}”(hhh]”jM)�”}”(hŒ Clears a iosys mapping structure”h]”hŒ Clears a iosys mapping structure”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjPh²hh³jih´Mubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j3j…j3j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hX **Parameters** ``struct iosys_map *map`` The iosys_map structure **Description** Clears all fields to zero, including struct iosys_map.is_iomem, so mapping structures that were set to point to I/O memory are reset for system memory. Pointers are cleared to NULL. This is the default.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj=h]”hŒ Parameters”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj7ubjÖ)�”}”(hhh]”jÛ)�”}”(hŒ2``struct iosys_map *map`` The iosys_map structure ”h]”(já)�”}”(hŒ``struct iosys_map *map``”h]”j)�”}”(hj\h]”hŒstruct iosys_map *map”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MhjVubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jqh´Mhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jqh´MhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj7ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj—h]”hŒ Description”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj7ubjM)�”}”(hŒÊClears all fields to zero, including struct iosys_map.is_iomem, so mapping structures that were set to point to I/O memory are reset for system memory. Pointers are cleared to NULL. This is the default.”h]”hŒÊClears all fields to zero, including struct iosys_map.is_iomem, so mapping structures that were set to point to I/O memory are reset for system memory. Pointers are cleared to NULL. This is the default.”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj7ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œ iosys_map_memcpy_to (C function)”Œc.iosys_map_memcpy_to”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ`void iosys_map_memcpy_to (struct iosys_map *dst, size_t dst_offset, const void *src, size_t len)”h]”j)�”}”(hŒ_void iosys_map_memcpy_to(struct iosys_map *dst, size_t dst_offset, const void *src, size_t len)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjØh²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjØh²hh³jêh´Mubj1)�”}”(hŒiosys_map_memcpy_to”h]”j7)�”}”(hŒiosys_map_memcpy_to”h]”hŒiosys_map_memcpy_to”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjùubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjØh²hh³jêh´Mubjl)�”}”(hŒG(struct iosys_map *dst, size_t dst_offset, const void *src, size_t len)”h]”(jr)�”}”(hŒstruct iosys_map *dst”h]”(j)�”}”(hjh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj4ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j9Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«jÿsbŒc.iosys_map_memcpy_to”†”asbuh1hhjubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjubj7)�”}”(hŒdst”h]”hŒdst”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjubjr)�”}”(hŒsize_t dst_offset”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj‹ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j�Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”jSŒc.iosys_map_memcpy_to”†”asbuh1hhj‡ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj‡ubj7)�”}”(hŒ dst_offset”h]”hŒ dst_offset”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj‡ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjubjr)�”}”(hŒconst void *src”h]”(j)�”}”(hjŽh]”hŒconst”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjÏubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÏubj4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjÏubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÏubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjÏubj7)�”}”(hŒsrc”h]”hŒsrc”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjÏubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjubjr)�”}”(hŒ size_t len”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj0 ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j5 Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”jSŒc.iosys_map_memcpy_to”†”asbuh1hhj, ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj, ubj7)�”}”(hŒlen”h]”hŒlen”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj, ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhjØh²hh³jêh´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjÔh²hh³jêh´Mubah}”(h]”jÏah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³jêh´MhjÑh²hubjc)�”}”(hhh]”jM)�”}”(hŒMemcpy into offset of iosys_map”h]”hŒMemcpy into offset of iosys_map”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj† h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjÑh²hh³jêh´Mubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j¡ j…j¡ j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hX–**Parameters** ``struct iosys_map *dst`` The iosys_map structure ``size_t dst_offset`` The offset from which to copy ``const void *src`` The source buffer ``size_t len`` The number of byte in src **Description** Copies data into a iosys_map with an offset. The source buffer is in system memory. Depending on the buffer's location, the helper picks the correct method of accessing the memory.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj« h]”hŒ Parameters”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj© ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj¥ ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ2``struct iosys_map *dst`` The iosys_map structure ”h]”(já)�”}”(hŒ``struct iosys_map *dst``”h]”j)�”}”(hjÊ h]”hŒstruct iosys_map *dst”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MhjÄ ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jß h´Mhjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÄ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jß h´MhjÁ ubjÛ)�”}”(hŒ4``size_t dst_offset`` The offset from which to copy ”h]”(já)�”}”(hŒ``size_t dst_offset``”h]”j)�”}”(hj!h]”hŒsize_t dst_offset”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhjý ubjû)�”}”(hhh]”jM)�”}”(hŒThe offset from which to copy”h]”hŒThe offset from which to copy”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j!h´Mhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjý ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j!h´MhjÁ ubjÛ)�”}”(hŒ&``const void *src`` The source buffer ”h]”(já)�”}”(hŒ``const void *src``”h]”j)�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj6!ubjû)�”}”(hhh]”jM)�”}”(hŒThe source buffer”h]”hŒThe source buffer”…”�”}”(hjU!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jQ!h´MhjR!ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj6!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jQ!h´MhjÁ ubjÛ)�”}”(hŒ)``size_t len`` The number of byte in src ”h]”(já)�”}”(hŒ``size_t len``”h]”j)�”}”(hju!h]”hŒ size_t len”…”�”}”(hjw!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjs!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhjo!ubjû)�”}”(hhh]”jM)�”}”(hŒThe number of byte in src”h]”hŒThe number of byte in src”…”�”}”(hjŽ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jŠ!h´Mhj‹!ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjo!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jŠ!h´MhjÁ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¥ ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj°!h]”hŒ Description”…”�”}”(hj²!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj®!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj¥ ubjM)�”}”(hŒ´Copies data into a iosys_map with an offset. The source buffer is in system memory. Depending on the buffer's location, the helper picks the correct method of accessing the memory.”h]”hŒ¶Copies data into a iosys_map with an offset. The source buffer is in system memory. Depending on the buffer’s location, the helper picks the correct method of accessing the memory.”…”�”}”(hjÆ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mhj¥ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œ"iosys_map_memcpy_from (C function)”Œc.iosys_map_memcpy_from”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒbvoid iosys_map_memcpy_from (void *dst, const struct iosys_map *src, size_t src_offset, size_t len)”h]”j)�”}”(hŒavoid iosys_map_memcpy_from(void *dst, const struct iosys_map *src, size_t src_offset, size_t len)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjõ!h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjñ!h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M#ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjñ!h²hh³j"h´M#ubj1)�”}”(hŒiosys_map_memcpy_from”h]”j7)�”}”(hŒiosys_map_memcpy_from”h]”hŒiosys_map_memcpy_from”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj"ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjñ!h²hh³j"h´M#ubjl)�”}”(hŒG(void *dst, const struct iosys_map *src, size_t src_offset, size_t len)”h]”(jr)�”}”(hŒ void *dst”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj2"h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj."ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@"h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj."ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjN"h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhj."ubj7)�”}”(hŒdst”h]”hŒdst”…”�”}”(hj["h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj."ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj*"ubjr)�”}”(hŒconst struct iosys_map *src”h]”(j)�”}”(hjŽh]”hŒconst”…”�”}”(hjt"h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjp"ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�"h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjp"ubj)�”}”(hjh]”hŒstruct”…”�”}”(hj�"h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjp"ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjœ"h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjp"ubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hj­"h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjª"ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j¯"Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j"sbŒc.iosys_map_memcpy_from”†”asbuh1hhjp"ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍ"h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjp"ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjÛ"h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjp"ubj7)�”}”(hŒsrc”h]”hŒsrc”…”�”}”(hjè"h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjp"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj*"ubjr)�”}”(hŒsize_t src_offset”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj#ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j#Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”jÉ"Œc.iosys_map_memcpy_from”†”asbuh1hhjý"ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"#h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjý"ubj7)�”}”(hŒ src_offset”h]”hŒ src_offset”…”�”}”(hj0#h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjý"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj*"ubjr)�”}”(hŒ size_t len”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjL#h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjI#ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jN#Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”jÉ"Œc.iosys_map_memcpy_from”†”asbuh1hhjE#ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjj#h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjE#ubj7)�”}”(hŒlen”h]”hŒlen”…”�”}”(hjx#h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjE#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj*"ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhjñ!h²hh³j"h´M#ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjí!h²hh³j"h´M#ubah}”(h]”jè!ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j"h´M#hjê!h²hubjc)�”}”(hhh]”jM)�”}”(hŒ(Memcpy from iosys_map into system memory”h]”hŒ(Memcpy from iosys_map into system memory”…”�”}”(hj¢#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M#hjŸ#h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjê!h²hh³j"h´M#ubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„jº#j…jº#j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hXž**Parameters** ``void *dst`` Destination in system memory ``const struct iosys_map *src`` The iosys_map structure ``size_t src_offset`` The offset from which to copy ``size_t len`` The number of byte in src **Description** Copies data from a iosys_map with an offset. The dest buffer is in system memory. Depending on the mapping location, the helper picks the correct method of accessing the memory.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hjÄ#h]”hŒ Parameters”…”�”}”(hjÆ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÂ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M'hj¾#ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ+``void *dst`` Destination in system memory ”h]”(já)�”}”(hŒ ``void *dst``”h]”j)�”}”(hjã#h]”hŒ void *dst”…”�”}”(hjå#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjá#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M$hjÝ#ubjû)�”}”(hhh]”jM)�”}”(hŒDestination in system memory”h]”hŒDestination in system memory”…”�”}”(hjü#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jø#h´M$hjù#ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÝ#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jø#h´M$hjÚ#ubjÛ)�”}”(hŒ8``const struct iosys_map *src`` The iosys_map structure ”h]”(já)�”}”(hŒ``const struct iosys_map *src``”h]”j)�”}”(hj$h]”hŒconst struct iosys_map *src”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M%hj$ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hj5$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j1$h´M%hj2$ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j1$h´M%hjÚ#ubjÛ)�”}”(hŒ4``size_t src_offset`` The offset from which to copy ”h]”(já)�”}”(hŒ``size_t src_offset``”h]”j)�”}”(hjU$h]”hŒsize_t src_offset”…”�”}”(hjW$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjS$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M&hjO$ubjû)�”}”(hhh]”jM)�”}”(hŒThe offset from which to copy”h]”hŒThe offset from which to copy”…”�”}”(hjn$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jj$h´M&hjk$ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjO$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jj$h´M&hjÚ#ubjÛ)�”}”(hŒ)``size_t len`` The number of byte in src ”h]”(já)�”}”(hŒ``size_t len``”h]”j)�”}”(hjŽ$h]”hŒ size_t len”…”�”}”(hj�$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒ$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M'hjˆ$ubjû)�”}”(hhh]”jM)�”}”(hŒThe number of byte in src”h]”hŒThe number of byte in src”…”�”}”(hj§$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j£$h´M'hj¤$ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjˆ$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j£$h´M'hjÚ#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¾#ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjÉ$h]”hŒ Description”…”�”}”(hjË$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÇ$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M)hj¾#ubjM)�”}”(hŒ±Copies data from a iosys_map with an offset. The dest buffer is in system memory. Depending on the mapping location, the helper picks the correct method of accessing the memory.”h]”hŒ±Copies data from a iosys_map with an offset. The dest buffer is in system memory. Depending on the mapping location, the helper picks the correct method of accessing the memory.”…”�”}”(hjß$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M(hj¾#ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_incr (C function)”Œc.iosys_map_incr”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ8void iosys_map_incr (struct iosys_map *map, size_t incr)”h]”j)�”}”(hŒ7void iosys_map_incr(struct iosys_map *map, size_t incr)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj %h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M7ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj %h²hh³j%h´M7ubj1)�”}”(hŒiosys_map_incr”h]”j7)�”}”(hŒiosys_map_incr”h]”hŒiosys_map_incr”…”�”}”(hj/%h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj+%ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj %h²hh³j%h´M7ubjl)�”}”(hŒ$(struct iosys_map *map, size_t incr)”h]”(jr)�”}”(hŒstruct iosys_map *map”h]”(j)�”}”(hjh]”hŒstruct”…”�”}”(hjK%h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjG%ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjX%h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjG%ubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hji%h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjf%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jk%Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j1%sbŒc.iosys_map_incr”†”asbuh1hhjG%ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‰%h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjG%ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj—%h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjG%ubj7)�”}”(hŒmap”h]”hŒmap”…”�”}”(hj¤%h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjG%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjC%ubjr)�”}”(hŒ size_t incr”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjÀ%h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj½%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jÂ%Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j…%Œc.iosys_map_incr”†”asbuh1hhj¹%ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞ%h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj¹%ubj7)�”}”(hŒincr”h]”hŒincr”…”�”}”(hjì%h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj¹%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjC%ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhj %h²hh³j%h´M7ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj%h²hh³j%h´M7ubah}”(h]”j%ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j%h´M7hj%h²hubjc)�”}”(hhh]”jM)�”}”(hŒ0Increments the address stored in a iosys mapping”h]”hŒ0Increments the address stored in a iosys mapping”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M7hj&h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj%h²hh³j%h´M7ubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j.&j…j.&j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hX**Parameters** ``struct iosys_map *map`` The iosys_map structure ``size_t incr`` The number of bytes to increment **Description** Increments the address stored in a iosys mapping. Depending on the buffer's location, the correct value will be updated.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj8&h]”hŒ Parameters”…”�”}”(hj:&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj6&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M;hj2&ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ2``struct iosys_map *map`` The iosys_map structure ”h]”(já)�”}”(hŒ``struct iosys_map *map``”h]”j)�”}”(hjW&h]”hŒstruct iosys_map *map”…”�”}”(hjY&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjU&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M8hjQ&ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjp&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jl&h´M8hjm&ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjQ&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jl&h´M8hjN&ubjÛ)�”}”(hŒ1``size_t incr`` The number of bytes to increment ”h]”(já)�”}”(hŒ``size_t incr``”h]”j)�”}”(hj�&h]”hŒ size_t incr”…”�”}”(hj’&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M9hjŠ&ubjû)�”}”(hhh]”jM)�”}”(hŒ The number of bytes to increment”h]”hŒ The number of bytes to increment”…”�”}”(hj©&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¥&h´M9hj¦&ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjŠ&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j¥&h´M9hjN&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj2&ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjË&h]”hŒ Description”…”�”}”(hjÍ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÉ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M;hj2&ubjM)�”}”(hŒxIncrements the address stored in a iosys mapping. Depending on the buffer's location, the correct value will be updated.”h]”hŒzIncrements the address stored in a iosys mapping. Depending on the buffer’s location, the correct value will be updated.”…”�”}”(hjá&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M:hj2&ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_memset (C function)”Œc.iosys_map_memset”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒSvoid iosys_map_memset (struct iosys_map *dst, size_t offset, int value, size_t len)”h]”j)�”}”(hŒRvoid iosys_map_memset(struct iosys_map *dst, size_t offset, int value, size_t len)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj 'h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MGubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj 'h²hh³j'h´MGubj1)�”}”(hŒiosys_map_memset”h]”j7)�”}”(hŒiosys_map_memset”h]”hŒiosys_map_memset”…”�”}”(hj1'h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj-'ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj 'h²hh³j'h´MGubjl)�”}”(hŒ=(struct iosys_map *dst, size_t offset, int value, size_t len)”h]”(jr)�”}”(hŒstruct iosys_map *dst”h]”(j)�”}”(hjh]”hŒstruct”…”�”}”(hjM'h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjI'ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjZ'h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjI'ubh)�”}”(hhh]”j7)�”}”(hŒ iosys_map”h]”hŒ iosys_map”…”�”}”(hjk'h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjh'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jm'Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j3'sbŒc.iosys_map_memset”†”asbuh1hhjI'ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‹'h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjI'ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj™'h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjI'ubj7)�”}”(hŒdst”h]”hŒdst”…”�”}”(hj¦'h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjI'ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjE'ubjr)�”}”(hŒ size_t offset”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjÂ'h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj¿'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jÄ'Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j‡'Œc.iosys_map_memset”†”asbuh1hhj»'ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjà'h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj»'ubj7)�”}”(hŒoffset”h]”hŒoffset”…”�”}”(hjî'h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj»'ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjE'ubjr)�”}”(hŒ int value”h]”(j4)�”}”(hŒint”h]”hŒint”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj(ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj(ubj7)�”}”(hŒvalue”h]”hŒvalue”…”�”}”(hj#(h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj(ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjE'ubjr)�”}”(hŒ size_t len”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj?(h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj<(ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jA(Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j‡'Œc.iosys_map_memset”†”asbuh1hhj8(ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj](h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj8(ubj7)�”}”(hŒlen”h]”hŒlen”…”�”}”(hjk(h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj8(ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjE'ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhj 'h²hh³j'h´MGubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj'h²hh³j'h´MGubah}”(h]”j'ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j'h´MGhj'h²hubjc)�”}”(hhh]”jM)�”}”(hŒMemset iosys_map”h]”hŒMemset iosys_map”…”�”}”(hj•(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MGhj’(h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj'h²hh³j'h´MGubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j­(j…j­(j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjŠ)�”}”(hXf**Parameters** ``struct iosys_map *dst`` The iosys_map structure ``size_t offset`` Offset from dst where to start setting value ``int value`` The value to set ``size_t len`` The number of bytes to set in dst **Description** Set value in iosys_map. Depending on the buffer's location, the helper picks the correct method of accessing the memory.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj·(h]”hŒ Parameters”…”�”}”(hj¹(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjµ(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MKhj±(ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ2``struct iosys_map *dst`` The iosys_map structure ”h]”(já)�”}”(hŒ``struct iosys_map *dst``”h]”j)�”}”(hjÖ(h]”hŒstruct iosys_map *dst”…”�”}”(hjØ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÔ(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MHhjÐ(ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjï(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jë(h´MHhjì(ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÐ(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jë(h´MHhjÍ(ubjÛ)�”}”(hŒ?``size_t offset`` Offset from dst where to start setting value ”h]”(já)�”}”(hŒ``size_t offset``”h]”j)�”}”(hj)h]”hŒ size_t offset”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj )ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MIhj )ubjû)�”}”(hhh]”jM)�”}”(hŒ,Offset from dst where to start setting value”h]”hŒ,Offset from dst where to start setting value”…”�”}”(hj()h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j$)h´MIhj%)ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj )ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j$)h´MIhjÍ(ubjÛ)�”}”(hŒ``int value`` The value to set ”h]”(já)�”}”(hŒ ``int value``”h]”j)�”}”(hjH)h]”hŒ int value”…”�”}”(hjJ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjF)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MJhjB)ubjû)�”}”(hhh]”jM)�”}”(hŒThe value to set”h]”hŒThe value to set”…”�”}”(hja)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j])h´MJhj^)ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjB)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j])h´MJhjÍ(ubjÛ)�”}”(hŒ1``size_t len`` The number of bytes to set in dst ”h]”(já)�”}”(hŒ``size_t len``”h]”j)�”}”(hj�)h]”hŒ size_t len”…”�”}”(hjƒ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MKhj{)ubjû)�”}”(hhh]”jM)�”}”(hŒ!The number of bytes to set in dst”h]”hŒ!The number of bytes to set in dst”…”�”}”(hjš)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j–)h´MKhj—)ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj{)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j–)h´MKhjÍ(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj±(ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj¼)h]”hŒ Description”…”�”}”(hj¾)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjº)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MMhj±(ubjM)�”}”(hŒxSet value in iosys_map. Depending on the buffer's location, the helper picks the correct method of accessing the memory.”h]”hŒzSet value in iosys_map. Depending on the buffer’s location, the helper picks the correct method of accessing the memory.”…”�”}”(hjÒ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MLhj±(ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_rd (C macro)”Œc.iosys_map_rd”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ iosys_map_rd”h]”j)�”}”(hŒ iosys_map_rd”h]”j1)�”}”(hŒ iosys_map_rd”h]”j7)�”}”(hjû)h]”hŒ iosys_map_rd”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj*ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjý)h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mxubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjù)h²hh³j*h´Mxubah}”(h]”jô)ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j*h´Mxhjö)h²hubjc)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jbhjö)h²hh³j*h´Mxubeh}”(h]”h ]”(j� Œmacro”eh"]”h$]”h&]”jƒj� j„j1*j…j1*j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjM)�”}”(hŒ*``iosys_map_rd (map__, offset__, type__)``”h]”j)�”}”(hj7*h]”hŒ&iosys_map_rd (map__, offset__, type__)”…”�”}”(hj9*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj5*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mzhj_ h²hubjß)�”}”(hŒ'Read a C-type value from the iosys_map ”h]”jM)�”}”(hŒ&Read a C-type value from the iosys_map”h]”hŒ&Read a C-type value from the iosys_map”…”�”}”(hjQ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MxhjM*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³j_*h´Mxhj_ h²hubjŠ)�”}”(hX…**Parameters** ``map__`` The iosys_map structure ``offset__`` The offset from which to read ``type__`` Type of the value being read **Description** Read a C type value (u8, u16, u32 and u64) from iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_from(). **Return** The value read from the mapping.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hjl*h]”hŒ Parameters”…”�”}”(hjn*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M|hjf*ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ"``map__`` The iosys_map structure ”h]”(já)�”}”(hŒ ``map__``”h]”j)�”}”(hj‹*h]”hŒmap__”…”�”}”(hj�*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mzhj…*ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hj¤*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j *h´Mzhj¡*ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj…*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j *h´Mzhj‚*ubjÛ)�”}”(hŒ+``offset__`` The offset from which to read ”h]”(já)�”}”(hŒ ``offset__``”h]”j)�”}”(hjÄ*h]”hŒoffset__”…”�”}”(hjÆ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÂ*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M{hj¾*ubjû)�”}”(hhh]”jM)�”}”(hŒThe offset from which to read”h]”hŒThe offset from which to read”…”�”}”(hjÝ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÙ*h´M{hjÚ*ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¾*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jÙ*h´M{hj‚*ubjÛ)�”}”(hŒ(``type__`` Type of the value being read ”h]”(já)�”}”(hŒ ``type__``”h]”j)�”}”(hjý*h]”hŒtype__”…”�”}”(hjÿ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjû*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M|hj÷*ubjû)�”}”(hhh]”jM)�”}”(hŒType of the value being read”h]”hŒType of the value being read”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j+h´M|hj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj÷*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j+h´M|hj‚*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjf*ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj8+h]”hŒ Description”…”�”}”(hj:+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj6+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M~hjf*ubjM)�”}”(hŒ¸Read a C type value (u8, u16, u32 and u64) from iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_from().”h]”hŒ¸Read a C type value (u8, u16, u32 and u64) from iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_from().”…”�”}”(hjN+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M}hjf*ubjM)�”}”(hŒ **Return**”h]”j”)�”}”(hj_+h]”hŒReturn”…”�”}”(hja+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj]+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M�hjf*ubjM)�”}”(hŒ The value read from the mapping.”h]”hŒ The value read from the mapping.”…”�”}”(hju+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M‚hjf*ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_wr (C macro)”Œc.iosys_map_wr”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ iosys_map_wr”h]”j)�”}”(hŒ iosys_map_wr”h]”j1)�”}”(hŒ iosys_map_wr”h]”j7)�”}”(hjž+h]”hŒ iosys_map_wr”…”�”}”(hj¨+h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj¤+ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj +h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M�ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjœ+h²hh³j»+h´M�ubah}”(h]”j—+ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j»+h´M�hj™+h²hubjc)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jbhj™+h²hh³j»+h´M�ubeh}”(h]”h ]”(j� Œmacro”eh"]”h$]”h&]”jƒj� j„jÔ+j…jÔ+j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjM)�”}”(hŒ1``iosys_map_wr (map__, offset__, type__, val__)``”h]”j)�”}”(hjÚ+h]”hŒ-iosys_map_wr (map__, offset__, type__, val__)”…”�”}”(hjÜ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjØ+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M’hj_ h²hubjß)�”}”(hŒ&Write a C-type value to the iosys_map ”h]”jM)�”}”(hŒ%Write a C-type value to the iosys_map”h]”hŒ%Write a C-type value to the iosys_map”…”�”}”(hjô+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M�hjð+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³j,h´M�hj_ h²hubjŠ)�”}”(hX€**Parameters** ``map__`` The iosys_map structure ``offset__`` The offset from the mapping to write to ``type__`` Type of the value being written ``val__`` Value to write **Description** Write a C type value (u8, u16, u32 and u64) to the iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_to()”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj,h]”hŒ Parameters”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj ,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M”hj ,ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ"``map__`` The iosys_map structure ”h]”(já)�”}”(hŒ ``map__``”h]”j)�”}”(hj.,h]”hŒmap__”…”�”}”(hj0,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj,,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M’hj(,ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjG,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jC,h´M’hjD,ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj(,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jC,h´M’hj%,ubjÛ)�”}”(hŒ5``offset__`` The offset from the mapping to write to ”h]”(já)�”}”(hŒ ``offset__``”h]”j)�”}”(hjg,h]”hŒoffset__”…”�”}”(hji,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhje,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M“hja,ubjû)�”}”(hhh]”jM)�”}”(hŒ'The offset from the mapping to write to”h]”hŒ'The offset from the mapping to write to”…”�”}”(hj€,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j|,h´M“hj},ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhja,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j|,h´M“hj%,ubjÛ)�”}”(hŒ+``type__`` Type of the value being written ”h]”(já)�”}”(hŒ ``type__``”h]”j)�”}”(hj ,h]”hŒtype__”…”�”}”(hj¢,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjž,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M”hjš,ubjû)�”}”(hhh]”jM)�”}”(hŒType of the value being written”h]”hŒType of the value being written”…”�”}”(hj¹,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jµ,h´M”hj¶,ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjš,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jµ,h´M”hj%,ubjÛ)�”}”(hŒ``val__`` Value to write ”h]”(já)�”}”(hŒ ``val__``”h]”j)�”}”(hjÙ,h]”hŒval__”…”�”}”(hjÛ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj×,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M•hjÓ,ubjû)�”}”(hhh]”jM)�”}”(hŒValue to write”h]”hŒValue to write”…”�”}”(hjò,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jî,h´M•hjï,ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÓ,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jî,h´M•hj%,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj ,ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj-h]”hŒ Description”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M—hj ,ubjM)�”}”(hŒ¸Write a C type value (u8, u16, u32 and u64) to the iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_to()”h]”hŒ¸Write a C type value (u8, u16, u32 and u64) to the iosys_map. For other types or if pointer may be unaligned (and problematic for the architecture supported), use iosys_map_memcpy_to()”…”�”}”(hj*-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M–hj ,ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_rd_field (C macro)”Œc.iosys_map_rd_field”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒiosys_map_rd_field”h]”j)�”}”(hŒiosys_map_rd_field”h]”j1)�”}”(hŒiosys_map_rd_field”h]”j7)�”}”(hjS-h]”hŒiosys_map_rd_field”…”�”}”(hj]-h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjY-ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjU-h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M¥ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjQ-h²hh³jp-h´M¥ubah}”(h]”jL-ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³jp-h´M¥hjN-h²hubjc)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jbhjN-h²hh³jp-h´M¥ubeh}”(h]”h ]”(j� Œmacro”eh"]”h$]”h&]”jƒj� j„j‰-j…j‰-j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjM)�”}”(hŒG``iosys_map_rd_field (map__, struct_offset__, struct_type__, field__)``”h]”j)�”}”(hj�-h]”hŒCiosys_map_rd_field (map__, struct_offset__, struct_type__, field__)”…”�”}”(hj‘-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M§hj_ h²hubjß)�”}”(hŒ-Read a member from a struct in the iosys_map ”h]”jM)�”}”(hŒ,Read a member from a struct in the iosys_map”h]”hŒ,Read a member from a struct in the iosys_map”…”�”}”(hj©-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M¥hj¥-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³j·-h´M¥hj_ h²hubjŠ)�”}”(hX0 **Parameters** ``map__`` The iosys_map structure ``struct_offset__`` Offset from the beginning of the map, where the struct is located ``struct_type__`` The struct describing the layout of the mapping ``field__`` Member of the struct to read **Description** Read a value from iosys_map considering its layout is described by a C struct starting at **struct_offset__**. The field offset and size is calculated and its value read. If the field access would incur in un-aligned access, then either iosys_map_memcpy_from() needs to be used or the architecture must support it. For example: suppose there is a **struct** foo defined as below and the value ``foo.field2.inner2`` needs to be read from the iosys_map: .. code-block:: c struct foo { int field1; struct { int inner1; int inner2; } field2; int field3; } __packed; This is the expected memory layout of a buffer using iosys_map_rd_field(): +------------------------------+--------------------------+ | Address | Content | +==============================+==========================+ | buffer + 0000 | start of mmapped buffer | | | pointed by iosys_map | +------------------------------+--------------------------+ | ... | ... | +------------------------------+--------------------------+ | buffer + ``struct_offset__`` | start of ``struct foo`` | +------------------------------+--------------------------+ | ... | ... | +------------------------------+--------------------------+ | buffer + wwww | ``foo.field2.inner2`` | +------------------------------+--------------------------+ | ... | ... | +------------------------------+--------------------------+ | buffer + yyyy | end of ``struct foo`` | +------------------------------+--------------------------+ | ... | ... | +------------------------------+--------------------------+ | buffer + zzzz | end of mmaped buffer | +------------------------------+--------------------------+ Values automatically calculated by this macro or not needed are denoted by wwww, yyyy and zzzz. This is the code to read that value: .. code-block:: c x = iosys_map_rd_field(&map, offset, struct foo, field2.inner2); **Return** The value read from the mapping.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hjÄ-h]”hŒ Parameters”…”�”}”(hjÆ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÂ-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M©hj¾-ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ"``map__`` The iosys_map structure ”h]”(já)�”}”(hŒ ``map__``”h]”j)�”}”(hjã-h]”hŒmap__”…”�”}”(hjå-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjá-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M§hjÝ-ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjü-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jø-h´M§hjù-ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÝ-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jø-h´M§hjÚ-ubjÛ)�”}”(hŒV``struct_offset__`` Offset from the beginning of the map, where the struct is located ”h]”(já)�”}”(hŒ``struct_offset__``”h]”j)�”}”(hj.h]”hŒstruct_offset__”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M©hj.ubjû)�”}”(hhh]”jM)�”}”(hŒAOffset from the beginning of the map, where the struct is located”h]”hŒAOffset from the beginning of the map, where the struct is located”…”�”}”(hj5.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M¨hj2.ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j1.h´M©hjÚ-ubjÛ)�”}”(hŒB``struct_type__`` The struct describing the layout of the mapping ”h]”(já)�”}”(hŒ``struct_type__``”h]”j)�”}”(hjV.h]”hŒ struct_type__”…”�”}”(hjX.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjT.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MªhjP.ubjû)�”}”(hhh]”jM)�”}”(hŒ/The struct describing the layout of the mapping”h]”hŒ/The struct describing the layout of the mapping”…”�”}”(hjo.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jk.h´Mªhjl.ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjP.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jk.h´MªhjÚ-ubjÛ)�”}”(hŒ)``field__`` Member of the struct to read ”h]”(já)�”}”(hŒ ``field__``”h]”j)�”}”(hj�.h]”hŒfield__”…”�”}”(hj‘.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M«hj‰.ubjû)�”}”(hhh]”jM)�”}”(hŒMember of the struct to read”h]”hŒMember of the struct to read”…”�”}”(hj¨.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¤.h´M«hj¥.ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‰.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j¤.h´M«hjÚ-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj¾-ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjÊ.h]”hŒ Description”…”�”}”(hjÌ.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÈ.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M­hj¾-ubjM)�”}”(hXÃRead a value from iosys_map considering its layout is described by a C struct starting at **struct_offset__**. The field offset and size is calculated and its value read. If the field access would incur in un-aligned access, then either iosys_map_memcpy_from() needs to be used or the architecture must support it. For example: suppose there is a **struct** foo defined as below and the value ``foo.field2.inner2`` needs to be read from the iosys_map:”h]”(hŒZRead a value from iosys_map considering its layout is described by a C struct starting at ”…”�”}”(hjà.h²hh³Nh´Nubj”)�”}”(hŒ**struct_offset__**”h]”hŒstruct_offset__”…”�”}”(hjè.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjà.ubhŒî. The field offset and size is calculated and its value read. If the field access would incur in un-aligned access, then either iosys_map_memcpy_from() needs to be used or the architecture must support it. For example: suppose there is a ”…”�”}”(hjà.h²hh³Nh´Nubj”)�”}”(hŒ **struct**”h]”hŒstruct”…”�”}”(hjú.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjà.ubhŒ$ foo defined as below and the value ”…”�”}”(hjà.h²hh³Nh´Nubj)�”}”(hŒ``foo.field2.inner2``”h]”hŒfoo.field2.inner2”…”�”}”(hj /h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjà.ubhŒ% needs to be read from the iosys_map:”…”�”}”(hjà.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M¬hj¾-ubj})�”}”(hŒ›struct foo { int field1; struct { int inner1; int inner2; } field2; int field3; } __packed;”h]”hŒ›struct foo { int field1; struct { int inner1; int inner2; } field2; int field3; } __packed;”…”�”}”hj%/sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M³hj¾-ubjM)�”}”(hŒJThis is the expected memory layout of a buffer using iosys_map_rd_field():”h]”hŒJThis is the expected memory layout of a buffer using iosys_map_rd_field():”…”�”}”(hj5/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M¾hj¾-ubj) )�”}”(hhh]”j. )�”}”(hhh]”(j3 )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j2 hjG/ubj3 )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j2 hjG/ubhŒthead”“”)�”}”(hhh]”jN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒAddress”h]”hŒAddress”…”�”}”(hji/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÁhjf/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjc/ubjS )�”}”(hhh]”jM)�”}”(hŒContent”h]”hŒContent”…”�”}”(hj�/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jw/h´MÁhj~/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjc/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj`/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j^/hjG/ubjI )�”}”(hhh]”(jN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ buffer + 0000”h]”hŒ buffer + 0000”…”�”}”(hjª/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÃhj§/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj¤/ubjS )�”}”(hhh]”jM)�”}”(hŒ,start of mmapped buffer pointed by iosys_map”h]”hŒ,start of mmapped buffer pointed by iosys_map”…”�”}”(hjÂ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¸/h´MÃhj¿/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj¤/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hjâ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”•—¶h´MÆhjß/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjÜ/ubjS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hjú/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jð/h´MÆhj÷/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjÜ/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒbuffer + ``struct_offset__``”h]”(hŒ buffer + ”…”�”}”(hj0h²hh³Nh´Nubj)�”}”(hŒ``struct_offset__``”h]”hŒstruct_offset__”…”�”}”(hj"0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÈhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj0ubjS )�”}”(hhh]”jM)�”}”(hŒstart of ``struct foo``”h]”(hŒ start of ”…”�”}”(hj@0h²hh³Nh´Nubj)�”}”(hŒ``struct foo``”h]”hŒ struct foo”…”�”}”(hjH0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj@0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j60h´MÈhj=0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hjn0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÊhjk0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjh0ubjS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hj†0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j|0h´MÊhjƒ0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjh0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ buffer + wwww”h]”hŒ buffer + wwww”…”�”}”(hj¦0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÌhj£0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj 0ubjS )�”}”(hhh]”jM)�”}”(hŒ``foo.field2.inner2``”h]”j)�”}”(hjÀ0h]”hŒfoo.field2.inner2”…”�”}”(hjÂ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¾0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j´0h´MÌhj»0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj 0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hjç0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÎhjä0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjá0ubjS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hjÿ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jõ0h´MÎhjü0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hjá0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ buffer + yyyy”h]”hŒ buffer + yyyy”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÐhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj1ubjS )�”}”(hhh]”jM)�”}”(hŒend of ``struct foo``”h]”(hŒend of ”…”�”}”(hj71h²hh³Nh´Nubj)�”}”(hŒ``struct foo``”h]”hŒ struct foo”…”�”}”(hj?1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj71ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j-1h´MÐhj41ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hje1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÒhjb1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj_1ubjS )�”}”(hhh]”jM)�”}”(hŒ...”h]”hŒ...”…”�”}”(hj}1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³js1h´MÒhjz1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj_1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubjN )�”}”(hhh]”(jS )�”}”(hhh]”jM)�”}”(hŒ buffer + zzzz”h]”hŒ buffer + zzzz”…”�”}”(hj�1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÔhjš1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj—1ubjS )�”}”(hhh]”jM)�”}”(hŒend of mmaped buffer”h]”hŒend of mmaped buffer”…”�”}”(hjµ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j«1h´MÔhj²1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jR hj—1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jM hj¡/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jH hjG/ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j- hjD/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j( hj¾-ubjM)�”}”(hŒ„Values automatically calculated by this macro or not needed are denoted by wwww, yyyy and zzzz. This is the code to read that value:”h]”hŒ„Values automatically calculated by this macro or not needed are denoted by wwww, yyyy and zzzz. This is the code to read that value:”…”�”}”(hjâ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´M×hj¾-ubj})�”}”(hŒ@x = iosys_map_rd_field(&map, offset, struct foo, field2.inner2);”h]”hŒ@x = iosys_map_rd_field(&map, offset, struct foo, field2.inner2);”…”�”}”hjñ1sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj� ‰jŽ j� j� }”uh1j|h³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÚhj¾-ubjM)�”}”(hŒ **Return**”h]”j”)�”}”(hj2h]”hŒReturn”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MÞhj¾-ubjM)�”}”(hŒ The value read from the mapping.”h]”hŒ The value read from the mapping.”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mßhj¾-ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosys_map_wr_field (C macro)”Œc.iosys_map_wr_field”hNt”auh1jë hj_ h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒiosys_map_wr_field”h]”j)�”}”(hŒiosys_map_wr_field”h]”j1)�”}”(hŒiosys_map_wr_field”h]”j7)�”}”(hjB2h]”hŒiosys_map_wr_field”…”�”}”(hjL2h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjH2ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjD2h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Méubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj@2h²hh³j_2h´Méubah}”(h]”j;2ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j_2h´Méhj=2h²hubjc)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jbhj=2h²hh³j_2h´Méubeh}”(h]”h ]”(j� Œmacro”eh"]”h$]”h&]”jƒj� j„jx2j…jx2j†‰j‡‰jˆ‰uh1jü h²hhj_ h³Nh´NubjM)�”}”(hŒN``iosys_map_wr_field (map__, struct_offset__, struct_type__, field__, val__)``”h]”j)�”}”(hj~2h]”hŒJiosys_map_wr_field (map__, struct_offset__, struct_type__, field__, val__)”…”�”}”(hj€2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mëhj_ h²hubjß)�”}”(hŒ/Write to a member of a struct in the iosys_map ”h]”jM)�”}”(hŒ.Write to a member of a struct in the iosys_map”h]”hŒ.Write to a member of a struct in the iosys_map”…”�”}”(hj˜2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Méhj”2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³j¦2h´Méhj_ h²hubjŠ)�”}”(hX·**Parameters** ``map__`` The iosys_map structure ``struct_offset__`` Offset from the beginning of the map, where the struct is located ``struct_type__`` The struct describing the layout of the mapping ``field__`` Member of the struct to read ``val__`` Value to write **Description** Write a value to the iosys_map considering its layout is described by a C struct starting at **struct_offset__**. The field offset and size is calculated and the **val__** is written. If the field access would incur in un-aligned access, then either iosys_map_memcpy_to() needs to be used or the architecture must support it. Refer to iosys_map_rd_field() for expected usage and memory layout.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj³2h]”hŒ Parameters”…”�”}”(hjµ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj±2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Míhj­2ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ"``map__`` The iosys_map structure ”h]”(já)�”}”(hŒ ``map__``”h]”j)�”}”(hjÒ2h]”hŒmap__”…”�”}”(hjÔ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÐ2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´MëhjÌ2ubjû)�”}”(hhh]”jM)�”}”(hŒThe iosys_map structure”h]”hŒThe iosys_map structure”…”�”}”(hjë2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jç2h´Mëhjè2ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÌ2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jç2h´MëhjÉ2ubjÛ)�”}”(hŒV``struct_offset__`` Offset from the beginning of the map, where the struct is located ”h]”(já)�”}”(hŒ``struct_offset__``”h]”j)�”}”(hj 3h]”hŒstruct_offset__”…”�”}”(hj 3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj 3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Míhj3ubjû)�”}”(hhh]”jM)�”}”(hŒAOffset from the beginning of the map, where the struct is located”h]”hŒAOffset from the beginning of the map, where the struct is located”…”�”}”(hj$3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mìhj!3ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j 3h´MíhjÉ2ubjÛ)�”}”(hŒB``struct_type__`` The struct describing the layout of the mapping ”h]”(já)�”}”(hŒ``struct_type__``”h]”j)�”}”(hjE3h]”hŒ struct_type__”…”�”}”(hjG3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjC3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mîhj?3ubjû)�”}”(hhh]”jM)�”}”(hŒ/The struct describing the layout of the mapping”h]”hŒ/The struct describing the layout of the mapping”…”�”}”(hj^3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jZ3h´Mîhj[3ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj?3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jZ3h´MîhjÉ2ubjÛ)�”}”(hŒ)``field__`` Member of the struct to read ”h]”(já)�”}”(hŒ ``field__``”h]”j)�”}”(hj~3h]”hŒfield__”…”�”}”(hj€3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mïhjx3ubjû)�”}”(hhh]”jM)�”}”(hŒMember of the struct to read”h]”hŒMember of the struct to read”…”�”}”(hj—3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j“3h´Mïhj”3ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjx3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j“3h´MïhjÉ2ubjÛ)�”}”(hŒ``val__`` Value to write ”h]”(já)�”}”(hŒ ``val__``”h]”j)�”}”(hj·3h]”hŒval__”…”�”}”(hj¹3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mðhj±3ubjû)�”}”(hhh]”jM)�”}”(hŒValue to write”h]”hŒValue to write”…”�”}”(hjÐ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÌ3h´MðhjÍ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj±3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jÌ3h´MðhjÉ2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj­2ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjò3h]”hŒ Description”…”�”}”(hjô3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjð3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mòhj­2ubjM)�”}”(hX‰Write a value to the iosys_map considering its layout is described by a C struct starting at **struct_offset__**. The field offset and size is calculated and the **val__** is written. If the field access would incur in un-aligned access, then either iosys_map_memcpy_to() needs to be used or the architecture must support it. Refer to iosys_map_rd_field() for expected usage and memory layout.”h]”(hŒ]Write a value to the iosys_map considering its layout is described by a C struct starting at ”…”�”}”(hj4h²hh³Nh´Nubj”)�”}”(hŒ**struct_offset__**”h]”hŒstruct_offset__”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj4ubhŒ2. The field offset and size is calculated and the ”…”�”}”(hj4h²hh³Nh´Nubj”)�”}”(hŒ **val__**”h]”hŒval__”…”�”}”(hj"4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj4ubhŒÞ is written. If the field access would incur in un-aligned access, then either iosys_map_memcpy_to() needs to be used or the architecture must support it. Refer to iosys_map_rd_field() for expected usage and memory layout.”…”�”}”(hj4h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”h´Mñhj­2ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hj_ h²hh³Nh´Nubeh}”(h]”Œ,generalizing-access-to-system-and-i-o-memory”ah ]”h"]”Œ,generalizing access to system and i/o memory”ah$]”h&]”uh1jhjh²hh³hÇh´Mûubj)�”}”(hhh]”(j)�”}”(hŒPublic Functions Provided”h]”hŒPublic Functions Provided”…”�”}”(hjM4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJ4h²hh³hÇh´Mubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œvirt_to_phys (C function)”Œc.virt_to_phys”hNt”auh1jë hjJ4h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ1phys_addr_t virt_to_phys (volatile void *address)”h]”j)�”}”(hŒ0phys_addr_t virt_to_phys(volatile void *address)”h]”(h)�”}”(hhh]”j7)�”}”(hŒ phys_addr_t”h]”hŒ phys_addr_t”…”�”}”(hjw4h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjt4ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jy4Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«Œ virt_to_phys”sbŒc.virt_to_phys”†”asbuh1hhjp4h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kuubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj™4h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjp4h²hh³j˜4h´Kuubj1)�”}”(hŒ virt_to_phys”h]”j7)�”}”(hj•4h]”hŒ virt_to_phys”…”�”}”(hj«4h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj§4ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjp4h²hh³j˜4h´Kuubjl)�”}”(hŒ(volatile void *address)”h]”jr)�”}”(hŒvolatile void *address”h]”(j)�”}”(hŒvolatile”h]”hŒvolatile”…”�”}”(hjÆ4h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hjÂ4ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÔ4h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÂ4ubj4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjâ4h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjÂ4ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjð4h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjÂ4ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjþ4h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjÂ4ubj7)�”}”(hŒaddress”h]”hŒaddress”…”�”}”(hj 5h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjÂ4ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhj¾4ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhjp4h²hh³j˜4h´Kuubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhjl4h²hh³j˜4h´Kuubah}”(h]”jg4ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j˜4h´Kuhji4h²hubjc)�”}”(hhh]”jM)�”}”(hŒ!map virtual addresses to physical”h]”hŒ!map virtual addresses to physical”…”�”}”(hj55h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kuhj25h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhji4h²hh³j˜4h´Kuubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„jM5j…jM5j†‰j‡‰jˆ‰uh1jü h²hhjJ4h³Nh´NubjŠ)�”}”(hX³**Parameters** ``volatile void *address`` address to remap **Description** The returned physical address is the physical (CPU) mapping for the memory address given. It is only valid to use this function on addresses directly mapped or allocated via kmalloc. This function does not give bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hjW5h]”hŒ Parameters”…”�”}”(hjY5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjU5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KyhjQ5ubjÖ)�”}”(hhh]”jÛ)�”}”(hŒ,``volatile void *address`` address to remap ”h]”(já)�”}”(hŒ``volatile void *address``”h]”j)�”}”(hjv5h]”hŒvolatile void *address”…”�”}”(hjx5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjt5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kvhjp5ubjû)�”}”(hhh]”jM)�”}”(hŒaddress to remap”h]”hŒaddress to remap”…”�”}”(hj�5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j‹5h´KvhjŒ5ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjp5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j‹5h´Kvhjm5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjQ5ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj±5h]”hŒ Description”…”�”}”(hj³5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj¯5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KxhjQ5ubjß)�”}”(hXEThe returned physical address is the physical (CPU) mapping for the memory address given. It is only valid to use this function on addresses directly mapped or allocated via kmalloc. This function does not give bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”(jM)�”}”(hŒ¶The returned physical address is the physical (CPU) mapping for the memory address given. It is only valid to use this function on addresses directly mapped or allocated via kmalloc.”h]”hŒ¶The returned physical address is the physical (CPU) mapping for the memory address given. It is only valid to use this function on addresses directly mapped or allocated via kmalloc.”…”�”}”(hjË5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KwhjÇ5ubjM)�”}”(hŒ�This function does not give bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”hŒ�This function does not give bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”…”�”}”(hjÚ5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K{hjÇ5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³jÙ5h´KwhjQ5ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hjJ4h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œphys_to_virt (C function)”Œc.phys_to_virt”hNt”auh1jë hjJ4h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒ)void * phys_to_virt (phys_addr_t address)”h]”j)�”}”(hŒ'void *phys_to_virt(phys_addr_t address)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj 6h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kˆubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj 6h²hh³j6h´KˆubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj,6h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhj 6h²hh³j6h´Kˆubj1)�”}”(hŒ phys_to_virt”h]”j7)�”}”(hŒ phys_to_virt”h]”hŒ phys_to_virt”…”�”}”(hj=6h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj96ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj 6h²hh³j6h´Kˆubjl)�”}”(hŒ(phys_addr_t address)”h]”jr)�”}”(hŒphys_addr_t address”h]”(h)�”}”(hhh]”j7)�”}”(hŒ phys_addr_t”h]”hŒ phys_addr_t”…”�”}”(hj\6h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjY6ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j^6Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«j?6sbŒc.phys_to_virt”†”asbuh1hhjU6ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj|6h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjU6ubj7)�”}”(hŒaddress”h]”hŒaddress”…”�”}”(hjŠ6h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjU6ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjQ6ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhj 6h²hh³j6h´Kˆubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj6h²hh³j6h´Kˆubah}”(h]”j6ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j6h´Kˆhj6h²hubjc)�”}”(hhh]”jM)�”}”(hŒmap physical address to virtual”h]”hŒmap physical address to virtual”…”�”}”(hj´6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kˆhj±6h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj6h²hh³j6h´Kˆubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„jÌ6j…jÌ6j†‰j‡‰jˆ‰uh1jü h²hhjJ4h³Nh´NubjŠ)�”}”(hX�**Parameters** ``phys_addr_t address`` address to remap **Description** The returned virtual address is a current CPU mapping for the memory address given. It is only valid to use this function on addresses that have a kernel mapping This function does not handle bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hjÖ6h]”hŒ Parameters”…”�”}”(hjØ6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÔ6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KŒhjÐ6ubjÖ)�”}”(hhh]”jÛ)�”}”(hŒ)``phys_addr_t address`` address to remap ”h]”(já)�”}”(hŒ``phys_addr_t address``”h]”j)�”}”(hjõ6h]”hŒphys_addr_t address”…”�”}”(hj÷6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjó6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K‰hjï6ubjû)�”}”(hhh]”jM)�”}”(hŒaddress to remap”h]”hŒaddress to remap”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j 7h´K‰hj 7ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjï6ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j 7h´K‰hjì6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÕhjÐ6ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hj07h]”hŒ Description”…”�”}”(hj27h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj.7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K‹hjÐ6ubjß)�”}”(hX2The returned virtual address is a current CPU mapping for the memory address given. It is only valid to use this function on addresses that have a kernel mapping This function does not handle bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”(jM)�”}”(hŒ¡The returned virtual address is a current CPU mapping for the memory address given. It is only valid to use this function on addresses that have a kernel mapping”h]”hŒ¡The returned virtual address is a current CPU mapping for the memory address given. It is only valid to use this function on addresses that have a kernel mapping”…”�”}”(hjJ7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KŠhjF7ubjM)�”}”(hŒ�This function does not handle bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”h]”hŒ�This function does not handle bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function”…”�”}”(hjY7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´KŽhjF7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞh³jX7h´KŠhjÐ6ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hjJ4h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œioremap (C function)”Œ c.ioremap”hNt”auh1jë hjJ4h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒCvoid __iomem * ioremap (resource_size_t offset, unsigned long size)”h]”j)�”}”(hŒAvoid __iomem *ioremap(resource_size_t offset, unsigned long size)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjŽ7h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjŠ7h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K¶ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�7h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjŠ7h²hh³jœ7h´K¶ubhŒ__iomem”…”�”}”(hjŠ7h²hh³Nh´Nubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¯7h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjŠ7h²hh³jœ7h´K¶ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj½7h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjŠ7h²hh³jœ7h´K¶ubj1)�”}”(hŒioremap”h]”j7)�”}”(hŒioremap”h]”hŒioremap”…”�”}”(hjÎ7h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjÊ7ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hjŠ7h²hh³jœ7h´K¶ubjl)�”}”(hŒ,(resource_size_t offset, unsigned long size)”h]”(jr)�”}”(hŒresource_size_t offset”h]”(h)�”}”(hhh]”j7)�”}”(hŒresource_size_t”h]”hŒresource_size_t”…”�”}”(hjí7h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjê7ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”jï7Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«jÐ7sbŒ c.ioremap”†”asbuh1hhjæ7ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj 8h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjæ7ubj7)�”}”(hŒoffset”h]”hŒoffset”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjæ7ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjâ7ubjr)�”}”(hŒunsigned long size”h]”(j4)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj48h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj08ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjB8h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj08ubj4)�”}”(hŒlong”h]”hŒlong”…”�”}”(hjP8h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj08ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj^8h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj08ubj7)�”}”(hŒsize”h]”hŒsize”…”�”}”(hjl8h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj08ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjâ7ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhjŠ7h²hh³jœ7h´K¶ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj†7h²hh³jœ7h´K¶ubah}”(h]”j�7ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³jœ7h´K¶hjƒ7h²hubjc)�”}”(hhh]”jM)�”}”(hŒmap bus memory into CPU space”h]”hŒmap bus memory into CPU space”…”�”}”(hj–8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K¶hj“8h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjƒ7h²hh³jœ7h´K¶ubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j®8j…j®8j†‰j‡‰jˆ‰uh1jü h²hhjJ4h³Nh´NubjŠ)�”}”(hXì**Parameters** ``resource_size_t offset`` bus address of the memory ``unsigned long size`` size of the resource to map **Description** ioremap performs a platform specific sequence of operations to make bus memory CPU accessible via the readb/readw/readl/writeb/ writew/writel functions and the other mmio helpers. The returned address is not guaranteed to be usable directly as a virtual address. If the area you are trying to map is a PCI BAR you should have a look at pci_iomap().”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj¸8h]”hŒ Parameters”…”�”}”(hjº8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj¶8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kºhj²8ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒ5``resource_size_t offset`` bus address of the memory ”h]”(já)�”}”(hŒ``resource_size_t offset``”h]”j)�”}”(hj×8h]”hŒresource_size_t offset”…”�”}”(hjÙ8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÕ8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K·hjÑ8ubjû)�”}”(hhh]”jM)�”}”(hŒbus address of the memory”h]”hŒbus address of the memory”…”�”}”(hjð8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jì8h´K·hjí8ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÑ8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jì8h´K·hjÎ8ubjÛ)�”}”(hŒ3``unsigned long size`` size of the resource to map ”h]”(já)�”}”(hŒ``unsigned long size``”h]”j)�”}”(hj9h]”hŒunsigned long size”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K¸hj 9ubjû)�”}”(hhh]”jM)�”}”(hŒsize of the resource to map”h]”hŒsize of the resource to map”…”�”}”(hj)9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j%9h´K¸hj&9ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj 9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j%9h´K¸hjÎ8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj²8ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjK9h]”hŒ Description”…”�”}”(hjM9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjI9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Kºhj²8ubjM)�”}”(hXioremap performs a platform specific sequence of operations to make bus memory CPU accessible via the readb/readw/readl/writeb/ writew/writel functions and the other mmio helpers. The returned address is not guaranteed to be usable directly as a virtual address.”h]”hXioremap performs a platform specific sequence of operations to make bus memory CPU accessible via the readb/readw/readl/writeb/ writew/writel functions and the other mmio helpers. The returned address is not guaranteed to be usable directly as a virtual address.”…”�”}”(hja9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K¹hj²8ubjM)�”}”(hŒUIf the area you are trying to map is a PCI BAR you should have a look at pci_iomap().”h]”hŒUIf the area you are trying to map is a PCI BAR you should have a look at pci_iomap().”…”�”}”(hjp9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´K¿hj²8ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hjJ4h²hh³Nh´Nubjì )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jø Œiosubmit_cmds512 (C function)”Œc.iosubmit_cmds512”hNt”auh1jë hjJ4h²hh³Nh´Nubjý )�”}”(hhh]”(j)�”}”(hŒHvoid iosubmit_cmds512 (void __iomem *dst, const void *src, size_t count)”h]”j)�”}”(hŒGvoid iosubmit_cmds512(void __iomem *dst, const void *src, size_t count)”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjŸ9h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj›9h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Mxubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj®9h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj›9h²hh³j­9h´Mxubj1)�”}”(hŒiosubmit_cmds512”h]”j7)�”}”(hŒiosubmit_cmds512”h]”hŒiosubmit_cmds512”…”�”}”(hjÀ9h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj¼9ubah}”(h]”h ]”(jIjJeh"]”h$]”h&]”hÅhÆuh1j0hj›9h²hh³j­9h´Mxubjl)�”}”(hŒ2(void __iomem *dst, const void *src, size_t count)”h]”(jr)�”}”(hŒvoid __iomem *dst”h]”(j4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÜ9h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hjØ9ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjê9h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjØ9ubhŒ__iomem”…”�”}”(hjØ9h²hh³Nh´Nubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjü9h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhjØ9ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hj :h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhjØ9ubj7)�”}”(hŒdst”h]”hŒdst”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hjØ9ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjÔ9ubjr)�”}”(hŒconst void *src”h]”(j)�”}”(hjŽh]”hŒconst”…”�”}”(hj0:h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1j hj,:ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj=:h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj,:ubj4)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjK:h²hh³Nh´Nubah}”(h]”h ]”j@ah"]”h$]”h&]”uh1j3hj,:ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjY:h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj,:ubjÌ)�”}”(hj¨h]”hŒ*”…”�”}”(hjg:h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jËhj,:ubj7)�”}”(hŒsrc”h]”hŒsrc”…”�”}”(hjt:h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj,:ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjÔ9ubjr)�”}”(hŒ size_t count”h]”(h)�”}”(hhh]”j7)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj�:h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj�:ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j� Œreftype”j«Œ reftarget”j’:Œmodname”NŒ classname”Nj¯j²)�”}”jµ]”j¸)�”}”j«jÂ9sbŒc.iosubmit_cmds512”†”asbuh1hhj‰:ubj )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj°:h²hh³Nh´Nubah}”(h]”h ]”j,ah"]”h$]”h&]”uh1jhj‰:ubj7)�”}”(hŒcount”h]”hŒcount”…”�”}”(hj¾:h²hh³Nh´Nubah}”(h]”h ]”jBah"]”h$]”h&]”uh1j6hj‰:ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jqhjÔ9ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jkhj›9h²hh³j­9h´Mxubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjTˆuh1jjUjVhj—9h²hh³j­9h´Mxubah}”(h]”j’9ah ]”(jZj[eh"]”h$]”h&]”j_ˆj`)jahuh1jh³j­9h´Mxhj”9h²hubjc)�”}”(hhh]”jM)�”}”(hŒ3copy data to single MMIO location, in 512-bit units”h]”hŒ3copy data to single MMIO location, in 512-bit units”…”�”}”(hjè:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Mxhjå:h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj”9h²hh³j­9h´Mxubeh}”(h]”h ]”(j� Œfunction”eh"]”h$]”h&]”jƒj� j„j;j…j;j†‰j‡‰jˆ‰uh1jü h²hhjJ4h³Nh´NubjŠ)�”}”(hXÞ**Parameters** ``void __iomem *dst`` destination, in MMIO space (must be 512-bit aligned) ``const void *src`` source ``size_t count`` number of 512 bits quantities to submit **Description** Submit data from kernel space to MMIO space, in units of 512 bits at a time. Order of access is not guaranteed, nor is a memory barrier performed afterwards. Warning: Do not use this helper unless your driver has checked that the CPU instruction is supported on the platform.”h]”(jM)�”}”(hŒ**Parameters**”h]”j”)�”}”(hj ;h]”hŒ Parameters”…”�”}”(hj ;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´M|hj;ubjÖ)�”}”(hhh]”(jÛ)�”}”(hŒK``void __iomem *dst`` destination, in MMIO space (must be 512-bit aligned) ”h]”(já)�”}”(hŒ``void __iomem *dst``”h]”j)�”}”(hj);h]”hŒvoid __iomem *dst”…”�”}”(hj+;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj';ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Myhj#;ubjû)�”}”(hhh]”jM)�”}”(hŒ4destination, in MMIO space (must be 512-bit aligned)”h]”hŒ4destination, in MMIO space (must be 512-bit aligned)”…”�”}”(hjB;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j>;h´Myhj?;ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj#;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j>;h´Myhj ;ubjÛ)�”}”(hŒ``const void *src`` source ”h]”(já)�”}”(hŒ``const void *src``”h]”j)�”}”(hjb;h]”hŒconst void *src”…”�”}”(hjd;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´Mzhj\;ubjû)�”}”(hhh]”jM)�”}”(hŒsource”h]”hŒsource”…”�”}”(hj{;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jw;h´Mzhjx;ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj\;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³jw;h´Mzhj ;ubjÛ)�”}”(hŒ9``size_t count`` number of 512 bits quantities to submit ”h]”(já)�”}”(hŒ``size_t count``”h]”j)�”}”(hj›;h]”hŒ size_t count”…”�”}”(hj�;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jàh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´M{hj•;ubjû)�”}”(hhh]”jM)�”}”(hŒ'number of 512 bits quantities to submit”h]”hŒ'number of 512 bits quantities to submit”…”�”}”(hj´;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j°;h´M{hj±;ubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj•;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³j°;h´M{hj ;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕhj;ubjM)�”}”(hŒ**Description**”h]”j”)�”}”(hjÖ;h]”hŒ Description”…”�”}”(hjØ;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j“hjÔ;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´M}hj;ubjM)�”}”(hŒžSubmit data from kernel space to MMIO space, in units of 512 bits at a time. Order of access is not guaranteed, nor is a memory barrier performed afterwards.”h]”hŒžSubmit data from kernel space to MMIO space, in units of 512 bits at a time. Order of access is not guaranteed, nor is a memory barrier performed afterwards.”…”�”}”(hjì;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´M|hj;ubjM)�”}”(hŒuWarning: Do not use this helper unless your driver has checked that the CPU instruction is supported on the platform.”h]”hŒuWarning: Do not use this helper unless your driver has checked that the CPU instruction is supported on the platform.”…”�”}”(hjû;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLh³Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:518: ./arch/x86/include/asm/io.h”h´M€hj;ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j‰hjJ4h²hh³Nh´Nubeh}”(h]”Œpublic-functions-provided”ah ]”h"]”Œpublic functions provided”ah$]”h&]”uh1jhjh²hh³hÇh´Mubeh}”(h]”Œbus-independent-device-accesses”ah ]”h"]”Œbus-independent device accesses”ah$]”h&]”uh1jhhh²hh³hÇh´K ubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(jNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jR Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jC<Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”(Œ!higher-level ioremap abstractions”]”jaŒaccessing the device”]”jAauŒrefids”}”Œnameids”}”(j<j<jÀj½j¨j¥jjjŸjœj?j<jîjëj7j4j¼j¹j»j¸jò jï jÊjÇjˆj…jÞjÛj|jyj±j®j j jê jç j\ j-jG4jD4j<j<uŒ nametypes”}”(j<‰jÀ‰j¨‰j‰jŸ‰j?‰jî‰j7‰j¼‰j»‰jò ‰jʉjˆ‰jÞ‰j|‰j±‰j ‰jê ‰j\ ‰jG4‰j<‰uh}”(j<jj½jœj¥jÃjjÔjœjj<j«jëj¼j4jñj¹jBj¸j¿jï j¾jÇjëj…jÍjÛj‹jyjáj®jj j´jç j j-jõ jD4j_ jú jjÝjâjÁjÆj¥jªj&j+j4j9jBjGjÊjÏjŒj‘jNjSjÏjÔjè!jí!j%j%j'j'jô)jù)j—+jœ+jL-jQ-j;2j@2j<jJ4jg4jl4j6j6j�7j†7j’9j—9uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”(hŒsystem_message”“”)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hj®<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj«<ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œline”MÇŒsource”Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”uh1j©<hjß/ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hjË<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjÈ<ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MÇŒsource”jÇ<uh1j©<hj÷/ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hjæ<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjã<ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MËŒsource”Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”uh1j©<hjk0ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjÿ<ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MËŒsource”jþ<uh1j©<hjƒ0ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj=ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MÏŒsource”Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”uh1j©<hjä0ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hj9=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj6=ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MÏŒsource”j5=uh1j©<hjü0ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hjT=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjQ=ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MÓŒsource”Œ_/var/lib/git/docbuild/linux/Documentation/driver-api/device-io:512: ./include/linux/iosys-map.h”uh1j©<hjb1ubjª<)�”}”(hhh]”jM)�”}”(hŒeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.”h]”hŒgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.”…”�”}”(hjp=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjm=ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÄ<Œline”MÓŒsource”jl=uh1j©<hjz1ubeŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.