sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget)/translations/zh_CN/driver-api/pci/p2pdmamodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/zh_TW/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/it_IT/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ja_JP/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ko_KR/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/pt_BR/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/sp_SP/driver-api/pci/p2pdmamodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhC/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma.rsthKubhsection)}(hhh](htitle)}(hPCI Peer-to-Peer DMA Supporth]hPCI Peer-to-Peer DMA Support}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXThe PCI bus has pretty decent support for performing DMA transfers between two devices on the bus. This type of transaction is henceforth called Peer-to-Peer (or P2P). However, there are a number of issues that make P2P transactions tricky to do in a perfectly safe way.h]hXThe PCI bus has pretty decent support for performing DMA transfers between two devices on the bus. This type of transaction is henceforth called Peer-to-Peer (or P2P). However, there are a number of issues that make P2P transactions tricky to do in a perfectly safe way.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXtFor PCIe the routing of Transaction Layer Packets (TLPs) is well-defined up until they reach a host bridge or root port. If the path includes PCIe switches then based on the ACS settings the transaction can route entirely within the PCIe hierarchy and never reach the root port. The kernel will evaluate the PCIe topology and always permit P2P in these well-defined cases.h]hXtFor PCIe the routing of Transaction Layer Packets (TLPs) is well-defined up until they reach a host bridge or root port. If the path includes PCIe switches then based on the ACS settings the transaction can route entirely within the PCIe hierarchy and never reach the root port. The kernel will evaluate the PCIe topology and always permit P2P in these well-defined cases.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hHowever, if the P2P transaction reaches the host bridge then it might have to hairpin back out the same root port, be routed inside the CPU SOC to another PCIe root port, or routed internally to the SOC.h]hHowever, if the P2P transaction reaches the host bridge then it might have to hairpin back out the same root port, be routed inside the CPU SOC to another PCIe root port, or routed internally to the SOC.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThe PCIe specification doesn't define the forwarding of transactions between hierarchy domains and kernel defaults to blocking such routing. There is an allow list to allow detecting known-good HW, in which case P2P between any two PCIe devices will be permitted.h]hX The PCIe specification doesn’t define the forwarding of transactions between hierarchy domains and kernel defaults to blocking such routing. There is an allow list to allow detecting known-good HW, in which case P2P between any two PCIe devices will be permitted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXSince P2P inherently is doing transactions between two devices it requires two drivers to be co-operating inside the kernel. The providing driver has to convey its MMIO to the consuming driver. To meet the driver model lifecycle rules the MMIO must have all DMA mapping removed, all CPU accesses prevented, all page table mappings undone before the providing driver completes remove().h]hXSince P2P inherently is doing transactions between two devices it requires two drivers to be co-operating inside the kernel. The providing driver has to convey its MMIO to the consuming driver. To meet the driver model lifecycle rules the MMIO must have all DMA mapping removed, all CPU accesses prevented, all page table mappings undone before the providing driver completes remove().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThis requires the providing and consuming driver to actively work together to guarantee that the consuming driver has stopped using the MMIO during a removal cycle. This is done by either a synchronous invalidation shutdown or waiting for all usage refcounts to reach zero.h]hXThis requires the providing and consuming driver to actively work together to guarantee that the consuming driver has stopped using the MMIO during a removal cycle. This is done by either a synchronous invalidation shutdown or waiting for all usage refcounts to reach zero.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hhhhubh)}(hXAt the lowest level the P2P subsystem offers a naked struct p2p_provider that delegates lifecycle management to the providing driver. It is expected that drivers using this option will wrap their MMIO memory in DMABUF and use DMABUF to provide an invalidation shutdown. These MMIO addresses have no struct page, and if used with mmap() must create special PTEs. As such there are very few kernel uAPIs that can accept pointers to them; in particular they cannot be used with read()/write(), including O_DIRECT.h]hXAt the lowest level the P2P subsystem offers a naked struct p2p_provider that delegates lifecycle management to the providing driver. It is expected that drivers using this option will wrap their MMIO memory in DMABUF and use DMABUF to provide an invalidation shutdown. These MMIO addresses have no struct page, and if used with mmap() must create special PTEs. As such there are very few kernel uAPIs that can accept pointers to them; in particular they cannot be used with read()/write(), including O_DIRECT.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hhhhubh)}(hX(Building on this, the subsystem offers a layer to wrap the MMIO in a ZONE_DEVICE pgmap of MEMORY_DEVICE_PCI_P2PDMA to create struct pages. The lifecycle of pgmap ensures that when the pgmap is destroyed all other drivers have stopped using the MMIO. This option works with O_DIRECT flows, in some cases, if the underlying subsystem supports handling MEMORY_DEVICE_PCI_P2PDMA through FOLL_PCI_P2PDMA. The use of FOLL_LONGTERM is prevented. As this relies on pgmap it also relies on architecture support along with alignment and minimum size limitations.h]hX(Building on this, the subsystem offers a layer to wrap the MMIO in a ZONE_DEVICE pgmap of MEMORY_DEVICE_PCI_P2PDMA to create struct pages. The lifecycle of pgmap ensures that when the pgmap is destroyed all other drivers have stopped using the MMIO. This option works with O_DIRECT flows, in some cases, if the underlying subsystem supports handling MEMORY_DEVICE_PCI_P2PDMA through FOLL_PCI_P2PDMA. The use of FOLL_LONGTERM is prevented. As this relies on pgmap it also relies on architecture support along with alignment and minimum size limitations.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hhhhubh)}(hhh](h)}(hDriver Writer's Guideh]hDriver Writer’s Guide}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhhhhhK9ubh)}(hcIn a given P2P implementation there may be three or more different types of kernel drivers in play:h]hcIn a given P2P implementation there may be three or more different types of kernel drivers in play:}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjOhhubh bullet_list)}(hhh](h list_item)}(hqProvider - A driver which provides or publishes P2P resources like memory or doorbell registers to other drivers.h]h)}(hqProvider - A driver which provides or publishes P2P resources like memory or doorbell registers to other drivers.h]hqProvider - A driver which provides or publishes P2P resources like memory or doorbell registers to other drivers.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hjuubah}(h]h ]h"]h$]h&]uh1jshjphhhhhNubjt)}(h^Client - A driver which makes use of a resource by setting up a DMA transaction to or from it.h]h)}(h^Client - A driver which makes use of a resource by setting up a DMA transaction to or from it.h]h^Client - A driver which makes use of a resource by setting up a DMA transaction to or from it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjubah}(h]h ]h"]h$]h&]uh1jshjphhhhhNubjt)}(h[Orchestrator - A driver which orchestrates the flow of data between clients and providers. h]h)}(hZOrchestrator - A driver which orchestrates the flow of data between clients and providers.h]hZOrchestrator - A driver which orchestrates the flow of data between clients and providers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjubah}(h]h ]h"]h$]h&]uh1jshjphhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jnhhhK>hjOhhubh)}(hIn many cases there could be overlap between these three types (i.e., it may be typical for a driver to be both a provider and a client).h]hIn many cases there could be overlap between these three types (i.e., it may be typical for a driver to be both a provider and a client).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjOhhubh)}(hhj ubh)}(h**Description**h]j))}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chKhj ubh)}(hThis function initializes the peer-to-peer DMA infrastructure for a PCI device. It allocates and sets up the necessary data structures to support P2PDMA operations, including mapping type tracking.h]hThis function initializes the peer-to-peer DMA infrastructure for a PCI device. It allocates and sets up the necessary data structures to support P2PDMA operations, including mapping type tracking.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!pcim_p2pdma_provider (C function)c.pcim_p2pdma_providerhNtauh1jhjhhhNhNubj)}(hhh](j)}(hMstruct p2pdma_provider * pcim_p2pdma_provider (struct pci_dev *pdev, int bar)h]j )}(hKstruct p2pdma_provider *pcim_p2pdma_provider(struct pci_dev *pdev, int bar)h](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM/ubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhM/ubh)}(hhh]j<)}(hp2pdma_providerh]hp2pdma_provider}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]j)}jpcim_p2pdma_providersbc.pcim_p2pdma_providerasbuh1hhjhhhjhM/ubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhM/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM/ubj6)}(hpcim_p2pdma_providerh]j<)}(hj h]hpcim_p2pdma_provider}(hj.hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj*ubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhjhM/ubjU)}(h(struct pci_dev *pdev, int bar)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjIhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjEubj%)}(h h]h }(hjVhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjEubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjghhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjdubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjimodnameN classnameNjj)}j]j c.pcim_p2pdma_providerasbuh1hhjEubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjEubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj<)}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjAubj[)}(hint barh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj<)}(hbarh]hbar}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjAubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhjhM/ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhM/ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM/hjhhubj)}(hhh]h)}(hGet peer-to-peer DMA providerh]hGet peer-to-peer DMA provider}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM/hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM/ubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct pci_dev *pdev`` The PCI device to enable P2PDMA for ``int bar`` BAR index to get provider **Description** This function gets peer-to-peer DMA provider for a PCI device. The lifetime of the provider (and of course the MMIO) is bound to the lifetime of the driver. A driver calling this function must ensure that all references to the provider, and any DMA mappings created for any MMIO, are all cleaned up before the driver remove() completes. Since P2P is almost always shared with a second driver this means some system to notify, invalidate and revoke the MMIO's DMA must be in place to use this function. For example a revoke can be built using DMABUF.h](h)}(h**Parameters**h]j))}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM3hjubj?)}(hhh](jD)}(h=``struct pci_dev *pdev`` The PCI device to enable P2PDMA for h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hj@h]hstruct pci_dev *pdev}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj>ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM0hj:ubjd)}(hhh]h)}(h#The PCI device to enable P2PDMA forh]h#The PCI device to enable P2PDMA for}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM0hjVubah}(h]h ]h"]h$]h&]uh1jchj:ubeh}(h]h ]h"]h$]h&]uh1jChjUhM0hj7ubjD)}(h&``int bar`` BAR index to get provider h](jJ)}(h ``int bar``h]j^)}(hjyh]hint bar}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjwubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM1hjsubjd)}(hhh]h)}(hBAR index to get providerh]hBAR index to get provider}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM1hjubah}(h]h ]h"]h$]h&]uh1jchjsubeh}(h]h ]h"]h$]h&]uh1jChjhM1hj7ubeh}(h]h ]h"]h$]h&]uh1j>hjubh)}(h**Description**h]j))}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM3hjubh)}(hXPThis function gets peer-to-peer DMA provider for a PCI device. The lifetime of the provider (and of course the MMIO) is bound to the lifetime of the driver. A driver calling this function must ensure that all references to the provider, and any DMA mappings created for any MMIO, are all cleaned up before the driver remove() completes.h]hXPThis function gets peer-to-peer DMA provider for a PCI device. The lifetime of the provider (and of course the MMIO) is bound to the lifetime of the driver. A driver calling this function must ensure that all references to the provider, and any DMA mappings created for any MMIO, are all cleaned up before the driver remove() completes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM2hjubh)}(hSince P2P is almost always shared with a second driver this means some system to notify, invalidate and revoke the MMIO's DMA must be in place to use this function. For example a revoke can be built using DMABUF.h]hSince P2P is almost always shared with a second driver this means some system to notify, invalidate and revoke the MMIO’s DMA must be in place to use this function. For example a revoke can be built using DMABUF.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM8hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$pci_p2pdma_add_resource (C function)c.pci_p2pdma_add_resourcehNtauh1jhjhhhNhNubj)}(hhh](j)}(hTint pci_p2pdma_add_resource (struct pci_dev *pdev, int bar, size_t size, u64 offset)h]j )}(hSint pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, u64 offset)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMvubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj hhhj hMvubj6)}(hpci_p2pdma_add_resourceh]j<)}(hpci_p2pdma_add_resourceh]hpci_p2pdma_add_resource}(hj) hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj% ubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hj hhhj hMvubjU)}(h8(struct pci_dev *pdev, int bar, size_t size, u64 offset)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjE hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjA ubj%)}(h h]h }(hjR hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjA ubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjc hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj` ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetje modnameN classnameNjj)}j]j)}jj+ sbc.pci_p2pdma_add_resourceasbuh1hhjA ubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjA ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA ubj<)}(hpdevh]hpdev}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjA ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj= ubj[)}(hint barh](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj ubj<)}(hbarh]hbar}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj= ubj[)}(h size_t sizeh](h)}(hhh]j<)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj modnameN classnameNjj)}j]j c.pci_p2pdma_add_resourceasbuh1hhj ubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj ubj<)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj= ubj[)}(h u64 offseth](h)}(hhh]j<)}(hu64h]hu64}(hj7 hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj4 ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj9 modnameN classnameNjj)}j]j c.pci_p2pdma_add_resourceasbuh1hhj0 ubj%)}(h h]h }(hjU hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj0 ubj<)}(hoffseth]hoffset}(hjc hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj0 ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj= ubeh}(h]h ]h"]h$]h&]hhuh1jThj hhhj hMvubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhj hMvubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hMvhjhhubj)}(hhh]h)}(h add memory for use as p2p memoryh]h add memory for use as p2p memory}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMvhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMvubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjj jj jjjuh1jhhhjhNhNubj)}(hXR**Parameters** ``struct pci_dev *pdev`` the device to add the memory to ``int bar`` PCI BAR to add ``size_t size`` size of the memory to add, may be zero to use the whole BAR ``u64 offset`` offset into the PCI BAR **Description** The memory will be given ZONE_DEVICE struct pages so that it may be used with any DMA request.h](h)}(h**Parameters**h]j))}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMzhj ubj?)}(hhh](jD)}(h9``struct pci_dev *pdev`` the device to add the memory to h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hj h]hstruct pci_dev *pdev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMwhj ubjd)}(hhh]h)}(hthe device to add the memory toh]hthe device to add the memory to}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMwhj ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ]h"]h$]h&]uh1jChj hMwhj ubjD)}(h``int bar`` PCI BAR to add h](jJ)}(h ``int bar``h]j^)}(hj h]hint bar}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMxhj ubjd)}(hhh]h)}(hPCI BAR to addh]hPCI BAR to add}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMxhj ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ]h"]h$]h&]uh1jChj hMxhj ubjD)}(hL``size_t size`` size of the memory to add, may be zero to use the whole BAR h](jJ)}(h``size_t size``h]j^)}(hj@ h]h size_t size}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj> ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMyhj: ubjd)}(hhh]h)}(h;size of the memory to add, may be zero to use the whole BARh]h;size of the memory to add, may be zero to use the whole BAR}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU hMyhjV ubah}(h]h ]h"]h$]h&]uh1jchj: ubeh}(h]h ]h"]h$]h&]uh1jChjU hMyhj ubjD)}(h'``u64 offset`` offset into the PCI BAR h](jJ)}(h``u64 offset``h]j^)}(hjy h]h u64 offset}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjw ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMzhjs ubjd)}(hhh]h)}(hoffset into the PCI BARh]hoffset into the PCI BAR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMzhj ubah}(h]h ]h"]h$]h&]uh1jchjs ubeh}(h]h ]h"]h$]h&]uh1jChj hMzhj ubeh}(h]h ]h"]h$]h&]uh1j>hj ubh)}(h**Description**h]j))}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM|hj ubh)}(h^The memory will be given ZONE_DEVICE struct pages so that it may be used with any DMA request.h]h^The memory will be given ZONE_DEVICE struct pages so that it may be used with any DMA request.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM{hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%pci_p2pdma_distance_many (C function)c.pci_p2pdma_distance_manyhNtauh1jhjhhhNhNubj)}(hhh](j)}(hoint pci_p2pdma_distance_many (struct pci_dev *provider, struct device **clients, int num_clients, bool verbose)h]j )}(hnint pci_p2pdma_distance_many(struct pci_dev *provider, struct device **clients, int num_clients, bool verbose)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj hhhj hMubj6)}(hpci_p2pdma_distance_manyh]j<)}(hpci_p2pdma_distance_manyh]hpci_p2pdma_distance_many}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hj hhhj hMubjU)}(hR(struct pci_dev *provider, struct device **clients, int num_clients, bool verbose)h](j[)}(hstruct pci_dev *providerh](ja)}(hjdh]hstruct}(hj6 hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj2 ubj%)}(h h]h }(hjC hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj2 ubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjT hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjQ ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjV modnameN classnameNjj)}j]j)}jj sbc.pci_p2pdma_distance_manyasbuh1hhj2 ubj%)}(h h]h }(hjt hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj2 ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2 ubj<)}(hproviderh]hprovider}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj2 ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj. ubj[)}(hstruct device **clientsh](ja)}(hjdh]hstruct}(hj hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj ubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj ubh)}(hhh]j<)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj modnameN classnameNjj)}j]jp c.pci_p2pdma_distance_manyasbuh1hhj ubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj<)}(hclientsh]hclients}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj. ubj[)}(hint num_clientsh](j)}(hinth]hint}(hj% hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj! ubj%)}(h h]h }(hj3 hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj! ubj<)}(h num_clientsh]h num_clients}(hjA hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj! ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj. ubj[)}(h bool verboseh](j)}(hboolh]hbool}(hjZ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubj%)}(h h]h }(hjh hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjV ubj<)}(hverboseh]hverbose}(hjv hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjV ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj. ubeh}(h]h ]h"]h$]h&]hhuh1jThj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMhj hhubj)}(hhh]h)}(hSDetermine the cumulative distance between a p2pdma provider and the clients in use.h]hSDetermine the cumulative distance between a p2pdma provider and the clients in use.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjj jj jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct pci_dev *provider`` p2pdma provider to check against the client list ``struct device **clients`` array of devices to check (NULL-terminated) ``int num_clients`` number of clients in the array ``bool verbose`` if true, print warnings for devices when we return -1 **Description** Returns -1 if any of the clients are not compatible, otherwise returns a positive number where a lower number is the preferable choice. (If there's one client that's the same as the provider it will return 0, which is best choice). "compatible" means the provider and the clients are either all behind the same PCI root port or the host bridges connected to each of the devices are listed in the 'pci_p2pdma_whitelist'.h](h)}(h**Parameters**h]j))}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj ubj?)}(hhh](jD)}(hN``struct pci_dev *provider`` p2pdma provider to check against the client list h](jJ)}(h``struct pci_dev *provider``h]j^)}(hj h]hstruct pci_dev *provider}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj ubjd)}(hhh]h)}(h0p2pdma provider to check against the client listh]h0p2pdma provider to check against the client list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ]h"]h$]h&]uh1jChj hMhj ubjD)}(hH``struct device **clients`` array of devices to check (NULL-terminated) h](jJ)}(h``struct device **clients``h]j^)}(hjh]hstruct device **clients}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h+array of devices to check (NULL-terminated)h]h+array of devices to check (NULL-terminated)}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChj/hMhj ubjD)}(h3``int num_clients`` number of clients in the array h](jJ)}(h``int num_clients``h]j^)}(hjSh]hint num_clients}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjQubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjMubjd)}(hhh]h)}(hnumber of clients in the arrayh]hnumber of clients in the array}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jchjMubeh}(h]h ]h"]h$]h&]uh1jChjhhMhj ubjD)}(hG``bool verbose`` if true, print warnings for devices when we return -1 h](jJ)}(h``bool verbose``h]j^)}(hjh]h bool verbose}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h5if true, print warnings for devices when we return -1h]h5if true, print warnings for devices when we return -1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhj ubeh}(h]h ]h"]h$]h&]uh1j>hj ubh)}(h**Description**h]j))}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj ubh)}(hReturns -1 if any of the clients are not compatible, otherwise returns a positive number where a lower number is the preferable choice. (If there's one client that's the same as the provider it will return 0, which is best choice).h]hReturns -1 if any of the clients are not compatible, otherwise returns a positive number where a lower number is the preferable choice. (If there’s one client that’s the same as the provider it will return 0, which is best choice).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj ubh)}(h"compatible" means the provider and the clients are either all behind the same PCI root port or the host bridges connected to each of the devices are listed in the 'pci_p2pdma_whitelist'.h]h“compatible” means the provider and the clients are either all behind the same PCI root port or the host bridges connected to each of the devices are listed in the ‘pci_p2pdma_whitelist’.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!pci_p2pmem_find_many (C function)c.pci_p2pmem_find_manyhNtauh1jhjhhhNhNubj)}(hhh](j)}(hPstruct pci_dev * pci_p2pmem_find_many (struct device **clients, int num_clients)h]j )}(hNstruct pci_dev *pci_p2pmem_find_many(struct device **clients, int num_clients)h](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMZubj%)}(h h]h }(hj)hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhj(hMZubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hj:hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj7ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj<modnameN classnameNjj)}j]j)}jpci_p2pmem_find_manysbc.pci_p2pmem_find_manyasbuh1hhjhhhj(hMZubj%)}(h h]h }(hj[hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhj(hMZubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMZubj6)}(hpci_p2pmem_find_manyh]j<)}(hjXh]hpci_p2pmem_find_many}(hjzhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjvubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhj(hMZubjU)}(h*(struct device **clients, int num_clients)h](j[)}(hstruct device **clientsh](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubh)}(hhh]j<)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]jVc.pci_p2pmem_find_manyasbuh1hhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hclientsh]hclients}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(hint num_clientsh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hj hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj<)}(h num_clientsh]h num_clients}(hj.hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhj(hMZubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhj(hMZubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj(hMZhjhhubj)}(hhh]h)}(hifind a peer-to-peer DMA memory device compatible with the specified list of clients and shortest distanceh]hifind a peer-to-peer DMA memory device compatible with the specified list of clients and shortest distance}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMZhjUhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj(hMZubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjpjjpjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct device **clients`` array of devices to check (NULL-terminated) ``int num_clients`` number of client devices in the list **Description** If multiple devices are behind the same switch, the one "closest" to the client devices in use will be chosen first. (So if one of the providers is the same as one of the clients, that provider will be used ahead of any other providers that are unrelated). If multiple providers are an equal distance away, one will be chosen at random. Returns a pointer to the PCI device with a reference taken (use pci_dev_put to return the reference) or NULL if no compatible device is found. The found provider will also be assigned to the client list.h](h)}(h**Parameters**h]j))}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjxubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM^hjtubj?)}(hhh](jD)}(hH``struct device **clients`` array of devices to check (NULL-terminated) h](jJ)}(h``struct device **clients``h]j^)}(hjh]hstruct device **clients}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM\hjubjd)}(hhh]h)}(h+array of devices to check (NULL-terminated)h]h+array of devices to check (NULL-terminated)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM\hjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhM\hjubjD)}(h9``int num_clients`` number of client devices in the list h](jJ)}(h``int num_clients``h]j^)}(hjh]hint num_clients}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM]hjubjd)}(hhh]h)}(h$number of client devices in the listh]h$number of client devices in the list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM]hjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhM]hjubeh}(h]h ]h"]h$]h&]uh1j>hjtubh)}(h**Description**h]j))}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM_hjtubh)}(hXPIf multiple devices are behind the same switch, the one "closest" to the client devices in use will be chosen first. (So if one of the providers is the same as one of the clients, that provider will be used ahead of any other providers that are unrelated). If multiple providers are an equal distance away, one will be chosen at random.h]hXTIf multiple devices are behind the same switch, the one “closest” to the client devices in use will be chosen first. (So if one of the providers is the same as one of the clients, that provider will be used ahead of any other providers that are unrelated). If multiple providers are an equal distance away, one will be chosen at random.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM^hjtubh)}(hReturns a pointer to the PCI device with a reference taken (use pci_dev_put to return the reference) or NULL if no compatible device is found. The found provider will also be assigned to the client list.h]hReturns a pointer to the PCI device with a reference taken (use pci_dev_put to return the reference) or NULL if no compatible device is found. The found provider will also be assigned to the client list.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMdhjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jpci_alloc_p2pmem (C function)c.pci_alloc_p2pmemhNtauh1jhjhhhNhNubj)}(hhh](j)}(h;void * pci_alloc_p2pmem (struct pci_dev *pdev, size_t size)h]j )}(h9void *pci_alloc_p2pmem(struct pci_dev *pdev, size_t size)h](j)}(hvoidh]hvoid}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMubj%)}(h h]h }(hjphhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj]hhhjohMubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhjohMubj6)}(hpci_alloc_p2pmemh]j<)}(hpci_alloc_p2pmemh]hpci_alloc_p2pmem}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hj]hhhjohMubjU)}(h#(struct pci_dev *pdev, size_t size)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.pci_alloc_p2pmemasbuh1hhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(h size_t sizeh](h)}(hhh]j<)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj"modnameN classnameNjj)}j]jc.pci_alloc_p2pmemasbuh1hhjubj%)}(h h]h }(hj>hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj<)}(hsizeh]hsize}(hjLhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThj]hhhjohMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjYhhhjohMubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jhjohMhjVhhubj)}(hhh]h)}(h allocate peer-to-peer DMA memoryh]h allocate peer-to-peer DMA memory}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjshhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjohMubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct pci_dev *pdev`` the device to allocate memory from ``size_t size`` number of bytes to allocate **Description** Returns the allocated memory or NULL on error.h](h)}(h**Parameters**h]j))}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubj?)}(hhh](jD)}(h<``struct pci_dev *pdev`` the device to allocate memory from h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h"the device to allocate memory fromh]h"the device to allocate memory from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubjD)}(h,``size_t size`` number of bytes to allocate h](jJ)}(h``size_t size``h]j^)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(hnumber of bytes to allocateh]hnumber of bytes to allocate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubeh}(h]h ]h"]h$]h&]uh1j>hjubh)}(h**Description**h]j))}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj)ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubh)}(h.Returns the allocated memory or NULL on error.h]h.Returns the allocated memory or NULL on error.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jpci_free_p2pmem (C function)c.pci_free_p2pmemhNtauh1jhjhhhNhNubj)}(hhh](j)}(hDvoid pci_free_p2pmem (struct pci_dev *pdev, void *addr, size_t size)h]j )}(hCvoid pci_free_p2pmem(struct pci_dev *pdev, void *addr, size_t size)h](j)}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjlhhhj~hMubj6)}(hpci_free_p2pmemh]j<)}(hpci_free_p2pmemh]hpci_free_p2pmem}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjlhhhj~hMubjU)}(h/(struct pci_dev *pdev, void *addr, size_t size)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.pci_free_p2pmemasbuh1hhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(h void *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hj-hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(haddrh]haddr}(hjHhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(h size_t sizeh](h)}(hhh]j<)}(hsize_th]hsize_t}(hjdhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjaubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjfmodnameN classnameNjj)}j]jc.pci_free_p2pmemasbuh1hhj]ubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj]ubj<)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThjlhhhj~hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhhj~hMubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1jhj~hMhjehhubj)}(hhh]h)}(hfree peer-to-peer DMA memoryh]hfree peer-to-peer DMA memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjehhhj~hMubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct pci_dev *pdev`` the device the memory was allocated from ``void *addr`` address of the memory that was allocated ``size_t size`` number of bytes that were allocatedh](h)}(h**Parameters**h]j))}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubj?)}(hhh](jD)}(hB``struct pci_dev *pdev`` the device the memory was allocated from h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h(the device the memory was allocated fromh]h(the device the memory was allocated from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubjD)}(h8``void *addr`` address of the memory that was allocated h](jJ)}(h``void *addr``h]j^)}(hj4h]h void *addr}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj2ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj.ubjd)}(hhh]h)}(h(address of the memory that was allocatedh]h(address of the memory that was allocated}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjJubah}(h]h ]h"]h$]h&]uh1jchj.ubeh}(h]h ]h"]h$]h&]uh1jChjIhMhjubjD)}(h3``size_t size`` number of bytes that were allocatedh](jJ)}(h``size_t size``h]j^)}(hjmh]h size_t size}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjkubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjgubjd)}(hhh]h)}(h#number of bytes that were allocatedh]h#number of bytes that were allocated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubah}(h]h ]h"]h$]h&]uh1jchjgubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubeh}(h]h ]h"]h$]h&]uh1j>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#pci_p2pmem_virt_to_bus (C function)c.pci_p2pmem_virt_to_bushNtauh1jhjhhhNhNubj)}(hhh](j)}(hHpci_bus_addr_t pci_p2pmem_virt_to_bus (struct pci_dev *pdev, void *addr)h]j )}(hGpci_bus_addr_t pci_p2pmem_virt_to_bus(struct pci_dev *pdev, void *addr)h](h)}(hhh]j<)}(hpci_bus_addr_th]hpci_bus_addr_t}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]j)}jpci_p2pmem_virt_to_bussbc.pci_p2pmem_virt_to_busasbuh1hhjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhMubj6)}(hpci_p2pmem_virt_to_bush]j<)}(hjh]hpci_p2pmem_virt_to_bus}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhjhMubjU)}(h"(struct pci_dev *pdev, void *addr)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hj&hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hj7hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj4ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj9modnameN classnameNjj)}j]jc.pci_p2pmem_virt_to_busasbuh1hhjubj%)}(h h]h }(hjUhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hpdevh]hpdev}(hjphhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(h void *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hWreturn the PCI bus address for a given virtual address obtained with pci_alloc_p2pmem()h]hWreturn the PCI bus address for a given virtual address obtained with pci_alloc_p2pmem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct pci_dev *pdev`` the device the memory was allocated from ``void *addr`` address of the memory that was allocatedh](h)}(h**Parameters**h]j))}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubj?)}(hhh](jD)}(hB``struct pci_dev *pdev`` the device the memory was allocated from h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h(the device the memory was allocated fromh]h(the device the memory was allocated from}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj3ubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChj2hMhjubjD)}(h7``void *addr`` address of the memory that was allocatedh](jJ)}(h``void *addr``h]j^)}(hjVh]h void *addr}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjTubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjPubjd)}(hhh]h)}(h(address of the memory that was allocatedh]h(address of the memory that was allocated}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjlubah}(h]h ]h"]h$]h&]uh1jchjPubeh}(h]h ]h"]h$]h&]uh1jChjkhMhjubeh}(h]h ]h"]h$]h&]uh1j>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!pci_p2pmem_alloc_sgl (C function)c.pci_p2pmem_alloc_sglhNtauh1jhjhhhNhNubj)}(hhh](j)}(hastruct scatterlist * pci_p2pmem_alloc_sgl (struct pci_dev *pdev, unsigned int *nents, u32 length)h]j )}(h_struct scatterlist *pci_p2pmem_alloc_sgl(struct pci_dev *pdev, unsigned int *nents, u32 length)h](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhMubh)}(hhh]j<)}(h scatterlisth]h scatterlist}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]j)}jpci_p2pmem_alloc_sglsbc.pci_p2pmem_alloc_sglasbuh1hhjhhhjhMubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj6)}(hpci_p2pmem_alloc_sglh]j<)}(hjh]hpci_p2pmem_alloc_sgl}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj ubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhjhMubjU)}(h7(struct pci_dev *pdev, unsigned int *nents, u32 length)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hj*hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj&ubj%)}(h h]h }(hj7hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj&ubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjHhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjEubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjJmodnameN classnameNjj)}j]jc.pci_p2pmem_alloc_sglasbuh1hhj&ubj%)}(h h]h }(hjfhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hj&ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj<)}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj"ubj[)}(hunsigned int *nentsh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hnentsh]hnents}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj"ubj[)}(h u32 lengthh](h)}(hhh]j<)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]jc.pci_p2pmem_alloc_sglasbuh1hhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj<)}(hlengthh]hlength}(hj'hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhj"ubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h1allocate peer-to-peer DMA memory in a scatterlisth]h1allocate peer-to-peer DMA memory in a scatterlist}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjijjijjjuh1jhhhjhNhNubj)}(hX)**Parameters** ``struct pci_dev *pdev`` the device to allocate memory from ``unsigned int *nents`` the number of SG entries in the list ``u32 length`` number of bytes to allocate **Return** ``NULL`` on error or :c:type:`struct scatterlist ` pointer and **nents** on successh](h)}(h**Parameters**h]j))}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjqubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjmubj?)}(hhh](jD)}(h<``struct pci_dev *pdev`` the device to allocate memory from h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h"the device to allocate memory fromh]h"the device to allocate memory from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubjD)}(h=``unsigned int *nents`` the number of SG entries in the list h](jJ)}(h``unsigned int *nents``h]j^)}(hjh]hunsigned int *nents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(h$the number of SG entries in the listh]h$the number of SG entries in the list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubjD)}(h+``u32 length`` number of bytes to allocate h](jJ)}(h``u32 length``h]j^)}(hjh]h u32 length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubjd)}(hhh]h)}(hnumber of bytes to allocateh]hnumber of bytes to allocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ]h"]h$]h&]uh1jChjhMhjubeh}(h]h ]h"]h$]h&]uh1j>hjmubh)}(h **Return**h]j))}(hj?h]hReturn}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj=ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjmubh)}(h```NULL`` on error or :c:type:`struct scatterlist ` pointer and **nents** on successh](j^)}(h``NULL``h]hNULL}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjUubh on error or }(hjUhhhNhNubh)}(h*:c:type:`struct scatterlist `h]j^)}(hjmh]hstruct scatterlist}(hjohhhNhNubah}(h]h ](jijjc-typeeh"]h$]h&]uh1j]hjkubah}(h]h ]h"]h$]h&]refdocjv refdomainjjreftypetype refexplicitrefwarnjj)}j]sbj| scatterlistuh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjUubh pointer and }(hjUhhhNhNubj))}(h **nents**h]hnents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjUubh on success}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j pci_p2pmem_free_sgl (C function)c.pci_p2pmem_free_sglhNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid pci_p2pmem_free_sgl (struct pci_dev *pdev, struct scatterlist *sgl)h]j )}(hGvoid pci_p2pmem_free_sgl(struct pci_dev *pdev, struct scatterlist *sgl)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM ubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhM ubj6)}(hpci_p2pmem_free_sglh]j<)}(hpci_p2pmem_free_sglh]hpci_p2pmem_free_sgl}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhjhM ubjU)}(h/(struct pci_dev *pdev, struct scatterlist *sgl)h](j[)}(hstruct pci_dev *pdevh](ja)}(hjdh]hstruct}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hj%hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hj"ubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetj'modnameN classnameNjj)}j]j)}jjsbc.pci_p2pmem_free_sglasbuh1hhjubj%)}(h h]h }(hjEhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hpdevh]hpdev}(hj`hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(hstruct scatterlist *sglh](ja)}(hjdh]hstruct}(hjyhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjuubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjuubh)}(hhh]j<)}(h scatterlisth]h scatterlist}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjmodnameN classnameNjj)}j]jAc.pci_p2pmem_free_sglasbuh1hhjuubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjuubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj<)}(hsglh]hsgl}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjuubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhjhM ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(h6free a scatterlist allocated by pci_p2pmem_alloc_sgl()h]h6free a scatterlist allocated by pci_p2pmem_alloc_sgl()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct pci_dev *pdev`` the device to allocate memory from ``struct scatterlist *sgl`` the allocated scatterlisth](h)}(h**Parameters**h]j))}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubj?)}(hhh](jD)}(h<``struct pci_dev *pdev`` the device to allocate memory from h](jJ)}(h``struct pci_dev *pdev``h]j^)}(hj;h]hstruct pci_dev *pdev}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj9ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM hj5ubjd)}(hhh]h)}(h"the device to allocate memory fromh]h"the device to allocate memory from}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM hjQubah}(h]h ]h"]h$]h&]uh1jchj5ubeh}(h]h ]h"]h$]h&]uh1jChjPhM hj2ubjD)}(h5``struct scatterlist *sgl`` the allocated scatterlisth](jJ)}(h``struct scatterlist *sgl``h]j^)}(hjth]hstruct scatterlist *sgl}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjrubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjnubjd)}(hhh]h)}(hthe allocated scatterlisth]hthe allocated scatterlist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhjubah}(h]h ]h"]h$]h&]uh1jchjnubeh}(h]h ]h"]h$]h&]uh1jChjhMhj2ubeh}(h]h ]h"]h$]h&]uh1j>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jpci_p2pmem_publish (C function)c.pci_p2pmem_publishhNtauh1jhjhhhNhNubj)}(hhh](j)}(hhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj:ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM#hj6ubjd)}(hhh]h)}(h8set to true to publish the memory, false to unpublish ith]h8set to true to publish the memory, false to unpublish it}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhM#hjRubah}(h]h ]h"]h$]h&]uh1jchj6ubeh}(h]h ]h"]h$]h&]uh1jChjQhM#hjubeh}(h]h ]h"]h$]h&]uh1j>hjubh)}(h**Description**h]j))}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjuubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM%hjubh)}(hPublished memory can be used by other PCI device drivers for peer-2-peer DMA operations. Non-published memory is reserved for exclusive use of the device driver that registers the peer-to-peer memory.h]hPublished memory can be used by other PCI device drivers for peer-2-peer DMA operations. Non-published memory is reserved for exclusive use of the device driver that registers the peer-to-peer memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chM$hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$pci_p2pdma_enable_store (C function)c.pci_p2pdma_enable_storehNtauh1jhjhhhNhNubj)}(hhh](j)}(hZint pci_p2pdma_enable_store (const char *page, struct pci_dev **p2p_dev, bool *use_p2pdma)h]j )}(hYint pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev, bool *use_p2pdma)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMlubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjhhhjhMlubj6)}(hpci_p2pdma_enable_storeh]j<)}(hpci_p2pdma_enable_storeh]hpci_p2pdma_enable_store}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubah}(h]h ](jOjPeh"]h$]h&]hhuh1j5hjhhhjhMlubjU)}(h>(const char *page, struct pci_dev **p2p_dev, bool *use_p2pdma)h](j[)}(hconst char *pageh](ja)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hj#hhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(hpageh]hpage}(hj>hhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(hstruct pci_dev **p2p_devh](ja)}(hjdh]hstruct}(hjWhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjSubj%)}(h h]h }(hjdhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjSubh)}(hhh]j<)}(hpci_devh]hpci_dev}(hjuhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjrubah}(h]h ]h"]h$]h&] refdomainjjreftypej reftargetjwmodnameN classnameNjj)}j]j)}jjsbc.pci_p2pdma_enable_storeasbuh1hhjSubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj<)}(hp2p_devh]hp2p_dev}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjSubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubj[)}(hbool *use_p2pdmah](j)}(hj\ h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj%)}(h h]h }(hjhhhNhNubah}(h]h ]j1ah"]h$]h&]uh1j$hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj<)}(h use_p2pdmah]h use_p2pdma}(hjhhhNhNubah}(h]h ]jHah"]h$]h&]uh1j;hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jZhjubeh}(h]h ]h"]h$]h&]hhuh1jThjhhhjhMlubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhMlubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMlhjhhubj)}(hhh]h)}(h7parse a configfs/sysfs attribute store to enable p2pdmah]h7parse a configfs/sysfs attribute store to enable p2pdma}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMlhj% hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMlubeh}(h]h ](jjfunctioneh"]h$]h&]jjjjj@ jj@ jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const char *page`` contents of the value to be stored ``struct pci_dev **p2p_dev`` returns the PCI device that was selected to be used (if one was specified in the stored value) ``bool *use_p2pdma`` returns whether to enable p2pdma or not **Description** Parses an attribute value to decide whether to enable p2pdma. The value can select a PCI device (using its full BDF device name) or a boolean (in any format kstrtobool() accepts). A false value disables p2pdma, a true value expects the caller to automatically find a compatible device and specifying a PCI device expects the caller to use the specific provider. pci_p2pdma_enable_show() should be used as the show operation for the attribute. Returns 0 on successh](h)}(h**Parameters**h]j))}(hjJ h]h Parameters}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjH ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMphjD ubj?)}(hhh](jD)}(h8``const char *page`` contents of the value to be stored h](jJ)}(h``const char *page``h]j^)}(hji h]hconst char *page}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjg ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMnhjc ubjd)}(hhh]h)}(h"contents of the value to be storedh]h"contents of the value to be stored}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~ hMnhj ubah}(h]h ]h"]h$]h&]uh1jchjc ubeh}(h]h ]h"]h$]h&]uh1jChj~ hMnhj` ubjD)}(h|``struct pci_dev **p2p_dev`` returns the PCI device that was selected to be used (if one was specified in the stored value) h](jJ)}(h``struct pci_dev **p2p_dev``h]j^)}(hj h]hstruct pci_dev **p2p_dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMphj ubjd)}(hhh]h)}(h^returns the PCI device that was selected to be used (if one was specified in the stored value)h]h^returns the PCI device that was selected to be used (if one was specified in the stored value)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMohj ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ]h"]h$]h&]uh1jChj hMphj` ubjD)}(h=``bool *use_p2pdma`` returns whether to enable p2pdma or not h](jJ)}(h``bool *use_p2pdma``h]j^)}(hj h]hbool *use_p2pdma}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj ubah}(h]h ]h"]h$]h&]uh1jIh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMqhj ubjd)}(hhh]h)}(h'returns whether to enable p2pdma or noth]h'returns whether to enable p2pdma or not}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMqhj ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ]h"]h$]h&]uh1jChj hMqhj` ubeh}(h]h ]h"]h$]h&]uh1j>hjD ubh)}(h**Description**h]j))}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj!ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMshjD ubh)}(hXiParses an attribute value to decide whether to enable p2pdma. The value can select a PCI device (using its full BDF device name) or a boolean (in any format kstrtobool() accepts). A false value disables p2pdma, a true value expects the caller to automatically find a compatible device and specifying a PCI device expects the caller to use the specific provider.h]hXiParses an attribute value to decide whether to enable p2pdma. The value can select a PCI device (using its full BDF device name) or a boolean (in any format kstrtobool() accepts). A false value disables p2pdma, a true value expects the caller to automatically find a compatible device and specifying a PCI device expects the caller to use the specific provider.}(hj-!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMrhjD ubh)}(hPpci_p2pdma_enable_show() should be used as the show operation for the attribute.h]hPpci_p2pdma_enable_show() should be used as the show operation for the attribute.}(hjhj"ubh)}(h**Description**h]j))}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj#ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj"ubh)}(hjAttributes that use pci_p2pdma_enable_store() should use this function to show the value of the attribute.h]hjAttributes that use pci_p2pdma_enable_store() should use this function to show the value of the attribute.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj"ubh)}(hReturns 0 on successh]hReturns 0 on success}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/driver-api/pci/p2pdma:181: ./drivers/pci/p2pdma.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]p2p-dma-support-libraryah ]h"]p2p dma support libraryah$]h&]uh1hhhhhhhhKubeh}(h]pci-peer-to-peer-dma-supportah ]h"]pci peer-to-peer dma supportah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj$error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j#j#j}jzjjj9j6j@j=jujrjjj#j#u nametypes}(j#j}jj9j@jujj#uh}(j#hjzjOjj@j6jj=j<jrjCjjj#jjjjjjj j j jjjTjYjcjhjjjjjjjjjjjm!jr!u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.