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/userspace-api/iommufdmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/zh_TW/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/it_IT/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ja_JP/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ko_KR/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/pt_BR/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/sp_SP/userspace-api/iommufdmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h!SPDX-License-Identifier: GPL-2.0+h]h!SPDX-License-Identifier: GPL-2.0+}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhC/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd.rsthKubhsection)}(hhh](htitle)}(hIOMMUFDh]hIOMMUFD}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hAuthorh]hAuthor}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(hJason Gunthorpeh]h paragraph)}(hhh]hJason Gunthorpe}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h Kevin Tian h]h)}(h Kevin Tianh]h Kevin Tian}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj)ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hOverviewh]hOverview}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhhhhhK ubh)}(hXrIOMMUFD is the user API to control the IOMMU subsystem as it relates to managing IO page tables from userspace using file descriptors. It intends to be general and consumable by any driver that wants to expose DMA to userspace. These drivers are eventually expected to deprecate any internal IOMMU logic they may already/historically implement (e.g. vfio_iommu_type1.c).h]hXrIOMMUFD is the user API to control the IOMMU subsystem as it relates to managing IO page tables from userspace using file descriptors. It intends to be general and consumable by any driver that wants to expose DMA to userspace. These drivers are eventually expected to deprecate any internal IOMMU logic they may already/historically implement (e.g. vfio_iommu_type1.c).}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjMhhubh)}(hAt minimum iommufd provides universal support of managing I/O address spaces and I/O page tables for all IOMMUs, with room in the design to add non-generic features to cater to specific hardware functionality.h]hAt minimum iommufd provides universal support of managing I/O address spaces and I/O page tables for all IOMMUs, with room in the design to add non-generic features to cater to specific hardware functionality.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjMhhubh)}(hIn this context the capital letter (IOMMUFD) refers to the subsystem while the small letter (iommufd) refers to the file descriptors created via /dev/iommu for use by userspace.h]hIn this context the capital letter (IOMMUFD) refers to the subsystem while the small letter (iommufd) refers to the file descriptors created via /dev/iommu for use by userspace.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjMhhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h Key Conceptsh]h Key Concepts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hUser Visible Objectsh]hUser Visible Objects}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h3Following IOMMUFD objects are exposed to userspace:h]h3Following IOMMUFD objects are exposed to userspace:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjhhubh bullet_list)}(hhh](h list_item)}(hX*IOMMUFD_OBJ_IOAS, representing an I/O address space (IOAS), allowing map/unmap of user space memory into ranges of I/O Virtual Address (IOVA). The IOAS is a functional replacement for the VFIO container, and like the VFIO container it copies an IOVA map to a list of iommu_domains held within it. h](h)}(hIOMMUFD_OBJ_IOAS, representing an I/O address space (IOAS), allowing map/unmap of user space memory into ranges of I/O Virtual Address (IOVA).h]hIOMMUFD_OBJ_IOAS, representing an I/O address space (IOAS), allowing map/unmap of user space memory into ranges of I/O Virtual Address (IOVA).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjubh)}(hThe IOAS is a functional replacement for the VFIO container, and like the VFIO container it copies an IOVA map to a list of iommu_domains held within it.h]hThe IOAS is a functional replacement for the VFIO container, and like the VFIO container it copies an IOVA map to a list of iommu_domains held within it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hZIOMMUFD_OBJ_DEVICE, representing a device that is bound to iommufd by an external driver. h]h)}(hYIOMMUFD_OBJ_DEVICE, representing a device that is bound to iommufd by an external driver.h]hYIOMMUFD_OBJ_DEVICE, representing a device that is bound to iommufd by an external driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_HWPT_PAGING, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by the iommu driver. "PAGING" primarily indicates this type of HWPT should be linked to an IOAS. It also indicates that it is backed by an iommu_domain with __IOMMU_DOMAIN_PAGING feature flag. This can be either an UNMANAGED stage-1 domain for a device running in the user space, or a nesting parent stage-2 domain for mappings from guest-level physical addresses to host-level physical addresses. The IOAS has a list of HWPT_PAGINGs that share the same IOVA mapping and it will synchronize its mapping with each member HWPT_PAGING. h](h)}(hXIOMMUFD_OBJ_HWPT_PAGING, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by the iommu driver. "PAGING" primarily indicates this type of HWPT should be linked to an IOAS. It also indicates that it is backed by an iommu_domain with __IOMMU_DOMAIN_PAGING feature flag. This can be either an UNMANAGED stage-1 domain for a device running in the user space, or a nesting parent stage-2 domain for mappings from guest-level physical addresses to host-level physical addresses.h]hXIOMMUFD_OBJ_HWPT_PAGING, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by the iommu driver. “PAGING” primarily indicates this type of HWPT should be linked to an IOAS. It also indicates that it is backed by an iommu_domain with __IOMMU_DOMAIN_PAGING feature flag. This can be either an UNMANAGED stage-1 domain for a device running in the user space, or a nesting parent stage-2 domain for mappings from guest-level physical addresses to host-level physical addresses.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubh)}(hThe IOAS has a list of HWPT_PAGINGs that share the same IOVA mapping and it will synchronize its mapping with each member HWPT_PAGING.h]hThe IOAS has a list of HWPT_PAGINGs that share the same IOVA mapping and it will synchronize its mapping with each member HWPT_PAGING.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_HWPT_NESTED, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by user space (e.g. guest OS). "NESTED" indicates that this type of HWPT should be linked to an HWPT_PAGING. It also indicates that it is backed by an iommu_domain that has a type of IOMMU_DOMAIN_NESTED. This must be a stage-1 domain for a device running in the user space (e.g. in a guest VM enabling the IOMMU nested translation feature.) As such, it must be created with a given nesting parent stage-2 domain to associate to. This nested stage-1 page table managed by the user space usually has mappings from guest-level I/O virtual addresses to guest- level physical addresses. h]h)}(hXIOMMUFD_OBJ_HWPT_NESTED, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by user space (e.g. guest OS). "NESTED" indicates that this type of HWPT should be linked to an HWPT_PAGING. It also indicates that it is backed by an iommu_domain that has a type of IOMMU_DOMAIN_NESTED. This must be a stage-1 domain for a device running in the user space (e.g. in a guest VM enabling the IOMMU nested translation feature.) As such, it must be created with a given nesting parent stage-2 domain to associate to. This nested stage-1 page table managed by the user space usually has mappings from guest-level I/O virtual addresses to guest- level physical addresses.h]hXIOMMUFD_OBJ_HWPT_NESTED, representing an actual hardware I/O page table (i.e. a single struct iommu_domain) managed by user space (e.g. guest OS). “NESTED” indicates that this type of HWPT should be linked to an HWPT_PAGING. It also indicates that it is backed by an iommu_domain that has a type of IOMMU_DOMAIN_NESTED. This must be a stage-1 domain for a device running in the user space (e.g. in a guest VM enabling the IOMMU nested translation feature.) As such, it must be created with a given nesting parent stage-2 domain to associate to. This nested stage-1 page table managed by the user space usually has mappings from guest-level I/O virtual addresses to guest- level physical addresses.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hj+ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_FAULT, representing a software queue for an HWPT reporting IO page faults using the IOMMU HW's PRI (Page Request Interface). This queue object provides user space an FD to poll the page fault events and also to respond to those events. A FAULT object must be created first to get a fault_id that could be then used to allocate a fault-enabled HWPT via the IOMMU_HWPT_ALLOC command by setting the IOMMU_HWPT_FAULT_ID_VALID bit in its flags field. h]h)}(hXIOMMUFD_FAULT, representing a software queue for an HWPT reporting IO page faults using the IOMMU HW's PRI (Page Request Interface). This queue object provides user space an FD to poll the page fault events and also to respond to those events. A FAULT object must be created first to get a fault_id that could be then used to allocate a fault-enabled HWPT via the IOMMU_HWPT_ALLOC command by setting the IOMMU_HWPT_FAULT_ID_VALID bit in its flags field.h]hXIOMMUFD_FAULT, representing a software queue for an HWPT reporting IO page faults using the IOMMU HW’s PRI (Page Request Interface). This queue object provides user space an FD to poll the page fault events and also to respond to those events. A FAULT object must be created first to get a fault_id that could be then used to allocate a fault-enabled HWPT via the IOMMU_HWPT_ALLOC command by setting the IOMMU_HWPT_FAULT_ID_VALID bit in its flags field.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjCubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXpIOMMUFD_OBJ_VIOMMU, representing a slice of the physical IOMMU instance, passed to or shared with a VM. It may be some HW-accelerated virtualization features and some SW resources used by the VM. For examples: * Security namespace for guest owned ID, e.g. guest-controlled cache tags * Non-device-affiliated event reporting, e.g. invalidation queue errors * Access to a shareable nesting parent pagetable across physical IOMMUs * Virtualization of various platforms IDs, e.g. RIDs and others * Delivery of paravirtualized invalidation * Direct assigned invalidation queues * Direct assigned interrupts Such a vIOMMU object generally has the access to a nesting parent pagetable to support some HW-accelerated virtualization features. So, a vIOMMU object must be created given a nesting parent HWPT_PAGING object, and then it would encapsulate that HWPT_PAGING object. Therefore, a vIOMMU object can be used to allocate an HWPT_NESTED object in place of the encapsulated HWPT_PAGING. .. note:: The name "vIOMMU" isn't necessarily identical to a virtualized IOMMU in a VM. A VM can have one giant virtualized IOMMU running on a machine having multiple physical IOMMUs, in which case the VMM will dispatch the requests or configurations from this single virtualized IOMMU instance to multiple vIOMMU objects created for individual slices of different physical IOMMUs. In other words, a vIOMMU object is always a representation of one physical IOMMU, not necessarily of a virtualized IOMMU. For VMMs that want the full virtualization features from physical IOMMUs, it is suggested to build the same number of virtualized IOMMUs as the number of physical IOMMUs, so the passed-through devices would be connected to their own virtualized IOMMUs backed by corresponding vIOMMU objects, in which case a guest OS would do the "dispatch" naturally instead of VMM trappings. h](h)}(hIOMMUFD_OBJ_VIOMMU, representing a slice of the physical IOMMU instance, passed to or shared with a VM. It may be some HW-accelerated virtualization features and some SW resources used by the VM. For examples:h]hIOMMUFD_OBJ_VIOMMU, representing a slice of the physical IOMMU instance, passed to or shared with a VM. It may be some HW-accelerated virtualization features and some SW resources used by the VM. For examples:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhj[ubj)}(hhh](j)}(hGSecurity namespace for guest owned ID, e.g. guest-controlled cache tagsh]h)}(hjrh]hGSecurity namespace for guest owned ID, e.g. guest-controlled cache tags}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjpubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(hENon-device-affiliated event reporting, e.g. invalidation queue errorsh]h)}(hjh]hENon-device-affiliated event reporting, e.g. invalidation queue errors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(hEAccess to a shareable nesting parent pagetable across physical IOMMUsh]h)}(hjh]hEAccess to a shareable nesting parent pagetable across physical IOMMUs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(h=Virtualization of various platforms IDs, e.g. RIDs and othersh]h)}(hjh]h=Virtualization of various platforms IDs, e.g. RIDs and others}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(h(Delivery of paravirtualized invalidationh]h)}(hjh]h(Delivery of paravirtualized invalidation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(h#Direct assigned invalidation queuesh]h)}(hjh]h#Direct assigned invalidation queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubah}(h]h ]h"]h$]h&]uh1jhjmubj)}(hDirect assigned interrupts h]h)}(hDirect assigned interruptsh]hDirect assigned interrupts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKMhj[ubh)}(hX|Such a vIOMMU object generally has the access to a nesting parent pagetable to support some HW-accelerated virtualization features. So, a vIOMMU object must be created given a nesting parent HWPT_PAGING object, and then it would encapsulate that HWPT_PAGING object. Therefore, a vIOMMU object can be used to allocate an HWPT_NESTED object in place of the encapsulated HWPT_PAGING.h]hX|Such a vIOMMU object generally has the access to a nesting parent pagetable to support some HW-accelerated virtualization features. So, a vIOMMU object must be created given a nesting parent HWPT_PAGING object, and then it would encapsulate that HWPT_PAGING object. Therefore, a vIOMMU object can be used to allocate an HWPT_NESTED object in place of the encapsulated HWPT_PAGING.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhj[ubhnote)}(hXfThe name "vIOMMU" isn't necessarily identical to a virtualized IOMMU in a VM. A VM can have one giant virtualized IOMMU running on a machine having multiple physical IOMMUs, in which case the VMM will dispatch the requests or configurations from this single virtualized IOMMU instance to multiple vIOMMU objects created for individual slices of different physical IOMMUs. In other words, a vIOMMU object is always a representation of one physical IOMMU, not necessarily of a virtualized IOMMU. For VMMs that want the full virtualization features from physical IOMMUs, it is suggested to build the same number of virtualized IOMMUs as the number of physical IOMMUs, so the passed-through devices would be connected to their own virtualized IOMMUs backed by corresponding vIOMMU objects, in which case a guest OS would do the "dispatch" naturally instead of VMM trappings.h]h)}(hXfThe name "vIOMMU" isn't necessarily identical to a virtualized IOMMU in a VM. A VM can have one giant virtualized IOMMU running on a machine having multiple physical IOMMUs, in which case the VMM will dispatch the requests or configurations from this single virtualized IOMMU instance to multiple vIOMMU objects created for individual slices of different physical IOMMUs. In other words, a vIOMMU object is always a representation of one physical IOMMU, not necessarily of a virtualized IOMMU. For VMMs that want the full virtualization features from physical IOMMUs, it is suggested to build the same number of virtualized IOMMUs as the number of physical IOMMUs, so the passed-through devices would be connected to their own virtualized IOMMUs backed by corresponding vIOMMU objects, in which case a guest OS would do the "dispatch" naturally instead of VMM trappings.h]hXpThe name “vIOMMU” isn’t necessarily identical to a virtualized IOMMU in a VM. A VM can have one giant virtualized IOMMU running on a machine having multiple physical IOMMUs, in which case the VMM will dispatch the requests or configurations from this single virtualized IOMMU instance to multiple vIOMMU objects created for individual slices of different physical IOMMUs. In other words, a vIOMMU object is always a representation of one physical IOMMU, not necessarily of a virtualized IOMMU. For VMMs that want the full virtualization features from physical IOMMUs, it is suggested to build the same number of virtualized IOMMUs as the number of physical IOMMUs, so the passed-through devices would be connected to their own virtualized IOMMUs backed by corresponding vIOMMU objects, in which case a guest OS would do the “dispatch” naturally instead of VMM trappings.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hj*ubah}(h]h ]h"]h$]h&]uh1j(hj[ubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubj)}(hXvIOMMUFD_OBJ_VDEVICE, representing a virtual device for an IOMMUFD_OBJ_DEVICE against an IOMMUFD_OBJ_VIOMMU. This virtual device holds the device's virtual information or attributes (related to the vIOMMU) in a VM. An immediate vDATA example can be the virtual ID of the device on a vIOMMU, which is a unique ID that VMM assigns to the device for a translation channel/port of the vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-d to a Context Table. Potential use cases of some advanced security information can be forwarded via this object too, such as security level or realm information in a Confidential Compute Architecture. A VMM should create a vDEVICE object to forward all the device information in a VM, when it connects a device to a vIOMMU, which is a separate ioctl call from attaching the same device to an HWPT_PAGING that the vIOMMU holds. h]h)}(hXuIOMMUFD_OBJ_VDEVICE, representing a virtual device for an IOMMUFD_OBJ_DEVICE against an IOMMUFD_OBJ_VIOMMU. This virtual device holds the device's virtual information or attributes (related to the vIOMMU) in a VM. An immediate vDATA example can be the virtual ID of the device on a vIOMMU, which is a unique ID that VMM assigns to the device for a translation channel/port of the vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-d to a Context Table. Potential use cases of some advanced security information can be forwarded via this object too, such as security level or realm information in a Confidential Compute Architecture. A VMM should create a vDEVICE object to forward all the device information in a VM, when it connects a device to a vIOMMU, which is a separate ioctl call from attaching the same device to an HWPT_PAGING that the vIOMMU holds.h]hXwIOMMUFD_OBJ_VDEVICE, representing a virtual device for an IOMMUFD_OBJ_DEVICE against an IOMMUFD_OBJ_VIOMMU. This virtual device holds the device’s virtual information or attributes (related to the vIOMMU) in a VM. An immediate vDATA example can be the virtual ID of the device on a vIOMMU, which is a unique ID that VMM assigns to the device for a translation channel/port of the vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-d to a Context Table. Potential use cases of some advanced security information can be forwarded via this object too, such as security level or realm information in a Confidential Compute Architecture. A VMM should create a vDEVICE object to forward all the device information in a VM, when it connects a device to a vIOMMU, which is a separate ioctl call from attaching the same device to an HWPT_PAGING that the vIOMMU holds.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjHubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_VEVENTQ, representing a software queue for a vIOMMU to report its events such as translation faults occurred to a nested stage-1 (excluding I/O page faults that should go through IOMMUFD_OBJ_FAULT) and HW-specific events. This queue object provides user space an FD to poll/read the vIOMMU events. A vIOMMU object must be created first to get its viommu_id, which could be then used to allocate a vEVENTQ. Each vIOMMU can support multiple types of vEVENTS, but is confined to one vEVENTQ per vEVENTQ type. h]h)}(hXIOMMUFD_OBJ_VEVENTQ, representing a software queue for a vIOMMU to report its events such as translation faults occurred to a nested stage-1 (excluding I/O page faults that should go through IOMMUFD_OBJ_FAULT) and HW-specific events. This queue object provides user space an FD to poll/read the vIOMMU events. A vIOMMU object must be created first to get its viommu_id, which could be then used to allocate a vEVENTQ. Each vIOMMU can support multiple types of vEVENTS, but is confined to one vEVENTQ per vEVENTQ type.h]hXIOMMUFD_OBJ_VEVENTQ, representing a software queue for a vIOMMU to report its events such as translation faults occurred to a nested stage-1 (excluding I/O page faults that should go through IOMMUFD_OBJ_FAULT) and HW-specific events. This queue object provides user space an FD to poll/read the vIOMMU events. A vIOMMU object must be created first to get its viommu_id, which could be then used to allocate a vEVENTQ. Each vIOMMU can support multiple types of vEVENTS, but is confined to one vEVENTQ per vEVENTQ type.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj`ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_HW_QUEUE, representing a hardware accelerated queue, as a subset of IOMMU's virtualization features, for the IOMMU HW to directly read or write the virtual queue memory owned by a guest OS. This HW-acceleration feature can allow VM to work with the IOMMU HW directly without a VM Exit, so as to reduce overhead from the hypercalls. Along with the HW QUEUE object, iommufd provides user space an mmap interface for VMM to mmap a physical MMIO region from the host physical address space to the guest physical address space, allowing the guest OS to directly control the allocated HW QUEUE. Thus, when allocating a HW QUEUE, the VMM must request a pair of mmap info (offset/length) and pass in exactly to an mmap syscall via its offset and length arguments. h]h)}(hXIOMMUFD_OBJ_HW_QUEUE, representing a hardware accelerated queue, as a subset of IOMMU's virtualization features, for the IOMMU HW to directly read or write the virtual queue memory owned by a guest OS. This HW-acceleration feature can allow VM to work with the IOMMU HW directly without a VM Exit, so as to reduce overhead from the hypercalls. Along with the HW QUEUE object, iommufd provides user space an mmap interface for VMM to mmap a physical MMIO region from the host physical address space to the guest physical address space, allowing the guest OS to directly control the allocated HW QUEUE. Thus, when allocating a HW QUEUE, the VMM must request a pair of mmap info (offset/length) and pass in exactly to an mmap syscall via its offset and length arguments.h]hXIOMMUFD_OBJ_HW_QUEUE, representing a hardware accelerated queue, as a subset of IOMMU’s virtualization features, for the IOMMU HW to directly read or write the virtual queue memory owned by a guest OS. This HW-acceleration feature can allow VM to work with the IOMMU HW directly without a VM Exit, so as to reduce overhead from the hypercalls. Along with the HW QUEUE object, iommufd provides user space an mmap interface for VMM to mmap a physical MMIO region from the host physical address space to the guest physical address space, allowing the guest OS to directly control the allocated HW QUEUE. Thus, when allocating a HW QUEUE, the VMM must request a pair of mmap info (offset/length) and pass in exactly to an mmap syscall via its offset and length arguments.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]j-uh1jhhhK#hjhhubh)}(hBAll user-visible objects are destroyed via the IOMMU_DESTROY uAPI.h]hBAll user-visible objects are destroyed via the IOMMU_DESTROY uAPI.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hThe diagrams below show relationships between user-visible objects and kernel datastructures (external to iommufd), with numbers referred to operations creating the objects and links::h]hThe diagrams below show relationships between user-visible objects and kernel datastructures (external to iommufd), with numbers referred to operations creating the objects and links:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hX _______________________________________________________________________ | iommufd (HWPT_PAGING only) | | | | [1] [3] [2] | | ________________ _____________ ________ | | | | | | | | | | | IOAS |<---| HWPT_PAGING |<---------------------| DEVICE | | | |________________| |_____________| |________| | | | | | | |_________|____________________|__________________________________|_____| | | | | ______v_____ ___v__ | PFN storage | (paging) | |struct| |------------>|iommu_domain|<-----------------------|device| |____________| |______| _______________________________________________________________________ | iommufd (with HWPT_NESTED) | | | | [1] [3] [4] [2] | | ________________ _____________ _____________ ________ | | | | | | | | | | | | | IOAS |<---| HWPT_PAGING |<---| HWPT_NESTED |<--| DEVICE | | | |________________| |_____________| |_____________| |________| | | | | | | | |_________|____________________|__________________|_______________|_____| | | | | | ______v_____ ______v_____ ___v__ | PFN storage | (paging) | | (nested) | |struct| |------------>|iommu_domain|<----|iommu_domain|<----|device| |____________| |____________| |______| _______________________________________________________________________ | iommufd (with vIOMMU/vDEVICE) | | | | [5] [6] | | _____________ _____________ | | | | | | | | |----------------| vIOMMU |<---| vDEVICE |<----| | | | | | |_____________| | | | | | | | | | | [1] | | [4] | [2] | | | ______ | | _____________ _|______ | | | | | | [3] | | | | | | | | | IOAS |<---|(HWPT_PAGING)|<---| HWPT_NESTED |<--| DEVICE | | | | |______| |_____________| |_____________| |________| | | | | | | | | |______|________|______________|__________________|_______________|_____| | | | | | ______v_____ | ______v_____ ______v_____ ___v__ | struct | | PFN | (paging) | | (nested) | |struct| |iommu_device| |------>|iommu_domain|<----|iommu_domain|<----|device| |____________| storage|____________| |____________| |______|h]hX _______________________________________________________________________ | iommufd (HWPT_PAGING only) | | | | [1] [3] [2] | | ________________ _____________ ________ | | | | | | | | | | | IOAS |<---| HWPT_PAGING |<---------------------| DEVICE | | | |________________| |_____________| |________| | | | | | | |_________|____________________|__________________________________|_____| | | | | ______v_____ ___v__ | PFN storage | (paging) | |struct| |------------>|iommu_domain|<-----------------------|device| |____________| |______| _______________________________________________________________________ | iommufd (with HWPT_NESTED) | | | | [1] [3] [4] [2] | | ________________ _____________ _____________ ________ | | | | | | | | | | | | | IOAS |<---| HWPT_PAGING |<---| HWPT_NESTED |<--| DEVICE | | | |________________| |_____________| |_____________| |________| | | | | | | | |_________|____________________|__________________|_______________|_____| | | | | | ______v_____ ______v_____ ___v__ | PFN storage | (paging) | | (nested) | |struct| |------------>|iommu_domain|<----|iommu_domain|<----|device| |____________| |____________| |______| _______________________________________________________________________ | iommufd (with vIOMMU/vDEVICE) | | | | [5] [6] | | _____________ _____________ | | | | | | | | |----------------| vIOMMU |<---| vDEVICE |<----| | | | | | |_____________| | | | | | | | | | | [1] | | [4] | [2] | | | ______ | | _____________ _|______ | | | | | | [3] | | | | | | | | | IOAS |<---|(HWPT_PAGING)|<---| HWPT_NESTED |<--| DEVICE | | | | |______| |_____________| |_____________| |________| | | | | | | | | |______|________|______________|__________________|_______________|_____| | | | | | ______v_____ | ______v_____ ______v_____ ___v__ | struct | | PFN | (paging) | | (nested) | |struct| |iommu_device| |------>|iommu_domain|<----|iommu_domain|<----|device| |____________| storage|____________| |____________| |______|}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubhenumerated_list)}(hhh](j)}(hX+IOMMUFD_OBJ_IOAS is created via the IOMMU_IOAS_ALLOC uAPI. An iommufd can hold multiple IOAS objects. IOAS is the most generic object and does not expose interfaces that are specific to single IOMMU drivers. All operations on the IOAS must operate equally on each of the iommu_domains inside of it. h]h)}(hX*IOMMUFD_OBJ_IOAS is created via the IOMMU_IOAS_ALLOC uAPI. An iommufd can hold multiple IOAS objects. IOAS is the most generic object and does not expose interfaces that are specific to single IOMMU drivers. All operations on the IOAS must operate equally on each of the iommu_domains inside of it.h]hX*IOMMUFD_OBJ_IOAS is created via the IOMMU_IOAS_ALLOC uAPI. An iommufd can hold multiple IOAS objects. IOAS is the most generic object and does not expose interfaces that are specific to single IOMMU drivers. All operations on the IOAS must operate equally on each of the iommu_domains inside of it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_DEVICE is created when an external driver calls the IOMMUFD kAPI to bind a device to an iommufd. The driver is expected to implement a set of ioctls to allow userspace to initiate the binding operation. Successful completion of this operation establishes the desired DMA ownership over the device. The driver must also set the driver_managed_dma flag and must not touch the device until this operation succeeds. h]h)}(hXIOMMUFD_OBJ_DEVICE is created when an external driver calls the IOMMUFD kAPI to bind a device to an iommufd. The driver is expected to implement a set of ioctls to allow userspace to initiate the binding operation. Successful completion of this operation establishes the desired DMA ownership over the device. The driver must also set the driver_managed_dma flag and must not touch the device until this operation succeeds.h]hXIOMMUFD_OBJ_DEVICE is created when an external driver calls the IOMMUFD kAPI to bind a device to an iommufd. The driver is expected to implement a set of ioctls to allow userspace to initiate the binding operation. Successful completion of this operation establishes the desired DMA ownership over the device. The driver must also set the driver_managed_dma flag and must not touch the device until this operation succeeds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXIOMMUFD_OBJ_HWPT_PAGING can be created in two ways: * IOMMUFD_OBJ_HWPT_PAGING is automatically created when an external driver calls the IOMMUFD kAPI to attach a bound device to an IOAS. Similarly the external driver uAPI allows userspace to initiate the attaching operation. If a compatible member HWPT_PAGING object exists in the IOAS's HWPT_PAGING list, then it will be reused. Otherwise a new HWPT_PAGING that represents an iommu_domain to userspace will be created, and then added to the list. Successful completion of this operation sets up the linkages among IOAS, device and iommu_domain. Once this completes the device could do DMA. * IOMMUFD_OBJ_HWPT_PAGING can be manually created via the IOMMU_HWPT_ALLOC uAPI, provided an ioas_id via @pt_id to associate the new HWPT_PAGING to the corresponding IOAS object. The benefit of this manual allocation is to allow allocation flags (defined in enum iommufd_hwpt_alloc_flags), e.g. it allocates a nesting parent HWPT_PAGING if the IOMMU_HWPT_ALLOC_NEST_PARENT flag is set. h](h)}(h3IOMMUFD_OBJ_HWPT_PAGING can be created in two ways:h]h3IOMMUFD_OBJ_HWPT_PAGING can be created in two ways:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hhh](j)}(hXLIOMMUFD_OBJ_HWPT_PAGING is automatically created when an external driver calls the IOMMUFD kAPI to attach a bound device to an IOAS. Similarly the external driver uAPI allows userspace to initiate the attaching operation. If a compatible member HWPT_PAGING object exists in the IOAS's HWPT_PAGING list, then it will be reused. Otherwise a new HWPT_PAGING that represents an iommu_domain to userspace will be created, and then added to the list. Successful completion of this operation sets up the linkages among IOAS, device and iommu_domain. Once this completes the device could do DMA. h]h)}(hXKIOMMUFD_OBJ_HWPT_PAGING is automatically created when an external driver calls the IOMMUFD kAPI to attach a bound device to an IOAS. Similarly the external driver uAPI allows userspace to initiate the attaching operation. If a compatible member HWPT_PAGING object exists in the IOAS's HWPT_PAGING list, then it will be reused. Otherwise a new HWPT_PAGING that represents an iommu_domain to userspace will be created, and then added to the list. Successful completion of this operation sets up the linkages among IOAS, device and iommu_domain. Once this completes the device could do DMA.h]hXMIOMMUFD_OBJ_HWPT_PAGING is automatically created when an external driver calls the IOMMUFD kAPI to attach a bound device to an IOAS. Similarly the external driver uAPI allows userspace to initiate the attaching operation. If a compatible member HWPT_PAGING object exists in the IOAS’s HWPT_PAGING list, then it will be reused. Otherwise a new HWPT_PAGING that represents an iommu_domain to userspace will be created, and then added to the list. Successful completion of this operation sets up the linkages among IOAS, device and iommu_domain. Once this completes the device could do DMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hXIOMMUFD_OBJ_HWPT_PAGING can be manually created via the IOMMU_HWPT_ALLOC uAPI, provided an ioas_id via @pt_id to associate the new HWPT_PAGING to the corresponding IOAS object. The benefit of this manual allocation is to allow allocation flags (defined in enum iommufd_hwpt_alloc_flags), e.g. it allocates a nesting parent HWPT_PAGING if the IOMMU_HWPT_ALLOC_NEST_PARENT flag is set. h]h)}(hXIOMMUFD_OBJ_HWPT_PAGING can be manually created via the IOMMU_HWPT_ALLOC uAPI, provided an ioas_id via @pt_id to associate the new HWPT_PAGING to the corresponding IOAS object. The benefit of this manual allocation is to allow allocation flags (defined in enum iommufd_hwpt_alloc_flags), e.g. it allocates a nesting parent HWPT_PAGING if the IOMMU_HWPT_ALLOC_NEST_PARENT flag is set.h]hXIOMMUFD_OBJ_HWPT_PAGING can be manually created via the IOMMU_HWPT_ALLOC uAPI, provided an ioas_id via @pt_id to associate the new HWPT_PAGING to the corresponding IOAS object. The benefit of this manual allocation is to allow allocation flags (defined in enum iommufd_hwpt_alloc_flags), e.g. it allocates a nesting parent HWPT_PAGING if the IOMMU_HWPT_ALLOC_NEST_PARENT flag is set.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubj)}(hXIOMMUFD_OBJ_HWPT_NESTED can be only manually created via the IOMMU_HWPT_ALLOC uAPI, provided an hwpt_id or a viommu_id of a vIOMMU object encapsulating a nesting parent HWPT_PAGING via @pt_id to associate the new HWPT_NESTED object to the corresponding HWPT_PAGING object. The associating HWPT_PAGING object must be a nesting parent manually allocated via the same uAPI previously with an IOMMU_HWPT_ALLOC_NEST_PARENT flag, otherwise the allocation will fail. The allocation will be further validated by the IOMMU driver to ensure that the nesting parent domain and the nested domain being allocated are compatible. Successful completion of this operation sets up linkages among IOAS, device, and iommu_domains. Once this completes the device could do DMA via a 2-stage translation, a.k.a nested translation. Note that multiple HWPT_NESTED objects can be allocated by (and then associated to) the same nesting parent. .. note:: Either a manual IOMMUFD_OBJ_HWPT_PAGING or an IOMMUFD_OBJ_HWPT_NESTED is created via the same IOMMU_HWPT_ALLOC uAPI. The difference is at the type of the object passed in via the @pt_id field of struct iommufd_hwpt_alloc. h](h)}(hXIOMMUFD_OBJ_HWPT_NESTED can be only manually created via the IOMMU_HWPT_ALLOC uAPI, provided an hwpt_id or a viommu_id of a vIOMMU object encapsulating a nesting parent HWPT_PAGING via @pt_id to associate the new HWPT_NESTED object to the corresponding HWPT_PAGING object. The associating HWPT_PAGING object must be a nesting parent manually allocated via the same uAPI previously with an IOMMU_HWPT_ALLOC_NEST_PARENT flag, otherwise the allocation will fail. The allocation will be further validated by the IOMMU driver to ensure that the nesting parent domain and the nested domain being allocated are compatible. Successful completion of this operation sets up linkages among IOAS, device, and iommu_domains. Once this completes the device could do DMA via a 2-stage translation, a.k.a nested translation. Note that multiple HWPT_NESTED objects can be allocated by (and then associated to) the same nesting parent.h]hXIOMMUFD_OBJ_HWPT_NESTED can be only manually created via the IOMMU_HWPT_ALLOC uAPI, provided an hwpt_id or a viommu_id of a vIOMMU object encapsulating a nesting parent HWPT_PAGING via @pt_id to associate the new HWPT_NESTED object to the corresponding HWPT_PAGING object. The associating HWPT_PAGING object must be a nesting parent manually allocated via the same uAPI previously with an IOMMU_HWPT_ALLOC_NEST_PARENT flag, otherwise the allocation will fail. The allocation will be further validated by the IOMMU driver to ensure that the nesting parent domain and the nested domain being allocated are compatible. Successful completion of this operation sets up linkages among IOAS, device, and iommu_domains. Once this completes the device could do DMA via a 2-stage translation, a.k.a nested translation. Note that multiple HWPT_NESTED objects can be allocated by (and then associated to) the same nesting parent.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjIubj))}(hEither a manual IOMMUFD_OBJ_HWPT_PAGING or an IOMMUFD_OBJ_HWPT_NESTED is created via the same IOMMU_HWPT_ALLOC uAPI. The difference is at the type of the object passed in via the @pt_id field of struct iommufd_hwpt_alloc.h]h)}(hEither a manual IOMMUFD_OBJ_HWPT_PAGING or an IOMMUFD_OBJ_HWPT_NESTED is created via the same IOMMU_HWPT_ALLOC uAPI. The difference is at the type of the object passed in via the @pt_id field of struct iommufd_hwpt_alloc.h]hEither a manual IOMMUFD_OBJ_HWPT_PAGING or an IOMMUFD_OBJ_HWPT_NESTED is created via the same IOMMU_HWPT_ALLOC uAPI. The difference is at the type of the object passed in via the @pt_id field of struct iommufd_hwpt_alloc.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ubah}(h]h ]h"]h$]h&]uh1j(hjIubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubj)}(hXJIOMMUFD_OBJ_VIOMMU can be only manually created via the IOMMU_VIOMMU_ALLOC uAPI, provided a dev_id (for the device's physical IOMMU to back the vIOMMU) and an hwpt_id (to associate the vIOMMU to a nesting parent HWPT_PAGING). The iommufd core will link the vIOMMU object to the struct iommu_device that the struct device is behind. And an IOMMU driver can implement a viommu_alloc op to allocate its own vIOMMU data structure embedding the core-level structure iommufd_viommu and some driver-specific data. If necessary, the driver can also configure its HW virtualization feature for that vIOMMU (and thus for the VM). Successful completion of this operation sets up the linkages between the vIOMMU object and the HWPT_PAGING, then this vIOMMU object can be used as a nesting parent object to allocate an HWPT_NESTED object described above. h]h)}(hXIIOMMUFD_OBJ_VIOMMU can be only manually created via the IOMMU_VIOMMU_ALLOC uAPI, provided a dev_id (for the device's physical IOMMU to back the vIOMMU) and an hwpt_id (to associate the vIOMMU to a nesting parent HWPT_PAGING). The iommufd core will link the vIOMMU object to the struct iommu_device that the struct device is behind. And an IOMMU driver can implement a viommu_alloc op to allocate its own vIOMMU data structure embedding the core-level structure iommufd_viommu and some driver-specific data. If necessary, the driver can also configure its HW virtualization feature for that vIOMMU (and thus for the VM). Successful completion of this operation sets up the linkages between the vIOMMU object and the HWPT_PAGING, then this vIOMMU object can be used as a nesting parent object to allocate an HWPT_NESTED object described above.h]hXKIOMMUFD_OBJ_VIOMMU can be only manually created via the IOMMU_VIOMMU_ALLOC uAPI, provided a dev_id (for the device’s physical IOMMU to back the vIOMMU) and an hwpt_id (to associate the vIOMMU to a nesting parent HWPT_PAGING). The iommufd core will link the vIOMMU object to the struct iommu_device that the struct device is behind. And an IOMMU driver can implement a viommu_alloc op to allocate its own vIOMMU data structure embedding the core-level structure iommufd_viommu and some driver-specific data. If necessary, the driver can also configure its HW virtualization feature for that vIOMMU (and thus for the VM). Successful completion of this operation sets up the linkages between the vIOMMU object and the HWPT_PAGING, then this vIOMMU object can be used as a nesting parent object to allocate an HWPT_NESTED object described above.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXhIOMMUFD_OBJ_VDEVICE can be only manually created via the IOMMU_VDEVICE_ALLOC uAPI, provided a viommu_id for an iommufd_viommu object and a dev_id for an iommufd_device object. The vDEVICE object will be the binding between these two parent objects. Another @virt_id will be also set via the uAPI providing the iommufd core an index to store the vDEVICE object to a vDEVICE array per vIOMMU. If necessary, the IOMMU driver may choose to implement a vdevce_alloc op to init its HW for virtualization feature related to a vDEVICE. Successful completion of this operation sets up the linkages between vIOMMU and device. h]h)}(hXgIOMMUFD_OBJ_VDEVICE can be only manually created via the IOMMU_VDEVICE_ALLOC uAPI, provided a viommu_id for an iommufd_viommu object and a dev_id for an iommufd_device object. The vDEVICE object will be the binding between these two parent objects. Another @virt_id will be also set via the uAPI providing the iommufd core an index to store the vDEVICE object to a vDEVICE array per vIOMMU. If necessary, the IOMMU driver may choose to implement a vdevce_alloc op to init its HW for virtualization feature related to a vDEVICE. Successful completion of this operation sets up the linkages between vIOMMU and device.h]hXgIOMMUFD_OBJ_VDEVICE can be only manually created via the IOMMU_VDEVICE_ALLOC uAPI, provided a viommu_id for an iommufd_viommu object and a dev_id for an iommufd_device object. The vDEVICE object will be the binding between these two parent objects. Another @virt_id will be also set via the uAPI providing the iommufd core an index to store the vDEVICE object to a vDEVICE array per vIOMMU. If necessary, the IOMMU driver may choose to implement a vdevce_alloc op to init its HW for virtualization feature related to a vDEVICE. Successful completion of this operation sets up the linkages between vIOMMU and device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjhhhhhKubh)}(hA device can only bind to an iommufd due to DMA ownership claim and attach to at most one IOAS object (no support of PASID yet).h]hA device can only bind to an iommufd due to DMA ownership claim and attach to at most one IOAS object (no support of PASID yet).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubeh}(h]user-visible-objectsah ]h"]user visible objectsah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hKernel Datastructureh]hKernel Datastructure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hhjhhubh)}(hAn io_pagetable is composed of iopt_areas pointing at iopt_pages, along with a list of iommu_domains that mirror the IOVA to PFN map.h]hAn io_pagetable is composed of iopt_areas pointing at iopt_pages, along with a list of iommu_domains that mirror the IOVA to PFN map.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjhhubh)}(hMultiple io_pagetable-s, through their iopt_area-s, can share a single iopt_pages which avoids multi-pinning and double accounting of page consumption.h]hMultiple io_pagetable-s, through their iopt_area-s, can share a single iopt_pages which avoids multi-pinning and double accounting of page consumption.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMEhjhhubh)}(hiommufd_ioas is shareable between subsystems, e.g. VFIO and VDPA, as long as devices managed by different subsystems are bound to a same iommufd.h]hiommufd_ioas is shareable between subsystems, e.g. VFIO and VDPA, as long as devices managed by different subsystems are bound to a same iommufd.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhjhhubeh}(h]kernel-datastructureah ]h"]kernel datastructureah$]h&]uh1hhjhhhhhMubeh}(h] key-conceptsah ]h"] key conceptsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hIOMMUFD User APIh]hIOMMUFD User API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMMubhtarget)}(h.. _General ioctl format:h]h}(h]h ]h"]h$]h&]refidgeneral-ioctl-formatuh1j*hKhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hubh)}(h**General ioctl format**h]hstrong)}(hj;h]hGeneral ioctl format}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubah}(h]j7ah ]h"]general ioctl formatah$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhexpect_referenced_by_name}jPj,sexpect_referenced_by_id}j7j,subh)}(hX{The ioctl interface follows a general format to allow for extensibility. Each ioctl is passed in a structure pointer as the argument providing the size of the structure in the first u32. The kernel checks that any structure space beyond what it understands is 0. This allows userspace to use the backward compatible portion while consistently using the newer, larger, structures.h]hX{The ioctl interface follows a general format to allow for extensibility. Each ioctl is passed in a structure pointer as the argument providing the size of the structure in the first u32. The kernel checks that any structure space beyond what it understands is 0. This allows userspace to use the backward compatible portion while consistently using the newer, larger, structures.$}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK hjhhubh)}(h0ioctls use a standard meaning for common errnos:h]h0ioctls use a standard meaning for common errnos:}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh block_quote)}(hX- ENOTTY: The IOCTL number itself is not supported at all - E2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand. - EOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support. - EINVAL: Everything about the IOCTL was understood, but a field is not correct. - ENOENT: An ID or IOVA provided does not exist. - ENOMEM: Out of memory. - EOVERFLOW: Mathematics overflowed. h]j)}(hhh](j)}(h7ENOTTY: The IOCTL number itself is not supported at allh]h)}(hjh]h7ENOTTY: The IOCTL number itself is not supported at all}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.h]h)}(hwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.h]hwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hEOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.h]h)}(hEOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.h]hEOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hNEINVAL: Everything about the IOCTL was understood, but a field is not correct.h]h)}(hNEINVAL: Everything about the IOCTL was understood, but a field is not correct.h]hNEINVAL: Everything about the IOCTL was understood, but a field is not correct.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(h.ENOENT: An ID or IOVA provided does not exist.h]h)}(hjh]h.ENOENT: An ID or IOVA provided does not exist.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hENOMEM: Out of memory.h]h)}(hjh]hENOMEM: Out of memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(h#EOVERFLOW: Mathematics overflowed. h]h)}(h"EOVERFLOW: Mathematics overflowed.h]h"EOVERFLOW: Mathematics overflowed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjxubah}(h]h ]h"]h$]h&]uh1jvhjhKhjhhubh)}(h5As well as additional errnos, within specific ioctls.h]h5As well as additional errnos, within specific ioctls.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK!hjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleiommu_destroy (C struct)c.iommu_destroyhNtauh1jFhjhhhj8hNubhdesc)}(hhh](hdesc_signature)}(h iommu_destroyh]hdesc_signature_line)}(hstruct iommu_destroyh](hdesc_sig_keyword)}(hstructh]hstruct}(hjjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhhjdhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK&ubhdesc_sig_space)}(h h]h }(hj|hhhNhNubah}(h]h ]wah"]h$]h&]uh1jzhjdhhhjyhK&ubh desc_name)}(h iommu_destroyh]h desc_sig_name)}(hj`h]h iommu_destroy}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjdhhhjyhK&ubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jbsphinx_line_type declaratorhj^hhhjyhK&ubah}(h]jUah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j\hjyhK&hjYhhubh desc_content)}(hhh]h)}(hioctl(IOMMU_DESTROY)h]hioctl(IOMMU_DESTROY)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK@hjhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjyhK&ubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jWhhhjhj8hNubh container)}(h**Definition**:: struct iommu_destroy { __u32 size; __u32 id; }; **Members** ``size`` sizeof(struct iommu_destroy) ``id`` iommufd object ID to destroy. Can be any destroyable object type.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKDhjubj)}(h7struct iommu_destroy { __u32 size; __u32 id; };h]h7struct iommu_destroy { __u32 size; __u32 id; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKFhjubh)}(h **Members**h]j>)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKKhjubhdefinition_list)}(hhh](hdefinition_list_item)}(h&``size`` sizeof(struct iommu_destroy) h](hterm)}(h``size``h]hliteral)}(hj> h]hsize}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj< ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKBhj6 ubh definition)}(hhh]h)}(hsizeof(struct iommu_destroy)h]hsizeof(struct iommu_destroy)}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU hKBhjX ubah}(h]h ]h"]h$]h&]uh1jV hj6 ubeh}(h]h ]h"]h$]h&]uh1j4 hjU hKBhj1 ubj5 )}(hH``id`` iommufd object ID to destroy. Can be any destroyable object type.h](j; )}(h``id``h]jA )}(hj{ h]hid}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjy ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKBhju ubjW )}(hhh]h)}(hAiommufd object ID to destroy. Can be any destroyable object type.h]hAiommufd object ID to destroy. Can be any destroyable object type.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKChj ubah}(h]h ]h"]h$]h&]uh1jV hju ubeh}(h]h ]h"]h$]h&]uh1j4 hj hKBhj1 ubeh}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKFhjhhubh)}(h'Destroy any object held within iommufd.h]h'Destroy any object held within iommufd.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKChjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_ioas_alloc (C struct)c.iommu_ioas_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_alloch]jc)}(hstruct iommu_ioas_alloch](ji)}(hjlh]hstruct}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKHubj{)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj hhhj hKHubj)}(hiommu_ioas_alloch]j)}(hj h]hiommu_ioas_alloc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hKHubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj hhhj hKHubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j\hj hKHhj hhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_ALLOC)h]hioctl(IOMMU_IOAS_ALLOC)}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKMhj; hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKHubeh}(h]h ](jstructeh"]h$]h&]jjjjV jjV jjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_ioas_alloc { __u32 size; __u32 flags; __u32 out_ioas_id; }; **Members** ``size`` sizeof(struct iommu_ioas_alloc) ``flags`` Must be 0 ``out_ioas_id`` Output IOAS ID for the allocated objecth](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj^ ubh:}(hj^ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKQhjZ ubj)}(hTstruct iommu_ioas_alloc { __u32 size; __u32 flags; __u32 out_ioas_id; };h]hTstruct iommu_ioas_alloc { __u32 size; __u32 flags; __u32 out_ioas_id; };}hj{ sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKShjZ ubh)}(h **Members**h]j>)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKYhjZ ubj0 )}(hhh](j5 )}(h)``size`` sizeof(struct iommu_ioas_alloc) h](j; )}(h``size``h]jA )}(hj h]hsize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKOhj ubjW )}(hhh]h)}(hsizeof(struct iommu_ioas_alloc)h]hsizeof(struct iommu_ioas_alloc)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKOhj ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj hKOhj ubj5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hj h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKPhj ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKPhj ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj hKPhj ubj5 )}(h7``out_ioas_id`` Output IOAS ID for the allocated objecth](j; )}(h``out_ioas_id``h]jA )}(hj h]h out_ioas_id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKPhj ubjW )}(hhh]h)}(h'Output IOAS ID for the allocated objecth]h'Output IOAS ID for the allocated object}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKQhj3 ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj2 hKPhj ubeh}(h]h ]h"]h$]h&]uh1j/ hjZ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj` h]h Description}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj^ ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKThjhhubh)}(h_Allocate an IO Address Space (IOAS) which holds an IO Virtual Address (IOVA) to memory mapping.h]h_Allocate an IO Address Space (IOAS) which holds an IO Virtual Address (IOVA) to memory mapping.}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKQhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_iova_range (C struct)c.iommu_iova_rangehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_iova_rangeh]jc)}(hstruct iommu_iova_rangeh](ji)}(hjlh]hstruct}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKWubj{)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj hhhj hKWubj)}(hiommu_iova_rangeh]j)}(hj h]hiommu_iova_range}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hKWubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj hhhj hKWubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j\hj hKWhj hhubj)}(hhh]h)}(hioctl(IOMMU_IOVA_RANGE)h]hioctl(IOMMU_IOVA_RANGE)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK]hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKWubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_iova_range { __aligned_u64 start; __aligned_u64 last; }; **Members** ``start`` First IOVA ``last`` Inclusive last IOVAh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKahj ubj)}(hMstruct iommu_iova_range { __aligned_u64 start; __aligned_u64 last; };h]hMstruct iommu_iova_range { __aligned_u64 start; __aligned_u64 last; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKchj ubh)}(h **Members**h]j>)}(hj. h]hMembers}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj, ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhhj ubj0 )}(hhh](j5 )}(h``start`` First IOVA h](j; )}(h ``start``h]jA )}(hjM h]hstart}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjK ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK_hjG ubjW )}(hhh]h)}(h First IOVAh]h First IOVA}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb hK_hjc ubah}(h]h ]h"]h$]h&]uh1jV hjG ubeh}(h]h ]h"]h$]h&]uh1j4 hjb hK_hjD ubj5 )}(h``last`` Inclusive last IOVAh](j; )}(h``last``h]jA )}(hj h]hlast}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK_hj ubjW )}(hhh]h)}(hInclusive last IOVAh]hInclusive last IOVA}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK`hj ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj hK_hjD ubeh}(h]h ]h"]h$]h&]uh1j/ hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKchjhhubh)}(hAn interval in IOVA space.h]hAn interval in IOVA space.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK`hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS!iommu_ioas_iova_ranges (C struct)c.iommu_ioas_iova_rangeshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_iova_rangesh]jc)}(hstruct iommu_ioas_iova_rangesh](ji)}(hjlh]hstruct}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKeubj{)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj hhhj hKeubj)}(hiommu_ioas_iova_rangesh]j)}(hj h]hiommu_ioas_iova_ranges}(hj' hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj# ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hKeubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj hhhj hKeubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j\hj hKehj hhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_IOVA_RANGES)h]hioctl(IOMMU_IOAS_IOVA_RANGES)}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKihjF hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKeubeh}(h]h ](jstructeh"]h$]h&]jjjja jja jjjuh1jWhhhjhj8hNubj)}(hX2**Definition**:: struct iommu_ioas_iova_ranges { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; __aligned_u64 out_iova_alignment; }; **Members** ``size`` sizeof(struct iommu_ioas_iova_ranges) ``ioas_id`` IOAS ID to read ranges from ``num_iovas`` Input/Output total number of ranges in the IOAS ``__reserved`` Must be 0 ``allowed_iovas`` Pointer to the output array of struct iommu_iova_range ``out_iova_alignment`` Minimum alignment required for mapping IOVAh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hji ubh:}(hji hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKmhje ubj)}(hstruct iommu_ioas_iova_ranges { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; __aligned_u64 out_iova_alignment; };h]hstruct iommu_ioas_iova_ranges { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; __aligned_u64 out_iova_alignment; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKohje ubh)}(h **Members**h]j>)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKxhje ubj0 )}(hhh](j5 )}(h/``size`` sizeof(struct iommu_ioas_iova_ranges) h](j; )}(h``size``h]jA )}(hj h]hsize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKkhj ubjW )}(hhh]h)}(h%sizeof(struct iommu_ioas_iova_ranges)h]h%sizeof(struct iommu_ioas_iova_ranges)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKkhj ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj hKkhj ubj5 )}(h(``ioas_id`` IOAS ID to read ranges from h](j; )}(h ``ioas_id``h]jA )}(hj h]hioas_id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKlhj ubjW )}(hhh]h)}(hIOAS ID to read ranges fromh]hIOAS ID to read ranges from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKlhjubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hjhKlhj ubj5 )}(h>``num_iovas`` Input/Output total number of ranges in the IOAS h](j; )}(h ``num_iovas``h]jA )}(hj(h]h num_iovas}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj&ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKmhj"ubjW )}(hhh]h)}(h/Input/Output total number of ranges in the IOASh]h/Input/Output total number of ranges in the IOAS}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKmhj>ubah}(h]h ]h"]h$]h&]uh1jV hj"ubeh}(h]h ]h"]h$]h&]uh1j4 hj=hKmhj ubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjah]h __reserved}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj_ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKnhj[ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhKnhjwubah}(h]h ]h"]h$]h&]uh1jV hj[ubeh}(h]h ]h"]h$]h&]uh1j4 hjvhKnhj ubj5 )}(hI``allowed_iovas`` Pointer to the output array of struct iommu_iova_range h](j; )}(h``allowed_iovas``h]jA )}(hjh]h allowed_iovas}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKohjubjW )}(hhh]h)}(h6Pointer to the output array of struct iommu_iova_rangeh]h6Pointer to the output array of struct iommu_iova_range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKohjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKohj ubj5 )}(hB``out_iova_alignment`` Minimum alignment required for mapping IOVAh](j; )}(h``out_iova_alignment``h]jA )}(hjh]hout_iova_alignment}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKohjubjW )}(hhh]h)}(h+Minimum alignment required for mapping IOVAh]h+Minimum alignment required for mapping IOVA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKphjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKohj ubeh}(h]h ]h"]h$]h&]uh1j/ hje ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKshjhhubh)}(hQuery an IOAS for ranges of allowed IOVAs. Mapping IOVA outside these ranges is not allowed. num_iovas will be set to the total number of iovas and the allowed_iovas[] will be filled in as space permits.h]hQuery an IOAS for ranges of allowed IOVAs. Mapping IOVA outside these ranges is not allowed. num_iovas will be set to the total number of iovas and the allowed_iovas[] will be filled in as space permits.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKphjhhubh)}(hXThe allowed ranges are dependent on the HW path the DMA operation takes, and can change during the lifetime of the IOAS. A fresh empty IOAS will have a full range, and each attached device will narrow the ranges based on that device's HW restrictions. Detaching a device can widen the ranges. Userspace should query ranges after every attach/detach to know what IOVAs are valid for mapping.h]hXThe allowed ranges are dependent on the HW path the DMA operation takes, and can change during the lifetime of the IOAS. A fresh empty IOAS will have a full range, and each attached device will narrow the ranges based on that device’s HW restrictions. Detaching a device can widen the ranges. Userspace should query ranges after every attach/detach to know what IOVAs are valid for mapping.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKthjhhubh)}(hX*On input num_iovas is the length of the allowed_iovas array. On output it is the total number of iovas filled in. The ioctl will return -EMSGSIZE and set num_iovas to the required value if num_iovas is too small. In this case the caller should allocate a larger output array and re-issue the ioctl.h]hX*On input num_iovas is the length of the allowed_iovas array. On output it is the total number of iovas filled in. The ioctl will return -EMSGSIZE and set num_iovas to the required value if num_iovas is too small. In this case the caller should allocate a larger output array and re-issue the ioctl.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhK{hjhhubh)}(huout_iova_alignment returns the minimum IOVA alignment that can be given to IOMMU_IOAS_MAP/COPY. IOVA's must satisfy::h]hvout_iova_alignment returns the minimum IOVA alignment that can be given to IOMMU_IOAS_MAP/COPY. IOVA’s must satisfy:}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubj)}(hZstarting_iova % out_iova_alignment == 0 (starting_iova + length) % out_iova_alignment == 0h]hZstarting_iova % out_iova_alignment == 0 (starting_iova + length) % out_iova_alignment == 0}hjhsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hjout_iova_alignment can be 1 indicating any IOVA is allowed. It cannot be higher than the system PAGE_SIZE.h]hjout_iova_alignment can be 1 indicating any IOVA is allowed. It cannot be higher than the system PAGE_SIZE.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS!iommu_ioas_allow_iovas (C struct)c.iommu_ioas_allow_iovashNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_allow_iovash]jc)}(hstruct iommu_ioas_allow_iovash](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhKubj)}(hiommu_ioas_allow_iovash]j)}(hjh]hiommu_ioas_allow_iovas}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhKhjhhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_ALLOW_IOVAS)h]hioctl(IOMMU_IOAS_ALLOW_IOVAS)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_ioas_allow_iovas { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; }; **Members** ``size`` sizeof(struct iommu_ioas_allow_iovas) ``ioas_id`` IOAS ID to allow IOVAs from ``num_iovas`` Input/Output total number of ranges in the IOAS ``__reserved`` Must be 0 ``allowed_iovas`` Pointer to array of struct iommu_iova_rangeh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubj)}(hstruct iommu_ioas_allow_iovas { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; };h]hstruct iommu_ioas_allow_iovas { __u32 size; __u32 ioas_id; __u32 num_iovas; __u32 __reserved; __aligned_u64 allowed_iovas; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubh)}(h **Members**h]j>)}(hj/h]hMembers}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj-ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubj0 )}(hhh](j5 )}(h/``size`` sizeof(struct iommu_ioas_allow_iovas) h](j; )}(h``size``h]jA )}(hjNh]hsize}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjLubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjHubjW )}(hhh]h)}(h%sizeof(struct iommu_ioas_allow_iovas)h]h%sizeof(struct iommu_ioas_allow_iovas)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKhjdubah}(h]h ]h"]h$]h&]uh1jV hjHubeh}(h]h ]h"]h$]h&]uh1j4 hjchKhjEubj5 )}(h(``ioas_id`` IOAS ID to allow IOVAs from h](j; )}(h ``ioas_id``h]jA )}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hIOAS ID to allow IOVAs fromh]hIOAS ID to allow IOVAs from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjEubj5 )}(h>``num_iovas`` Input/Output total number of ranges in the IOAS h](j; )}(h ``num_iovas``h]jA )}(hjh]h num_iovas}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h/Input/Output total number of ranges in the IOASh]h/Input/Output total number of ranges in the IOAS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjEubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjh]h __reserved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjEubj5 )}(h=``allowed_iovas`` Pointer to array of struct iommu_iova_rangeh](j; )}(h``allowed_iovas``h]jA )}(hj2h]h allowed_iovas}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj0ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj,ubjW )}(hhh]h)}(h+Pointer to array of struct iommu_iova_rangeh]h+Pointer to array of struct iommu_iova_range}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjHubah}(h]h ]h"]h$]h&]uh1jV hj,ubeh}(h]h ]h"]h$]h&]uh1j4 hjGhKhjEubeh}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjuh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjsubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hX"Ensure a range of IOVAs are always available for allocation. If this call succeeds then IOMMU_IOAS_IOVA_RANGES will never return a list of IOVA ranges that are narrower than the ranges provided here. This call will fail if IOMMU_IOAS_IOVA_RANGES is currently narrower than the given ranges.h]hX"Ensure a range of IOVAs are always available for allocation. If this call succeeds then IOMMU_IOAS_IOVA_RANGES will never return a list of IOVA ranges that are narrower than the ranges provided here. This call will fail if IOMMU_IOAS_IOVA_RANGES is currently narrower than the given ranges.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hX3When an IOAS is first created the IOVA_RANGES will be maximally sized, and as devices are attached the IOVA will narrow based on the device restrictions. When an allowed range is specified any narrowing will be refused, ie device attachment can fail if the device requires limiting within the allowed range.h]hX3When an IOAS is first created the IOVA_RANGES will be maximally sized, and as devices are attached the IOVA will narrow based on the device restrictions. When an allowed range is specified any narrowing will be refused, ie device attachment can fail if the device requires limiting within the allowed range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(h}Automatic IOVA allocation is also impacted by this call. MAP will only allocate within the allowed IOVAs if they are present.h]h}Automatic IOVA allocation is also impacted by this call. MAP will only allocate within the allowed IOVAs if they are present.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(h?This call replaces the entire allowed list with the given list.h]h?This call replaces the entire allowed list with the given list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_ioas_map_flags (C enum)c.iommufd_ioas_map_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_ioas_map_flagsh]jc)}(henum iommufd_ioas_map_flagsh](ji)}(henumh]henum}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhKubj)}(hiommufd_ioas_map_flagsh]j)}(hjh]hiommufd_ioas_map_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhKhjhhubj)}(hhh]h)}(hFlags for map and copyh]hFlags for map and copy}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jenumeh"]h$]h&]jjjj;jj;jjjuh1jWhhhjhj8hNubj)}(hX **Constants** ``IOMMU_IOAS_MAP_FIXED_IOVA`` If clear the kernel will compute an appropriate IOVA to place the mapping at ``IOMMU_IOAS_MAP_WRITEABLE`` DMA is allowed to write to this mapping ``IOMMU_IOAS_MAP_READABLE`` DMA is allowed to read from this mappingh](h)}(h **Constants**h]j>)}(hjEh]h Constants}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjCubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj?ubj0 )}(hhh](j5 )}(hk``IOMMU_IOAS_MAP_FIXED_IOVA`` If clear the kernel will compute an appropriate IOVA to place the mapping at h](j; )}(h``IOMMU_IOAS_MAP_FIXED_IOVA``h]jA )}(hjdh]hIOMMU_IOAS_MAP_FIXED_IOVA}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjbubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj^ubjW )}(hhh]h)}(hLIf clear the kernel will compute an appropriate IOVA to place the mapping ath]hLIf clear the kernel will compute an appropriate IOVA to place the mapping at}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjzubah}(h]h ]h"]h$]h&]uh1jV hj^ubeh}(h]h ]h"]h$]h&]uh1j4 hjyhKhj[ubj5 )}(hE``IOMMU_IOAS_MAP_WRITEABLE`` DMA is allowed to write to this mapping h](j; )}(h``IOMMU_IOAS_MAP_WRITEABLE``h]jA )}(hjh]hIOMMU_IOAS_MAP_WRITEABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h'DMA is allowed to write to this mappingh]h'DMA is allowed to write to this mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhj[ubj5 )}(hD``IOMMU_IOAS_MAP_READABLE`` DMA is allowed to read from this mappingh](j; )}(h``IOMMU_IOAS_MAP_READABLE``h]jA )}(hjh]hIOMMU_IOAS_MAP_READABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h(DMA is allowed to read from this mappingh]h(DMA is allowed to read from this mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhj[ubeh}(h]h ]h"]h$]h&]uh1j/ hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_ioas_map (C struct)c.iommu_ioas_maphNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_maph]jc)}(hstruct iommu_ioas_maph](ji)}(hjlh]hstruct}(hj1hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj-hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKubj{)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj-hhhj>hKubj)}(hiommu_ioas_maph]j)}(hj+h]hiommu_ioas_map}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]hhuh1jhj-hhhj>hKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj)hhhj>hKubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1j\hj>hKhj&hhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_MAP)h]hioctl(IOMMU_IOAS_MAP)}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjphhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj>hKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hXc**Definition**:: struct iommu_ioas_map { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 user_va; __aligned_u64 length; __aligned_u64 iova; }; **Members** ``size`` sizeof(struct iommu_ioas_map) ``flags`` Combination of enum iommufd_ioas_map_flags ``ioas_id`` IOAS ID to change the mapping of ``__reserved`` Must be 0 ``user_va`` Userspace pointer to start mapping from ``length`` Number of bytes to map ``iova`` IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubj)}(hstruct iommu_ioas_map { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 user_va; __aligned_u64 length; __aligned_u64 iova; };h]hstruct iommu_ioas_map { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 user_va; __aligned_u64 length; __aligned_u64 iova; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubh)}(h **Members**h]j>)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubj0 )}(hhh](j5 )}(h'``size`` sizeof(struct iommu_ioas_map) h](j; )}(h``size``h]jA )}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hsizeof(struct iommu_ioas_map)h]hsizeof(struct iommu_ioas_map)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjubj5 )}(h5``flags`` Combination of enum iommufd_ioas_map_flags h](j; )}(h ``flags``h]jA )}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h*Combination of enum iommufd_ioas_map_flagsh]h*Combination of enum iommufd_ioas_map_flags}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj/ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hj.hKhjubj5 )}(h-``ioas_id`` IOAS ID to change the mapping of h](j; )}(h ``ioas_id``h]jA )}(hjRh]hioas_id}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjPubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjLubjW )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghKhjhubah}(h]h ]h"]h$]h&]uh1jV hjLubeh}(h]h ]h"]h$]h&]uh1j4 hjghKhjubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjh]h __reserved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjubj5 )}(h4``user_va`` Userspace pointer to start mapping from h](j; )}(h ``user_va``h]jA )}(hjh]huser_va}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h'Userspace pointer to start mapping fromh]h'Userspace pointer to start mapping from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjubj5 )}(h"``length`` Number of bytes to map h](j; )}(h ``length``h]jA )}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hNumber of bytes to maph]hNumber of bytes to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjubj5 )}(hq``iova`` IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.h](j; )}(h``iova``h]jA )}(hj6h]hiova}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj4ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj0ubjW )}(hhh]h)}(hhIOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.h]hhIOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhKhjLubah}(h]h ]h"]h$]h&]uh1jV hj0ubeh}(h]h ]h"]h$]h&]uh1j4 hjKhKhjubeh}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjxh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjvubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hSet an IOVA mapping from a user pointer. If FIXED_IOVA is specified then the mapping will be established at iova, otherwise a suitable location based on the reserved and allowed lists will be automatically selected and returned in iova.h]hSet an IOVA mapping from a user pointer. If FIXED_IOVA is specified then the mapping will be established at iova, otherwise a suitable location based on the reserved and allowed lists will be automatically selected and returned in iova.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hyIf IOMMU_IOAS_MAP_FIXED_IOVA is specified then the iova range must currently be unused, existing IOVA cannot be replaced.h]hyIf IOMMU_IOAS_MAP_FIXED_IOVA is specified then the iova range must currently be unused, existing IOVA cannot be replaced.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS$iommu_ioas_noiommu_get_pa (C struct)c.iommu_ioas_noiommu_get_pahNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_noiommu_get_pah]jc)}(h struct iommu_ioas_noiommu_get_pah](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhKubj)}(hiommu_ioas_noiommu_get_pah]j)}(hjh]hiommu_ioas_noiommu_get_pa}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhKhjhhubj)}(hhh]h)}(h ioctl(IOMMU_IOAS_NOIOMMU_GET_PA)h]h ioctl(IOMMU_IOAS_NOIOMMU_GET_PA)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_ioas_noiommu_get_pa { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 out_phys; }; **Members** ``size`` sizeof(struct iommu_ioas_noiommu_get_pa) ``flags`` Reserved, must be 0 for now ``ioas_id`` IOAS ID to query IOVA to PA mapping from ``__reserved`` Must be 0 ``iova`` IOVA to query ``length`` On input, non-zero maximum number of bytes to query starting from **iova**. On output, number of physically contiguous bytes starting from **out_phys**, capped by the input length. ``out_phys`` Output physical address the IOVA maps toh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj'ubh:}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj#ubj)}(hstruct iommu_ioas_noiommu_get_pa { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 out_phys; };h]hstruct iommu_ioas_noiommu_get_pa { __u32 size; __u32 flags; __u32 ioas_id; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 out_phys; };}hjDsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj#ubh)}(h **Members**h]j>)}(hjUh]hMembers}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjSubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj#ubj0 )}(hhh](j5 )}(h2``size`` sizeof(struct iommu_ioas_noiommu_get_pa) h](j; )}(h``size``h]jA )}(hjth]hsize}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjrubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjnubjW )}(hhh]h)}(h(sizeof(struct iommu_ioas_noiommu_get_pa)h]h(sizeof(struct iommu_ioas_noiommu_get_pa)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjnubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjkubj5 )}(h&``flags`` Reserved, must be 0 for now h](j; )}(h ``flags``h]jA )}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hReserved, must be 0 for nowh]hReserved, must be 0 for now}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjkubj5 )}(h5``ioas_id`` IOAS ID to query IOVA to PA mapping from h](j; )}(h ``ioas_id``h]jA )}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h(IOAS ID to query IOVA to PA mapping fromh]h(IOAS ID to query IOVA to PA mapping from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjkubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjh]h __reserved}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hKhj5ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hj4hKhjkubj5 )}(h``iova`` IOVA to query h](j; )}(h``iova``h]jA )}(hjXh]hiova}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjVubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjRubjW )}(hhh]h)}(h IOVA to queryh]h IOVA to query}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhKhjnubah}(h]h ]h"]h$]h&]uh1jV hjRubeh}(h]h ]h"]h$]h&]uh1j4 hjmhKhjkubj5 )}(h``length`` On input, non-zero maximum number of bytes to query starting from **iova**. On output, number of physically contiguous bytes starting from **out_phys**, capped by the input length. h](j; )}(h ``length``h]jA )}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hOn input, non-zero maximum number of bytes to query starting from **iova**. On output, number of physically contiguous bytes starting from **out_phys**, capped by the input length.h](hBOn input, non-zero maximum number of bytes to query starting from }(hjhhhNhNubj>)}(h**iova**h]hiova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubhA. On output, number of physically contiguous bytes starting from }(hjhhhNhNubj>)}(h **out_phys**h]hout_phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh, capped by the input length.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjkubj5 )}(h5``out_phys`` Output physical address the IOVA maps toh](j; )}(h ``out_phys``h]jA )}(hjh]hout_phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h(Output physical address the IOVA maps toh]h(Output physical address the IOVA maps to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjkubeh}(h]h ]h"]h$]h&]uh1j/ hj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj0ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hQuery the physical address backing an IOVA range. The beginning of the range must be mapped already and length must be non-zero. For noiommu devices doing unsafe DMA only.h]hQuery the physical address backing an IOVA range. The beginning of the range must be mapped already and length must be non-zero. For noiommu devices doing unsafe DMA only.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_ioas_map_file (C struct)c.iommu_ioas_map_filehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_map_fileh]jc)}(hstruct iommu_ioas_map_fileh](ji)}(hjlh]hstruct}(hjphhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjlhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKubj{)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjlhhhj}hKubj)}(hiommu_ioas_map_fileh]j)}(hjjh]hiommu_ioas_map_file}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjlhhhj}hKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhhj}hKubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1j\hj}hKhjehhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_MAP_FILE)h]hioctl(IOMMU_IOAS_MAP_FILE)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjehhhj}hKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_ioas_map_file { __u32 size; __u32 flags; __u32 ioas_id; __s32 fd; __aligned_u64 start; __aligned_u64 length; __aligned_u64 iova; }; **Members** ``size`` sizeof(struct iommu_ioas_map_file) ``flags`` same as for iommu_ioas_map ``ioas_id`` same as for iommu_ioas_map ``fd`` the memfd or supported dma-buf file to map ``start`` byte offset from start of the file to map from ``length`` same as for iommu_ioas_map ``iova`` same as for iommu_ioas_maph](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubj)}(hstruct iommu_ioas_map_file { __u32 size; __u32 flags; __u32 ioas_id; __s32 fd; __aligned_u64 start; __aligned_u64 length; __aligned_u64 iova; };h]hstruct iommu_ioas_map_file { __u32 size; __u32 flags; __u32 ioas_id; __s32 fd; __aligned_u64 start; __aligned_u64 length; __aligned_u64 iova; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubh)}(h **Members**h]j>)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjubj0 )}(hhh](j5 )}(h,``size`` sizeof(struct iommu_ioas_map_file) h](j; )}(h``size``h]jA )}(hjh]hsize}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(h"sizeof(struct iommu_ioas_map_file)h]h"sizeof(struct iommu_ioas_map_file)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hKhj5ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hj4hKhjubj5 )}(h%``flags`` same as for iommu_ioas_map h](j; )}(h ``flags``h]jA )}(hjXh]hflags}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjVubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjRubjW )}(hhh]h)}(hsame as for iommu_ioas_maph]hsame as for iommu_ioas_map}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhKhjnubah}(h]h ]h"]h$]h&]uh1jV hjRubeh}(h]h ]h"]h$]h&]uh1j4 hjmhKhjubj5 )}(h'``ioas_id`` same as for iommu_ioas_map h](j; )}(h ``ioas_id``h]jA )}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhjubjW )}(hhh]h)}(hsame as for iommu_ioas_maph]hsame as for iommu_ioas_map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhKhjubj5 )}(h2``fd`` the memfd or supported dma-buf file to map h](j; )}(h``fd``h]jA )}(hjh]hfd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(h*the memfd or supported dma-buf file to maph]h*the memfd or supported dma-buf file to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h9``start`` byte offset from start of the file to map from h](j; )}(h ``start``h]jA )}(hjh]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(h.byte offset from start of the file to map fromh]h.byte offset from start of the file to map from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h&``length`` same as for iommu_ioas_map h](j; )}(h ``length``h]jA )}(hj<h]hlength}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj:ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj6ubjW )}(hhh]h)}(hsame as for iommu_ioas_maph]hsame as for iommu_ioas_map}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jV hj6ubeh}(h]h ]h"]h$]h&]uh1j4 hjQhMhjubj5 )}(h#``iova`` same as for iommu_ioas_maph](j; )}(h``iova``h]jA )}(hjuh]hiova}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjsubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjoubjW )}(hhh]h)}(hsame as for iommu_ioas_maph]hsame as for iommu_ioas_map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubah}(h]h ]h"]h$]h&]uh1jV hjoubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXwSet an IOVA mapping from a memfd file. On kernels with dma-buf support, supported dma-buf files may also be accepted. This is not a generic dma-buf import path; currently supported dma-bufs include single-range VFIO PCI dma-bufs exported through VFIO_DEVICE_FEATURE_DMA_BUF, and other dma-bufs may be rejected. All other arguments and semantics match those of IOMMU_IOAS_MAP.h]hXwSet an IOVA mapping from a memfd file. On kernels with dma-buf support, supported dma-buf files may also be accepted. This is not a generic dma-buf import path; currently supported dma-bufs include single-range VFIO PCI dma-bufs exported through VFIO_DEVICE_FEATURE_DMA_BUF, and other dma-bufs may be rejected. All other arguments and semantics match those of IOMMU_IOAS_MAP.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_ioas_copy (C struct)c.iommu_ioas_copyhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_copyh]jc)}(hstruct iommu_ioas_copyh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhM ubj)}(hiommu_ioas_copyh]j)}(hjh]hiommu_ioas_copy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhM hjhhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_COPY)h]hioctl(IOMMU_IOAS_COPY)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj5hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jstructeh"]h$]h&]jjjjPjjPjjjuh1jWhhhjhj8hNubj)}(hX|**Definition**:: struct iommu_ioas_copy { __u32 size; __u32 flags; __u32 dst_ioas_id; __u32 src_ioas_id; __aligned_u64 length; __aligned_u64 dst_iova; __aligned_u64 src_iova; }; **Members** ``size`` sizeof(struct iommu_ioas_copy) ``flags`` Combination of enum iommufd_ioas_map_flags ``dst_ioas_id`` IOAS ID to change the mapping of ``src_ioas_id`` IOAS ID to copy from ``length`` Number of bytes to copy and map ``dst_iova`` IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input. ``src_iova`` IOVA to start the copyh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjXubh:}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjTubj)}(hstruct iommu_ioas_copy { __u32 size; __u32 flags; __u32 dst_ioas_id; __u32 src_ioas_id; __aligned_u64 length; __aligned_u64 dst_iova; __aligned_u64 src_iova; };h]hstruct iommu_ioas_copy { __u32 size; __u32 flags; __u32 dst_ioas_id; __u32 src_ioas_id; __aligned_u64 length; __aligned_u64 dst_iova; __aligned_u64 src_iova; };}hjusbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjTubh)}(h **Members**h]j>)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM'hjTubj0 )}(hhh](j5 )}(h(``size`` sizeof(struct iommu_ioas_copy) h](j; )}(h``size``h]jA )}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(hsizeof(struct iommu_ioas_copy)h]hsizeof(struct iommu_ioas_copy)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h5``flags`` Combination of enum iommufd_ioas_map_flags h](j; )}(h ``flags``h]jA )}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(h*Combination of enum iommufd_ioas_map_flagsh]h*Combination of enum iommufd_ioas_map_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h1``dst_ioas_id`` IOAS ID to change the mapping of h](j; )}(h``dst_ioas_id``h]jA )}(hjh]h dst_ioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hj,hMhjubj5 )}(h%``src_ioas_id`` IOAS ID to copy from h](j; )}(h``src_ioas_id``h]jA )}(hjPh]h src_ioas_id}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjNubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjJubjW )}(hhh]h)}(hIOAS ID to copy fromh]hIOAS ID to copy from}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1jV hjJubeh}(h]h ]h"]h$]h&]uh1j4 hjehMhjubj5 )}(h+``length`` Number of bytes to copy and map h](j; )}(h ``length``h]jA )}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(hNumber of bytes to copy and maph]hNumber of bytes to copy and map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(hv``dst_iova`` IOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input. h](j; )}(h ``dst_iova``h]jA )}(hjh]hdst_iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(hhIOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.h]hhIOVA the mapping was placed at. If IOMMU_IOAS_MAP_FIXED_IOVA is set then this must be provided as input.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h#``src_iova`` IOVA to start the copyh](j; )}(h ``src_iova``h]jA )}(hjh]hsrc_iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjubjW )}(hhh]h)}(hIOVA to start the copyh]hIOVA to start the copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/ hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM#hjhhubh)}(hCopy an already existing mapping from src_ioas_id and establish it in dst_ioas_id. The src iova/length must exactly match a range used with IOMMU_IOAS_MAP.h]hCopy an already existing mapping from src_ioas_id and establish it in dst_ioas_id. The src iova/length must exactly match a range used with IOMMU_IOAS_MAP.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjhhubh)}(hXThis may be used to efficiently clone a subset of an IOAS to another, or as a kind of 'cache' to speed up mapping. Copy has an efficiency advantage over establishing equivalent new mappings, as internal resources are shared, and the kernel will pin the user memory only once.h]hXThis may be used to efficiently clone a subset of an IOAS to another, or as a kind of ‘cache’ to speed up mapping. Copy has an efficiency advantage over establishing equivalent new mappings, as internal resources are shared, and the kernel will pin the user memory only once.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM$hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_ioas_unmap (C struct)c.iommu_ioas_unmaphNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_unmaph]jc)}(hstruct iommu_ioas_unmaph](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM,ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhM,ubj)}(hiommu_ioas_unmaph]j)}(hjh]hiommu_ioas_unmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM,ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhM,ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhM,hjhhubj)}(hhh]h)}(hioctl(IOMMU_IOAS_UNMAP)h]hioctl(IOMMU_IOAS_UNMAP)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM6hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM,ubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hXn**Definition**:: struct iommu_ioas_unmap { __u32 size; __u32 ioas_id; __aligned_u64 iova; __aligned_u64 length; }; **Members** ``size`` sizeof(struct iommu_ioas_unmap) ``ioas_id`` IOAS ID to change the mapping of ``iova`` IOVA to start the unmapping at ``length`` Number of bytes to unmap, and return back the bytes unmappedh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM:hjubj)}(hqstruct iommu_ioas_unmap { __u32 size; __u32 ioas_id; __aligned_u64 iova; __aligned_u64 length; };h]hqstruct iommu_ioas_unmap { __u32 size; __u32 ioas_id; __aligned_u64 iova; __aligned_u64 length; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM<hjubh)}(h **Members**h]j>)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMChjubj0 )}(hhh](j5 )}(h)``size`` sizeof(struct iommu_ioas_unmap) h](j; )}(h``size``h]jA )}(hj;h]hsize}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj9ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM8hj5ubjW )}(hhh]h)}(hsizeof(struct iommu_ioas_unmap)h]hsizeof(struct iommu_ioas_unmap)}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM8hjQubah}(h]h ]h"]h$]h&]uh1jV hj5ubeh}(h]h ]h"]h$]h&]uh1j4 hjPhM8hj2ubj5 )}(h-``ioas_id`` IOAS ID to change the mapping of h](j; )}(h ``ioas_id``h]jA )}(hjth]hioas_id}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjrubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM9hjnubjW )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM9hjubah}(h]h ]h"]h$]h&]uh1jV hjnubeh}(h]h ]h"]h$]h&]uh1j4 hjhM9hj2ubj5 )}(h(``iova`` IOVA to start the unmapping at h](j; )}(h``iova``h]jA )}(hjh]hiova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM:hjubjW )}(hhh]h)}(hIOVA to start the unmapping ath]hIOVA to start the unmapping at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM:hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM:hj2ubj5 )}(hG``length`` Number of bytes to unmap, and return back the bytes unmappedh](j; )}(h ``length``h]jA )}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM:hjubjW )}(hhh]h)}(h)}(hj)h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj'ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM>hjhhubh)}(hUnmap an IOVA range. The iova/length must be a superset of a previously mapped range used with IOMMU_IOAS_MAP or IOMMU_IOAS_COPY. Splitting or truncating ranges is not allowed. The values 0 to U64_MAX will unmap everything.h]hUnmap an IOVA range. The iova/length must be a superset of a previously mapped range used with IOMMU_IOAS_MAP or IOMMU_IOAS_COPY. Splitting or truncating ranges is not allowed. The values 0 to U64_MAX will unmap everything.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM;hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_option (C enum)c.iommufd_optionhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_optionh]jc)}(henum iommufd_optionh](ji)}(hjh]henum}(hjghhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjchhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMCubj{)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjchhhjthMCubj)}(hiommufd_optionh]j)}(hjah]hiommufd_option}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjchhhjthMCubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj_hhhjthMCubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1j\hjthMChj\hhubj)}(hhh]h)}(hBioctl(IOMMU_OPTION_RLIMIT_MODE) and ioctl(IOMMU_OPTION_HUGE_PAGES)h]hBioctl(IOMMU_OPTION_RLIMIT_MODE) and ioctl(IOMMU_OPTION_HUGE_PAGES)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMJhjhhubah}(h]h ]h"]h$]h&]uh1jhj\hhhjthMCubeh}(h]h ](jenumeh"]h$]h&]jjjjjjjjjuh1jWhhhjhj8hNubj)}(hX**Constants** ``IOMMU_OPTION_RLIMIT_MODE`` Change how RLIMIT_MEMLOCK accounting works. The caller must have privilege to invoke this. Value 0 (default) is user based accounting, 1 uses process based accounting. Global option, object_id must be 0 ``IOMMU_OPTION_HUGE_PAGES`` Value 1 (default) allows contiguous pages to be combined when generating iommu mappings. Value 0 disables combining, everything is mapped to PAGE_SIZE. This can be useful for benchmarking. This is a per-IOAS option, the object_id must be the IOAS ID.h](h)}(h **Constants**h]j>)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMNhjubj0 )}(hhh](j5 )}(h``IOMMU_OPTION_RLIMIT_MODE`` Change how RLIMIT_MEMLOCK accounting works. The caller must have privilege to invoke this. Value 0 (default) is user based accounting, 1 uses process based accounting. Global option, object_id must be 0 h](j; )}(h``IOMMU_OPTION_RLIMIT_MODE``h]jA )}(hjh]hIOMMU_OPTION_RLIMIT_MODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMShjubjW )}(hhh]h)}(hChange how RLIMIT_MEMLOCK accounting works. The caller must have privilege to invoke this. Value 0 (default) is user based accounting, 1 uses process based accounting. Global option, object_id must be 0h]hChange how RLIMIT_MEMLOCK accounting works. The caller must have privilege to invoke this. Value 0 (default) is user based accounting, 1 uses process based accounting. Global option, object_id must be 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMQhj ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMShjubj5 )}(hX``IOMMU_OPTION_HUGE_PAGES`` Value 1 (default) allows contiguous pages to be combined when generating iommu mappings. Value 0 disables combining, everything is mapped to PAGE_SIZE. This can be useful for benchmarking. This is a per-IOAS option, the object_id must be the IOAS ID.h](j; )}(h``IOMMU_OPTION_HUGE_PAGES``h]jA )}(hj$ h]hIOMMU_OPTION_HUGE_PAGES}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj" ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMXhj ubjW )}(hhh]h)}(hValue 1 (default) allows contiguous pages to be combined when generating iommu mappings. Value 0 disables combining, everything is mapped to PAGE_SIZE. This can be useful for benchmarking. This is a per-IOAS option, the object_id must be the IOAS ID.h]hValue 1 (default) allows contiguous pages to be combined when generating iommu mappings. Value 0 disables combining, everything is mapped to PAGE_SIZE. This can be useful for benchmarking. This is a per-IOAS option, the object_id must be the IOAS ID.}(hj= hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMVhj: ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj9 hMXhjubeh}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_option_ops (C enum)c.iommufd_option_opshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_option_opsh]jc)}(henum iommufd_option_opsh](ji)}(hjh]henum}(hj~ hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjz hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM^ubj{)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjz hhhj hM^ubj)}(hiommufd_option_opsh]j)}(hjx h]hiommufd_option_ops}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjz hhhj hM^ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjv hhhj hM^ubah}(h]jq ah ](jjeh"]h$]h&]jj)jhuh1j\hj hM^hjs hhubj)}(hhh]h)}(h9ioctl(IOMMU_OPTION_OP_SET) and ioctl(IOMMU_OPTION_OP_GET)h]h9ioctl(IOMMU_OPTION_OP_SET) and ioctl(IOMMU_OPTION_OP_GET)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM\hj hhubah}(h]h ]h"]h$]h&]uh1jhjs hhhj hM^ubeh}(h]h ](jenumeh"]h$]h&]jjjj jj jjjuh1jWhhhjhj8hNubj)}(hq**Constants** ``IOMMU_OPTION_OP_SET`` Set the option's value ``IOMMU_OPTION_OP_GET`` Get the option's valueh](h)}(h **Constants**h]j>)}(hj h]h Constants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM`hj ubj0 )}(hhh](j5 )}(h/``IOMMU_OPTION_OP_SET`` Set the option's value h](j; )}(h``IOMMU_OPTION_OP_SET``h]jA )}(hj!h]hIOMMU_OPTION_OP_SET}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMchj ubjW )}(hhh]h)}(hSet the option's valueh]hSet the option’s value}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMchj!ubah}(h]h ]h"]h$]h&]uh1jV hj ubeh}(h]h ]h"]h$]h&]uh1j4 hj!hMchj ubj5 )}(h.``IOMMU_OPTION_OP_GET`` Get the option's valueh](j; )}(h``IOMMU_OPTION_OP_GET``h]jA )}(hj:!h]hIOMMU_OPTION_OP_GET}(hj)}(h**Definition**h]h Definition}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj!ubh:}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMkhj!ubj)}(hstruct iommu_option { __u32 size; __u32 option_id; __u16 op; __u16 __reserved; __u32 object_id; __aligned_u64 val64; };h]hstruct iommu_option { __u32 size; __u32 option_id; __u16 op; __u16 __reserved; __u32 object_id; __aligned_u64 val64; };}hj"sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhj!ubh)}(h **Members**h]j>)}(hj$"h]hMembers}(hj&"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj""ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMvhj!ubj0 )}(hhh](j5 )}(h%``size`` sizeof(struct iommu_option) h](j; )}(h``size``h]jA )}(hjC"h]hsize}(hjE"hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjA"ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMihj="ubjW )}(hhh]h)}(hsizeof(struct iommu_option)h]hsizeof(struct iommu_option)}(hj\"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX"hMihjY"ubah}(h]h ]h"]h$]h&]uh1jV hj="ubeh}(h]h ]h"]h$]h&]uh1j4 hjX"hMihj:"ubj5 )}(h)``option_id`` One of enum iommufd_option h](j; )}(h ``option_id``h]jA )}(hj|"h]h option_id}(hj~"hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjz"ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMjhjv"ubjW )}(hhh]h)}(hOne of enum iommufd_optionh]hOne of enum iommufd_option}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMjhj"ubah}(h]h ]h"]h$]h&]uh1jV hjv"ubeh}(h]h ]h"]h$]h&]uh1j4 hj"hMjhj:"ubj5 )}(h&``op`` One of enum iommufd_option_ops h](j; )}(h``op``h]jA )}(hj"h]hop}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj"ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMkhj"ubjW )}(hhh]h)}(hOne of enum iommufd_option_opsh]hOne of enum iommufd_option_ops}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMkhj"ubah}(h]h ]h"]h$]h&]uh1jV hj"ubeh}(h]h ]h"]h$]h&]uh1j4 hj"hMkhj:"ubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hj"h]h __reserved}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj"ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMlhj"ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMlhj#ubah}(h]h ]h"]h$]h&]uh1jV hj"ubeh}(h]h ]h"]h$]h&]uh1j4 hj#hMlhj:"ubj5 )}(h+``object_id`` ID of the object if required h](j; )}(h ``object_id``h]jA )}(hj'#h]h object_id}(hj)#hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj%#ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhj!#ubjW )}(hhh]h)}(hID of the object if requiredh]hID of the object if required}(hj@#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<#hMmhj=#ubah}(h]h ]h"]h$]h&]uh1jV hj!#ubeh}(h]h ]h"]h$]h&]uh1j4 hj<#hMmhj:"ubj5 )}(h6``val64`` Option value to set or value returned on geth](j; )}(h ``val64``h]jA )}(hj`#h]hval64}(hjb#hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj^#ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhjZ#ubjW )}(hhh]h)}(h,Option value to set or value returned on geth]h,Option value to set or value returned on get}(hjy#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMnhjv#ubah}(h]h ]h"]h$]h&]uh1jV hjZ#ubeh}(h]h ]h"]h$]h&]uh1j4 hju#hMmhj:"ubeh}(h]h ]h"]h$]h&]uh1j/ hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj#ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMqhjhhubh)}(hChange a simple option value. This multiplexor allows controlling options on objects. IOMMU_OPTION_OP_SET will load an option and IOMMU_OPTION_OP_GET will return the current value.h]hChange a simple option value. This multiplexor allows controlling options on objects. IOMMU_OPTION_OP_SET will load an option and IOMMU_OPTION_OP_GET will return the current value.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMnhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_vfio_ioas_op (C enum)c.iommufd_vfio_ioas_ophNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_vfio_ioas_oph]jc)}(henum iommufd_vfio_ioas_oph](ji)}(hjh]henum}(hj#hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj#hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMuubj{)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj#hhhj#hMuubj)}(hiommufd_vfio_ioas_oph]j)}(hj#h]hiommufd_vfio_ioas_op}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj#hhhj#hMuubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj#hhhj#hMuubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1j\hj#hMuhj#hhubj)}(hhh]h)}(hIOMMU_VFIO_IOAS_* ioctlsh]hIOMMU_VFIO_IOAS_* ioctls}(hj#$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM~hj $hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hMuubeh}(h]h ](jenumeh"]h$]h&]jjjj;$jj;$jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_VFIO_IOAS_GET`` Get the current compatibility IOAS ``IOMMU_VFIO_IOAS_SET`` Change the current compatibility IOAS ``IOMMU_VFIO_IOAS_CLEAR`` Disable VFIO compatibilityh](h)}(h **Constants**h]j>)}(hjE$h]h Constants}(hjG$hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjC$ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj?$ubj0 )}(hhh](j5 )}(h;``IOMMU_VFIO_IOAS_GET`` Get the current compatibility IOAS h](j; )}(h``IOMMU_VFIO_IOAS_GET``h]jA )}(hjd$h]hIOMMU_VFIO_IOAS_GET}(hjf$hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjb$ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^$ubjW )}(hhh]h)}(h"Get the current compatibility IOASh]h"Get the current compatibility IOAS}(hj}$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy$hMhjz$ubah}(h]h ]h"]h$]h&]uh1jV hj^$ubeh}(h]h ]h"]h$]h&]uh1j4 hjy$hMhj[$ubj5 )}(h>``IOMMU_VFIO_IOAS_SET`` Change the current compatibility IOAS h](j; )}(h``IOMMU_VFIO_IOAS_SET``h]jA )}(hj$h]hIOMMU_VFIO_IOAS_SET}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj$ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj$ubjW )}(hhh]h)}(h%Change the current compatibility IOASh]h%Change the current compatibility IOAS}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jV hj$ubeh}(h]h ]h"]h$]h&]uh1j4 hj$hMhj[$ubj5 )}(h4``IOMMU_VFIO_IOAS_CLEAR`` Disable VFIO compatibilityh](j; )}(h``IOMMU_VFIO_IOAS_CLEAR``h]jA )}(hj$h]hIOMMU_VFIO_IOAS_CLEAR}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj$ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj$ubjW )}(hhh]h)}(hDisable VFIO compatibilityh]hDisable VFIO compatibility}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj$ubah}(h]h ]h"]h$]h&]uh1jV hj$ubeh}(h]h ]h"]h$]h&]uh1j4 hj$hMhj[$ubeh}(h]h ]h"]h$]h&]uh1j/ hj?$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_vfio_ioas (C struct)c.iommu_vfio_ioashNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_vfio_ioash]jc)}(hstruct iommu_vfio_ioash](ji)}(hjlh]hstruct}(hj0%hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj,%hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj>%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj,%hhhj=%hMubj)}(hiommu_vfio_ioash]j)}(hj*%h]hiommu_vfio_ioas}(hjP%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL%ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,%hhhj=%hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj(%hhhj=%hMubah}(h]j#%ah ](jjeh"]h$]h&]jj)jhuh1j\hj=%hMhj%%hhubj)}(hhh]h)}(hioctl(IOMMU_VFIO_IOAS)h]hioctl(IOMMU_VFIO_IOAS)}(hjr%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjo%hhubah}(h]h ]h"]h$]h&]uh1jhj%%hhhj=%hMubeh}(h]h ](jstructeh"]h$]h&]jjjj%jj%jjjuh1jWhhhjhj8hNubj)}(hXq**Definition**:: struct iommu_vfio_ioas { __u32 size; __u32 ioas_id; __u16 op; __u16 __reserved; }; **Members** ``size`` sizeof(struct iommu_vfio_ioas) ``ioas_id`` For IOMMU_VFIO_IOAS_SET the input IOAS ID to set For IOMMU_VFIO_IOAS_GET will output the IOAS ID ``op`` One of enum iommufd_vfio_ioas_op ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj%ubh:}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%ubj)}(hbstruct iommu_vfio_ioas { __u32 size; __u32 ioas_id; __u16 op; __u16 __reserved; };h]hbstruct iommu_vfio_ioas { __u32 size; __u32 ioas_id; __u16 op; __u16 __reserved; };}hj%sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%ubh)}(h **Members**h]j>)}(hj%h]hMembers}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj%ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%ubj0 )}(hhh](j5 )}(h(``size`` sizeof(struct iommu_vfio_ioas) h](j; )}(h``size``h]jA )}(hj%h]hsize}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj%ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%ubjW )}(hhh]h)}(hsizeof(struct iommu_vfio_ioas)h]hsizeof(struct iommu_vfio_ioas)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jV hj%ubeh}(h]h ]h"]h$]h&]uh1j4 hj%hMhj%ubj5 )}(hm``ioas_id`` For IOMMU_VFIO_IOAS_SET the input IOAS ID to set For IOMMU_VFIO_IOAS_GET will output the IOAS ID h](j; )}(h ``ioas_id``h]jA )}(hj&h]hioas_id}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj&ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj&ubjW )}(hhh]h)}(h`For IOMMU_VFIO_IOAS_SET the input IOAS ID to set For IOMMU_VFIO_IOAS_GET will output the IOAS IDh]h`For IOMMU_VFIO_IOAS_SET the input IOAS ID to set For IOMMU_VFIO_IOAS_GET will output the IOAS ID}(hj1&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj.&ubah}(h]h ]h"]h$]h&]uh1jV hj&ubeh}(h]h ]h"]h$]h&]uh1j4 hj-&hMhj%ubj5 )}(h(``op`` One of enum iommufd_vfio_ioas_op h](j; )}(h``op``h]jA )}(hjR&h]hop}(hjT&hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjP&ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjL&ubjW )}(hhh]h)}(h One of enum iommufd_vfio_ioas_oph]h One of enum iommufd_vfio_ioas_op}(hjk&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg&hMhjh&ubah}(h]h ]h"]h$]h&]uh1jV hjL&ubeh}(h]h ]h"]h$]h&]uh1j4 hjg&hMhj%ubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hj&h]h __reserved}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj&ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj&ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj&ubah}(h]h ]h"]h$]h&]uh1jV hj&ubeh}(h]h ]h"]h$]h&]uh1j4 hj&hMhj%ubeh}(h]h ]h"]h$]h&]uh1j/ hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj&ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXThe VFIO compatibility support uses a single ioas because VFIO APIs do not support the ID field. Set or Get the IOAS that VFIO compatibility will use. When VFIO_GROUP_SET_CONTAINER is used on an iommufd it will get the compatibility ioas, either by taking what is already set, or auto creating one. From then on VFIO will continue to use that ioas and is not effected by this ioctl. SET or CLEAR does not destroy any auto-created IOAS.h]hXThe VFIO compatibility support uses a single ioas because VFIO APIs do not support the ID field. Set or Get the IOAS that VFIO compatibility will use. When VFIO_GROUP_SET_CONTAINER is used on an iommufd it will get the compatibility ioas, either by taking what is already set, or auto creating one. From then on VFIO will continue to use that ioas and is not effected by this ioctl. SET or CLEAR does not destroy any auto-created IOAS.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS!iommufd_hwpt_alloc_flags (C enum)c.iommufd_hwpt_alloc_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_hwpt_alloc_flagsh]jc)}(henum iommufd_hwpt_alloc_flagsh](ji)}(hjh]henum}(hj 'hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj'hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj'hhhj'hMubj)}(hiommufd_hwpt_alloc_flagsh]j)}(hj'h]hiommufd_hwpt_alloc_flags}(hj,'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj('ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj'hhhj'hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj'hhhj'hMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1j\hj'hMhj'hhubj)}(hhh]h)}(hFlags for HWPT allocationh]hFlags for HWPT allocation}(hjN'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjK'hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj'hMubeh}(h]h ](jenumeh"]h$]h&]jjjjf'jjf'jjjuh1jWhhhjhj8hNubj)}(hX **Constants** ``IOMMU_HWPT_ALLOC_NEST_PARENT`` If set, allocate a HWPT that can serve as the parent HWPT in a nesting configuration. ``IOMMU_HWPT_ALLOC_DIRTY_TRACKING`` Dirty tracking support for device IOMMU is enforced on device attachment ``IOMMU_HWPT_FAULT_ID_VALID`` The fault_id field of hwpt allocation data is valid. ``IOMMU_HWPT_ALLOC_PASID`` Requests a domain that can be used with PASID. The domain can be attached to any PASID on the device. Any domain attached to the non-PASID part of the device must also be flagged, otherwise attaching a PASID will blocked. For the user that wants to attach PASID, ioas is not recommended for both the non-PASID part and PASID part of the device. If IOMMU does not support PASID it will return error (-EOPNOTSUPP).h](h)}(h **Constants**h]j>)}(hjp'h]h Constants}(hjr'hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjn'ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjj'ubj0 )}(hhh](j5 )}(hw``IOMMU_HWPT_ALLOC_NEST_PARENT`` If set, allocate a HWPT that can serve as the parent HWPT in a nesting configuration. h](j; )}(h ``IOMMU_HWPT_ALLOC_NEST_PARENT``h]jA )}(hj'h]hIOMMU_HWPT_ALLOC_NEST_PARENT}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj'ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ubjW )}(hhh]h)}(hUIf set, allocate a HWPT that can serve as the parent HWPT in a nesting configuration.h]hUIf set, allocate a HWPT that can serve as the parent HWPT in a nesting configuration.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ubah}(h]h ]h"]h$]h&]uh1jV hj'ubeh}(h]h ]h"]h$]h&]uh1j4 hj'hMhj'ubj5 )}(hm``IOMMU_HWPT_ALLOC_DIRTY_TRACKING`` Dirty tracking support for device IOMMU is enforced on device attachment h](j; )}(h#``IOMMU_HWPT_ALLOC_DIRTY_TRACKING``h]jA )}(hj'h]hIOMMU_HWPT_ALLOC_DIRTY_TRACKING}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj'ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ubjW )}(hhh]h)}(hHDirty tracking support for device IOMMU is enforced on device attachmenth]hHDirty tracking support for device IOMMU is enforced on device attachment}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ubah}(h]h ]h"]h$]h&]uh1jV hj'ubeh}(h]h ]h"]h$]h&]uh1j4 hj'hMhj'ubj5 )}(hS``IOMMU_HWPT_FAULT_ID_VALID`` The fault_id field of hwpt allocation data is valid. h](j; )}(h``IOMMU_HWPT_FAULT_ID_VALID``h]jA )}(hj(h]hIOMMU_HWPT_FAULT_ID_VALID}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj(ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ubjW )}(hhh]h)}(h4The fault_id field of hwpt allocation data is valid.h]h4The fault_id field of hwpt allocation data is valid.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj(ubah}(h]h ]h"]h$]h&]uh1jV hj'ubeh}(h]h ]h"]h$]h&]uh1j4 hj(hMhj'ubj5 )}(hX``IOMMU_HWPT_ALLOC_PASID`` Requests a domain that can be used with PASID. The domain can be attached to any PASID on the device. Any domain attached to the non-PASID part of the device must also be flagged, otherwise attaching a PASID will blocked. For the user that wants to attach PASID, ioas is not recommended for both the non-PASID part and PASID part of the device. If IOMMU does not support PASID it will return error (-EOPNOTSUPP).h](j; )}(h``IOMMU_HWPT_ALLOC_PASID``h]jA )}(hj=(h]hIOMMU_HWPT_ALLOC_PASID}(hj?(hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj;(ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj7(ubjW )}(hhh]h)}(hXRequests a domain that can be used with PASID. The domain can be attached to any PASID on the device. Any domain attached to the non-PASID part of the device must also be flagged, otherwise attaching a PASID will blocked. For the user that wants to attach PASID, ioas is not recommended for both the non-PASID part and PASID part of the device. If IOMMU does not support PASID it will return error (-EOPNOTSUPP).h]hXRequests a domain that can be used with PASID. The domain can be attached to any PASID on the device. Any domain attached to the non-PASID part of the device must also be flagged, otherwise attaching a PASID will blocked. For the user that wants to attach PASID, ioas is not recommended for both the non-PASID part and PASID part of the device. If IOMMU does not support PASID it will return error (-EOPNOTSUPP).}(hjV(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjS(ubah}(h]h ]h"]h$]h&]uh1jV hj7(ubeh}(h]h ]h"]h$]h&]uh1j4 hjR(hMhj'ubeh}(h]h ]h"]h$]h&]uh1j/ hjj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommu_hwpt_vtd_s1_flags (C enum)c.iommu_hwpt_vtd_s1_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_vtd_s1_flagsh]jc)}(henum iommu_hwpt_vtd_s1_flagsh](ji)}(hjh]henum}(hj(hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj(hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj(hhhj(hMubj)}(hiommu_hwpt_vtd_s1_flagsh]j)}(hj(h]hiommu_hwpt_vtd_s1_flags}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj(hhhj(hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj(hhhj(hMubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1j\hj(hMhj(hhubj)}(hhh]h)}(h.Intel VT-d stage-1 page table entry attributesh]h.Intel VT-d stage-1 page table entry attributes}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj(hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hMubeh}(h]h ](jenumeh"]h$]h&]jjjj(jj(jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_VTD_S1_SRE`` Supervisor request ``IOMMU_VTD_S1_EAFE`` Extended access enable ``IOMMU_VTD_S1_WPE`` Write protect enableh](h)}(h **Constants**h]j>)}(hj(h]h Constants}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj(ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj(ubj0 )}(hhh](j5 )}(h(``IOMMU_VTD_S1_SRE`` Supervisor request h](j; )}(h``IOMMU_VTD_S1_SRE``h]jA )}(hj)h]hIOMMU_VTD_S1_SRE}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj)ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj)ubjW )}(hhh]h)}(hSupervisor requesth]hSupervisor request}(hj3)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/)hMhj0)ubah}(h]h ]h"]h$]h&]uh1jV hj)ubeh}(h]h ]h"]h$]h&]uh1j4 hj/)hMhj)ubj5 )}(h-``IOMMU_VTD_S1_EAFE`` Extended access enable h](j; )}(h``IOMMU_VTD_S1_EAFE``h]jA )}(hjS)h]hIOMMU_VTD_S1_EAFE}(hjU)hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjQ)ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjM)ubjW )}(hhh]h)}(hExtended access enableh]hExtended access enable}(hjl)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh)hMhji)ubah}(h]h ]h"]h$]h&]uh1jV hjM)ubeh}(h]h ]h"]h$]h&]uh1j4 hjh)hMhj)ubj5 )}(h)``IOMMU_VTD_S1_WPE`` Write protect enableh](j; )}(h``IOMMU_VTD_S1_WPE``h]jA )}(hj)h]hIOMMU_VTD_S1_WPE}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj)ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj)ubjW )}(hhh]h)}(hWrite protect enableh]hWrite protect enable}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj)ubah}(h]h ]h"]h$]h&]uh1jV hj)ubeh}(h]h ]h"]h$]h&]uh1j4 hj)hMhj)ubeh}(h]h ]h"]h$]h&]uh1j/ hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hwpt_vtd_s1 (C struct)c.iommu_hwpt_vtd_s1hNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_vtd_s1h]jc)}(hstruct iommu_hwpt_vtd_s1h](ji)}(hjlh]hstruct}(hj)hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj)hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj)hhhj)hMubj)}(hiommu_hwpt_vtd_s1h]j)}(hj)h]hiommu_hwpt_vtd_s1}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj)hhhj)hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj)hhhj)hMubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1j\hj)hMhj)hhubj)}(hhh]h)}(h;Intel VT-d stage-1 page table info (IOMMU_HWPT_DATA_VTD_S1)h]h;Intel VT-d stage-1 page table info (IOMMU_HWPT_DATA_VTD_S1)}(hj(*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj)hMubeh}(h]h ](jstructeh"]h$]h&]jjjj@*jj@*jjjuh1jWhhhjhj8hNubj)}(hX|**Definition**:: struct iommu_hwpt_vtd_s1 { __aligned_u64 flags; __aligned_u64 pgtbl_addr; __u32 addr_width; __u32 __reserved; }; **Members** ``flags`` Combination of enum iommu_hwpt_vtd_s1_flags ``pgtbl_addr`` The base address of the stage-1 page table. ``addr_width`` The address width of the stage-1 page table ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjL*hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjH*ubh:}(hjH*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjD*ubj)}(hstruct iommu_hwpt_vtd_s1 { __aligned_u64 flags; __aligned_u64 pgtbl_addr; __u32 addr_width; __u32 __reserved; };h]hstruct iommu_hwpt_vtd_s1 { __aligned_u64 flags; __aligned_u64 pgtbl_addr; __u32 addr_width; __u32 __reserved; };}hje*sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjD*ubh)}(h **Members**h]j>)}(hjv*h]hMembers}(hjx*hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjt*ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjD*ubj0 )}(hhh](j5 )}(h6``flags`` Combination of enum iommu_hwpt_vtd_s1_flags h](j; )}(h ``flags``h]jA )}(hj*h]hflags}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj*ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj*ubjW )}(hhh]h)}(h+Combination of enum iommu_hwpt_vtd_s1_flagsh]h+Combination of enum iommu_hwpt_vtd_s1_flags}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jV hj*ubeh}(h]h ]h"]h$]h&]uh1j4 hj*hMhj*ubj5 )}(h;``pgtbl_addr`` The base address of the stage-1 page table. h](j; )}(h``pgtbl_addr``h]jA )}(hj*h]h pgtbl_addr}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj*ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj*ubjW )}(hhh]h)}(h+The base address of the stage-1 page table.h]h+The base address of the stage-1 page table.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jV hj*ubeh}(h]h ]h"]h$]h&]uh1j4 hj*hMhj*ubj5 )}(h;``addr_width`` The address width of the stage-1 page table h](j; )}(h``addr_width``h]jA )}(hj+h]h addr_width}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj+ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj+ubjW )}(hhh]h)}(h+The address width of the stage-1 page tableh]h+The address width of the stage-1 page table}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jV hj+ubeh}(h]h ]h"]h$]h&]uh1j4 hj+hMhj*ubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hj@+h]h __reserved}(hjB+hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj>+ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj:+ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjY+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjV+ubah}(h]h ]h"]h$]h&]uh1jV hj:+ubeh}(h]h ]h"]h$]h&]uh1j4 hjU+hMhj*ubeh}(h]h ]h"]h$]h&]uh1j/ hjD*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommu_hwpt_arm_smmuv3 (C struct)c.iommu_hwpt_arm_smmuv3hNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_arm_smmuv3h]jc)}(hstruct iommu_hwpt_arm_smmuv3h](ji)}(hjlh]hstruct}(hj+hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj+hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj+hhhj+hMubj)}(hiommu_hwpt_arm_smmuv3h]j)}(hj+h]hiommu_hwpt_arm_smmuv3}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj+hhhj+hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj+hhhj+hMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1j\hj+hMhj+hhubj)}(hhh]h)}(h2ARM SMMUv3 nested STE (IOMMU_HWPT_DATA_ARM_SMMUV3)h]h2ARM SMMUv3 nested STE (IOMMU_HWPT_DATA_ARM_SMMUV3)}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj+hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj+hMubeh}(h]h ](jstructeh"]h$]h&]jjjj+jj+jjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_arm_smmuv3 { __aligned_le64 ste[2]; }; **Members** ``ste`` The first two double words of the user space Stream Table Entry for the translation. Must be little-endian. Allowed fields: (Refer to "5.2 Stream Table Entry" in SMMUv3 HW Spec) - word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax - word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLDh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj+ubh:}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj+ubj)}(h)}(hj*,h]hMembers}(hj,,hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj(,ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj+ubj0 )}(hhh]j5 )}(hX``ste`` The first two double words of the user space Stream Table Entry for the translation. Must be little-endian. Allowed fields: (Refer to "5.2 Stream Table Entry" in SMMUv3 HW Spec) - word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax - word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLDh](j; )}(h``ste``h]jA )}(hjI,h]hste}(hjK,hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjG,ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjC,ubjW )}(hhh]h)}(hXThe first two double words of the user space Stream Table Entry for the translation. Must be little-endian. Allowed fields: (Refer to "5.2 Stream Table Entry" in SMMUv3 HW Spec) - word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax - word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLDh]hXThe first two double words of the user space Stream Table Entry for the translation. Must be little-endian. Allowed fields: (Refer to “5.2 Stream Table Entry” in SMMUv3 HW Spec) - word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax - word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLD}(hjb,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj_,ubah}(h]h ]h"]h$]h&]uh1jV hjC,ubeh}(h]h ]h"]h$]h&]uh1j4 hj^,hMhj@,ubah}(h]h ]h"]h$]h&]uh1j/ hj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj,ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXC-EIO will be returned if **ste** is not legal or contains any non-allowed field. Cfg can be used to select a S1, Bypass or Abort configuration. A Bypass nested domain will translate the same as the nesting parent. The S1 will install a Context Descriptor Table pointing at userspace memory translated by the nesting parent.h](h-EIO will be returned if }(hj,hhhNhNubj>)}(h**ste**h]hste}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj,ubhX# is not legal or contains any non-allowed field. Cfg can be used to select a S1, Bypass or Abort configuration. A Bypass nested domain will translate the same as the nesting parent. The S1 will install a Context Descriptor Table pointing at userspace memory translated by the nesting parent.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hIt's suggested to allocate a vDEVICE object carrying vSID and then re-attach the nested domain, as soon as the vSID is available in the VMM level:h]hIt’s suggested to allocate a vDEVICE object carrying vSID and then re-attach the nested domain, as soon as the vSID is available in the VMM level:}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh](j)}(hwhen Cfg=translate, a vDEVICE must be allocated prior to attaching to the allocated nested domain, as CD/ATS invalidations and vevents need a vSID.h]h)}(hwhen Cfg=translate, a vDEVICE must be allocated prior to attaching to the allocated nested domain, as CD/ATS invalidations and vevents need a vSID.h]hwhen Cfg=translate, a vDEVICE must be allocated prior to attaching to the allocated nested domain, as CD/ATS invalidations and vevents need a vSID.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hX(when Cfg=bypass/abort, a vDEVICE is not enforced during the nested domain attachment, to support a GBPA case where VM sets CR0.SMMUEN=0. However, if VM sets CR0.SMMUEN=1 while missing a vDEVICE object, kernel would fail to report events to the VM. E.g. F_TRANSLATION when guest STE.Cfg=abort. h]h)}(hX$when Cfg=bypass/abort, a vDEVICE is not enforced during the nested domain attachment, to support a GBPA case where VM sets CR0.SMMUEN=0. However, if VM sets CR0.SMMUEN=1 while missing a vDEVICE object, kernel would fail to report events to the VM. E.g. F_TRANSLATION when guest STE.Cfg=abort.h]hX$when Cfg=bypass/abort, a vDEVICE is not enforced during the nested domain attachment, to support a GBPA case where VM sets CR0.SMMUEN=0. However, if VM sets CR0.SMMUEN=1 while missing a vDEVICE object, kernel would fail to report events to the VM. E.g. F_TRANSLATION when guest STE.Cfg=abort.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]jjuh1jhj,hMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hwpt_amd_guest (C struct)c.iommu_hwpt_amd_guesthNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_amd_guesth]jc)}(hstruct iommu_hwpt_amd_guesth](ji)}(hjlh]hstruct}(hj&-hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj"-hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj4-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj"-hhhj3-hMubj)}(hiommu_hwpt_amd_guesth]j)}(hj -h]hiommu_hwpt_amd_guest}(hjF-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB-ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj"-hhhj3-hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj-hhhj3-hMubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1j\hj3-hMhj-hhubj)}(hhh]h)}(h?AMD IOMMU guest I/O page table data (IOMMU_HWPT_DATA_AMD_GUEST)h]h?AMD IOMMU guest I/O page table data (IOMMU_HWPT_DATA_AMD_GUEST)}(hjh-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhje-hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj3-hMubeh}(h]h ](jstructeh"]h$]h&]jjjj-jj-jjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_hwpt_amd_guest { __aligned_u64 dte[4]; }; **Members** ``dte`` Guest Device Table Entry (DTE)h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj-ubh:}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj-ubj)}(h:struct iommu_hwpt_amd_guest { __aligned_u64 dte[4]; };h]h:struct iommu_hwpt_amd_guest { __aligned_u64 dte[4]; };}hj-sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj-ubh)}(h **Members**h]j>)}(hj-h]hMembers}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj-ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj-ubj0 )}(hhh]j5 )}(h&``dte`` Guest Device Table Entry (DTE)h](j; )}(h``dte``h]jA )}(hj-h]hdte}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj-ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj-ubjW )}(hhh]h)}(hGuest Device Table Entry (DTE)h]hGuest Device Table Entry (DTE)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj-ubah}(h]h ]h"]h$]h&]uh1jV hj-ubeh}(h]h ]h"]h$]h&]uh1j4 hj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j/ hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hwpt_data_type (C enum)c.iommu_hwpt_data_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_data_typeh]jc)}(henum iommu_hwpt_data_typeh](ji)}(hjh]henum}(hj/.hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj+.hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj=.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj+.hhhj<.hMubj)}(hiommu_hwpt_data_typeh]j)}(hj).h]hiommu_hwpt_data_type}(hjO.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK.ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj+.hhhj<.hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj'.hhhj<.hMubah}(h]j".ah ](jjeh"]h$]h&]jj)jhuh1j\hj<.hMhj$.hhubj)}(hhh]h)}(hIOMMU HWPT Data Typeh]hIOMMU HWPT Data Type}(hjq.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjn.hhubah}(h]h ]h"]h$]h&]uh1jhj$.hhhj<.hMubeh}(h]h ](jenumeh"]h$]h&]jjjj.jj.jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HWPT_DATA_NONE`` no data ``IOMMU_HWPT_DATA_VTD_S1`` Intel VT-d stage-1 page table ``IOMMU_HWPT_DATA_ARM_SMMUV3`` ARM SMMUv3 Context Descriptor Table ``IOMMU_HWPT_DATA_AMD_GUEST`` AMD IOMMU guest page tableh](h)}(h **Constants**h]j>)}(hj.h]h Constants}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj.ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj.ubj0 )}(hhh](j5 )}(h!``IOMMU_HWPT_DATA_NONE`` no data h](j; )}(h``IOMMU_HWPT_DATA_NONE``h]jA )}(hj.h]hIOMMU_HWPT_DATA_NONE}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj.ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj.ubjW )}(hhh]h)}(hno datah]hno data}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1jV hj.ubeh}(h]h ]h"]h$]h&]uh1j4 hj.hMhj.ubj5 )}(h9``IOMMU_HWPT_DATA_VTD_S1`` Intel VT-d stage-1 page table h](j; )}(h``IOMMU_HWPT_DATA_VTD_S1``h]jA )}(hj.h]hIOMMU_HWPT_DATA_VTD_S1}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj.ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj.ubjW )}(hhh]h)}(hIntel VT-d stage-1 page tableh]hIntel VT-d stage-1 page table}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jV hj.ubeh}(h]h ]h"]h$]h&]uh1j4 hj/hMhj.ubj5 )}(hC``IOMMU_HWPT_DATA_ARM_SMMUV3`` ARM SMMUv3 Context Descriptor Table h](j; )}(h``IOMMU_HWPT_DATA_ARM_SMMUV3``h]jA )}(hj$/h]hIOMMU_HWPT_DATA_ARM_SMMUV3}(hj&/hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj"/ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hj/ubjW )}(hhh]h)}(h#ARM SMMUv3 Context Descriptor Tableh]h#ARM SMMUv3 Context Descriptor Table}(hj=/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9/hM hj:/ubah}(h]h ]h"]h$]h&]uh1jV hj/ubeh}(h]h ]h"]h$]h&]uh1j4 hj9/hM hj.ubj5 )}(h8``IOMMU_HWPT_DATA_AMD_GUEST`` AMD IOMMU guest page tableh](j; )}(h``IOMMU_HWPT_DATA_AMD_GUEST``h]jA )}(hj]/h]hIOMMU_HWPT_DATA_AMD_GUEST}(hj_/hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj[/ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjW/ubjW )}(hhh]h)}(hAMD IOMMU guest page tableh]hAMD IOMMU guest page table}(hjv/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjs/ubah}(h]h ]h"]h$]h&]uh1jV hjW/ubeh}(h]h ]h"]h$]h&]uh1j4 hjr/hM hj.ubeh}(h]h ]h"]h$]h&]uh1j/ hj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hwpt_alloc (C struct)c.iommu_hwpt_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_alloch]jc)}(hstruct iommu_hwpt_alloch](ji)}(hjlh]hstruct}(hj/hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj/hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj/hhhj/hMubj)}(hiommu_hwpt_alloch]j)}(hj/h]hiommu_hwpt_alloc}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj/hhhj/hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj/hhhj/hMubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1j\hj/hMhj/hhubj)}(hhh]h)}(hioctl(IOMMU_HWPT_ALLOC)h]hioctl(IOMMU_HWPT_ALLOC)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hj/hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hMubeh}(h]h ](jstructeh"]h$]h&]jjjj0jj0jjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_alloc { __u32 size; __u32 flags; __u32 dev_id; __u32 pt_id; __u32 out_hwpt_id; __u32 __reserved; __u32 data_type; __u32 data_len; __aligned_u64 data_uptr; __u32 fault_id; __u32 __reserved2; }; **Members** ``size`` sizeof(struct iommu_hwpt_alloc) ``flags`` Combination of enum iommufd_hwpt_alloc_flags ``dev_id`` The device to allocate this HWPT for ``pt_id`` The IOAS or HWPT or vIOMMU to connect this HWPT to ``out_hwpt_id`` The ID of the new HWPT ``__reserved`` Must be 0 ``data_type`` One of enum iommu_hwpt_data_type ``data_len`` Length of the type specific data ``data_uptr`` User pointer to the type specific data ``fault_id`` The ID of IOMMUFD_FAULT object. Valid only if flags field of IOMMU_HWPT_FAULT_ID_VALID is set. ``__reserved2`` Padding to 64-bit alignment. Must be 0.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj0ubh:}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0ubj)}(hstruct iommu_hwpt_alloc { __u32 size; __u32 flags; __u32 dev_id; __u32 pt_id; __u32 out_hwpt_id; __u32 __reserved; __u32 data_type; __u32 data_len; __aligned_u64 data_uptr; __u32 fault_id; __u32 __reserved2; };h]hstruct iommu_hwpt_alloc { __u32 size; __u32 flags; __u32 dev_id; __u32 pt_id; __u32 out_hwpt_id; __u32 __reserved; __u32 data_type; __u32 data_len; __aligned_u64 data_uptr; __u32 fault_id; __u32 __reserved2; };}hj60sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0ubh)}(h **Members**h]j>)}(hjG0h]hMembers}(hjI0hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjE0ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hj0ubj0 )}(hhh](j5 )}(h)``size`` sizeof(struct iommu_hwpt_alloc) h](j; )}(h``size``h]jA )}(hjf0h]hsize}(hjh0hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjd0ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj`0ubjW )}(hhh]h)}(hsizeof(struct iommu_hwpt_alloc)h]hsizeof(struct iommu_hwpt_alloc)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{0hMhj|0ubah}(h]h ]h"]h$]h&]uh1jV hj`0ubeh}(h]h ]h"]h$]h&]uh1j4 hj{0hMhj]0ubj5 )}(h7``flags`` Combination of enum iommufd_hwpt_alloc_flags h](j; )}(h ``flags``h]jA )}(hj0h]hflags}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj0ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0ubjW )}(hhh]h)}(h,Combination of enum iommufd_hwpt_alloc_flagsh]h,Combination of enum iommufd_hwpt_alloc_flags}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jV hj0ubeh}(h]h ]h"]h$]h&]uh1j4 hj0hMhj]0ubj5 )}(h0``dev_id`` The device to allocate this HWPT for h](j; )}(h ``dev_id``h]jA )}(hj0h]hdev_id}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj0ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0ubjW )}(hhh]h)}(h$The device to allocate this HWPT forh]h$The device to allocate this HWPT for}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jV hj0ubeh}(h]h ]h"]h$]h&]uh1j4 hj0hMhj]0ubj5 )}(h=``pt_id`` The IOAS or HWPT or vIOMMU to connect this HWPT to h](j; )}(h ``pt_id``h]jA )}(hj1h]hpt_id}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj1ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj 1ubjW )}(hhh]h)}(h2The IOAS or HWPT or vIOMMU to connect this HWPT toh]h2The IOAS or HWPT or vIOMMU to connect this HWPT to}(hj*1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&1hMhj'1ubah}(h]h ]h"]h$]h&]uh1jV hj 1ubeh}(h]h ]h"]h$]h&]uh1j4 hj&1hMhj]0ubj5 )}(h'``out_hwpt_id`` The ID of the new HWPT h](j; )}(h``out_hwpt_id``h]jA )}(hjJ1h]h out_hwpt_id}(hjL1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjH1ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjD1ubjW )}(hhh]h)}(hThe ID of the new HWPTh]hThe ID of the new HWPT}(hjc1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_1hMhj`1ubah}(h]h ]h"]h$]h&]uh1jV hjD1ubeh}(h]h ]h"]h$]h&]uh1j4 hj_1hMhj]0ubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hj1h]h __reserved}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj1ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj}1ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jV hj}1ubeh}(h]h ]h"]h$]h&]uh1j4 hj1hMhj]0ubj5 )}(h/``data_type`` One of enum iommu_hwpt_data_type h](j; )}(h ``data_type``h]jA )}(hj1h]h data_type}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj1ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj1ubjW )}(hhh]h)}(h One of enum iommu_hwpt_data_typeh]h One of enum iommu_hwpt_data_type}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jV hj1ubeh}(h]h ]h"]h$]h&]uh1j4 hj1hMhj]0ubj5 )}(h.``data_len`` Length of the type specific data h](j; )}(h ``data_len``h]jA )}(hj1h]hdata_len}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj1ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj1ubjW )}(hhh]h)}(h Length of the type specific datah]h Length of the type specific data}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 2hMhj 2ubah}(h]h ]h"]h$]h&]uh1jV hj1ubeh}(h]h ]h"]h$]h&]uh1j4 hj 2hMhj]0ubj5 )}(h5``data_uptr`` User pointer to the type specific data h](j; )}(h ``data_uptr``h]jA )}(hj.2h]h data_uptr}(hj02hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj,2ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj(2ubjW )}(hhh]h)}(h&User pointer to the type specific datah]h&User pointer to the type specific data}(hjG2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC2hMhjD2ubah}(h]h ]h"]h$]h&]uh1jV hj(2ubeh}(h]h ]h"]h$]h&]uh1j4 hjC2hMhj]0ubj5 )}(hl``fault_id`` The ID of IOMMUFD_FAULT object. Valid only if flags field of IOMMU_HWPT_FAULT_ID_VALID is set. h](j; )}(h ``fault_id``h]jA )}(hjg2h]hfault_id}(hji2hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hje2ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhja2ubjW )}(hhh]h)}(h^The ID of IOMMUFD_FAULT object. Valid only if flags field of IOMMU_HWPT_FAULT_ID_VALID is set.h]h^The ID of IOMMUFD_FAULT object. Valid only if flags field of IOMMU_HWPT_FAULT_ID_VALID is set.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj}2ubah}(h]h ]h"]h$]h&]uh1jV hja2ubeh}(h]h ]h"]h$]h&]uh1j4 hj|2hMhj]0ubj5 )}(h7``__reserved2`` Padding to 64-bit alignment. Must be 0.h](j; )}(h``__reserved2``h]jA )}(hj2h]h __reserved2}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj2ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj2ubjW )}(hhh]h)}(h'Padding to 64-bit alignment. Must be 0.h]h'Padding to 64-bit alignment. Must be 0.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj2ubah}(h]h ]h"]h$]h&]uh1jV hj2ubeh}(h]h ]h"]h$]h&]uh1j4 hj2hMhj]0ubeh}(h]h ]h"]h$]h&]uh1j/ hj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj2ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hExplicitly allocate a hardware page table object. This is the same object type that is returned by iommufd_device_attach() and represents the underlying iommu driver's iommu_domain kernel object.h]hExplicitly allocate a hardware page table object. This is the same object type that is returned by iommufd_device_attach() and represents the underlying iommu driver’s iommu_domain kernel object.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hX'A kernel-managed HWPT will be created with the mappings from the given IOAS via the **pt_id**. The **data_type** for this allocation must be set to IOMMU_HWPT_DATA_NONE. The HWPT can be allocated as a parent HWPT for a nesting configuration by passing IOMMU_HWPT_ALLOC_NEST_PARENT via **flags**.h](hTA kernel-managed HWPT will be created with the mappings from the given IOAS via the }(hj 3hhhNhNubj>)}(h **pt_id**h]hpt_id}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj 3ubh. The }(hj 3hhhNhNubj>)}(h **data_type**h]h data_type}(hj#3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj 3ubh for this allocation must be set to IOMMU_HWPT_DATA_NONE. The HWPT can be allocated as a parent HWPT for a nesting configuration by passing IOMMU_HWPT_ALLOC_NEST_PARENT via }(hj 3hhhNhNubj>)}(h **flags**h]hflags}(hj53hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj 3ubh.}(hj 3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXA user-managed nested HWPT will be created from a given vIOMMU (wrapping a parent HWPT) or a parent HWPT via **pt_id**, in which the parent HWPT must be allocated previously via the same ioctl from a given IOAS (**pt_id**). In this case, the **data_type** must be set to a pre-defined type corresponding to an I/O page table type supported by the underlying IOMMU hardware. The device via **dev_id** and the vIOMMU via **pt_id** must be associated to the same IOMMU instance.h](hmA user-managed nested HWPT will be created from a given vIOMMU (wrapping a parent HWPT) or a parent HWPT via }(hjN3hhhNhNubj>)}(h **pt_id**h]hpt_id}(hjV3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjN3ubh^, in which the parent HWPT must be allocated previously via the same ioctl from a given IOAS (}(hjN3hhhNhNubj>)}(h **pt_id**h]hpt_id}(hjh3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjN3ubh). In this case, the }(hjN3hhhNhNubj>)}(h **data_type**h]h data_type}(hjz3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjN3ubh must be set to a pre-defined type corresponding to an I/O page table type supported by the underlying IOMMU hardware. The device via }(hjN3hhhNhNubj>)}(h **dev_id**h]hdev_id}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjN3ubh and the vIOMMU via }(hjN3hhhNhNubj>)}(h **pt_id**h]hpt_id}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjN3ubh/ must be associated to the same IOMMU instance.}(hjN3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM"hjhhubh)}(hIf the **data_type** is set to IOMMU_HWPT_DATA_NONE, **data_len** and **data_uptr** should be zero. Otherwise, both **data_len** and **data_uptr** must be given.h](hIf the }(hj3hhhNhNubj>)}(h **data_type**h]h data_type}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubh! is set to IOMMU_HWPT_DATA_NONE, }(hj3hhhNhNubj>)}(h **data_len**h]hdata_len}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubh and }(hj3hhhNhNubj>)}(h **data_uptr**h]h data_uptr}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubh! should be zero. Otherwise, both }(hj3hhhNhNubj>)}(h **data_len**h]hdata_len}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubh and }(hj3hhhNhNubj>)}(h **data_uptr**h]h data_uptr}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubh must be given.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM*hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommu_hw_info_vtd_flags (C enum)c.iommu_hw_info_vtd_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_vtd_flagsh]jc)}(henum iommu_hw_info_vtd_flagsh](ji)}(hjh]henum}(hj94hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj54hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM1ubj{)}(h h]h }(hjG4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj54hhhjF4hM1ubj)}(hiommu_hw_info_vtd_flagsh]j)}(hj34h]hiommu_hw_info_vtd_flags}(hjY4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU4ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj54hhhjF4hM1ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj14hhhjF4hM1ubah}(h]j,4ah ](jjeh"]h$]h&]jj)jhuh1j\hjF4hM1hj.4hhubj)}(hhh]h)}(hFlags for VT-d hw_infoh]hFlags for VT-d hw_info}(hj{4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM?hjx4hhubah}(h]h ]h"]h$]h&]uh1jhj.4hhhjF4hM1ubeh}(h]h ](jenumeh"]h$]h&]jjjj4jj4jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17`` If set, disallow read-only mappings on a nested_parent domain. https://www.intel.com/content/www/us/en/content-details/772415/content-details.htmlh](h)}(h **Constants**h]j>)}(hj4h]h Constants}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj4ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMChj4ubj0 )}(hhh]j5 )}(h``IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17`` If set, disallow read-only mappings on a nested_parent domain. https://www.intel.com/content/www/us/en/content-details/772415/content-details.htmlh](j; )}(h)``IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17``h]jA )}(hj4h]h%IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj4ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMGhj4ubjW )}(hhh]h)}(hIf set, disallow read-only mappings on a nested_parent domain. https://www.intel.com/content/www/us/en/content-details/772415/content-details.htmlh](h?If set, disallow read-only mappings on a nested_parent domain. }(hj4hhhNhNubh reference)}(hShttps://www.intel.com/content/www/us/en/content-details/772415/content-details.htmlh]hShttps://www.intel.com/content/www/us/en/content-details/772415/content-details.html}(hj4hhhNhNubah}(h]h ]h"]h$]h&]refurij4uh1j4hj4ubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMFhj4ubah}(h]h ]h"]h$]h&]uh1jV hj4ubeh}(h]h ]h"]h$]h&]uh1j4 hj4hMGhj4ubah}(h]h ]h"]h$]h&]uh1j/ hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_info_vtd (C struct)c.iommu_hw_info_vtdhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_vtdh]jc)}(hstruct iommu_hw_info_vtdh](ji)}(hjlh]hstruct}(hj'5hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj#5hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMMubj{)}(h h]h }(hj55hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj#5hhhj45hMMubj)}(hiommu_hw_info_vtdh]j)}(hj!5h]hiommu_hw_info_vtd}(hjG5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC5ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj#5hhhj45hMMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj5hhhj45hMMubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1j\hj45hMMhj5hhubj)}(hhh]h)}(hIntel VT-d hardware informationh]hIntel VT-d hardware information}(hji5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMIhjf5hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj45hMMubeh}(h]h ](jstructeh"]h$]h&]jjjj5jj5jjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hw_info_vtd { __u32 flags; __u32 __reserved; __aligned_u64 cap_reg; __aligned_u64 ecap_reg; }; **Members** ``flags`` Combination of enum iommu_hw_info_vtd_flags ``__reserved`` Must be 0 ``cap_reg`` Value of Intel VT-d capability register defined in VT-d spec section 11.4.2 Capability Register. ``ecap_reg`` Value of Intel VT-d capability register defined in VT-d spec section 11.4.3 Extended Capability Register.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj5ubh:}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMMhj5ubj)}(h{struct iommu_hw_info_vtd { __u32 flags; __u32 __reserved; __aligned_u64 cap_reg; __aligned_u64 ecap_reg; };h]h{struct iommu_hw_info_vtd { __u32 flags; __u32 __reserved; __aligned_u64 cap_reg; __aligned_u64 ecap_reg; };}hj5sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMOhj5ubh)}(h **Members**h]j>)}(hj5h]hMembers}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj5ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMVhj5ubj0 )}(hhh](j5 )}(h6``flags`` Combination of enum iommu_hw_info_vtd_flags h](j; )}(h ``flags``h]jA )}(hj5h]hflags}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj5ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMLhj5ubjW )}(hhh]h)}(h+Combination of enum iommu_hw_info_vtd_flagsh]h+Combination of enum iommu_hw_info_vtd_flags}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMLhj5ubah}(h]h ]h"]h$]h&]uh1jV hj5ubeh}(h]h ]h"]h$]h&]uh1j4 hj5hMLhj5ubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hj6h]h __reserved}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj 6ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMMhj 6ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj(6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$6hMMhj%6ubah}(h]h ]h"]h$]h&]uh1jV hj 6ubeh}(h]h ]h"]h$]h&]uh1j4 hj$6hMMhj5ubj5 )}(hm``cap_reg`` Value of Intel VT-d capability register defined in VT-d spec section 11.4.2 Capability Register. h](j; )}(h ``cap_reg``h]jA )}(hjH6h]hcap_reg}(hjJ6hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjF6ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMPhjB6ubjW )}(hhh]h)}(h`Value of Intel VT-d capability register defined in VT-d spec section 11.4.2 Capability Register.h]h`Value of Intel VT-d capability register defined in VT-d spec section 11.4.2 Capability Register.}(hja6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMOhj^6ubah}(h]h ]h"]h$]h&]uh1jV hjB6ubeh}(h]h ]h"]h$]h&]uh1j4 hj]6hMPhj5ubj5 )}(hv``ecap_reg`` Value of Intel VT-d capability register defined in VT-d spec section 11.4.3 Extended Capability Register.h](j; )}(h ``ecap_reg``h]jA )}(hj6h]hecap_reg}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj6ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMQhj|6ubjW )}(hhh]h)}(hiValue of Intel VT-d capability register defined in VT-d spec section 11.4.3 Extended Capability Register.h]hiValue of Intel VT-d capability register defined in VT-d spec section 11.4.3 Extended Capability Register.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMQhj6ubah}(h]h ]h"]h$]h&]uh1jV hj|6ubeh}(h]h ]h"]h$]h&]uh1j4 hj6hMQhj5ubeh}(h]h ]h"]h$]h&]uh1j/ hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj6ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMUhjhhubh)}(hSUser needs to understand the Intel VT-d specification to decode the register value.h]hSUser needs to understand the Intel VT-d specification to decode the register value.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMRhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS'iommu_hw_info_arm_smmuv3_flags (C enum) c.iommu_hw_info_arm_smmuv3_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_arm_smmuv3_flagsh]jc)}(h#enum iommu_hw_info_arm_smmuv3_flagsh](ji)}(hjh]henum}(hj7hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj6hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMXubj{)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj6hhhj7hMXubj)}(hiommu_hw_info_arm_smmuv3_flagsh]j)}(hj6h]hiommu_hw_info_arm_smmuv3_flags}(hj"7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj6hhhj7hMXubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj6hhhj7hMXubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1j\hj7hMXhj6hhubj)}(hhh]h)}(hFlags for ARM SMMUv3 hw_infoh]hFlags for ARM SMMUv3 hw_info}(hjD7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM^hjA7hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj7hMXubeh}(h]h ](jenumeh"]h$]h&]jjjj\7jj\7jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HW_INFO_ARM_SMMUV3_ERRATA_REPEAT_TLBI_CFGI`` If set, user space must issue TLBI/CFGI+SYNC commands twice due to hardware erratum T264-SMMU-3. See the description at arm_smmu_erratum_repeat_tlbi_cfgi_key.h](h)}(h **Constants**h]j>)}(hjf7h]h Constants}(hjh7hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjd7ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMbhj`7ubj0 )}(hhh]j5 )}(h``IOMMU_HW_INFO_ARM_SMMUV3_ERRATA_REPEAT_TLBI_CFGI`` If set, user space must issue TLBI/CFGI+SYNC commands twice due to hardware erratum T264-SMMU-3. See the description at arm_smmu_erratum_repeat_tlbi_cfgi_key.h](j; )}(h4``IOMMU_HW_INFO_ARM_SMMUV3_ERRATA_REPEAT_TLBI_CFGI``h]jA )}(hj7h]h0IOMMU_HW_INFO_ARM_SMMUV3_ERRATA_REPEAT_TLBI_CFGI}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj7ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMfhj7ubjW )}(hhh]h)}(hIf set, user space must issue TLBI/CFGI+SYNC commands twice due to hardware erratum T264-SMMU-3. See the description at arm_smmu_erratum_repeat_tlbi_cfgi_key.h]hIf set, user space must issue TLBI/CFGI+SYNC commands twice due to hardware erratum T264-SMMU-3. See the description at arm_smmu_erratum_repeat_tlbi_cfgi_key.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMehj7ubah}(h]h ]h"]h$]h&]uh1jV hj7ubeh}(h]h ]h"]h$]h&]uh1j4 hj7hMfhj|7ubah}(h]h ]h"]h$]h&]uh1j/ hj`7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS#iommu_hw_info_arm_smmuv3 (C struct)c.iommu_hw_info_arm_smmuv3hNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_arm_smmuv3h]jc)}(hstruct iommu_hw_info_arm_smmuv3h](ji)}(hjlh]hstruct}(hj7hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj7hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMlubj{)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj7hhhj7hMlubj)}(hiommu_hw_info_arm_smmuv3h]j)}(hj7h]hiommu_hw_info_arm_smmuv3}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj7hhhj7hMlubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj7hhhj7hMlubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1j\hj7hMlhj7hhubj)}(hhh]h)}(h?ARM SMMUv3 hardware information (IOMMU_HW_INFO_TYPE_ARM_SMMUV3)h]h?ARM SMMUv3 hardware information (IOMMU_HW_INFO_TYPE_ARM_SMMUV3)}(hj!8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMihj8hhubah}(h]h ]h"]h$]h&]uh1jhj7hhhj7hMlubeh}(h]h ](jstructeh"]h$]h&]jjjj98jj98jjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hw_info_arm_smmuv3 { __u32 flags; __u32 __reserved; __u32 idr[6]; __u32 iidr; __u32 aidr; }; **Members** ``flags`` Combination of enum iommu_hw_info_arm_smmuv3_flags ``__reserved`` Must be 0 ``idr`` Implemented features for ARM SMMU Non-secure programming interface ``iidr`` Information about the implementation and implementer of ARM SMMU, and architecture version supported ``aidr`` ARM SMMU architecture versionh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjE8hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjA8ubh:}(hjA8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhj=8ubj)}(h}struct iommu_hw_info_arm_smmuv3 { __u32 flags; __u32 __reserved; __u32 idr[6]; __u32 iidr; __u32 aidr; };h]h}struct iommu_hw_info_arm_smmuv3 { __u32 flags; __u32 __reserved; __u32 idr[6]; __u32 iidr; __u32 aidr; };}hj^8sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMohj=8ubh)}(h **Members**h]j>)}(hjo8h]hMembers}(hjq8hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjm8ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMwhj=8ubj0 )}(hhh](j5 )}(h=``flags`` Combination of enum iommu_hw_info_arm_smmuv3_flags h](j; )}(h ``flags``h]jA )}(hj8h]hflags}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj8ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhj8ubjW )}(hhh]h)}(h2Combination of enum iommu_hw_info_arm_smmuv3_flagsh]h2Combination of enum iommu_hw_info_arm_smmuv3_flags}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMmhj8ubah}(h]h ]h"]h$]h&]uh1jV hj8ubeh}(h]h ]h"]h$]h&]uh1j4 hj8hMmhj8ubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hj8h]h __reserved}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj8ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMnhj8ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMnhj8ubah}(h]h ]h"]h$]h&]uh1jV hj8ubeh}(h]h ]h"]h$]h&]uh1j4 hj8hMnhj8ubj5 )}(hK``idr`` Implemented features for ARM SMMU Non-secure programming interface h](j; )}(h``idr``h]jA )}(hj9h]hidr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj8ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMohj8ubjW )}(hhh]h)}(hBImplemented features for ARM SMMU Non-secure programming interfaceh]hBImplemented features for ARM SMMU Non-secure programming interface}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMohj9ubah}(h]h ]h"]h$]h&]uh1jV hj8ubeh}(h]h ]h"]h$]h&]uh1j4 hj9hMohj8ubj5 )}(hn``iidr`` Information about the implementation and implementer of ARM SMMU, and architecture version supported h](j; )}(h``iidr``h]jA )}(hj99h]hiidr}(hj;9hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj79ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMqhj39ubjW )}(hhh]h)}(hdInformation about the implementation and implementer of ARM SMMU, and architecture version supportedh]hdInformation about the implementation and implementer of ARM SMMU, and architecture version supported}(hjR9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMphjO9ubah}(h]h ]h"]h$]h&]uh1jV hj39ubeh}(h]h ]h"]h$]h&]uh1j4 hjN9hMqhj8ubj5 )}(h&``aidr`` ARM SMMU architecture versionh](j; )}(h``aidr``h]jA )}(hjs9h]haidr}(hju9hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjq9ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMqhjm9ubjW )}(hhh]h)}(hARM SMMU architecture versionh]hARM SMMU architecture version}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMrhj9ubah}(h]h ]h"]h$]h&]uh1jV hjm9ubeh}(h]h ]h"]h$]h&]uh1j4 hj9hMqhj8ubeh}(h]h ]h"]h$]h&]uh1j/ hj=8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMuhjhhubh)}(hwFor the details of **idr**, **iidr** and **aidr**, please refer to the chapters from 6.3.1 to 6.3.6 in the SMMUv3 Spec.h](hFor the details of }(hj9hhhNhNubj>)}(h**idr**h]hidr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubh, }(hj9hhhNhNubj>)}(h**iidr**h]hiidr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubh and }(hj9hhhNhNubj>)}(h**aidr**h]haidr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubhF, please refer to the chapters from 6.3.1 to 6.3.6 in the SMMUv3 Spec.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMrhjhhubh)}(hThis reports the raw HW capability, and not all bits are meaningful to be read by userspace. Only the following fields should be used:h]hThis reports the raw HW capability, and not all bits are meaningful to be read by userspace. Only the following fields should be used:}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMuhjhhubh)}(hidr[0]: ST_LEVEL, TERM_MODEL, STALL_MODEL, TTENDIAN , CD2L, ASID16, TTF idr[1]: SIDSIZE, SSIDSIZE idr[3]: BBML, RIL idr[5]: VAX, GRAN64K, GRAN16K, GRAN4K, DSh]hidr[0]: ST_LEVEL, TERM_MODEL, STALL_MODEL, TTENDIAN , CD2L, ASID16, TTF idr[1]: SIDSIZE, SSIDSIZE idr[3]: BBML, RIL idr[5]: VAX, GRAN64K, GRAN16K, GRAN4K, DS}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMxhjhhubj)}(hhh](j)}(h@S1P should be assumed to be true if a NESTED HWPT can be createdh]h)}(hj4:h]h@S1P should be assumed to be true if a NESTED HWPT can be created}(hj6:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM}hj2:ubah}(h]h ]h"]h$]h&]uh1jhj/:ubj)}(hQVFIO/iommufd only support platforms with COHACC, it should be assumed to be true.h]h)}(hQVFIO/iommufd only support platforms with COHACC, it should be assumed to be true.h]hQVFIO/iommufd only support platforms with COHACC, it should be assumed to be true.}(hjN:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM~hjJ:ubah}(h]h ]h"]h$]h&]uh1jhj/:ubj)}(h~ATS is a per-device property. If the VMM describes any devices as ATS capable in ACPI/DT it should set the corresponding idr. h]h)}(h}ATS is a per-device property. If the VMM describes any devices as ATS capable in ACPI/DT it should set the corresponding idr.h]h}ATS is a per-device property. If the VMM describes any devices as ATS capable in ACPI/DT it should set the corresponding idr.}(hjg:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjc:ubah}(h]h ]h"]h$]h&]uh1jhj/:ubeh}(h]h ]h"]h$]h&]jjuh1jhjC:hM}hjhhubh)}(hX)This list may expand in future (eg E0PD, AIE, PBHA, D128 etc). It is important that VMMs do not read bits outside the list to allow for compatibility with future kernels. Several features in the SMMUv3 architecture are not currently supported by the kernel for nesting: HTTU, BTM, MPAM and others.h]hX)This list may expand in future (eg E0PD, AIE, PBHA, D128 etc). It is important that VMMs do not read bits outside the list to allow for compatibility with future kernels. Several features in the SMMUv3 architecture are not currently supported by the kernel for nesting: HTTU, BTM, MPAM and others.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS'iommu_hw_info_tegra241_cmdqv (C struct)c.iommu_hw_info_tegra241_cmdqvhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_tegra241_cmdqvh]jc)}(h#struct iommu_hw_info_tegra241_cmdqvh](ji)}(hjlh]hstruct}(hj:hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj:hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj:hhhj:hMubj)}(hiommu_hw_info_tegra241_cmdqvh]j)}(hj:h]hiommu_hw_info_tegra241_cmdqv}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj:hhhj:hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj:hhhj:hMubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1j\hj:hMhj:hhubj)}(hhh]h)}(hNNVIDIA Tegra241 CMDQV Hardware Information (IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV)h]hNNVIDIA Tegra241 CMDQV Hardware Information (IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV)}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj:hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hMubeh}(h]h ](jstructeh"]h$]h&]jjjj;jj;jjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hw_info_tegra241_cmdqv { __u32 flags; __u8 version; __u8 log2vcmdqs; __u8 log2vsids; __u8 __reserved; }; **Members** ``flags`` Must be 0 ``version`` Version number for the CMDQ-V HW for PARAM bits[03:00] ``log2vcmdqs`` Log2 of the total number of VCMDQs for PARAM bits[07:04] ``log2vsids`` Log2 of the total number of SID replacements for PARAM bits[15:12] ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ;ubh:}(hj ;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubj)}(hstruct iommu_hw_info_tegra241_cmdqv { __u32 flags; __u8 version; __u8 log2vcmdqs; __u8 log2vsids; __u8 __reserved; };h]hstruct iommu_hw_info_tegra241_cmdqv { __u32 flags; __u8 version; __u8 log2vcmdqs; __u8 log2vsids; __u8 __reserved; };}hj);sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubh)}(h **Members**h]j>)}(hj:;h]hMembers}(hj<;hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj8;ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubj0 )}(hhh](j5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hjY;h]hflags}(hj[;hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjW;ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjS;ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjr;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn;hMhjo;ubah}(h]h ]h"]h$]h&]uh1jV hjS;ubeh}(h]h ]h"]h$]h&]uh1j4 hjn;hMhjP;ubj5 )}(hC``version`` Version number for the CMDQ-V HW for PARAM bits[03:00] h](j; )}(h ``version``h]jA )}(hj;h]hversion}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj;ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubjW )}(hhh]h)}(h6Version number for the CMDQ-V HW for PARAM bits[03:00]h]h6Version number for the CMDQ-V HW for PARAM bits[03:00]}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jV hj;ubeh}(h]h ]h"]h$]h&]uh1j4 hj;hMhjP;ubj5 )}(hH``log2vcmdqs`` Log2 of the total number of VCMDQs for PARAM bits[07:04] h](j; )}(h``log2vcmdqs``h]jA )}(hj;h]h log2vcmdqs}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj;ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubjW )}(hhh]h)}(h8Log2 of the total number of VCMDQs for PARAM bits[07:04]h]h8Log2 of the total number of VCMDQs for PARAM bits[07:04]}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jV hj;ubeh}(h]h ]h"]h$]h&]uh1j4 hj;hMhjP;ubj5 )}(hQ``log2vsids`` Log2 of the total number of SID replacements for PARAM bits[15:12] h](j; )}(h ``log2vsids``h]jA )}(hj<h]h log2vsids}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj<ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj;ubjW )}(hhh]h)}(hBLog2 of the total number of SID replacements for PARAM bits[15:12]h]hBLog2 of the total number of SID replacements for PARAM bits[15:12]}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jV hj;ubeh}(h]h ]h"]h$]h&]uh1j4 hj<hMhjP;ubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hj=<h]h __reserved}(hj?<hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj;<ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj7<ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjV<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjS<ubah}(h]h ]h"]h$]h&]uh1jV hj7<ubeh}(h]h ]h"]h$]h&]uh1j4 hjR<hMhjP;ubeh}(h]h ]h"]h$]h&]uh1j/ hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj<h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj~<ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hVMM can use these fields directly in its emulated global PARAM register. Note that only one Virtual Interface (VINTF) should be exposed to a VM, i.e. PARAM bits[11:08] should be set to 0 for log2 of the total number of VINTFs.h]hVMM can use these fields directly in its emulated global PARAM register. Note that only one Virtual Interface (VINTF) should be exposed to a VM, i.e. PARAM bits[11:08] should be set to 0 for log2 of the total number of VINTFs.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_info_amd (C struct)c.iommu_hw_info_amdhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_amdh]jc)}(hstruct iommu_hw_info_amdh](ji)}(hjlh]hstruct}(hj<hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj<hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj<hhhj<hMubj)}(hiommu_hw_info_amdh]j)}(hj<h]hiommu_hw_info_amd}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj<hhhj<hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj<hhhj<hMubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1j\hj<hMhj<hhubj)}(hhh]h)}(hAMD IOMMU device infoh]hAMD IOMMU device info}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj<hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhj<hMubeh}(h]h ](jstructeh"]h$]h&]jjjj=jj=jjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_hw_info_amd { __aligned_u64 efr; __aligned_u64 efr2; }; **Members** ``efr`` Value of AMD IOMMU Extended Feature Register (EFR) ``efr2`` Value of AMD IOMMU Extended Feature 2 Register (EFR2)h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj$=hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj =ubh:}(hj =hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj=ubj)}(hLstruct iommu_hw_info_amd { __aligned_u64 efr; __aligned_u64 efr2; };h]hLstruct iommu_hw_info_amd { __aligned_u64 efr; __aligned_u64 efr2; };}hj==sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj=ubh)}(h **Members**h]j>)}(hjN=h]hMembers}(hjP=hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjL=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj=ubj0 )}(hhh](j5 )}(h;``efr`` Value of AMD IOMMU Extended Feature Register (EFR) h](j; )}(h``efr``h]jA )}(hjm=h]hefr}(hjo=hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjk=ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjg=ubjW )}(hhh]h)}(h2Value of AMD IOMMU Extended Feature Register (EFR)h]h2Value of AMD IOMMU Extended Feature Register (EFR)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj=ubah}(h]h ]h"]h$]h&]uh1jV hjg=ubeh}(h]h ]h"]h$]h&]uh1j4 hj=hMhjd=ubj5 )}(h>``efr2`` Value of AMD IOMMU Extended Feature 2 Register (EFR2)h](j; )}(h``efr2``h]jA )}(hj=h]hefr2}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj=ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj=ubjW )}(hhh]h)}(h5Value of AMD IOMMU Extended Feature 2 Register (EFR2)h]h5Value of AMD IOMMU Extended Feature 2 Register (EFR2)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj=ubah}(h]h ]h"]h$]h&]uh1jV hj=ubeh}(h]h ]h"]h$]h&]uh1j4 hj=hMhjd=ubeh}(h]h ]h"]h$]h&]uh1j/ hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hPlease See description of these registers in the following sections of the AMD I/O Virtualization Technology (IOMMU) Specification. (https://docs.amd.com/v/u/en-US/48882_3.10_PUB)h](hPlease See description of these registers in the following sections of the AMD I/O Virtualization Technology (IOMMU) Specification. (}(hj=hhhNhNubj4)}(h-https://docs.amd.com/v/u/en-US/48882_3.10_PUBh]h-https://docs.amd.com/v/u/en-US/48882_3.10_PUB}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refurij >uh1j4hj=ubh)}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh](j)}(h1MMIO Offset 0030h IOMMU Extended Feature Registerh]h)}(hj&>h]h1MMIO Offset 0030h IOMMU Extended Feature Register}(hj(>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj$>ubah}(h]h ]h"]h$]h&]uh1jhj!>ubj)}(h4MMIO Offset 01A0h IOMMU Extended Feature 2 Register h]h)}(h3MMIO Offset 01A0h IOMMU Extended Feature 2 Registerh]h3MMIO Offset 01A0h IOMMU Extended Feature 2 Register}(hj@>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj<>ubah}(h]h ]h"]h$]h&]uh1jhj!>ubeh}(h]h ]h"]h$]h&]jjuh1jhj5>hMhjhhubh)}(h**Note**h]j>)}(hj]>h]hNote}(hj_>hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj[>ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hThe EFR and EFR2 are raw values reported by hardware. VMM is responsible to determine the appropriate flags to be exposed to the VM since cetertain features are not currently supported by the kernel for HW-vIOMMU.h]hThe EFR and EFR2 are raw values reported by hardware. VMM is responsible to determine the appropriate flags to be exposed to the VM since cetertain features are not currently supported by the kernel for HW-vIOMMU.}(hjs>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hmCurrent VMM-allowed list of feature flags are: - EFR[GTSup, GASup, GioSup, PPRSup, EPHSup, GATS, GLX, PASmax]h]hmCurrent VMM-allowed list of feature flags are: - EFR[GTSup, GASup, GioSup, PPRSup, EPHSup, GATS, GLX, PASmax]}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_info_type (C enum)c.iommu_hw_info_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_info_typeh]jc)}(henum iommu_hw_info_typeh](ji)}(hjh]henum}(hj>hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj>hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj>hhhj>hMubj)}(hiommu_hw_info_typeh]j)}(hj>h]hiommu_hw_info_type}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj>hhhj>hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj>hhhj>hMubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1j\hj>hMhj>hhubj)}(hhh]h)}(hIOMMU Hardware Info Typesh]hIOMMU Hardware Info Types}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj>hhhj>hMubeh}(h]h ](jenumeh"]h$]h&]jjjj?jj?jjjuh1jWhhhjhj8hNubj)}(hX**Constants** ``IOMMU_HW_INFO_TYPE_NONE`` Output by the drivers that do not report hardware info ``IOMMU_HW_INFO_TYPE_DEFAULT`` Input to request for a default type ``IOMMU_HW_INFO_TYPE_INTEL_VTD`` Intel VT-d iommu info type ``IOMMU_HW_INFO_TYPE_ARM_SMMUV3`` ARM SMMUv3 iommu info type ``IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) info type ``IOMMU_HW_INFO_TYPE_AMD`` AMD IOMMU info typeh](h)}(h **Constants**h]j>)}(hj?h]h Constants}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ?ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj?ubj0 )}(hhh](j5 )}(hS``IOMMU_HW_INFO_TYPE_NONE`` Output by the drivers that do not report hardware info h](j; )}(h``IOMMU_HW_INFO_TYPE_NONE``h]jA )}(hj-?h]hIOMMU_HW_INFO_TYPE_NONE}(hj/?hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj+?ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'?ubjW )}(hhh]h)}(h6Output by the drivers that do not report hardware infoh]h6Output by the drivers that do not report hardware info}(hjF?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjC?ubah}(h]h ]h"]h$]h&]uh1jV hj'?ubeh}(h]h ]h"]h$]h&]uh1j4 hjB?hMhj$?ubj5 )}(hC``IOMMU_HW_INFO_TYPE_DEFAULT`` Input to request for a default type h](j; )}(h``IOMMU_HW_INFO_TYPE_DEFAULT``h]jA )}(hjg?h]hIOMMU_HW_INFO_TYPE_DEFAULT}(hji?hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hje?ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhja?ubjW )}(hhh]h)}(h#Input to request for a default typeh]h#Input to request for a default type}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|?hMhj}?ubah}(h]h ]h"]h$]h&]uh1jV hja?ubeh}(h]h ]h"]h$]h&]uh1j4 hj|?hMhj$?ubj5 )}(h<``IOMMU_HW_INFO_TYPE_INTEL_VTD`` Intel VT-d iommu info type h](j; )}(h ``IOMMU_HW_INFO_TYPE_INTEL_VTD``h]jA )}(hj?h]hIOMMU_HW_INFO_TYPE_INTEL_VTD}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj?ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj?ubjW )}(hhh]h)}(hIntel VT-d iommu info typeh]hIntel VT-d iommu info type}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jV hj?ubeh}(h]h ]h"]h$]h&]uh1j4 hj?hMhj$?ubj5 )}(h=``IOMMU_HW_INFO_TYPE_ARM_SMMUV3`` ARM SMMUv3 iommu info type h](j; )}(h!``IOMMU_HW_INFO_TYPE_ARM_SMMUV3``h]jA )}(hj?h]hIOMMU_HW_INFO_TYPE_ARM_SMMUV3}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj?ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj?ubjW )}(hhh]h)}(hARM SMMUv3 iommu info typeh]hARM SMMUv3 iommu info type}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jV hj?ubeh}(h]h ]h"]h$]h&]uh1j4 hj?hMhj$?ubj5 )}(ha``IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) info type h](j; )}(h%``IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV``h]jA )}(hj@h]h!IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj@ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj @ubjW )}(hhh]h)}(h:NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) info typeh]h:NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) info type}(hj+@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj(@ubah}(h]h ]h"]h$]h&]uh1jV hj @ubeh}(h]h ]h"]h$]h&]uh1j4 hj'@hMhj$?ubj5 )}(h.``IOMMU_HW_INFO_TYPE_AMD`` AMD IOMMU info typeh](j; )}(h``IOMMU_HW_INFO_TYPE_AMD``h]jA )}(hjL@h]hIOMMU_HW_INFO_TYPE_AMD}(hjN@hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjJ@ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjF@ubjW )}(hhh]h)}(hAMD IOMMU info typeh]hAMD IOMMU info type}(hje@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjb@ubah}(h]h ]h"]h$]h&]uh1jV hjF@ubeh}(h]h ]h"]h$]h&]uh1j4 hja@hMhj$?ubeh}(h]h ]h"]h$]h&]uh1j/ hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommufd_hw_capabilities (C enum)c.iommufd_hw_capabilitieshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_hw_capabilitiesh]jc)}(henum iommufd_hw_capabilitiesh](ji)}(hjh]henum}(hj@hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj@hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj@hhhj@hMubj)}(hiommufd_hw_capabilitiesh]j)}(hj@h]hiommufd_hw_capabilities}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj@hhhj@hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj@hhhj@hMubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1j\hj@hMhj@hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj@hhhj@hMubeh}(h]h ](jenumeh"]h$]h&]jjjj@jj@jjjuh1jWhhhjhj8hNubj)}(hX=**Constants** ``IOMMU_HW_CAP_DIRTY_TRACKING`` IOMMU hardware support for dirty tracking If available, it means the following APIs are supported: ``IOMMU_HW_CAP_PCI_PASID_EXEC`` Execute Permission Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero. ``IOMMU_HW_CAP_PCI_PASID_PRIV`` Privileged Mode Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero. ``IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED`` ATS is not supported or cannot be used on this device (absence implies ATS may be enabled)h](h)}(h **Constants**h]j>)}(hj@h]h Constants}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj@ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj@ubj0 )}(hhh](j5 )}(h``IOMMU_HW_CAP_DIRTY_TRACKING`` IOMMU hardware support for dirty tracking If available, it means the following APIs are supported: h](j; )}(h``IOMMU_HW_CAP_DIRTY_TRACKING``h]jA )}(hjAh]hIOMMU_HW_CAP_DIRTY_TRACKING}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjAubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjAubjW )}(hhh]h)}(hbIOMMU hardware support for dirty tracking If available, it means the following APIs are supported:h]hbIOMMU hardware support for dirty tracking If available, it means the following APIs are supported:}(hj3AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0Aubah}(h]h ]h"]h$]h&]uh1jV hjAubeh}(h]h ]h"]h$]h&]uh1j4 hj/AhMhjAubj5 )}(h``IOMMU_HW_CAP_PCI_PASID_EXEC`` Execute Permission Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero. h](j; )}(h``IOMMU_HW_CAP_PCI_PASID_EXEC``h]jA )}(hjTAh]hIOMMU_HW_CAP_PCI_PASID_EXEC}(hjVAhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjRAubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjNAubjW )}(hhh]h)}(hhExecute Permission Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero.h]hhExecute Permission Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero.}(hjmAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjjAubah}(h]h ]h"]h$]h&]uh1jV hjNAubeh}(h]h ]h"]h$]h&]uh1j4 hjiAhMhjAubj5 )}(h``IOMMU_HW_CAP_PCI_PASID_PRIV`` Privileged Mode Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero. h](j; )}(h``IOMMU_HW_CAP_PCI_PASID_PRIV``h]jA )}(hjAh]hIOMMU_HW_CAP_PCI_PASID_PRIV}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjAubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjAubjW )}(hhh]h)}(hePrivileged Mode Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero.h]hePrivileged Mode Supported, user ignores it when the struct iommu_hw_info::out_max_pasid_log2 is zero.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjAubah}(h]h ]h"]h$]h&]uh1jV hjAubeh}(h]h ]h"]h$]h&]uh1j4 hjAhMhjAubj5 )}(h``IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED`` ATS is not supported or cannot be used on this device (absence implies ATS may be enabled)h](j; )}(h&``IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED``h]jA )}(hjAh]h"IOMMU_HW_CAP_PCI_ATS_NOT_SUPPORTED}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjAubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjAubjW )}(hhh]h)}(hZATS is not supported or cannot be used on this device (absence implies ATS may be enabled)h]hZATS is not supported or cannot be used on this device (absence implies ATS may be enabled)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjAubah}(h]h ]h"]h$]h&]uh1jV hjAubeh}(h]h ]h"]h$]h&]uh1j4 hjAhMhjAubeh}(h]h ]h"]h$]h&]uh1j/ hj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj Bh]h Description}(hj BhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj Bubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjw)}(h=IOMMU_HWPT_GET_DIRTY_BITMAP IOMMU_HWPT_SET_DIRTY_TRACKING h]h)}(h9IOMMU_HWPT_GET_DIRTY_BITMAP IOMMU_HWPT_SET_DIRTY_TRACKINGh]h9IOMMU_HWPT_GET_DIRTY_BITMAP IOMMU_HWPT_SET_DIRTY_TRACKING}(hj%BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj!Bubah}(h]h ]h"]h$]h&]uh1jvhj3BhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_hw_info_flags (C enum)c.iommufd_hw_info_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_hw_info_flagsh]jc)}(henum iommufd_hw_info_flagsh](ji)}(hjh]henum}(hjSBhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjOBhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjaBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjOBhhhj`BhMubj)}(hiommufd_hw_info_flagsh]j)}(hjMBh]hiommufd_hw_info_flags}(hjsBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoBubah}(h]h ](jjeh"]h$]h&]hhuh1jhjOBhhhj`BhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjKBhhhj`BhMubah}(h]jFBah ](jjeh"]h$]h&]jj)jhuh1j\hj`BhMhjHBhhubj)}(hhh]h)}(hFlags for iommu_hw_infoh]hFlags for iommu_hw_info}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjBhhubah}(h]h ]h"]h$]h&]uh1jhjHBhhhj`BhMubeh}(h]h ](jenumeh"]h$]h&]jjjjBjjBjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HW_INFO_FLAG_INPUT_TYPE`` If set, **in_data_type** carries an input type for user space to request for a specific infoh](h)}(h **Constants**h]j>)}(hjBh]h Constants}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjBubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjBubj0 )}(hhh]j5 )}(h~``IOMMU_HW_INFO_FLAG_INPUT_TYPE`` If set, **in_data_type** carries an input type for user space to request for a specific infoh](j; )}(h!``IOMMU_HW_INFO_FLAG_INPUT_TYPE``h]jA )}(hjBh]hIOMMU_HW_INFO_FLAG_INPUT_TYPE}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjBubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjBubjW )}(hhh]h)}(h\If set, **in_data_type** carries an input type for user space to request for a specific infoh](hIf set, }(hjBhhhNhNubj>)}(h**in_data_type**h]h in_data_type}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjBubhD carries an input type for user space to request for a specific info}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjBhMhjBubah}(h]h ]h"]h$]h&]uh1jV hjBubeh}(h]h ]h"]h$]h&]uh1j4 hjBhMhjBubah}(h]h ]h"]h$]h&]uh1j/ hjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_info (C struct)c.iommu_hw_infohNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(h iommu_hw_infoh]jc)}(hstruct iommu_hw_infoh](ji)}(hjlh]hstruct}(hjAChhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj=Chhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjOChhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj=ChhhjNChMubj)}(h iommu_hw_infoh]j)}(hj;Ch]h iommu_hw_info}(hjaChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]Cubah}(h]h ](jjeh"]h$]h&]hhuh1jhj=ChhhjNChMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj9ChhhjNChMubah}(h]j4Cah ](jjeh"]h$]h&]jj)jhuh1j\hjNChMhj6Chhubj)}(hhh]h)}(hioctl(IOMMU_GET_HW_INFO)h]hioctl(IOMMU_GET_HW_INFO)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjChhubah}(h]h ]h"]h$]h&]uh1jhj6ChhhjNChMubeh}(h]h ](jstructeh"]h$]h&]jjjjCjjCjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; union { __u32 in_data_type; __u32 out_data_type; }; __u8 out_max_pasid_log2; __u8 __reserved[3]; __aligned_u64 out_capabilities; }; **Members** ``size`` sizeof(struct iommu_hw_info) ``flags`` Must be 0 ``dev_id`` The device bound to the iommufd ``data_len`` Input the length of a user buffer in bytes. Output the length of data that kernel supports ``data_uptr`` User pointer to a user-space buffer used by the kernel to fill the iommu type specific hardware information data ``{unnamed_union}`` anonymous ``in_data_type`` This shares the same field with **out_data_type**, making it be a bidirectional field. When IOMMU_HW_INFO_FLAG_INPUT_TYPE is set, an input type carried via this **in_data_type** field will be valid, requesting for the info data to the given type. If IOMMU_HW_INFO_FLAG_INPUT_TYPE is unset, any input value will be seen as IOMMU_HW_INFO_TYPE_DEFAULT ``out_data_type`` Output the iommu hardware info type as defined in the enum iommu_hw_info_type. ``out_max_pasid_log2`` Output the width of PASIDs. 0 means no PASID support. PCI devices turn to out_capabilities to check if the specific capabilities is supported or not. ``__reserved`` Must be 0 ``out_capabilities`` Output the generic iommu capability info type as defined in the enum iommu_hw_capabilities.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjCubh:}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjCubj)}(hX"struct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; union { __u32 in_data_type; __u32 out_data_type; }; __u8 out_max_pasid_log2; __u8 __reserved[3]; __aligned_u64 out_capabilities; };h]hX"struct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; union { __u32 in_data_type; __u32 out_data_type; }; __u8 out_max_pasid_log2; __u8 __reserved[3]; __aligned_u64 out_capabilities; };}hjCsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjCubh)}(h **Members**h]j>)}(hjCh]hMembers}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjCubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjCubj0 )}(hhh](j5 )}(h&``size`` sizeof(struct iommu_hw_info) h](j; )}(h``size``h]jA )}(hjCh]hsize}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjCubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjCubjW )}(hhh]h)}(hsizeof(struct iommu_hw_info)h]hsizeof(struct iommu_hw_info)}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jV hjCubeh}(h]h ]h"]h$]h&]uh1j4 hjDhMhjCubj5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hj)Dh]hflags}(hj+DhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj'Dubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj#DubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjBDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>DhMhj?Dubah}(h]h ]h"]h$]h&]uh1jV hj#Dubeh}(h]h ]h"]h$]h&]uh1j4 hj>DhMhjCubj5 )}(h+``dev_id`` The device bound to the iommufd h](j; )}(h ``dev_id``h]jA )}(hjbDh]hdev_id}(hjdDhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj`Dubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj\DubjW )}(hhh]h)}(hThe device bound to the iommufdh]hThe device bound to the iommufd}(hj{DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwDhMhjxDubah}(h]h ]h"]h$]h&]uh1jV hj\Dubeh}(h]h ]h"]h$]h&]uh1j4 hjwDhMhjCubj5 )}(hh``data_len`` Input the length of a user buffer in bytes. Output the length of data that kernel supports h](j; )}(h ``data_len``h]jA )}(hjDh]hdata_len}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjDubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjDubjW )}(hhh]h)}(hZInput the length of a user buffer in bytes. Output the length of data that kernel supportsh]hZInput the length of a user buffer in bytes. Output the length of data that kernel supports}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjDubah}(h]h ]h"]h$]h&]uh1jV hjDubeh}(h]h ]h"]h$]h&]uh1j4 hjDhMhjCubj5 )}(h``data_uptr`` User pointer to a user-space buffer used by the kernel to fill the iommu type specific hardware information data h](j; )}(h ``data_uptr``h]jA )}(hjDh]h data_uptr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjDubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjDubjW )}(hhh]h)}(hpUser pointer to a user-space buffer used by the kernel to fill the iommu type specific hardware information datah]hpUser pointer to a user-space buffer used by the kernel to fill the iommu type specific hardware information data}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjDubah}(h]h ]h"]h$]h&]uh1jV hjDubeh}(h]h ]h"]h$]h&]uh1j4 hjDhMhjCubj5 )}(h``{unnamed_union}`` anonymous h](j; )}(h``{unnamed_union}``h]jA )}(hjEh]h{unnamed_union}}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj Eubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhKhj EubjW )}(hhh]h)}(h anonymoush]h anonymous}(hj(EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$EhKhj%Eubah}(h]h ]h"]h$]h&]uh1jV hj Eubeh}(h]h ]h"]h$]h&]uh1j4 hj$EhKhjCubj5 )}(hXn``in_data_type`` This shares the same field with **out_data_type**, making it be a bidirectional field. When IOMMU_HW_INFO_FLAG_INPUT_TYPE is set, an input type carried via this **in_data_type** field will be valid, requesting for the info data to the given type. If IOMMU_HW_INFO_FLAG_INPUT_TYPE is unset, any input value will be seen as IOMMU_HW_INFO_TYPE_DEFAULT h](j; )}(h``in_data_type``h]jA )}(hjHEh]h in_data_type}(hjJEhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjFEubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjBEubjW )}(hhh]h)}(hX\This shares the same field with **out_data_type**, making it be a bidirectional field. When IOMMU_HW_INFO_FLAG_INPUT_TYPE is set, an input type carried via this **in_data_type** field will be valid, requesting for the info data to the given type. If IOMMU_HW_INFO_FLAG_INPUT_TYPE is unset, any input value will be seen as IOMMU_HW_INFO_TYPE_DEFAULTh](h This shares the same field with }(hjaEhhhNhNubj>)}(h**out_data_type**h]h out_data_type}(hjiEhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaEubhp, making it be a bidirectional field. When IOMMU_HW_INFO_FLAG_INPUT_TYPE is set, an input type carried via this }(hjaEhhhNhNubj>)}(h**in_data_type**h]h in_data_type}(hj{EhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaEubh field will be valid, requesting for the info data to the given type. If IOMMU_HW_INFO_FLAG_INPUT_TYPE is unset, any input value will be seen as IOMMU_HW_INFO_TYPE_DEFAULT}(hjaEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^Eubah}(h]h ]h"]h$]h&]uh1jV hjBEubeh}(h]h ]h"]h$]h&]uh1j4 hj]EhMhjCubj5 )}(ha``out_data_type`` Output the iommu hardware info type as defined in the enum iommu_hw_info_type. h](j; )}(h``out_data_type``h]jA )}(hjEh]h out_data_type}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjEubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjEubjW )}(hhh]h)}(hNOutput the iommu hardware info type as defined in the enum iommu_hw_info_type.h]hNOutput the iommu hardware info type as defined in the enum iommu_hw_info_type.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjEubah}(h]h ]h"]h$]h&]uh1jV hjEubeh}(h]h ]h"]h$]h&]uh1j4 hjEhM hjCubj5 )}(h``out_max_pasid_log2`` Output the width of PASIDs. 0 means no PASID support. PCI devices turn to out_capabilities to check if the specific capabilities is supported or not. h](j; )}(h``out_max_pasid_log2``h]jA )}(hjEh]hout_max_pasid_log2}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjEubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjEubjW )}(hhh]h)}(hOutput the width of PASIDs. 0 means no PASID support. PCI devices turn to out_capabilities to check if the specific capabilities is supported or not.h]hOutput the width of PASIDs. 0 means no PASID support. PCI devices turn to out_capabilities to check if the specific capabilities is supported or not.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjEubah}(h]h ]h"]h$]h&]uh1jV hjEubeh}(h]h ]h"]h$]h&]uh1j4 hjEhMhjCubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjFh]h __reserved}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjFubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjFubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj3FhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/FhMhj0Fubah}(h]h ]h"]h$]h&]uh1jV hjFubeh}(h]h ]h"]h$]h&]uh1j4 hj/FhMhjCubj5 )}(hp``out_capabilities`` Output the generic iommu capability info type as defined in the enum iommu_hw_capabilities.h](j; )}(h``out_capabilities``h]jA )}(hjSFh]hout_capabilities}(hjUFhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjQFubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjMFubjW )}(hhh]h)}(h[Output the generic iommu capability info type as defined in the enum iommu_hw_capabilities.h]h[Output the generic iommu capability info type as defined in the enum iommu_hw_capabilities.}(hjlFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhFhM hjiFubah}(h]h ]h"]h$]h&]uh1jV hjMFubeh}(h]h ]h"]h$]h&]uh1j4 hjhFhM hjCubeh}(h]h ]h"]h$]h&]uh1j/ hjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjFh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXqQuery an iommu type specific hardware information data from an iommu behind a given device that has been bound to iommufd. This hardware info data will be used to sync capabilities between the virtual iommu and the physical iommu, e.g. a nested translation setup needs to check the hardware info, so a guest stage-1 page table can be compatible with the physical iommu.h]hXqQuery an iommu type specific hardware information data from an iommu behind a given device that has been bound to iommufd. This hardware info data will be used to sync capabilities between the virtual iommu and the physical iommu, e.g. a nested translation setup needs to check the hardware info, so a guest stage-1 page table can be compatible with the physical iommu.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hX To capture an iommu type specific hardware information data, **data_uptr** and its length **data_len** must be provided. Trailing bytes will be zeroed if the user buffer is larger than the data that kernel has. Otherwise, kernel only fills the buffer using the given length in **data_len**. If the ioctl succeeds, **data_len** will be updated to the length that kernel actually supports, **out_data_type** will be filled to decode the data filled in the buffer pointed by **data_uptr**. Input **data_len** == zero is allowed.h](h=To capture an iommu type specific hardware information data, }(hjFhhhNhNubj>)}(h **data_uptr**h]h data_uptr}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh and its length }(hjFhhhNhNubj>)}(h **data_len**h]hdata_len}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh must be provided. Trailing bytes will be zeroed if the user buffer is larger than the data that kernel has. Otherwise, kernel only fills the buffer using the given length in }(hjFhhhNhNubj>)}(h **data_len**h]hdata_len}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh. If the ioctl succeeds, }(hjFhhhNhNubj>)}(h **data_len**h]hdata_len}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh> will be updated to the length that kernel actually supports, }(hjFhhhNhNubj>)}(h**out_data_type**h]h out_data_type}(hj GhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubhC will be filled to decode the data filled in the buffer pointed by }(hjFhhhNhNubj>)}(h **data_uptr**h]h data_uptr}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh. Input }(hjFhhhNhNubj>)}(h **data_len**h]hdata_len}(hj.GhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjFubh == zero is allowed.}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS(iommu_hwpt_set_dirty_tracking (C struct)c.iommu_hwpt_set_dirty_trackinghNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_set_dirty_trackingh]jc)}(h$struct iommu_hwpt_set_dirty_trackingh](ji)}(hjlh]hstruct}(hj`GhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj\Ghhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM!ubj{)}(h h]h }(hjnGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj\GhhhjmGhM!ubj)}(hiommu_hwpt_set_dirty_trackingh]j)}(hjZGh]hiommu_hwpt_set_dirty_tracking}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|Gubah}(h]h ](jjeh"]h$]h&]hhuh1jhj\GhhhjmGhM!ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjXGhhhjmGhM!ubah}(h]jSGah ](jjeh"]h$]h&]jj)jhuh1j\hjmGhM!hjUGhhubj)}(hhh]h)}(h$ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING)h]h$ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING)}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM9hjGhhubah}(h]h ]h"]h$]h&]uh1jhjUGhhhjmGhM!ubeh}(h]h ](jstructeh"]h$]h&]jjjjGjjGjjjuh1jWhhhjhj8hNubj)}(hXz**Definition**:: struct iommu_hwpt_set_dirty_tracking { __u32 size; __u32 flags; __u32 hwpt_id; __u32 __reserved; }; **Members** ``size`` sizeof(struct iommu_hwpt_set_dirty_tracking) ``flags`` Combination of enum iommufd_hwpt_set_dirty_tracking_flags ``hwpt_id`` HW pagetable ID that represents the IOMMU domain ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjGubh:}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM=hjGubj)}(hsstruct iommu_hwpt_set_dirty_tracking { __u32 size; __u32 flags; __u32 hwpt_id; __u32 __reserved; };h]hsstruct iommu_hwpt_set_dirty_tracking { __u32 size; __u32 flags; __u32 hwpt_id; __u32 __reserved; };}hjGsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM?hjGubh)}(h **Members**h]j>)}(hjGh]hMembers}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjGubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMFhjGubj0 )}(hhh](j5 )}(h6``size`` sizeof(struct iommu_hwpt_set_dirty_tracking) h](j; )}(h``size``h]jA )}(hjHh]hsize}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj Hubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM;hj HubjW )}(hhh]h)}(h,sizeof(struct iommu_hwpt_set_dirty_tracking)h]h,sizeof(struct iommu_hwpt_set_dirty_tracking)}(hj(HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$HhM;hj%Hubah}(h]h ]h"]h$]h&]uh1jV hj Hubeh}(h]h ]h"]h$]h&]uh1j4 hj$HhM;hjHubj5 )}(hD``flags`` Combination of enum iommufd_hwpt_set_dirty_tracking_flags h](j; )}(h ``flags``h]jA )}(hjHHh]hflags}(hjJHhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjFHubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM<hjBHubjW )}(hhh]h)}(h9Combination of enum iommufd_hwpt_set_dirty_tracking_flagsh]h9Combination of enum iommufd_hwpt_set_dirty_tracking_flags}(hjaHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]HhM<hj^Hubah}(h]h ]h"]h$]h&]uh1jV hjBHubeh}(h]h ]h"]h$]h&]uh1j4 hj]HhM<hjHubj5 )}(h=``hwpt_id`` HW pagetable ID that represents the IOMMU domain h](j; )}(h ``hwpt_id``h]jA )}(hjHh]hhwpt_id}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjHubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM=hj{HubjW )}(hhh]h)}(h0HW pagetable ID that represents the IOMMU domainh]h0HW pagetable ID that represents the IOMMU domain}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhM=hjHubah}(h]h ]h"]h$]h&]uh1jV hj{Hubeh}(h]h ]h"]h$]h&]uh1j4 hjHhM=hjHubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hjHh]h __reserved}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjHubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM=hjHubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM>hjHubah}(h]h ]h"]h$]h&]uh1jV hjHubeh}(h]h ]h"]h$]h&]uh1j4 hjHhM=hjHubeh}(h]h ]h"]h$]h&]uh1j/ hjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjHh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjHubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMAhjhhubh)}(h)Toggle dirty tracking on an HW pagetable.h]h)Toggle dirty tracking on an HW pagetable.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM>hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS,iommufd_hwpt_get_dirty_bitmap_flags (C enum)%c.iommufd_hwpt_get_dirty_bitmap_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(h#iommufd_hwpt_get_dirty_bitmap_flagsh]jc)}(h(enum iommufd_hwpt_get_dirty_bitmap_flagsh](ji)}(hjh]henum}(hj;IhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj7Ihhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMCubj{)}(h h]h }(hjIIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj7IhhhjHIhMCubj)}(h#iommufd_hwpt_get_dirty_bitmap_flagsh]j)}(hj5Ih]h#iommufd_hwpt_get_dirty_bitmap_flags}(hj[IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWIubah}(h]h ](jjeh"]h$]h&]hhuh1jhj7IhhhjHIhMCubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj3IhhhjHIhMCubah}(h]j.Iah ](jjeh"]h$]h&]jj)jhuh1j\hjHIhMChj0Ihhubj)}(hhh]h)}(hFlags for getting dirty bitsh]hFlags for getting dirty bits}(hj}IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMKhjzIhhubah}(h]h ]h"]h$]h&]uh1jhj0IhhhjHIhMCubeh}(h]h ](jenumeh"]h$]h&]jjjjIjjIjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR`` Just read the PTEs without clearing any dirty bits metadata. This flag can be passed in the expectation where the next operation is an unmap of the same IOVA range.h](h)}(h **Constants**h]j>)}(hjIh]h Constants}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjIubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMOhjIubj0 )}(hhh]j5 )}(h``IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR`` Just read the PTEs without clearing any dirty bits metadata. This flag can be passed in the expectation where the next operation is an unmap of the same IOVA range.h](j; )}(h(``IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR``h]jA )}(hjIh]h$IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjIubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMUhjIubjW )}(hhh]h)}(hJust read the PTEs without clearing any dirty bits metadata. This flag can be passed in the expectation where the next operation is an unmap of the same IOVA range.h]hJust read the PTEs without clearing any dirty bits metadata. This flag can be passed in the expectation where the next operation is an unmap of the same IOVA range.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMRhjIubah}(h]h ]h"]h$]h&]uh1jV hjIubeh}(h]h ]h"]h$]h&]uh1j4 hjIhMUhjIubah}(h]h ]h"]h$]h&]uh1j/ hjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS&iommu_hwpt_get_dirty_bitmap (C struct)c.iommu_hwpt_get_dirty_bitmaphNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_get_dirty_bitmaph]jc)}(h"struct iommu_hwpt_get_dirty_bitmaph](ji)}(hjlh]hstruct}(hjJhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjJhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[ubj{)}(h h]h }(hj&JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjJhhhj%JhM[ubj)}(hiommu_hwpt_get_dirty_bitmaph]j)}(hjJh]hiommu_hwpt_get_dirty_bitmap}(hj8JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4Jubah}(h]h ](jjeh"]h$]h&]hhuh1jhjJhhhj%JhM[ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjJhhhj%JhM[ubah}(h]j Jah ](jjeh"]h$]h&]jj)jhuh1j\hj%JhM[hj Jhhubj)}(hhh]h)}(h"ioctl(IOMMU_HWPT_GET_DIRTY_BITMAP)h]h"ioctl(IOMMU_HWPT_GET_DIRTY_BITMAP)}(hjZJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMXhjWJhhubah}(h]h ]h"]h$]h&]uh1jhj Jhhhj%JhM[ubeh}(h]h ](jstructeh"]h$]h&]jjjjrJjjrJjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_get_dirty_bitmap { __u32 size; __u32 hwpt_id; __u32 flags; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 page_size; __aligned_u64 data; }; **Members** ``size`` sizeof(struct iommu_hwpt_get_dirty_bitmap) ``hwpt_id`` HW pagetable ID that represents the IOMMU domain ``flags`` Combination of enum iommufd_hwpt_get_dirty_bitmap_flags ``__reserved`` Must be 0 ``iova`` base IOVA of the bitmap first bit ``length`` IOVA range size ``page_size`` page size granularity of each bit in the bitmap ``data`` bitmap where to set the dirty bits. The bitmap bits each represent a page_size which you deviate from an arbitrary iova.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj~JhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjzJubh:}(hjzJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM\hjvJubj)}(hstruct iommu_hwpt_get_dirty_bitmap { __u32 size; __u32 hwpt_id; __u32 flags; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 page_size; __aligned_u64 data; };h]hstruct iommu_hwpt_get_dirty_bitmap { __u32 size; __u32 hwpt_id; __u32 flags; __u32 __reserved; __aligned_u64 iova; __aligned_u64 length; __aligned_u64 page_size; __aligned_u64 data; };}hjJsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM^hjvJubh)}(h **Members**h]j>)}(hjJh]hMembers}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjJubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMihjvJubj0 )}(hhh](j5 )}(h4``size`` sizeof(struct iommu_hwpt_get_dirty_bitmap) h](j; )}(h``size``h]jA )}(hjJh]hsize}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjJubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMZhjJubjW )}(hhh]h)}(h*sizeof(struct iommu_hwpt_get_dirty_bitmap)h]h*sizeof(struct iommu_hwpt_get_dirty_bitmap)}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMZhjJubah}(h]h ]h"]h$]h&]uh1jV hjJubeh}(h]h ]h"]h$]h&]uh1j4 hjJhMZhjJubj5 )}(h=``hwpt_id`` HW pagetable ID that represents the IOMMU domain h](j; )}(h ``hwpt_id``h]jA )}(hjKh]hhwpt_id}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjJubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjJubjW )}(hhh]h)}(h0HW pagetable ID that represents the IOMMU domainh]h0HW pagetable ID that represents the IOMMU domain}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM[hjKubah}(h]h ]h"]h$]h&]uh1jV hjJubeh}(h]h ]h"]h$]h&]uh1j4 hjKhM[hjJubj5 )}(hB``flags`` Combination of enum iommufd_hwpt_get_dirty_bitmap_flags h](j; )}(h ``flags``h]jA )}(hj9Kh]hflags}(hj;KhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj7Kubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM\hj3KubjW )}(hhh]h)}(h7Combination of enum iommufd_hwpt_get_dirty_bitmap_flagsh]h7Combination of enum iommufd_hwpt_get_dirty_bitmap_flags}(hjRKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNKhM\hjOKubah}(h]h ]h"]h$]h&]uh1jV hj3Kubeh}(h]h ]h"]h$]h&]uh1j4 hjNKhM\hjJubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjrKh]h __reserved}(hjtKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjpKubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM]hjlKubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM]hjKubah}(h]h ]h"]h$]h&]uh1jV hjlKubeh}(h]h ]h"]h$]h&]uh1j4 hjKhM]hjJubj5 )}(h+``iova`` base IOVA of the bitmap first bit h](j; )}(h``iova``h]jA )}(hjKh]hiova}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjKubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM^hjKubjW )}(hhh]h)}(h!base IOVA of the bitmap first bith]h!base IOVA of the bitmap first bit}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM^hjKubah}(h]h ]h"]h$]h&]uh1jV hjKubeh}(h]h ]h"]h$]h&]uh1j4 hjKhM^hjJubj5 )}(h``length`` IOVA range size h](j; )}(h ``length``h]jA )}(hjKh]hlength}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjKubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM_hjKubjW )}(hhh]h)}(hIOVA range sizeh]hIOVA range size}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM_hjKubah}(h]h ]h"]h$]h&]uh1jV hjKubeh}(h]h ]h"]h$]h&]uh1j4 hjKhM_hjJubj5 )}(h>``page_size`` page size granularity of each bit in the bitmap h](j; )}(h ``page_size``h]jA )}(hjLh]h page_size}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjLubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM`hjLubjW )}(hhh]h)}(h/page size granularity of each bit in the bitmaph]h/page size granularity of each bit in the bitmap}(hj6LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2LhM`hj3Lubah}(h]h ]h"]h$]h&]uh1jV hjLubeh}(h]h ]h"]h$]h&]uh1j4 hj2LhM`hjJubj5 )}(h``data`` bitmap where to set the dirty bits. The bitmap bits each represent a page_size which you deviate from an arbitrary iova.h](j; )}(h``data``h]jA )}(hjVLh]hdata}(hjXLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjTLubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMahjPLubjW )}(hhh]h)}(hxbitmap where to set the dirty bits. The bitmap bits each represent a page_size which you deviate from an arbitrary iova.h]hxbitmap where to set the dirty bits. The bitmap bits each represent a page_size which you deviate from an arbitrary iova.}(hjoLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkLhMahjlLubah}(h]h ]h"]h$]h&]uh1jV hjPLubeh}(h]h ]h"]h$]h&]uh1j4 hjkLhMahjJubeh}(h]h ]h"]h$]h&]uh1j/ hjvJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjLubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMehjhhubh)}(hChecking a given IOVA is dirty:h]hChecking a given IOVA is dirty:}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMbhjhhubjw)}(hDdata[(iova / page_size) / 64] & (1ULL << ((iova / page_size) % 64)) h]h)}(hCdata[(iova / page_size) / 64] & (1ULL << ((iova / page_size) % 64))h]hCdata[(iova / page_size) / 64] & (1ULL << ((iova / page_size) % 64))}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMdhjLubah}(h]h ]h"]h$]h&]uh1jvhjLhMdhjhhubh)}(hWalk the IOMMU pagetables for a given IOVA range to return a bitmap with the dirty IOVAs. In doing so it will also by default clear any dirty bit metadata set in the IOPTE.h]hWalk the IOMMU pagetables for a given IOVA range to return a bitmap with the dirty IOVAs. In doing so it will also by default clear any dirty bit metadata set in the IOPTE.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMfhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS(iommu_hwpt_invalidate_data_type (C enum)!c.iommu_hwpt_invalidate_data_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_invalidate_data_typeh]jc)}(h$enum iommu_hwpt_invalidate_data_typeh](ji)}(hjh]henum}(hjLhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjLhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmubj{)}(h h]h }(hj MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjLhhhj MhMmubj)}(hiommu_hwpt_invalidate_data_typeh]j)}(hjLh]hiommu_hwpt_invalidate_data_type}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]hhuh1jhjLhhhj MhMmubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjLhhhj MhMmubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1j\hj MhMmhjLhhubj)}(hhh]h)}(h'IOMMU HWPT Cache Invalidation Data Typeh]h'IOMMU HWPT Cache Invalidation Data Type}(hj@MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMyhj=Mhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhj MhMmubeh}(h]h ](jenumeh"]h$]h&]jjjjXMjjXMjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HWPT_INVALIDATE_DATA_VTD_S1`` Invalidation data for VTD_S1 ``IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3`` Invalidation data for ARM SMMUv3h](h)}(h **Constants**h]j>)}(hjbMh]h Constants}(hjdMhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj`Mubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM}hj\Mubj0 )}(hhh](j5 )}(hC``IOMMU_HWPT_INVALIDATE_DATA_VTD_S1`` Invalidation data for VTD_S1 h](j; )}(h%``IOMMU_HWPT_INVALIDATE_DATA_VTD_S1``h]jA )}(hjMh]h!IOMMU_HWPT_INVALIDATE_DATA_VTD_S1}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjMubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj{MubjW )}(hhh]h)}(hInvalidation data for VTD_S1h]hInvalidation data for VTD_S1}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jV hj{Mubeh}(h]h ]h"]h$]h&]uh1j4 hjMhMhjxMubj5 )}(hL``IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3`` Invalidation data for ARM SMMUv3h](j; )}(h+``IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3``h]jA )}(hjMh]h'IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjMubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjMubjW )}(hhh]h)}(h Invalidation data for ARM SMMUv3h]h Invalidation data for ARM SMMUv3}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjMubah}(h]h ]h"]h$]h&]uh1jV hjMubeh}(h]h ]h"]h$]h&]uh1j4 hjMhMhjxMubeh}(h]h ]h"]h$]h&]uh1j/ hj\Mubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS+iommu_hwpt_vtd_s1_invalidate_flags (C enum)$c.iommu_hwpt_vtd_s1_invalidate_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(h"iommu_hwpt_vtd_s1_invalidate_flagsh]jc)}(h'enum iommu_hwpt_vtd_s1_invalidate_flagsh](ji)}(hjh]henum}(hjNhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjNhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj"NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjNhhhj!NhMubj)}(h"iommu_hwpt_vtd_s1_invalidate_flagsh]j)}(hjNh]h"iommu_hwpt_vtd_s1_invalidate_flags}(hj4NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0Nubah}(h]h ](jjeh"]h$]h&]hhuh1jhjNhhhj!NhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj Nhhhj!NhMubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1j\hj!NhMhj Nhhubj)}(hhh]h)}(h/Flags for Intel VT-d stage-1 cache invalidationh]h/Flags for Intel VT-d stage-1 cache invalidation}(hjVNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjSNhhubah}(h]h ]h"]h$]h&]uh1jhj Nhhhj!NhMubeh}(h]h ](jenumeh"]h$]h&]jjjjnNjjnNjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_VTD_INV_FLAGS_LEAF`` Indicates whether the invalidation applies to all-levels page structure cache or just the leaf PTE cache.h](h)}(h **Constants**h]j>)}(hjxNh]h Constants}(hjzNhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjvNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjrNubj0 )}(hhh]j5 )}(h``IOMMU_VTD_INV_FLAGS_LEAF`` Indicates whether the invalidation applies to all-levels page structure cache or just the leaf PTE cache.h](j; )}(h``IOMMU_VTD_INV_FLAGS_LEAF``h]jA )}(hjNh]hIOMMU_VTD_INV_FLAGS_LEAF}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjNubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjNubjW )}(hhh]h)}(hiIndicates whether the invalidation applies to all-levels page structure cache or just the leaf PTE cache.h]hiIndicates whether the invalidation applies to all-levels page structure cache or just the leaf PTE cache.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjNubah}(h]h ]h"]h$]h&]uh1jV hjNubeh}(h]h ]h"]h$]h&]uh1j4 hjNhMhjNubah}(h]h ]h"]h$]h&]uh1j/ hjrNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS'iommu_hwpt_vtd_s1_invalidate (C struct)c.iommu_hwpt_vtd_s1_invalidatehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_vtd_s1_invalidateh]jc)}(h#struct iommu_hwpt_vtd_s1_invalidateh](ji)}(hjlh]hstruct}(hjNhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjNhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjNhhhjNhMubj)}(hiommu_hwpt_vtd_s1_invalidateh]j)}(hjNh]hiommu_hwpt_vtd_s1_invalidate}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Oubah}(h]h ](jjeh"]h$]h&]hhuh1jhjNhhhjNhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjNhhhjNhMubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1j\hjNhMhjNhhubj)}(hhh]h)}(hAIntel VT-d cache invalidation (IOMMU_HWPT_INVALIDATE_DATA_VTD_S1)h]hAIntel VT-d cache invalidation (IOMMU_HWPT_INVALIDATE_DATA_VTD_S1)}(hj3OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj0Ohhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjNhMubeh}(h]h ](jstructeh"]h$]h&]jjjjKOjjKOjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_vtd_s1_invalidate { __aligned_u64 addr; __aligned_u64 npages; __u32 flags; __u32 __reserved; }; **Members** ``addr`` The start address of the range to be invalidated. It needs to be 4KB aligned. ``npages`` Number of contiguous 4K pages to be invalidated. ``flags`` Combination of enum iommu_hwpt_vtd_s1_invalidate_flags ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjWOhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjSOubh:}(hjSOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOOubj)}(hstruct iommu_hwpt_vtd_s1_invalidate { __aligned_u64 addr; __aligned_u64 npages; __u32 flags; __u32 __reserved; };h]hstruct iommu_hwpt_vtd_s1_invalidate { __aligned_u64 addr; __aligned_u64 npages; __u32 flags; __u32 __reserved; };}hjpOsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOOubh)}(h **Members**h]j>)}(hjOh]hMembers}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjOubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOOubj0 )}(hhh](j5 )}(hW``addr`` The start address of the range to be invalidated. It needs to be 4KB aligned. h](j; )}(h``addr``h]jA )}(hjOh]haddr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjOubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOubjW )}(hhh]h)}(hMThe start address of the range to be invalidated. It needs to be 4KB aligned.h]hMThe start address of the range to be invalidated. It needs to be 4KB aligned.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOubah}(h]h ]h"]h$]h&]uh1jV hjOubeh}(h]h ]h"]h$]h&]uh1j4 hjOhMhjOubj5 )}(h<``npages`` Number of contiguous 4K pages to be invalidated. h](j; )}(h ``npages``h]jA )}(hjOh]hnpages}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjOubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjOubjW )}(hhh]h)}(h0Number of contiguous 4K pages to be invalidated.h]h0Number of contiguous 4K pages to be invalidated.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jV hjOubeh}(h]h ]h"]h$]h&]uh1j4 hjOhMhjOubj5 )}(hA``flags`` Combination of enum iommu_hwpt_vtd_s1_invalidate_flags h](j; )}(h ``flags``h]jA )}(hjPh]hflags}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjPubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj PubjW )}(hhh]h)}(h6Combination of enum iommu_hwpt_vtd_s1_invalidate_flagsh]h6Combination of enum iommu_hwpt_vtd_s1_invalidate_flags}(hj,PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(PhMhj)Pubah}(h]h ]h"]h$]h&]uh1jV hj Pubeh}(h]h ]h"]h$]h&]uh1j4 hj(PhMhjOubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hjLPh]h __reserved}(hjNPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjJPubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjFPubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjePhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjbPubah}(h]h ]h"]h$]h&]uh1jV hjFPubeh}(h]h ]h"]h$]h&]uh1j4 hjaPhMhjOubeh}(h]h ]h"]h$]h&]uh1j/ hjOOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjPh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjPubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hThe Intel VT-d specific invalidation data for user-managed stage-1 cache invalidation in nested translation. Userspace uses this structure to tell the impacted cache scope after modifying the stage-1 page table.h]hThe Intel VT-d specific invalidation data for user-managed stage-1 cache invalidation in nested translation. Userspace uses this structure to tell the impacted cache scope after modifying the stage-1 page table.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hoInvalidating all the caches related to the page table by setting **addr** to be 0 and **npages** to be U64_MAX.h](hAInvalidating all the caches related to the page table by setting }(hjPhhhNhNubj>)}(h**addr**h]haddr}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjPubh to be 0 and }(hjPhhhNhNubj>)}(h **npages**h]hnpages}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjPubh to be U64_MAX.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hCThe device TLB will be invalidated automatically if ATS is enabled.h]hCThe device TLB will be invalidated automatically if ATS is enabled.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS-iommu_viommu_arm_smmuv3_invalidate (C struct)$c.iommu_viommu_arm_smmuv3_invalidatehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(h"iommu_viommu_arm_smmuv3_invalidateh]jc)}(h)struct iommu_viommu_arm_smmuv3_invalidateh](ji)}(hjlh]hstruct}(hjQhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj Qhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj QhhhjQhMubj)}(h"iommu_viommu_arm_smmuv3_invalidateh]j)}(hj Qh]h"iommu_viommu_arm_smmuv3_invalidate}(hj/QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+Qubah}(h]h ](jjeh"]h$]h&]hhuh1jhj QhhhjQhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjQhhhjQhMubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1j\hjQhMhjQhhubj)}(hhh]h)}(hGARM SMMUv3 cache invalidation (IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3)h]hGARM SMMUv3 cache invalidation (IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3)}(hjQQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjNQhhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjQhMubeh}(h]h ](jstructeh"]h$]h&]jjjjiQjjiQjjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_viommu_arm_smmuv3_invalidate { __aligned_le64 cmd[2]; }; **Members** ``cmd`` 128-bit cache invalidation command that runs in SMMU CMDQ. Must be little-endian.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjuQhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjqQubh:}(hjqQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjmQubj)}(hIstruct iommu_viommu_arm_smmuv3_invalidate { __aligned_le64 cmd[2]; };h]hIstruct iommu_viommu_arm_smmuv3_invalidate { __aligned_le64 cmd[2]; };}hjQsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjmQubh)}(h **Members**h]j>)}(hjQh]hMembers}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjQubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjmQubj0 )}(hhh]j5 )}(hY``cmd`` 128-bit cache invalidation command that runs in SMMU CMDQ. Must be little-endian.h](j; )}(h``cmd``h]jA )}(hjQh]hcmd}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjQubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjQubjW )}(hhh]h)}(hQ128-bit cache invalidation command that runs in SMMU CMDQ. Must be little-endian.h]hQ128-bit cache invalidation command that runs in SMMU CMDQ. Must be little-endian.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjQubah}(h]h ]h"]h$]h&]uh1jV hjQubeh}(h]h ]h"]h$]h&]uh1j4 hjQhMhjQubah}(h]h ]h"]h$]h&]uh1j/ hjmQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjQubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubj0 )}(hhh]j5 )}(hSupported command list only when passing in a vIOMMU via **hwpt_id**: CMDQ_OP_TLBI_NSNH_ALL CMDQ_OP_TLBI_NH_VA CMDQ_OP_TLBI_NH_VAA CMDQ_OP_TLBI_NH_ALL CMDQ_OP_TLBI_NH_ASID CMDQ_OP_ATC_INV CMDQ_OP_CFGI_CD CMDQ_OP_CFGI_CD_ALL h](j; )}(hESupported command list only when passing in a vIOMMU via **hwpt_id**:h](h9Supported command list only when passing in a vIOMMU via }(hjRhhhNhNubj>)}(h **hwpt_id**h]hhwpt_id}(hj%RhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjRubh:}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjRubjW )}(hhh]h)}(hCMDQ_OP_TLBI_NSNH_ALL CMDQ_OP_TLBI_NH_VA CMDQ_OP_TLBI_NH_VAA CMDQ_OP_TLBI_NH_ALL CMDQ_OP_TLBI_NH_ASID CMDQ_OP_ATC_INV CMDQ_OP_CFGI_CD CMDQ_OP_CFGI_CD_ALLh]hCMDQ_OP_TLBI_NSNH_ALL CMDQ_OP_TLBI_NH_VA CMDQ_OP_TLBI_NH_VAA CMDQ_OP_TLBI_NH_ALL CMDQ_OP_TLBI_NH_ASID CMDQ_OP_ATC_INV CMDQ_OP_CFGI_CD CMDQ_OP_CFGI_CD_ALL}(hjARhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj>Rubah}(h]h ]h"]h$]h&]uh1jV hjRubeh}(h]h ]h"]h$]h&]uh1j4 hj=RhMhjRubah}(h]h ]h"]h$]h&]uh1j/ hjhhhj8hNubh)}(h6-EIO will be returned if the command is not supported.h]h6-EIO will be returned if the command is not supported.}(hjbRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommu_hwpt_invalidate (C struct)c.iommu_hwpt_invalidatehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_invalidateh]jc)}(hstruct iommu_hwpt_invalidateh](ji)}(hjlh]hstruct}(hjRhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjRhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjRhhhjRhMubj)}(hiommu_hwpt_invalidateh]j)}(hjRh]hiommu_hwpt_invalidate}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]hhuh1jhjRhhhjRhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjRhhhjRhMubah}(h]j}Rah ](jjeh"]h$]h&]jj)jhuh1j\hjRhMhjRhhubj)}(hhh]h)}(hioctl(IOMMU_HWPT_INVALIDATE)h]hioctl(IOMMU_HWPT_INVALIDATE)}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjRhMubeh}(h]h ](jstructeh"]h$]h&]jjjjRjjRjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_invalidate { __u32 size; __u32 hwpt_id; __aligned_u64 data_uptr; __u32 data_type; __u32 entry_len; __u32 entry_num; __u32 __reserved; }; **Members** ``size`` sizeof(struct iommu_hwpt_invalidate) ``hwpt_id`` ID of a nested HWPT or a vIOMMU, for cache invalidation ``data_uptr`` User pointer to an array of driver-specific cache invalidation data. ``data_type`` One of enum iommu_hwpt_invalidate_data_type, defining the data type of all the entries in the invalidation request array. It should be a type supported by the hwpt pointed by **hwpt_id**. ``entry_len`` Length (in bytes) of a request entry in the request array ``entry_num`` Input the number of cache invalidation requests in the array. Output the number of requests successfully handled by kernel. ``__reserved`` Must be 0.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjRubh:}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjRubj)}(hstruct iommu_hwpt_invalidate { __u32 size; __u32 hwpt_id; __aligned_u64 data_uptr; __u32 data_type; __u32 entry_len; __u32 entry_num; __u32 __reserved; };h]hstruct iommu_hwpt_invalidate { __u32 size; __u32 hwpt_id; __aligned_u64 data_uptr; __u32 data_type; __u32 entry_len; __u32 entry_num; __u32 __reserved; };}hj Ssbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjRubh)}(h **Members**h]j>)}(hjSh]hMembers}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjSubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjRubj0 )}(hhh](j5 )}(h.``size`` sizeof(struct iommu_hwpt_invalidate) h](j; )}(h``size``h]jA )}(hj9Sh]hsize}(hj;ShhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj7Subah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj3SubjW )}(hhh]h)}(h$sizeof(struct iommu_hwpt_invalidate)h]h$sizeof(struct iommu_hwpt_invalidate)}(hjRShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNShMhjOSubah}(h]h ]h"]h$]h&]uh1jV hj3Subeh}(h]h ]h"]h$]h&]uh1j4 hjNShMhj0Subj5 )}(hD``hwpt_id`` ID of a nested HWPT or a vIOMMU, for cache invalidation h](j; )}(h ``hwpt_id``h]jA )}(hjrSh]hhwpt_id}(hjtShhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjpSubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjlSubjW )}(hhh]h)}(h7ID of a nested HWPT or a vIOMMU, for cache invalidationh]h7ID of a nested HWPT or a vIOMMU, for cache invalidation}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jV hjlSubeh}(h]h ]h"]h$]h&]uh1j4 hjShMhj0Subj5 )}(hS``data_uptr`` User pointer to an array of driver-specific cache invalidation data. h](j; )}(h ``data_uptr``h]jA )}(hjSh]h data_uptr}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjSubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjSubjW )}(hhh]h)}(hDUser pointer to an array of driver-specific cache invalidation data.h]hDUser pointer to an array of driver-specific cache invalidation data.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjSubah}(h]h ]h"]h$]h&]uh1jV hjSubeh}(h]h ]h"]h$]h&]uh1j4 hjShMhj0Subj5 )}(h``data_type`` One of enum iommu_hwpt_invalidate_data_type, defining the data type of all the entries in the invalidation request array. It should be a type supported by the hwpt pointed by **hwpt_id**. h](j; )}(h ``data_type``h]jA )}(hjSh]h data_type}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjSubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjSubjW )}(hhh]h)}(hOne of enum iommu_hwpt_invalidate_data_type, defining the data type of all the entries in the invalidation request array. It should be a type supported by the hwpt pointed by **hwpt_id**.h](hOne of enum iommu_hwpt_invalidate_data_type, defining the data type of all the entries in the invalidation request array. It should be a type supported by the hwpt pointed by }(hjShhhNhNubj>)}(h **hwpt_id**h]hhwpt_id}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjSubh.}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjSubah}(h]h ]h"]h$]h&]uh1jV hjSubeh}(h]h ]h"]h$]h&]uh1j4 hjShMhj0Subj5 )}(hH``entry_len`` Length (in bytes) of a request entry in the request array h](j; )}(h ``entry_len``h]jA )}(hj1Th]h entry_len}(hj3ThhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj/Tubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj+TubjW )}(hhh]h)}(h9Length (in bytes) of a request entry in the request arrayh]h9Length (in bytes) of a request entry in the request array}(hjJThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFThMhjGTubah}(h]h ]h"]h$]h&]uh1jV hj+Tubeh}(h]h ]h"]h$]h&]uh1j4 hjFThMhj0Subj5 )}(h``entry_num`` Input the number of cache invalidation requests in the array. Output the number of requests successfully handled by kernel. h](j; )}(h ``entry_num``h]jA )}(hjjTh]h entry_num}(hjlThhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjhTubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjdTubjW )}(hhh]h)}(h{Input the number of cache invalidation requests in the array. Output the number of requests successfully handled by kernel.h]h{Input the number of cache invalidation requests in the array. Output the number of requests successfully handled by kernel.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjTubah}(h]h ]h"]h$]h&]uh1jV hjdTubeh}(h]h ]h"]h$]h&]uh1j4 hjThMhj0Subj5 )}(h``__reserved`` Must be 0.h](j; )}(h``__reserved``h]jA )}(hjTh]h __reserved}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjTubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjTubjW )}(hhh]h)}(h Must be 0.h]h Must be 0.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjTubah}(h]h ]h"]h$]h&]uh1jV hjTubeh}(h]h ]h"]h$]h&]uh1j4 hjThMhj0Subeh}(h]h ]h"]h$]h&]uh1j/ hjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjTubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hX0Invalidate iommu cache for user-managed page table or vIOMMU. Modifications on a user-managed page table should be followed by this operation, if a HWPT is passed in via **hwpt_id**. Other caches, such as device cache or descriptor cache can be flushed if a vIOMMU is passed in via the **hwpt_id** field.h](hInvalidate iommu cache for user-managed page table or vIOMMU. Modifications on a user-managed page table should be followed by this operation, if a HWPT is passed in via }(hjThhhNhNubj>)}(h **hwpt_id**h]hhwpt_id}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjTubhi. Other caches, such as device cache or descriptor cache can be flushed if a vIOMMU is passed in via the }(hjThhhNhNubj>)}(h **hwpt_id**h]hhwpt_id}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjTubh field.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hEach ioctl can support one or more cache invalidation requests in the array that has a total size of **entry_len** * **entry_num**.h](heEach ioctl can support one or more cache invalidation requests in the array that has a total size of }(hj0UhhhNhNubj>)}(h **entry_len**h]h entry_len}(hj8UhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj0Uubh * }(hj0UhhhNhNubj>)}(h **entry_num**h]h entry_num}(hjJUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj0Uubh.}(hj0UhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hAn empty invalidation request array by setting **entry_num**==0 is allowed, and **entry_len** and **data_uptr** would be ignored in this case. This can be used to check if the given **data_type** is supported or not by kernel.h](h/An empty invalidation request array by setting }(hjcUhhhNhNubj>)}(h.**entry_num**==0 is allowed, and **entry_len**h]h*entry_num**==0 is allowed, and **entry_len}(hjkUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjcUubh and }(hjcUhhhNhNubj>)}(h **data_uptr**h]h data_uptr}(hj}UhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjcUubhG would be ignored in this case. This can be used to check if the given }(hjcUhhhNhNubj>)}(h **data_type**h]h data_type}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjcUubh is supported or not by kernel.}(hjcUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS!iommu_hwpt_pgfault_flags (C enum)c.iommu_hwpt_pgfault_flagshNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_pgfault_flagsh]jc)}(henum iommu_hwpt_pgfault_flagsh](ji)}(hjh]henum}(hjUhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjUhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjUhhhjUhMubj)}(hiommu_hwpt_pgfault_flagsh]j)}(hjUh]hiommu_hwpt_pgfault_flags}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](jjeh"]h$]h&]hhuh1jhjUhhhjUhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjUhhhjUhMubah}(h]jUah ](jjeh"]h$]h&]jj)jhuh1j\hjUhMhjUhhubj)}(hhh]h)}(h#flags for struct iommu_hwpt_pgfaulth]h#flags for struct iommu_hwpt_pgfault}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjVhhubah}(h]h ]h"]h$]h&]uh1jhjUhhhjUhMubeh}(h]h ](jenumeh"]h$]h&]jjjjVjjVjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_PGFAULT_FLAGS_PASID_VALID`` The pasid field of the fault data is valid. ``IOMMU_PGFAULT_FLAGS_LAST_PAGE`` It's the last fault of a fault group.h](h)}(h **Constants**h]j>)}(hj%Vh]h Constants}(hj'VhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj#Vubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjVubj0 )}(hhh](j5 )}(hP``IOMMU_PGFAULT_FLAGS_PASID_VALID`` The pasid field of the fault data is valid. h](j; )}(h#``IOMMU_PGFAULT_FLAGS_PASID_VALID``h]jA )}(hjDVh]hIOMMU_PGFAULT_FLAGS_PASID_VALID}(hjFVhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjBVubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj>VubjW )}(hhh]h)}(h+The pasid field of the fault data is valid.h]h+The pasid field of the fault data is valid.}(hj]VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjZVubah}(h]h ]h"]h$]h&]uh1jV hj>Vubeh}(h]h ]h"]h$]h&]uh1j4 hjYVhMhj;Vubj5 )}(hG``IOMMU_PGFAULT_FLAGS_LAST_PAGE`` It's the last fault of a fault group.h](j; )}(h!``IOMMU_PGFAULT_FLAGS_LAST_PAGE``h]jA )}(hj~Vh]hIOMMU_PGFAULT_FLAGS_LAST_PAGE}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj|Vubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjxVubjW )}(hhh]h)}(h%It's the last fault of a fault group.h]h'It’s the last fault of a fault group.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjVubah}(h]h ]h"]h$]h&]uh1jV hjxVubeh}(h]h ]h"]h$]h&]uh1j4 hjVhMhj;Vubeh}(h]h ]h"]h$]h&]uh1j/ hjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommu_hwpt_pgfault_perm (C enum)c.iommu_hwpt_pgfault_permhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_pgfault_permh]jc)}(henum iommu_hwpt_pgfault_permh](ji)}(hjh]henum}(hjVhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjVhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjVhhhjVhMubj)}(hiommu_hwpt_pgfault_permh]j)}(hjVh]hiommu_hwpt_pgfault_perm}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]hhuh1jhjVhhhjVhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjVhhhjVhMubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1j\hjVhMhjVhhubj)}(hhh]h)}(h'perm bits for struct iommu_hwpt_pgfaulth]h'perm bits for struct iommu_hwpt_pgfault}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjWhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjVhMubeh}(h]h ](jenumeh"]h$]h&]jjjj2Wjj2Wjjjuh1jWhhhjhj8hNubj)}(hX**Constants** ``IOMMU_PGFAULT_PERM_READ`` request for read permission ``IOMMU_PGFAULT_PERM_WRITE`` request for write permission ``IOMMU_PGFAULT_PERM_EXEC`` (PCIE 10.4.1) request with a PASID that has the Execute Requested bit set in PASID TLP Prefix. ``IOMMU_PGFAULT_PERM_PRIV`` (PCIE 10.4.1) request with a PASID that has the Privileged Mode Requested bit set in PASID TLP Prefix.h](h)}(h **Constants**h]j>)}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj:Wubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj6Wubj0 )}(hhh](j5 )}(h8``IOMMU_PGFAULT_PERM_READ`` request for read permission h](j; )}(h``IOMMU_PGFAULT_PERM_READ``h]jA )}(hj[Wh]hIOMMU_PGFAULT_PERM_READ}(hj]WhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYWubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjUWubjW )}(hhh]h)}(hrequest for read permissionh]hrequest for read permission}(hjtWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpWhMhjqWubah}(h]h ]h"]h$]h&]uh1jV hjUWubeh}(h]h ]h"]h$]h&]uh1j4 hjpWhMhjRWubj5 )}(h:``IOMMU_PGFAULT_PERM_WRITE`` request for write permission h](j; )}(h``IOMMU_PGFAULT_PERM_WRITE``h]jA )}(hjWh]hIOMMU_PGFAULT_PERM_WRITE}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjWubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjWubjW )}(hhh]h)}(hrequest for write permissionh]hrequest for write permission}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jV hjWubeh}(h]h ]h"]h$]h&]uh1j4 hjWhMhjRWubj5 )}(h{``IOMMU_PGFAULT_PERM_EXEC`` (PCIE 10.4.1) request with a PASID that has the Execute Requested bit set in PASID TLP Prefix. h](j; )}(h``IOMMU_PGFAULT_PERM_EXEC``h]jA )}(hjWh]hIOMMU_PGFAULT_PERM_EXEC}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjWubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjWubjW )}(hhh]h)}(h^(PCIE 10.4.1) request with a PASID that has the Execute Requested bit set in PASID TLP Prefix.h]h^(PCIE 10.4.1) request with a PASID that has the Execute Requested bit set in PASID TLP Prefix.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjWubah}(h]h ]h"]h$]h&]uh1jV hjWubeh}(h]h ]h"]h$]h&]uh1j4 hjWhMhjRWubj5 )}(h``IOMMU_PGFAULT_PERM_PRIV`` (PCIE 10.4.1) request with a PASID that has the Privileged Mode Requested bit set in PASID TLP Prefix.h](j; )}(h``IOMMU_PGFAULT_PERM_PRIV``h]jA )}(hjXh]hIOMMU_PGFAULT_PERM_PRIV}(hj XhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjXubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXubjW )}(hhh]h)}(hf(PCIE 10.4.1) request with a PASID that has the Privileged Mode Requested bit set in PASID TLP Prefix.h]hf(PCIE 10.4.1) request with a PASID that has the Privileged Mode Requested bit set in PASID TLP Prefix.}(hj XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXubah}(h]h ]h"]h$]h&]uh1jV hjXubeh}(h]h ]h"]h$]h&]uh1j4 hjXhMhjRWubeh}(h]h ]h"]h$]h&]uh1j/ hj6Wubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hwpt_pgfault (C struct)c.iommu_hwpt_pgfaulthNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_pgfaulth]jc)}(hstruct iommu_hwpt_pgfaulth](ji)}(hjlh]hstruct}(hjaXhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj]Xhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjoXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj]XhhhjnXhMubj)}(hiommu_hwpt_pgfaulth]j)}(hj[Xh]hiommu_hwpt_pgfault}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Xubah}(h]h ](jjeh"]h$]h&]hhuh1jhj]XhhhjnXhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjYXhhhjnXhMubah}(h]jTXah ](jjeh"]h$]h&]jj)jhuh1j\hjnXhMhjVXhhubj)}(hhh]h)}(hiommu page fault datah]hiommu page fault data}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXhhubah}(h]h ]h"]h$]h&]uh1jhjVXhhhjnXhMubeh}(h]h ](jstructeh"]h$]h&]jjjjXjjXjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hwpt_pgfault { __u32 flags; __u32 dev_id; __u32 pasid; __u32 grpid; __u32 perm; __u32 __reserved; __aligned_u64 addr; __u32 length; __u32 cookie; }; **Members** ``flags`` Combination of enum iommu_hwpt_pgfault_flags ``dev_id`` id of the originated device ``pasid`` Process Address Space ID ``grpid`` Page Request Group Index ``perm`` Combination of enum iommu_hwpt_pgfault_perm ``__reserved`` Must be 0. ``addr`` Fault address ``length`` a hint of how much data the requestor is expecting to fetch. For example, if the PRI initiator knows it is going to do a 10MB transfer, it could fill in 10MB and the OS could pre-fault in 10MB of IOVA. It's default to 0 if there's no such hint. ``cookie`` kernel-managed cookie identifying a group of fault messages. The cookie number encoded in the last page fault of the group should be echoed back in the response message.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjXubh:}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXubj)}(hstruct iommu_hwpt_pgfault { __u32 flags; __u32 dev_id; __u32 pasid; __u32 grpid; __u32 perm; __u32 __reserved; __aligned_u64 addr; __u32 length; __u32 cookie; };h]hstruct iommu_hwpt_pgfault { __u32 flags; __u32 dev_id; __u32 pasid; __u32 grpid; __u32 perm; __u32 __reserved; __aligned_u64 addr; __u32 length; __u32 cookie; };}hjXsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXubh)}(h **Members**h]j>)}(hjXh]hMembers}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjXubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjXubj0 )}(hhh](j5 )}(h7``flags`` Combination of enum iommu_hwpt_pgfault_flags h](j; )}(h ``flags``h]jA )}(hjYh]hflags}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj YubjW )}(hhh]h)}(h,Combination of enum iommu_hwpt_pgfault_flagsh]h,Combination of enum iommu_hwpt_pgfault_flags}(hj)YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%YhMhj&Yubah}(h]h ]h"]h$]h&]uh1jV hj Yubeh}(h]h ]h"]h$]h&]uh1j4 hj%YhMhjYubj5 )}(h'``dev_id`` id of the originated device h](j; )}(h ``dev_id``h]jA )}(hjIYh]hdev_id}(hjKYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjGYubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjCYubjW )}(hhh]h)}(hid of the originated deviceh]hid of the originated device}(hjbYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^YhMhj_Yubah}(h]h ]h"]h$]h&]uh1jV hjCYubeh}(h]h ]h"]h$]h&]uh1j4 hj^YhMhjYubj5 )}(h#``pasid`` Process Address Space ID h](j; )}(h ``pasid``h]jA )}(hjYh]hpasid}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj|YubjW )}(hhh]h)}(hProcess Address Space IDh]hProcess Address Space ID}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jV hj|Yubeh}(h]h ]h"]h$]h&]uh1j4 hjYhMhjYubj5 )}(h#``grpid`` Page Request Group Index h](j; )}(h ``grpid``h]jA )}(hjYh]hgrpid}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjYubjW )}(hhh]h)}(hPage Request Group Indexh]hPage Request Group Index}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jV hjYubeh}(h]h ]h"]h$]h&]uh1j4 hjYhMhjYubj5 )}(h5``perm`` Combination of enum iommu_hwpt_pgfault_perm h](j; )}(h``perm``h]jA )}(hjYh]hperm}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjYubjW )}(hhh]h)}(h+Combination of enum iommu_hwpt_pgfault_permh]h+Combination of enum iommu_hwpt_pgfault_perm}(hj ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ZhMhj Zubah}(h]h ]h"]h$]h&]uh1jV hjYubeh}(h]h ]h"]h$]h&]uh1j4 hj ZhMhjYubj5 )}(h``__reserved`` Must be 0. h](j; )}(h``__reserved``h]jA )}(hj-Zh]h __reserved}(hj/ZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj+Zubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj'ZubjW )}(hhh]h)}(h Must be 0.h]h Must be 0.}(hjFZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBZhMhjCZubah}(h]h ]h"]h$]h&]uh1jV hj'Zubeh}(h]h ]h"]h$]h&]uh1j4 hjBZhMhjYubj5 )}(h``addr`` Fault address h](j; )}(h``addr``h]jA )}(hjfZh]haddr}(hjhZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjdZubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj`ZubjW )}(hhh]h)}(h Fault addressh]h Fault address}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{ZhMhj|Zubah}(h]h ]h"]h$]h&]uh1jV hj`Zubeh}(h]h ]h"]h$]h&]uh1j4 hj{ZhMhjYubj5 )}(hX``length`` a hint of how much data the requestor is expecting to fetch. For example, if the PRI initiator knows it is going to do a 10MB transfer, it could fill in 10MB and the OS could pre-fault in 10MB of IOVA. It's default to 0 if there's no such hint. h](j; )}(h ``length``h]jA )}(hjZh]hlength}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjZubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjZubjW )}(hhh]h)}(ha hint of how much data the requestor is expecting to fetch. For example, if the PRI initiator knows it is going to do a 10MB transfer, it could fill in 10MB and the OS could pre-fault in 10MB of IOVA. It's default to 0 if there's no such hint.h]ha hint of how much data the requestor is expecting to fetch. For example, if the PRI initiator knows it is going to do a 10MB transfer, it could fill in 10MB and the OS could pre-fault in 10MB of IOVA. It’s default to 0 if there’s no such hint.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjZubah}(h]h ]h"]h$]h&]uh1jV hjZubeh}(h]h ]h"]h$]h&]uh1j4 hjZhM hjYubj5 )}(h``cookie`` kernel-managed cookie identifying a group of fault messages. The cookie number encoded in the last page fault of the group should be echoed back in the response message.h](j; )}(h ``cookie``h]jA )}(hjZh]hcookie}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjZubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjZubjW )}(hhh]h)}(hkernel-managed cookie identifying a group of fault messages. The cookie number encoded in the last page fault of the group should be echoed back in the response message.h]hkernel-managed cookie identifying a group of fault messages. The cookie number encoded in the last page fault of the group should be echoed back in the response message.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjZubah}(h]h ]h"]h$]h&]uh1jV hjZubeh}(h]h ]h"]h$]h&]uh1j4 hjZhM hjYubeh}(h]h ]h"]h$]h&]uh1j/ hjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS#iommufd_page_response_code (C enum)c.iommufd_page_response_codehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_page_response_codeh]jc)}(henum iommufd_page_response_codeh](ji)}(hjh]henum}(hj3[hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj/[hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjA[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj/[hhhj@[hMubj)}(hiommufd_page_response_codeh]j)}(hj-[h]hiommufd_page_response_code}(hjS[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO[ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj/[hhhj@[hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj+[hhhj@[hMubah}(h]j&[ah ](jjeh"]h$]h&]jj)jhuh1j\hj@[hMhj([hhubj)}(hhh]h)}(hReturn status of fault handlersh]hReturn status of fault handlers}(hju[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjr[hhubah}(h]h ]h"]h$]h&]uh1jhj([hhhj@[hMubeh}(h]h ](jenumeh"]h$]h&]jjjj[jj[jjjuh1jWhhhjhj8hNubj)}(hX2**Constants** ``IOMMUFD_PAGE_RESP_SUCCESS`` Fault has been handled and the page tables populated, retry the access. This is the "Success" defined in PCI 10.4.2.1. ``IOMMUFD_PAGE_RESP_INVALID`` Could not handle this fault, don't retry the access. This is the "Invalid Request" in PCI 10.4.2.1.h](h)}(h **Constants**h]j>)}(hj[h]h Constants}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj[ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hj[ubj0 )}(hhh](j5 )}(h``IOMMUFD_PAGE_RESP_SUCCESS`` Fault has been handled and the page tables populated, retry the access. This is the "Success" defined in PCI 10.4.2.1. h](j; )}(h``IOMMUFD_PAGE_RESP_SUCCESS``h]jA )}(hj[h]hIOMMUFD_PAGE_RESP_SUCCESS}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj[ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM%hj[ubjW )}(hhh]h)}(hvFault has been handled and the page tables populated, retry the access. This is the "Success" defined in PCI 10.4.2.1.h]hzFault has been handled and the page tables populated, retry the access. This is the “Success” defined in PCI 10.4.2.1.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM#hj[ubah}(h]h ]h"]h$]h&]uh1jV hj[ubeh}(h]h ]h"]h$]h&]uh1j4 hj[hM%hj[ubj5 )}(h``IOMMUFD_PAGE_RESP_INVALID`` Could not handle this fault, don't retry the access. This is the "Invalid Request" in PCI 10.4.2.1.h](j; )}(h``IOMMUFD_PAGE_RESP_INVALID``h]jA )}(hj[h]hIOMMUFD_PAGE_RESP_INVALID}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj[ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM)hj[ubjW )}(hhh]h)}(hcCould not handle this fault, don't retry the access. This is the "Invalid Request" in PCI 10.4.2.1.h]hiCould not handle this fault, don’t retry the access. This is the “Invalid Request” in PCI 10.4.2.1.}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM(hj\ubah}(h]h ]h"]h$]h&]uh1jV hj[ubeh}(h]h ]h"]h$]h&]uh1j4 hj\hM)hj[ubeh}(h]h ]h"]h$]h&]uh1j/ hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS#iommu_hwpt_page_response (C struct)c.iommu_hwpt_page_responsehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hwpt_page_responseh]jc)}(hstruct iommu_hwpt_page_responseh](ji)}(hjlh]hstruct}(hjJ\hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjF\hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM/ubj{)}(h h]h }(hjX\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjF\hhhjW\hM/ubj)}(hiommu_hwpt_page_responseh]j)}(hjD\h]hiommu_hwpt_page_response}(hjj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf\ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjF\hhhjW\hM/ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjB\hhhjW\hM/ubah}(h]j=\ah ](jjeh"]h$]h&]jj)jhuh1j\hjW\hM/hj?\hhubj)}(hhh]h)}(hIOMMU page fault responseh]hIOMMU page fault response}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM*hj\hhubah}(h]h ]h"]h$]h&]uh1jhj?\hhhjW\hM/ubeh}(h]h ](jstructeh"]h$]h&]jjjj\jj\jjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_hwpt_page_response { __u32 cookie; __u32 code; }; **Members** ``cookie`` The kernel-managed cookie reported in the fault message. ``code`` One of response code in enum iommufd_page_response_code.h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj\ubh:}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM.hj\ubj)}(hFstruct iommu_hwpt_page_response { __u32 cookie; __u32 code; };h]hFstruct iommu_hwpt_page_response { __u32 cookie; __u32 code; };}hj\sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM0hj\ubh)}(h **Members**h]j>)}(hj\h]hMembers}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj\ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM5hj\ubj0 )}(hhh](j5 )}(hD``cookie`` The kernel-managed cookie reported in the fault message. h](j; )}(h ``cookie``h]jA )}(hj\h]hcookie}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj\ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM,hj\ubjW )}(hhh]h)}(h8The kernel-managed cookie reported in the fault message.h]h8The kernel-managed cookie reported in the fault message.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hM,hj]ubah}(h]h ]h"]h$]h&]uh1jV hj\ubeh}(h]h ]h"]h$]h&]uh1j4 hj]hM,hj\ubj5 )}(hA``code`` One of response code in enum iommufd_page_response_code.h](j; )}(h``code``h]jA )}(hj2]h]hcode}(hj4]hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj0]ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM,hj,]ubjW )}(hhh]h)}(h8One of response code in enum iommufd_page_response_code.h]h8One of response code in enum iommufd_page_response_code.}(hjK]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM-hjH]ubah}(h]h ]h"]h$]h&]uh1jV hj,]ubeh}(h]h ]h"]h$]h&]uh1j4 hjG]hM,hj\ubeh}(h]h ]h"]h$]h&]uh1j/ hj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_fault_alloc (C struct)c.iommu_fault_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_fault_alloch]jc)}(hstruct iommu_fault_alloch](ji)}(hjlh]hstruct}(hj]hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj]hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM3ubj{)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj]hhhj]hM3ubj)}(hiommu_fault_alloch]j)}(hj]h]hiommu_fault_alloc}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj]hhhj]hM3ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj]hhhj]hM3ubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1j\hj]hM3hj]hhubj)}(hhh]h)}(hioctl(IOMMU_FAULT_QUEUE_ALLOC)h]hioctl(IOMMU_FAULT_QUEUE_ALLOC)}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM4hj]hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hM3ubeh}(h]h ](jstructeh"]h$]h&]jjjj]jj]jjjuh1jWhhhjhj8hNubj)}(hX5**Definition**:: struct iommu_fault_alloc { __u32 size; __u32 flags; __u32 out_fault_id; __u32 out_fault_fd; }; **Members** ``size`` sizeof(struct iommu_fault_alloc) ``flags`` Must be 0 ``out_fault_id`` The ID of the new FAULT ``out_fault_fd`` The fd of the new FAULTh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj]ubh:}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM8hj]ubj)}(hnstruct iommu_fault_alloc { __u32 size; __u32 flags; __u32 out_fault_id; __u32 out_fault_fd; };h]hnstruct iommu_fault_alloc { __u32 size; __u32 flags; __u32 out_fault_id; __u32 out_fault_fd; };}hj ^sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM:hj]ubh)}(h **Members**h]j>)}(hj^h]hMembers}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj^ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMAhj]ubj0 )}(hhh](j5 )}(h*``size`` sizeof(struct iommu_fault_alloc) h](j; )}(h``size``h]jA )}(hj;^h]hsize}(hj=^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj9^ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM6hj5^ubjW )}(hhh]h)}(h sizeof(struct iommu_fault_alloc)h]h sizeof(struct iommu_fault_alloc)}(hjT^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjP^hM6hjQ^ubah}(h]h ]h"]h$]h&]uh1jV hj5^ubeh}(h]h ]h"]h$]h&]uh1j4 hjP^hM6hj2^ub4j5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hjt^h]hflags}(hjv^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjr^ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM7hjn^ubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM7hj^ubah}(h]h ]h"]h$]h&]uh1jV hjn^ubeh}(h]h ]h"]h$]h&]uh1j4 hj^hM7hj2^ubj5 )}(h)``out_fault_id`` The ID of the new FAULT h](j; )}(h``out_fault_id``h]jA )}(hj^h]h out_fault_id}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj^ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM8hj^ubjW )}(hhh]h)}(hThe ID of the new FAULTh]hThe ID of the new FAULT}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM8hj^ubah}(h]h ]h"]h$]h&]uh1jV hj^ubeh}(h]h ]h"]h$]h&]uh1j4 hj^hM8hj2^ubj5 )}(h(``out_fault_fd`` The fd of the new FAULTh](j; )}(h``out_fault_fd``h]jA )}(hj^h]h out_fault_fd}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj^ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM8hj^ubjW )}(hhh]h)}(hThe fd of the new FAULTh]hThe fd of the new FAULT}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM9hj^ubah}(h]h ]h"]h$]h&]uh1jV hj^ubeh}(h]h ]h"]h$]h&]uh1j4 hj^hM8hj2^ubeh}(h]h ]h"]h$]h&]uh1j/ hj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj)_h]h Description}(hj+_hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj'_ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM<hjhhubh)}(h,Explicitly allocate a fault handling object.h]h,Explicitly allocate a fault handling object.}(hj?_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM9hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_viommu_type (C enum)c.iommu_viommu_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_viommu_typeh]jc)}(henum iommu_viommu_typeh](ji)}(hjh]henum}(hjg_hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjc_hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM>ubj{)}(h h]h }(hju_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjc_hhhjt_hM>ubj)}(hiommu_viommu_typeh]j)}(hja_h]hiommu_viommu_type}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjc_hhhjt_hM>ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj__hhhjt_hM>ubah}(h]jZ_ah ](jjeh"]h$]h&]jj)jhuh1j\hjt_hM>hj\_hhubj)}(hhh]h)}(hVirtual IOMMU Typeh]hVirtual IOMMU Type}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMEhj_hhubah}(h]h ]h"]h$]h&]uh1jhj\_hhhjt_hM>ubeh}(h]h ](jenumeh"]h$]h&]jjjj_jj_jjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_VIOMMU_TYPE_DEFAULT`` Reserved for future use ``IOMMU_VIOMMU_TYPE_ARM_SMMUV3`` ARM SMMUv3 driver specific type ``IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) enabled ARM SMMUv3 typeh](h)}(h **Constants**h]j>)}(hj_h]h Constants}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj_ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMIhj_ubj0 )}(hhh](j5 )}(h6``IOMMU_VIOMMU_TYPE_DEFAULT`` Reserved for future use h](j; )}(h``IOMMU_VIOMMU_TYPE_DEFAULT``h]jA )}(hj_h]hIOMMU_VIOMMU_TYPE_DEFAULT}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj_ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMLhj_ubjW )}(hhh]h)}(hReserved for future useh]hReserved for future use}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMLhj`ubah}(h]h ]h"]h$]h&]uh1jV hj_ubeh}(h]h ]h"]h$]h&]uh1j4 hj_hMLhj_ubj5 )}(hA``IOMMU_VIOMMU_TYPE_ARM_SMMUV3`` ARM SMMUv3 driver specific type h](j; )}(h ``IOMMU_VIOMMU_TYPE_ARM_SMMUV3``h]jA )}(hj#`h]hIOMMU_VIOMMU_TYPE_ARM_SMMUV3}(hj%`hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj!`ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMOhj`ubjW )}(hhh]h)}(hARM SMMUv3 driver specific typeh]hARM SMMUv3 driver specific type}(hj<`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8`hMOhj9`ubah}(h]h ]h"]h$]h&]uh1jV hj`ubeh}(h]h ]h"]h$]h&]uh1j4 hj8`hMOhj_ubj5 )}(hm``IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) enabled ARM SMMUv3 typeh](j; )}(h$``IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV``h]jA )}(hj\`h]h IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV}(hj^`hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjZ`ubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMRhjV`ubjW )}(hhh]h)}(hHNVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) enabled ARM SMMUv3 typeh]hHNVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) enabled ARM SMMUv3 type}(hju`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq`hMRhjr`ubah}(h]h ]h"]h$]h&]uh1jV hjV`ubeh}(h]h ]h"]h$]h&]uh1j4 hjq`hMRhj_ubeh}(h]h ]h"]h$]h&]uh1j/ hj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS&iommu_viommu_tegra241_cmdqv (C struct)c.iommu_viommu_tegra241_cmdqvhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_viommu_tegra241_cmdqvh]jc)}(h"struct iommu_viommu_tegra241_cmdqvh](ji)}(hjlh]hstruct}(hj`hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj`hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMXubj{)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj`hhhj`hMXubj)}(hiommu_viommu_tegra241_cmdqvh]j)}(hj`h]hiommu_viommu_tegra241_cmdqv}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj`hhhj`hMXubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj`hhhj`hMXubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1j\hj`hMXhj`hhubj)}(hhh]h)}(hJNVIDIA Tegra241 CMDQV Virtual Interface (IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV)h]hJNVIDIA Tegra241 CMDQV Virtual Interface (IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV)}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMWhj`hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhj`hMXubeh}(h]h ](jstructeh"]h$]h&]jjjjajjajjjuh1jWhhhjhj8hNubj)}(hX(**Definition**:: struct iommu_viommu_tegra241_cmdqv { __aligned_u64 out_vintf_mmap_offset; __aligned_u64 out_vintf_mmap_length; }; **Members** ``out_vintf_mmap_offset`` mmap offset argument for VINTF's page0 ``out_vintf_mmap_length`` mmap length argument for VINTF's page0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaubh:}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjaubj)}(hystruct iommu_viommu_tegra241_cmdqv { __aligned_u64 out_vintf_mmap_offset; __aligned_u64 out_vintf_mmap_length; };h]hystruct iommu_viommu_tegra241_cmdqv { __aligned_u64 out_vintf_mmap_offset; __aligned_u64 out_vintf_mmap_length; };}hj4asbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM]hjaubh)}(h **Members**h]j>)}(hjEah]hMembers}(hjGahhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjCaubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMbhjaubj0 )}(hhh](j5 )}(hA``out_vintf_mmap_offset`` mmap offset argument for VINTF's page0 h](j; )}(h``out_vintf_mmap_offset``h]jA )}(hjdah]hout_vintf_mmap_offset}(hjfahhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjbaubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMZhj^aubjW )}(hhh]h)}(h&mmap offset argument for VINTF's page0h]h(mmap offset argument for VINTF’s page0}(hj}ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyahMZhjzaubah}(h]h ]h"]h$]h&]uh1jV hj^aubeh}(h]h ]h"]h$]h&]uh1j4 hjyahMZhj[aubj5 )}(h@``out_vintf_mmap_length`` mmap length argument for VINTF's page0h](j; )}(h``out_vintf_mmap_length``h]jA )}(hjah]hout_vintf_mmap_length}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjaubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMZhjaubjW )}(hhh]h)}(h&mmap length argument for VINTF's page0h]h(mmap length argument for VINTF’s page0}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjaubah}(h]h ]h"]h$]h&]uh1jV hjaubeh}(h]h ]h"]h$]h&]uh1j4 hjahMZhj[aubeh}(h]h ]h"]h$]h&]uh1j/ hjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM^hjhhubh)}(hX5Both **out_vintf_mmap_offset** and **out_vintf_mmap_length** are reported by kernel for user space to mmap the VINTF page0 from the host physical address space to the guest physical address space so that a guest kernel can directly R/W access to the VINTF page0 in order to control its virtual command queues.h](hBoth }(hjahhhNhNubj>)}(h**out_vintf_mmap_offset**h]hout_vintf_mmap_offset}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaubh and }(hjahhhNhNubj>)}(h**out_vintf_mmap_length**h]hout_vintf_mmap_length}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjaubh are reported by kernel for user space to mmap the VINTF page0 from the host physical address space to the guest physical address space so that a guest kernel can directly R/W access to the VINTF page0 in order to control its virtual command queues.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_viommu_alloc (C struct)c.iommu_viommu_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_viommu_alloch]jc)}(hstruct iommu_viommu_alloch](ji)}(hjlh]hstruct}(hjBbhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj>bhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMcubj{)}(h h]h }(hjPbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj>bhhhjObhMcubj)}(hiommu_viommu_alloch]j)}(hjbhhhjObhMcubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj:bhhhjObhMcubah}(h]j5bah ](jjeh"]h$]h&]jj)jhuh1j\hjObhMchj7bhhubj)}(hhh]h)}(hioctl(IOMMU_VIOMMU_ALLOC)h]hioctl(IOMMU_VIOMMU_ALLOC)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMghjbhhubah}(h]h ]h"]h$]h&]uh1jhj7bhhhjObhMcubeh}(h]h ](jstructeh"]h$]h&]jjjjbjjbjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; __u32 data_len; __u32 __reserved; __aligned_u64 data_uptr; }; **Members** ``size`` sizeof(struct iommu_viommu_alloc) ``flags`` Must be 0 ``type`` Type of the virtual IOMMU. Must be defined in enum iommu_viommu_type ``dev_id`` The device's physical IOMMU will be used to back the virtual IOMMU ``hwpt_id`` ID of a nesting parent HWPT to associate to ``out_viommu_id`` Output virtual IOMMU ID for the allocated object ``data_len`` Length of the type specific data ``__reserved`` Must be 0 ``data_uptr`` User pointer to a driver-specific virtual IOMMU datah](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjbubh:}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMkhjbubj)}(hstruct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; __u32 data_len; __u32 __reserved; __aligned_u64 data_uptr; };h]hstruct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; __u32 data_len; __u32 __reserved; __aligned_u64 data_uptr; };}hjbsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhjbubh)}(h **Members**h]j>)}(hjbh]hMembers}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjbubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMyhjbubj0 )}(hhh](j5 )}(h+``size`` sizeof(struct iommu_viommu_alloc) h](j; )}(h``size``h]jA )}(hjbh]hsize}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjbubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMihjbubjW )}(hhh]h)}(h!sizeof(struct iommu_viommu_alloc)h]h!sizeof(struct iommu_viommu_alloc)}(hj chhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMihjcubah}(h]h ]h"]h$]h&]uh1jV hjbubeh}(h]h ]h"]h$]h&]uh1j4 hjchMihjbubj5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hj*ch]hflags}(hj,chhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj(cubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMjhj$cubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjCchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?chMjhj@cubah}(h]h ]h"]h$]h&]uh1jV hj$cubeh}(h]h ]h"]h$]h&]uh1j4 hj?chMjhjbubj5 )}(hN``type`` Type of the virtual IOMMU. Must be defined in enum iommu_viommu_type h](j; )}(h``type``h]jA )}(hjcch]htype}(hjechhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjacubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMkhj]cubjW )}(hhh]h)}(hDType of the virtual IOMMU. Must be defined in enum iommu_viommu_typeh]hDType of the virtual IOMMU. Must be defined in enum iommu_viommu_type}(hj|chhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxchMkhjycubah}(h]h ]h"]h$]h&]uh1jV hj]cubeh}(h]h ]h"]h$]h&]uh1j4 hjxchMkhjbubj5 )}(hN``dev_id`` The device's physical IOMMU will be used to back the virtual IOMMU h](j; )}(h ``dev_id``h]jA )}(hjch]hdev_id}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjcubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMlhjcubjW )}(hhh]h)}(hBThe device's physical IOMMU will be used to back the virtual IOMMUh]hDThe device’s physical IOMMU will be used to back the virtual IOMMU}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMlhjcubah}(h]h ]h"]h$]h&]uh1jV hjcubeh}(h]h ]h"]h$]h&]uh1j4 hjchMlhjbubj5 )}(h8``hwpt_id`` ID of a nesting parent HWPT to associate to h](j; )}(h ``hwpt_id``h]jA )}(hjch]hhwpt_id}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjcubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMmhjcubjW )}(hhh]h)}(h+ID of a nesting parent HWPT to associate toh]h+ID of a nesting parent HWPT to associate to}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMmhjcubah}(h]h ]h"]h$]h&]uh1jV hjcubeh}(h]h ]h"]h$]h&]uh1j4 hjchMmhjbubj5 )}(hC``out_viommu_id`` Output virtual IOMMU ID for the allocated object h](j; )}(h``out_viommu_id``h]jA )}(hjdh]h out_viommu_id}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj dubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMnhjdubjW )}(hhh]h)}(h0Output virtual IOMMU ID for the allocated objecth]h0Output virtual IOMMU ID for the allocated object}(hj'dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#dhMnhj$dubah}(h]h ]h"]h$]h&]uh1jV hjdubeh}(h]h ]h"]h$]h&]uh1j4 hj#dhMnhjbubj5 )}(h.``data_len`` Length of the type specific data h](j; )}(h ``data_len``h]jA )}(hjGdh]hdata_len}(hjIdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjEdubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMohjAdubjW )}(hhh]h)}(h Length of the type specific datah]h Length of the type specific data}(hj`dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\dhMohj]dubah}(h]h ]h"]h$]h&]uh1jV hjAdubeh}(h]h ]h"]h$]h&]uh1j4 hj\dhMohjbubj5 )}(h``__reserved`` Must be 0 h](j; )}(h``__reserved``h]jA )}(hjdh]h __reserved}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj~dubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMphjzdubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMphjdubah}(h]h ]h"]h$]h&]uh1jV hjzdubeh}(h]h ]h"]h$]h&]uh1j4 hjdhMphjbubj5 )}(hB``data_uptr`` User pointer to a driver-specific virtual IOMMU datah](j; )}(h ``data_uptr``h]jA )}(hjdh]h data_uptr}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjdubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMphjdubjW )}(hhh]h)}(h4User pointer to a driver-specific virtual IOMMU datah]h4User pointer to a driver-specific virtual IOMMU data}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMqhjdubah}(h]h ]h"]h$]h&]uh1jV hjdubeh}(h]h ]h"]h$]h&]uh1j4 hjdhMphjbubeh}(h]h ]h"]h$]h&]uh1j/ hjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjdubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMthjhhubh)}(hXAllocate a virtual IOMMU object, representing the underlying physical IOMMU's virtualization support that is a security-isolated slice of the real IOMMU HW that is unique to a specific VM. Operations global to the IOMMU are connected to the vIOMMU, such as: - Security namespace for guest owned ID, e.g. guest-controlled cache tags - Non-device-affiliated event reporting, e.g. invalidation queue errors - Access to a sharable nesting parent pagetable across physical IOMMUs - Virtualization of various platforms IDs, e.g. RIDs and others - Delivery of paravirtualized invalidation - Direct assigned invalidation queues - Direct assigned interruptsh]hXAllocate a virtual IOMMU object, representing the underlying physical IOMMU’s virtualization support that is a security-isolated slice of the real IOMMU HW that is unique to a specific VM. Operations global to the IOMMU are connected to the vIOMMU, such as: - Security namespace for guest owned ID, e.g. guest-controlled cache tags - Non-device-affiliated event reporting, e.g. invalidation queue errors - Access to a sharable nesting parent pagetable across physical IOMMUs - Virtualization of various platforms IDs, e.g. RIDs and others - Delivery of paravirtualized invalidation - Direct assigned invalidation queues - Direct assigned interrupts}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMqhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_vdevice_alloc (C struct)c.iommu_vdevice_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_vdevice_alloch]jc)}(hstruct iommu_vdevice_alloch](ji)}(hjlh]hstruct}(hj:ehhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj6ehhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjHehhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj6ehhhjGehMubj)}(hiommu_vdevice_alloch]j)}(hj4eh]hiommu_vdevice_alloc}(hjZehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVeubah}(h]h ](jjeh"]h$]h&]hhuh1jhj6ehhhjGehMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj2ehhhjGehMubah}(h]j-eah ](jjeh"]h$]h&]jj)jhuh1j\hjGehMhj/ehhubj)}(hhh]h)}(hioctl(IOMMU_VDEVICE_ALLOC)h]hioctl(IOMMU_VDEVICE_ALLOC)}(hj|ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjyehhubah}(h]h ]h"]h$]h&]uh1jhj/ehhhjGehMubeh}(h]h ](jstructeh"]h$]h&]jjjjejjejjjuh1jWhhhjhj8hNubj)}(hX8**Definition**:: struct iommu_vdevice_alloc { __u32 size; __u32 viommu_id; __u32 dev_id; __u32 out_vdevice_id; __aligned_u64 virt_id; }; **Members** ``size`` sizeof(struct iommu_vdevice_alloc) ``viommu_id`` vIOMMU ID to associate with the virtual device ``dev_id`` The physical device to allocate a virtual instance on the vIOMMU ``out_vdevice_id`` Object handle for the vDevice. Pass to IOMMU_DESTORY ``virt_id`` Virtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-dh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjeubh:}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjeubj)}(hstruct iommu_vdevice_alloc { __u32 size; __u32 viommu_id; __u32 dev_id; __u32 out_vdevice_id; __aligned_u64 virt_id; };h]hstruct iommu_vdevice_alloc { __u32 size; __u32 viommu_id; __u32 dev_id; __u32 out_vdevice_id; __aligned_u64 virt_id; };}hjesbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjeubh)}(h **Members**h]j>)}(hjeh]hMembers}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjeubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjeubj0 )}(hhh](j5 )}(h,``size`` sizeof(struct iommu_vdevice_alloc) h](j; )}(h``size``h]jA )}(hjeh]hsize}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjeubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjeubjW )}(hhh]h)}(h"sizeof(struct iommu_vdevice_alloc)h]h"sizeof(struct iommu_vdevice_alloc)}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjeubah}(h]h ]h"]h$]h&]uh1jV hjeubeh}(h]h ]h"]h$]h&]uh1j4 hjehMhjeubj5 )}(h=``viommu_id`` vIOMMU ID to associate with the virtual device h](j; )}(h ``viommu_id``h]jA )}(hj"fh]h viommu_id}(hj$fhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj fubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjfubjW )}(hhh]h)}(h.vIOMMU ID to associate with the virtual deviceh]h.vIOMMU ID to associate with the virtual device}(hj;fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7fhMhj8fubah}(h]h ]h"]h$]h&]uh1jV hjfubeh}(h]h ]h"]h$]h&]uh1j4 hj7fhMhjeubj5 )}(hL``dev_id`` The physical device to allocate a virtual instance on the vIOMMU h](j; )}(h ``dev_id``h]jA )}(hj[fh]hdev_id}(hj]fhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjYfubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjUfubjW )}(hhh]h)}(h@The physical device to allocate a virtual instance on the vIOMMUh]h@The physical device to allocate a virtual instance on the vIOMMU}(hjtfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpfhMhjqfubah}(h]h ]h"]h$]h&]uh1jV hjUfubeh}(h]h ]h"]h$]h&]uh1j4 hjpfhMhjeubj5 )}(hH``out_vdevice_id`` Object handle for the vDevice. Pass to IOMMU_DESTORY h](j; )}(h``out_vdevice_id``h]jA )}(hjfh]hout_vdevice_id}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjfubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjfubjW )}(hhh]h)}(h4Object handle for the vDevice. Pass to IOMMU_DESTORYh]h4Object handle for the vDevice. Pass to IOMMU_DESTORY}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1jV hjfubeh}(h]h ]h"]h$]h&]uh1j4 hjfhMhjeubj5 )}(hq``virt_id`` Virtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-dh](j; )}(h ``virt_id``h]jA )}(hjfh]hvirt_id}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjfubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjfubjW )}(hhh]h)}(heVirtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-dh]heVirtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of Intel VT-d}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1jV hjfubeh}(h]h ]h"]h$]h&]uh1j4 hjfhMhjeubeh}(h]h ]h"]h$]h&]uh1j/ hjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj gubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXAllocate a virtual device instance (for a physical device) against a vIOMMU. This instance holds the device's information (related to its vIOMMU) in a VM. User should use IOMMU_DESTROY to destroy the virtual device before destroying the physical device (by closing vfio_cdev fd). Otherwise the virtual device would be forcibly destroyed on physical device destruction, its vdevice_id would be permanently leaked (unremovable & unreusable) until iommu fd closed.h]hXAllocate a virtual device instance (for a physical device) against a vIOMMU. This instance holds the device’s information (related to its vIOMMU) in a VM. User should use IOMMU_DESTROY to destroy the virtual device before destroying the physical device (by closing vfio_cdev fd). Otherwise the virtual device would be forcibly destroyed on physical device destruction, its vdevice_id would be permanently leaked (unremovable & unreusable) until iommu fd closed.}(hj%ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS$iommu_ioas_change_process (C struct)c.iommu_ioas_change_processhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_ioas_change_processh]jc)}(h struct iommu_ioas_change_processh](ji)}(hjlh]hstruct}(hjMghhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjIghhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj[ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjIghhhjZghMubj)}(hiommu_ioas_change_processh]j)}(hjGgh]hiommu_ioas_change_process}(hjmghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjigubah}(h]h ](jjeh"]h$]h&]hhuh1jhjIghhhjZghMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjEghhhjZghMubah}(h]j@gah ](jjeh"]h$]h&]jj)jhuh1j\hjZghMhjBghhubj)}(hhh]h)}(hioctl(VFIO_IOAS_CHANGE_PROCESS)h]hioctl(VFIO_IOAS_CHANGE_PROCESS)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjghhubah}(h]h ]h"]h$]h&]uh1jhjBghhhjZghMubeh}(h]h ](jstructeh"]h$]h&]jjjjgjjgjjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_ioas_change_process { __u32 size; __u32 __reserved; }; **Members** ``size`` sizeof(struct iommu_ioas_change_process) ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjgubh:}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjgubj)}(hKstruct iommu_ioas_change_process { __u32 size; __u32 __reserved; };h]hKstruct iommu_ioas_change_process { __u32 size; __u32 __reserved; };}hjgsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjgubh)}(h **Members**h]j>)}(hjgh]hMembers}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjgubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjgubj0 )}(hhh](j5 )}(h2``size`` sizeof(struct iommu_ioas_change_process) h](j; )}(h``size``h]jA )}(hjgh]hsize}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjgubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjgubjW )}(hhh]h)}(h(sizeof(struct iommu_ioas_change_process)h]h(sizeof(struct iommu_ioas_change_process)}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjhubah}(h]h ]h"]h$]h&]uh1jV hjgubeh}(h]h ]h"]h$]h&]uh1j4 hjhhMhjgubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hj5hh]h __reserved}(hj7hhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj3hubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj/hubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjNhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjKhubah}(h]h ]h"]h$]h&]uh1jV hj/hubeh}(h]h ]h"]h$]h&]uh1j4 hjJhhMhjgubeh}(h]h ]h"]h$]h&]uh1j/ hjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjxhh]h Description}(hjzhhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjvhubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXThis transfers pinned memory counts for every memory map in every IOAS in the context to the current process. This only supports maps created with IOMMU_IOAS_MAP_FILE, and returns EINVAL if other maps are present. If the ioctl returns a failure status, then nothing is changed.h]hXThis transfers pinned memory counts for every memory map in every IOAS in the context to the current process. This only supports maps created with IOMMU_IOAS_MAP_FILE, and returns EINVAL if other maps are present. If the ioctl returns a failure status, then nothing is changed.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(h{This API is useful for transferring operation of a device from one process to another, such as during userland live update.h]h{This API is useful for transferring operation of a device from one process to another, such as during userland live update.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_veventq_flag (C enum)c.iommu_veventq_flaghNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_veventq_flagh]jc)}(henum iommu_veventq_flagh](ji)}(hjh]henum}(hjhhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhhjhhMubj)}(hiommu_veventq_flagh]j)}(hjhh]hiommu_veventq_flag}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhhjhhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhhjhhMubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1j\hjhhMhjhhhubj)}(hhh]h)}(h%flag for struct iommufd_vevent_headerh]h%flag for struct iommufd_vevent_header}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjihhubah}(h]h ]h"]h$]h&]uh1jhjhhhhjhhMubeh}(h]h ](jenumeh"]h$]h&]jjjjijjijjjuh1jWhhhjhj8hNubj)}(hL**Constants** ``IOMMU_VEVENTQ_FLAG_LOST_EVENTS`` vEVENTQ has lost vEVENTsh](h)}(h **Constants**h]j>)}(hj)ih]h Constants}(hj+ihhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj'iubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj#iubj0 )}(hhh]j5 )}(h;``IOMMU_VEVENTQ_FLAG_LOST_EVENTS`` vEVENTQ has lost vEVENTsh](j; )}(h"``IOMMU_VEVENTQ_FLAG_LOST_EVENTS``h]jA )}(hjHih]hIOMMU_VEVENTQ_FLAG_LOST_EVENTS}(hjJihhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjFiubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjBiubjW )}(hhh]h)}(hvEVENTQ has lost vEVENTsh]hvEVENTQ has lost vEVENTs}(hjaihhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^iubah}(h]h ]h"]h$]h&]uh1jV hjBiubeh}(h]h ]h"]h$]h&]uh1j4 hj]ihMhj?iubah}(h]h ]h"]h$]h&]uh1j/ hj#iubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommufd_vevent_header (C struct)c.iommufd_vevent_headerhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommufd_vevent_headerh]jc)}(hstruct iommufd_vevent_headerh](ji)}(hjlh]hstruct}(hjihhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjihhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjihhhjihMubj)}(hiommufd_vevent_headerh]j)}(hjih]hiommufd_vevent_header}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]hhuh1jhjihhhjihMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjihhhjihMubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1j\hjihMhjihhubj)}(hhh]h)}(h)Virtual Event Header for a vEVENTQ Statush]h)Virtual Event Header for a vEVENTQ Status}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjihhubah}(h]h ]h"]h$]h&]uh1jhjihhhjihMubeh}(h]h ](jstructeh"]h$]h&]jjjjijjijjjuh1jWhhhjhj8hNubj)}(hX)**Definition**:: struct iommufd_vevent_header { __u32 flags; __u32 sequence; }; **Members** ``flags`` Combination of enum iommu_veventq_flag ``sequence`` The sequence index of a vEVENT in the vEVENTQ, with a range of [0, INT_MAX] where the following index of INT_MAX is 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjjubh:}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjjubj)}(hFstruct iommufd_vevent_header { __u32 flags; __u32 sequence; };h]hFstruct iommufd_vevent_header { __u32 flags; __u32 sequence; };}hj!jsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjjubh)}(h **Members**h]j>)}(hj2jh]hMembers}(hj4jhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj0jubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjjubj0 )}(hhh](j5 )}(h1``flags`` Combination of enum iommu_veventq_flag h](j; )}(h ``flags``h]jA )}(hjQjh]hflags}(hjSjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjOjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjKjubjW )}(hhh]h)}(h&Combination of enum iommu_veventq_flagh]h&Combination of enum iommu_veventq_flag}(hjjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfjhMhjgjubah}(h]h ]h"]h$]h&]uh1jV hjKjubeh}(h]h ]h"]h$]h&]uh1j4 hjfjhMhjHjubj5 )}(h``sequence`` The sequence index of a vEVENT in the vEVENTQ, with a range of [0, INT_MAX] where the following index of INT_MAX is 0h](j; )}(h ``sequence``h]jA )}(hjjh]hsequence}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjjubjW )}(hhh]h)}(huThe sequence index of a vEVENT in the vEVENTQ, with a range of [0, INT_MAX] where the following index of INT_MAX is 0h]huThe sequence index of a vEVENT in the vEVENTQ, with a range of [0, INT_MAX] where the following index of INT_MAX is 0}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjjubah}(h]h ]h"]h$]h&]uh1jV hjjubeh}(h]h ]h"]h$]h&]uh1j4 hjjhMhjHjubeh}(h]h ]h"]h$]h&]uh1j/ hjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjjh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hLEach iommufd_vevent_header reports a sequence index of the following vEVENT:h]hLEach iommufd_vevent_header reports a sequence index of the following vEVENT:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjjubhtbody)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hheader0 {sequence=0}h]hheader0 {sequence=0}}(hjHkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjEkubah}(h]h ]h"]h$]h&]uh1jCkhj@kubjDk)}(hhh]h)}(hdata0h]hdata0}(hj`khhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVkhMhj]kubah}(h]h ]h"]h$]h&]uh1jCkhj@kubjDk)}(hhh]h)}(hheader1 {sequence=1}h]hheader1 {sequence=1}}(hjwkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVkhMhjtkubah}(h]h ]h"]h$]h&]uh1jCkhj@kubjDk)}(hhh]h)}(hdata1h]hdata1}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVkhMhjkubah}(h]h ]h"]h$]h&]uh1jCkhj@kubjDk)}(hhh]h)}(h...h]h...}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVkhMhjkubah}(h]h ]h"]h$]h&]uh1jCkhj@kubjDk)}(hhh]h)}(hdataNh]hdataN}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVkhMhjkubah}(h]h ]h"]h$]h&]uh1jCkhj@kubeh}(h]h ]h"]h$]h&]uh1j>khj;kubah}(h]h ]h"]h$]h&]uh1j9khjjubeh}(h]h ]h"]h$]h&]colsKuh1jjhjjubah}(h]h ]h"]h$]h&]uh1jjhjhhhj8hNubh)}(hAnd this sequence index is expected to be monotonic to the sequence index of the previous vEVENT. If two adjacent sequence indexes has a delta larger than 1, it means that delta - 1 number of vEVENTs has lost, e.g. two lost vEVENTs:h]hAnd this sequence index is expected to be monotonic to the sequence index of the previous vEVENT. If two adjacent sequence indexes has a delta larger than 1, it means that delta - 1 number of vEVENTs has lost, e.g. two lost vEVENTs:}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjj)}(hhh]jj)}(hhh](jj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjkubj:k)}(hhh]j?k)}(hhh](jDk)}(hhh]h)}(h...h]h...}(hjClhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj@lubah}(h]h ]h"]h$]h&]uh1jCkhj=lubjDk)}(hhh]h)}(hheader3 {sequence=3}h]hheader3 {sequence=3}}(hj[lhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQlhMhjXlubah}(h]h ]h"]h$]h&]uh1jCkhj=lubjDk)}(hhh]h)}(hdata3h]hdata3}(hjrlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQlhMhjolubah}(h]h ]h"]h$]h&]uh1jCkhj=lubjDk)}(hhh]h)}(hheader6 {sequence=6}h]hheader6 {sequence=6}}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQlhMhjlubah}(h]h ]h"]h$]h&]uh1jCkhj=lubjDk)}(hhh]h)}(hdata6h]hdata6}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQlhMhjlubah}(h]h ]h"]h$]h&]uh1jCkhj=lubjDk)}(hhh]h)}(h...h]h...}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQlhMhjlubah}(h]h ]h"]h$]h&]uh1jCkhj=lubeh}(h]h ]h"]h$]h&]uh1j>khj:lubah}(h]h ]h"]h$]h&]uh1j9khjkubeh}(h]h ]h"]h$]h&]colsKuh1jjhjkubah}(h]h ]h"]h$]h&]uh1jjhjhhhj8hNubh)}(hIf a vEVENT lost at the tail of the vEVENTQ and there is no following vEVENT providing the next sequence index, an IOMMU_VEVENTQ_FLAG_LOST_EVENTS header would be added to the tail, and no data would follow this header:h]hIf a vEVENT lost at the tail of the vEVENTQ and there is no following vEVENT providing the next sequence index, an IOMMU_VEVENTQ_FLAG_LOST_EVENTS header would be added to the tail, and no data would follow this header:}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjj)}(hhh]jj)}(hhh](jj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjlubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjlubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jjhjlubjj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK)uh1jjhjlubj:k)}(hhh]j?k)}(hhh](jDk)}(hhh]h)}(hhh]h}(h]h ]h"]h$]h&]hhuh1hhj'mubah}(h]h ]h"]h$]h&]uh1jCkhj$mubjDk)}(hhh]h)}(hheader3 {sequence=3}h]hheader3 {sequence=3}}(hjkhj!mubah}(h]h ]h"]h$]h&]uh1j9khjlubeh}(h]h ]h"]h$]h&]colsKuh1jjhjlubah}(h]h ]h"]h$]h&]uh1jjhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_veventq_type (C enum)c.iommu_veventq_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_veventq_typeh]jc)}(henum iommu_veventq_typeh](ji)}(hjh]henum}(hjmhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjmhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjmhhhjmhMubj)}(hiommu_veventq_typeh]j)}(hjmh]hiommu_veventq_type}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]hhuh1jhjmhhhjmhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjmhhhjmhMubah}(h]jmah ](jjeh"]h$]h&]jj)jhuh1j\hjmhMhjmhhubj)}(hhh]h)}(hVirtual Event Queue Typeh]hVirtual Event Queue Type}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjmhhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjmhMubeh}(h]h ](jenumeh"]h$]h&]jjjj njj njjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_VEVENTQ_TYPE_DEFAULT`` Reserved for future use ``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3`` ARM SMMUv3 Virtual Event Queue ``IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV Extension IRQh](h)}(h **Constants**h]j>)}(hjnh]h Constants}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjnubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjnubj0 )}(hhh](j5 )}(h7``IOMMU_VEVENTQ_TYPE_DEFAULT`` Reserved for future use h](j; )}(h``IOMMU_VEVENTQ_TYPE_DEFAULT``h]jA )}(hj4nh]hIOMMU_VEVENTQ_TYPE_DEFAULT}(hj6nhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj2nubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj.nubjW )}(hhh]h)}(hReserved for future useh]hReserved for future use}(hjMnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjInhMhjJnubah}(h]h ]h"]h$]h&]uh1jV hj.nubeh}(h]h ]h"]h$]h&]uh1j4 hjInhMhj+nubj5 )}(hA``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3`` ARM SMMUv3 Virtual Event Queue h](j; )}(h!``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3``h]jA )}(hjmnh]hIOMMU_VEVENTQ_TYPE_ARM_SMMUV3}(hjonhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjknubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjgnubjW )}(hhh]h)}(hARM SMMUv3 Virtual Event Queueh]hARM SMMUv3 Virtual Event Queue}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMhjnubah}(h]h ]h"]h$]h&]uh1jV hjgnubeh}(h]h ]h"]h$]h&]uh1j4 hjnhMhj+nubj5 )}(hI``IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV Extension IRQh](j; )}(h%``IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV``h]jA )}(hjnh]h!IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjnubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjnubjW )}(hhh]h)}(h#NVIDIA Tegra241 CMDQV Extension IRQh]h#NVIDIA Tegra241 CMDQV Extension IRQ}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjnubah}(h]h ]h"]h$]h&]uh1jV hjnubeh}(h]h ]h"]h$]h&]uh1j4 hjnhMhj+nubeh}(h]h ]h"]h$]h&]uh1j/ hjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommu_vevent_arm_smmuv3 (C struct)c.iommu_vevent_arm_smmuv3hNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_vevent_arm_smmuv3h]jc)}(hstruct iommu_vevent_arm_smmuv3h](ji)}(hjlh]hstruct}(hjohhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjnhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjnhhhj ohMubj)}(hiommu_vevent_arm_smmuv3h]j)}(hjnh]hiommu_vevent_arm_smmuv3}(hj ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]hhuh1jhjnhhhj ohMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjnhhhj ohMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1j\hj ohMhjnhhubj)}(hhh]h)}(h8ARM SMMUv3 Virtual Event (IOMMU_VEVENTQ_TYPE_ARM_SMMUV3)h]h8ARM SMMUv3 Virtual Event (IOMMU_VEVENTQ_TYPE_ARM_SMMUV3)}(hjBohhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj?ohhubah}(h]h ]h"]h$]h&]uh1jhjnhhhj ohMubeh}(h]h ](jstructeh"]h$]h&]jjjjZojjZojjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_vevent_arm_smmuv3 { __aligned_le64 evt[4]; }; **Members** ``evt`` 256-bit ARM SMMUv3 Event record, little-endian. Reported event records: (Refer to "7.3 Event records" in SMMUv3 HW Spec) - 0x04 C_BAD_STE - 0x06 F_STREAM_DISABLED - 0x08 C_BAD_SUBSTREAMID - 0x0a C_BAD_CD - 0x10 F_TRANSLATION - 0x11 F_ADDR_SIZE - 0x12 F_ACCESS - 0x13 F_PERMISSIONh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjfohhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjboubh:}(hjbohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^oubj)}(h>struct iommu_vevent_arm_smmuv3 { __aligned_le64 evt[4]; };h]h>struct iommu_vevent_arm_smmuv3 { __aligned_le64 evt[4]; };}hjosbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^oubh)}(h **Members**h]j>)}(hjoh]hMembers}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjoubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^oubj0 )}(hhh]j5 )}(hX``evt`` 256-bit ARM SMMUv3 Event record, little-endian. Reported event records: (Refer to "7.3 Event records" in SMMUv3 HW Spec) - 0x04 C_BAD_STE - 0x06 F_STREAM_DISABLED - 0x08 C_BAD_SUBSTREAMID - 0x0a C_BAD_CD - 0x10 F_TRANSLATION - 0x11 F_ADDR_SIZE - 0x12 F_ACCESS - 0x13 F_PERMISSIONh](j; )}(h``evt``h]jA )}(hjoh]hevt}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjoubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjoubjW )}(hhh]h)}(hX256-bit ARM SMMUv3 Event record, little-endian. Reported event records: (Refer to "7.3 Event records" in SMMUv3 HW Spec) - 0x04 C_BAD_STE - 0x06 F_STREAM_DISABLED - 0x08 C_BAD_SUBSTREAMID - 0x0a C_BAD_CD - 0x10 F_TRANSLATION - 0x11 F_ADDR_SIZE - 0x12 F_ACCESS - 0x13 F_PERMISSIONh]hX256-bit ARM SMMUv3 Event record, little-endian. Reported event records: (Refer to “7.3 Event records” in SMMUv3 HW Spec) - 0x04 C_BAD_STE - 0x06 F_STREAM_DISABLED - 0x08 C_BAD_SUBSTREAMID - 0x0a C_BAD_CD - 0x10 F_TRANSLATION - 0x11 F_ADDR_SIZE - 0x12 F_ACCESS - 0x13 F_PERMISSION}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjoubah}(h]h ]h"]h$]h&]uh1jV hjoubeh}(h]h ]h"]h$]h&]uh1j4 hjohMhjoubah}(h]h ]h"]h$]h&]uh1j/ hj^oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjoh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjoubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hStreamID field reports a virtual device ID. To receive a virtual event for a device, a vDEVICE must be allocated via IOMMU_VDEVICE_ALLOC.h]hStreamID field reports a virtual device ID. To receive a virtual event for a device, a vDEVICE must be allocated via IOMMU_VDEVICE_ALLOC.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS&iommu_vevent_tegra241_cmdqv (C struct)c.iommu_vevent_tegra241_cmdqvhNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_vevent_tegra241_cmdqvh]jc)}(h"struct iommu_vevent_tegra241_cmdqvh](ji)}(hjlh]hstruct}(hj0phhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj,phhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hj>phhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj,phhhj=phMubj)}(hiommu_vevent_tegra241_cmdqvh]j)}(hj*ph]hiommu_vevent_tegra241_cmdqv}(hjPphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLpubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,phhhj=phMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj(phhhj=phMubah}(h]j#pah ](jjeh"]h$]h&]jj)jhuh1j\hj=phMhj%phhubj)}(hhh]h)}(h6Tegra241 CMDQV IRQ (IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV)h]h6Tegra241 CMDQV IRQ (IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV)}(hjrphhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjophhubah}(h]h ]h"]h$]h&]uh1jhj%phhhj=phMubeh}(h]h ](jstructeh"]h$]h&]jjjjpjjpjjjuh1jWhhhjhj8hNubj)}(h**Definition**:: struct iommu_vevent_tegra241_cmdqv { __aligned_le64 lvcmdq_err_map[2]; }; **Members** ``lvcmdq_err_map`` 128-bit logical vcmdq error map, little-endian. (Refer to register LVCMDQ_ERR_MAPs per VINTF )h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjpubh:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjpubj)}(hMstruct iommu_vevent_tegra241_cmdqv { __aligned_le64 lvcmdq_err_map[2]; };h]hMstruct iommu_vevent_tegra241_cmdqv { __aligned_le64 lvcmdq_err_map[2]; };}hjpsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjpubh)}(h **Members**h]j>)}(hjph]hMembers}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjpubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjpubj0 )}(hhh]j5 )}(hq``lvcmdq_err_map`` 128-bit logical vcmdq error map, little-endian. (Refer to register LVCMDQ_ERR_MAPs per VINTF )h](j; )}(h``lvcmdq_err_map``h]jA )}(hjph]hlvcmdq_err_map}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjpubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjpubjW )}(hhh]h)}(h^128-bit logical vcmdq error map, little-endian. (Refer to register LVCMDQ_ERR_MAPs per VINTF )h]h^128-bit logical vcmdq error map, little-endian. (Refer to register LVCMDQ_ERR_MAPs per VINTF )}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjpubah}(h]h ]h"]h$]h&]uh1jV hjpubeh}(h]h ]h"]h$]h&]uh1j4 hjphMhjpubah}(h]h ]h"]h$]h&]uh1j/ hjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj!qh]h Description}(hj#qhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjqubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjhhubh)}(hThe 128-bit register value from HW exclusively reflect the error bits for a Virtual Interface represented by a vIOMMU object. Read and report directly.h]hThe 128-bit register value from HW exclusively reflect the error bits for a Virtual Interface represented by a vIOMMU object. Read and report directly.}(hj7qhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_veventq_alloc (C struct)c.iommu_veventq_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_veventq_alloch]jc)}(hstruct iommu_veventq_alloch](ji)}(hjlh]hstruct}(hj_qhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj[qhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMubj{)}(h h]h }(hjmqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj[qhhhjlqhMubj)}(hiommu_veventq_alloch]j)}(hjYqh]hiommu_veventq_alloc}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{qubah}(h]h ](jjeh"]h$]h&]hhuh1jhj[qhhhjlqhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjWqhhhjlqhMubah}(h]jRqah ](jjeh"]h$]h&]jj)jhuh1j\hjlqhMhjTqhhubj)}(hhh]h)}(hioctl(IOMMU_VEVENTQ_ALLOC)h]hioctl(IOMMU_VEVENTQ_ALLOC)}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjqhhubah}(h]h ]h"]h$]h&]uh1jhjTqhhhjlqhMubeh}(h]h ](jstructeh"]h$]h&]jjjjqjjqjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_veventq_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 veventq_depth; __u32 out_veventq_id; __u32 out_veventq_fd; __u32 __reserved; }; **Members** ``size`` sizeof(struct iommu_veventq_alloc) ``flags`` Must be 0 ``viommu_id`` virtual IOMMU ID to associate the vEVENTQ with ``type`` Type of the vEVENTQ. Must be defined in enum iommu_veventq_type ``veventq_depth`` Maximum number of events in the vEVENTQ ``out_veventq_id`` The ID of the new vEVENTQ ``out_veventq_fd`` The fd of the new vEVENTQ. User space must close the successfully returned fd after using it ``__reserved`` Must be 0h](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjqubh:}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjqubj)}(hstruct iommu_veventq_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 veventq_depth; __u32 out_veventq_id; __u32 out_veventq_fd; __u32 __reserved; };h]hstruct iommu_veventq_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 veventq_depth; __u32 out_veventq_id; __u32 out_veventq_fd; __u32 __reserved; };}hjqsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjqubh)}(h **Members**h]j>)}(hjqh]hMembers}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjqubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM#hjqubj0 )}(hhh](j5 )}(h,``size`` sizeof(struct iommu_veventq_alloc) h](j; )}(h``size``h]jA )}(hjrh]hsize}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj rubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjrubjW )}(hhh]h)}(h"sizeof(struct iommu_veventq_alloc)h]h"sizeof(struct iommu_veventq_alloc)}(hj'rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#rhMhj$rubah}(h]h ]h"]h$]h&]uh1jV hjrubeh}(h]h ]h"]h$]h&]uh1j4 hj#rhMhjrubj5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hjGrh]hflags}(hjIrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjErubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjArubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hj`rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\rhMhj]rubah}(h]h ]h"]h$]h&]uh1jV hjArubeh}(h]h ]h"]h$]h&]uh1j4 hj\rhMhjrubj5 )}(h=``viommu_id`` virtual IOMMU ID to associate the vEVENTQ with h](j; )}(h ``viommu_id``h]jA )}(hjrh]h viommu_id}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj~rubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjzrubjW )}(hhh]h)}(h.virtual IOMMU ID to associate the vEVENTQ withh]h.virtual IOMMU ID to associate the vEVENTQ with}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjrubah}(h]h ]h"]h$]h&]uh1jV hjzrubeh}(h]h ]h"]h$]h&]uh1j4 hjrhMhjrubj5 )}(hI``type`` Type of the vEVENTQ. Must be defined in enum iommu_veventq_type h](j; )}(h``type``h]jA )}(hjrh]htype}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjrubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjrubjW )}(hhh]h)}(h?Type of the vEVENTQ. Must be defined in enum iommu_veventq_typeh]h?Type of the vEVENTQ. Must be defined in enum iommu_veventq_type}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjrubah}(h]h ]h"]h$]h&]uh1jV hjrubeh}(h]h ]h"]h$]h&]uh1j4 hjrhMhjrubj5 )}(h:``veventq_depth`` Maximum number of events in the vEVENTQ h](j; )}(h``veventq_depth``h]jA )}(hjrh]h veventq_depth}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjrubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjrubjW )}(hhh]h)}(h'Maximum number of events in the vEVENTQh]h'Maximum number of events in the vEVENTQ}(hj shhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjsubah}(h]h ]h"]h$]h&]uh1jV hjrubeh}(h]h ]h"]h$]h&]uh1j4 hjshMhjrubj5 )}(h-``out_veventq_id`` The ID of the new vEVENTQ h](j; )}(h``out_veventq_id``h]jA )}(hj+sh]hout_veventq_id}(hj-shhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj)subah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj%subjW )}(hhh]h)}(hThe ID of the new vEVENTQh]hThe ID of the new vEVENTQ}(hjDshhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@shMhjAsubah}(h]h ]h"]h$]h&]uh1jV hj%subeh}(h]h ]h"]h$]h&]uh1j4 hj@shMhjrubj5 )}(hp``out_veventq_fd`` The fd of the new vEVENTQ. User space must close the successfully returned fd after using it h](j; )}(h``out_veventq_fd``h]jA )}(hjdsh]hout_veventq_fd}(hjfshhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjbsubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhj^subjW )}(hhh]h)}(h\The fd of the new vEVENTQ. User space must close the successfully returned fd after using ith]h\The fd of the new vEVENTQ. User space must close the successfully returned fd after using it}(hj}shhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjzsubah}(h]h ]h"]h$]h&]uh1jV hj^subeh}(h]h ]h"]h$]h&]uh1j4 hjyshMhjrubj5 )}(h``__reserved`` Must be 0h](j; )}(h``__reserved``h]jA )}(hjsh]h __reserved}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjsubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjsubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjsubah}(h]h ]h"]h$]h&]uh1jV hjsubeh}(h]h ]h"]h$]h&]uh1j4 hjshMhjrubeh}(h]h ]h"]h$]h&]uh1j/ hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hjsh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjsubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hXkExplicitly allocate a virtual event queue interface for a vIOMMU. A vIOMMU can have multiple FDs for different types, but is confined to one per **type**. User space should open the **out_veventq_fd** to read vEVENTs out of a vEVENTQ, if there are vEVENTs available. A vEVENTQ will lose events due to overflow, if the number of the vEVENTs hits **veventq_depth**.h](hExplicitly allocate a virtual event queue interface for a vIOMMU. A vIOMMU can have multiple FDs for different types, but is confined to one per }(hjshhhNhNubj>)}(h**type**h]htype}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjsubh. User space should open the }(hjshhhNhNubj>)}(h**out_veventq_fd**h]hout_veventq_fd}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjsubh to read vEVENTs out of a vEVENTQ, if there are vEVENTs available. A vEVENTQ will lose events due to overflow, if the number of the vEVENTs hits }(hjshhhNhNubj>)}(h**veventq_depth**h]h veventq_depth}(hj#thhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjsubh.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMhjhhubh)}(h~Each vEVENT in a vEVENTQ encloses a struct iommufd_vevent_header followed by a type-specific data structure, in a normal case:h]h~Each vEVENT in a vEVENTQ encloses a struct iommufd_vevent_header followed by a type-specific data structure, in a normal case:}(hjkhjtubah}(h]h ]h"]h$]h&]uh1j9khjNtubeh}(h]h ]h"]h$]h&]colsK uh1jjhjKtubah}(h]h ]h"]h$]h&]uh1jjhjhhhj8hNubh)}(hiunless a tailing IOMMU_VEVENTQ_FLAG_LOST_EVENTS header is logged (refer to struct iommufd_vevent_header).h]hiunless a tailing IOMMU_VEVENTQ_FLAG_LOST_EVENTS header is logged (refer to struct iommufd_vevent_header).}(hj~uhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM)hjhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_queue_type (C enum)c.iommu_hw_queue_typehNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_queue_typeh]jc)}(henum iommu_hw_queue_typeh](ji)}(hjh]henum}(hjuhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjuhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM/ubj{)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjuhhhjuhM/ubj)}(hiommu_hw_queue_typeh]j)}(hjuh]hiommu_hw_queue_type}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ](jjeh"]h$]h&]hhuh1jhjuhhhjuhM/ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjuhhhjuhM/ubah}(h]juah ](jjeh"]h$]h&]jj)jhuh1j\hjuhM/hjuhhubj)}(hhh]h)}(h HW Queue Typeh]h HW Queue Type}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM:hjuhhubah}(h]h ]h"]h$]h&]uh1jhjuhhhjuhM/ubeh}(h]h ](jenumeh"]h$]h&]jjjjvjjvjjjuh1jWhhhjhj8hNubj)}(h**Constants** ``IOMMU_HW_QUEUE_TYPE_DEFAULT`` Reserved for future use ``IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) Virtual Command Queue (VCMDQ)h](h)}(h **Constants**h]j>)}(hj vh]h Constants}(hj vhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjvubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM>hjvubj0 )}(hhh](j5 )}(h8``IOMMU_HW_QUEUE_TYPE_DEFAULT`` Reserved for future use h](j; )}(h``IOMMU_HW_QUEUE_TYPE_DEFAULT``h]jA )}(hj)vh]hIOMMU_HW_QUEUE_TYPE_DEFAULT}(hj+vhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj'vubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMAhj#vubjW )}(hhh]h)}(hReserved for future useh]hReserved for future use}(hjBvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>vhMAhj?vubah}(h]h ]h"]h$]h&]uh1jV hj#vubeh}(h]h ]h"]h$]h&]uh1j4 hj>vhMAhj vubj5 )}(hu``IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV`` NVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) Virtual Command Queue (VCMDQ)h](j; )}(h&``IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV``h]jA )}(hjbvh]h"IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV}(hjdvhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj`vubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMDhj\vubjW )}(hhh]h)}(hNNVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) Virtual Command Queue (VCMDQ)h]hNNVIDIA Tegra241 CMDQV (extension for ARM SMMUv3) Virtual Command Queue (VCMDQ)}(hj{vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwvhMDhjxvubah}(h]h ]h"]h$]h&]uh1jV hj\vubeh}(h]h ]h"]h$]h&]uh1j4 hjwvhMDhj vubeh}(h]h ]h"]h$]h&]uh1j/ hjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommu_hw_queue_alloc (C struct)c.iommu_hw_queue_allochNtauh1jFhjhhhj8hNubjX)}(hhh](j])}(hiommu_hw_queue_alloch]jc)}(hstruct iommu_hw_queue_alloch](ji)}(hjlh]hstruct}(hjvhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjvhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMJubj{)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjvhhhjvhMJubj)}(hiommu_hw_queue_alloch]j)}(hjvh]hiommu_hw_queue_alloc}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]hhuh1jhjvhhhjvhMJubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjvhhhjvhMJubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1j\hjvhMJhjvhhubj)}(hhh]h)}(hioctl(IOMMU_HW_QUEUE_ALLOC)h]hioctl(IOMMU_HW_QUEUE_ALLOC)}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMQhjvhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjvhMJubeh}(h]h ](jstructeh"]h$]h&]jjjjwjjwjjjuh1jWhhhjhj8hNubj)}(hX**Definition**:: struct iommu_hw_queue_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 index; __u32 out_hw_queue_id; __aligned_u64 nesting_parent_iova; __aligned_u64 length; }; **Members** ``size`` sizeof(struct iommu_hw_queue_alloc) ``flags`` Must be 0 ``viommu_id`` Virtual IOMMU ID to associate the HW queue with ``type`` One of enum iommu_hw_queue_type ``index`` The logical index to the HW queue per virtual IOMMU for a multi-queue model ``out_hw_queue_id`` The ID of the new HW queue ``nesting_parent_iova`` Base address of the queue memory in the guest physical address space ``length`` Length of the queue memoryh](h)}(h**Definition**::h](j>)}(h**Definition**h]h Definition}(hj!whhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjwubh:}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMUhjwubj)}(hstruct iommu_hw_queue_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 index; __u32 out_hw_queue_id; __aligned_u64 nesting_parent_iova; __aligned_u64 length; };h]hstruct iommu_hw_queue_alloc { __u32 size; __u32 flags; __u32 viommu_id; __u32 type; __u32 index; __u32 out_hw_queue_id; __aligned_u64 nesting_parent_iova; __aligned_u64 length; };}hj:wsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMWhjwubh)}(h **Members**h]j>)}(hjKwh]hMembers}(hjMwhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjIwubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMbhjwubj0 )}(hhh](j5 )}(h-``size`` sizeof(struct iommu_hw_queue_alloc) h](j; )}(h``size``h]jA )}(hjjwh]hsize}(hjlwhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjhwubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMShjdwubjW )}(hhh]h)}(h#sizeof(struct iommu_hw_queue_alloc)h]h#sizeof(struct iommu_hw_queue_alloc)}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMShjwubah}(h]h ]h"]h$]h&]uh1jV hjdwubeh}(h]h ]h"]h$]h&]uh1j4 hjwhMShjawubj5 )}(h``flags`` Must be 0 h](j; )}(h ``flags``h]jA )}(hjwh]hflags}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjwubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMThjwubjW )}(hhh]h)}(h Must be 0h]h Must be 0}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMThjwubah}(h]h ]h"]h$]h&]uh1jV hjwubeh}(h]h ]h"]h$]h&]uh1j4 hjwhMThjawubj5 )}(h>``viommu_id`` Virtual IOMMU ID to associate the HW queue with h](j; )}(h ``viommu_id``h]jA )}(hjwh]h viommu_id}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjwubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMUhjwubjW )}(hhh]h)}(h/Virtual IOMMU ID to associate the HW queue withh]h/Virtual IOMMU ID to associate the HW queue with}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMUhjwubah}(h]h ]h"]h$]h&]uh1jV hjwubeh}(h]h ]h"]h$]h&]uh1j4 hjwhMUhjawubj5 )}(h)``type`` One of enum iommu_hw_queue_type h](j; )}(h``type``h]jA )}(hjxh]htype}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjxubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMVhjxubjW )}(hhh]h)}(hOne of enum iommu_hw_queue_typeh]hOne of enum iommu_hw_queue_type}(hj.xhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*xhMVhj+xubah}(h]h ]h"]h$]h&]uh1jV hjxubeh}(h]h ]h"]h$]h&]uh1j4 hj*xhMVhjawubj5 )}(hV``index`` The logical index to the HW queue per virtual IOMMU for a multi-queue model h](j; )}(h ``index``h]jA )}(hjNxh]hindex}(hjPxhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjLxubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMXhjHxubjW )}(hhh]h)}(hKThe logical index to the HW queue per virtual IOMMU for a multi-queue modelh]hKThe logical index to the HW queue per virtual IOMMU for a multi-queue model}(hjgxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMWhjdxubah}(h]h ]h"]h$]h&]uh1jV hjHxubeh}(h]h ]h"]h$]h&]uh1j4 hjcxhMXhjawubj5 )}(h/``out_hw_queue_id`` The ID of the new HW queue h](j; )}(h``out_hw_queue_id``h]jA )}(hjxh]hout_hw_queue_id}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjxubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMYhjxubjW )}(hhh]h)}(hThe ID of the new HW queueh]hThe ID of the new HW queue}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMYhjxubah}(h]h ]h"]h$]h&]uh1jV hjxubeh}(h]h ]h"]h$]h&]uh1j4 hjxhMYhjawubj5 )}(h]``nesting_parent_iova`` Base address of the queue memory in the guest physical address space h](j; )}(h``nesting_parent_iova``h]jA )}(hjxh]hnesting_parent_iova}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjxubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjxubjW )}(hhh]h)}(hDBase address of the queue memory in the guest physical address spaceh]hDBase address of the queue memory in the guest physical address space}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMZhjxubah}(h]h ]h"]h$]h&]uh1jV hjxubeh}(h]h ]h"]h$]h&]uh1j4 hjxhM[hjawubj5 )}(h%``length`` Length of the queue memoryh](j; )}(h ``length``h]jA )}(hjxh]hlength}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjxubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM[hjxubjW )}(hhh]h)}(hLength of the queue memoryh]hLength of the queue memory}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM\hjyubah}(h]h ]h"]h$]h&]uh1jV hjxubeh}(h]h ]h"]h$]h&]uh1j4 hjyhM[hjawubeh}(h]h ]h"]h$]h&]uh1j/ hjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj8hNubh)}(h**Description**h]j>)}(hj>yh]h Description}(hj@yhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj)}(h**nesting_parent_iova**h]hnesting_parent_iova}(hj\yhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjTyubh and }(hjTyhhhNhNubj>)}(h **length**h]hlength}(hjnyhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjTyubh.}(hjTyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM\hjhhubh)}(hxA vIOMMU can allocate multiple queues, but it must use a different **index** per type to separate each allocation, e.g::h](hCA vIOMMU can allocate multiple queues, but it must use a different }(hjyhhhNhNubj>)}(h **index**h]hindex}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjyubh+ per type to separate each allocation, e.g:}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhM`hjhhubj)}(h6Type1 HW queue0, Type1 HW queue1, Type2 HW queue0, ...h]h6Type1 HW queue0, Type1 HW queue1, Type2 HW queue0, ...}hjysbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.hhMchjhhubeh}(h]iommufd-user-apiah ]h"]iommufd user apiah$]h&]uh1hhhhhhhhMMubh)}(hhh](h)}(hIOMMUFD Kernel APIh]hIOMMUFD Kernel API}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhhhhhMRubh)}(hX)The IOMMUFD kAPI is device-centric with group-related tricks managed behind the scene. This allows the external drivers calling such kAPI to implement a simple device-centric uAPI for connecting its device to an iommufd, instead of explicitly imposing the group semantics in its uAPI as VFIO does.h]hX)The IOMMUFD kAPI is device-centric with group-related tricks managed behind the scene. This allows the external drivers calling such kAPI to implement a simple device-centric uAPI for connecting its device to an iommufd, instead of explicitly imposing the group semantics in its uAPI as VFIO does.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThjyhhubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommufd_device_bind (C function)c.iommufd_device_bindhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hcstruct iommufd_device * iommufd_device_bind (struct iommufd_ctx *ictx, struct device *dev, u32 *id)h]jc)}(hastruct iommufd_device *iommufd_device_bind(struct iommufd_ctx *ictx, struct device *dev, u32 *id)h](ji)}(hjlh]hstruct}(hjyhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjyhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM'ubj{)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjyhhhjzhM'ubh)}(hhh]j)}(hiommufd_deviceh]hiommufd_device}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjzmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j1z ASTIdentifier)}j,ziommufd_device_bindsbc.iommufd_device_bindasbuh1hhjyhhhjzhM'ubj{)}(h h]h }(hj?zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjyhhhjzhM'ubhdesc_sig_punctuation)}(hjh]h*}(hjOzhhhNhNubah}(h]h ]pah"]h$]h&]uh1jMzhjyhhhjzhM'ubj)}(hiommufd_device_bindh]j)}(hj)}(hj{h]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj{ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM+hj{ubj0 )}(hhh](j5 )}(h5``struct iommufd_ctx *ictx`` iommufd file descriptor h](j; )}(h``struct iommufd_ctx *ictx``h]jA )}(hj|h]hstruct iommufd_ctx *ictx}(hj |hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj|ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM(hj|ubjW )}(hhh]h)}(hiommufd file descriptorh]hiommufd file descriptor}(hj |hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM(hj|ubah}(h]h ]h"]h$]h&]uh1jV hj|ubeh}(h]h ]h"]h$]h&]uh1j4 hj|hM(hj{ubj5 )}(h;``struct device *dev`` Pointer to a physical device struct h](j; )}(h``struct device *dev``h]jA )}(hj@|h]hstruct device *dev}(hjB|hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj>|ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM)hj:|ubjW )}(hhh]h)}(h#Pointer to a physical device structh]h#Pointer to a physical device struct}(hjY|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU|hM)hjV|ubah}(h]h ]h"]h$]h&]uh1jV hj:|ubeh}(h]h ]h"]h$]h&]uh1j4 hjU|hM)hj{ubj5 )}(hD``u32 *id`` Output ID number to return to userspace for this device h](j; )}(h ``u32 *id``h]jA )}(hjy|h]hu32 *id}(hj{|hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjw|ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM*hjs|ubjW )}(hhh]h)}(h7Output ID number to return to userspace for this deviceh]h7Output ID number to return to userspace for this device}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM*hj|ubah}(h]h ]h"]h$]h&]uh1jV hjs|ubeh}(h]h ]h"]h$]h&]uh1j4 hj|hM*hj{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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM,hj{ubh)}(hA successful bind establishes an ownership over the device and returns struct iommufd_device pointer, otherwise returns error pointer.h]hA successful bind establishes an ownership over the device and returns struct iommufd_device pointer, otherwise returns error pointer.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM+hj{ubh)}(hA driver using this API must set driver_managed_dma and must not touch the device until this routine succeeds and establishes ownership.h]hA driver using this API must set driver_managed_dma and must not touch the device until this routine succeeds and establishes ownership.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM.hj{ubh)}(hABinding a PCI device places the entire RID under iommufd control.h]hABinding a PCI device places the entire RID under iommufd control.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM1hj{ubh)}(h6The caller must undo this with iommufd_device_unbind()h]h6The caller must undo this with iommufd_device_unbind()}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM3hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_ctx_has_group (C function)c.iommufd_ctx_has_grouphNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hPbool iommufd_ctx_has_group (struct iommufd_ctx *ictx, struct iommu_group *group)h]jc)}(hObool iommufd_ctx_has_group(struct iommufd_ctx *ictx, struct iommu_group *group)h](hdesc_sig_keyword_type)}(hboolh]hbool}(hj(}hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j&}hj"}hhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMiubj{)}(h h]h }(hj8}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj"}hhhj7}hMiubj)}(hiommufd_ctx_has_grouph]j)}(hiommufd_ctx_has_grouph]hiommufd_ctx_has_group}(hjJ}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF}ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj"}hhhj7}hMiubjuz)}(h5(struct iommufd_ctx *ictx, struct iommu_group *group)h](j{z)}(hstruct iommufd_ctx *ictxh](ji)}(hjlh]hstruct}(hjf}hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjb}ubj{)}(h h]h }(hjs}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjb}ubh)}(hhh]j)}(h iommufd_ctxh]h iommufd_ctx}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj}modnameN classnameNj0zj3z)}j6z]j9z)}j,zjL}sbc.iommufd_ctx_has_groupasbuh1hhjb}ubj{)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjb}ubjNz)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjb}ubj)}(hictxh]hictx}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj^}ubj{z)}(hstruct iommu_group *grouph](ji)}(hjlh]hstruct}(hj}hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj}ubj{)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj}ubh)}(hhh]j)}(h iommu_grouph]h iommu_group}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj}modnameN classnameNj0zj3z)}j6z]j}c.iommufd_ctx_has_groupasbuh1hhj}ubj{)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj}ubjNz)}(hjh]h*}(hj"~hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhj}ubj)}(hgrouph]hgroup}(hj/~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj^}ubeh}(h]h ]h"]h$]h&]hhuh1jtzhj"}hhhj7}hMiubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj}hhhj7}hMiubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1j\hj7}hMihj}hhubj)}(hhh]h)}(h8True if any device within the group is bound to the ictxh]h8True if any device within the group is bound to the ictx}(hjY~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMihjV~hhubah}(h]h ]h"]h$]h&]uh1jhj}hhhj7}hMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjq~jjq~jjjuh1jWhhhjyhNhNubj)}(hX2**Parameters** ``struct iommufd_ctx *ictx`` iommufd file descriptor ``struct iommu_group *group`` Pointer to a physical iommu_group struct **Description** True if any device within the group has been bound to this ictx, ex. via iommufd_device_bind(), therefore implying ictx ownership of the group.h](h)}(h**Parameters**h]j>)}(hj{~h]h Parameters}(hj}~hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjy~ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMmhju~ubj0 )}(hhh](j5 )}(h5``struct iommufd_ctx *ictx`` iommufd file descriptor h](j; )}(h``struct iommufd_ctx *ictx``h]jA )}(hj~h]hstruct iommufd_ctx *ictx}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj~ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMkhj~ubjW )}(hhh]h)}(hiommufd file descriptorh]hiommufd file descriptor}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMkhj~ubah}(h]h ]h"]h$]h&]uh1jV hj~ubeh}(h]h ]h"]h$]h&]uh1j4 hj~hMkhj~ubj5 )}(hG``struct iommu_group *group`` Pointer to a physical iommu_group struct h](j; )}(h``struct iommu_group *group``h]jA )}(hj~h]hstruct iommu_group *group}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj~ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMlhj~ubjW )}(hhh]h)}(h(Pointer to a physical iommu_group structh]h(Pointer to a physical iommu_group struct}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMlhj~ubah}(h]h ]h"]h$]h&]uh1jV hj~ubeh}(h]h ]h"]h$]h&]uh1j4 hj~hMlhj~ubeh}(h]h ]h"]h$]h&]uh1j/ hju~ubh)}(h**Description**h]j>)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMnhju~ubh)}(hTrue if any device within the group has been bound to this ictx, ex. via iommufd_device_bind(), therefore implying ictx ownership of the group.h]hTrue if any device within the group has been bound to this ictx, ex. via iommufd_device_bind(), therefore implying ictx ownership of the group.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMmhju~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_device_unbind (C function)c.iommufd_device_unbindhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h8void iommufd_device_unbind (struct iommufd_device *idev)h]jc)}(h7void iommufd_device_unbind(struct iommufd_device *idev)h](j'})}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjOhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMubj{)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjOhhhjahMubj)}(hiommufd_device_unbindh]j)}(hiommufd_device_unbindh]hiommufd_device_unbind}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]hhuh1jhjOhhhjahMubjuz)}(h(struct iommufd_device *idev)h]j{z)}(hstruct iommufd_device *idevh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(hiommufd_deviceh]hiommufd_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,zjvsbc.iommufd_device_unbindasbuh1hhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hidevh]hidev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubah}(h]h ]h"]h$]h&]hhuh1jtzhjOhhhjahMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjKhhhjahMubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1j\hjahMhjHhhubj)}(hhh]h)}(hUndo iommufd_device_bind()h]hUndo iommufd_device_bind()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1jWhhhjyhNhNubj)}(hXP**Parameters** ``struct iommufd_device *idev`` Device returned by iommufd_device_bind() **Description** Release the device from iommufd control. The DMA ownership will return back to unowned with DMA controlled by the DMA API. This invalidates the iommufd_device pointer, other APIs that consume it must not be called concurrently.h](h)}(h**Parameters**h]j>)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj3ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj/ubj0 )}(hhh]j5 )}(hI``struct iommufd_device *idev`` Device returned by iommufd_device_bind() h](j; )}(h``struct iommufd_device *idev``h]jA )}(hjTh]hstruct iommufd_device *idev}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjRubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjNubjW )}(hhh]h)}(h(Device returned by iommufd_device_bind()h]h(Device returned by iommufd_device_bind()}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMhjjubah}(h]h ]h"]h$]h&]uh1jV hjNubeh}(h]h ]h"]h$]h&]uh1j4 hjihMhjKubah}(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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj/ubh)}(hRelease the device from iommufd control. The DMA ownership will return back to unowned with DMA controlled by the DMA API. This invalidates the iommufd_device pointer, other APIs that consume it must not be called concurrently.h]hRelease the device from iommufd control. The DMA ownership will return back to unowned with DMA controlled by the DMA API. This invalidates the iommufd_device pointer, other APIs that consume it must not be called concurrently.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_device_attach (C function)c.iommufd_device_attachhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hSint iommufd_device_attach (struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h]jc)}(hRint iommufd_device_attach(struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h](j'})}(hinth]hint}(hjԀhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjЀhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM*ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjЀhhhjhM*ubj)}(hiommufd_device_attachh]j)}(hiommufd_device_attachh]hiommufd_device_attach}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjЀhhhjhM*ubjuz)}(h9(struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h](j{z)}(hstruct iommufd_device *idevh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj ubh)}(hhh]j)}(hiommufd_deviceh]hiommufd_device}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj1modnameN classnameNj0zj3z)}j6z]j9z)}j,zjsbc.iommufd_device_attachasbuh1hhj ubj{)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj ubjNz)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhj ubj)}(hidevh]hidev}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj ubj{z)}(hioasid_t pasidh](h)}(hhh]j)}(hioasid_th]hioasid_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]jKc.iommufd_device_attachasbuh1hhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hpasidh]hpasid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj ubj{z)}(h u32 *pt_idh](h)}(hhh]j)}(hu32h]hu32}(hj΁hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjˁubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjЁmodnameN classnameNj0zj3z)}j6z]jKc.iommufd_device_attachasbuh1hhjǁubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjǁubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjǁubj)}(hpt_idh]hpt_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǁubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj ubeh}(h]h ]h"]h$]h&]hhuh1jtzhjЀhhhjhM*ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhj̀hhhjhM*ubah}(h]jǀah ](jjeh"]h$]h&]jj)jhuh1j\hjhM*hjɀhhubj)}(hhh]h)}(h)Connect a device/pasid to an iommu_domainh]h)Connect a device/pasid to an iommu_domain}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM*hj.hhubah}(h]h ]h"]h$]h&]uh1jhjɀhhhjhM*ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jWhhhjyhNhNubj)}(hXC**Parameters** ``struct iommufd_device *idev`` device to attach ``ioasid_t pasid`` pasid to attach ``u32 *pt_id`` Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID **Description** This connects the device/pasid to an iommu_domain, either automatically or manually selected. Once this completes the device could do DMA with **pasid**. **pasid** is IOMMU_NO_PASID if this attach is for no pasid usage. The caller should return the resulting pt_id back to userspace. This function is undone by calling iommufd_device_detach().h](h)}(h**Parameters**h]j>)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjQubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM.hjMubj0 )}(hhh](j5 )}(h1``struct iommufd_device *idev`` device to attach h](j; )}(h``struct iommufd_device *idev``h]jA )}(hjrh]hstruct iommufd_device *idev}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjpubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM+hjlubjW )}(hhh]h)}(hdevice to attachh]hdevice to attach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM+hjubah}(h]h ]h"]h$]h&]uh1jV hjlubeh}(h]h ]h"]h$]h&]uh1j4 hjhM+hjiubj5 )}(h#``ioasid_t pasid`` pasid to attach h](j; )}(h``ioasid_t pasid``h]jA )}(hjh]hioasid_t pasid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM,hjubjW )}(hhh]h)}(hpasid to attachh]hpasid to attach}(hjĂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM,hjiubj5 )}(hk``u32 *pt_id`` Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID h](j; )}(h``u32 *pt_id``h]jA )}(hjh]h u32 *pt_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM.hjނubjW )}(hhh]h)}(h[Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING IDh]h[Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM-hjubah}(h]h ]h"]h$]h&]uh1jV hjނubeh}(h]h ]h"]h$]h&]uh1j4 hjhM.hjiubeh}(h]h ]h"]h$]h&]uh1j/ hjMubh)}(h**Description**h]j>)}(hj h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM0hjMubh)}(hThis connects the device/pasid to an iommu_domain, either automatically or manually selected. Once this completes the device could do DMA with **pasid**. **pasid** is IOMMU_NO_PASID if this attach is for no pasid usage.h](hThis connects the device/pasid to an iommu_domain, either automatically or manually selected. Once this completes the device could do DMA with }(hj6hhhNhNubj>)}(h **pasid**h]hpasid}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj6ubh. }(hj6hhhNhNubj>)}(h **pasid**h]hpasid}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj6ubh8 is IOMMU_NO_PASID if this attach is for no pasid usage.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM/hjMubh)}(h{The caller should return the resulting pt_id back to userspace. This function is undone by calling iommufd_device_detach().h]h{The caller should return the resulting pt_id back to userspace. This function is undone by calling iommufd_device_detach().}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM3hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS#iommufd_device_replace (C function)c.iommufd_device_replacehNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hTint iommufd_device_replace (struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h]jc)}(hSint iommufd_device_replace(struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h](j'})}(hinth]hint}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMKubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhMKubj)}(hiommufd_device_replaceh]j)}(hiommufd_device_replaceh]hiommufd_device_replace}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMKubjuz)}(h9(struct iommufd_device *idev, ioasid_t pasid, u32 *pt_id)h](j{z)}(hstruct iommufd_device *idevh](ji)}(hjlh]hstruct}(hjՃhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjуubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjуubh)}(hhh]j)}(hiommufd_deviceh]hiommufd_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,zjsbc.iommufd_device_replaceasbuh1hhjуubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjуubjNz)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjуubj)}(hidevh]hidev}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjуubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj̓ubj{z)}(hioasid_t pasidh](h)}(hhh]j)}(hioasid_th]hioasid_t}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjLmodnameN classnameNj0zj3z)}j6z]jc.iommufd_device_replaceasbuh1hhjCubj{)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjCubj)}(hpasidh]hpasid}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj̓ubj{z)}(h u32 *pt_idh](h)}(hhh]j)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]jc.iommufd_device_replaceasbuh1hhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hpt_idh]hpt_id}(hj˄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj̓ubeh}(h]h ]h"]h$]h&]hhuh1jtzhjhhhjhMKubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhMKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhMKhjhhubj)}(hhh]h)}(h&Change the device/pasid's iommu_domainh]h(Change the device/pasid’s iommu_domain}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jWhhhjyhNhNubj)}(hX6**Parameters** ``struct iommufd_device *idev`` device to change ``ioasid_t pasid`` pasid to change ``u32 *pt_id`` Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID **Description** This is the same as:: iommufd_device_detach(); iommufd_device_attach(); If it fails then no change is made to the attachment. The iommu driver may implement this so there is no disruption in translation. This can only be called if iommufd_device_attach() has already succeeded. **pasid** is IOMMU_NO_PASID for no pasid usage.h](h)}(h**Parameters**h]j>)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMOhjubj0 )}(hhh](j5 )}(h1``struct iommufd_device *idev`` device to change h](j; )}(h``struct iommufd_device *idev``h]jA )}(hj6h]hstruct iommufd_device *idev}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj4ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMLhj0ubjW )}(hhh]h)}(hdevice to changeh]hdevice to change}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMLhjLubah}(h]h ]h"]h$]h&]uh1jV hj0ubeh}(h]h ]h"]h$]h&]uh1j4 hjKhMLhj-ubj5 )}(h#``ioasid_t pasid`` pasid to change h](j; )}(h``ioasid_t pasid``h]jA )}(hjoh]hioasid_t pasid}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjmubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMMhjiubjW )}(hhh]h)}(hpasid to changeh]hpasid to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1jV hjiubeh}(h]h ]h"]h$]h&]uh1j4 hjhMMhj-ubj5 )}(hk``u32 *pt_id`` Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID h](j; )}(h``u32 *pt_id``h]jA )}(hjh]h u32 *pt_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMOhjubjW )}(hhh]h)}(h[Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING IDh]h[Input an IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HWPT_PAGING Output the IOMMUFD_OBJ_HWPT_PAGING ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMNhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMOhj-ubeh}(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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMQhjubh)}(hThis is the same as::h]hThis is the same as:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMPhjubj)}(h1iommufd_device_detach(); iommufd_device_attach();h]h1iommufd_device_detach(); iommufd_device_attach();}hj sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMRhjubh)}(hIf it fails then no change is made to the attachment. The iommu driver may implement this so there is no disruption in translation. This can only be called if iommufd_device_attach() has already succeeded. **pasid** is IOMMU_NO_PASID for no pasid usage.h](hIf it fails then no change is made to the attachment. The iommu driver may implement this so there is no disruption in translation. This can only be called if iommufd_device_attach() has already succeeded. }(hjhhhNhNubj>)}(h **pasid**h]hpasid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubh& is IOMMU_NO_PASID for no pasid usage.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMUhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_device_detach (C function)c.iommufd_device_detachhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hHvoid iommufd_device_detach (struct iommufd_device *idev, ioasid_t pasid)h]jc)}(hGvoid iommufd_device_detach(struct iommufd_device *idev, ioasid_t pasid)h](j'})}(hvoidh]hvoid}(hjYhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjUhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMdubj{)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjUhhhjghMdubj)}(hiommufd_device_detachh]j)}(hiommufd_device_detachh]hiommufd_device_detach}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]hhuh1jhjUhhhjghMdubjuz)}(h-(struct iommufd_device *idev, ioasid_t pasid)h](j{z)}(hstruct iommufd_device *idevh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(hiommufd_deviceh]hiommufd_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,zj|sbc.iommufd_device_detachasbuh1hhjubj{)}(h h]h }(hjԆhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hidevh]hidev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubj{z)}(hioasid_t pasidh](h)}(hhh]j)}(hioasid_th]hioasid_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj modnameN classnameNj0zj3z)}j6z]jІc.iommufd_device_detachasbuh1hhjubj{)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hpasidh]hpasid}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubeh}(h]h ]h"]h$]h&]hhuh1jtzhjUhhhjghMdubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjQhhhjghMdubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1j\hjghMdhjNhhubj)}(hhh]h)}(h.Disconnect a device/pasid from an iommu_domainh]h.Disconnect a device/pasid from an iommu_domain}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMdhj^hhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jWhhhjyhNhNubj)}(hX<**Parameters** ``struct iommufd_device *idev`` device to detach ``ioasid_t pasid`` pasid to detach **Description** Undo iommufd_device_attach(). This disconnects the idev from the previously attached pt_id. The device returns back to a blocked DMA translation. **pasid** is IOMMU_NO_PASID for no pasid usage.h](h)}(h**Parameters**h]j>)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhhj}ubj0 )}(hhh](j5 )}(h1``struct iommufd_device *idev`` device to detach h](j; )}(h``struct iommufd_device *idev``h]jA )}(hjh]hstruct iommufd_device *idev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMehjubjW )}(hhh]h)}(hdevice to detachh]hdevice to detach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMehjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMehjubj5 )}(h#``ioasid_t pasid`` pasid to detach h](j; )}(h``ioasid_t pasid``h]jA )}(hjۇh]hioasid_t pasid}(hj݇hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjهubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMfhjՇubjW )}(hhh]h)}(hpasid to detachh]hpasid to detach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMfhjubah}(h]h ]h"]h$]h&]uh1jV hjՇubeh}(h]h ]h"]h$]h&]uh1j4 hjhMfhjubeh}(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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhhj}ubh)}(hUndo iommufd_device_attach(). This disconnects the idev from the previously attached pt_id. The device returns back to a blocked DMA translation. **pasid** is IOMMU_NO_PASID for no pasid usage.h](hUndo iommufd_device_attach(). This disconnects the idev from the previously attached pt_id. The device returns back to a blocked DMA translation. }(hj,hhhNhNubj>)}(h **pasid**h]hpasid}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj,ubh& is IOMMU_NO_PASID for no pasid usage.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMghj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_access_create (C function)c.iommufd_access_createhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hstruct iommufd_access * iommufd_access_create (struct iommufd_ctx *ictx, const struct iommufd_access_ops *ops, void *data, u32 *id)h]jc)}(hstruct iommufd_access *iommufd_access_create(struct iommufd_ctx *ictx, const struct iommufd_access_ops *ops, void *data, u32 *id)h](ji)}(hjlh]hstruct}(hjmhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjihhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMubj{)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjihhhjzhMubh)}(hhh]j)}(hiommufd_accessh]hiommufd_access}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,ziommufd_access_createsbc.iommufd_access_createasbuh1hhjihhhjzhMubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjihhhjzhMubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjihhhjzhMubj)}(hiommufd_access_createh]j)}(hjh]hiommufd_access_create}(hj̈hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȈubah}(h]h ](jjeh"]h$]h&]hhuh1jhjihhhjzhMubjuz)}(hU(struct iommufd_ctx *ictx, const struct iommufd_access_ops *ops, void *data, u32 *id)h](j{z)}(hstruct iommufd_ctx *ictxh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(h iommufd_ctxh]h iommufd_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]jc.iommufd_access_createasbuh1hhjubj{)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hictxh]hictx}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj߈ubj{z)}(h$const struct iommufd_access_ops *opsh](ji)}(hconsth]hconst}(hjWhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjSubj{)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjSubji)}(hjlh]hstruct}(hjshhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjSubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjSubh)}(hhh]j)}(hiommufd_access_opsh]hiommufd_access_ops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]jc.iommufd_access_createasbuh1hhjSubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjSubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjSubj)}(hopsh]hops}(hjʉhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj߈ubj{z)}(h void *datah](j'})}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hj߉ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj߉ubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhj߉ubj)}(hdatah]hdata}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj߉ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj߈ubj{z)}(hu32 *idh](h)}(hhh]j)}(hu32h]hu32}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj*modnameN classnameNj0zj3z)}j6z]jc.iommufd_access_createasbuh1hhj!ubj{)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj!ubjNz)}(hjh]h*}(hjThhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhj!ubj)}(hidh]hid}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj߈ubeh}(h]h ]h"]h$]h&]hhuh1jtzhjihhhjzhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjehhhjzhMubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1j\hjzhMhjbhhubj)}(hhh]h)}(hCreate an iommufd_accessh]hCreate an iommufd_access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjbhhhjzhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jWhhhjyhNhNubj)}(hX0**Parameters** ``struct iommufd_ctx *ictx`` iommufd file descriptor ``const struct iommufd_access_ops *ops`` Driver's ops to associate with the access ``void *data`` Opaque data to pass into ops functions ``u32 *id`` Output ID number to return to userspace for this access **Description** An iommufd_access allows a driver to read/write to the IOAS without using DMA. The underlying CPU memory can be accessed using the iommufd_access_pin_pages() or iommufd_access_rw() functions. The provided ops are required to use iommufd_access_pin_pages().h](h)}(h**Parameters**h]j>)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubj0 )}(hhh](j5 )}(h5``struct iommufd_ctx *ictx`` iommufd file descriptor h](j; )}(h``struct iommufd_ctx *ictx``h]jA )}(hj̊h]hstruct iommufd_ctx *ictx}(hjΊhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjʊubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjƊubjW )}(hhh]h)}(hiommufd file descriptorh]hiommufd file descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjƊubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjÊubj5 )}(hS``const struct iommufd_access_ops *ops`` Driver's ops to associate with the access h](j; )}(h(``const struct iommufd_access_ops *ops``h]jA )}(hjh]h$const struct iommufd_access_ops *ops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubjW )}(hhh]h)}(h)Driver's ops to associate with the accessh]h+Driver’s ops to associate with the access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjÊubj5 )}(h6``void *data`` Opaque data to pass into ops functions h](j; )}(h``void *data``h]jA )}(hj>h]h void *data}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj<ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj8ubjW )}(hhh]h)}(h&Opaque data to pass into ops functionsh]h&Opaque data to pass into ops functions}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjTubah}(h]h ]h"]h$]h&]uh1jV hj8ubeh}(h]h ]h"]h$]h&]uh1j4 hjShMhjÊubj5 )}(hD``u32 *id`` Output ID number to return to userspace for this access h](j; )}(h ``u32 *id``h]jA )}(hjwh]hu32 *id}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjuubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjqubjW )}(hhh]h)}(h7Output ID number to return to userspace for this accessh]h7Output ID number to return to userspace for this access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjqubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjÊubeh}(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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubh)}(hAn iommufd_access allows a driver to read/write to the IOAS without using DMA. The underlying CPU memory can be accessed using the iommufd_access_pin_pages() or iommufd_access_rw() functions.h]hAn iommufd_access allows a driver to read/write to the IOAS without using DMA. The underlying CPU memory can be accessed using the iommufd_access_pin_pages() or iommufd_access_rw() functions.}(hjȋhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubh)}(h@The provided ops are required to use iommufd_access_pin_pages().h]h@The provided ops are required to use iommufd_access_pin_pages().}(hj׋hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS#iommufd_access_destroy (C function)c.iommufd_access_destroyhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h;void iommufd_access_destroy (struct iommufd_access *access)h]jc)}(h:void iommufd_access_destroy(struct iommufd_access *access)h](j'})}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhM ubj)}(hiommufd_access_destroyh]j)}(hiommufd_access_destroyh]hiommufd_access_destroy}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM ubjuz)}(h(struct iommufd_access *access)h]j{z)}(hstruct iommufd_access *accessh](ji)}(hjlh]hstruct}(hjChhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj?ubj{)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj?ubh)}(hhh]j)}(hiommufd_accessh]hiommufd_access}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjcmodnameN classnameNj0zj3z)}j6z]j9z)}j,zj)sbc.iommufd_access_destroyasbuh1hhj?ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj?ubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhj?ubj)}(haccessh]haccess}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhj;ubah}(h]h ]h"]h$]h&]hhuh1jtzhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhM hjhhubj)}(hhh]h)}(hDestroy an iommufd_accessh]hDestroy an iommufd_access}(hjƌhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM hjÌhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjތjjތjjjuh1jWhhhjyhNhNubj)}(h**Parameters** ``struct iommufd_access *access`` The access to destroy **Description** The caller must stop using the access before destroying it.h](h)}(h**Parameters**h]j>)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubj0 )}(hhh]j5 )}(h8``struct iommufd_access *access`` The access to destroy h](j; )}(h!``struct iommufd_access *access``h]jA )}(hjh]hstruct iommufd_access *access}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM hjubjW )}(hhh]h)}(hThe access to destroyh]hThe access to destroy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM hjubah}(h]h ]h"]h$]h&]uh1j/ hjubh)}(h**Description**h]j>)}(hjBh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj@ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubh)}(h;The caller must stop using the access before destroying it.h]h;The caller must stop using the access before destroying it.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS'iommufd_access_unpin_pages (C function)c.iommufd_access_unpin_pageshNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hivoid iommufd_access_unpin_pages (struct iommufd_access *access, unsigned long iova, unsigned long length)h]jc)}(hhvoid iommufd_access_unpin_pages(struct iommufd_access *access, unsigned long iova, unsigned long length)h](j'})}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMyubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhMyubj)}(hiommufd_access_unpin_pagesh]j)}(hiommufd_access_unpin_pagesh]hiommufd_access_unpin_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMyubjuz)}(hI(struct iommufd_access *access, unsigned long iova, unsigned long length)h](j{z)}(hstruct iommufd_access *accessh](ji)}(hjlh]hstruct}(hjčhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjэhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(hiommufd_accessh]hiommufd_access}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߍubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,zjsbc.iommufd_access_unpin_pagesasbuh1hhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(haccessh]haccess}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubj{z)}(hunsigned long iovah](j'})}(hunsignedh]hunsigned}(hj6hhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hj2ubj{)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj2ubj'})}(hlongh]hlong}(hjRhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hj2ubj{)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj2ubj)}(hiovah]hiova}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubj{z)}(hunsigned long lengthh](j'})}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj'})}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hlengthh]hlength}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubeh}(h]h ]h"]h$]h&]hhuh1jtzhjhhhjhMyubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhMyubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1j\hjhMyhj|hhubj)}(hhh]h)}(hUndo iommufd_access_pin_pagesh]hUndo iommufd_access_pin_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMyhjhhubah}(h]h ]h"]h$]h&]uh1jhj|hhhjhMyubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jWhhhjyhNhNubj)}(hXQ**Parameters** ``struct iommufd_access *access`` IOAS access to act on ``unsigned long iova`` Starting IOVA ``unsigned long length`` Number of bytes to access **Description** Return the struct page's. The caller must stop accessing them before calling this. The iova/length must exactly match the one provided to access_pages.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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM}hjubj0 )}(hhh](j5 )}(h8``struct iommufd_access *access`` IOAS access to act on h](j; )}(h!``struct iommufd_access *access``h]jA )}(hj*h]hstruct iommufd_access *access}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj(ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMzhj$ubjW )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMzhj@ubah}(h]h ]h"]h$]h&]uh1jV hj$ubeh}(h]h ]h"]h$]h&]uh1j4 hj?hMzhj!ubj5 )}(h%``unsigned long iova`` Starting IOVA h](j; )}(h``unsigned long iova``h]jA )}(hjch]hunsigned long iova}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjaubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM{hj]ubjW )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhM{hjyubah}(h]h ]h"]h$]h&]uh1jV hj]ubeh}(h]h ]h"]h$]h&]uh1j4 hjxhM{hj!ubj5 )}(h3``unsigned long length`` Number of bytes to access h](j; )}(h``unsigned long length``h]jA )}(hjh]hunsigned long length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM|hjubjW )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM|hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM|hj!ubeh}(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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM~hjubh)}(hReturn the struct page's. The caller must stop accessing them before calling this. The iova/length must exactly match the one provided to access_pages.h]hReturn the struct page’s. The caller must stop accessing them before calling this. The iova/length must exactly match the one provided to access_pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM}hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS%iommufd_access_pin_pages (C function)c.iommufd_access_pin_pageshNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hint iommufd_access_pin_pages (struct iommufd_access *access, unsigned long iova, unsigned long length, struct page **out_pages, unsigned int flags)h]jc)}(hint iommufd_access_pin_pages(struct iommufd_access *access, unsigned long iova, unsigned long length, struct page **out_pages, unsigned int flags)h](j'})}(hinth]hint}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMubj{)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhj*hMubj)}(hiommufd_access_pin_pagesh]j)}(hiommufd_access_pin_pagesh]hiommufd_access_pin_pages}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj*hMubjuz)}(hv(struct iommufd_access *access, unsigned long iova, unsigned long length, struct page **out_pages, unsigned int flags)h](j{z)}(hstruct iommufd_access *accessh](ji)}(hjlh]hstruct}(hjYhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjUubj{)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjUubh)}(hhh]j)}(hiommufd_accessh]hiommufd_access}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjymodnameN classnameNj0zj3z)}j6z]j9z)}j,zj?sbc.iommufd_access_pin_pagesasbuh1hhjUubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjUubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjUubj)}(haccessh]haccess}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjQubj{z)}(hunsigned long iovah](j'})}(hunsignedh]hunsigned}(hjːhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjǐubj{)}(h h]h }(hjِhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjǐubj'})}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjǐubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjǐubj)}(hiovah]hiova}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǐubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjQubj{z)}(hunsigned long lengthh](j'})}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj'})}(hlongh]hlong}(hj8hhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hlengthh]hlength}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjQubj{z)}(hstruct page **out_pagesh](ji)}(hjlh]hstruct}(hjmhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjiubj{)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjiubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]jc.iommufd_access_pin_pagesasbuh1hhjiubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjiubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjiubjNz)}(hjh]h*}(hjđhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjiubj)}(h out_pagesh]h out_pages}(hjёhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjQubj{z)}(hunsigned int flagsh](j'})}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj'})}(hinth]hint}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hflagsh]hflags}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjQubeh}(h]h ]h"]h$]h&]hhuh1jtzhjhhhj*hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhj*hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hj*hMhjhhubj)}(hhh]h)}(h%Return a list of pages under the iovah]h%Return a list of pages under the iova}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjIhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjdjjdjjjuh1jWhhhjyhNhNubj)}(hX**Parameters** ``struct iommufd_access *access`` IOAS access to act on ``unsigned long iova`` Starting IOVA ``unsigned long length`` Number of bytes to access ``struct page **out_pages`` Output page list ``unsigned int flags`` IOPMMUFD_ACCESS_RW_* flags **Description** Reads **length** bytes starting at iova and returns the struct page * pointers. These can be kmap'd by the caller for CPU access. The caller must perform iommufd_access_unpin_pages() when done to balance this. This API always requires a page aligned iova. This happens naturally if the ioas alignment is >= PAGE_SIZE and the iova is PAGE_SIZE aligned. However smaller alignments have corner cases where this API can fail on otherwise aligned iova.h](h)}(h**Parameters**h]j>)}(hjnh]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjlubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhubj0 )}(hhh](j5 )}(h8``struct iommufd_access *access`` IOAS access to act on h](j; )}(h!``struct iommufd_access *access``h]jA )}(hjh]hstruct iommufd_access *access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubjW )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h%``unsigned long iova`` Starting IOVA h](j; )}(h``unsigned long iova``h]jA )}(hjƒh]hunsigned long iova}(hjȒhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjĒubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubjW )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hjߒhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjےhMhjܒubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjےhMhjubj5 )}(h3``unsigned long length`` Number of bytes to access h](j; )}(h``unsigned long length``h]jA )}(hjh]hunsigned long length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjubjW )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubj5 )}(h-``struct page **out_pages`` Output page list h](j; )}(h``struct page **out_pages``h]jA )}(hj8h]hstruct page **out_pages}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj6ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj2ubjW )}(hhh]h)}(hOutput page listh]hOutput page list}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1jV hj2ubeh}(h]h ]h"]h$]h&]uh1j4 hjMhMhjubj5 )}(h2``unsigned int flags`` IOPMMUFD_ACCESS_RW_* flags h](j; )}(h``unsigned int flags``h]jA )}(hjqh]hunsigned int flags}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjoubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjkubjW )}(hhh]h)}(hIOPMMUFD_ACCESS_RW_* flagsh]hIOPMMUFD_ACCESS_RW_* flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjkubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j/ hjhubh)}(h**Description**h]j>)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhubh)}(hReads **length** bytes starting at iova and returns the struct page * pointers. These can be kmap'd by the caller for CPU access.h](hReads }(hj“hhhNhNubj>)}(h **length**h]hlength}(hjʓhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj“ubhs bytes starting at iova and returns the struct page * pointers. These can be kmap’d by the caller for CPU access.}(hj“hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhubh)}(hOThe caller must perform iommufd_access_unpin_pages() when done to balance this.h]hOThe caller must perform iommufd_access_unpin_pages() when done to balance this.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhubh)}(hThis API always requires a page aligned iova. This happens naturally if the ioas alignment is >= PAGE_SIZE and the iova is PAGE_SIZE aligned. However smaller alignments have corner cases where this API can fail on otherwise aligned iova.h]hThis API always requires a page aligned iova. This happens naturally if the ioas alignment is >= PAGE_SIZE and the iova is PAGE_SIZE aligned. However smaller alignments have corner cases where this API can fail on otherwise aligned iova.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_access_rw (C function)c.iommufd_access_rwhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(hxint iommufd_access_rw (struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h]jc)}(hwint iommufd_access_rw(struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h](j'})}(hinth]hint}(hj!hhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMubj{)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhj/hMubj)}(hiommufd_access_rwh]j)}(hiommufd_access_rwh]hiommufd_access_rw}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj/hMubjuz)}(hb(struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h](j{z)}(hstruct iommufd_access *accessh](ji)}(hjlh]hstruct}(hj^hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjZubj{)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjZubh)}(hhh]j)}(hiommufd_accessh]hiommufd_access}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj~modnameN classnameNj0zj3z)}j6z]j9z)}j,zjDsbc.iommufd_access_rwasbuh1hhjZubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjZubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjZubj)}(haccessh]haccess}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjVubj{z)}(hunsigned long iovah](j'})}(hunsignedh]hunsigned}(hjДhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hj̔ubj{)}(h h]h }(hjޔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj̔ubj'})}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hj̔ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj̔ubj)}(hiovah]hiova}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̔ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjVubj{z)}(h void *datah](j'})}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hdatah]hdata}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjVubj{z)}(h size_t lengthh](h)}(hhh]j)}(hsize_th]hsize_t}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjhmodnameN classnameNj0zj3z)}j6z]jc.iommufd_access_rwasbuh1hhj_ubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhj_ubj)}(hlengthh]hlength}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjVubj{z)}(hunsigned int flagsh](j'})}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj'})}(hinth]hint}(hjǕhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjubj{)}(h h]h }(hjՕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjVubeh}(h]h ]h"]h$]h&]hhuh1jtzhjhhhj/hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhj/hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hj/hMhjhhubj)}(hhh]h)}(h!Read or write data under the iovah]h!Read or write data under the iova}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jWhhhjyhNhNubj)}(hX**Parameters** ``struct iommufd_access *access`` IOAS access to act on ``unsigned long iova`` Starting IOVA ``void *data`` Kernel buffer to copy to/from ``size_t length`` Number of bytes to access ``unsigned int flags`` IOMMUFD_ACCESS_RW_* flags **Description** Copy kernel to/from data into the range given by IOVA/length. If flags indicates IOMMUFD_ACCESS_RW_KTHREAD then a large copy can be optimized by changing it into copy_to/from_user().h](h)}(h**Parameters**h]j>)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj-ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM"hj)ubj0 )}(hhh](j5 )}(h8``struct iommufd_access *access`` IOAS access to act on h](j; )}(h!``struct iommufd_access *access``h]jA )}(hjNh]hstruct iommufd_access *access}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjLubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chMhjHubjW )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1jV hjHubeh}(h]h ]h"]h$]h&]uh1j4 hjchMhjEubj5 )}(h%``unsigned long iova`` Starting IOVA h](j; )}(h``unsigned long iova``h]jA )}(hjh]hunsigned long iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM hjubjW )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM hjEubj5 )}(h-``void *data`` Kernel buffer to copy to/from h](j; )}(h``void *data``h]jA )}(hjh]h void *data}(hj–hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM!hjubjW )}(hhh]h)}(hKernel buffer to copy to/fromh]hKernel buffer to copy to/from}(hjٖhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjՖhM!hj֖ubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjՖhM!hjEubj5 )}(h,``size_t length`` Number of bytes to access h](j; )}(h``size_t length``h]jA )}(hjh]h size_t length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM"hjubjW )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhM"hjEubj5 )}(h1``unsigned int flags`` IOMMUFD_ACCESS_RW_* flags h](j; )}(h``unsigned int flags``h]jA )}(hj2h]hunsigned int flags}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hj0ubah}(h]h ]h"]h$]h&]uh1j: he/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM#hj,ubjW )}(hhh]h)}(hIOMMUFD_ACCESS_RW_* flagsh]hIOMMUFD_ACCESS_RW_* flags}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhM#hjHubah}(h]h ]h"]h$]h&]uh1jV hj,ubeh}(h]h ]h"]h$]h&]uh1j4 hjGhM#hjEubeh}(h]h ]h"]h$]h&]uh1j/ hj)ubh)}(h**Description**h]j>)}(hjmh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjkubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM%hj)ubh)}(hCopy kernel to/from data into the range given by IOVA/length. If flags indicates IOMMUFD_ACCESS_RW_KTHREAD then a large copy can be optimized by changing it into copy_to/from_user().h]hCopy kernel to/from data into the range given by IOVA/length. If flags indicates IOMMUFD_ACCESS_RW_KTHREAD then a large copy can be optimized by changing it into copy_to/from_user().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:345: ./drivers/iommu/iommufd/device.chM$hj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_ctx_get (C function)c.iommufd_ctx_gethNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h/void iommufd_ctx_get (struct iommufd_ctx *ictx)h]jc)}(h.void iommufd_ctx_get(struct iommufd_ctx *ictx)h](j'})}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhMubj)}(hiommufd_ctx_geth]j)}(hiommufd_ctx_geth]hiommufd_ctx_get}(hjӗhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjϗubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubjuz)}(h(struct iommufd_ctx *ictx)h]j{z)}(hstruct iommufd_ctx *ictxh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(h iommufd_ctxh]h iommufd_ctx}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,zj՗sbc.iommufd_ctx_getasbuh1hhjubj{)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hictxh]hictx}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubah}(h]h ]h"]h$]h&]hhuh1jtzhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhMhjhhubj)}(hhh]h)}(hGet a context referenceh]hGet a context reference}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjohhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jWhhhjyhNhNubj)}(h**Parameters** ``struct iommufd_ctx *ictx`` Context to get **Description** The caller must already hold a valid reference to ictx.h](h)}(h**Parameters**h]j>)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubj0 )}(hhh]j5 )}(h,``struct iommufd_ctx *ictx`` Context to get h](j; )}(h``struct iommufd_ctx *ictx``h]jA )}(hjh]hstruct iommufd_ctx *ictx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubjW )}(hhh]h)}(hContext to geth]hContext to get}(hj̘hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjȘhMhjɘubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjȘhMhjubah}(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&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubh)}(h7The caller must already hold a valid reference to ictx.h]h7The caller must already hold a valid reference to ictx.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS"iommufd_ctx_from_file (C function)c.iommufd_ctx_from_filehNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h>struct iommufd_ctx * iommufd_ctx_from_file (struct file *file)h]jc)}(h)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjJubj0 )}(hhh]j5 )}(h8``struct file *file`` File to obtain the reference from h](j; )}(h``struct file *file``h]jA )}(hjoh]hstruct file *file}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjmubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjiubjW )}(hhh]h)}(h!File to obtain the reference fromh]h!File to obtain the reference from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjiubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjfubah}(h]h ]h"]h$]h&]uh1j/ hjJubh)}(h**Description**h]j>)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjJubh)}(hReturns a pointer to the iommufd_ctx, otherwise ERR_PTR. The struct file remains owned by the caller and the caller must still do fput. On success the caller is responsible to call iommufd_ctx_put().h]hReturns a pointer to the iommufd_ctx, otherwise ERR_PTR. The struct file remains owned by the caller and the caller must still do fput. On success the caller is responsible to call iommufd_ctx_put().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjJubeh}(h]h ] kernelindentaJh"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jS iommufd_ctx_from_fd (C function)c.iommufd_ctx_from_fdhNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h1struct iommufd_ctx * iommufd_ctx_from_fd (int fd)h]jc)}(h/struct iommufd_ctx *iommufd_ctx_from_fd(int fd)h](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhMubh)}(hhh]j)}(h iommufd_ctxh]h iommufd_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetjmodnameN classnameNj0zj3z)}j6z]j9z)}j,ziommufd_ctx_from_fdsbc.iommufd_ctx_from_fdasbuh1hhjhhhjhMubj{)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjhhhjhMubjNz)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjhhhjhMubj)}(hiommufd_ctx_from_fdh]j)}(hj,h]hiommufd_ctx_from_fd}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubjuz)}(h(int fd)h]j{z)}(hint fdh](j'})}(hinth]hint}(hjihhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjeubj{)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjeubj)}(hfdh]hfd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjaubah}(h]h ]h"]h$]h&]hhuh1jtzhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j\hjhMhjhhubj)}(hhh]h)}(h+Acquires a reference to the iommufd contexth]h+Acquires a reference to the iommufd context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjǛjjǛjjjuh1jWhhhjyhNhNubj)}(h**Parameters** ``int fd`` File descriptor to obtain the reference from **Description** Returns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success the caller is responsible to call iommufd_ctx_put().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&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhj˛ubj0 )}(hhh]j5 )}(h8``int fd`` File descriptor to obtain the reference from h](j; )}(h ``int fd``h]jA )}(hjh]hint fd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubjW )}(hhh]h)}(h,File descriptor to obtain the reference fromh]h,File descriptor to obtain the reference from}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jV hjubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjubah}(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&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhj˛ubh)}(hxReturns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success the caller is responsible to call iommufd_ctx_put().h]hxReturns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success the caller is responsible to call iommufd_ctx_put().}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhj˛ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubjG)}(hhh]h}(h]h ]h"]h$]h&]entries](jSiommufd_ctx_put (C function)c.iommufd_ctx_puthNtauh1jFhjyhhhNhNubjX)}(hhh](j])}(h/void iommufd_ctx_put (struct iommufd_ctx *ictx)h]jc)}(h.void iommufd_ctx_put(struct iommufd_ctx *ictx)h](j'})}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]j3}ah"]h$]h&]uh1j&}hjlhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjlhhhj~hMubj)}(hiommufd_ctx_puth]j)}(hiommufd_ctx_puth]hiommufd_ctx_put}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjlhhhj~hMubjuz)}(h(struct iommufd_ctx *ictx)h]j{z)}(hstruct iommufd_ctx *ictxh](ji)}(hjlh]hstruct}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubh)}(hhh]j)}(h iommufd_ctxh]h iommufd_ctx}(hj˜hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȜubah}(h]h ]h"]h$]h&] refdomainjreftypej,z reftargetj͜modnameN classnameNj0zj3z)}j6z]j9z)}j,zjsbc.iommufd_ctx_putasbuh1hhjubj{)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jzhjubjNz)}(hjh]h*}(hjhhhNhNubah}(h]h ]jYzah"]h$]h&]uh1jMzhjubj)}(hictxh]hictx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jzzhjubah}(h]h ]h"]h$]h&]hhuh1jtzhjlhhhj~hMubeh}(h]h ]h"]h$]h&]hhjuh1jbjjhjhhhhj~hMubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1j\hj~hMhjehhubj)}(hhh]h)}(hPut back a referenceh]hPut back a reference}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhj-hhubah}(h]h ]h"]h$]h&]uh1jhjehhhj~hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjHjjHjjjuh1jWhhhjyhNhNubj)}(hB**Parameters** ``struct iommufd_ctx *ictx`` Context to put backh](h)}(h**Parameters**h]j>)}(hjRh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjPubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjLubj0 )}(hhh]j5 )}(h0``struct iommufd_ctx *ictx`` Context to put backh](j; )}(h``struct iommufd_ctx *ictx``h]jA )}(hjqh]hstruct iommufd_ctx *ictx}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j@ hjoubah}(h]h ]h"]h$]h&]uh1j: hc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjkubjW )}(hhh]h)}(hContext to put backh]hContext to put back}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:348: ./drivers/iommu/iommufd/main.chMhjubah}(h]h ]h"]h$]h&]uh1jV hjkubeh}(h]h ]h"]h$]h&]uh1j4 hjhMhjhubah}(h]h ]h"]h$]h&]uh1j/ hjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjyhhhNhNubh)}(hhh](h)}(hVFIO and IOMMUFDh]hVFIO and IOMMUFD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM`ubh)}(hj>j@j@jFBjKBj4Cj9CjSGjXGj.Ij3Ij JjJjLjLjNj NjNjNjQjQj}RjRjUjUjVjVjTXjYXj&[j+[j=\jB\j]j]jZ_j__j`j`j5bj:bj-ej2ej@gjEgjhjhjijijmjmjnjnj#pj(pjRqjWqjujujvjvjjyjyjyj}j}jFjKjǀj̀jjjLjQj`jejjjzjjjjjjjj&j+jjjcjhj jjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages](hsystem_message)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineMsourcec/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.huh1jhjkubj)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejlineMsourcec/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.huh1jhj@lubj)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejlineMsourcejuh1jhjlubj)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjڟhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjןubah}(h]h ]h"]h$]h&]levelKtypejlineM'sourcec/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:335: ./include/uapi/linux/iommufd.huh1jhjuubetransform_messages]j)}(hhh]h)}(hhh]h:Hyperlink target "general-ioctl-format" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcej8lineKuh1juba transformerN include_log] decorationNhhub.