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]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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hOverviewh]hOverview}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hhhhhK 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).}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj9hhubh)}(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.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj9hhubh)}(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.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj9hhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h Key Conceptsh]h Key Concepts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hhhhhKubh)}(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" primarly 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" primarly 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” primarly 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.}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(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.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhj/ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXoIOMMUFD_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 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 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:}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjGubj)}(hhh](j)}(hGSecurity namespace for guest owned ID, e.g. guest-controlled cache tagsh]h)}(hj^h]hGSecurity namespace for guest owned ID, e.g. guest-controlled cache tags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhj\ubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(hENon-device-affiliated event reporting, e.g. invalidation queue errorsh]h)}(hjuh]hENon-device-affiliated event reporting, e.g. invalidation queue errors}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjsubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(hDAccess to a sharable nesting parent pagetable across physical IOMMUsh]h)}(hjh]hDAccess to a sharable nesting parent pagetable across physical IOMMUs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(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&]uh1jhjYubj)}(h(Delivery of paravirtualized invalidationh]h)}(hjh]h(Delivery of paravirtualized invalidation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(h#Direct assigned invalidation queuesh]h)}(hjh]h#Direct assigned invalidation queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(hDirect assigned interrupts h]h)}(hDirect assigned interruptsh]hDirect assigned interrupts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKMhjGubh)}(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&]uh1hhhhKUhjGubhnote)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(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.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhj4ubah}(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.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjLubah}(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.}(hjkhhhNhNubah}(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:}(hjyhhhNhNubah}(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&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(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.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(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.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjMubah}(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.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjeubah}(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&]uh1hhhhMhjhhubeh}(h]user-visible-objectsah ]h"]user visible objectsah$]h&]uh1hhj|hhhhhKubh)}(hhh](h)}(hKernel Datastructureh]hKernel Datastructure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hh]h7ENOTTY: The IOCTL number itself is not supported at all}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj<ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjTubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjmubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]jjjuh1jhjMhKhj5ubah}(h]h ]h"]h$]h&]uh1j3hjMhKhjhhubh)}(h5As well as additional errnos, within specific ioctls.h]h5As well as additional errnos, within specific ioctls.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK!hjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleiommu_destroy (C struct)c.iommu_destroyhNtauh1jhjhhhjhNubhdesc)}(hhh](hdesc_signature)}(h iommu_destroyh]hdesc_signature_line)}(hstruct iommu_destroyh](hdesc_sig_keyword)}(hstructh]hstruct}(hj'hhhNhNubah}(h]h ]kah"]h$]h&]uh1j%hj!hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK%ubhdesc_sig_space)}(h h]h }(hj9hhhNhNubah}(h]h ]wah"]h$]h&]uh1j7hj!hhhj6hK%ubh desc_name)}(h iommu_destroyh]h desc_sig_name)}(hjh]h iommu_destroy}(hjPhhhNhNubah}(h]h ]nah"]h$]h&]uh1jNhjJubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jHhj!hhhj6hK%ubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhjhhhj6hK%ubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj6hK%hjhhubh 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:323: ./include/uapi/linux/iommufd.hhK>hj|hhubah}(h]h ]h"]h$]h&]uh1jzhjhhhj6hK%ubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhjhNubh 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&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKBhjubj)}(h7struct iommu_destroy { __u32 size; __u32 id; };h]h7struct iommu_destroy { __u32 size; __u32 id; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKDhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKIhjubhdefinition_list)}(hhh](hdefinition_list_item)}(h&``size`` sizeof(struct iommu_destroy) h](hterm)}(h``size``h]hliteral)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK@hjubh definition)}(hhh]h)}(hsizeof(struct iommu_destroy)h]hsizeof(struct iommu_destroy)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK@hj ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj hK@hjubj)}(hH``id`` iommufd object ID to destroy. Can be any destroyable object type.h](j)}(h``id``h]j)}(hj8 h]hid}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK@hj2 ubj )}(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.}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKAhjN ubah}(h]h ]h"]h$]h&]uh1j hj2 ubeh}(h]h ]h"]h$]h&]uh1jhjM hK@hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj{ h]h Description}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKDhjhhubh)}(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:323: ./include/uapi/linux/iommufd.hhKBhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_ioas_alloc (C struct)c.iommu_ioas_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_alloch]j )}(hstruct iommu_ioas_alloch](j&)}(hj)h]hstruct}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKGubj8)}(h h]h }(hj hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj hhhj hKGubjI)}(hiommu_ioas_alloch]jO)}(hj h]hiommu_ioas_alloc}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj hhhj hKGubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj hhhj hKGubah}(h]j ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj hKGhj 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:323: ./include/uapi/linux/iommufd.hhKKhj hhubah}(h]h ]h"]h$]h&]uh1jzhj hhhj hKGubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1jhhhjhjhNubj)}(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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKOhj 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; };}hj8 sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKQhj ubh)}(h **Members**h]j)}(hjI h]hMembers}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKWhj ubj)}(hhh](j)}(h)``size`` sizeof(struct iommu_ioas_alloc) h](j)}(h``size``h]j)}(hjh h]hsize}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKMhjb ubj )}(hhh]h)}(hsizeof(struct iommu_ioas_alloc)h]hsizeof(struct iommu_ioas_alloc)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj} hKMhj~ ubah}(h]h ]h"]h$]h&]uh1j hjb ubeh}(h]h ]h"]h$]h&]uh1jhj} hKMhj_ ubj)}(h``flags`` Must be 0 h](j)}(h ``flags``h]j)}(hj h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKNhj ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKNhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKNhj_ ubj)}(h7``out_ioas_id`` Output IOAS ID for the allocated objecth](j)}(h``out_ioas_id``h]j)}(hj h]h out_ioas_id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKNhj ubj )}(hhh]h)}(h'Output IOAS ID for the allocated objecth]h'Output IOAS ID for the allocated object}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKOhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKNhj_ ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKRhjhhubh)}(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.}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKPhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_iova_range (C struct)c.iommu_iova_rangehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_iova_rangeh]j )}(hstruct iommu_iova_rangeh](j&)}(hj)h]hstruct}(hj[ hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjW hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKVubj8)}(h h]h }(hji hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjW hhhjh hKVubjI)}(hiommu_iova_rangeh]jO)}(hjU h]hiommu_iova_range}(hj{ hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjw ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjW hhhjh hKVubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjS hhhjh hKVubah}(h]jN ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjh hKVhjP 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:323: ./include/uapi/linux/iommufd.hhK[hj hhubah}(h]h ]h"]h$]h&]uh1jzhjP hhhjh hKVubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1jhhhjhjhNubj)}(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&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK_hj 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:323: ./include/uapi/linux/iommufd.hhKahj ubh)}(h **Members**h]j)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKfhj ubj)}(hhh](j)}(h``start`` First IOVA h](j)}(h ``start``h]j)}(hj h]hstart}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK]hj ubj )}(hhh]h)}(h First IOVAh]h First IOVA}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK]hj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj hK]hj ubj)}(h``last`` Inclusive last IOVAh](j)}(h``last``h]j)}(hjC h]hlast}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhK]hj= ubj )}(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:323: ./include/uapi/linux/iommufd.hhK^hjY ubah}(h]h ]h"]h$]h&]uh1j hj= ubeh}(h]h ]h"]h$]h&]uh1jhjX hK]hj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKahjhhubh)}(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:323: ./include/uapi/linux/iommufd.hhK_hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!iommu_ioas_iova_ranges (C struct)c.iommu_ioas_iova_rangeshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_iova_rangesh]j )}(hstruct iommu_ioas_iova_rangesh](j&)}(hj)h]hstruct}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKdubj8)}(h h]h }(hj hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj hhhj hKdubjI)}(hiommu_ioas_iova_rangesh]jO)}(hj h]hiommu_ioas_iova_ranges}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj hhhj hKdubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj hhhj hKdubah}(h]j ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj hKdhj hhubj{)}(hhh]h)}(hioctl(IOMMU_IOAS_IOVA_RANGES)h]hioctl(IOMMU_IOAS_IOVA_RANGES)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKghj hhubah}(h]h ]h"]h$]h&]uh1jzhj hhhj hKdubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1jhhhjhjhNubj)}(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}(hj* hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj& ubh:}(hj& hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKkhj" 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; };}hjC sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKmhj" ubh)}(h **Members**h]j)}(hjT h]hMembers}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKvhj" ubj)}(hhh](j)}(h/``size`` sizeof(struct iommu_ioas_iova_ranges) h](j)}(h``size``h]j)}(hjs h]hsize}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKihjm ubj )}(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 hKihj ubah}(h]h ]h"]h$]h&]uh1j hjm ubeh}(h]h ]h"]h$]h&]uh1jhj hKihjj ubj)}(h(``ioas_id`` IOAS ID to read ranges from h](j)}(h ``ioas_id``h]j)}(hj h]hioas_id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKjhj ubj )}(hhh]h)}(hIOAS ID to read ranges fromh]hIOAS ID to read ranges from}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKjhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKjhjj ubj)}(h>``num_iovas`` Input/Output total number of ranges in the IOAS h](j)}(h ``num_iovas``h]j)}(hj h]h num_iovas}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKkhj ubj )}(hhh]h)}(h/Input/Output total number of ranges in the IOASh]h/Input/Output total number of ranges in the IOAS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKkhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKkhjj ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hjh]h __reserved}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKlhjubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKlhj4ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj3hKlhjj ubj)}(hI``allowed_iovas`` Pointer to the output array of struct iommu_iova_range h](j)}(h``allowed_iovas``h]j)}(hjWh]h allowed_iovas}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKmhjQubj )}(hhh]h)}(h6Pointer to the output array of struct iommu_iova_rangeh]h6Pointer to the output array of struct iommu_iova_range}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKmhjmubah}(h]h ]h"]h$]h&]uh1j hjQubeh}(h]h ]h"]h$]h&]uh1jhjlhKmhjj ubj)}(hB``out_iova_alignment`` Minimum alignment required for mapping IOVAh](j)}(h``out_iova_alignment``h]j)}(hjh]hout_iova_alignment}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKmhjubj )}(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:323: ./include/uapi/linux/iommufd.hhKnhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKmhjj ubeh}(h]h ]h"]h$]h&]uh1jhj" ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKqhjhhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKohjhhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKshjhhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKzhjhhubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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}hj%sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!iommu_ioas_allow_iovas (C struct)c.iommu_ioas_allow_iovashNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_allow_iovash]j )}(hstruct iommu_ioas_allow_iovash](j&)}(hj)h]hstruct}(hj\hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjXhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKubj8)}(h h]h }(hjjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjXhhhjihKubjI)}(hiommu_ioas_allow_iovash]jO)}(hjVh]hiommu_ioas_allow_iovas}(hj|hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjxubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjXhhhjihKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjThhhjihKubah}(h]jOah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjihKhjQhhubj{)}(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:323: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jzhjQhhhjihKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(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&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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:323: ./include/uapi/linux/iommufd.hhKhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj)}(hhh](j)}(h/``size`` sizeof(struct iommu_ioas_allow_iovas) h](j)}(h``size``h]j)}(hj h]hsize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h%sizeof(struct iommu_ioas_allow_iovas)h]h%sizeof(struct iommu_ioas_allow_iovas)}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj!ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubj)}(h(``ioas_id`` IOAS ID to allow IOVAs from h](j)}(h ``ioas_id``h]j)}(hjDh]hioas_id}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj>ubj )}(hhh]h)}(hIOAS ID to allow IOVAs fromh]hIOAS ID to allow IOVAs from}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhKhjZubah}(h]h ]h"]h$]h&]uh1j hj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhKhjubj)}(h>``num_iovas`` Input/Output total number of ranges in the IOAS h](j)}(h ``num_iovas``h]j)}(hj}h]h num_iovas}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjwubj )}(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&]uh1j hjwubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hjh]h __reserved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h=``allowed_iovas`` Pointer to array of struct iommu_iova_rangeh](j)}(h``allowed_iovas``h]j)}(hjh]h allowed_iovas}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h+Pointer to array of struct iommu_iova_rangeh]h+Pointer to array of struct iommu_iova_range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommufd_ioas_map_flags (C enum)c.iommufd_ioas_map_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_ioas_map_flagsh]j )}(henum iommufd_ioas_map_flagsh](j&)}(henumh]henum}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhKubjI)}(hiommufd_ioas_map_flagsh]jO)}(hjh]hiommufd_ioas_map_flags}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhKubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhKhjhhubj{)}(hhh]h)}(hFlags for map and copyh]hFlags for map and copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhKubeh}(h]h ](jenumeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(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)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj)}(hhh](j)}(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]j)}(hj!h]hIOMMU_IOAS_MAP_FIXED_IOVA}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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:323: ./include/uapi/linux/iommufd.hhKhj7ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj6hKhjubj)}(hE``IOMMU_IOAS_MAP_WRITEABLE`` DMA is allowed to write to this mapping h](j)}(h``IOMMU_IOAS_MAP_WRITEABLE``h]j)}(hj[h]hIOMMU_IOAS_MAP_WRITEABLE}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjUubj )}(hhh]h)}(h'DMA is allowed to write to this mappingh]h'DMA is allowed to write to this mapping}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphKhjqubah}(h]h ]h"]h$]h&]uh1j hjUubeh}(h]h ]h"]h$]h&]uh1jhjphKhjubj)}(hD``IOMMU_IOAS_MAP_READABLE`` DMA is allowed to read from this mappingh](j)}(h``IOMMU_IOAS_MAP_READABLE``h]j)}(hjh]hIOMMU_IOAS_MAP_READABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_ioas_map (C struct)c.iommu_ioas_maphNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_maph]j )}(hstruct iommu_ioas_maph](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhKubjI)}(hiommu_ioas_maph]jO)}(hjh]hiommu_ioas_map}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhKubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhKhjhhubj{)}(hhh]h)}(hioctl(IOMMU_IOAS_MAP)h]hioctl(IOMMU_IOAS_MAP)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj-hhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjHjjHjjjuh1jhhhjhjhNubj)}(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}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh:}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjLubj)}(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; };}hjmsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjLubh)}(h **Members**h]j)}(hj~h]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjLubj)}(hhh](j)}(h'``size`` sizeof(struct iommu_ioas_map) h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h5``flags`` Combination of enum iommufd_ioas_map_flags h](j)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h*Combination of enum iommufd_ioas_map_flagsh]h*Combination of enum iommufd_ioas_map_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h-``ioas_id`` IOAS ID to change the mapping of h](j)}(h ``ioas_id``h]j)}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj ubj )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj%ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhjubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hjHh]h __reserved}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjBubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hKhj^ubah}(h]h ]h"]h$]h&]uh1j hjBubeh}(h]h ]h"]h$]h&]uh1jhj]hKhjubj)}(h4``user_va`` Userspace pointer to start mapping from h](j)}(h ``user_va``h]j)}(hjh]huser_va}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj{ubj )}(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&]uh1j hj{ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h"``length`` Number of bytes to map h](j)}(h ``length``h]j)}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(hNumber of bytes to maph]hNumber of bytes to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(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]j)}(hjh]hiova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj5h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_ioas_map_file (C struct)c.iommu_ioas_map_filehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_map_fileh]j )}(hstruct iommu_ioas_map_fileh](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj~hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj~hhhjhKubjI)}(hiommu_ioas_map_fileh]jO)}(hj|h]hiommu_ioas_map_file}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj~hhhjhKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjzhhhjhKubah}(h]juah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhKhjwhhubj{)}(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:323: ./include/uapi/linux/iommufd.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jzhjwhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(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 to map ``start`` byte offset from start of 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&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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:323: ./include/uapi/linux/iommufd.hhKhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj)}(hhh](j)}(h,``size`` sizeof(struct iommu_ioas_map_file) h](j)}(h``size``h]j)}(hj1h]hsize}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj+ubj )}(hhh]h)}(h"sizeof(struct iommu_ioas_map_file)h]h"sizeof(struct iommu_ioas_map_file)}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhKhjGubah}(h]h ]h"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]uh1jhjFhKhj(ubj)}(h%``flags`` same as for iommu_ioas_map h](j)}(h ``flags``h]j)}(hjjh]hflags}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjdubj )}(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&]uh1j hjdubeh}(h]h ]h"]h$]h&]uh1jhjhKhj(ubj)}(h'``ioas_id`` same as for iommu_ioas_map h](j)}(h ``ioas_id``h]j)}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj(ubj)}(h``fd`` the memfd to map h](j)}(h``fd``h]j)}(hjh]hfd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(hthe memfd to maph]hthe memfd to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj(ubj)}(h5``start`` byte offset from start of file to map from h](j)}(h ``start``h]j)}(hjh]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h*byte offset from start of file to map fromh]h*byte offset from start of file to map from}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj+ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj*hKhj(ubj)}(h&``length`` same as for iommu_ioas_map h](j)}(h ``length``h]j)}(hjNh]hlength}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjHubj )}(hhh]h)}(hsame as for iommu_ioas_maph]hsame as for iommu_ioas_map}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKhjdubah}(h]h ]h"]h$]h&]uh1j hjHubeh}(h]h ]h"]h$]h&]uh1jhjchKhj(ubj)}(h#``iova`` same as for iommu_ioas_maph](j)}(h``iova``h]j)}(hjh]hiova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj(ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjhhubh)}(hhSet an IOVA mapping from a memfd file. All other arguments and semantics match those of IOMMU_IOAS_MAP.h]hhSet an IOVA mapping from a memfd file. 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:323: ./include/uapi/linux/iommufd.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_ioas_copy (C struct)c.iommu_ioas_copyhNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_copyh]j )}(hstruct iommu_ioas_copyh](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhKubjI)}(hiommu_ioas_copyh]jO)}(hjh]hiommu_ioas_copy}(hj(hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj$ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhKubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhKhjhhubj{)}(hhh]h)}(hioctl(IOMMU_IOAS_COPY)h]hioctl(IOMMU_IOAS_COPY)}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjGhhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjbjjbjjjuh1jhhhjhjhNubj)}(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}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh:}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjfubj)}(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; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjfubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjfubj)}(hhh](j)}(h(``size`` sizeof(struct iommu_ioas_copy) h](j)}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(hsizeof(struct iommu_ioas_copy)h]hsizeof(struct iommu_ioas_copy)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h5``flags`` Combination of enum iommufd_ioas_map_flags h](j)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(h*Combination of enum iommufd_ioas_map_flagsh]h*Combination of enum iommufd_ioas_map_flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h1``dst_ioas_id`` IOAS ID to change the mapping of h](j)}(h``dst_ioas_id``h]j)}(hj)h]h dst_ioas_id}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj#ubj )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hKhj?ubah}(h]h ]h"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]uh1jhj>hKhjubj)}(h%``src_ioas_id`` IOAS ID to copy from h](j)}(h``src_ioas_id``h]j)}(hjbh]h src_ioas_id}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj\ubj )}(hhh]h)}(hIOAS ID to copy fromh]hIOAS ID to copy from}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhKhjxubah}(h]h ]h"]h$]h&]uh1j hj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjubj)}(h+``length`` Number of bytes to copy and map h](j)}(h ``length``h]j)}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(hNumber of bytes to copy and map h]hNumber of bytes to copy and map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(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]j)}(hjh]hdst_iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(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:323: ./include/uapi/linux/iommufd.hhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h#``src_iova`` IOVA to start the copyh](j)}(h ``src_iova``h]j)}(hjh]hsrc_iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhjubj )}(hhh]h)}(hIOVA to start the copyh]hIOVA to start the copy}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhKhj$ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj#hKhjubeh}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(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.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(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.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_ioas_unmap (C struct)c.iommu_ioas_unmaphNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_unmaph]j )}(hstruct iommu_ioas_unmaph](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM ubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhM ubjI)}(hiommu_ioas_unmaph]jO)}(hjh]hiommu_ioas_unmap}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhM ubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhM 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:323: ./include/uapi/linux/iommufd.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhM ubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(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&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjubj)}(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; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjubh)}(h **Members**h]j)}(hj.h]hMembers}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM"hjubj)}(hhh](j)}(h)``size`` sizeof(struct iommu_ioas_unmap) h](j)}(h``size``h]j)}(hjMh]hsize}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjGubj )}(hhh]h)}(hsizeof(struct iommu_ioas_unmap)h]hsizeof(struct iommu_ioas_unmap)}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjcubah}(h]h ]h"]h$]h&]uh1j hjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjDubj)}(h-``ioas_id`` IOAS ID to change the mapping of h](j)}(h ``ioas_id``h]j)}(hjh]hioas_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjubj )}(hhh]h)}(h IOAS ID to change the mapping ofh]h IOAS ID to change the mapping of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjDubj)}(h(``iova`` IOVA to start the unmapping at h](j)}(h``iova``h]j)}(hjh]hiova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjubj )}(hhh]h)}(hIOVA to start the unmapping ath]hIOVA to start the unmapping at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjDubj)}(hG``length`` Number of bytes to unmap, and return back the bytes unmappedh](j)}(h ``length``h]j)}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjubj )}(hhh]h)}(hubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhM>ubjI)}(hiommufd_option_opsh]jO)}(hjh]hiommufd_option_ops}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhM>ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhM>ubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhM>hjhhubj{)}(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)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM;hjhhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhM>ubeh}(h]h ](jenumeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(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)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM?hjubj)}(hhh](j)}(h/``IOMMU_OPTION_OP_SET`` Set the option's value h](j)}(h``IOMMU_OPTION_OP_SET``h]j)}(hjh]hIOMMU_OPTION_OP_SET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMBhj ubj )}(hhh]h)}(hSet the option's valueh]hSet the option’s value}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMBhj)ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hMBhj ubj)}(h.``IOMMU_OPTION_OP_GET`` Get the option's valueh](j)}(h``IOMMU_OPTION_OP_GET``h]j)}(hjLh]hIOMMU_OPTION_OP_GET}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMDhjFubj )}(hhh]h)}(hGet the option's valueh]hGet the option’s value}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMEhjbubah}(h]h ]h"]h$]h&]uh1j hjFubeh}(h]h ]h"]h$]h&]uh1jhjahMDhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_option (C struct)c.iommu_optionhNtauh1jhjhhhjhNubj)}(hhh](j)}(h iommu_optionh]j )}(hstruct iommu_optionh](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMKubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjhhhjhMKubjI)}(h iommu_optionh]jO)}(hjh]h iommu_option}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjhhhjhMKubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhhhjhMKubah}(h]jah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhMKhjhhubj{)}(hhh]h)}(hiommu option multiplexerh]hiommu option multiplexer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMFhjhhubah}(h]h ]h"]h$]h&]uh1jzhjhhhjhMKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjhjhNubj)}(hX**Definition**:: struct iommu_option { __u32 size; __u32 option_id; __u16 op; __u16 __reserved; __u32 object_id; __aligned_u64 val64; }; **Members** ``size`` sizeof(struct iommu_option) ``option_id`` One of enum iommufd_option ``op`` One of enum iommufd_option_ops ``__reserved`` Must be 0 ``object_id`` ID of the object if required ``val64`` Option value to set or value returned on geth](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMJhjubj)}(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:323: ./include/uapi/linux/iommufd.hhMLhjubh)}(h **Members**h]j)}(hj6h]hMembers}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMUhjubj)}(hhh](j)}(h%``size`` sizeof(struct iommu_option) h](j)}(h``size``h]j)}(hjUh]hsize}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMHhjOubj )}(hhh]h)}(hsizeof(struct iommu_option)h]hsizeof(struct iommu_option)}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMHhjkubah}(h]h ]h"]h$]h&]uh1j hjOubeh}(h]h ]h"]h$]h&]uh1jhjjhMHhjLubj)}(h)``option_id`` One of enum iommufd_option h](j)}(h ``option_id``h]j)}(hjh]h option_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMIhjubj )}(hhh]h)}(hOne of enum iommufd_optionh]hOne of enum iommufd_option}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMIhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMIhjLubj)}(h&``op`` One of enum iommufd_option_ops h](j)}(h``op``h]j)}(hjh]hop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMJhjubj )}(hhh]h)}(hOne of enum iommufd_option_opsh]hOne of enum iommufd_option_ops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMJhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMJhjLubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hj h]h __reserved}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMKhjubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMKhj ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj hMKhjLubj)}(h+``object_id`` ID of the object if required h](j)}(h ``object_id``h]j)}(hj9 h]h object_id}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7 ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMLhj3 ubj )}(hhh]h)}(hID of the object if requiredh]hID of the object if required}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN hMLhjO ubah}(h]h ]h"]h$]h&]uh1j hj3 ubeh}(h]h ]h"]h$]h&]uh1jhjN hMLhjLubj)}(h6``val64`` Option value to set or value returned on geth](j)}(h ``val64``h]j)}(hjr h]hval64}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMLhjl ubj )}(hhh]h)}(h,Option value to set or value returned on geth]h,Option value to set or value returned on get}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMMhj ubah}(h]h ]h"]h$]h&]uh1j hjl ubeh}(h]h ]h"]h$]h&]uh1jhj hMLhjLubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMPhjhhubh)}(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:323: ./include/uapi/linux/iommufd.hhMNhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommufd_vfio_ioas_op (C enum)c.iommufd_vfio_ioas_ophNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_vfio_ioas_oph]j )}(henum iommufd_vfio_ioas_oph](j&)}(hjh]henum}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMUubj8)}(h h]h }(hj!hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj hhhj!hMUubjI)}(hiommufd_vfio_ioas_oph]jO)}(hj h]hiommufd_vfio_ioas_op}(hj!hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj!ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj hhhj!hMUubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj hhhj!hMUubah}(h]j ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj!hMUhj hhubj{)}(hhh]h)}(hIOMMU_VFIO_IOAS_* ioctlsh]hIOMMU_VFIO_IOAS_* ioctls}(hj5!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM]hj2!hhubah}(h]h ]h"]h$]h&]uh1jzhj hhhj!hMUubeh}(h]h ](jenumeh"]h$]h&]jjjjM!jjM!jjjuh1jhhhjhjhNubj)}(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)}(hjW!h]h Constants}(hjY!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU!ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMahjQ!ubj)}(hhh](j)}(h;``IOMMU_VFIO_IOAS_GET`` Get the current compatibility IOAS h](j)}(h``IOMMU_VFIO_IOAS_GET``h]j)}(hjv!h]hIOMMU_VFIO_IOAS_GET}(hjx!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt!ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMdhjp!ubj )}(hhh]h)}(h"Get the current compatibility IOASh]h"Get the current compatibility IOAS}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMdhj!ubah}(h]h ]h"]h$]h&]uh1j hjp!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMdhjm!ubj)}(h>``IOMMU_VFIO_IOAS_SET`` Change the current compatibility IOAS h](j)}(h``IOMMU_VFIO_IOAS_SET``h]j)}(hj!h]hIOMMU_VFIO_IOAS_SET}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMghj!ubj )}(hhh]h)}(h%Change the current compatibility IOASh]h%Change the current compatibility IOAS}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMghj!ubah}(h]h ]h"]h$]h&]uh1j hj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMghjm!ubj)}(h4``IOMMU_VFIO_IOAS_CLEAR`` Disable VFIO compatibilityh](j)}(h``IOMMU_VFIO_IOAS_CLEAR``h]j)}(hj!h]hIOMMU_VFIO_IOAS_CLEAR}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMihj!ubj )}(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:323: ./include/uapi/linux/iommufd.hhMjhj!ubah}(h]h ]h"]h$]h&]uh1j hj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMihjm!ubeh}(h]h ]h"]h$]h&]uh1jhjQ!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_vfio_ioas (C struct)c.iommu_vfio_ioashNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_vfio_ioash]j )}(hstruct iommu_vfio_ioash](j&)}(hj)h]hstruct}(hjB"hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj>"hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMpubj8)}(h h]h }(hjP"hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj>"hhhjO"hMpubjI)}(hiommu_vfio_ioash]jO)}(hj<"h]hiommu_vfio_ioas}(hjb"hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj^"ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj>"hhhjO"hMpubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj:"hhhjO"hMpubah}(h]j5"ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjO"hMphj7"hhubj{)}(hhh]h)}(hioctl(IOMMU_VFIO_IOAS)h]hioctl(IOMMU_VFIO_IOAS)}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMihj"hhubah}(h]h ]h"]h$]h&]uh1jzhj7"hhhjO"hMpubeh}(h]h ](jstructeh"]h$]h&]jjjj"jj"jjjuh1jhhhjhjhNubj)}(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&]uh1jhj"ubh:}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMmhj"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:323: ./include/uapi/linux/iommufd.hhMohj"ubh)}(h **Members**h]j)}(hj"h]hMembers}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMvhj"ubj)}(hhh](j)}(h(``size`` sizeof(struct iommu_vfio_ioas) h](j)}(h``size``h]j)}(hj"h]hsize}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMkhj"ubj )}(hhh]h)}(hsizeof(struct iommu_vfio_ioas)h]hsizeof(struct iommu_vfio_ioas)}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMkhj#ubah}(h]h ]h"]h$]h&]uh1j hj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hMkhj"ubj)}(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]j)}(hj*#h]hioas_id}(hj,#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(#ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMmhj$#ubj )}(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}(hjC#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMlhj@#ubah}(h]h ]h"]h$]h&]uh1j hj$#ubeh}(h]h ]h"]h$]h&]uh1jhj?#hMmhj"ubj)}(h(``op`` One of enum iommufd_vfio_ioas_op h](j)}(h``op``h]j)}(hjd#h]hop}(hjf#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb#ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMnhj^#ubj )}(hhh]h)}(h One of enum iommufd_vfio_ioas_oph]h One of enum iommufd_vfio_ioas_op}(hj}#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy#hMnhjz#ubah}(h]h ]h"]h$]h&]uh1j hj^#ubeh}(h]h ]h"]h$]h&]uh1jhjy#hMnhj"ubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hj#h]h __reserved}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMnhj#ubj )}(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:323: ./include/uapi/linux/iommufd.hhMohj#ubah}(h]h ]h"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMnhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMrhjhhubh)}(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:323: ./include/uapi/linux/iommufd.hhMphjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!iommufd_hwpt_alloc_flags (C enum)c.iommufd_hwpt_alloc_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_hwpt_alloc_flagsh]j )}(henum iommufd_hwpt_alloc_flagsh](j&)}(hjh]henum}(hj$hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj$hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMzubj8)}(h h]h }(hj,$hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj$hhhj+$hMzubjI)}(hiommufd_hwpt_alloc_flagsh]jO)}(hj$h]hiommufd_hwpt_alloc_flags}(hj>$hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj:$ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj$hhhj+$hMzubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj$hhhj+$hMzubah}(h]j$ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj+$hMzhj$hhubj{)}(hhh]h)}(hFlags for HWPT allocationh]hFlags for HWPT allocation}(hj`$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj]$hhubah}(h]h ]h"]h$]h&]uh1jzhj$hhhj+$hMzubeh}(h]h ](jenumeh"]h$]h&]jjjjx$jjx$jjjuh1jhhhjhjhNubj)}(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)}(hj$h]h Constants}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj|$ubj)}(hhh](j)}(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]j)}(hj$h]hIOMMU_HWPT_ALLOC_NEST_PARENT}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj$ubj )}(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:323: ./include/uapi/linux/iommufd.hhMhj$ubah}(h]h ]h"]h$]h&]uh1j hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubj)}(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]j)}(hj$h]hIOMMU_HWPT_ALLOC_DIRTY_TRACKING}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj$ubj )}(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:323: ./include/uapi/linux/iommufd.hhMhj$ubah}(h]h ]h"]h$]h&]uh1j hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubj)}(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]j)}(hj%h]hIOMMU_HWPT_FAULT_ID_VALID}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj%ubj )}(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:323: ./include/uapi/linux/iommufd.hhMhj+%ubah}(h]h ]h"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]uh1jhj*%hMhj$ubj)}(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]j)}(hjO%h]hIOMMU_HWPT_ALLOC_PASID}(hjQ%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM%ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjI%ubj )}(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).}(hjh%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhje%ubah}(h]h ]h"]h$]h&]uh1j hjI%ubeh}(h]h ]h"]h$]h&]uh1jhjd%hMhj$ubeh}(h]h ]h"]h$]h&]uh1jhj|$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommu_hwpt_vtd_s1_flags (C enum)c.iommu_hwpt_vtd_s1_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_vtd_s1_flagsh]j )}(henum iommu_hwpt_vtd_s1_flagsh](j&)}(hjh]henum}(hj%hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj%hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj%hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj%hhhj%hMubjI)}(hiommu_hwpt_vtd_s1_flagsh]jO)}(hj%h]hiommu_hwpt_vtd_s1_flags}(hj%hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj%ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj%hhhj%hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj%hhhj%hMubah}(h]j%ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj%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:323: ./include/uapi/linux/iommufd.hhMhj%hhubah}(h]h ]h"]h$]h&]uh1jzhj%hhhj%hMubeh}(h]h ](jenumeh"]h$]h&]jjjj&jj&jjjuh1jhhhjhjhNubj)}(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&]uh1jhj &ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj&ubj)}(hhh](j)}(h(``IOMMU_VTD_S1_SRE`` Supervisor request h](j)}(h``IOMMU_VTD_S1_SRE``h]j)}(hj,&h]hIOMMU_VTD_S1_SRE}(hj.&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*&ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj&&ubj )}(hhh]h)}(hSupervisor requesth]hSupervisor request}(hjE&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjA&hMhjB&ubah}(h]h ]h"]h$]h&]uh1j hj&&ubeh}(h]h ]h"]h$]h&]uh1jhjA&hMhj#&ubj)}(h-``IOMMU_VTD_S1_EAFE`` Extended access enable h](j)}(h``IOMMU_VTD_S1_EAFE``h]j)}(hje&h]hIOMMU_VTD_S1_EAFE}(hjg&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc&ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj_&ubj )}(hhh]h)}(hExtended access enableh]hExtended access enable}(hj~&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjz&hMhj{&ubah}(h]h ]h"]h$]h&]uh1j hj_&ubeh}(h]h ]h"]h$]h&]uh1jhjz&hMhj#&ubj)}(h)``IOMMU_VTD_S1_WPE`` Write protect enableh](j)}(h``IOMMU_VTD_S1_WPE``h]j)}(hj&h]hIOMMU_VTD_S1_WPE}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj&ubj )}(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:323: ./include/uapi/linux/iommufd.hhMhj&ubah}(h]h ]h"]h$]h&]uh1j hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj#&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hwpt_vtd_s1 (C struct)c.iommu_hwpt_vtd_s1hNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_vtd_s1h]j )}(hstruct iommu_hwpt_vtd_s1h](j&)}(hj)h]hstruct}(hj&hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj&hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj'hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj&hhhj'hMubjI)}(hiommu_hwpt_vtd_s1h]jO)}(hj&h]hiommu_hwpt_vtd_s1}(hj'hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj'ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj&hhhj'hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj&hhhj'hMubah}(h]j&ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj'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:323: ./include/uapi/linux/iommufd.hhMhj7'hhubah}(h]h ]h"]h$]h&]uh1jzhj&hhhj'hMubeh}(h]h ](jstructeh"]h$]h&]jjjjR'jjR'jjjuh1jhhhjhjhNubj)}(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}(hj^'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ'ubh:}(hjZ'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjV'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; };}hjw'sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjV'ubh)}(h **Members**h]j)}(hj'h]hMembers}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjV'ubj)}(hhh](j)}(h6``flags`` Combination of enum iommu_hwpt_vtd_s1_flags h](j)}(h ``flags``h]j)}(hj'h]hflags}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj'ubj )}(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&]uh1j hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhj'ubj)}(h;``pgtbl_addr`` The base address of the stage-1 page table. h](j)}(h``pgtbl_addr``h]j)}(hj'h]h pgtbl_addr}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj'ubj )}(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&]uh1j hj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhj'ubj)}(h;``addr_width`` The address width of the stage-1 page table h](j)}(h``addr_width``h]j)}(hj(h]h addr_width}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj(ubj )}(hhh]h)}(h+The address width of the stage-1 page tableh]h+The address width of the stage-1 page table}(hj2(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.(hMhj/(ubah}(h]h ]h"]h$]h&]uh1j hj(ubeh}(h]h ]h"]h$]h&]uh1jhj.(hMhj'ubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hjR(h]h __reserved}(hjT(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP(ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjL(ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjk(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjh(ubah}(h]h ]h"]h$]h&]uh1j hjL(ubeh}(h]h ]h"]h$]h&]uh1jhjg(hMhj'ubeh}(h]h ]h"]h$]h&]uh1jhjV'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommu_hwpt_arm_smmuv3 (C struct)c.iommu_hwpt_arm_smmuv3hNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_arm_smmuv3h]j )}(hstruct iommu_hwpt_arm_smmuv3h](j&)}(hj)h]hstruct}(hj(hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj(hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj(hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj(hhhj(hMubjI)}(hiommu_hwpt_arm_smmuv3h]jO)}(hj(h]hiommu_hwpt_arm_smmuv3}(hj(hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj(ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj(hhhj(hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj(hhhj(hMubah}(h]j(ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj(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:323: ./include/uapi/linux/iommufd.hhMhj(hhubah}(h]h ]h"]h$]h&]uh1jzhj(hhhj(hMubeh}(h]h ](jstructeh"]h$]h&]jjjj)jj)jjjuh1jhhhjhjhNubj)}(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&]uh1jhj)ubh:}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj )ubj)}(h)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:)ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj )ubj)}(hhh]j)}(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]j)}(hj[)h]hste}(hj])hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY)ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjU)ubj )}(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}(hjt)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjq)ubah}(h]h ]h"]h$]h&]uh1j hjU)ubeh}(h]h ]h"]h$]h&]uh1jhjp)hMhjR)ubah}(h]h ]h"]h$]h&]uh1jhj )ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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&]uh1jhj)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:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hwpt_data_type (C enum)c.iommu_hwpt_data_typehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_data_typeh]j )}(henum iommu_hwpt_data_typeh](j&)}(hjh]henum}(hj)hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj)hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj)hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj)hhhj)hMubjI)}(hiommu_hwpt_data_typeh]jO)}(hj)h]hiommu_hwpt_data_type}(hj*hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj *ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj)hhhj)hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj)hhhj)hMubah}(h]j)ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj)hMhj)hhubj{)}(hhh]h)}(hIOMMU HWPT Data Typeh]hIOMMU HWPT Data Type}(hj0*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj-*hhubah}(h]h ]h"]h$]h&]uh1jzhj)hhhj)hMubeh}(h]h ](jenumeh"]h$]h&]jjjjH*jjH*jjjuh1jhhhjhjhNubj)}(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 Tableh](h)}(h **Constants**h]j)}(hjR*h]h Constants}(hjT*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP*ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjL*ubj)}(hhh](j)}(h!``IOMMU_HWPT_DATA_NONE`` no data h](j)}(h``IOMMU_HWPT_DATA_NONE``h]j)}(hjq*h]hIOMMU_HWPT_DATA_NONE}(hjs*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo*ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjk*ubj )}(hhh]h)}(hno datah]hno data}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j hjk*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjh*ubj)}(h9``IOMMU_HWPT_DATA_VTD_S1`` Intel VT-d stage-1 page table h](j)}(h``IOMMU_HWPT_DATA_VTD_S1``h]j)}(hj*h]hIOMMU_HWPT_DATA_VTD_S1}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj*ubj )}(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&]uh1j hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjh*ubj)}(hB``IOMMU_HWPT_DATA_ARM_SMMUV3`` ARM SMMUv3 Context Descriptor Tableh](j)}(h``IOMMU_HWPT_DATA_ARM_SMMUV3``h]j)}(hj*h]hIOMMU_HWPT_DATA_ARM_SMMUV3}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj*ubj )}(hhh]h)}(h#ARM SMMUv3 Context Descriptor Tableh]h#ARM SMMUv3 Context Descriptor Table}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj*ubah}(h]h ]h"]h$]h&]uh1j hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhjh*ubeh}(h]h ]h"]h$]h&]uh1jhjL*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hwpt_alloc (C struct)c.iommu_hwpt_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_alloch]j )}(hstruct iommu_hwpt_alloch](j&)}(hj)h]hstruct}(hj=+hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj9+hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjK+hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj9+hhhjJ+hMubjI)}(hiommu_hwpt_alloch]jO)}(hj7+h]hiommu_hwpt_alloc}(hj]+hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjY+ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj9+hhhjJ+hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj5+hhhjJ+hMubah}(h]j0+ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjJ+hMhj2+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:323: ./include/uapi/linux/iommufd.hhMhj|+hhubah}(h]h ]h"]h$]h&]uh1jzhj2+hhhjJ+hMubeh}(h]h ](jstructeh"]h$]h&]jjjj+jj+jjjuh1jhhhjhjhNubj)}(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}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh:}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj+ubj)}(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; };}hj+sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj+ubh)}(h **Members**h]j)}(hj+h]hMembers}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj+ubj)}(hhh](j)}(h)``size`` sizeof(struct iommu_hwpt_alloc) h](j)}(h``size``h]j)}(hj+h]hsize}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj+ubj )}(hhh]h)}(hsizeof(struct iommu_hwpt_alloc)h]hsizeof(struct iommu_hwpt_alloc)}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj+ubj)}(h7``flags`` Combination of enum iommufd_hwpt_alloc_flags h](j)}(h ``flags``h]j)}(hj%,h]hflags}(hj',hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#,ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj,ubj )}(hhh]h)}(h,Combination of enum iommufd_hwpt_alloc_flagsh]h,Combination of enum iommufd_hwpt_alloc_flags}(hj>,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:,hMhj;,ubah}(h]h ]h"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]uh1jhj:,hMhj+ubj)}(h0``dev_id`` The device to allocate this HWPT for h](j)}(h ``dev_id``h]j)}(hj^,h]hdev_id}(hj`,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\,ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjX,ubj )}(hhh]h)}(h$The device to allocate this HWPT forh]h$The device to allocate this HWPT for}(hjw,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs,hMhjt,ubah}(h]h ]h"]h$]h&]uh1j hjX,ubeh}(h]h ]h"]h$]h&]uh1jhjs,hMhj+ubj)}(h=``pt_id`` The IOAS or HWPT or vIOMMU to connect this HWPT to h](j)}(h ``pt_id``h]j)}(hj,h]hpt_id}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj,ubj )}(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,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj+ubj)}(h'``out_hwpt_id`` The ID of the new HWPT h](j)}(h``out_hwpt_id``h]j)}(hj,h]h out_hwpt_id}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj,ubj )}(hhh]h)}(hThe ID of the new HWPTh]hThe ID of the new HWPT}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj+ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hj -h]h __reserved}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj-ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj"-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj+ubj)}(h/``data_type`` One of enum iommu_hwpt_data_type h](j)}(h ``data_type``h]j)}(hjB-h]h data_type}(hjD-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj<-ubj )}(hhh]h)}(h One of enum iommu_hwpt_data_typeh]h One of enum iommu_hwpt_data_type}(hj[-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjW-hMhjX-ubah}(h]h ]h"]h$]h&]uh1j hj<-ubeh}(h]h ]h"]h$]h&]uh1jhjW-hMhj+ubj)}(h.``data_len`` Length of the type specific data h](j)}(h ``data_len``h]j)}(hj{-h]hdata_len}(hj}-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhju-ubj )}(hhh]h)}(h Length of the type specific datah]h Length of the type specific data}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hju-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj+ubj)}(h5``data_uptr`` User pointer to the type specific data h](j)}(h ``data_uptr``h]j)}(hj-h]h data_uptr}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj-ubj )}(hhh]h)}(h&User pointer to the type specific datah]h&User pointer to the type specific data}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj+ubj)}(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]j)}(hj-h]hfault_id}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj-ubj )}(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.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj.ubah}(h]h ]h"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]uh1jhj.hMhj+ubj)}(h7``__reserved2`` Padding to 64-bit alignment. Must be 0.h](j)}(h``__reserved2``h]j)}(hj'.h]h __reserved2}(hj).hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%.ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj!.ubj )}(hhh]h)}(h'Padding to 64-bit alignment. Must be 0.h]h'Padding to 64-bit alignment. Must be 0.}(hj@.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=.ubah}(h]h ]h"]h$]h&]uh1j hj!.ubeh}(h]h ]h"]h$]h&]uh1jhj<.hMhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjj.h]h Description}(hjl.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh.ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.hhhNhNubj)}(h **pt_id**h]hpt_id}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh. The }(hj.hhhNhNubj)}(h **data_type**h]h data_type}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 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.hhhNhNubj)}(h **flags**h]hflags}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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 }(hj.hhhNhNubj)}(h **pt_id**h]hpt_id}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh^, in which the parent HWPT must be allocated previously via the same ioctl from a given IOAS (}(hj.hhhNhNubj)}(h **pt_id**h]hpt_id}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh). In this case, the }(hj.hhhNhNubj)}(h **data_type**h]h data_type}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 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 }(hj.hhhNhNubj)}(h **dev_id**h]hdev_id}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh and the vIOMMU via }(hj.hhhNhNubj)}(h **pt_id**h]hpt_id}(hj$/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh/ must be associated to the same IOMMU instance.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(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 }(hj=/hhhNhNubj)}(h **data_type**h]h data_type}(hjE/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh! is set to IOMMU_HWPT_DATA_NONE, }(hj=/hhhNhNubj)}(h **data_len**h]hdata_len}(hjW/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh and }(hj=/hhhNhNubj)}(h **data_uptr**h]h data_uptr}(hji/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh! should be zero. Otherwise, both }(hj=/hhhNhNubj)}(h **data_len**h]hdata_len}(hj{/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh and }(hj=/hhhNhNubj)}(h **data_uptr**h]h data_uptr}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh must be given.}(hj=/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommu_hw_info_vtd_flags (C enum)c.iommu_hw_info_vtd_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hw_info_vtd_flagsh]j )}(henum iommu_hw_info_vtd_flagsh](j&)}(hjh]henum}(hj/hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj/hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj/hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj/hhhj/hMubjI)}(hiommu_hw_info_vtd_flagsh]jO)}(hj/h]hiommu_hw_info_vtd_flags}(hj/hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj/ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj/hhhj/hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj/hhhj/hMubah}(h]j/ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj/hMhj/hhubj{)}(hhh]h)}(hFlags for VT-d hw_infoh]hFlags for VT-d hw_info}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hj/hhubah}(h]h ]h"]h$]h&]uh1jzhj/hhhj/hMubeh}(h]h ](jenumeh"]h$]h&]jjjj0jj0jjjuh1jhhhjhjhNubj)}(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)}(hj#0h]h Constants}(hj%0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!0ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hj0ubj)}(hhh]j)}(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]j)}(hjB0h]h%IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17}(hjD0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@0ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj<0ubj )}(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. }(hj[0hhhNhNubh 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}(hje0hhhNhNubah}(h]h ]h"]h$]h&]refurijg0uh1jc0hj[0ubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjX0ubah}(h]h ]h"]h$]h&]uh1j hj<0ubeh}(h]h ]h"]h$]h&]uh1jhjW0hMhj90ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hw_info_vtd (C struct)c.iommu_hw_info_vtdhNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hw_info_vtdh]j )}(hstruct iommu_hw_info_vtdh](j&)}(hj)h]hstruct}(hj0hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj0hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj0hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj0hhhj0hMubjI)}(hiommu_hw_info_vtdh]jO)}(hj0h]hiommu_hw_info_vtd}(hj0hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj0ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj0hhhj0hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj0hhhj0hMubah}(h]j0ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj0hMhj0hhubj{)}(hhh]h)}(hIntel VT-d hardware informationh]hIntel VT-d hardware information}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj0hhubah}(h]h ]h"]h$]h&]uh1jzhj0hhhj0hMubeh}(h]h ](jstructeh"]h$]h&]jjjj1jj1jjjuh1jhhhjhjhNubj)}(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}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh:}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj 1ubj)}(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; };}hj,1sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj 1ubh)}(h **Members**h]j)}(hj=1h]hMembers}(hj?1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;1ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hj 1ubj)}(hhh](j)}(h6``flags`` Combination of enum iommu_hw_info_vtd_flags h](j)}(h ``flags``h]j)}(hj\1h]hflags}(hj^1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ1ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjV1ubj )}(hhh]h)}(h+Combination of enum iommu_hw_info_vtd_flagsh]h+Combination of enum iommu_hw_info_vtd_flags}(hju1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq1hMhjr1ubah}(h]h ]h"]h$]h&]uh1j hjV1ubeh}(h]h ]h"]h$]h&]uh1jhjq1hMhjS1ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hj1h]h __reserved}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj1ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjS1ubj)}(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]j)}(hj1h]hcap_reg}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj1ubj )}(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.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjS1ubj)}(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]j)}(hj2h]hecap_reg}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj2ubj )}(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.}(hj!2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhjS1ubeh}(h]h ]h"]h$]h&]uh1jhj 1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjJ2h]h Description}(hjL2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH2ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(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.}(hj`2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#iommu_hw_info_arm_smmuv3 (C struct)c.iommu_hw_info_arm_smmuv3hNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hw_info_arm_smmuv3h]j )}(hstruct iommu_hw_info_arm_smmuv3h](j&)}(hj)h]hstruct}(hj2hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj2hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM#ubj8)}(h h]h }(hj2hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj2hhhj2hM#ubjI)}(hiommu_hw_info_arm_smmuv3h]jO)}(hj2h]hiommu_hw_info_arm_smmuv3}(hj2hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj2ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj2hhhj2hM#ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj2hhhj2hM#ubah}(h]j{2ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj2hM#hj}2hhubj{)}(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)}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM(hj2hhubah}(h]h ]h"]h$]h&]uh1jzhj}2hhhj2hM#ubeh}(h]h ](jstructeh"]h$]h&]jjjj2jj2jjjuh1jhhhjhjhNubj)}(hX**Definition**:: struct iommu_hw_info_arm_smmuv3 { __u32 flags; __u32 __reserved; __u32 idr[6]; __u32 iidr; __u32 aidr; }; **Members** ``flags`` Must be set to 0 ``__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}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh:}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM,hj2ubj)}(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; };}hj3sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM.hj2ubh)}(h **Members**h]j)}(hj3h]hMembers}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM6hj2ubj)}(hhh](j)}(h``flags`` Must be set to 0 h](j)}(h ``flags``h]j)}(hj73h]hflags}(hj93hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj53ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM,hj13ubj )}(hhh]h)}(hMust be set to 0h]hMust be set to 0}(hjP3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL3hM,hjM3ubah}(h]h ]h"]h$]h&]uh1j hj13ubeh}(h]h ]h"]h$]h&]uh1jhjL3hM,hj.3ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hjp3h]h __reserved}(hjr3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn3ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM-hjj3ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hM-hj3ubah}(h]h ]h"]h$]h&]uh1j hjj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hM-hj.3ubj)}(hK``idr`` Implemented features for ARM SMMU Non-secure programming interface h](j)}(h``idr``h]j)}(hj3h]hidr}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM.hj3ubj )}(hhh]h)}(hBImplemented features for ARM SMMU Non-secure programming interfaceh]hBImplemented features for ARM SMMU Non-secure programming interface}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hM.hj3ubah}(h]h ]h"]h$]h&]uh1j hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hM.hj.3ubj)}(hn``iidr`` Information about the implementation and implementer of ARM SMMU, and architecture version supported h](j)}(h``iidr``h]j)}(hj3h]hiidr}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM0hj3ubj )}(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}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM/hj3ubah}(h]h ]h"]h$]h&]uh1j hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hM0hj.3ubj)}(h&``aidr`` ARM SMMU architecture versionh](j)}(h``aidr``h]j)}(hj4h]haidr}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM0hj4ubj )}(hhh]h)}(hARM SMMU architecture versionh]hARM SMMU architecture version}(hj54hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM1hj24ubah}(h]h ]h"]h$]h&]uh1j hj4ubeh}(h]h ]h"]h$]h&]uh1jhj14hM0hj.3ubeh}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj_4h]h Description}(hja4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]4ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM4hjhhubh)}(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 }(hju4hhhNhNubj)}(h**idr**h]hidr}(hj}4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju4ubh, }(hju4hhhNhNubj)}(h**iidr**h]hiidr}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju4ubh and }(hju4hhhNhNubj)}(h**aidr**h]haidr}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju4ubhF, please refer to the chapters from 6.3.1 to 6.3.6 in the SMMUv3 Spec.}(hju4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM2hjhhubh)}(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:}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM5hjhhubh)}(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, GRAN4Kh]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}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM8hjhhubj)}(hhh](j)}(h@S1P should be assumed to be true if a NESTED HWPT can be createdh]h)}(hj4h]h@S1P should be assumed to be true if a NESTED HWPT can be created}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM=hj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(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.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM>hj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(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.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM@hj 5ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]jjjuh1jhj4hM=hjhhubh)}(hX-This list may expand in future (eg E0PD, AIE, PBHA, D128, DS 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, DS 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+5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMChjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hw_info_type (C enum)c.iommu_hw_info_typehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hw_info_typeh]j )}(henum iommu_hw_info_typeh](j&)}(hjh]henum}(hjS5hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjO5hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMLubj8)}(h h]h }(hja5hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjO5hhhj`5hMLubjI)}(hiommu_hw_info_typeh]jO)}(hjM5h]hiommu_hw_info_type}(hjs5hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjo5ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjO5hhhj`5hMLubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjK5hhhj`5hMLubah}(h]jF5ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj`5hMLhjH5hhubj{)}(hhh]h)}(hIOMMU Hardware Info Typesh]hIOMMU Hardware Info Types}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMRhj5hhubah}(h]h ]h"]h$]h&]uh1jzhjH5hhhj`5hMLubeh}(h]h ](jenumeh"]h$]h&]jjjj5jj5jjjuh1jhhhjhjhNubj)}(h**Constants** ``IOMMU_HW_INFO_TYPE_NONE`` Used by the drivers that do not report hardware info ``IOMMU_HW_INFO_TYPE_INTEL_VTD`` Intel VT-d iommu info type ``IOMMU_HW_INFO_TYPE_ARM_SMMUV3`` ARM SMMUv3 iommu info typeh](h)}(h **Constants**h]j)}(hj5h]h Constants}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMVhj5ubj)}(hhh](j)}(hQ``IOMMU_HW_INFO_TYPE_NONE`` Used by the drivers that do not report hardware info h](j)}(h``IOMMU_HW_INFO_TYPE_NONE``h]j)}(hj5h]hIOMMU_HW_INFO_TYPE_NONE}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMZhj5ubj )}(hhh]h)}(h4Used by the drivers that do not report hardware infoh]h4Used by the drivers that do not report hardware info}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMYhj5ubah}(h]h ]h"]h$]h&]uh1j hj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMZhj5ubj)}(h<``IOMMU_HW_INFO_TYPE_INTEL_VTD`` Intel VT-d iommu info type h](j)}(h ``IOMMU_HW_INFO_TYPE_INTEL_VTD``h]j)}(hj6h]hIOMMU_HW_INFO_TYPE_INTEL_VTD}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM]hj 6ubj )}(hhh]h)}(hIntel VT-d iommu info typeh]hIntel VT-d iommu info type}(hj)6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%6hM]hj&6ubah}(h]h ]h"]h$]h&]uh1j hj 6ubeh}(h]h ]h"]h$]h&]uh1jhj%6hM]hj5ubj)}(h<``IOMMU_HW_INFO_TYPE_ARM_SMMUV3`` ARM SMMUv3 iommu info typeh](j)}(h!``IOMMU_HW_INFO_TYPE_ARM_SMMUV3``h]j)}(hjI6h]hIOMMU_HW_INFO_TYPE_ARM_SMMUV3}(hjK6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG6ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM_hjC6ubj )}(hhh]h)}(hARM SMMUv3 iommu info typeh]hARM SMMUv3 iommu info type}(hjb6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM`hj_6ubah}(h]h ]h"]h$]h&]uh1j hjC6ubeh}(h]h ]h"]h$]h&]uh1jhj^6hM_hj5ubeh}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommufd_hw_capabilities (C enum)c.iommufd_hw_capabilitieshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_hw_capabilitiesh]j )}(henum iommufd_hw_capabilitiesh](j&)}(hjh]henum}(hj6hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj6hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMfubj8)}(h h]h }(hj6hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj6hhhj6hMfubjI)}(hiommufd_hw_capabilitiesh]jO)}(hj6h]hiommufd_hw_capabilities}(hj6hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj6ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj6hhhj6hMfubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj6hhhj6hMfubah}(h]j6ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj6hMfhj6hhubj{)}(hhh]h}(h]h ]h"]h$]h&]uh1jzhj6hhhj6hMfubeh}(h]h ](jenumeh"]h$]h&]jjjj6jj6jjjuh1jhhhjhjhNubj)}(hX**Constants** ``IOMMU_HW_CAP_DIRTY_TRACKING`` IOMMU hardware support for dirty tracking If available, it means the following APIs are supported: IOMMU_HWPT_GET_DIRTY_BITMAP IOMMU_HWPT_SET_DIRTY_TRACKING ``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.h](h)}(h **Constants**h]j)}(hj6h]h Constants}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMbhj6ubj)}(hhh](j)}(h``IOMMU_HW_CAP_DIRTY_TRACKING`` IOMMU hardware support for dirty tracking If available, it means the following APIs are supported: IOMMU_HWPT_GET_DIRTY_BITMAP IOMMU_HWPT_SET_DIRTY_TRACKING h](j)}(h``IOMMU_HW_CAP_DIRTY_TRACKING``h]j)}(hj7h]hIOMMU_HW_CAP_DIRTY_TRACKING}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMjhj7ubj )}(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:}(hj07hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMehj-7ubj4)}(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}(hjC7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMihj?7ubah}(h]h ]h"]h$]h&]uh1j3hjQ7hMihj-7ubeh}(h]h ]h"]h$]h&]uh1j hj7ubeh}(h]h ]h"]h$]h&]uh1jhj,7hMjhj7ubj)}(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]j)}(hjj7h]hIOMMU_HW_CAP_PCI_PASID_EXEC}(hjl7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh7ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMohjd7ubj )}(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.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMmhj7ubah}(h]h ]h"]h$]h&]uh1j hjd7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMohj7ubj)}(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]j)}(hj7h]hIOMMU_HW_CAP_PCI_PASID_PRIV}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMshj7ubj )}(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.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMrhj7ubah}(h]h ]h"]h$]h&]uh1j hj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMshj7ubeh}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hw_info (C struct)c.iommu_hw_infohNtauh1jhjhhhjhNubj)}(hhh](j)}(h iommu_hw_infoh]j )}(hstruct iommu_hw_infoh](j&)}(hj)h]hstruct}(hj7hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj7hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMzubj8)}(h h]h }(hj 8hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj7hhhj 8hMzubjI)}(h iommu_hw_infoh]jO)}(hj7h]h iommu_hw_info}(hj8hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj8ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj7hhhj 8hMzubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj7hhhj 8hMzubah}(h]j7ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj 8hMzhj7hhubj{)}(hhh]h)}(hioctl(IOMMU_GET_HW_INFO)h]hioctl(IOMMU_GET_HW_INFO)}(hj@8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMuhj=8hhubah}(h]h ]h"]h$]h&]uh1jzhj7hhhj 8hMzubeh}(h]h ](jstructeh"]h$]h&]jjjjX8jjX8jjjuh1jhhhjhjhNubj)}(hX/**Definition**:: struct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; __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 ``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}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`8ubh:}(hj`8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMyhj\8ubj)}(hstruct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; __u32 out_data_type; __u8 out_max_pasid_log2; __u8 __reserved[3]; __aligned_u64 out_capabilities; };h]hstruct iommu_hw_info { __u32 size; __u32 flags; __u32 dev_id; __u32 data_len; __aligned_u64 data_uptr; __u32 out_data_type; __u8 out_max_pasid_log2; __u8 __reserved[3]; __aligned_u64 out_capabilities; };}hj}8sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM{hj\8ubh)}(h **Members**h]j)}(hj8h]hMembers}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj\8ubj)}(hhh](j)}(h&``size`` sizeof(struct iommu_hw_info) h](j)}(h``size``h]j)}(hj8h]hsize}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMwhj8ubj )}(hhh]h)}(hsizeof(struct iommu_hw_info)h]hsizeof(struct iommu_hw_info)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMwhj8ubah}(h]h ]h"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMwhj8ubj)}(h``flags`` Must be 0 h](j)}(h ``flags``h]j)}(hj8h]hflags}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMxhj8ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMxhj8ubah}(h]h ]h"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMxhj8ubj)}(h+``dev_id`` The device bound to the iommufd h](j)}(h ``dev_id``h]j)}(hj9h]hdev_id}(hj!9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMyhj9ubj )}(hhh]h)}(hThe device bound to the iommufdh]hThe device bound to the iommufd}(hj89hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj49hMyhj59ubah}(h]h ]h"]h$]h&]uh1j hj9ubeh}(h]h ]h"]h$]h&]uh1jhj49hMyhj8ubj)}(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]j)}(hjX9h]hdata_len}(hjZ9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV9ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM{hjR9ubj )}(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}(hjq9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMzhjn9ubah}(h]h ]h"]h$]h&]uh1j hjR9ubeh}(h]h ]h"]h$]h&]uh1jhjm9hM{hj8ubj)}(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]j)}(hj9h]h data_uptr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM}hj9ubj )}(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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM|hj9ubah}(h]h ]h"]h$]h&]uh1j hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM}hj8ubj)}(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]j)}(hj9h]h out_data_type}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj9ubj )}(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.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM~hj9ubah}(h]h ]h"]h$]h&]uh1j hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hMhj8ubj)}(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]j)}(hj:h]hout_max_pasid_log2}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj:ubj )}(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.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj:ubah}(h]h ]h"]h$]h&]uh1j hj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhj8ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hj@:h]h __reserved}(hjB:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj::ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjY:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU:hMhjV:ubah}(h]h ]h"]h$]h&]uh1j hj::ubeh}(h]h ]h"]h$]h&]uh1jhjU:hMhj8ubj)}(hp``out_capabilities`` Output the generic iommu capability info type as defined in the enum iommu_hw_capabilities.h](j)}(h``out_capabilities``h]j)}(hjy:h]hout_capabilities}(hj{:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjs:ubj )}(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.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1j hjs:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhj8ubeh}(h]h ]h"]h$]h&]uh1jhj\8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj:h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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, }(hj:hhhNhNubj)}(h **data_uptr**h]h data_uptr}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh and its length }(hj:hhhNhNubj)}(h **data_len**h]hdata_len}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh 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 }(hj:hhhNhNubj)}(h **data_len**h]hdata_len}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh. If the ioctl succeeds, }(hj:hhhNhNubj)}(h **data_len**h]hdata_len}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh> will be updated to the length that kernel actually supports, }(hj:hhhNhNubj)}(h**out_data_type**h]h out_data_type}(hj0;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhC will be filled to decode the data filled in the buffer pointed by }(hj:hhhNhNubj)}(h **data_uptr**h]h data_uptr}(hjB;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh. Input }(hj:hhhNhNubj)}(h **data_len**h]hdata_len}(hjT;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh == zero is allowed.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(iommu_hwpt_set_dirty_tracking (C struct)c.iommu_hwpt_set_dirty_trackinghNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_set_dirty_trackingh]j )}(h$struct iommu_hwpt_set_dirty_trackingh](j&)}(hj)h]hstruct}(hj;hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj;hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj;hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj;hhhj;hMubjI)}(hiommu_hwpt_set_dirty_trackingh]jO)}(hj;h]hiommu_hwpt_set_dirty_tracking}(hj;hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj;ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj;hhhj;hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj~;hhhj;hMubah}(h]jy;ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj;hMhj{;hhubj{)}(hhh]h)}(h$ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING)h]h$ioctl(IOMMU_HWPT_SET_DIRTY_TRACKING)}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj;hhubah}(h]h ]h"]h$]h&]uh1jzhj{;hhhj;hMubeh}(h]h ](jstructeh"]h$]h&]jjjj;jj;jjjuh1jhhhjhjhNubj)}(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}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh:}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj;ubj)}(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; };}hj<sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj;ubh)}(h **Members**h]j)}(hj<h]hMembers}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj;ubj)}(hhh](j)}(h6``size`` sizeof(struct iommu_hwpt_set_dirty_tracking) h](j)}(h``size``h]j)}(hj5<h]hsize}(hj7<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3<ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj/<ubj )}(hhh]h)}(h,sizeof(struct iommu_hwpt_set_dirty_tracking)h]h,sizeof(struct iommu_hwpt_set_dirty_tracking)}(hjN<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ<hMhjK<ubah}(h]h ]h"]h$]h&]uh1j hj/<ubeh}(h]h ]h"]h$]h&]uh1jhjJ<hMhj,<ubj)}(hD``flags`` Combination of enum iommufd_hwpt_set_dirty_tracking_flags h](j)}(h ``flags``h]j)}(hjn<h]hflags}(hjp<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl<ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjh<ubj )}(hhh]h)}(h9Combination of enum iommufd_hwpt_set_dirty_tracking_flagsh]h9Combination of enum iommufd_hwpt_set_dirty_tracking_flags}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1j hjh<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj,<ubj)}(h=``hwpt_id`` HW pagetable ID that represents the IOMMU domain h](j)}(h ``hwpt_id``h]j)}(hj<h]hhwpt_id}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj<ubj )}(hhh]h)}(h0HW pagetable ID that represents the IOMMU domainh]h0HW pagetable ID that represents the IOMMU domain}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1j hj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj,<ubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hj<h]h __reserved}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj<ubj )}(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:323: ./include/uapi/linux/iommufd.hhMhj<ubah}(h]h ]h"]h$]h&]uh1j hj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj,<ubeh}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj#=h]h Description}(hj%=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(h)Toggle dirty tracking on an HW pagetable.h]h)Toggle dirty tracking on an HW pagetable.}(hj9=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j,iommufd_hwpt_get_dirty_bitmap_flags (C enum)%c.iommufd_hwpt_get_dirty_bitmap_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(h#iommufd_hwpt_get_dirty_bitmap_flagsh]j )}(h(enum iommufd_hwpt_get_dirty_bitmap_flagsh](j&)}(hjh]henum}(hja=hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj]=hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjo=hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj]=hhhjn=hMubjI)}(h#iommufd_hwpt_get_dirty_bitmap_flagsh]jO)}(hj[=h]h#iommufd_hwpt_get_dirty_bitmap_flags}(hj=hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj}=ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj]=hhhjn=hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjY=hhhjn=hMubah}(h]jT=ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjn=hMhjV=hhubj{)}(hhh]h)}(hFlags for getting dirty bitsh]hFlags for getting dirty bits}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=hhubah}(h]h ]h"]h$]h&]uh1jzhjV=hhhjn=hMubeh}(h]h ](jenumeh"]h$]h&]jjjj=jj=jjjuh1jhhhjhjhNubj)}(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)}(hj=h]h Constants}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=ubj)}(hhh]j)}(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]j)}(hj=h]h$IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=ubj )}(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.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=ubah}(h]h ]h"]h$]h&]uh1j hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&iommu_hwpt_get_dirty_bitmap (C struct)c.iommu_hwpt_get_dirty_bitmaphNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_get_dirty_bitmaph]j )}(h"struct iommu_hwpt_get_dirty_bitmaph](j&)}(hj)h]hstruct}(hj>>hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj:>hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjL>hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj:>hhhjK>hMubjI)}(hiommu_hwpt_get_dirty_bitmaph]jO)}(hj8>h]hiommu_hwpt_get_dirty_bitmap}(hj^>hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjZ>ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj:>hhhjK>hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj6>hhhjK>hMubah}(h]j1>ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjK>hMhj3>hhubj{)}(hhh]h)}(h"ioctl(IOMMU_HWPT_GET_DIRTY_BITMAP)h]h"ioctl(IOMMU_HWPT_GET_DIRTY_BITMAP)}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj}>hhubah}(h]h ]h"]h$]h&]uh1jzhj3>hhhjK>hMubeh}(h]h ](jstructeh"]h$]h&]jjjj>jj>jjjuh1jhhhjhjhNubj)}(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>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh:}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj>ubj)}(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; };}hj>sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj>ubh)}(h **Members**h]j)}(hj>h]hMembers}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj>ubj)}(hhh](j)}(h4``size`` sizeof(struct iommu_hwpt_get_dirty_bitmap) h](j)}(h``size``h]j)}(hj>h]hsize}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj>ubj )}(hhh]h)}(h*sizeof(struct iommu_hwpt_get_dirty_bitmap)h]h*sizeof(struct iommu_hwpt_get_dirty_bitmap)}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1j hj>ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj>ubj)}(h=``hwpt_id`` HW pagetable ID that represents the IOMMU domain h](j)}(h ``hwpt_id``h]j)}(hj&?h]hhwpt_id}(hj(?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$?ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj ?ubj )}(hhh]h)}(h0HW pagetable ID that represents the IOMMU domainh]h0HW pagetable ID that represents the IOMMU domain}(hj??hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;?hMhjubj)}(hB``flags`` Combination of enum iommufd_hwpt_get_dirty_bitmap_flags h](j)}(h ``flags``h]j)}(hj_?h]hflags}(hja?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]?ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjY?ubj )}(hhh]h)}(h7Combination of enum iommufd_hwpt_get_dirty_bitmap_flagsh]h7Combination of enum iommufd_hwpt_get_dirty_bitmap_flags}(hjx?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt?hMhju?ubah}(h]h ]h"]h$]h&]uh1j hjY?ubeh}(h]h ]h"]h$]h&]uh1jhjt?hMhj>ubj)}(h``__reserved`` Must be 0 h](j)}(h``__reserved``h]j)}(hj?h]h __reserved}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj?ubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj>ubj)}(h+``iova`` base IOVA of the bitmap first bit h](j)}(h``iova``h]j)}(hj?h]hiova}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj?ubj )}(hhh]h)}(h!base IOVA of the bitmap first bith]h!base IOVA of the bitmap first bit}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj>ubj)}(h``length`` IOVA range size h](j)}(h ``length``h]j)}(hj @h]hlength}(hj @hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj@ubj )}(hhh]h)}(hIOVA range sizeh]hIOVA range size}(hj#@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj @ubah}(h]h ]h"]h$]h&]uh1j hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj>ubj)}(h>``page_size`` page size granularity of each bit in the bitmap h](j)}(h ``page_size``h]j)}(hjC@h]h page_size}(hjE@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA@ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj=@ubj )}(hhh]h)}(h/page size granularity of each bit in the bitmaph]h/page size granularity of each bit in the bitmap}(hj\@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX@hMhjY@ubah}(h]h ]h"]h$]h&]uh1j hj=@ubeh}(h]h ]h"]h$]h&]uh1jhjX@hMhj>ubj)}(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]j)}(hj|@h]hdata}(hj~@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz@ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjv@ubj )}(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.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j hjv@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj@h]h Description}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hChecking a given IOVA is dirty:h]hChecking a given IOVA is dirty:}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj4)}(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))}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj@ubah}(h]h ]h"]h$]h&]uh1j3hj@hMhjhhubh)}(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.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(iommu_hwpt_invalidate_data_type (C enum)!c.iommu_hwpt_invalidate_data_typehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_invalidate_data_typeh]j )}(h$enum iommu_hwpt_invalidate_data_typeh](j&)}(hjh]henum}(hj$AhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj Ahhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj2AhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj Ahhhj1AhMubjI)}(hiommu_hwpt_invalidate_data_typeh]jO)}(hjAh]hiommu_hwpt_invalidate_data_type}(hjDAhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj@Aubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj Ahhhj1AhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjAhhhj1AhMubah}(h]jAah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj1AhMhjAhhubj{)}(hhh]h)}(h'IOMMU HWPT Cache Invalidation Data Typeh]h'IOMMU HWPT Cache Invalidation Data Type}(hjfAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjcAhhubah}(h]h ]h"]h$]h&]uh1jzhjAhhhj1AhMubeh}(h]h ](jenumeh"]h$]h&]jjjj~Ajj~Ajjjuh1jhhhjhjhNubj)}(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)}(hjAh]h Constants}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjAubj)}(hhh](j)}(hC``IOMMU_HWPT_INVALIDATE_DATA_VTD_S1`` Invalidation data for VTD_S1 h](j)}(h%``IOMMU_HWPT_INVALIDATE_DATA_VTD_S1``h]j)}(hjAh]h!IOMMU_HWPT_INVALIDATE_DATA_VTD_S1}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjAubj )}(hhh]h)}(hInvalidation data for VTD_S1h]hInvalidation data for VTD_S1}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMhjAubah}(h]h ]h"]h$]h&]uh1j hjAubeh}(h]h ]h"]h$]h&]uh1jhjAhMhjAubj)}(hL``IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3`` Invalidation data for ARM SMMUv3h](j)}(h+``IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3``h]j)}(hjAh]h'IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjAubj )}(hhh]h)}(h Invalidation data for ARM SMMUv3h]h Invalidation data for ARM SMMUv3}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjAubah}(h]h ]h"]h$]h&]uh1j hjAubeh}(h]h ]h"]h$]h&]uh1jhjAhMhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+iommu_hwpt_vtd_s1_invalidate_flags (C enum)$c.iommu_hwpt_vtd_s1_invalidate_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(h"iommu_hwpt_vtd_s1_invalidate_flagsh]j )}(h'enum iommu_hwpt_vtd_s1_invalidate_flagsh](j&)}(hjh]henum}(hj:BhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj6Bhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjHBhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj6BhhhjGBhMubjI)}(h"iommu_hwpt_vtd_s1_invalidate_flagsh]jO)}(hj4Bh]h"iommu_hwpt_vtd_s1_invalidate_flags}(hjZBhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjVBubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj6BhhhjGBhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj2BhhhjGBhMubah}(h]j-Bah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjGBhMhj/Bhhubj{)}(hhh]h)}(h/Flags for Intel VT-d stage-1 cache invalidationh]h/Flags for Intel VT-d stage-1 cache invalidation}(hj|BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjyBhhubah}(h]h ]h"]h$]h&]uh1jzhj/BhhhjGBhMubeh}(h]h ](jenumeh"]h$]h&]jjjjBjjBjjjuh1jhhhjhjhNubj)}(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)}(hjBh]h Constants}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjBubj)}(hhh]j)}(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]j)}(hjBh]hIOMMU_VTD_INV_FLAGS_LEAF}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjBubj )}(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.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjBubah}(h]h ]h"]h$]h&]uh1j hjBubeh}(h]h ]h"]h$]h&]uh1jhjBhMhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'iommu_hwpt_vtd_s1_invalidate (C struct)c.iommu_hwpt_vtd_s1_invalidatehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_vtd_s1_invalidateh]j )}(h#struct iommu_hwpt_vtd_s1_invalidateh](j&)}(hj)h]hstruct}(hjChhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjChhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj%ChhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjChhhj$ChMubjI)}(hiommu_hwpt_vtd_s1_invalidateh]jO)}(hjCh]hiommu_hwpt_vtd_s1_invalidate}(hj7ChhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj3Cubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjChhhj$ChMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjChhhj$ChMubah}(h]j Cah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj$ChMhj Chhubj{)}(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)}(hjYChhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjVChhubah}(h]h ]h"]h$]h&]uh1jzhj Chhhj$ChMubeh}(h]h ](jstructeh"]h$]h&]jjjjqCjjqCjjjuh1jhhhjhjhNubj)}(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}(hj}ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyCubh:}(hjyChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjuCubj)}(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; };}hjCsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjuCubh)}(h **Members**h]j)}(hjCh]hMembers}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjuCubj)}(hhh](j)}(hW``addr`` The start address of the range to be invalidated. It needs to be 4KB aligned. h](j)}(h``addr``h]j)}(hjCh]haddr}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjCubj )}(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.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjCubah}(h]h ]h"]h$]h&]uh1j hjCubeh}(h]h ]h"]h$]h&]uh1jhjChMhjCubj)}(h<``npages`` Number of contiguous 4K pages to be invalidated. h](j)}(h ``npages``h]j)}(hjDh]hnpages}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjCubj )}(hhh]h)}(h0Number of contiguous 4K pages to be invalidated.h]h0Number of contiguous 4K pages to be invalidated.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1j hjCubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjCubj)}(hA``flags`` Combination of enum iommu_hwpt_vtd_s1_invalidate_flags h](j)}(h ``flags``h]j)}(hj9Dh]hflags}(hj;DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Dubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj3Dubj )}(hhh]h)}(h6Combination of enum iommu_hwpt_vtd_s1_invalidate_flagsh]h6Combination of enum iommu_hwpt_vtd_s1_invalidate_flags}(hjRDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNDhMhjODubah}(h]h ]h"]h$]h&]uh1j hj3Dubeh}(h]h ]h"]h$]h&]uh1jhjNDhMhjCubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hjrDh]h __reserved}(hjtDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpDubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjlDubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjDubah}(h]h ]h"]h$]h&]uh1j hjlDubeh}(h]h ]h"]h$]h&]uh1jhjDhMhjCubeh}(h]h ]h"]h$]h&]uh1jhjuCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjhhubh)}(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.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjhhubh)}(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 }(hjDhhhNhNubj)}(h**addr**h]haddr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh to be 0 and }(hjDhhhNhNubj)}(h **npages**h]hnpages}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh to be U64_MAX.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjhhubh)}(hCThe device TLB will be invalidated automatically if ATS is enabled.h]hCThe device TLB will be invalidated automatically if ATS is enabled.}(hj EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j-iommu_viommu_arm_smmuv3_invalidate (C struct)$c.iommu_viommu_arm_smmuv3_invalidatehNtauh1jhjhhhjhNubj)}(hhh](j)}(h"iommu_viommu_arm_smmuv3_invalidateh]j )}(h)struct iommu_viommu_arm_smmuv3_invalidateh](j&)}(hj)h]hstruct}(hj5EhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj1Ehhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjCEhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj1EhhhjBEhMubjI)}(h"iommu_viommu_arm_smmuv3_invalidateh]jO)}(hj/Eh]h"iommu_viommu_arm_smmuv3_invalidate}(hjUEhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjQEubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj1EhhhjBEhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj-EhhhjBEhMubah}(h]j(Eah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjBEhMhj*Ehhubj{)}(hhh]h)}(hGARM SMMUv3 cache invalidation (IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3)h]hGARM SMMUv3 cache invalidation (IOMMU_VIOMMU_INVALIDATE_DATA_ARM_SMMUV3)}(hjwEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjtEhhubah}(h]h ]h"]h$]h&]uh1jzhj*EhhhjBEhMubeh}(h]h ](jstructeh"]h$]h&]jjjjEjjEjjjuh1jhhhjhjhNubj)}(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}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh:}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjEubj)}(hIstruct iommu_viommu_arm_smmuv3_invalidate { __aligned_le64 cmd[2]; };h]hIstruct iommu_viommu_arm_smmuv3_invalidate { __aligned_le64 cmd[2]; };}hjEsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjEubh)}(h **Members**h]j)}(hjEh]hMembers}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM$hjEubj)}(hhh]j)}(hY``cmd`` 128-bit cache invalidation command that runs in SMMU CMDQ. Must be little-endian.h](j)}(h``cmd``h]j)}(hjEh]hcmd}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjEubj )}(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.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMhjEubah}(h]h ]h"]h$]h&]uh1j hjEubeh}(h]h ]h"]h$]h&]uh1jhjEhMhjEubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj&Fh]h Description}(hj(FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Fubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM!hjhhubj)}(hhh]j)}(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 }(hjCFhhhNhNubj)}(h **hwpt_id**h]hhwpt_id}(hjKFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCFubh:}(hjCFhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM'hj?Fubj )}(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}(hjgFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjdFubah}(h]h ]h"]h$]h&]uh1j hj?Fubeh}(h]h ]h"]h$]h&]uh1jhjcFhM'hjGubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM@hjGubj)}(hhh](j)}(h.``size`` sizeof(struct iommu_hwpt_invalidate) h](j)}(h``size``h]j)}(hj_Gh]hsize}(hjaGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]Gubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM2hjYGubj )}(hhh]h)}(h$sizeof(struct iommu_hwpt_invalidate)h]h$sizeof(struct iommu_hwpt_invalidate)}(hjxGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjtGhM2hjuGubah}(h]h ]h"]h$]h&]uh1j hjYGubeh}(h]h ]h"]h$]h&]uh1jhjtGhM2hjVGubj)}(hD``hwpt_id`` ID of a nested HWPT or a vIOMMU, for cache invalidation h](j)}(h ``hwpt_id``h]j)}(hjGh]hhwpt_id}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM3hjGubj )}(hhh]h)}(h7ID of a nested HWPT or a vIOMMU, for cache invalidationh]h7ID of a nested HWPT or a vIOMMU, for cache invalidation}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhM3hjGubah}(h]h ]h"]h$]h&]uh1j hjGubeh}(h]h ]h"]h$]h&]uh1jhjGhM3hjVGubj)}(hS``data_uptr`` User pointer to an array of driver-specific cache invalidation data. h](j)}(h ``data_uptr``h]j)}(hjGh]h data_uptr}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM5hjGubj )}(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.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM4hjGubah}(h]h ]h"]h$]h&]uh1j hjGubeh}(h]h ]h"]h$]h&]uh1jhjGhM5hjVGubj)}(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]j)}(hj Hh]h data_type}(hj HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Hubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM8hjHubj )}(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 }(hj$HhhhNhNubj)}(h **hwpt_id**h]hhwpt_id}(hj,HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Hubh.}(hj$HhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM6hj!Hubah}(h]h ]h"]h$]h&]uh1j hjHubeh}(h]h ]h"]h$]h&]uh1jhj HhM8hjVGubj)}(hH``entry_len`` Length (in bytes) of a request entry in the request array h](j)}(h ``entry_len``h]j)}(hjWHh]h entry_len}(hjYHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUHubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM9hjQHubj )}(hhh]h)}(h9Length (in bytes) of a request entry in the request arrayh]h9Length (in bytes) of a request entry in the request array}(hjpHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlHhM9hjmHubah}(h]h ]h"]h$]h&]uh1j hjQHubeh}(h]h ]h"]h$]h&]uh1jhjlHhM9hjVGubj)}(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]j)}(hjHh]h entry_num}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM;hjHubj )}(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.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM:hjHubah}(h]h ]h"]h$]h&]uh1j hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM;hjVGubj)}(h``__reserved`` Must be 0.h](j)}(h``__reserved``h]j)}(hjHh]h __reserved}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM;hjHubj )}(hhh]h)}(h Must be 0.h]h Must be 0.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM<hjHubah}(h]h ]h"]h$]h&]uh1j hjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM;hjVGubeh}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj Ih]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Iubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM?hjhhubh)}(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 }(hj#IhhhNhNubj)}(h **hwpt_id**h]hhwpt_id}(hj+IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Iubhi. Other caches, such as device cache or descriptor cache can be flushed if a vIOMMU is passed in via the }(hj#IhhhNhNubj)}(h **hwpt_id**h]hhwpt_id}(hj=IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Iubh field.}(hj#IhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM=hjhhubh)}(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 }(hjVIhhhNhNubj)}(h **entry_len**h]h entry_len}(hj^IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVIubh * }(hjVIhhhNhNubj)}(h **entry_num**h]h entry_num}(hjpIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVIubh.}(hjVIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMBhjhhubh)}(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 }(hjIhhhNhNubj)}(h.**entry_num**==0 is allowed, and **entry_len**h]h*entry_num**==0 is allowed, and **entry_len}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh and }(hjIhhhNhNubj)}(h **data_uptr**h]h data_uptr}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubhG would be ignored in this case. This can be used to check if the given }(hjIhhhNhNubj)}(h **data_type**h]h data_type}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh is supported or not by kernel.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMEhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!iommu_hwpt_pgfault_flags (C enum)c.iommu_hwpt_pgfault_flagshNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_pgfault_flagsh]j )}(henum iommu_hwpt_pgfault_flagsh](j&)}(hjh]henum}(hjIhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjIhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMLubj8)}(h h]h }(hjIhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjIhhhjIhMLubjI)}(hiommu_hwpt_pgfault_flagsh]jO)}(hjIh]hiommu_hwpt_pgfault_flags}(hjJhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjJubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjIhhhjIhMLubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjIhhhjIhMLubah}(h]jIah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjIhMLhjIhhubj{)}(hhh]h)}(h#flags for struct iommu_hwpt_pgfaulth]h#flags for struct iommu_hwpt_pgfault}(hj)JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMUhj&Jhhubah}(h]h ]h"]h$]h&]uh1jzhjIhhhjIhMLubeh}(h]h ](jenumeh"]h$]h&]jjjjAJjjAJjjjuh1jhhhjhjhNubj)}(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)}(hjKJh]h Constants}(hjMJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIJubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMYhjEJubj)}(hhh](j)}(hP``IOMMU_PGFAULT_FLAGS_PASID_VALID`` The pasid field of the fault data is valid. h](j)}(h#``IOMMU_PGFAULT_FLAGS_PASID_VALID``h]j)}(hjjJh]hIOMMU_PGFAULT_FLAGS_PASID_VALID}(hjlJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhJubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM]hjdJubj )}(hhh]h)}(h+The pasid field of the fault data is valid.h]h+The pasid field of the fault data is valid.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM\hjJubah}(h]h ]h"]h$]h&]uh1j hjdJubeh}(h]h ]h"]h$]h&]uh1jhjJhM]hjaJubj)}(hG``IOMMU_PGFAULT_FLAGS_LAST_PAGE`` It's the last fault of a fault group.h](j)}(h!``IOMMU_PGFAULT_FLAGS_LAST_PAGE``h]j)}(hjJh]hIOMMU_PGFAULT_FLAGS_LAST_PAGE}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM_hjJubj )}(hhh]h)}(h%It's the last fault of a fault group.h]h'It’s the last fault of a fault group.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM`hjJubah}(h]h ]h"]h$]h&]uh1j hjJubeh}(h]h ]h"]h$]h&]uh1jhjJhM_hjaJubeh}(h]h ]h"]h$]h&]uh1jhjEJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommu_hwpt_pgfault_perm (C enum)c.iommu_hwpt_pgfault_permhNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_pgfault_permh]j )}(henum iommu_hwpt_pgfault_permh](j&)}(hjh]henum}(hjJhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjJhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMfubj8)}(h h]h }(hj KhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjJhhhj KhMfubjI)}(hiommu_hwpt_pgfault_permh]jO)}(hjJh]hiommu_hwpt_pgfault_perm}(hjKhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjKubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjJhhhj KhMfubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjJhhhj KhMfubah}(h]jJah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj KhMfhjJhhubj{)}(hhh]h)}(h'perm bits for struct iommu_hwpt_pgfaulth]h'perm bits for struct iommu_hwpt_pgfault}(hj@KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM`hj=Khhubah}(h]h ]h"]h$]h&]uh1jzhjJhhhj KhMfubeh}(h]h ](jenumeh"]h$]h&]jjjjXKjjXKjjjuh1jhhhjhjhNubj)}(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)}(hjbKh]h Constants}(hjdKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`Kubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMdhj\Kubj)}(hhh](j)}(h8``IOMMU_PGFAULT_PERM_READ`` request for read permission h](j)}(h``IOMMU_PGFAULT_PERM_READ``h]j)}(hjKh]hIOMMU_PGFAULT_PERM_READ}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMghj{Kubj )}(hhh]h)}(hrequest for read permissionh]hrequest for read permission}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMghjKubah}(h]h ]h"]h$]h&]uh1j hj{Kubeh}(h]h ]h"]h$]h&]uh1jhjKhMghjxKubj)}(h:``IOMMU_PGFAULT_PERM_WRITE`` request for write permission h](j)}(h``IOMMU_PGFAULT_PERM_WRITE``h]j)}(hjKh]hIOMMU_PGFAULT_PERM_WRITE}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMjhjKubj )}(hhh]h)}(hrequest for write permissionh]hrequest for write permission}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMjhjKubah}(h]h ]h"]h$]h&]uh1j hjKubeh}(h]h ]h"]h$]h&]uh1jhjKhMjhjxKubj)}(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]j)}(hjKh]hIOMMU_PGFAULT_PERM_EXEC}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMnhjKubj )}(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.}(hj LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMmhj Lubah}(h]h ]h"]h$]h&]uh1j hjKubeh}(h]h ]h"]h$]h&]uh1jhjLhMnhjxKubj)}(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]j)}(hj-Lh]hIOMMU_PGFAULT_PERM_PRIV}(hj/LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Lubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMrhj'Lubj )}(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.}(hjFLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMqhjCLubah}(h]h ]h"]h$]h&]uh1j hj'Lubeh}(h]h ]h"]h$]h&]uh1jhjBLhMrhjxKubeh}(h]h ]h"]h$]h&]uh1jhj\Kubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_hwpt_pgfault (C struct)c.iommu_hwpt_pgfaulthNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_pgfaulth]j )}(hstruct iommu_hwpt_pgfaulth](j&)}(hj)h]hstruct}(hjLhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjLhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMyubj8)}(h h]h }(hjLhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjLhhhjLhMyubjI)}(hiommu_hwpt_pgfaulth]jO)}(hjLh]hiommu_hwpt_pgfault}(hjLhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjLubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjLhhhjLhMyubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjLhhhjLhMyubah}(h]jzLah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjLhMyhj|Lhhubj{)}(hhh]h)}(hiommu page fault datah]hiommu page fault data}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMqhjLhhubah}(h]h ]h"]h$]h&]uh1jzhj|LhhhjLhMyubeh}(h]h ](jstructeh"]h$]h&]jjjjLjjLjjjuh1jhhhjhjhNubj)}(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}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh:}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMuhjLubj)}(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; };}hjMsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMwhjLubh)}(h **Members**h]j)}(hjMh]hMembers}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjLubj)}(hhh](j)}(h7``flags`` Combination of enum iommu_hwpt_pgfault_flags h](j)}(h ``flags``h]j)}(hj6Mh]hflags}(hj8MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4Mubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMshj0Mubj )}(hhh]h)}(h,Combination of enum iommu_hwpt_pgfault_flagsh]h,Combination of enum iommu_hwpt_pgfault_flags}(hjOMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKMhMshjLMubah}(h]h ]h"]h$]h&]uh1j hj0Mubeh}(h]h ]h"]h$]h&]uh1jhjKMhMshj-Mubj)}(h'``dev_id`` id of the originated device h](j)}(h ``dev_id``h]j)}(hjoMh]hdev_id}(hjqMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmMubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMthjiMubj )}(hhh]h)}(hid of the originated deviceh]hid of the originated device}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMthjMubah}(h]h ]h"]h$]h&]uh1j hjiMubeh}(h]h ]h"]h$]h&]uh1jhjMhMthj-Mubj)}(h#``pasid`` Process Address Space ID h](j)}(h ``pasid``h]j)}(hjMh]hpasid}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMuhjMubj )}(hhh]h)}(hProcess Address Space IDh]hProcess Address Space ID}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMuhjMubah}(h]h ]h"]h$]h&]uh1j hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhMuhj-Mubj)}(h#``grpid`` Page Request Group Index h](j)}(h ``grpid``h]j)}(hjMh]hgrpid}(h jMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMvhjMubj )}(hhh]h)}(hPage Request Group Indexh]hPage Request Group Index}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMvhjMubah}(h]h ]h"]h$]h&]uh1j hjMubeh}(h]h ]h"]h$]h&]uh1jhjMhMvhj-Mubj)}(h5``perm`` Combination of enum iommu_hwpt_pgfault_perm h](j)}(h``perm``h]j)}(hjNh]hperm}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMwhjNubj )}(hhh]h)}(h+Combination of enum iommu_hwpt_pgfault_permh]h+Combination of enum iommu_hwpt_pgfault_perm}(hj3NhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/NhMwhj0Nubah}(h]h ]h"]h$]h&]uh1j hjNubeh}(h]h ]h"]h$]h&]uh1jhj/NhMwhj-Mubj)}(h``__reserved`` Must be 0. h](j)}(h``__reserved``h]j)}(hjSNh]h __reserved}(hjUNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQNubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMxhjMNubj )}(hhh]h)}(h Must be 0.h]h Must be 0.}(hjlNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhMxhjiNubah}(h]h ]h"]h$]h&]uh1j hjMNubeh}(h]h ]h"]h$]h&]uh1jhjhNhMxhj-Mubj)}(h``addr`` Fault address h](j)}(h``addr``h]j)}(hjNh]haddr}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMyhjNubj )}(hhh]h)}(h Fault addressh]h Fault address}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMyhjNubah}(h]h ]h"]h$]h&]uh1j hjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMyhj-Mubj)}(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]j)}(hjNh]hlength}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM}hjNubj )}(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.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMzhjNubah}(h]h ]h"]h$]h&]uh1j hjNubeh}(h]h ]h"]h$]h&]uh1jhjNhM}hj-Mubj)}(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]j)}(hjNh]hcookie}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjNubj )}(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.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM~hjOubah}(h]h ]h"]h$]h&]uh1j hjNubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj-Mubeh}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#iommufd_page_response_code (C enum)c.iommufd_page_response_codehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_page_response_codeh]j )}(henum iommufd_page_response_codeh](j&)}(hjh]henum}(hjYOhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjUOhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjgOhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjUOhhhjfOhMubjI)}(hiommufd_page_response_codeh]jO)}(hjSOh]hiommufd_page_response_code}(hjyOhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjuOubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjUOhhhjfOhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjQOhhhjfOhMubah}(h]jLOah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjfOhMhjNOhhubj{)}(hhh]h)}(hReturn status of fault handlersh]hReturn status of fault handlers}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjOhhubah}(h]h ]h"]h$]h&]uh1jzhjNOhhhjfOhMubeh}(h]h ](jenumeh"]h$]h&]jjjjOjjOjjjuh1jhhhjhjhNubj)}(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)}(hjOh]h Constants}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjOubj)}(hhh](j)}(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]j)}(hjOh]hIOMMUFD_PAGE_RESP_SUCCESS}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjOubj )}(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.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjOubah}(h]h ]h"]h$]h&]uh1j hjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjOubj)}(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]j)}(hjPh]hIOMMUFD_PAGE_RESP_INVALID}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjPubj )}(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/PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj,Pubah}(h]h ]h"]h$]h&]uh1j hjPubeh}(h]h ]h"]h$]h&]uh1jhj+PhMhjOubeh}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#iommu_hwpt_page_response (C struct)c.iommu_hwpt_page_responsehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_hwpt_page_responseh]j )}(hstruct iommu_hwpt_page_responseh](j&)}(hj)h]hstruct}(hjpPhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjlPhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hj~PhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjlPhhhj}PhMubjI)}(hiommu_hwpt_page_responseh]jO)}(hjjPh]hiommu_hwpt_page_response}(hjPhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjPubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjlPhhhj}PhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjhPhhhj}PhMubah}(h]jcPah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj}PhMhjePhhubj{)}(hhh]h)}(hIOMMU page fault responseh]hIOMMU page fault response}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjPhhubah}(h]h ]h"]h$]h&]uh1jzhjePhhhj}PhMubeh}(h]h ](jstructeh"]h$]h&]jjjjPjjPjjjuh1jhhhjhjhNubj)}(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}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh:}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjPubj)}(hFstruct iommu_hwpt_page_response { __u32 cookie; __u32 code; };h]hFstruct iommu_hwpt_page_response { __u32 cookie; __u32 code; };}hjPsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjPubh)}(h **Members**h]j)}(hjQh]hMembers}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjPubj)}(hhh](j)}(hD``cookie`` The kernel-managed cookie reported in the fault message. h](j)}(h ``cookie``h]j)}(hjQh]hcookie}(hj!QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjQubj )}(hhh]h)}(h8The kernel-managed cookie reported in the fault message.h]h8The kernel-managed cookie reported in the fault message.}(hj8QhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4QhMhj5Qubah}(h]h ]h"]h$]h&]uh1j hjQubeh}(h]h ]h"]h$]h&]uh1jhj4QhMhjQubj)}(hA``code`` One of response code in enum iommufd_page_response_code.h](j)}(h``code``h]j)}(hjXQh]hcode}(hjZQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVQubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRQubj )}(hhh]h)}(h8One of response code in enum iommufd_page_response_code.h]h8One of response code in enum iommufd_page_response_code.}(hjqQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjnQubah}(h]h ]h"]h$]h&]uh1j hjRQubeh}(h]h ]h"]h$]h&]uh1jhjmQhMhjQubeh}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_fault_alloc (C struct)c.iommu_fault_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_fault_alloch]j )}(hstruct iommu_fault_alloch](j&)}(hj)h]hstruct}(hjQhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjQhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjQhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjQhhhjQhMubjI)}(hiommu_fault_alloch]jO)}(hjQh]hiommu_fault_alloc}(hjQhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjQubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjQhhhjQhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjQhhhjQhMubah}(h]jQah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjQhMhjQhhubj{)}(hhh]h)}(hioctl(IOMMU_FAULT_QUEUE_ALLOC)h]hioctl(IOMMU_FAULT_QUEUE_ALLOC)}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjQhhubah}(h]h ]h"]h$]h&]uh1jzhjQhhhjQhMubeh}(h]h ](jstructeh"]h$]h&]jjjj Rjj Rjjjuh1jhhhjhjhNubj)}(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}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubh:}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRubj)}(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; };}hj1Rsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRubh)}(h **Members**h]j)}(hjBRh]hMembers}(hjDRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@Rubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRubj)}(hhh](j)}(h*``size`` sizeof(struct iommu_fault_alloc) h](j)}(h``size``h]j)}(hjaRh]hsize}(hjcRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Rubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[Rubj )}(hhh]h)}(h sizeof(struct iommu_fault_alloc)h]h sizeof(struct iommu_fault_alloc)}(hjzRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvRhMhjwRubah}(h]h ]h"]h$]h&]uh1j hj[Rubeh}(h]h ]h"]h$]h&]uh1jhjvRhMhjXRubj)}(h``flags`` Must be 0 h](j)}(h ``flags``h]j)}(hjRh]hflags}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjRubah}(h]h ]h"]h$]h&]uh1j hjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMhjXRubj)}(h)``out_fault_id`` The ID of the new FAULT h](j)}(h``out_fault_id``h]j)}(hjRh]h out_fault_id}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjRubj )}(hhh]h)}(hThe ID of the new FAULTh]hThe ID of the new FAULT}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjRubah}(h]h ]h"]h$]h&]uh1j hjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMhjXRubj)}(h(``out_fault_fd`` The fd of the new FAULTh](j)}(h``out_fault_fd``h]j)}(hj Sh]h out_fault_fd}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Subah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjSubj )}(hhh]h)}(hThe fd of the new FAULTh]hThe fd of the new FAULT}(hj%ShhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj"Subah}(h]h ]h"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]uh1jhj!ShMhjXRubeh}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjOSh]h Description}(hjQShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMSubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(h,Explicitly allocate a fault handling object.h]h,Explicitly allocate a fault handling object.}(hjeShhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_viommu_type (C enum)c.iommu_viommu_typehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_viommu_typeh]j )}(henum iommu_viommu_typeh](j&)}(hjh]henum}(hjShhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjShhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjShhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjShhhjShMubjI)}(hiommu_viommu_typeh]jO)}(hjSh]hiommu_viommu_type}(hjShhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjSubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjShhhjShMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjShhhjShMubah}(h]jSah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjShMhjShhubj{)}(hhh]h)}(hVirtual IOMMU Typeh]hVirtual IOMMU Type}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjShhubah}(h]h ]h"]h$]h&]uh1jzhjShhhjShMubeh}(h]h ](jenumeh"]h$]h&]jjjjSjjSjjjuh1jhhhjhjhNubj)}(h**Constants** ``IOMMU_VIOMMU_TYPE_DEFAULT`` Reserved for future use ``IOMMU_VIOMMU_TYPE_ARM_SMMUV3`` ARM SMMUv3 driver specific typeh](h)}(h **Constants**h]j)}(hjSh]h Constants}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjSubj)}(hhh](j)}(h6``IOMMU_VIOMMU_TYPE_DEFAULT`` Reserved for future use h](j)}(h``IOMMU_VIOMMU_TYPE_DEFAULT``h]j)}(hjTh]hIOMMU_VIOMMU_TYPE_DEFAULT}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj Tubj )}(hhh]h)}(hReserved for future useh]hReserved for future use}(hj)ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%ThMhj&Tubah}(h]h ]h"]h$]h&]uh1j hj Tubeh}(h]h ]h"]h$]h&]uh1jhj%ThMhjTubj)}(h@``IOMMU_VIOMMU_TYPE_ARM_SMMUV3`` ARM SMMUv3 driver specific typeh](j)}(h ``IOMMU_VIOMMU_TYPE_ARM_SMMUV3``h]j)}(hjITh]hIOMMU_VIOMMU_TYPE_ARM_SMMUV3}(hjKThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGTubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjCTubj )}(hhh]h)}(hARM SMMUv3 driver specific typeh]hARM SMMUv3 driver specific type}(hjbThhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj_Tubah}(h]h ]h"]h$]h&]uh1j hjCTubeh}(h]h ]h"]h$]h&]uh1jhj^ThMhjTubeh}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_viommu_alloc (C struct)c.iommu_viommu_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_viommu_alloch]j )}(hstruct iommu_viommu_alloch](j&)}(hj)h]hstruct}(hjThhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjThhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjThhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjThhhjThMubjI)}(hiommu_viommu_alloch]jO)}(hjTh]hiommu_viommu_alloc}(hjThhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjTubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjThhhjThMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjThhhjThMubah}(h]jTah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjThMhjThhubj{)}(hhh]h)}(hioctl(IOMMU_VIOMMU_ALLOC)h]hioctl(IOMMU_VIOMMU_ALLOC)}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjThhubah}(h]h ]h"]h$]h&]uh1jzhjThhhjThMubeh}(h]h ](jstructeh"]h$]h&]jjjjTjjTjjjuh1jhhhjhjhNubj)}(hX$**Definition**:: struct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; }; **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 objecth](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh:}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubj)}(hstruct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; };h]hstruct iommu_viommu_alloc { __u32 size; __u32 flags; __u32 type; __u32 dev_id; __u32 hwpt_id; __u32 out_viommu_id; };}hj"Usbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubh)}(h **Members**h]j)}(hj3Uh]hMembers}(hj5UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Uubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubj)}(hhh](j)}(h+``size`` sizeof(struct iommu_viommu_alloc) h](j)}(h``size``h]j)}(hjRUh]hsize}(hjTUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPUubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjLUubj )}(hhh]h)}(h!sizeof(struct iommu_viommu_alloc)h]h!sizeof(struct iommu_viommu_alloc)}(hjkUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgUhMhjhUubah}(h]h ]h"]h$]h&]uh1j hjLUubeh}(h]h ]h"]h$]h&]uh1jhjgUhMhjIUubj)}(h``flags`` Must be 0 h](j)}(h ``flags``h]j)}(hjUh]hflags}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j hjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjIUubj)}(hN``type`` Type of the virtual IOMMU. Must be defined in enum iommu_viommu_type h](j)}(h``type``h]j)}(hjUh]htype}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubj )}(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}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjUubah}(h]h ]h"]h$]h&]uh1j hjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjIUubj)}(hN``dev_id`` The device's physical IOMMU will be used to back the virtual IOMMU h](j)}(h ``dev_id``h]j)}(hjUh]hdev_id}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjUubj )}(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}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1j hjUubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjIUubj)}(h8``hwpt_id`` ID of a nesting parent HWPT to associate to h](j)}(h ``hwpt_id``h]j)}(hj6Vh]hhwpt_id}(hj8VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4Vubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj0Vubj )}(hhh]h)}(h+ID of a nesting parent HWPT to associate toh]h+ID of a nesting parent HWPT to associate to}(hjOVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKVhMhjLVubah}(h]h ]h"]h$]h&]uh1j hj0Vubeh}(h]h ]h"]h$]h&]uh1jhjKVhMhjIUubj)}(hB``out_viommu_id`` Output virtual IOMMU ID for the allocated objecth](j)}(h``out_viommu_id``h]j)}(hjoVh]h out_viommu_id}(hjqVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmVubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjiVubj )}(hhh]h)}(h0Output virtual IOMMU ID for the allocated objecth]h0Output virtual IOMMU ID for the allocated object}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjVubah}(h]h ]h"]h$]h&]uh1j hjiVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjIUubeh}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjVh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(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}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_vdevice_alloc (C struct)c.iommu_vdevice_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_vdevice_alloch]j )}(hstruct iommu_vdevice_alloch](j&)}(hj)h]hstruct}(hjVhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjVhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjVhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjVhhhjVhMubjI)}(hiommu_vdevice_alloch]jO)}(hjVh]hiommu_vdevice_alloc}(hjWhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj Wubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjVhhhjVhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjVhhhjVhMubah}(h]jVah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjVhMhjVhhubj{)}(hhh]h)}(hioctl(IOMMU_VDEVICE_ALLOC)h]hioctl(IOMMU_VDEVICE_ALLOC)}(hj2WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj/Whhubah}(h]h ]h"]h$]h&]uh1jzhjVhhhjVhMubeh}(h]h ](jstructeh"]h$]h&]jjjjJWjjJWjjjuh1jhhhjhjhNubj)}(hXT**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 a nested Intel VT-d to a Context Tableh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjVWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRWubh:}(hjRWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjNWubj)}(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; };}hjoWsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjNWubh)}(h **Members**h]j)}(hjWh]hMembers}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~Wubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjNWubj)}(hhh](j)}(h,``size`` sizeof(struct iommu_vdevice_alloc) h](j)}(h``size``h]j)}(hjWh]hsize}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjWubj )}(hhh]h)}(h"sizeof(struct iommu_vdevice_alloc)h]h"sizeof(struct iommu_vdevice_alloc)}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjWubah}(h]h ]h"]h$]h&]uh1j hjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMhjWubj)}(h=``viommu_id`` vIOMMU ID to associate with the virtual device h](j)}(h ``viommu_id``h]j)}(hjWh]h viommu_id}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjWubj )}(hhh]h)}(h.vIOMMU ID to associate with the virtual deviceh]h.vIOMMU ID to associate with the virtual device}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjWubah}(h]h ]h"]h$]h&]uh1j hjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMhjWubj)}(hL``dev_id`` The physical device to allocate a virtual instance on the vIOMMU h](j)}(h ``dev_id``h]j)}(hjXh]hdev_id}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj Xubj )}(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}(hj*XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&XhMhj'Xubah}(h]h ]h"]h$]h&]uh1j hj Xubeh}(h]h ]h"]h$]h&]uh1jhj&XhMhjWubj)}(hH``out_vdevice_id`` Object handle for the vDevice. Pass to IOMMU_DESTORY h](j)}(h``out_vdevice_id``h]j)}(hjJXh]hout_vdevice_id}(hjLXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHXubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjDXubj )}(hhh]h)}(h4Object handle for the vDevice. Pass to IOMMU_DESTORYh]h4Object handle for the vDevice. Pass to IOMMU_DESTORY}(hjcXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_XhMhj`Xubah}(h]h ]h"]h$]h&]uh1j hjDXubeh}(h]h ]h"]h$]h&]uh1jhj_XhMhjWubj)}(h``virt_id`` Virtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of a nested Intel VT-d to a Context Tableh](j)}(h ``virt_id``h]j)}(hjXh]hvirt_id}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj}Xubj )}(hhh]h)}(hVirtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of a nested Intel VT-d to a Context Tableh]hVirtual device ID per vIOMMU, e.g. vSID of ARM SMMUv3, vDeviceID of AMD IOMMU, and vRID of a nested Intel VT-d to a Context Table}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjXubah}(h]h ]h"]h$]h&]uh1j hj}Xubeh}(h]h ]h"]h$]h&]uh1jhjXhMhjWubeh}(h]h ]h"]h$]h&]uh1jhjNWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjXh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubh)}(hAllocate 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.h]hAllocate 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.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$iommu_ioas_change_process (C struct)c.iommu_ioas_change_processhNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_ioas_change_processh]j )}(h struct iommu_ioas_change_processh](j&)}(hj)h]hstruct}(hjYhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjXhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjYhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjXhhhjYhMubjI)}(hiommu_ioas_change_processh]jO)}(hjXh]hiommu_ioas_change_process}(hj#YhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjYubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjXhhhjYhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjXhhhjYhMubah}(h]jXah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjYhMhjXhhubj{)}(hhh]h)}(hioctl(VFIO_IOAS_CHANGE_PROCESS)h]hioctl(VFIO_IOAS_CHANGE_PROCESS)}(hjEYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjBYhhubah}(h]h ]h"]h$]h&]uh1jzhjXhhhjYhMubeh}(h]h ](jstructeh"]h$]h&]jjjj]Yjj]Yjjjuh1jhhhjhjhNubj)}(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}(hjiYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeYubh:}(hjeYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjaYubj)}(hKstruct iommu_ioas_change_process { __u32 size; __u32 __reserved; };h]hKstruct iommu_ioas_change_process { __u32 size; __u32 __reserved; };}hjYsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjaYubh)}(h **Members**h]j)}(hjYh]hMembers}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjaYubj)}(hhh](j)}(h2``size`` sizeof(struct iommu_ioas_change_process) h](j)}(h``size``h]j)}(hjYh]hsize}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjYubj )}(hhh]h)}(h(sizeof(struct iommu_ioas_change_process)h]h(sizeof(struct iommu_ioas_change_process)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1j hjYubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjYubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hjYh]h __reserved}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjYubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjZubah}(h]h ]h"]h$]h&]uh1j hjYubeh}(h]h ]h"]h$]h&]uh1jhjZhMhjYubeh}(h]h ]h"]h$]h&]uh1jhjaYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj.Zh]h Description}(hj0ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,Zubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjDZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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.}(hjSZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_veventq_flag (C enum)c.iommu_veventq_flaghNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_veventq_flagh]j )}(henum iommu_veventq_flagh](j&)}(hjh]henum}(hj{ZhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjwZhhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjZhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjwZhhhjZhMubjI)}(hiommu_veventq_flagh]jO)}(hjuZh]hiommu_veventq_flag}(hjZhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjZubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjwZhhhjZhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjsZhhhjZhMubah}(h]jnZah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjZhMhjpZhhubj{)}(hhh]h)}(h%flag for struct iommufd_vevent_headerh]h%flag for struct iommufd_vevent_header}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM hjZhhubah}(h]h ]h"]h$]h&]uh1jzhjpZhhhjZhMubeh}(h]h ](jenumeh"]h$]h&]jjjjZjjZjjjuh1jhhhjhjhNubj)}(hL**Constants** ``IOMMU_VEVENTQ_FLAG_LOST_EVENTS`` vEVENTQ has lost vEVENTsh](h)}(h **Constants**h]j)}(hjZh]h Constants}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjZubj)}(hhh]j)}(h;``IOMMU_VEVENTQ_FLAG_LOST_EVENTS`` vEVENTQ has lost vEVENTsh](j)}(h"``IOMMU_VEVENTQ_FLAG_LOST_EVENTS``h]j)}(hjZh]hIOMMU_VEVENTQ_FLAG_LOST_EVENTS}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjZubj )}(hhh]h)}(hvEVENTQ has lost vEVENTsh]hvEVENTQ has lost vEVENTs}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[ubah}(h]h ]h"]h$]h&]uh1j hjZubeh}(h]h ]h"]h$]h&]uh1jhj[hMhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommufd_vevent_header (C struct)c.iommufd_vevent_headerhNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommufd_vevent_headerh]j )}(hstruct iommufd_vevent_headerh](j&)}(hj)h]hstruct}(hjX[hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjT[hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMubj8)}(h h]h }(hjf[hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjT[hhhje[hMubjI)}(hiommufd_vevent_headerh]jO)}(hjR[h]hiommufd_vevent_header}(hjx[hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjt[ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjT[hhhje[hMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjP[hhhje[hMubah}(h]jK[ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhje[hMhjM[hhubj{)}(hhh]h)}(h)Virtual Event Header for a vEVENTQ Statush]h)Virtual Event Header for a vEVENTQ Status}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[hhubah}(h]h ]h"]h$]h&]uh1jzhjM[hhhje[hMubeh}(h]h ](jstructeh"]h$]h&]jjjj[jj[jjjuh1jhhhjhjhNubj)}(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}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh:}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[ubj)}(hFstruct iommufd_vevent_header { __u32 flags; __u32 sequence; };h]hFstruct iommufd_vevent_header { __u32 flags; __u32 sequence; };}hj[sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[ubh)}(h **Members**h]j)}(hj[h]hMembers}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj[ubj)}(hhh](j)}(h1``flags`` Combination of enum iommu_veventq_flag h](j)}(h ``flags``h]j)}(hj\h]hflags}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj\ubj )}(hhh]h)}(h&Combination of enum iommu_veventq_flagh]h&Combination of enum iommu_veventq_flag}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1j hj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj[ubj)}(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]j)}(hj@\h]hsequence}(hjB\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>\ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj:\ubj )}(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}(hjY\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU\hMhjV\ubah}(h]h ]h"]h$]h&]uh1j hj:\ubeh}(h]h ]h"]h$]h&]uh1jhjU\hMhj[ubeh}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./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:}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj\ubhtbody)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hheader0 {sequence=0}h]hheader0 {sequence=0}}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhj\ubah}(h]h ]h"]h$]h&]uh1j\hj\ubj\)}(hhh]h)}(hdata0h]hdata0}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ]hMhj]ubah}(h]h ]h"]h$]h&]uh1j\hj\ubj\)}(hhh]h)}(hheader1 {sequence=1}h]hheader1 {sequence=1}}(hj-]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ]hMhj*]ubah}(h]h ]h"]h$]h&]uh1j\hj\ubj\)}(hhh]h)}(hdata1h]hdata1}(hjD]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ]hMhjA]ubah}(h]h ]h"]h$]h&]uh1j\hj\ubj\)}(hhh]h)}(h...h]h...}(hj[]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ]hMhjX]ubah}(h]h ]h"]h$]h&]uh1j\hj\ubj\)}(hhh]h)}(hdataNh]hdataN}(hjr]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ]hMhjo]ubah}(h]h ]h"]h$]h&]uh1j\hj\ubeh}(h]h ]h"]h$]h&]uh1j\hj\ubah}(h]h ]h"]h$]h&]uh1j\hj\ubeh}(h]h ]h"]h$]h&]colsKuh1j\hj\ubah}(h]h ]h"]h$]h&]uh1j\hjhhhjhNubh)}(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:}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMhjhhubj\)}(hhh]j\)}(hhh](j\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj]ubj\)}(hhh]j\)}(hhh](j\)}(hhh]h)}(h...h]h...}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM"hj]ubah}(h]h ]h"]h$]h&]uh1j\hj]ubj\)}(hhh]h)}(hheader3 {sequence=3}h]hheader3 {sequence=3}}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM"hj^ubah}(h]h ]h"]h$]h&]uh1j\hj]ubj\)}(hhh]h)}(hdata3h]hdata3}(hj(^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM"hj%^ubah}(h]h ]h"]h$]h&]uh1j\hj]ubj\)}(hhh]h)}(hheader6 {sequence=6}h]hheader6 {sequence=6}}(hj?^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM"hj<^ubah}(h]h ]h"]h$]h&]uh1j\hj]ubj\)}(hhh]h)}(hdata6h]hdata6}(hjV^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM"hjS^ubah}(h]h ]h"]h$]h&]uh1j\hj]ubj\)}(hhh]h)}(h...h]h...}(hjm^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM"hjj^ubah}(h]h ]h"]h$]h&]uh1j\hj]ubeh}(h]h ]h"]h$]h&]uh1j\hj]ubah}(h]h ]h"]h$]h&]uh1j\hj]ubeh}(h]h ]h"]h$]h&]colsKuh1j\hj]ubah}(h]h ]h"]h$]h&]uh1j\hjhhhjhNubh)}(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:}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM%hjhhubj\)}(hhh]j\)}(hhh](j\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj^ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj^ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hj^ubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthK)uh1j\hj^ubj\)}(hhh]j\)}(hhh](j\)}(hhh]h)}(hhh]h}(h]h ]h"]h$]h&]hhuh1hhj^ubah}(h]h ]h"]h$]h&]uh1j\hj^ubj\)}(hhh]h)}(hheader3 {sequence=3}h]hheader3 {sequence=3}}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM*hj^ubah}(h]h ]h"]h$]h&]uh1j\hj^ubj\)}(hhh]h)}(hdata3h]hdata3}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM*hj_ubah}(h]h ]h"]h$]h&]uh1j\hj^ubj\)}(hhh]h)}(h'header4 {flags=LOST_EVENTS, sequence=4}h]h'header4 {flags=LOST_EVENTS, sequence=4}}(hj!_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM*hj_ubah}(h]h ]h"]h$]h&]uh1j\hj^ubeh}(h]h ]h"]h$]h&]uh1j\hj^ubah}(h]h ]h"]h$]h&]uh1j\hj^ubeh}(h]h ]h"]h$]h&]colsKuh1j\hj^ubah}(h]h ]h"]h$]h&]uh1j\hjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_veventq_type (C enum)c.iommu_veventq_typehNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_veventq_typeh]j )}(henum iommu_veventq_typeh](j&)}(hjh]henum}(hjg_hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjc_hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM0ubj8)}(h h]h }(hju_hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjc_hhhjt_hM0ubjI)}(hiommu_veventq_typeh]jO)}(hja_h]hiommu_veventq_type}(hj_hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj_ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjc_hhhjt_hM0ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj__hhhjt_hM0ubah}(h]jZ_ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjt_hM0hj\_hhubj{)}(hhh]h)}(hVirtual Event Queue Typeh]hVirtual Event Queue Type}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM3hj_hhubah}(h]h ]h"]h$]h&]uh1jzhj\_hhhjt_hM0ubeh}(h]h ](jenumeh"]h$]h&]jjjj_jj_jjjuh1jhhhjhjhNubj)}(h**Constants** ``IOMMU_VEVENTQ_TYPE_DEFAULT`` Reserved for future use ``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3`` ARM SMMUv3 Virtual Event Queueh](h)}(h **Constants**h]j)}(hj_h]h Constants}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM7hj_ubj)}(hhh](j)}(h7``IOMMU_VEVENTQ_TYPE_DEFAULT`` Reserved for future use h](j)}(h``IOMMU_VEVENTQ_TYPE_DEFAULT``h]j)}(hj_h]hIOMMU_VEVENTQ_TYPE_DEFAULT}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM:hj_ubj )}(hhh]h)}(hReserved for future useh]hReserved for future use}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM:hj`ubah}(h]h ]h"]h$]h&]uh1j hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hM:hj_ubj)}(h@``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3`` ARM SMMUv3 Virtual Event Queueh](j)}(h!``IOMMU_VEVENTQ_TYPE_ARM_SMMUV3``h]j)}(hj#`h]hIOMMU_VEVENTQ_TYPE_ARM_SMMUV3}(hj%`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!`ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM<hj`ubj )}(hhh]h)}(hARM SMMUv3 Virtual Event Queueh]hARM SMMUv3 Virtual Event Queue}(hj<`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM=hj9`ubah}(h]h ]h"]h$]h&]uh1j hj`ubeh}(h]h ]h"]h$]h&]uh1jhj8`hM<hj_ubeh}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"iommu_vevent_arm_smmuv3 (C struct)c.iommu_vevent_arm_smmuv3hNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_vevent_arm_smmuv3h]j )}(hstruct iommu_vevent_arm_smmuv3h](j&)}(hj)h]hstruct}(hj}`hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjy`hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMCubj8)}(h h]h }(hj`hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjy`hhhj`hMCubjI)}(hiommu_vevent_arm_smmuv3h]jO)}(hjw`h]hiommu_vevent_arm_smmuv3}(hj`hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj`ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjy`hhhj`hMCubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhju`hhhj`hMCubah}(h]jp`ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj`hMChjr`hhubj{)}(hhh]h)}(h8ARM SMMUv3 Virtual Event (IOMMU_VEVENTQ_TYPE_ARM_SMMUV3)h]h8ARM SMMUv3 Virtual Event (IOMMU_VEVENTQ_TYPE_ARM_SMMUV3)}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM=hj`hhubah}(h]h ]h"]h$]h&]uh1jzhjr`hhhj`hMCubeh}(h]h ](jstructeh"]h$]h&]jjjj`jj`jjjuh1jhhhjhjhNubj)}(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}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh:}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMAhj`ubj)}(h>struct iommu_vevent_arm_smmuv3 { __aligned_le64 evt[4]; };h]h>struct iommu_vevent_arm_smmuv3 { __aligned_le64 evt[4]; };}hj`sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMChj`ubh)}(h **Members**h]j)}(hj ah]hMembers}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj aubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMGhj`ubj)}(hhh]j)}(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]j)}(hj,ah]hevt}(hj.ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*aubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMHhj&aubj )}(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}(hjEahhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM@hjBaubah}(h]h ]h"]h$]h&]uh1j hj&aubeh}(h]h ]h"]h$]h&]uh1jhjAahMHhj#aubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hjoah]h Description}(hjqahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmaubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMLhjhhubh)}(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.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMJhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommu_veventq_alloc (C struct)c.iommu_veventq_allochNtauh1jhjhhhjhNubj)}(hhh](j)}(hiommu_veventq_alloch]j )}(hstruct iommu_veventq_alloch](j&)}(hj)h]hstruct}(hjahhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjahhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMPubj8)}(h h]h }(hjahhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjahhhjahMPubjI)}(hiommu_veventq_alloch]jO)}(hjah]hiommu_veventq_alloc}(hjahhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjaubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjahhhjahMPubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjahhhjahMPubah}(h]jaah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjahMPhjahhubj{)}(hhh]h)}(hioctl(IOMMU_VEVENTQ_ALLOC)h]hioctl(IOMMU_VEVENTQ_ALLOC)}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMRhjahhubah}(h]h ]h"]h$]h&]uh1jzhjahhhjahMPubeh}(h]h ](jstructeh"]h$]h&]jjjjbjjbjjjuh1jhhhjhjhNubj)}(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}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh:}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMVhj bubj)}(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; };}hj,bsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMXhj bubh)}(h **Members**h]j)}(hj=bh]hMembers}(hj?bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;bubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMchj bubj)}(hhh](j)}(h,``size`` sizeof(struct iommu_veventq_alloc) h](j)}(h``size``h]j)}(hj\bh]hsize}(hj^bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZbubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMThjVbubj )}(hhh]h)}(h"sizeof(struct iommu_veventq_alloc)h]h"sizeof(struct iommu_veventq_alloc)}(hjubhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqbhMThjrbubah}(h]h ]h"]h$]h&]uh1j hjVbubeh}(h]h ]h"]h$]h&]uh1jhjqbhMThjSbubj)}(h``flags`` Must be 0 h](j)}(h ``flags``h]j)}(hjbh]hflags}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMUhjbubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMUhjbubah}(h]h ]h"]h$]h&]uh1j hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMUhjSbubj)}(h=``viommu_id`` virtual IOMMU ID to associate the vEVENTQ with h](j)}(h ``viommu_id``h]j)}(hjbh]h viommu_id}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMVhjbubj )}(hhh]h)}(h.virtual IOMMU ID to associate the vEVENTQ withh]h.virtual IOMMU ID to associate the vEVENTQ with}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMVhjbubah}(h]h ]h"]h$]h&]uh1j hjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMVhjSbubj)}(hI``type`` Type of the vEVENTQ. Must be defined in enum iommu_veventq_type h](j)}(h``type``h]j)}(hjch]htype}(hj chhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMWhjcubj )}(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}(hj chhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMWhjcubah}(h]h ]h"]h$]h&]uh1j hjcubeh}(h]h ]h"]h$]h&]uh1jhjchMWhjSbubj)}(h:``veventq_depth`` Maximum number of events in the vEVENTQ h](j)}(h``veventq_depth``h]j)}(hj@ch]h veventq_depth}(hjBchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>cubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMXhj:cubj )}(hhh]h)}(h'Maximum number of events in the vEVENTQh]h'Maximum number of events in the vEVENTQ}(hjYchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUchMXhjVcubah}(h]h ]h"]h$]h&]uh1j hj:cubeh}(h]h ]h"]h$]h&]uh1jhjUchMXhjSbubj)}(h-``out_veventq_id`` The ID of the new vEVENTQ h](j)}(h``out_veventq_id``h]j)}(hjych]hout_veventq_id}(hj{chhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwcubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMYhjscubj )}(hhh]h)}(hThe ID of the new vEVENTQh]hThe ID of the new vEVENTQ}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMYhjcubah}(h]h ]h"]h$]h&]uh1j hjscubeh}(h]h ]h"]h$]h&]uh1jhjchMYhjSbubj)}(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]j)}(hjch]hout_veventq_fd}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM[hjcubj )}(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}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMZhjcubah}(h]h ]h"]h$]h&]uh1j hjcubeh}(h]h ]h"]h$]h&]uh1jhjchM[hjSbubj)}(h``__reserved`` Must be 0h](j)}(h``__reserved``h]j)}(hjch]h __reserved}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM[hjcubj )}(hhh]h)}(h Must be 0h]h Must be 0}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM\hjdubah}(h]h ]h"]h$]h&]uh1j hjcubeh}(h]h ]h"]h$]h&]uh1jhjdhM[hjSbubeh}(h]h ]h"]h$]h&]uh1jhj bubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubh)}(h**Description**h]j)}(hj/dh]h Description}(hj1dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-dubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM_hjhhubh)}(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 }(hjEdhhhNhNubj)}(h**type**h]htype}(hjMdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEdubh. User space should open the }(hjEdhhhNhNubj)}(h**out_veventq_fd**h]hout_veventq_fd}(hj_dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEdubh 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 }(hjEdhhhNhNubj)}(h**veventq_depth**h]h veventq_depth}(hjqdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEdubh.}(hjEdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhM]hjhhubh)}(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:}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMchjhhubj\)}(hhh]j\)}(hhh](j\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j\hjdubj\)}(hhh]j\)}(hhh](j\)}(hhh]h}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hheader0h]hheader0}(hj ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMghjeubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hdata0h]hdata0}(hj#ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghj eubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hheader1h]hheader1}(hj:ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghj7eubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hdata1h]hdata1}(hjQehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghjNeubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(h...h]h...}(hjhehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghjeeubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hheaderNh]hheaderN}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghj|eubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h)}(hdataNh]hdataN}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMghjeubah}(h]h ]h"]h$]h&]uh1j\hjdubj\)}(hhh]h}(h]h ]h"]h$]h&]uh1j\hjdubeh}(h]h ]h"]h$]h&]uh1j\hjdubah}(h]h ]h"]h$]h&]uh1j\hjdubeh}(h]h ]h"]h$]h&]colsK uh1j\hjdubah}(h]h ]h"]h$]h&]uh1j\hjhhhjhNubh)}(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).}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.hhMjhjhhubeh}(h]iommufd-user-apiah ]h"]iommufd user apiah$]h&]uh1hhhhhhhhMAubh)}(hhh](h)}(hIOMMUFD Kernel APIh]hIOMMUFD Kernel API}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehhhhhMFubh)}(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.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhjehhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j iommufd_device_bind (C function)c.iommufd_device_bindhNtauh1jhjehhhNhNubj)}(hhh](j)}(hcstruct iommufd_device * iommufd_device_bind (struct iommufd_ctx *ictx, struct device *dev, u32 *id)h]j )}(hastruct iommufd_device *iommufd_device_bind(struct iommufd_ctx *ictx, struct device *dev, u32 *id)h](j&)}(hj)h]hstruct}(hjfhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjfhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chKubj8)}(h h]h }(hj)fhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjfhhhj(fhKubh)}(hhh]jO)}(hiommufd_deviceh]hiommufd_device}(hj:fhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj7fubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjwhMGhj?wubah}(h]h ]h"]h$]h&]uh1j hj#wubeh}(h]h ]h"]h$]h&]uh1jhj>whMGhjvubj)}(h6``void *data`` Opaque data to pass into ops functions h](j)}(h``void *data``h]j)}(hjbwh]h void *data}(hjdwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`wubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMHhj\wubj )}(hhh]h)}(h&Opaque data to pass into ops functionsh]h&Opaque data to pass into ops functions}(hj{whhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwwhMHhjxwubah}(h]h ]h"]h$]h&]uh1j hj\wubeh}(h]h ]h"]h$]h&]uh1jhjwwhMHhjvubj)}(hD``u32 *id`` Output ID number to return to userspace for this access h](j)}(h ``u32 *id``h]j)}(hjwh]hu32 *id}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMIhjwubj )}(hhh]h)}(h7Output ID number to return to userspace for this accessh]h7Output ID number to return to userspace for this access}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMIhjwubah}(h]h ]h"]h$]h&]uh1j hjwubeh}(h]h ]h"]h$]h&]uh1jhjwhMIhjvubeh}(h]h ]h"]h$]h&]uh1jhjvubh)}(h**Description**h]j)}(hjwh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMKhjvubh)}(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.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMKhjvubh)}(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().}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMOhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#iommufd_access_destroy (C function)c.iommufd_access_destroyhNtauh1jhjehhhNhNubj)}(hhh](j)}(h;void iommufd_access_destroy (struct iommufd_access *access)h]j )}(h:void iommufd_access_destroy(struct iommufd_access *access)h](jKi)}(hvoidh]hvoid}(hj*xhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj&xhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMxubj8)}(h h]h }(hj9xhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj&xhhhj8xhMxubjI)}(hiommufd_access_destroyh]jO)}(hiommufd_access_destroyh]hiommufd_access_destroy}(hjKxhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjGxubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj&xhhhj8xhMxubjf)}(h(struct iommufd_access *access)h]jf)}(hstruct iommufd_access *accessh](j&)}(hj)h]hstruct}(hjgxhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjcxubj8)}(h h]h }(hjtxhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjcxubh)}(hhh]jO)}(hiommufd_accessh]hiommufd_access}(hjxhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetjxmodnameN classnameNjTfjWf)}jZf]j]f)}jPfjMxsbc.iommufd_access_destroyasbuh1hhjcxubj8)}(h h]h }(hjxhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjcxubjrf)}(hjh]h*}(hjxhhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhjcxubjO)}(haccessh]haccess}(hjxhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjcxubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhj_xubah}(h]h ]h"]h$]h&]hhuh1jfhj&xhhhj8xhMxubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj"xhhhj8xhMxubah}(h]jxah ](jrjseh"]h$]h&]jwjx)jyhuh1jhj8xhMxhjxhhubj{)}(hhh]h)}(hDestroy an iommufd_accessh]hDestroy an iommufd_access}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMshjxhhubah}(h]h ]h"]h$]h&]uh1jzhjxhhhj8xhMxubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyjjyjjjuh1jhhhjehNhNubj)}(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)}(hj yh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj yubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMwhjyubj)}(hhh]j)}(h8``struct iommufd_access *access`` The access to destroy h](j)}(h!``struct iommufd_access *access``h]j)}(hj+yh]hstruct iommufd_access *access}(hj-yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)yubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMthj%yubj )}(hhh]h)}(hThe access to destroyh]hThe access to destroy}(hjDyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@yhMthjAyubah}(h]h ]h"]h$]h&]uh1j hj%yubeh}(h]h ]h"]h$]h&]uh1jhj@yhMthj"yubah}(h]h ]h"]h$]h&]uh1jhjyubh)}(h**Description**h]j)}(hjfyh]h Description}(hjhyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdyubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMvhjyubh)}(h;The caller must stop using the access before destroying it.h]h;The caller must stop using the access before destroying it.}(hj|yhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMvhjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'iommufd_access_unpin_pages (C function)c.iommufd_access_unpin_pageshNtauh1jhjehhhNhNubj)}(hhh](j)}(hivoid iommufd_access_unpin_pages (struct iommufd_access *access, unsigned long iova, unsigned long length)h]j )}(hhvoid iommufd_access_unpin_pages(struct iommufd_access *access, unsigned long iova, unsigned long length)h](jKi)}(hvoidh]hvoid}(hjyhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjyhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMubj8)}(h h]h }(hjyhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjyhhhjyhMubjI)}(hiommufd_access_unpin_pagesh]jO)}(hiommufd_access_unpin_pagesh]hiommufd_access_unpin_pages}(hjyhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjyubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjyhhhjyhMubjf)}(hI(struct iommufd_access *access, unsigned long iova, unsigned long length)h](jf)}(hstruct iommufd_access *accessh](j&)}(hj)h]hstruct}(hjyhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjyubj8)}(h h]h }(hjyhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjyubh)}(hhh]jO)}(hiommufd_accessh]hiommufd_access}(hjzhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjzubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetjzmodnameN classnameNjTfjWf)}jZf]j]f)}jPfjysbc.iommufd_access_unpin_pagesasbuh1hhjyubj8)}(h h]h }(hj&zhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjyubjrf)}(hjh]h*}(hj4zhhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhjyubjO)}(haccessh]haccess}(hjAzhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjyubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjyubjf)}(hunsigned long iovah](jKi)}(hunsignedh]hunsigned}(hjZzhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjVzubj8)}(h h]h }(hjhzhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjVzubjKi)}(hlongh]hlong}(hjvzhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjVzubj8)}(h h]h }(hjzhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjVzubjO)}(hiovah]hiova}(hjzhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjVzubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjyubjf)}(hunsigned long lengthh](jKi)}(hunsignedh]hunsigned}(hjzhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjzubj8)}(h h]h }(hjzhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjzubjKi)}(hlongh]hlong}(hjzhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjzubj8)}(h h]h }(hjzhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjzubjO)}(hlengthh]hlength}(hjzhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjzubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjyubeh}(h]h ]h"]h$]h&]hhuh1jfhjyhhhjyhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhjyhhhjyhMubah}(h]jyah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjyhMhjyhhubj{)}(hhh]h)}(hUndo iommufd_access_pin_pagesh]hUndo iommufd_access_pin_pages}(hj {hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj {hhubah}(h]h ]h"]h$]h&]uh1jzhjyhhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%{jj%{jjjuh1jhhhjehNhNubj)}(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}(hj1{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-{ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj){ubj)}(hhh](j)}(h8``struct iommufd_access *access`` IOAS access to act on h](j)}(h!``struct iommufd_access *access``h]j)}(hjN{h]hstruct iommufd_access *access}(hjP{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL{ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhjH{ubj )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hjg{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc{hMhjd{ubah}(h]h ]h"]h$]h&]uh1j hjH{ubeh}(h]h ]h"]h$]h&]uh1jhjc{hMhjE{ubj)}(h%``unsigned long iova`` Starting IOVA h](j)}(h``unsigned long iova``h]j)}(hj{h]hunsigned long iova}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj{ubj )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1j hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhjE{ubj)}(h3``unsigned long length`` Number of bytes to access h](j)}(h``unsigned long length``h]j)}(hj{h]hunsigned long length}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj{ubj )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1j hj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhjE{ubeh}(h]h ]h"]h$]h&]uh1jhj){ubh)}(h**Description**h]j)}(hj{h]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj){ubh)}(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.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj){ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%iommufd_access_pin_pages (C function)c.iommufd_access_pin_pageshNtauh1jhjehhhNhNubj)}(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]j )}(hint iommufd_access_pin_pages(struct iommufd_access *access, unsigned long iova, unsigned long length, struct page **out_pages, unsigned int flags)h](jKi)}(hinth]hint}(hj@|hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj<|hhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chM"ubj8)}(h h]h }(hjO|hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj<|hhhjN|hM"ubjI)}(hiommufd_access_pin_pagesh]jO)}(hiommufd_access_pin_pagesh]hiommufd_access_pin_pages}(hja|hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj]|ubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj<|hhhjN|hM"ubjf)}(hv(struct iommufd_access *access, unsigned long iova, unsigned long length, struct page **out_pages, unsigned int flags)h](jf)}(hstruct iommufd_access *accessh](j&)}(hj)h]hstruct}(hj}|hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjy|ubj8)}(h h]h }(hj|hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjy|ubh)}(hhh]jO)}(hiommufd_accessh]hiommufd_access}(hj|hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetj|modnameN classnameNjTfjWf)}jZf]j]f)}jPfjc|sbc.iommufd_access_pin_pagesasbuh1hhjy|ubj8)}(h h]h }(hj|hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjy|ubjrf)}(hjh]h*}(hj|hhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhjy|ubjO)}(haccessh]haccess}(hj|hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjy|ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhju|ubjf)}(hunsigned long iovah](jKi)}(hunsignedh]hunsigned}(hj|hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj|ubj8)}(h h]h }(hj|hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj|ubjKi)}(hlongh]hlong}(hj }hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj|ubj8)}(h h]h }(hj}hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj|ubjO)}(hiovah]hiova}(hj'}hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj|ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhju|ubjf)}(hunsigned long lengthh](jKi)}(hunsignedh]hunsigned}(hj@}hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj<}ubj8)}(h h]h }(hjN}hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj<}ubjKi)}(hlongh]hlong}(hj\}hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj<}ubj8)}(h h]h }(hjj}hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj<}ubjO)}(hlengthh]hlength}(hjx}hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj<}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhju|ubjf)}(hstruct page **out_pagesh](j&)}(hj)h]hstruct}(hj}hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj}ubj8)}(h h]h }(hj}hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj}ubh)}(hhh]jO)}(hpageh]hpage}(hj}hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj}ubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetj}modnameN classnameNjTfjWf)}jZf]j|c.iommufd_access_pin_pagesasbuh1hhj}ubj8)}(h h]h }(hj}hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj}ubjrf)}(hjh]h*}(hj}hhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhj}ubjrf)}(hjh]h*}(hj}hhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhj}ubjO)}(h out_pagesh]h out_pages}(hj}hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhju|ubjf)}(hunsigned int flagsh](jKi)}(hunsignedh]hunsigned}(hj~hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj ~ubj8)}(h h]h }(hj~hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj ~ubjKi)}(hinth]hint}(hj*~hhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj ~ubj8)}(h h]h }(hj8~hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj ~ubjO)}(hflagsh]hflags}(hjF~hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj ~ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhju|ubeh}(h]h ]h"]h$]h&]hhuh1jfhj<|hhhjN|hM"ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj8|hhhjN|hM"ubah}(h]j3|ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjN|hM"hj5|hhubj{)}(hhh]h)}(h%Return a list of pages under the iovah]h%Return a list of pages under the iova}(hjp~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhjm~hhubah}(h]h ]h"]h$]h&]uh1jzhj5|hhhjN|hM"ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~jj~jjjuh1jhhhjehNhNubj)}(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)}(hj~h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj~ubj)}(hhh](j)}(h8``struct iommufd_access *access`` IOAS access to act on h](j)}(h!``struct iommufd_access *access``h]j)}(hj~h]hstruct iommufd_access *access}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj~ubj )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMhj~ubah}(h]h ]h"]h$]h&]uh1j hj~ubeh}(h]h ]h"]h$]h&]uh1jhj~hMhj~ubj)}(h%``unsigned long iova`` Starting IOVA h](j)}(h``unsigned long iova``h]j)}(hj~h]hunsigned long iova}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj~ubj )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMhjubah}(h]h ]h"]h$]h&]uh1j hj~ubeh}(h]h ]h"]h$]h&]uh1jhj~hMhj~ubj)}(h3``unsigned long length`` Number of bytes to access h](j)}(h``unsigned long length``h]j)}(hj#h]hunsigned long length}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhjubj )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj~ubj)}(h-``struct page **out_pages`` Output page list h](j)}(h``struct page **out_pages``h]j)}(hj\h]hstruct page **out_pages}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhjVubj )}(hhh]h)}(hOutput page listh]hOutput page list}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMhjrubah}(h]h ]h"]h$]h&]uh1j hjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhj~ubj)}(h2``unsigned int flags`` IOPMMUFD_ACCESS_RW_* flags h](j)}(h``unsigned int flags``h]j)}(hjh]hunsigned int flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhjubj )}(hhh]h)}(hIOPMMUFD_ACCESS_RW_* flagsh]hIOPMMUFD_ACCESS_RW_* flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubeh}(h]h ]h"]h$]h&]uh1jhj~ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj~ubh)}(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 }(hjhhhNhNubj)}(h **length**h]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhs bytes starting at iova and returns the struct page * pointers. These can be kmap’d by the caller for CPU access.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMhj~ubh)}(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:333: ./drivers/iommu/iommufd/device.chMhj~ubh)}(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:333: ./drivers/iommu/iommufd/device.chMhj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommufd_access_rw (C function)c.iommufd_access_rwhNtauh1jhjehhhNhNubj)}(hhh](j)}(hxint iommufd_access_rw (struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h]j )}(hwint iommufd_access_rw(struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h](jKi)}(hinth]hint}(hjEhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjAhhhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chM{ubj8)}(h h]h }(hjThhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjAhhhjShM{ubjI)}(hiommufd_access_rwh]jO)}(hiommufd_access_rwh]hiommufd_access_rw}(hjfhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjbubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhjAhhhjShM{ubjf)}(hb(struct iommufd_access *access, unsigned long iova, void *data, size_t length, unsigned int flags)h](jf)}(hstruct iommufd_access *accessh](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj~ubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj~ubh)}(hhh]jO)}(hiommufd_accessh]hiommufd_access}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetjmodnameN classnameNjTfjWf)}jZf]j]f)}jPfjhsbc.iommufd_access_rwasbuh1hhj~ubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj~ubjrf)}(hjh]h*}(hj΀hhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhj~ubjO)}(haccessh]haccess}(hjۀhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj~ubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjzubjf)}(hunsigned long iovah](jKi)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjubjKi)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjubjO)}(hiovah]hiova}(hj,hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjzubjf)}(h void *datah](jKi)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjAubj8)}(h h]h }(hjShhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjAubjrf)}(hjh]h*}(hjahhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhjAubjO)}(hdatah]hdata}(hjnhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjAubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjzubjf)}(h size_t lengthh](h)}(hhh]jO)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetjmodnameN classnameNjTfjWf)}jZf]jc.iommufd_access_rwasbuh1hhjubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjubjO)}(hlengthh]hlength}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjzubjf)}(hunsigned int flagsh](jKi)}(hunsignedh]hunsigned}(hjρhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjˁubj8)}(h h]h }(hj݁hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjˁubjKi)}(hinth]hint}(hjhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihjˁubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjˁubjO)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjˁubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhjzubeh}(h]h ]h"]h$]h&]hhuh1jfhjAhhhjShM{ubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj=hhhjShM{ubah}(h]j8ah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjShM{hj:hhubj{)}(hhh]h)}(h!Read or write data under the iovah]h!Read or write data under the iova}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMphj.hhubah}(h]h ]h"]h$]h&]uh1jzhj:hhhjShM{ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jhhhjehNhNubj)}(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)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMthjMubj)}(hhh](j)}(h8``struct iommufd_access *access`` IOAS access to act on h](j)}(h!``struct iommufd_access *access``h]j)}(hjrh]hstruct iommufd_access *access}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMqhjlubj )}(hhh]h)}(hIOAS access to act onh]hIOAS access to act on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMqhjubah}(h]h ]h"]h$]h&]uh1j hjlubeh}(h]h ]h"]h$]h&]uh1jhjhMqhjiubj)}(h%``unsigned long iova`` Starting IOVA h](j)}(h``unsigned long iova``h]j)}(hjh]hunsigned long iova}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMrhjubj )}(hhh]h)}(h Starting IOVAh]h Starting IOVA}(hjĂhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhjhMrhjiubj)}(h-``void *data`` Kernel buffer to copy to/from h](j)}(h``void *data``h]j)}(hjh]h void *data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMshjނubj )}(hhh]h)}(hKernel buffer to copy to/fromh]hKernel buffer to copy to/from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMshjubah}(h]h ]h"]h$]h&]uh1j hjނubeh}(h]h ]h"]h$]h&]uh1jhjhMshjiubj)}(h,``size_t length`` Number of bytes to access h](j)}(h``size_t length``h]j)}(hjh]h size_t length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMthjubj )}(hhh]h)}(hNumber of bytes to accessh]hNumber of bytes to access}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMthj3ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1jhj2hMthjiubj)}(h1``unsigned int flags`` IOMMUFD_ACCESS_RW_* flags h](j)}(h``unsigned int flags``h]j)}(hjVh]hunsigned int flags}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMuhjPubj )}(hhh]h)}(hIOMMUFD_ACCESS_RW_* flagsh]hIOMMUFD_ACCESS_RW_* flags}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMuhjlubah}(h]h ]h"]h$]h&]uh1j hjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMuhjiubeh}(h]h ]h"]h$]h&]uh1jhjMubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:333: ./drivers/iommu/iommufd/device.chMwhjMubh)}(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:333: ./drivers/iommu/iommufd/device.chMwhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jiommufd_ctx_get (C function)c.iommufd_ctx_gethNtauh1jhjehhhNhNubj)}(hhh](j)}(h/void iommufd_ctx_get (struct iommufd_ctx *ictx)h]j )}(h.void iommufd_ctx_get(struct iommufd_ctx *ictx)h](jKi)}(hvoidh]hvoid}(hjփhhhNhNubah}(h]h ]jWiah"]h$]h&]uh1jJihj҃hhhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./drivers/iommu/iommufd/main.chMubj8)}(h h]h }(hjhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hj҃hhhjhMubjI)}(hiommufd_ctx_geth]jO)}(hiommufd_ctx_geth]hiommufd_ctx_get}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubah}(h]h ](jajbeh"]h$]h&]hhuh1jHhj҃hhhjhMubjf)}(h(struct iommufd_ctx *ictx)h]jf)}(hstruct iommufd_ctx *ictxh](j&)}(hj)h]hstruct}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubj8)}(h h]h }(hj hhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjubh)}(hhh]jO)}(h iommufd_ctxh]h iommufd_ctx}(hj1hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejPf reftargetj3modnameN classnameNjTfjWf)}jZf]j]f)}jPfjsbc.iommufd_ctx_getasbuh1hhjubj8)}(h h]h }(hjQhhhNhNubah}(h]h ]jDah"]h$]h&]uh1j7hjubjrf)}(hjh]h*}(hj_hhhNhNubah}(h]h ]j}fah"]h$]h&]uh1jqfhjubjO)}(hictxh]hictx}(hjlhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jfhj ubah}(h]h ]h"]h$]h&]hhuh1jfhj҃hhhjhMubeh}(h]h ]h"]h$]h&]hhjluh1jjmjnhj΃hhhjhMubah}(h]jɃah ](jrjseh"]h$]h&]jwjx)jyhuh1jhjhMhj˃hhubj{)}(hhh]h)}(hGet a context referenceh]hGet a context reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./drivers/iommu/iommufd/main.chMhjhhubah}(h]h ]h"]h$]h&]uh1jzhj˃hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjehNhNubj)}(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&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./drivers/iommu/iommufd/main.chMhjubj)}(hhh]j)}(h,``struct iommufd_ctx *ictx`` Context to get h](j)}(h``struct iommufd_ctx *ictx``h]j)}(hjׄh]hstruct iommufd_ctx *ictx}(hjلhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjՄubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./drivers/iommu/iommufd/main.chMhjфubj )}(hhh]h)}(hContext to geth]hContext to get}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjфubeh}(h]h ]h"]h$]h&]uh1jhjhMhj΄ubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./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.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:336: ./drivers/iommu/iommufd/main.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjehhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"iommufd_ctx_from_file (C function)c.iommufd_ctx_from_filehNtauh1jhjehhhNhNubj)}(hhh](j)}(h>struct iommufd_ctx * iommufd_ctx_from_file (struct file *file)h]j )}(hj6>jAjAj-Bj2Bj CjCj(Ej-EjFjFjIjIjJjJjzLjLjLOjQOjcPjhPjQjQjSjSjTjTjVjVjXjXjnZjsZjK[jP[jZ_j__jp`ju`jajaj7jejfjfj=ijBijjkjokjljljojojprjurjtjtjxj"xjyjyj3|j8|j8j=jɃj΃jJjOjj jjj/j։jj=u 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:323: ./include/uapi/linux/iommufd.huh1jhjX]ubj)}(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.}(hjNjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjċubah}(h]h ]h"]h$]h&]levelKtypejlineM#sourcec/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.huh1jhj]ubj)}(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&]levelKtypejlineM#sourcejߋuh1jhjj^ubj)}(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&]levelKtypejlineMhsourcec/var/lib/git/docbuild/linux/Documentation/userspace-api/iommufd:323: ./include/uapi/linux/iommufd.huh1jhjeeubetransform_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&]levelKtypejsourcejlineKuh1juba transformerN include_log] decorationNhhub.