sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget)/translations/zh_CN/driver-api/generic_ptmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/zh_TW/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/it_IT/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ja_JP/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ko_KR/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/pt_BR/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/sp_SP/driver-api/generic_ptmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhC/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt.rsthKubhsection)}(hhh](htitle)}(hGeneric Radix Page Tableh]hGeneric Radix Page Table}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hX,Generic Radix Page Table is a set of functions and helpers to efficiently parse radix style page tables typically seen in HW implementations. The interface is built to deliver similar code generation as the mm's pte/pmd/etc system by fully inlining the exact code required to handle each table level.h]hX.Generic Radix Page Table is a set of functions and helpers to efficiently parse radix style page tables typically seen in HW implementations. The interface is built to deliver similar code generation as the mm’s pte/pmd/etc system by fully inlining the exact code required to handle each table level.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhK hhhhubh)}(hLike the mm subsystem each format contributes its parsing implementation under common names and the common code implements the required algorithms.h]hLike the mm subsystem each format contributes its parsing implementation under common names and the common code implements the required algorithms.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhhhhubh)}(h0The system is divided into three logical levels:h]h0The system is divided into three logical levels:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhhhhubh block_quote)}(h- The page table format and its manipulation functions - Generic helpers to give a consistent API regardless of underlying format - An algorithm implementation (e.g. IOMMU/DRM/KVM/MM) h]h bullet_list)}(hhh](h list_item)}(h4The page table format and its manipulation functionsh]h)}(hjh]h4The page table format and its manipulation functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hHGeneric helpers to give a consistent API regardless of underlying formath]h)}(hj3h]hHGeneric helpers to give a consistent API regardless of underlying format}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhj1ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h4An algorithm implementation (e.g. IOMMU/DRM/KVM/MM) h]h)}(h3An algorithm implementation (e.g. IOMMU/DRM/KVM/MM)h]h3An algorithm implementation (e.g. IOMMU/DRM/KVM/MM)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhjIubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhj*hKhjubah}(h]h ]h"]h$]h&]uh1j hj*hKhhhhubh)}(hX?Multiple implementations are supported. The intention is to have the generic format code be re-usable for whatever specialized implementation is required. The generic code is solely about the format of the radix tree; it does not include memory allocation or higher level decisions that are left for the implementation.h]hX?Multiple implementations are supported. The intention is to have the generic format code be re-usable for whatever specialized implementation is required. The generic code is solely about the format of the radix tree; it does not include memory allocation or higher level decisions that are left for the implementation.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhKhhhhubh)}(hVThe generic framework supports a superset of functions across many HW implementations:h]hVThe generic framework supports a superset of functions across many HW implementations:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhK!hhhhubj )}(hX- Entries comprised of contiguous blocks of IO PTEs for larger page sizes - Multi-level tables, up to 6 levels. Runtime selected top level - Runtime variable table level size (ARM's concatenated tables) - Expandable top level allowing dynamic sizing of table levels - Optional leaf entries at any level - 32-bit/64-bit virtual and output addresses, using every address bit - Dirty tracking - Sign extended addressing h]j)}(hhh](j)}(hGEntries comprised of contiguous blocks of IO PTEs for larger page sizesh]h)}(hjh]hGEntries comprised of contiguous blocks of IO PTEs for larger page sizes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhK$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h>Multi-level tables, up to 6 levels. Runtime selected top levelh]h)}(hjh]h>Multi-level tables, up to 6 levels. Runtime selected top level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhK%hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h=Runtime variable table level size (ARM's concatenated tables)h]h)}(hjh]h?Runtime variable table level size (ARM’s concatenated tables)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:7: ./include/linux/generic_pt/common.hhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hubj)}(hhh]h)}(h:The position in a table of an element: item = table[index]h]h:The position in a table of an element: item = table[index]}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKchjQubah}(h]h ]h"]h$]h&]uh1j~hj>ubeh}(h]h ]h"]h$]h&]uh1jghjPhKbhjubjh)}(hitem A single index in a tableh](jn)}(hitemh]hitem}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKdhjoubj)}(hhh]h)}(hA single index in a tableh]hA single index in a table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKehjubah}(h]h ]h"]h$]h&]uh1j~hjoubeh}(h]h ]h"]h$]h&]uh1jghjhKdhjubjh)}(hentry A single logical element in a table. If contiguous pages are not supported then item and entry are the same thing, otherwise entry refers to all the items that comprise a single contiguous translation.h](jn)}(hentryh]hentry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKhhjubj)}(hhh]h)}(hA single logical element in a table. If contiguous pages are not supported then item and entry are the same thing, otherwise entry refers to all the items that comprise a single contiguous translation.h]hA single logical element in a table. If contiguous pages are not supported then item and entry are the same thing, otherwise entry refers to all the items that comprise a single contiguous translation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKghjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKhhjubjh)}(hitem/entry_size The number of bytes of VA the table index translates for. If the item is a table entry then the next table covers this size. If the entry translates to an output address then the full OA is: OA | (VA % entry_size)h](jn)}(hitem/entry_sizeh]hitem/entry_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKmhjubj)}(hhh]h)}(hThe number of bytes of VA the table index translates for. If the item is a table entry then the next table covers this size. If the entry translates to an output address then the full OA is: OA | (VA % entry_size)h]hThe number of bytes of VA the table index translates for. If the item is a table entry then the next table covers this size. If the entry translates to an output address then the full OA is: OA | (VA % entry_size)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKkhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKmhjubjh)}(hcontig_count The number of consecutive items fused into a single entry. item_size * contig_count is the size of that entry's translation.h](jn)}(h contig_counth]h contig_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:10: ./drivers/iommu/generic_pt/pt_defs.hhKphjubj)}(hhh]h)}(h|The number of consecutive items fused into a single entry. item_size * contig_count is the size of that entry's translation.h]h~The number of consecutive items fused into a single entry. item_size * contig_count is the size of that entry’s translation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKphjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKphjubjh)}(hX%lg2 Indicates the value is encoded as log2, i.e. 1< #include "defs_amdv1.h" #include "../pt_defs.h" #include "amdv1.h" #include "../pt_common.h" #include "../pt_iter.h" #include "../iommu_pt.h" /* The IOMMU implementation */h]h#include #include "defs_amdv1.h" #include "../pt_defs.h" #include "amdv1.h" #include "../pt_common.h" #include "../pt_iter.h" #include "../iommu_pt.h" /* The IOMMU implementation */}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK!hjzhhubh)}(hiommu_pt.h includes definitions that will generate the operations functions for map/unmap/etc. using the definitions provided by AMDv1. The resulting module will have exported symbols named like pt_iommu_amdv1_init().h]hiommu_pt.h includes definitions that will generate the operations functions for map/unmap/etc. using the definitions provided by AMDv1. The resulting module will have exported symbols named like pt_iommu_amdv1_init().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjzhhubh)}(hRefer to drivers/iommu/generic_pt/fmt/iommu_template.h for an example of how the IOMMU implementation uses multi-compilation to generate per-format ops structs pointers.h]hRefer to drivers/iommu/generic_pt/fmt/iommu_template.h for an example of how the IOMMU implementation uses multi-compilation to generate per-format ops structs pointers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjzhhubh)}(hThe format code is written so that the common names arise from #defines to distinct format specific names. This is intended to aid debuggability by avoiding symbol clashes across all the different formats.h]hThe format code is written so that the common names arise from #defines to distinct format specific names. This is intended to aid debuggability by avoiding symbol clashes across all the different formats.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjzhhubh)}(hhExported symbols and other global names are mangled using a per-format string via the NS() helper macro.h]hhExported symbols and other global names are mangled using a per-format string via the NS() helper macro.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjzhhubh)}(hThe format uses struct pt_common as the top-level struct for the table, and each format will have its own struct pt_xxx which embeds it to store format-specific information.h]hThe format uses struct pt_common as the top-level struct for the table, and each format will have its own struct pt_xxx which embeds it to store format-specific information.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjzhhubh)}(hqThe implementation will further wrap struct pt_common in its own top-level struct, such as struct pt_iommu_amdv1.h]hqThe implementation will further wrap struct pt_common in its own top-level struct, such as struct pt_iommu_amdv1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubjc)}(hhh](jh)}(h``top_of_table`` Encodes the table top pointer and the top level in a single value. Must use READ_ONCE/WRITE_ONCE to access it. The lower bits of the aligned table pointer are used for the level. h](jn)}(h``top_of_table``h]hliteral)}(hj,h]h top_of_table}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj*ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK8hj&ubj)}(hhh]h)}(hEncodes the table top pointer and the top level in a single value. Must use READ_ONCE/WRITE_ONCE to access it. The lower bits of the aligned table pointer are used for the level.h]hEncodes the table top pointer and the top level in a single value. Must use READ_ONCE/WRITE_ONCE to access it. The lower bits of the aligned table pointer are used for the level.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK6hjDubah}(h]h ]h"]h$]h&]uh1j~hj&ubeh}(h]h ]h"]h$]h&]uh1jghjChK8hj#ubjh)}(h``max_oasz_lg2`` Maximum number of bits the OA can contain. Upper bits must be zero. This may be less than what the page table format supports, but must not be more. h](jn)}(h``max_oasz_lg2``h]j/)}(hjhh]h max_oasz_lg2}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjfubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK>hjbubj)}(hhh]h)}(hMaximum number of bits the OA can contain. Upper bits must be zero. This may be less than what the page table format supports, but must not be more.h]hMaximum number of bits the OA can contain. Upper bits must be zero. This may be less than what the page table format supports, but must not be more.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKhj#ubjh)}(hX``max_vasz_lg2`` Maximum number of bits the VA can contain. Upper bits are 0 or 1 depending on pt_full_va_prefix(). This may be less than what the page table format supports, but must not be more. When PT_FEAT_DYNAMIC_TOP is set this reflects the maximum VA capability. h](jn)}(h``max_vasz_lg2``h]j/)}(hjh]h max_vasz_lg2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKEhjubj)}(hhh]h)}(hMaximum number of bits the VA can contain. Upper bits are 0 or 1 depending on pt_full_va_prefix(). This may be less than what the page table format supports, but must not be more. When PT_FEAT_DYNAMIC_TOP is set this reflects the maximum VA capability.h]hMaximum number of bits the VA can contain. Upper bits are 0 or 1 depending on pt_full_va_prefix(). This may be less than what the page table format supports, but must not be more. When PT_FEAT_DYNAMIC_TOP is set this reflects the maximum VA capability.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKBhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKEhj#ubjh)}(h)``features`` Bitmap of `enum pt_features`h](jn)}(h ``features``h]j/)}(hjh]hfeatures}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKHhjubj)}(hhh]h)}(hBitmap of `enum pt_features`h](h Bitmap of }(hjhhhNhNubhtitle_reference)}(h`enum pt_features`h]henum pt_features}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKIhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKHhj#ubeh}(h]h ]h"]h$]h&]uh1jbhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_features (C enum) c.pt_featureshNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h pt_featuresh]jU)}(henum pt_featuresh](j[)}(henumh]henum}(hjFhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjBhhhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKOubjm)}(h h]h }(hjUhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjBhhhjThKOubj~)}(h pt_featuresh]j)}(hj@h]h pt_features}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjBhhhjThKOubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj>hhhjThKOubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1jNhjThKOhj;hhubj)}(hhh]h)}(h?Features turned on in the table. Each symbol is a bit position.h]h?Features turned on in the table. Each symbol is a bit position.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKThjhhubah}(h]h ]h"]h$]h&]uh1jhj;hhhjThKOubeh}(h]h ](jenumeh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(hX**Constants** ``PT_FEAT_DMA_INCOHERENT`` Cache flush page table memory before assuming the HW can read it. Otherwise a SMP release is sufficient for HW to read it. ``PT_FEAT_FULL_VA`` The table can span the full VA range from 0 to PT_VADDR_MAX. ``PT_FEAT_DYNAMIC_TOP`` The table's top level can be increased dynamically during map. This requires HW support for atomically setting both the table top pointer and the starting table level. ``PT_FEAT_SIGN_EXTEND`` The top most bit of the valid VA range sign extends up to the full pt_vaddr_t. This divides the page table into three VA ranges:: 0 -> 2^N - 1 Lower 2^N -> (MAX - 2^N - 1) Non-Canonical MAX - 2^N -> MAX Upper In this mode pt_common::max_vasz_lg2 includes the sign bit and the upper bits that don't fall within the translation are just validated. If not set there is no sign extension and valid VA goes from 0 to 2^N - 1. ``PT_FEAT_FLUSH_RANGE`` IOTLB maintenance is done by flushing IOVA ranges which will clean out any walk cache or any IOPTE fully contained by the range. The optimization objective is to minimize the number of flushes even if ranges include IOVA gaps that do not need to be flushed. ``PT_FEAT_FLUSH_RANGE_NO_GAPS`` Like PT_FEAT_FLUSH_RANGE except that the optimization objective is to only flush IOVA that has been changed. This mode is suitable for cases like hypervisor shadowing where flushing unchanged ranges may cause the hypervisor to reparse significant amount of page table. ``PT_FEAT_DETAILED_GATHER`` Fill in the struct iommu_iotlb_gather pt sub structure with information about which levels were changed.h](h)}(h **Constants**h]j)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKXhjubjc)}(hhh](jh)}(h``PT_FEAT_DMA_INCOHERENT`` Cache flush page table memory before assuming the HW can read it. Otherwise a SMP release is sufficient for HW to read it. h](jn)}(h``PT_FEAT_DMA_INCOHERENT``h]j/)}(hjh]hPT_FEAT_DMA_INCOHERENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK]hjubj)}(hhh]h)}(hzCache flush page table memory before assuming the HW can read it. Otherwise a SMP release is sufficient for HW to read it.h]hzCache flush page table memory before assuming the HW can read it. Otherwise a SMP release is sufficient for HW to read it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK[hjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhK]hjubjh)}(hQ``PT_FEAT_FULL_VA`` The table can span the full VA range from 0 to PT_VADDR_MAX. h](jn)}(h``PT_FEAT_FULL_VA``h]j/)}(hj h]hPT_FEAT_FULL_VA}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKahjubj)}(hhh]h)}(h h]hPT_FEAT_DYNAMIC_TOP}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj< ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKfhj8 ubj)}(hhh]h)}(hThe table's top level can be increased dynamically during map. This requires HW support for atomically setting both the table top pointer and the starting table level.h]hThe table’s top level can be increased dynamically during map. This requires HW support for atomically setting both the table top pointer and the starting table level.}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKdhjT ubah}(h]h ]h"]h$]h&]uh1j~hj8 ubeh}(h]h ]h"]h$]h&]uh1jghjS hKfhjubjh)}(hX``PT_FEAT_SIGN_EXTEND`` The top most bit of the valid VA range sign extends up to the full pt_vaddr_t. This divides the page table into three VA ranges:: 0 -> 2^N - 1 Lower 2^N -> (MAX - 2^N - 1) Non-Canonical MAX - 2^N -> MAX Upper In this mode pt_common::max_vasz_lg2 includes the sign bit and the upper bits that don't fall within the translation are just validated. If not set there is no sign extension and valid VA goes from 0 to 2^N - 1. h](jn)}(h``PT_FEAT_SIGN_EXTEND``h]j/)}(hjx h]hPT_FEAT_SIGN_EXTEND}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjv ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKuhjr ubj)}(hhh](h)}(hThe top most bit of the valid VA range sign extends up to the full pt_vaddr_t. This divides the page table into three VA ranges::h]hThe top most bit of the valid VA range sign extends up to the full pt_vaddr_t. This divides the page table into three VA ranges:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKihj ubj)}(h|0 -> 2^N - 1 Lower 2^N -> (MAX - 2^N - 1) Non-Canonical MAX - 2^N -> MAX Upperh]h|0 -> 2^N - 1 Lower 2^N -> (MAX - 2^N - 1) Non-Canonical MAX - 2^N -> MAX Upper}hj sbah}(h]h ]h"]h$]h&]hhuh1jhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKmhj ubh)}(hIn this mode pt_common::max_vasz_lg2 includes the sign bit and the upper bits that don't fall within the translation are just validated.h]hIn this mode pt_common::max_vasz_lg2 includes the sign bit and the upper bits that don’t fall within the translation are just validated.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKqhj ubh)}(hJIf not set there is no sign extension and valid VA goes from 0 to 2^N - 1.h]hJIf not set there is no sign extension and valid VA goes from 0 to 2^N - 1.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKthj ubeh}(h]h ]h"]h$]h&]uh1j~hjr ubeh}(h]h ]h"]h$]h&]uh1jghj hKuhjubjh)}(hX``PT_FEAT_FLUSH_RANGE`` IOTLB maintenance is done by flushing IOVA ranges which will clean out any walk cache or any IOPTE fully contained by the range. The optimization objective is to minimize the number of flushes even if ranges include IOVA gaps that do not need to be flushed. h](jn)}(h``PT_FEAT_FLUSH_RANGE``h]j/)}(hj h]hPT_FEAT_FLUSH_RANGE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhK|hj ubj)}(hhh]h)}(hXIOTLB maintenance is done by flushing IOVA ranges which will clean out any walk cache or any IOPTE fully contained by the range. The optimization objective is to minimize the number of flushes even if ranges include IOVA gaps that do not need to be flushed.h]hXIOTLB maintenance is done by flushing IOVA ranges which will clean out any walk cache or any IOPTE fully contained by the range. The optimization objective is to minimize the number of flushes even if ranges include IOVA gaps that do not need to be flushed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKxhj ubah}(h]h ]h"]h$]h&]uh1j~hj ubeh}(h]h ]h"]h$]h&]uh1jghj hK|hjubjh)}(hX-``PT_FEAT_FLUSH_RANGE_NO_GAPS`` Like PT_FEAT_FLUSH_RANGE except that the optimization objective is to only flush IOVA that has been changed. This mode is suitable for cases like hypervisor shadowing where flushing unchanged ranges may cause the hypervisor to reparse significant amount of page table. h](jn)}(h``PT_FEAT_FLUSH_RANGE_NO_GAPS``h]j/)}(hj h]hPT_FEAT_FLUSH_RANGE_NO_GAPS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKhj ubj)}(hhh]h)}(hX Like PT_FEAT_FLUSH_RANGE except that the optimization objective is to only flush IOVA that has been changed. This mode is suitable for cases like hypervisor shadowing where flushing unchanged ranges may cause the hypervisor to reparse significant amount of page table.h]hX Like PT_FEAT_FLUSH_RANGE except that the optimization objective is to only flush IOVA that has been changed. This mode is suitable for cases like hypervisor shadowing where flushing unchanged ranges may cause the hypervisor to reparse significant amount of page table.}(hj2 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKhj/ ubah}(h]h ]h"]h$]h&]uh1j~hj ubeh}(h]h ]h"]h$]h&]uh1jghj. hKhjubjh)}(h``PT_FEAT_DETAILED_GATHER`` Fill in the struct iommu_iotlb_gather pt sub structure with information about which levels were changed.h](jn)}(h``PT_FEAT_DETAILED_GATHER``h]j/)}(hjS h]hPT_FEAT_DETAILED_GATHER}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjQ ubah}(h]h ]h"]h$]h&]uh1jmhg/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:66: ./include/linux/generic_pt/common.hhKhjM ubj)}(hhh]h)}(hhFill in the struct iommu_iotlb_gather pt sub structure with information about which levels were changed.h]hhFill in the struct iommu_iotlb_gather pt sub structure with information about which levels were changed.}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh hKhji ubah}(h]h ]h"]h$]h&]uh1j~hjM ubeh}(h]h ]h"]h$]h&]uh1jghjh hKhjubeh}(h]h ]h"]h$]h&]uh1jbhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_attr_from_entry (C function)c.pt_attr_from_entryhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hRvoid pt_attr_from_entry (const struct pt_state *pts, struct pt_write_attrs *attrs)h]jU)}(hQvoid pt_attr_from_entry(const struct pt_state *pts, struct pt_write_attrs *attrs)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j hj hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj hhhj hK ubj~)}(hpt_attr_from_entryh]j)}(hpt_attr_from_entryh]hpt_attr_from_entry}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj hhhj hK ubhdesc_parameterlist)}(h:(const struct pt_state *pts, struct pt_write_attrs *attrs)h](hdesc_parameter)}(hconst struct pt_state *ptsh](j[)}(hconsth]hconst}(hj hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubj[)}(hj^h]hstruct}(hj hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj* hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj' ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetj, modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jE ASTIdentifier)}j@ j sbc.pt_attr_from_entryasbuh1hhj ubjm)}(h h]h }(hjR hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubhdesc_sig_punctuation)}(h*h]h*}(hjb hhhNhNubah}(h]h ]pah"]h$]h&]uh1j` hj ubj)}(hptsh]hpts}(hjq hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubj )}(hstruct pt_write_attrs *attrsh](j[)}(hj^h]hstruct}(hj hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubh)}(hhh]j)}(hpt_write_attrsh]hpt_write_attrs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj modnameN classnameNjD jG )}jJ ]jN c.pt_attr_from_entryasbuh1hhj ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubja )}(hjd h]h*}(hj hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj ubj)}(hattrsh]hattrs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubeh}(h]h ]h"]h$]h&]hhuh1j hj hhhj hK ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj hhhj hK ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jNhj hK hj hhubj)}(hhh]h)}(h)Convert the permission bits back to attrsh]h)Convert the permission bits back to attrs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hK ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj# jj# jjjuh1jIhhhj'hNhNubj)}(hX1**Parameters** ``const struct pt_state *pts`` Entry to convert from ``struct pt_write_attrs *attrs`` Resulting attrs **Description** Fill in the attrs with the permission bits encoded in the current leaf entry. The attrs should be usable with pt_install_leaf_entry() to reconstruct the same entry.h](h)}(h**Parameters**h]j)}(hj- h]h Parameters}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK$hj' ubjc)}(hhh](jh)}(h5``const struct pt_state *pts`` Entry to convert from h](jn)}(h``const struct pt_state *pts``h]j/)}(hjL h]hconst struct pt_state *pts}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjJ ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK!hjF ubj)}(hhh]h)}(hEntry to convert fromh]hEntry to convert from}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja hK!hjb ubah}(h]h ]h"]h$]h&]uh1j~hjF ubeh}(h]h ]h"]h$]h&]uh1jghja hK!hjC ubjh)}(h1``struct pt_write_attrs *attrs`` Resulting attrs h](jn)}(h ``struct pt_write_attrs *attrs``h]j/)}(hj h]hstruct pt_write_attrs *attrs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK"hj ubj)}(hhh]h)}(hResulting attrsh]hResulting attrs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK"hj ubah}(h]h ]h"]h$]h&]uh1j~hj ubeh}(h]h ]h"]h$]h&]uh1jghj hK"hjC ubeh}(h]h ]h"]h$]h&]uh1jbhj' ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK$hj' ubh)}(hFill in the attrs with the permission bits encoded in the current leaf entry. The attrs should be usable with pt_install_leaf_entry() to reconstruct the same entry.h]hFill in the attrs with the permission bits encoded in the current leaf entry. The attrs should be usable with pt_install_leaf_entry() to reconstruct the same entry.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK#hj' ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_can_have_leaf (C function)c.pt_can_have_leafhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h2bool pt_can_have_leaf (const struct pt_state *pts)h]jU)}(h1bool pt_can_have_leaf(const struct pt_state *pts)h](j )}(hboolh]hbool}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK,ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj hhhj hK,ubj~)}(hpt_can_have_leafh]j)}(hpt_can_have_leafh]hpt_can_have_leaf}(hj& hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj" ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj hhhj hK,ubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjB hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj> ubjm)}(h h]h }(hjO hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj> ubj[)}(hj^h]hstruct}(hj] hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj> ubjm)}(h h]h }(hjj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj> ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj} modnameN classnameNjD jG )}jJ ]jM )}j@ j( sbc.pt_can_have_leafasbuh1hhj> ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj> ubja )}(hjd h]h*}(hj hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj> ubj)}(hptsh]hpts}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj> ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj: ubah}(h]h ]h"]h$]h&]hhuh1j hj hhhj hK,ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj hhhj hK,ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jNhj hK,hj hhubj)}(hhh]h)}(h.True if the current level can have an OA entryh]h.True if the current level can have an OA entry}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK,hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hK,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_state *pts`` The current level **Description** True if the current level can support pt_install_leaf_entry(). A leaf entry produce an OA.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK0hj ubjc)}(hhh]jh)}(h1``const struct pt_state *pts`` The current level h](jn)}(h``const struct pt_state *pts``h]j/)}(hj!h]hconst struct pt_state *pts}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK-hjubj)}(hhh]h)}(hThe current levelh]hThe current level}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hK-hj7ubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghj6hK-hjubah}(h]h ]h"]h$]h&]uh1jbhj ubh)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK/hj ubh)}(hZTrue if the current level can support pt_install_leaf_entry(). A leaf entry produce an OA.h]hZTrue if the current level can support pt_install_leaf_entry(). A leaf entry produce an OA.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK.hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_can_have_table (C function)c.pt_can_have_tablehNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h3bool pt_can_have_table (const struct pt_state *pts)h]jU)}(h2bool pt_can_have_table(const struct pt_state *pts)h](j )}(hj h]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK5ubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhK5ubj~)}(hpt_can_have_tableh]j)}(hpt_can_have_tableh]hpt_can_have_table}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhK5ubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ jsbc.pt_can_have_tableasbuh1hhjubjm)}(h h]h }(hj6hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hjDhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhK5ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhK5ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhK5hjhhubj)}(hhh]h)}(h0True if the current level can have a lower tableh]h0True if the current level can have a lower table}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK5hjxhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_state *pts`` The current level **Description** Every level except 0 is allowed to have a lower table.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK9hjubjc)}(hhh]jh)}(h1``const struct pt_state *pts`` The current level h](jn)}(h``const struct pt_state *pts``h]j/)}(hjh]hconst struct pt_state *pts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK6hjubj)}(hhh]h)}(hThe current levelh]hThe current level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhK6hjubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK8hjubh)}(h6Every level except 0 is allowed to have a lower table.h]h6Every level except 0 is allowed to have a lower table.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK7hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_clear_entries (C function)c.pt_clear_entrieshNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hIvoid pt_clear_entries (struct pt_state *pts, unsigned int num_contig_lg2)h]jU)}(hHvoid pt_clear_entries(struct pt_state *pts, unsigned int num_contig_lg2)h](j )}(hvoidh]hvoid}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKAubjm)}(h h]h }(hjKhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj8hhhjJhKAubj~)}(hpt_clear_entriesh]j)}(hpt_clear_entriesh]hpt_clear_entries}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj8hhhjJhKAubj )}(h3(struct pt_state *pts, unsigned int num_contig_lg2)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjyhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjuubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjuubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ j_sbc.pt_clear_entriesasbuh1hhjuubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjuubja )}(hjd h]h*}(hjhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjuubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjqubj )}(hunsigned int num_contig_lg2h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj)}(hnum_contig_lg2h]hnum_contig_lg2}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjqubeh}(h]h ]h"]h$]h&]hhuh1j hj8hhhjJhKAubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj4hhhjJhKAubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jNhjJhKAhj1hhubj)}(hhh]h)}(h Make entries empty (non-present)h]h Make entries empty (non-present)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKAhjJhhubah}(h]h ]h"]h$]h&]uh1jhj1hhhjJhKAubeh}(h]h ](jfunctioneh"]h$]h&]jjjjejjejjjuh1jIhhhj'hNhNubj)}(hXF**Parameters** ``struct pt_state *pts`` Starting table index ``unsigned int num_contig_lg2`` Number of contiguous items to clear **Description** Clear a run of entries. A cleared entry will load back as PT_ENTRY_EMPTY and does not have any effect on table walking. The starting index must be aligned to num_contig_lg2.h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKEhjiubjc)}(hhh](jh)}(h.``struct pt_state *pts`` Starting table index h](jn)}(h``struct pt_state *pts``h]j/)}(hjh]hstruct pt_state *pts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKBhjubj)}(hhh]h)}(hStarting table indexh]hStarting table index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKBhjubjh)}(hD``unsigned int num_contig_lg2`` Number of contiguous items to clear h](jn)}(h``unsigned int num_contig_lg2``h]j/)}(hjh]hunsigned int num_contig_lg2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKChjubj)}(hhh]h)}(h#Number of contiguous items to clearh]h#Number of contiguous items to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKChjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKChjubeh}(h]h ]h"]h$]h&]uh1jbhjiubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKEhjiubh)}(hClear a run of entries. A cleared entry will load back as PT_ENTRY_EMPTY and does not have any effect on table walking. The starting index must be aligned to num_contig_lg2.h]hClear a run of entries. A cleared entry will load back as PT_ENTRY_EMPTY and does not have any effect on table walking. The starting index must be aligned to num_contig_lg2.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKDhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE&pt_entry_make_write_dirty (C function)c.pt_entry_make_write_dirtyhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h5bool pt_entry_make_write_dirty (struct pt_state *pts)h]jU)}(h4bool pt_entry_make_write_dirty(struct pt_state *pts)h](j )}(hj h]hbool}(hjGhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjChhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKMubjm)}(h h]h }(hjUhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjChhhjThKMubj~)}(hpt_entry_make_write_dirtyh]j)}(hpt_entry_make_write_dirtyh]hpt_entry_make_write_dirty}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjChhhjThKMubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ jisbc.pt_entry_make_write_dirtyasbuh1hhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hjhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj{ubah}(h]h ]h"]h$]h&]hhuh1j hjChhhjThKMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj?hhhjThKMubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jNhjThKMhj<hhubj)}(hhh]h)}(hMake an entry dirtyh]hMake an entry dirty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKMhjhhubah}(h]h ]h"]h$]h&]uh1jhj<hhhjThKMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``struct pt_state *pts`` Table entry to change **Description** Make pt_entry_is_write_dirty() return true for this entry. This can be called asynchronously with any other table manipulation under a RCU lock and must not corrupt the table.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKQhj"ubjc)}(hhh]jh)}(h/``struct pt_state *pts`` Table entry to change h](jn)}(h``struct pt_state *pts``h]j/)}(hjGh]hstruct pt_state *pts}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjEubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKNhjAubj)}(hhh]h)}(hTable entry to changeh]hTable entry to change}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hKNhj]ubah}(h]h ]h"]h$]h&]uh1j~hjAubeh}(h]h ]h"]h$]h&]uh1jghj\hKNhj>ubah}(h]h ]h"]h$]h&]uh1jbhj"ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKPhj"ubh)}(hMake pt_entry_is_write_dirty() return true for this entry. This can be called asynchronously with any other table manipulation under a RCU lock and must not corrupt the table.h]hMake pt_entry_is_write_dirty() return true for this entry. This can be called asynchronously with any other table manipulation under a RCU lock and must not corrupt the table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKOhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE&pt_entry_make_write_clean (C function)c.pt_entry_make_write_cleanhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h5void pt_entry_make_write_clean (struct pt_state *pts)h]jU)}(h4void pt_entry_make_write_clean(struct pt_state *pts)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKWubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKWubj~)}(hpt_entry_make_write_cleanh]j)}(hpt_entry_make_write_cleanh]hpt_entry_make_write_clean}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhKWubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj$modnameN classnameNjD jG )}jJ ]jM )}j@ jsbc.pt_entry_make_write_cleanasbuh1hhjubjm)}(h h]h }(hjBhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hjPhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhKWubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKWubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKWhjhhubj)}(hhh]h)}(hMake the entry write cleanh]hMake the entry write clean}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKWhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKWubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``struct pt_state *pts`` Table entry to change **Description** Modify the entry so that pt_entry_is_write_dirty() == false. The HW will eventually be notified of this change via a TLB flush, which is the point that the HW must become synchronized. Any "write dirty" prior to the TLB flush can be lost, but once the TLB flush completes all writes must make their entries write dirty. The format should alter the entry in a way that is compatible with any concurrent update from HW. The entire contiguous entry is changed.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK[hjubjc)}(hhh]jh)}(h/``struct pt_state *pts`` Table entry to change h](jn)}(h``struct pt_state *pts``h]j/)}(hjh]hstruct pt_state *pts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKXhjubj)}(hhh]h)}(hTable entry to changeh]hTable entry to change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKXhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKXhjubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKZhjubh)}(hX?Modify the entry so that pt_entry_is_write_dirty() == false. The HW will eventually be notified of this change via a TLB flush, which is the point that the HW must become synchronized. Any "write dirty" prior to the TLB flush can be lost, but once the TLB flush completes all writes must make their entries write dirty.h]hXCModify the entry so that pt_entry_is_write_dirty() == false. The HW will eventually be notified of this change via a TLB flush, which is the point that the HW must become synchronized. Any “write dirty” prior to the TLB flush can be lost, but once the TLB flush completes all writes must make their entries write dirty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKYhjubh)}(hThe format should alter the entry in a way that is compatible with any concurrent update from HW. The entire contiguous entry is changed.h]hThe format should alter the entry in a way that is compatible with any concurrent update from HW. The entire contiguous entry is changed.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK_hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE$pt_entry_is_write_dirty (C function)c.pt_entry_is_write_dirtyhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h9bool pt_entry_is_write_dirty (const struct pt_state *pts)h]jU)}(h8bool pt_entry_is_write_dirty(const struct pt_state *pts)h](j )}(hj h]hbool}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjShhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKfubjm)}(h h]h }(hjehhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjShhhjdhKfubj~)}(hpt_entry_is_write_dirtyh]j)}(hpt_entry_is_write_dirtyh]hpt_entry_is_write_dirty}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjShhhjdhKfubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ jysbc.pt_entry_is_write_dirtyasbuh1hhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hjhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjShhhjdhKfubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjOhhhjdhKfubah}(h]jJah ](jjeh"]h$]h&]jj)jhuh1jNhjdhKfhjLhhubj)}(hhh]h)}(h%True if the entry has been written toh]h%True if the entry has been written to}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKfhj.hhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjdhKfubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``const struct pt_state *pts`` Entry to query **Description** "write dirty" means that the HW has written to the OA translated by this entry. If the entry is contiguous then the consolidated "write dirty" for all the items must be returned.h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKjhjMubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hjrh]hconst struct pt_state *pts}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjpubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKghjlubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKghjubah}(h]h ]h"]h$]h&]uh1j~hjlubeh}(h]h ]h"]h$]h&]uh1jghjhKghjiubah}(h]h ]h"]h$]h&]uh1jbhjMubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKihjMubh)}(h"write dirty" means that the HW has written to the OA translated by this entry. If the entry is contiguous then the consolidated "write dirty" for all the items must be returned.h]h“write dirty” means that the HW has written to the OA translated by this entry. If the entry is contiguous then the consolidated “write dirty” for all the items must be returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_dirty_supported (C function)c.pt_dirty_supportedhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h2bool pt_dirty_supported (struct pt_common *common)h]jU)}(h1bool pt_dirty_supported(struct pt_common *common)h](j )}(hj h]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKpubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKpubj~)}(hpt_dirty_supportedh]j)}(hpt_dirty_supportedh]hpt_dirty_supported}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhKpubj )}(h(struct pt_common *common)h]j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hj.hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj*ubjm)}(h h]h }(hj;hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj*ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjNmodnameN classnameNjD jG )}jJ ]jM )}j@ jsbc.pt_dirty_supportedasbuh1hhj*ubjm)}(h h]h }(hjlhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj*ubja )}(hjd h]h*}(hjzhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj*ubj)}(hcommonh]hcommon}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj&ubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhKpubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKphjhhubj)}(hhh]h)}(h.True if the page table supports dirty trackingh]h.True if the page table supports dirty tracking}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKphjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKpubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(hB**Parameters** ``struct pt_common *common`` Page table to queryh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKthjubjc)}(hhh]jh)}(h0``struct pt_common *common`` Page table to queryh](jn)}(h``struct pt_common *common``h]j/)}(hjh]hstruct pt_common *common}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKvhjubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKqhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKvhjubah}(h]h ]h"]h$]h&]uh1jbhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE$pt_entry_num_contig_lg2 (C function)c.pt_entry_num_contig_lg2hNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hAunsigned int pt_entry_num_contig_lg2 (const struct pt_state *pts)h]jU)}(h@unsigned int pt_entry_num_contig_lg2(const struct pt_state *pts)h](j )}(hunsignedh]hunsigned}(hjLhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjHhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKvubjm)}(h h]h }(hj[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjHhhhjZhKvubj )}(hinth]hint}(hjihhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjHhhhjZhKvubjm)}(h h]h }(hjwhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjHhhhjZhKvubj~)}(hpt_entry_num_contig_lg2h]j)}(hpt_entry_num_contig_lg2h]hpt_entry_num_contig_lg2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjHhhhjZhKvubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ jsbc.pt_entry_num_contig_lg2asbuh1hhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hj hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjHhhhjZhKvubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjDhhhjZhKvubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jNhjZhKvhjAhhubj)}(hhh]h)}(h.Number of contiguous items for this leaf entryh]h.Number of contiguous items for this leaf entry}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKvhj@hhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhKvubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_state *pts`` Entry to query **Description** Return the number of contiguous items this leaf entry spans. If the entry is single item it returns ilog2(1).h](h)}(h**Parameters**h]j)}(hjeh]h Parameters}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKzhj_ubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hjh]hconst struct pt_state *pts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKwhj~ubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKwhjubah}(h]h ]h"]h$]h&]uh1j~hj~ubeh}(h]h ]h"]h$]h&]uh1jghjhKwhj{ubah}(h]h ]h"]h$]h&]uh1jbhj_ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKyhj_ubh)}(hmReturn the number of contiguous items this leaf entry spans. If the entry is single item it returns ilog2(1).h]hmReturn the number of contiguous items this leaf entry spans. If the entry is single item it returns ilog2(1).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKxhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_entry_oa (C function) c.pt_entry_oahNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h3pt_oaddr_t pt_entry_oa (const struct pt_state *pts)h]jU)}(h2pt_oaddr_t pt_entry_oa(const struct pt_state *pts)h](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj modnameN classnameNjD jG )}jJ ]jM )}j@ pt_entry_oasb c.pt_entry_oaasbuh1hhjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hj)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhj(hKubj~)}(h pt_entry_oah]j)}(hj%h]h pt_entry_oa}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhj(hKubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjVhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjRubjm)}(h h]h }(hjchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubj[)}(hj^h]hstruct}(hjqhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjRubjm)}(h h]h }(hj~hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]j# c.pt_entry_oaasbuh1hhjRubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubja )}(hjd h]h*}(hjhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjRubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjNubah}(h]h ]h"]h$]h&]hhuh1j hjhhhj(hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhj(hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhj(hKhjhhubj)}(hhh]h)}(h"Output Address for this leaf entryh]h"Output Address for this leaf entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj(hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``const struct pt_state *pts`` Entry to query **Description** Return the output address for the start of the entry. If the entry is contiguous this returns the same value for each sub-item. I.e.:: log2_mod(pt_entry_oa(), pt_entry_oa_lg2sz()) == 0 See pt_item_oa(). The format should implement one of these two functions depending on how it stores the OAs in the table.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hj3h]hconst struct pt_state *pts}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj1ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj-ubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhKhjIubah}(h]h ]h"]h$]h&]uh1j~hj-ubeh}(h]h ]h"]h$]h&]uh1jghjHhKhj*ubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjnh]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubh)}(hReturn the output address for the start of the entry. If the entry is contiguous this returns the same value for each sub-item. I.e.::h]hReturn the output address for the start of the entry. If the entry is contiguous this returns the same value for each sub-item. I.e.:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubj)}(h1log2_mod(pt_entry_oa(), pt_entry_oa_lg2sz()) == 0h]h1log2_mod(pt_entry_oa(), pt_entry_oa_lg2sz()) == 0}hjsbah}(h]h ]h"]h$]h&]hhuh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubh)}(hySee pt_item_oa(). The format should implement one of these two functions depending on how it stores the OAs in the table.h]hySee pt_item_oa(). The format should implement one of these two functions depending on how it stores the OAs in the table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_entry_oa_lg2sz (C function)c.pt_entry_oa_lg2szhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h;unsigned int pt_entry_oa_lg2sz (const struct pt_state *pts)h]jU)}(h:unsigned int pt_entry_oa_lg2sz(const struct pt_state *pts)h](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKubj )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhKubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKubj~)}(hpt_entry_oa_lg2szh]j)}(hpt_entry_oa_lg2szh]hpt_entry_oa_lg2sz}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhKubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj*hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj&ubjm)}(h h]h }(hj7hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubj[)}(hj^h]hstruct}(hjEhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj&ubjm)}(h h]h }(hjRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjemodnameN classnameNjD jG )}jJ ]jM )}j@ jsbc.pt_entry_oa_lg2szasbuh1hhj&ubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubja )}(hjd h]h*}(hjhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj&ubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj"ubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKhjhhubj)}(hhh]h)}(hReturn the size of an OA entryh]hReturn the size of an OA entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_state *pts`` Entry to query **Description** If the entry is not contiguous this returns pt_table_item_lg2sz(), otherwise it returns the total VA/OA size of the entire contiguous entry.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hj h]hconst struct pt_state *pts}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKhjubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjDh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubh)}(hIf the entry is not contiguous this returns pt_table_item_lg2sz(), otherwise it returns the total VA/OA size of the entire contiguous entry.h]hIf the entry is not contiguous this returns pt_table_item_lg2sz(), otherwise it returns the total VA/OA size of the entire contiguous entry.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_entry_oa_exact (C function)c.pt_entry_oa_exacthNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h9pt_oaddr_t pt_entry_oa_exact (const struct pt_state *pts)h]jU)}(h8pt_oaddr_t pt_entry_oa_exact(const struct pt_state *pts)h](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_entry_oa_exactsbc.pt_entry_oa_exactasbuh1hhjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKubj~)}(hpt_entry_oa_exacth]j)}(hjh]hpt_entry_oa_exact}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhKubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjmodnameN classnameNjD jG )}jJ ]jc.pt_entry_oa_exactasbuh1hhjubjm)}(h h]h }(hj2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubja )}(hjd h]h*}(hj@hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjubj)}(hptsh]hpts}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jNhjhKhj~hhubj)}(hhh]h)}(h#Return the complete OA for an entryh]h#Return the complete OA for an entry}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjthhubah}(h]h ]h"]h$]h&]uh1jhj~hhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_state *pts`` Entry to query **Description** During iteration the first entry could have a VA with an offset from the natural start of the entry. Return the exact OA including the pts's VA offset.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hjh]hconst struct pt_state *pts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]uh1jghjhKhjubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubh)}(hDuring iteration the first entry could have a VA with an offset from the natural start of the entry. Return the exact OA including the pts's VA offset.h]hDuring iteration the first entry could have a VA with an offset from the natural start of the entry. Return the exact OA including the pts’s VA offset.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_full_va_prefix (C function)c.pt_full_va_prefixhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h=pt_vaddr_t pt_full_va_prefix (const struct pt_common *common)h]jU)}(h jj> jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``const struct pt_common *common`` Page table to query **Description** This is usually 0, but some formats have their VA space going downward from PT_VADDR_MAX, and will return that instead. This value must always be adjusted by struct pt_common max_vasz_lg2.h](h)}(h**Parameters**h]j)}(hjH h]h Parameters}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjB ubjc)}(hhh]jh)}(h7``const struct pt_common *common`` Page table to query h](jn)}(h"``const struct pt_common *common``h]j/)}(hjg h]hconst struct pt_common *common}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hje ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhja ubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj| hKhj} ubah}(h]h ]h"]h$]h&]uh1j~hja ubeh}(h]h ]h"]h$]h&]uh1jghj| hKhj^ ubah}(h]h ]h"]h$]h&]uh1jbhjB ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjB ubh)}(hThis is usually 0, but some formats have their VA space going downward from PT_VADDR_MAX, and will return that instead. This value must always be adjusted by struct pt_common max_vasz_lg2.h]hThis is usually 0, but some formats have their VA space going downward from PT_VADDR_MAX, and will return that instead. This value must always be adjusted by struct pt_common max_vasz_lg2.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjB ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE$pt_has_system_page_size (C function)c.pt_has_system_page_sizehNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h=bool pt_has_system_page_size (const struct pt_common *common)h]jU)}(h!hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj!ubjm)}(h h]h }(hjK!hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj!ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hj\!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY!ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj^!modnameN classnameNjD jG )}jJ ]jM )}j@ j !sbc.pt_has_system_page_sizeasbuh1hhj!ubjm)}(h h]h }(hj|!hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj!ubja )}(hjd h]h*}(hj!hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj!ubj)}(hcommonh]hcommon}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj!ubah}(h]h ]h"]h$]h&]hhuh1j hj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jNhj hKhj hhubj)}(hhh]h)}(h.True if level 0 can install a PAGE_SHIFT entryh]h.True if level 0 can install a PAGE_SHIFT entry}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``const struct pt_common *common`` Page table to query **Description** If true the caller can use, at level 0, pt_install_leaf_entry(PAGE_SHIFT). This is useful to create optimized paths for common cases of PAGE_SIZE mappings.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj!ubjc)}(hhh]jh)}(h7``const struct pt_common *common`` Page table to query h](jn)}(h"``const struct pt_common *common``h]j/)}(hj"h]hconst struct pt_common *common}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj"ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj!ubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hKhj"ubah}(h]h ]h"]h$]h&]uh1j~hj!ubeh}(h]h ]h"]h$]h&]uh1jghj"hKhj!ubah}(h]h ]h"]h$]h&]uh1jbhj!ubh)}(h**Description**h]j)}(hj="h]h Description}(hj?"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;"ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj!ubh)}(hIf true the caller can use, at level 0, pt_install_leaf_entry(PAGE_SHIFT). This is useful to create optimized paths for common cases of PAGE_SIZE mappings.h]hIf true the caller can use, at level 0, pt_install_leaf_entry(PAGE_SHIFT). This is useful to create optimized paths for common cases of PAGE_SIZE mappings.}(hjS"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE"pt_install_leaf_entry (C function)c.pt_install_leaf_entryhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h{void pt_install_leaf_entry (struct pt_state *pts, pt_oaddr_t oa, unsigned int oasz_lg2, const struct pt_write_attrs *attrs)h]jU)}(hzvoid pt_install_leaf_entry(struct pt_state *pts, pt_oaddr_t oa, unsigned int oasz_lg2, const struct pt_write_attrs *attrs)h](j )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj~"hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hj"hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj~"hhhj"hKubj~)}(hpt_install_leaf_entryh]j)}(hpt_install_leaf_entryh]hpt_install_leaf_entry}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj~"hhhj"hKubj )}(h`(struct pt_state *pts, pt_oaddr_t oa, unsigned int oasz_lg2, const struct pt_write_attrs *attrs)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj"hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj"ubjm)}(h h]h }(hj"hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj"ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj"modnameN classnameNjD jG )}jJ ]jM )}j@ j"sbc.pt_install_leaf_entryasbuh1hhj"ubjm)}(h h]h }(hj"hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj"ubja )}(hjd h]h*}(hj #hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj"ubj)}(hptsh]hpts}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj"ubj )}(h pt_oaddr_t oah](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hj4#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1#ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj6#modnameN classnameNjD jG )}jJ ]j"c.pt_install_leaf_entryasbuh1hhj-#ubjm)}(h h]h }(hjR#hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj-#ubj)}(hoah]hoa}(hj`#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-#ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj"ubj )}(hunsigned int oasz_lg2h](j )}(hunsignedh]hunsigned}(hjy#hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hju#ubjm)}(h h]h }(hj#hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhju#ubj )}(hinth]hint}(hj#hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hju#ubjm)}(h h]h }(hj#hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhju#ubj)}(hoasz_lg2h]hoasz_lg2}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju#ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj"ubj )}(h"const struct pt_write_attrs *attrsh](j[)}(hj h]hconst}(hj#hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj#ubjm)}(h h]h }(hj#hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj#ubj[)}(hj^h]hstruct}(hj#hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj#ubjm)}(h h]h }(hj#hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj#ubh)}(hhh]j)}(hpt_write_attrsh]hpt_write_attrs}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj$modnameN classnameNjD jG )}jJ ]j"c.pt_install_leaf_entryasbuh1hhj#ubjm)}(h h]h }(hj!$hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj#ubja )}(hjd h]h*}(hj/$hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj#ubj)}(hattrsh]hattrs}(hj<$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj"ubeh}(h]h ]h"]h$]h&]hhuh1j hj~"hhhj"hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjz"hhhj"hKubah}(h]ju"ah ](jjeh"]h$]h&]jj)jhuh1jNhj"hKhjw"hhubj)}(hhh]h)}(hWrite a leaf entry to the tableh]hWrite a leaf entry to the table}(hjf$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjc$hhubah}(h]h ]h"]h$]h&]uh1jhjw"hhhj"hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~$jj~$jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``struct pt_state *pts`` Table index to change ``pt_oaddr_t oa`` Output Address for this leaf ``unsigned int oasz_lg2`` Size in VA/OA for this leaf ``const struct pt_write_attrs *attrs`` Attributes to modify the entry **Description** A leaf OA entry will return PT_ENTRY_OA from pt_load_entry(). It translates the VA indicated by pts to the given OA. For a single item non-contiguous entry oasz_lg2 is pt_table_item_lg2sz(). For contiguous it is pt_table_item_lg2sz() + num_contig_lg2. This must not be called if pt_can_have_leaf() == false. Contiguous sizes not indicated by pt_possible_sizes() must not be specified.h](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubjc)}(hhh](jh)}(h/``struct pt_state *pts`` Table index to change h](jn)}(h``struct pt_state *pts``h]j/)}(hj$h]hstruct pt_state *pts}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj$ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubj)}(hhh]h)}(hTable index to changeh]hTable index to change}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj$ubah}(h]h ]h"]h$]h&]uh1j~hj$ubeh}(h]h ]h"]h$]h&]uh1jghj$hKhj$ubjh)}(h/``pt_oaddr_t oa`` Output Address for this leaf h](jn)}(h``pt_oaddr_t oa``h]j/)}(hj$h]h pt_oaddr_t oa}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj$ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubj)}(hhh]h)}(hOutput Address for this leafh]hOutput Address for this leaf}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj$ubah}(h]h ]h"]h$]h&]uh1j~hj$ubeh}(h]h ]h"]h$]h&]uh1jghj$hKhj$ubjh)}(h6``unsigned int oasz_lg2`` Size in VA/OA for this leaf h](jn)}(h``unsigned int oasz_lg2``h]j/)}(hj%h]hunsigned int oasz_lg2}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj%ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj%ubj)}(hhh]h)}(hSize in VA/OA for this leafh]hSize in VA/OA for this leaf}(hj2%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.%hKhj/%ubah}(h]h ]h"]h$]h&]uh1j~hj%ubeh}(h]h ]h"]h$]h&]uh1jghj.%hKhj$ubjh)}(hF``const struct pt_write_attrs *attrs`` Attributes to modify the entry h](jn)}(h&``const struct pt_write_attrs *attrs``h]j/)}(hjR%h]h"const struct pt_write_attrs *attrs}(hjT%hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjP%ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjL%ubj)}(hhh]h)}(hAttributes to modify the entryh]hAttributes to modify the entry}(hjk%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg%hKhjh%ubah}(h]h ]h"]h$]h&]uh1j~hjL%ubeh}(h]h ]h"]h$]h&]uh1jghjg%hKhj$ubeh}(h]h ]h"]h$]h&]uh1jbhj$ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubh)}(htA leaf OA entry will return PT_ENTRY_OA from pt_load_entry(). It translates the VA indicated by pts to the given OA.h]htA leaf OA entry will return PT_ENTRY_OA from pt_load_entry(). It translates the VA indicated by pts to the given OA.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubh)}(hFor a single item non-contiguous entry oasz_lg2 is pt_table_item_lg2sz(). For contiguous it is pt_table_item_lg2sz() + num_contig_lg2.h]hFor a single item non-contiguous entry oasz_lg2 is pt_table_item_lg2sz(). For contiguous it is pt_table_item_lg2sz() + num_contig_lg2.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubh)}(hThis must not be called if pt_can_have_leaf() == false. Contiguous sizes not indicated by pt_possible_sizes() must not be specified.h]hThis must not be called if pt_can_have_leaf() == false. Contiguous sizes not indicated by pt_possible_sizes() must not be specified.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_install_table (C function)c.pt_install_tablehNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hebool pt_install_table (struct pt_state *pts, pt_oaddr_t table_pa, const struct pt_write_attrs *attrs)h]jU)}(hdbool pt_install_table(struct pt_state *pts, pt_oaddr_t table_pa, const struct pt_write_attrs *attrs)h](j )}(hj h]hbool}(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj%hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hj%hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj%hhhj%hKubj~)}(hpt_install_tableh]j)}(hpt_install_tableh]hpt_install_table}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj &ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj%hhhj%hKubj )}(hO(struct pt_state *pts, pt_oaddr_t table_pa, const struct pt_write_attrs *attrs)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj,&hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj(&ubjm)}(h h]h }(hj9&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj(&ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjJ&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG&ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjL&modnameN classnameNjD jG )}jJ ]jM )}j@ j&sbc.pt_install_tableasbuh1hhj(&ubjm)}(h h]h }(hjj&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj(&ubja )}(hjd h]h*}(hjx&hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj(&ubj)}(hptsh]hpts}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj$&ubj )}(hpt_oaddr_t table_pah](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj&modnameN classnameNjD jG )}jJ ]jf&c.pt_install_tableasbuh1hhj&ubjm)}(h h]h }(hj&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubj)}(htable_pah]htable_pa}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj$&ubj )}(h"const struct pt_write_attrs *attrsh](j[)}(hj h]hconst}(hj&hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj&ubjm)}(h h]h }(hj&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubj[)}(hj^h]hstruct}(hj'hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj&ubjm)}(h h]h }(hj'hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubh)}(hhh]j)}(hpt_write_attrsh]hpt_write_attrs}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj!'modnameN classnameNjD jG )}jJ ]jf&c.pt_install_tableasbuh1hhj&ubjm)}(h h]h }(hj='hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubja )}(hjd h]h*}(hjK'hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj&ubj)}(hattrsh]hattrs}(hjX'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj$&ubeh}(h]h ]h"]h$]h&]hhuh1j hj%hhhj%hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj%hhhj%hKubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jNhj%hKhj%hhubj)}(hhh]h)}(h Write a table entry to the tableh]h Write a table entry to the table}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'jj'jjjuh1jIhhhj'hNhNubj)}(hX>**Parameters** ``struct pt_state *pts`` Table index to change ``pt_oaddr_t table_pa`` CPU physical address of the lower table's memory ``const struct pt_write_attrs *attrs`` Attributes to modify the table index **Description** A table entry will return PT_ENTRY_TABLE from pt_load_entry(). The table_pa is the table at pts->level - 1. This is done by cmpxchg so pts must have the current entry loaded. The pts is updated with the installed entry. This must not be called if pt_can_have_table() == false. **Return** true if the table was installed successfully.h](h)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubjc)}(hhh](jh)}(h/``struct pt_state *pts`` Table index to change h](jn)}(h``struct pt_state *pts``h]j/)}(hj'h]hstruct pt_state *pts}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj'ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubj)}(hhh]h)}(hTable index to changeh]hTable index to change}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hKhj'ubah}(h]h ]h"]h$]h&]uh1j~hj'ubeh}(h]h ]h"]h$]h&]uh1jghj'hKhj'ubjh)}(hI``pt_oaddr_t table_pa`` CPU physical address of the lower table's memory h](jn)}(h``pt_oaddr_t table_pa``h]j/)}(hj'h]hpt_oaddr_t table_pa}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj'ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubj)}(hhh]h)}(h0CPU physical address of the lower table's memoryh]h2CPU physical address of the lower table’s memory}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKhj(ubah}(h]h ]h"]h$]h&]uh1j~hj'ubeh}(h]h ]h"]h$]h&]uh1jghj(hKhj'ubjh)}(hL``const struct pt_write_attrs *attrs`` Attributes to modify the table index h](jn)}(h&``const struct pt_write_attrs *attrs``h]j/)}(hj5(h]h"const struct pt_write_attrs *attrs}(hj7(hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj3(ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj/(ubj)}(hhh]h)}(h$Attributes to modify the table indexh]h$Attributes to modify the table index}(hjN(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ(hKhjK(ubah}(h]h ]h"]h$]h&]uh1j~hj/(ubeh}(h]h ]h"]h$]h&]uh1jghjJ(hKhj'ubeh}(h]h ]h"]h$]h&]uh1jbhj'ubh)}(h**Description**h]j)}(hjp(h]h Description}(hjr(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn(ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubh)}(hA table entry will return PT_ENTRY_TABLE from pt_load_entry(). The table_pa is the table at pts->level - 1. This is done by cmpxchg so pts must have the current entry loaded. The pts is updated with the installed entry.h]hA table entry will return PT_ENTRY_TABLE from pt_load_entry(). The table_pa is the table at pts->level - 1. This is done by cmpxchg so pts must have the current entry loaded. The pts is updated with the installed entry.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubh)}(h8This must not be called if pt_can_have_table() == false.h]h8This must not be called if pt_can_have_table() == false.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubh)}(h **Return**h]j)}(hj(h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubh)}(h-true if the table was installed successfully.h]h-true if the table was installed successfully.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_item_oa (C function) c.pt_item_oahNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h2pt_oaddr_t pt_item_oa (const struct pt_state *pts)h]jU)}(h1pt_oaddr_t pt_item_oa(const struct pt_state *pts)h](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj(modnameN classnameNjD jG )}jJ ]jM )}j@ pt_item_oasb c.pt_item_oaasbuh1hhj(hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hj)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj(hhhj)hKubj~)}(h pt_item_oah]j)}(hj )h]h pt_item_oa}(hj")hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj(hhhj)hKubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj=)hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj9)ubjm)}(h h]h }(hjJ)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj9)ubj[)}(hj^h]hstruct}(hjX)hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj9)ubjm)}(h h]h }(hje)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj9)ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjv)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjs)ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjx)modnameN classnameNjD jG )}jJ ]j ) c.pt_item_oaasbuh1hhj9)ubjm)}(h h]h }(hj)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj9)ubja )}(hjd h]h*}(hj)hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj9)ubj)}(hptsh]hpts}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9)ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj5)ubah}(h]h ]h"]h$]h&]hhuh1j hj(hhhj)hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj(hhhj)hKubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jNhj)hKhj(hhubj)}(hhh]h)}(h!Output Address for this leaf itemh]h!Output Address for this leaf item}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj)hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj)hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)jj)jjjuh1jIhhhj'hNhNubj)}(hX]**Parameters** ``const struct pt_state *pts`` Item to query **Description** Return the output address for this item. If the item is part of a contiguous entry it returns the value of the OA for this individual sub item. See pt_entry_oa(). The format should implement one of these two functions depending on how it stores the OA's in the table.h](h)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj)ubjc)}(hhh]jh)}(h-``const struct pt_state *pts`` Item to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hj*h]hconst struct pt_state *pts}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj*ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj*ubj)}(hhh]h)}(h Item to queryh]h Item to query}(hj3*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/*hKhj0*ubah}(h]h ]h"]h$]h&]uh1j~hj*ubeh}(h]h ]h"]h$]h&]uh1jghj/*hKhj*ubah}(h]h ]h"]h$]h&]uh1jbhj)ubh)}(h**Description**h]j)}(hjU*h]h Description}(hjW*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS*ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj)ubh)}(hReturn the output address for this item. If the item is part of a contiguous entry it returns the value of the OA for this individual sub item.h]hReturn the output address for this item. If the item is part of a contiguous entry it returns the value of the OA for this individual sub item.}(hjk*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj)ubh)}(h{See pt_entry_oa(). The format should implement one of these two functions depending on how it stores the OA's in the table.h]h}See pt_entry_oa(). The format should implement one of these two functions depending on how it stores the OA’s in the table.}(hjz*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_load_entry_raw (C function)c.pt_load_entry_rawhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h;enum pt_entry_type pt_load_entry_raw (struct pt_state *pts)h]jU)}(h:enum pt_entry_type pt_load_entry_raw(struct pt_state *pts)h](j[)}(hjHh]henum}(hj*hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj*hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hj*hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj*hhhj*hKubh)}(hhh]j)}(h pt_entry_typeh]h pt_entry_type}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj*modnameN classnameNjD jG )}jJ ]jM )}j@ pt_load_entry_rawsbc.pt_load_entry_rawasbuh1hhj*hhhj*hKubjm)}(h h]h }(hj*hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj*hhhj*hKubj~)}(hpt_load_entry_rawh]j)}(hj*h]hpt_load_entry_raw}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj*hhhj*hKubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj+hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj+ubjm)}(h h]h }(hj#+hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj+ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj4+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1+ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj6+modnameN classnameNjD jG )}jJ ]j*c.pt_load_entry_rawasbuh1hhj+ubjm)}(h h]h }(hjR+hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj+ubja )}(hjd h]h*}(hj`+hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj+ubj)}(hptsh]hpts}(hjm+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubah}(h]h ]h"]h$]h&]hhuh1j hj*hhhj*hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj*hhhj*hKubah}(h]j*ah ](jjeh"]h$]h&]jj)jhuh1jNhj*hKhj*hhubj)}(hhh]h)}(h1Read from the location pts points at into the ptsh]h1Read from the location pts points at into the pts}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj+hhubah}(h]h ]h"]h$]h&]uh1jhj*hhhj*hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``struct pt_state *pts`` Table index to load **Description** Return the type of entry that was loaded. pts->entry will be filled in with the entry's content. See pt_load_entry()h](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj+ubjc)}(hhh]jh)}(h-``struct pt_state *pts`` Table index to load h](jn)}(h``struct pt_state *pts``h]j/)}(hj+h]hstruct pt_state *pts}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj+ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj+ubj)}(hhh]h)}(hTable index to loadh]hTable index to load}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKhj+ubah}(h]h ]h"]h$]h&]uh1j~hj+ubeh}(h]h ]h"]h$]h&]uh1jghj+hKhj+ubah}(h]h ]h"]h$]h&]uh1jbhj+ubh)}(h**Description**h]j)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj+ubh)}(htReturn the type of entry that was loaded. pts->entry will be filled in with the entry's content. See pt_load_entry()h]hvReturn the type of entry that was loaded. pts->entry will be filled in with the entry’s content. See pt_load_entry()}(hj),hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_max_oa_lg2 (C function)c.pt_max_oa_lg2hNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h;unsigned int pt_max_oa_lg2 (const struct pt_common *common)h]jU)}(h:unsigned int pt_max_oa_lg2(const struct pt_common *common)h](j )}(hunsignedh]hunsigned}(hjX,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjT,hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hjg,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjT,hhhjf,hKubj )}(hinth]hint}(hju,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjT,hhhjf,hKubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjT,hhhjf,hKubj~)}(h pt_max_oa_lg2h]j)}(h pt_max_oa_lg2h]h pt_max_oa_lg2}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjT,hhhjf,hKubj )}(h (const struct pt_common *common)h]j )}(hconst struct pt_common *commonh](j[)}(hj h]hconst}(hj,hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,ubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,ubj[)}(hj^h]hstruct}(hj,hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,ubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj,modnameN classnameNjD jG )}jJ ]jM )}j@ j,sbc.pt_max_oa_lg2asbuh1hhj,ubjm)}(h h]h }(hj -hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,ubja )}(hjd h]h*}(hj-hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj,ubj)}(hcommonh]hcommon}(hj%-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj,ubah}(h]h ]h"]h$]h&]hhuh1j hjT,hhhjf,hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjP,hhhjf,hKubah}(h]jK,ah ](jjeh"]h$]h&]jj)jhuh1jNhjf,hKhjM,hhubj)}(hhh]h)}(h/Return the maximum OA the table format can holdh]h/Return the maximum OA the table format can hold}(hjO-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjL-hhubah}(h]h ]h"]h$]h&]uh1jhjM,hhhjf,hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjg-jjg-jjjuh1jIhhhj'hNhNubj)}(hX***Parameters** ``const struct pt_common *common`` Page table to query **Description** The value oalog2_to_max_int(pt_max_oa_lg2()) is the MAX for the OA. This is the absolute maximum address the table can hold. struct pt_common max_oasz_lg2 sets a lower dynamic maximum based on HW capability.h](h)}(h**Parameters**h]j)}(hjq-h]h Parameters}(hjs-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo-ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjk-ubjc)}(hhh]jh)}(h7``const struct pt_common *common`` Page table to query h](jn)}(h"``const struct pt_common *common``h]j/)}(hj-h]hconst struct pt_common *common}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj-ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj-ubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hKhj-ubah}(h]h ]h"]h$]h&]uh1j~hj-ubeh}(h]h ]h"]h$]h&]uh1jghj-hKhj-ubah}(h]h ]h"]h$]h&]uh1jbhjk-ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjk-ubh)}(hThe value oalog2_to_max_int(pt_max_oa_lg2()) is the MAX for the OA. This is the absolute maximum address the table can hold. struct pt_common max_oasz_lg2 sets a lower dynamic maximum based on HW capability.h]hThe value oalog2_to_max_int(pt_max_oa_lg2()) is the MAX for the OA. This is the absolute maximum address the table can hold. struct pt_common max_oasz_lg2 sets a lower dynamic maximum based on HW capability.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjk-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_num_items_lg2 (C function)c.pt_num_items_lg2hNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h:unsigned int pt_num_items_lg2 (const struct pt_state *pts)h]jU)}(h9unsigned int pt_num_items_lg2(const struct pt_state *pts)h](j )}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj .hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMubjm)}(h h]h }(hj.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj .hhhj.hMubj )}(hinth]hint}(hj-.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj .hhhj.hMubjm)}(h h]h }(hj;.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj .hhhj.hMubj~)}(hpt_num_items_lg2h]j)}(hpt_num_items_lg2h]hpt_num_items_lg2}(hjM.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI.ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj .hhhj.hMubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hji.hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhje.ubjm)}(h h]h }(hjv.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhje.ubj[)}(hj^h]hstruct}(hj.hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhje.ubjm)}(h h]h }(hj.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhje.ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj.modnameN classnameNjD jG )}jJ ]jM )}j@ jO.sbc.pt_num_items_lg2asbuh1hhje.ubjm)}(h h]h }(hj.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhje.ubja )}(hjd h]h*}(hj.hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hje.ubj)}(hptsh]hpts}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hja.ubah}(h]h ]h"]h$]h&]hhuh1j hj .hhhj.hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj.hhhj.hMubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jNhj.hMhj.hhubj)}(hhh]h)}(h.Return the number of items in this table levelh]h.Return the number of items in this table level}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj/hhubah}(h]h ]h"]h$]h&]uh1jhj.hhhj.hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``const struct pt_state *pts`` The current level **Description** The number of items in a table level defines the number of bits this level decodes from the VA. This function is not called for the top level, so it does not need to compute a special value for the top case. The result for the top is based on pt_common max_vasz_lg2. The value is used as part of determining the table indexes via the equation:: log2_mod(log2_div(VA, pt_table_item_lg2sz()), pt_num_items_lg2())h](h)}(h**Parameters**h]j)}(hj)/h]h Parameters}(hj+/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'/ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj#/ubjc)}(hhh]jh)}(h1``const struct pt_state *pts`` The current level h](jn)}(h``const struct pt_state *pts``h]j/)}(hjH/h]hconst struct pt_state *pts}(hjJ/hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjF/ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhjB/ubj)}(hhh]h)}(hThe current levelh]hThe current level}(hja/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]/hMhj^/ubah}(h]h ]h"]h$]h&]uh1j~hjB/ubeh}(h]h ]h"]h$]h&]uh1jghj]/hMhj?/ubah}(h]h ]h"]h$]h&]uh1jbhj#/ubh)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj#/ubh)}(hX The number of items in a table level defines the number of bits this level decodes from the VA. This function is not called for the top level, so it does not need to compute a special value for the top case. The result for the top is based on pt_common max_vasz_lg2.h]hX The number of items in a table level defines the number of bits this level decodes from the VA. This function is not called for the top level, so it does not need to compute a special value for the top case. The result for the top is based on pt_common max_vasz_lg2.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj#/ubh)}(hMThe value is used as part of determining the table indexes via the equation::h]hLThe value is used as part of determining the table indexes via the equation:}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj#/ubj)}(hAlog2_mod(log2_div(VA, pt_table_item_lg2sz()), pt_num_items_lg2())h]hAlog2_mod(log2_div(VA, pt_table_item_lg2sz()), pt_num_items_lg2())}hj/sbah}(h]h ]h"]h$]h&]hhuh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM hj#/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE!pt_pgsz_lg2_to_level (C function)c.pt_pgsz_lg2_to_levelhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hUunsigned int pt_pgsz_lg2_to_level (struct pt_common *common, unsigned int pgsize_lg2)h]jU)}(hTunsigned int pt_pgsz_lg2_to_level(struct pt_common *common, unsigned int pgsize_lg2)h](j )}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMubjm)}(h h]h }(hj/hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj/hhhj/hMubj )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/hhhj/hMubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj/hhhj/hMubj~)}(hpt_pgsz_lg2_to_levelh]j)}(hpt_pgsz_lg2_to_levelh]hpt_pgsz_lg2_to_level}(hj#0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj/hhhj/hMubj )}(h3(struct pt_common *common, unsigned int pgsize_lg2)h](j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hj?0hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj;0ubjm)}(h h]h }(hjL0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj;0ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hj]0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ0ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj_0modnameN classnameNjD jG )}jJ ]jM )}j@ j%0sbc.pt_pgsz_lg2_to_levelasbuh1hhj;0ubjm)}(h h]h }(hj}0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj;0ubja )}(hjd h]h*}(hj0hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj;0ubj)}(hcommonh]hcommon}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj70ubj )}(hunsigned int pgsize_lg2h](j )}(hunsignedh]hunsigned}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj0ubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj0ubj )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj0ubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj0ubj)}(h pgsize_lg2h]h pgsize_lg2}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj70ubeh}(h]h ]h"]h$]h&]hhuh1j hj/hhhj/hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj/hhhj/hMubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jNhj/hMhj/hhubj)}(hhh]h)}(h(Return the level that maps the page sizeh]h(Return the level that maps the page size}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj1hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+1jj+1jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``struct pt_common *common`` Page table to query ``unsigned int pgsize_lg2`` Log2 page size **Description** Returns the table level that will map the given page size. The page size must be part of the pt_possible_sizes() for some level.h](h)}(h**Parameters**h]j)}(hj51h]h Parameters}(hj71hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj31ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj/1ubjc)}(hhh](jh)}(h1``struct pt_common *common`` Page table to query h](jn)}(h``struct pt_common *common``h]j/)}(hjT1h]hstruct pt_common *common}(hjV1hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjR1ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhjN1ubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hjm1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji1hMhjj1ubah}(h]h ]h"]h$]h&]uh1j~hjN1ubeh}(h]h ]h"]h$]h&]uh1jghji1hMhjK1ubjh)}(h+``unsigned int pgsize_lg2`` Log2 page size h](jn)}(h``unsigned int pgsize_lg2``h]j/)}(hj1h]hunsigned int pgsize_lg2}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj1ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj1ubj)}(hhh]h)}(hLog2 page sizeh]hLog2 page size}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j~hj1ubeh}(h]h ]h"]h$]h&]uh1jghj1hMhjK1ubeh}(h]h ]h"]h$]h&]uh1jbhj/1ubh)}(h**Description**h]j)}(hj1h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj/1ubh)}(hReturns the table level that will map the given page size. The page size must be part of the pt_possible_sizes() for some level.h]hReturns the table level that will map the given page size. The page size must be part of the pt_possible_sizes() for some level.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj/1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_possible_sizes (C function)c.pt_possible_sizeshNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h9pt_vaddr_t pt_possible_sizes (const struct pt_state *pts)h]jU)}(h8pt_vaddr_t pt_possible_sizes(const struct pt_state *pts)h](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj2modnameN classnameNjD jG )}jJ ]jM )}j@ pt_possible_sizessbc.pt_possible_sizesasbuh1hhj 2hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMubjm)}(h h]h }(hj22hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj 2hhhj12hMubj~)}(hpt_possible_sizesh]j)}(hj.2h]hpt_possible_sizes}(hjD2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@2ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj 2hhhj12hMubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj_2hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj[2ubjm)}(h h]h }(hjl2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[2ubj[)}(hj^h]hstruct}(hjz2hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj[2ubjm)}(h h]h }(hj2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[2ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj2modnameN classnameNjD jG )}jJ ]j,2c.pt_possible_sizesasbuh1hhj[2ubjm)}(h h]h }(hj2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[2ubja )}(hjd h]h*}(hj2hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj[2ubj)}(hptsh]hpts}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[2ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjW2ubah}(h]h ]h"]h$]h&]hhuh1j hj 2hhhj12hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj2hhhj12hMubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jNhj12hMhj2hhubj)}(hhh]h)}(h6Return a bitmap of possible output sizes at this levelh]h6Return a bitmap of possible output sizes at this level}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj2hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj12hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3jj3jjjuh1jIhhhj'hNhNubj)}(hX**Parameters** ``const struct pt_state *pts`` The current level **Description** Each level has a list of possible output sizes that can be installed as leaf entries. If pt_can_have_leaf() is false returns zero. Otherwise the bit in position pt_table_item_lg2sz() should be set indicating that a non-contiguous single item leaf entry is supported. The following pt_num_items_lg2() number of bits can be set indicating contiguous entries are supported. Bit pt_table_item_lg2sz() + pt_num_items_lg2() must not be set, contiguous entries cannot span the entire table. The OR of pt_possible_sizes() of all levels is the typical bitmask of all supported sizes in the entire table.h](h)}(h**Parameters**h]j)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj3ubjc)}(hhh]jh)}(h1``const struct pt_state *pts`` The current level h](jn)}(h``const struct pt_state *pts``h]j/)}(hj<3h]hconst struct pt_state *pts}(hj>3hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj:3ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj63ubj)}(hhh]h)}(hThe current levelh]hThe current level}(hjU3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ3hMhjR3ubah}(h]h ]h"]h$]h&]uh1j~hj63ubeh}(h]h ]h"]h$]h&]uh1jghjQ3hMhj33ubah}(h]h ]h"]h$]h&]uh1jbhj3ubh)}(h**Description**h]j)}(hjw3h]h Description}(hjy3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju3ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj3ubh)}(hEach level has a list of possible output sizes that can be installed as leaf entries. If pt_can_have_leaf() is false returns zero.h]hEach level has a list of possible output sizes that can be installed as leaf entries. If pt_can_have_leaf() is false returns zero.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj3ubh)}(hX`Otherwise the bit in position pt_table_item_lg2sz() should be set indicating that a non-contiguous single item leaf entry is supported. The following pt_num_items_lg2() number of bits can be set indicating contiguous entries are supported. Bit pt_table_item_lg2sz() + pt_num_items_lg2() must not be set, contiguous entries cannot span the entire table.h]hX`Otherwise the bit in position pt_table_item_lg2sz() should be set indicating that a non-contiguous single item leaf entry is supported. The following pt_num_items_lg2() number of bits can be set indicating contiguous entries are supported. Bit pt_table_item_lg2sz() + pt_num_items_lg2() must not be set, contiguous entries cannot span the entire table.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM hj3ubh)}(hnThe OR of pt_possible_sizes() of all levels is the typical bitmask of all supported sizes in the entire table.h]hnThe OR of pt_possible_sizes() of all levels is the typical bitmask of all supported sizes in the entire table.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM&hj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE pt_table_item_lg2sz (C function)c.pt_table_item_lg2szhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h=unsigned int pt_table_item_lg2sz (const struct pt_state *pts)h]jU)}(h:ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMShj::ubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hj_:h]hconst struct pt_state *pts}(hja:hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj]:ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMPhjY:ubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjx:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt:hMPhju:ubah}(h]h ]h"]h$]h&]uh1j~hjY:ubeh}(h]h ]h"]h$]h&]uh1jghjt:hMPhjV:ubah}(h]h ]h"]h$]h&]uh1jbhj::ubh)}(h**Description**h]j)}(hj:h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMRhj::ubh)}(h0Same as pt_table_pa() but returns a CPU pointer.h]h0Same as pt_table_pa() but returns a CPU pointer.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMQhj::ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_max_sw_bit (C function)c.pt_max_sw_bithNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h5unsigned int pt_max_sw_bit (struct pt_common *common)h]jU)}(h4unsigned int pt_max_sw_bit(struct pt_common *common)h](j )}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMZubjm)}(h h]h }(hj:hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:hhhj:hMZubj )}(hinth]hint}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:hhhj:hMZubjm)}(h h]h }(hj ;hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:hhhj:hMZubj~)}(h pt_max_sw_bith]j)}(h pt_max_sw_bith]h pt_max_sw_bit}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj:hhhj:hMZubj )}(h(struct pt_common *common)h]j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hj8;hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj4;ubjm)}(h h]h }(hjE;hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj4;ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjV;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS;ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjX;modnameN classnameNjD jG )}jJ ]jM )}j@ j;sbc.pt_max_sw_bitasbuh1hhj4;ubjm)}(h h]h }(hjv;hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj4;ubja )}(hjd h]h*}(hj;hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj4;ubj)}(hcommonh]hcommon}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4;ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj0;ubah}(h]h ]h"]h$]h&]hhuh1j hj:hhhj:hMZubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj:hhhj:hMZubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1jNhj:hMZhj:hhubj)}(hhh]h)}(h>Return the maximum software bit usable for any level and entryh]h>Return the maximum software bit usable for any level and entry}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMZhj;hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;jj;jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``struct pt_common *common`` Page table **Description** The swbit can be passed as bitnr to the other sw_bit functions.h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM^hj;ubjc)}(hhh]jh)}(h(``struct pt_common *common`` Page table h](jn)}(h``struct pt_common *common``h]j/)}(hj;h]hstruct pt_common *common}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj;ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM\hj;ubj)}(hhh]h)}(h Page tableh]h Page table}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hM\hj<ubah}(h]h ]h"]h$]h&]uh1j~hj;ubeh}(h]h ]h"]h$]h&]uh1jghj<hM\hj;ubah}(h]h ]h"]h$]h&]uh1jbhj;ubh)}(h**Description**h]j)}(hj7<h]h Description}(hj9<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5<ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM^hj;ubh)}(h?The swbit can be passed as bitnr to the other sw_bit functions.h]h?The swbit can be passed as bitnr to the other sw_bit functions.}(hjM<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM]hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE#pt_test_sw_bit_acquire (C function)c.pt_test_sw_bit_acquirehNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hFbool pt_test_sw_bit_acquire (struct pt_state *pts, unsigned int bitnr)h]jU)}(hEbool pt_test_sw_bit_acquire(struct pt_state *pts, unsigned int bitnr)h](j )}(hj h]hbool}(hj|<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjx<hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMcubjm)}(h h]h }(hj<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjx<hhhj<hMcubj~)}(hpt_test_sw_bit_acquireh]j)}(hpt_test_sw_bit_acquireh]hpt_test_sw_bit_acquire}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjx<hhhj<hMcubj )}(h*(struct pt_state *pts, unsigned int bitnr)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj<hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj<ubjm)}(h h]h }(hj<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj<ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj<modnameN classnameNjD jG )}jJ ]jM )}j@ j<sbc.pt_test_sw_bit_acquireasbuh1hhj<ubjm)}(h h]h }(hj<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj<ubja )}(hjd h]h*}(hj=hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj<ubj)}(hptsh]hpts}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj<ubj )}(hunsigned int bitnrh](j )}(hunsignedh]hunsigned}(hj*=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj&=ubjm)}(h h]h }(hj8=hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&=ubj )}(hinth]hint}(hjF=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj&=ubjm)}(h h]h }(hjT=hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&=ubj)}(hbitnrh]hbitnr}(hjb=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj<ubeh}(h]h ]h"]h$]h&]hhuh1j hjx<hhhj<hMcubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjt<hhhj<hMcubah}(h]jo<ah ](jjeh"]h$]h&]jj)jhuh1jNhj<hMchjq<hhubj)}(hhh]h)}(hRead a software bit in an itemh]hRead a software bit in an item}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMchj=hhubah}(h]h ]h"]h$]h&]uh1jhjq<hhhj<hMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``struct pt_state *pts`` Entry to read ``unsigned int bitnr`` Bit to read **Description** Software bits are ignored by HW and can be used for any purpose by the software. This does a test bit and acquire operation.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMghj=ubjc)}(hhh](jh)}(h'``struct pt_state *pts`` Entry to read h](jn)}(h``struct pt_state *pts``h]j/)}(hj=h]hstruct pt_state *pts}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj=ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMdhj=ubj)}(hhh]h)}(h Entry to readh]h Entry to read}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMdhj=ubah}(h]h ]h"]h$]h&]uh1j~hj=ubeh}(h]h ]h"]h$]h&]uh1jghj=hMdhj=ubjh)}(h#``unsigned int bitnr`` Bit to read h](jn)}(h``unsigned int bitnr``h]j/)}(hj>h]hunsigned int bitnr}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj>ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMehj>ubj)}(hhh]h)}(h Bit to readh]h Bit to read}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMehj>ubah}(h]h ]h"]h$]h&]uh1j~hj>ubeh}(h]h ]h"]h$]h&]uh1jghj>hMehj=ubeh}(h]h ]h"]h$]h&]uh1jbhj=ubh)}(h**Description**h]j)}(hjA>h]h Description}(hjC>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?>ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMghj=ubh)}(h|Software bits are ignored by HW and can be used for any purpose by the software. This does a test bit and acquire operation.h]h|Software bits are ignored by HW and can be used for any purpose by the software. This does a test bit and acquire operation.}(hjW>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMfhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE"pt_set_sw_bit_release (C function)c.pt_set_sw_bit_releasehNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(hEvoid pt_set_sw_bit_release (struct pt_state *pts, unsigned int bitnr)h]jU)}(hDvoid pt_set_sw_bit_release(struct pt_state *pts, unsigned int bitnr)h](j )}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj>hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMnubjm)}(h h]h }(hj>hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>hhhj>hMnubj~)}(hpt_set_sw_bit_releaseh]j)}(hpt_set_sw_bit_releaseh]hpt_set_sw_bit_release}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj>hhhj>hMnubj )}(h*(struct pt_state *pts, unsigned int bitnr)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj>hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj>ubjm)}(h h]h }(hj>hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj>modnameN classnameNjD jG )}jJ ]jM )}j@ j>sbc.pt_set_sw_bit_releaseasbuh1hhj>ubjm)}(h h]h }(hj?hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>ubja )}(hjd h]h*}(hj?hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj>ubj)}(hptsh]hpts}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj>ubj )}(hunsigned int bitnrh](j )}(hunsignedh]hunsigned}(hj5?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj1?ubjm)}(h h]h }(hjC?hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj1?ubj )}(hinth]hint}(hjQ?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj1?ubjm)}(h h]h }(hj_?hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj1?ubj)}(hbitnrh]hbitnr}(hjm?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1?ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj>ubeh}(h]h ]h"]h$]h&]hhuh1j hj>hhhj>hMnubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj~>hhhj>hMnubah}(h]jy>ah ](jjeh"]h$]h&]jj)jhuh1jNhj>hMnhj{>hhubj)}(hhh]h)}(hSet a software bit in an itemh]hSet a software bit in an item}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMnhj?hhubah}(h]h ]h"]h$]h&]uh1jhj{>hhhj>hMnubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``struct pt_state *pts`` Entry to set ``unsigned int bitnr`` Bit to set **Description** Software bits are ignored by HW and can be used for any purpose by the software. This does a set bit and release operation.h](h)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMrhj?ubjc)}(hhh](jh)}(h&``struct pt_state *pts`` Entry to set h](jn)}(h``struct pt_state *pts``h]j/)}(hj?h]hstruct pt_state *pts}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj?ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMohj?ubj)}(hhh]h)}(h Entry to seth]h Entry to set}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMohj?ubah}(h]h ]h"]h$]h&]uh1j~hj?ubeh}(h]h ]h"]h$]h&]uh1jghj?hMohj?ubjh)}(h"``unsigned int bitnr`` Bit to set h](jn)}(h``unsigned int bitnr``h]j/)}(hj@h]hunsigned int bitnr}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj@ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMphj @ubj)}(hhh]h)}(h Bit to seth]h Bit to set}(hj*@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&@hMphj'@ubah}(h]h ]h"]h$]h&]uh1j~hj @ubeh}(h]h ]h"]h$]h&]uh1jghj&@hMphj?ubeh}(h]h ]h"]h$]h&]uh1jbhj?ubh)}(h**Description**h]j)}(hjL@h]h Description}(hjN@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ@ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMrhj?ubh)}(h{Software bits are ignored by HW and can be used for any purpose by the software. This does a set bit and release operation.h]h{Software bits are ignored by HW and can be used for any purpose by the software. This does a set bit and release operation.}(hjb@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMqhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_load_entry (C function)c.pt_load_entryhNtauh1j8hj'hhhNhNubjJ)}(hhh](jO)}(h)void pt_load_entry (struct pt_state *pts)h]jU)}(h(void pt_load_entry(struct pt_state *pts)h](j )}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMyubjm)}(h h]h }(hj@hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@hhhj@hMyubj~)}(h pt_load_entryh]j)}(h pt_load_entryh]h pt_load_entry}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj@hhhj@hMyubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj@hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj@ubjm)}(h h]h }(hj@hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj@modnameN classnameNjD jG )}jJ ]jM )}j@ j@sbc.pt_load_entryasbuh1hhj@ubjm)}(h h]h }(hj AhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@ubja )}(hjd h]h*}(hjAhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj@ubj)}(hptsh]hpts}(hj'AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj@ubah}(h]h ]h"]h$]h&]hhuh1j hj@hhhj@hMyubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj@hhhj@hMyubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1jNhj@hMyhj@hhubj)}(hhh]h)}(h1Read from the location pts points at into the ptsh]h1Read from the location pts points at into the pts}(hjQAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMyhjNAhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj@hMyubeh}(h]h ](jfunctioneh"]h$]h&]jjjjiAjjiAjjjuh1jIhhhj'hNhNubj)}(h**Parameters** ``struct pt_state *pts`` Table index to load **Description** Set the type of entry that was loaded. pts->entry and pts->table_lower will be filled in with the entry's content.h](h)}(h**Parameters**h]j)}(hjsAh]h Parameters}(hjuAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqAubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM}hjmAubjc)}(hhh]jh)}(h-``struct pt_state *pts`` Table index to load h](jn)}(h``struct pt_state *pts``h]j/)}(hjAh]hstruct pt_state *pts}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjAubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMzhjAubj)}(hhh]h)}(hTable index to loadh]hTable index to load}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMzhjAubah}(h]h ]h"]h$]h&]uh1j~hjAubeh}(h]h ]h"]h$]h&]uh1jghjAhMzhjAubah}(h]h ]h"]h$]h&]uh1jbhjmAubh)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM|hjmAubh)}(hrSet the type of entry that was loaded. pts->entry and pts->table_lower will be filled in with the entry's content.h]htSet the type of entry that was loaded. pts->entry and pts->table_lower will be filled in with the entry’s content.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM{hjmAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubeh}(h].format-functions-at-the-struct-pt-common-levelah ]h"].format functions at the struct pt_common levelah$]h&]uh1hhjzhhhhhK@ubh)}(hhh](h)}(hIteration Helpersh]hIteration Helpers}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhhhhhKGubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_check_range (C function)c.pt_check_rangehNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h+int pt_check_range (struct pt_range *range)h]jU)}(h*int pt_check_range(struct pt_range *range)h](j )}(hinth]hint}(hj+BhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj'Bhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubjm)}(h h]h }(hj:BhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj'Bhhhj9BhKubj~)}(hpt_check_rangeh]j)}(hpt_check_rangeh]hpt_check_range}(hjLBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHBubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj'Bhhhj9BhKubj )}(h(struct pt_range *range)h]j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hjhBhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjdBubjm)}(h h]h }(hjuBhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjdBubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjBmodnameN classnameNjD jG )}jJ ]jM )}j@ jNBsbc.pt_check_rangeasbuh1hhjdBubjm)}(h h]h }(hjBhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjdBubja )}(hjd h]h*}(hjBhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjdBubj)}(hrangeh]hrange}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdBubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj`Bubah}(h]h ]h"]h$]h&]hhuh1j hj'Bhhhj9BhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj#Bhhhj9BhKubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jNhj9BhKhj Bhhubj)}(hhh]h)}(h"Validate the range can be iteratedh]h"Validate the range can be iterated}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjBhhubah}(h]h ]h"]h$]h&]uh1jhj Bhhhj9BhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_range *range`` Range to validate **Description** Check that VA and last_va fall within the permitted range of VAs. If the format is using PT_FEAT_SIGN_EXTEND then this also checks the sign extension is correct.h](h)}(h**Parameters**h]j)}(hj Ch]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Cubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjCubjc)}(hhh]jh)}(h-``struct pt_range *range`` Range to validate h](jn)}(h``struct pt_range *range``h]j/)}(hj,Ch]hstruct pt_range *range}(hj.ChhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj*Cubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhj&Cubj)}(hhh]h)}(hRange to validateh]hRange to validate}(hjEChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAChKhjBCubah}(h]h ]h"]h$]h&]uh1j~hj&Cubeh}(h]h ]h"]h$]h&]uh1jghjAChKhj#Cubah}(h]h ]h"]h$]h&]uh1jbhjCubh)}(h**Description**h]j)}(hjgCh]h Description}(hjiChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeCubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjCubh)}(hCheck that VA and last_va fall within the permitted range of VAs. If the format is using PT_FEAT_SIGN_EXTEND then this also checks the sign extension is correct.h]hCheck that VA and last_va fall within the permitted range of VAs. If the format is using PT_FEAT_SIGN_EXTEND then this also checks the sign extension is correct.}(hj}ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_index_to_va (C function)c.pt_index_to_vahNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h*void pt_index_to_va (struct pt_state *pts)h]jU)}(h)void pt_index_to_va(struct pt_state *pts)h](j )}(hvoidh]hvoid}(hjChhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjChhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK2ubjm)}(h h]h }(hjChhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjChhhjChK2ubj~)}(hpt_index_to_vah]j)}(hpt_index_to_vah]hpt_index_to_va}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjChhhjChK2ubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjChhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjCubjm)}(h h]h }(hjChhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjCubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj DmodnameN classnameNjD jG )}jJ ]jM )}j@ jCsbc.pt_index_to_vaasbuh1hhjCubjm)}(h h]h }(hj'DhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjCubja )}(hjd h]h*}(hj5DhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjCubj)}(hptsh]hpts}(hjBDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjCubah}(h]h ]h"]h$]h&]hhuh1j hjChhhjChK2ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjChhhjChK2ubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jNhjChK2hjChhubj)}(hhh]h)}(h*Update range->va to the current pts->indexh]h*Update range->va to the current pts->index}(hjlDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK2hjiDhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChK2ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDjjDjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_state *pts`` Iteration State **Description** Adjust range->va to match the current index. This is done in a lazy manner since computing the VA takes several instructions and is rarely required.h](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK6hjDubjc)}(hhh]jh)}(h)``struct pt_state *pts`` Iteration State h](jn)}(h``struct pt_state *pts``h]j/)}(hjDh]hstruct pt_state *pts}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjDubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK3hjDubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhK3hjDubah}(h]h ]h"]h$]h&]uh1j~hjDubeh}(h]h ]h"]h$]h&]uh1jghjDhK3hjDubah}(h]h ]h"]h$]h&]uh1jbhjDubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK5hjDubh)}(hAdjust range->va to match the current index. This is done in a lazy manner since computing the VA takes several instructions and is rarely required.h]hAdjust range->va to match the current index. This is done in a lazy manner since computing the VA takes several instructions and is rarely required.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK4hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE#pt_entry_fully_covered (C function)c.pt_entry_fully_coveredhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hObool pt_entry_fully_covered (const struct pt_state *pts, unsigned int oasz_lg2)h]jU)}(hNbool pt_entry_fully_covered(const struct pt_state *pts, unsigned int oasz_lg2)h](j )}(hj h]hbool}(hj-EhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj)Ehhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKMubjm)}(h h]h }(hj;EhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj)Ehhhj:EhKMubj~)}(hpt_entry_fully_coveredh]j)}(hpt_entry_fully_coveredh]hpt_entry_fully_covered}(hjMEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIEubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj)Ehhhj:EhKMubj )}(h3(const struct pt_state *pts, unsigned int oasz_lg2)h](j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjiEhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjeEubjm)}(h h]h }(hjvEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjeEubj[)}(hj^h]hstruct}(hjEhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjeEubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjeEubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjEmodnameN classnameNjD jG )}jJ ]jM )}j@ jOEsbc.pt_entry_fully_coveredasbuh1hhjeEubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjeEubja )}(hjd h]h*}(hjEhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjeEubj)}(hptsh]hpts}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeEubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjaEubj )}(hunsigned int oasz_lg2h](j )}(hunsignedh]hunsigned}(hjEhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjEubjm)}(h h]h }(hjFhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjEubj )}(hinth]hint}(hjFhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjEubjm)}(h h]h }(hj FhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjEubj)}(hoasz_lg2h]hoasz_lg2}(hj.FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjaEubeh}(h]h ]h"]h$]h&]hhuh1j hj)Ehhhj:EhKMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj%Ehhhj:EhKMubah}(h]j Eah ](jjeh"]h$]h&]jj)jhuh1jNhj:EhKMhj"Ehhubj)}(hhh]h)}(hBCheck if the item or entry is entirely contained within pts->rangeh]hBCheck if the item or entry is entirely contained within pts->range}(hjXFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKMhjUFhhubah}(h]h ]h"]h$]h&]uh1jhj"Ehhhj:EhKMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjpFjjpFjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``const struct pt_state *pts`` Iteration State ``unsigned int oasz_lg2`` The size of the item to check, pt_table_item_lg2sz() or pt_entry_oa_lg2sz() **Return** true if the item is fully enclosed by the pts->range.h](h)}(h**Parameters**h]j)}(hjzFh]h Parameters}(hj|FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxFubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKQhjtFubjc)}(hhh](jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hjFh]hconst struct pt_state *pts}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjFubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKOhjFubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhKOhjFubah}(h]h ]h"]h$]h&]uh1j~hjFubeh}(h]h ]h"]h$]h&]uh1jghjFhKOhjFubjh)}(hf``unsigned int oasz_lg2`` The size of the item to check, pt_table_item_lg2sz() or pt_entry_oa_lg2sz() h](jn)}(h``unsigned int oasz_lg2``h]j/)}(hjFh]hunsigned int oasz_lg2}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjFubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKQhjFubj)}(hhh]h)}(hKThe size of the item to check, pt_table_item_lg2sz() or pt_entry_oa_lg2sz()h]hKThe size of the item to check, pt_table_item_lg2sz() or pt_entry_oa_lg2sz()}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKPhjFubah}(h]h ]h"]h$]h&]uh1j~hjFubeh}(h]h ]h"]h$]h&]uh1jghjFhKQhjFubeh}(h]h ]h"]h$]h&]uh1jbhjtFubh)}(h **Return**h]j)}(hjGh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Gubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKShjtFubh)}(h5true if the item is fully enclosed by the pts->range.h]h5true if the item is fully enclosed by the pts->range.}(hj$GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKShjtFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_range_to_index (C function)c.pt_range_to_indexhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h;unsigned int pt_range_to_index (const struct pt_state *pts)h]jU)}(h:unsigned int pt_range_to_index(const struct pt_state *pts)h](j )}(hunsignedh]hunsigned}(hjSGhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOGhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKgubjm)}(h h]h }(hjbGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjOGhhhjaGhKgubj )}(hinth]hint}(hjpGhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOGhhhjaGhKgubjm)}(h h]h }(hj~GhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjOGhhhjaGhKgubj~)}(hpt_range_to_indexh]j)}(hpt_range_to_indexh]hpt_range_to_index}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjOGhhhjaGhKgubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjGhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjGubjm)}(h h]h }(hjGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjGubj[)}(hj^h]hstruct}(hjGhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjGubjm)}(h h]h }(hjGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjGubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjGmodnameN classnameNjD jG )}jJ ]jM )}j@ jGsbc.pt_range_to_indexasbuh1hhjGubjm)}(h h]h }(hjHhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjGubja )}(hjd h]h*}(hjHhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjGubj)}(hptsh]hpts}(hj HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjGubah}(h]h ]h"]h$]h&]hhuh1j hjOGhhhjaGhKgubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjKGhhhjaGhKgubah}(h]jFGah ](jjeh"]h$]h&]jj)jhuh1jNhjaGhKghjHGhhubj)}(hhh]h)}(hStarting index for an iterationh]hStarting index for an iteration}(hjJHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKghjGHhhubah}(h]h ]h"]h$]h&]uh1jhjHGhhhjaGhKgubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbHjjbHjjjuh1jIhhhjBhNhNubj)}(hz**Parameters** ``const struct pt_state *pts`` Iteration State **Return** the starting index for the iteration in pts.h](h)}(h**Parameters**h]j)}(hjlHh]h Parameters}(hjnHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjHubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKkhjfHubjc)}(hhh]jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hjHh]hconst struct pt_state *pts}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjHubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhhjHubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhKhhjHubah}(h]h ]h"]h$]h&]uh1j~hjHubeh}(h]h ]h"]h$]h&]uh1jghjHhKhhjHubah}(h]h ]h"]h$]h&]uh1jbhjfHubh)}(h **Return**h]j)}(hjHh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKjhjfHubh)}(h,the starting index for the iteration in pts.h]h,the starting index for the iteration in pts.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKjhjfHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE"pt_range_to_end_index (C function)c.pt_range_to_end_indexhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h?unsigned int pt_range_to_end_index (const struct pt_state *pts)h]jU)}(h>unsigned int pt_range_to_end_index(const struct pt_state *pts)h](j )}(hunsignedh]hunsigned}(hj IhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjIhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKzubjm)}(h h]h }(hjIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjIhhhjIhKzubj )}(hinth]hint}(hj(IhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjIhhhjIhKzubjm)}(h h]h }(hj6IhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjIhhhjIhKzubj~)}(hpt_range_to_end_indexh]j)}(hpt_range_to_end_indexh]hpt_range_to_end_index}(hjHIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDIubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjIhhhjIhKzubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjdIhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj`Iubjm)}(h h]h }(hjqIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`Iubj[)}(hj^h]hstruct}(hjIhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj`Iubjm)}(h h]h }(hjIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`Iubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjImodnameN classnameNjD jG )}jJ ]jM )}j@ jJIsbc.pt_range_to_end_indexasbuh1hhj`Iubjm)}(h h]h }(hjIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`Iubja )}(hjd h]h*}(hjIhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj`Iubj)}(hptsh]hpts}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`Iubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj\Iubah}(h]h ]h"]h$]h&]hhuh1j hjIhhhjIhKzubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjIhhhjIhKzubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jNhjIhKzhjIhhubj)}(hhh]h)}(hEnding index iterationh]hEnding index iteration}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKzhjIhhubah}(h]h ]h"]h$]h&]uh1jhjIhhhjIhKzubeh}(h]h ](jfunctioneh"]h$]h&]jjjjJjjJjjjuh1jIhhhjBhNhNubj)}(hv**Parameters** ``const struct pt_state *pts`` Iteration State **Return** the last index for the iteration in pts.h](h)}(h**Parameters**h]j)}(hj$Jh]h Parameters}(hj&JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Jubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK~hjJubjc)}(hhh]jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hjCJh]hconst struct pt_state *pts}(hjEJhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjAJubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK{hj=Jubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hj\JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXJhK{hjYJubah}(h]h ]h"]h$]h&]uh1j~hj=Jubeh}(h]h ]h"]h$]h&]uh1jghjXJhK{hj:Jubah}(h]h ]h"]h$]h&]uh1jbhjJubh)}(h **Return**h]j)}(hj~Jh]hReturn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|Jubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK}hjJubh)}(h(the last index for the iteration in pts.h]h(the last index for the iteration in pts.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK}hjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_next_entry (C function)c.pt_next_entryhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h)void pt_next_entry (struct pt_state *pts)h]jU)}(h(void pt_next_entry(struct pt_state *pts)h](j )}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjJhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubjm)}(h h]h }(hjJhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJhhhjJhKubj~)}(h pt_next_entryh]j)}(h pt_next_entryh]h pt_next_entry}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjJhhhjJhKubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjKhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjJubjm)}(h h]h }(hj KhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj KmodnameN classnameNjD jG )}jJ ]jM )}j@ jJsbc.pt_next_entryasbuh1hhjJubjm)}(h h]h }(hj>KhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJubja )}(hjd h]h*}(hjLKhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjJubj)}(hptsh]hpts}(hjYKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjJubah}(h]h ]h"]h$]h&]hhuh1j hjJhhhjJhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjJhhhjJhKubah}(h]jJah ](jjeh"]h$]h&]jj)jhuh1jNhjJhKhjJhhubj)}(hhh]h)}(hAdvance pts to the next entryh]hAdvance pts to the next entry}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjKhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjJhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKjjKjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_state *pts`` Iteration State **Description** Update pts to go to the next index at this level. If pts is pointing at a contiguous entry then the index may advance my more than one.h](h)}(h**Parameters**h]j)}(hjKh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjKubjc)}(hhh]jh)}(h)``struct pt_state *pts`` Iteration State h](jn)}(h``struct pt_state *pts``h]j/)}(hjKh]hstruct pt_state *pts}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjKubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjKubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhKhjKubah}(h]h ]h"]h$]h&]uh1j~hjKubeh}(h]h ]h"]h$]h&]uh1jghjKhKhjKubah}(h]h ]h"]h$]h&]uh1jbhjKubh)}(h**Description**h]j)}(hjKh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjKubh)}(hUpdate pts to go to the next index at this level. If pts is pointing at a contiguous entry then the index may advance my more than one.h]hUpdate pts to go to the next index at this level. If pts is pointing at a contiguous entry then the index may advance my more than one.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE!for_each_pt_level_entry (C macro)c.for_each_pt_level_entryhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hfor_each_pt_level_entryh]jU)}(hfor_each_pt_level_entryh]j~)}(hfor_each_pt_level_entryh]j)}(hj>Lh]hfor_each_pt_level_entry}(hjHLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDLubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj@Lhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubah}(h]h ]h"]h$]h&]hhjuh1jTjjhjrange that fall within the pts's current table level. Each step does pt_load_entry(pts).h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjLubjc)}(hhh]jh)}(h``pts`` Iteration State h](jn)}(h``pts``h]j/)}(hjLh]hpts}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjLubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjLubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhKhjLubah}(h]h ]h"]h$]h&]uh1j~hjLubeh}(h]h ]h"]h$]h&]uh1jghjLhKhjLubah}(h]h ]h"]h$]h&]uh1jbhjLubh)}(h**Description**h]j)}(hj Mh]h Description}(hj MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjLubh)}(hThis is the basic iteration primitive. It iterates over all the entries in pts->range that fall within the pts's current table level. Each step does pt_load_entry(pts).h]hThis is the basic iteration primitive. It iterates over all the entries in pts->range that fall within the pts’s current table level. Each step does pt_load_entry(pts).}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE!pt_load_single_entry (C function)c.pt_load_single_entryhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h>enum pt_entry_type pt_load_single_entry (struct pt_state *pts)h]jU)}(h=enum pt_entry_type pt_load_single_entry(struct pt_state *pts)h](j[)}(hjHh]henum}(hjNMhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjJMhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubjm)}(h h]h }(hj\MhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJMhhhj[MhKubh)}(hhh]j)}(h pt_entry_typeh]h pt_entry_type}(hjmMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjMubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjoMmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_load_single_entrysbc.pt_load_single_entryasbuh1hhjJMhhhj[MhKubjm)}(h h]h }(hjMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJMhhhj[MhKubj~)}(hpt_load_single_entryh]j)}(hjMh]hpt_load_single_entry}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjJMhhhj[MhKubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjMhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjMubjm)}(h h]h }(hjMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjMubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjMmodnameN classnameNjD jG )}jJ ]jMc.pt_load_single_entryasbuh1hhjMubjm)}(h h]h }(hjMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjMubja )}(hjd h]h*}(hjNhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjMubj)}(hptsh]hpts}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjMubah}(h]h ]h"]h$]h&]hhuh1j hjJMhhhj[MhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjFMhhhj[MhKubah}(h]jAMah ](jjeh"]h$]h&]jj)jhuh1jNhj[MhKhjCMhhubj)}(hhh]h)}(h1Version of pt_load_entry() usable within a walkerh]h1Version of pt_load_entry() usable within a walker}(hjva and range->last_va will be incorrect during the iteration and must not be accessed.h](h)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM hjQubjc)}(hhh]jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjQh]hstruct pt_common *common}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjQubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjQubj)}(hhh]h)}(hTableh]hTable}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjQubah}(h]h ]h"]h$]h&]uh1j~hjQubeh}(h]h ]h"]h$]h&]uh1jghjQhMhjQubah}(h]h ]h"]h$]h&]uh1jbhjQubh)}(h**Description**h]j)}(hjRh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjQubh)}(hThe returned range spans the whole page table. Due to how PT_FEAT_SIGN_EXTEND is supported range->va and range->last_va will be incorrect during the iteration and must not be accessed.h]hThe returned range spans the whole page table. Due to how PT_FEAT_SIGN_EXTEND is supported range->va and range->last_va will be incorrect during the iteration and must not be accessed.}(hj,RhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_upper_range (C function)c.pt_upper_rangehNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h9struct pt_range pt_upper_range (struct pt_common *common)h]jU)}(h8struct pt_range pt_upper_range(struct pt_common *common)h](j[)}(hj^h]hstruct}(hj[RhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjWRhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hjiRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWRhhhjhRhMubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjzRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwRubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj|RmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_upper_rangesbc.pt_upper_rangeasbuh1hhjWRhhhjhRhMubjm)}(h h]h }(hjRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWRhhhjhRhMubj~)}(hpt_upper_rangeh]j)}(hjRh]hpt_upper_range}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjWRhhhjhRhMubj )}(h(struct pt_common *common)h]j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hjRhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjRubjm)}(h h]h }(hjRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjRmodnameN classnameNjD jG )}jJ ]jRc.pt_upper_rangeasbuh1hhjRubjm)}(h h]h }(hjShhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubja )}(hjd h]h*}(hjShhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjRubj)}(hcommonh]hcommon}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjRubah}(h]h ]h"]h$]h&]hhuh1j hjWRhhhjhRhMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjSRhhhjhRhMubah}(h]jNRah ](jjeh"]h$]h&]jj)jhuh1jNhjhRhMhjPRhhubj)}(hhh]h)}(h/Return a range that spans part of the top levelh]h/Return a range that spans part of the top level}(hjIShhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjFShhubah}(h]h ]h"]h$]h&]uh1jhjPRhhhjhRhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjaSjjaSjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_common *common`` Table **Description** For PT_FEAT_SIGN_EXTEND this will return the upper range, and cover half the total page table. Otherwise it returns the entire page table.h](h)}(h**Parameters**h]j)}(hjkSh]h Parameters}(hjmShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiSubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM hjeSubjc)}(hhh]jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjSh]hstruct pt_common *common}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjSubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjSubj)}(hhh]h)}(hTableh]hTable}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1j~hjSubeh}(h]h ]h"]h$]h&]uh1jghjShMhjSubah}(h]h ]h"]h$]h&]uh1jbhjeSubh)}(h**Description**h]j)}(hjSh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjeSubh)}(hFor PT_FEAT_SIGN_EXTEND this will return the upper range, and cover half the total page table. Otherwise it returns the entire page table.h]hFor PT_FEAT_SIGN_EXTEND this will return the upper range, and cover half the total page table. Otherwise it returns the entire page table.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjeSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_make_range (C function)c.pt_make_rangehNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h[struct pt_range pt_make_range (struct pt_common *common, pt_vaddr_t va, pt_vaddr_t last_va)h]jU)}(hZstruct pt_range pt_make_range(struct pt_common *common, pt_vaddr_t va, pt_vaddr_t last_va)h](j[)}(hj^h]hstruct}(hj ThhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjThhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM/ubjm)}(h h]h }(hjThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjThhhjThM/ubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hj)ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&Tubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj+TmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_make_rangesbc.pt_make_rangeasbuh1hhjThhhjThM/ubjm)}(h h]h }(hjJThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjThhhjThM/ubj~)}(h pt_make_rangeh]j)}(hjGTh]h pt_make_range}(hj\ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXTubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjThhhjThM/ubj )}(h=(struct pt_common *common, pt_vaddr_t va, pt_vaddr_t last_va)h](j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hjwThhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjsTubjm)}(h h]h }(hjThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjsTubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjTmodnameN classnameNjD jG )}jJ ]jETc.pt_make_rangeasbuh1hhjsTubjm)}(h h]h }(hjThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjsTubja )}(hjd h]h*}(hjThhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjsTubj)}(hcommonh]hcommon}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsTubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjoTubj )}(h pt_vaddr_t vah](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjTmodnameN classnameNjD jG )}jJ ]jETc.pt_make_rangeasbuh1hhjTubjm)}(h h]h }(hjUhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjTubj)}(hvah]hva}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjoTubj )}(hpt_vaddr_t last_vah](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hj2UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Uubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj4UmodnameN classnameNjD jG )}jJ ]jETc.pt_make_rangeasbuh1hhj+Uubjm)}(h h]h }(hjPUhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj+Uubj)}(hlast_vah]hlast_va}(hj^UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+Uubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjoTubeh}(h]h ]h"]h$]h&]hhuh1j hjThhhjThM/ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjThhhjThM/ubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jNhjThM/hjShhubj)}(hhh]h)}(h+Return a range that spans part of the tableh]h+Return a range that spans part of the table}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM/hjUhhubah}(h]h ]h"]h$]h&]uh1jhjShhhjThM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_common *common`` Table ``pt_vaddr_t va`` Start address ``pt_vaddr_t last_va`` Last address **Description** The caller must validate the range with pt_check_range() before using it.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM3hjUubjc)}(hhh](jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjUh]hstruct pt_common *common}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjUubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM0hjUubj)}(hhh]h)}(hTableh]hTable}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM0hjUubah}(h]h ]h"]h$]h&]uh1j~hjUubeh}(h]h ]h"]h$]h&]uh1jghjUhM0hjUubjh)}(h ``pt_vaddr_t va`` Start address h](jn)}(h``pt_vaddr_t va``h]j/)}(hjVh]h pt_vaddr_t va}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjVubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM1hjUubj)}(hhh]h)}(h Start addressh]h Start address}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhM1hjVubah}(h]h ]h"]h$]h&]uh1j~hjUubeh}(h]h ]h"]h$]h&]uh1jghjVhM1hjUubjh)}(h$``pt_vaddr_t last_va`` Last address h](jn)}(h``pt_vaddr_t last_va``h]j/)}(hj;Vh]hpt_vaddr_t last_va}(hj=VhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj9Vubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM2hj5Vubj)}(hhh]h)}(h Last addressh]h Last address}(hjTVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPVhM2hjQVubah}(h]h ]h"]h$]h&]uh1j~hj5Vubeh}(h]h ]h"]h$]h&]uh1jghjPVhM2hjUubeh}(h]h ]h"]h$]h&]uh1jbhjUubh)}(h**Description**h]j)}(hjvVh]h Description}(hjxVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtVubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM4hjUubh)}(hIThe caller must validate the range with pt_check_range() before using it.h]hIThe caller must validate the range with pt_check_range() before using it.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM3hjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_init (C function) c.pt_inithNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h^struct pt_state pt_init (struct pt_range *range, unsigned int level, struct pt_table_p *table)h]jU)}(h]struct pt_state pt_init(struct pt_range *range, unsigned int level, struct pt_table_p *table)h](j[)}(hj^h]hstruct}(hjVhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjVhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMVubjm)}(h h]h }(hjVhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVhhhjVhMVubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjVmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_initsb c.pt_initasbuh1hhjVhhhjVhMVubjm)}(h h]h }(hjVhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVhhhjVhMVubj~)}(hpt_inith]j)}(hjVh]hpt_init}(hj WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Wubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjVhhhjVhMVubj )}(hF(struct pt_range *range, unsigned int level, struct pt_table_p *table)h](j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hj(WhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj$Wubjm)}(h h]h }(hj5WhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj$Wubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjFWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCWubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjHWmodnameN classnameNjD jG )}jJ ]jV c.pt_initasbuh1hhj$Wubjm)}(h h]h }(hjdWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj$Wubja )}(hjd h]h*}(hjrWhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj$Wubj)}(hrangeh]hrange}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$Wubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj Wubj )}(hunsigned int levelh](j )}(hunsignedh]hunsigned}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjWubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWubj )}(hinth]hint}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjWubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWubj)}(hlevelh]hlevel}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj Wubj )}(hstruct pt_table_p *tableh](j[)}(hj^h]hstruct}(hjWhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjWubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWubh)}(hhh]j)}(h pt_table_ph]h pt_table_p}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj XmodnameN classnameNjD jG )}jJ ]jV c.pt_initasbuh1hhjWubjm)}(h h]h }(hj%XhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWubja )}(hjd h]h*}(hj3XhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjWubj)}(htableh]htable}(hj@XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj Wubeh}(h]h ]h"]h$]h&]hhuh1j hjVhhhjVhMVubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjVhhhjVhMVubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jNhjVhMVhjVhhubj)}(hhh]h)}(h"Initialize a pt_state on the stackh]h"Initialize a pt_state on the stack}(hjjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMVhjgXhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjVhMVubeh}(h]h ](jfunctioneh"]h$]h&]jjjjXjjXjjjuh1jIhhhjBhNhNubj)}(hX**Parameters** ``struct pt_range *range`` Range pointer to embed in the state ``unsigned int level`` Table level for the state ``struct pt_table_p *table`` Pointer to the table memory at level **Description** Helper to initialize the on-stack pt_state from walker arguments.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMZhjXubjc)}(hhh](jh)}(h?``struct pt_range *range`` Range pointer to embed in the state h](jn)}(h``struct pt_range *range``h]j/)}(hjXh]hstruct pt_range *range}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjXubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMWhjXubj)}(hhh]h)}(h#Range pointer to embed in the stateh]h#Range pointer to embed in the state}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMWhjXubah}(h]h ]h"]h$]h&]uh1j~hjXubeh}(h]h ]h"]h$]h&]uh1jghjXhMWhjXubjh)}(h1``unsigned int level`` Table level for the state h](jn)}(h``unsigned int level``h]j/)}(hjXh]hunsigned int level}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjXubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMXhjXubj)}(hhh]h)}(hTable level for the stateh]hTable level for the state}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMXhjXubah}(h]h ]h"]h$]h&]uh1j~hjXubeh}(h]h ]h"]h$]h&]uh1jghjXhMXhjXubjh)}(hB``struct pt_table_p *table`` Pointer to the table memory at level h](jn)}(h``struct pt_table_p *table``h]j/)}(hjYh]hstruct pt_table_p *table}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjYubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMYhjYubj)}(hhh]h)}(h$Pointer to the table memory at levelh]h$Pointer to the table memory at level}(hj6YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2YhMYhj3Yubah}(h]h ]h"]h$]h&]uh1j~hjYubeh}(h]h ]h"]h$]h&]uh1jghj2YhMYhjXubeh}(h]h ]h"]h$]h&]uh1jbhjXubh)}(h**Description**h]j)}(hjXYh]h Description}(hjZYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVYubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM[hjXubh)}(hAHelper to initialize the on-stack pt_state from walker arguments.h]hAHelper to initialize the on-stack pt_state from walker arguments.}(hjnYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMZhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_init_top (C function) c.pt_init_tophNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(h4struct pt_state pt_init_top (struct pt_range *range)h]jU)}(h3struct pt_state pt_init_top(struct pt_range *range)h](j[)}(hj^h]hstruct}(hjYhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjYhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMiubjm)}(h h]h }(hjYhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjYhhhjYhMiubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjYmodnameN classnameNjD jG )}jJ ]jM )}j@ pt_init_topsb c.pt_init_topasbuh1hhjYhhhjYhMiubjm)}(h h]h }(hjYhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjYhhhjYhMiubj~)}(h pt_init_toph]j)}(hjYh]h pt_init_top}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjYhhhjYhMiubj )}(h(struct pt_range *range)h]j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hj ZhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjZubjm)}(h h]h }(hjZhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjZubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hj(ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Zubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj*ZmodnameN classnameNjD jG )}jJ ]jY c.pt_init_topasbuh1hhjZubjm)}(h h]h }(hjFZhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjZubja )}(hjd h]h*}(hjTZhhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjZubj)}(hrangeh]hrange}(hjaZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjZubah}(h]h ]h"]h$]h&]hhuh1j hjYhhhjYhMiubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjYhhhjYhMiubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1jNhjYhMihjYhhubj)}(hhh]h)}(h"Initialize a pt_state on the stackh]h"Initialize a pt_state on the stack}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMihjZhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjYhMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZjjZjjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_range *range`` Range pointer to embed in the state **Description** The pt_state points to the top most level.h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMmhjZubjc)}(hhh]jh)}(h?``struct pt_range *range`` Range pointer to embed in the state h](jn)}(h``struct pt_range *range``h]j/)}(hjZh]hstruct pt_range *range}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjZubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMjhjZubj)}(hhh]h)}(h#Range pointer to embed in the stateh]h#Range pointer to embed in the state}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMjhjZubah}(h]h ]h"]h$]h&]uh1j~hjZubeh}(h]h ]h"]h$]h&]uh1jghjZhMjhjZubah}(h]h ]h"]h$]h&]uh1jbhjZubh)}(h**Description**h]j)}(hj[h]h Description}(hj [hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMlhjZubh)}(h*The pt_state points to the top most level.h]h*The pt_state points to the top most level.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMkhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_descend (C function) c.pt_descendhNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hBint pt_descend (struct pt_state *pts, void *arg, pt_level_fn_t fn)h]jU)}(hAint pt_descend(struct pt_state *pts, void *arg, pt_level_fn_t fn)h](j )}(hinth]hint}(hjL[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjH[hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMwubjm)}(h h]h }(hj[[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjH[hhhjZ[hMwubj~)}(h pt_descendh]j)}(h pt_descendh]h pt_descend}(hjm[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji[ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjH[hhhjZ[hMwubj )}(h3(struct pt_state *pts, void *arg, pt_level_fn_t fn)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj[hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj[ubjm)}(h h]h }(hj[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj[modnameN classnameNjD jG )}jJ ]jM )}j@ jo[sb c.pt_descendasbuh1hhj[ubjm)}(h h]h }(hj[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[ubja )}(hjd h]h*}(hj[hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj[ubj)}(hptsh]hpts}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj[ubj )}(h void *argh](j )}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj[ubjm)}(h h]h }(hj \hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[ubja )}(hjd h]h*}(hj\hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj[ubj)}(hargh]harg}(hj$\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj[ubj )}(hpt_level_fn_t fnh](h)}(hhh]j)}(h pt_level_fn_th]h pt_level_fn_t}(hj@\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=\ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjB\modnameN classnameNjD jG )}jJ ]j[ c.pt_descendasbuh1hhj9\ubjm)}(h h]h }(hj^\hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj9\ubj)}(hfnh]hfn}(hjl\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9\ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj[ubeh}(h]h ]h"]h$]h&]hhuh1j hjH[hhhjZ[hMwubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjD[hhhjZ[hMwubah}(h]j?[ah ](jjeh"]h$]h&]jj)jhuh1jNhjZ[hMwhjA[hhubj)}(hhh]h)}(h1Recursively invoke the walker for the lower levelh]h1Recursively invoke the walker for the lower level}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMwhj\hhubah}(h]h ]h"]h$]h&]uh1jhjA[hhhjZ[hMwubeh}(h]h ](jfunctioneh"]h$]h&]jjjj\jj\jjjuh1jIhhhjBhNhNubj)}(h**Parameters** ``struct pt_state *pts`` Iteration State ``void *arg`` Value to pass to the function ``pt_level_fn_t fn`` Walker function to call **Description** pts must point to a table item. Invoke fn as a walker on the table pts points to.h](h)}(h**Parameters**h]j)}(hj\h]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM{hj\ubjc)}(hhh](jh)}(h)``struct pt_state *pts`` Iteration State h](jn)}(h``struct pt_state *pts``h]j/)}(hj\h]hstruct pt_state *pts}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj\ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMxhj\ubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMxhj\ubah}(h]h ]h"]h$]h&]uh1j~hj\ubeh}(h]h ]h"]h$]h&]uh1jghj\hMxhj\ubjh)}(h,``void *arg`` Value to pass to the function h](jn)}(h ``void *arg``h]j/)}(hj]h]h void *arg}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj]ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMyhj ]ubj)}(hhh]h)}(hValue to pass to the functionh]hValue to pass to the function}(hj)]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%]hMyhj&]ubah}(h]h ]h"]h$]h&]uh1j~hj ]ubeh}(h]h ]h"]h$]h&]uh1jghj%]hMyhj\ubjh)}(h-``pt_level_fn_t fn`` Walker function to call h](jn)}(h``pt_level_fn_t fn``h]j/)}(hjI]h]hpt_level_fn_t fn}(hjK]hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjG]ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMzhjC]ubj)}(hhh]h)}(hWalker function to callh]hWalker function to call}(hjb]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^]hMzhj_]ubah}(h]h ]h"]h$]h&]uh1j~hjC]ubeh}(h]h ]h"]h$]h&]uh1jghj^]hMzhj\ubeh}(h]h ]h"]h$]h&]uh1jbhj\ubh)}(h**Description**h]j)}(hj]h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM|hj\ubh)}(hQpts must point to a table item. Invoke fn as a walker on the table pts points to.h]hQpts must point to a table item. Invoke fn as a walker on the table pts points to.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM{hj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_walk_range (C function)c.pt_walk_rangehNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hGint pt_walk_range (struct pt_range *range, pt_level_fn_t fn, void *arg)h]jU)}(hFint pt_walk_range(struct pt_range *range, pt_level_fn_t fn, void *arg)h](j )}(hinth]hint}(hj]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj]hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hj]hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj]hhhj]hMubj~)}(h pt_walk_rangeh]j)}(h pt_walk_rangeh]h pt_walk_range}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj]hhhj]hMubj )}(h5(struct pt_range *range, pt_level_fn_t fn, void *arg)h](j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hj^hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj^ubjm)}(h h]h }(hj^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj^ubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hj$^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!^ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj&^modnameN classnameNjD jG )}jJ ]jM )}j@ j]sbc.pt_walk_rangeasbuh1hhj^ubjm)}(h h]h }(hjD^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj^ubja )}(hjd h]h*}(hjR^hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj^ubj)}(hrangeh]hrange}(hj_^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj]ubj )}(hpt_level_fn_t fnh](h)}(hhh]j)}(h pt_level_fn_th]h pt_level_fn_t}(hj{^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx^ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj}^modnameN classnameNjD jG )}jJ ]j@^c.pt_walk_rangeasbuh1hhjt^ubjm)}(h h]h }(hj^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt^ubj)}(hfnh]hfn}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj]ubj )}(h void *argh](j )}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^ubjm)}(h h]h }(hj^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj^ubja )}(hjd h]h*}(hj^hhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj^ubj)}(hargh]harg}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj]ubeh}(h]h ]h"]h$]h&]hhuh1j hj]hhhj]hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj]hhhj]hMubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1jNhj]hMhj]hhubj)}(hhh]h)}(hWalk over a VA rangeh]hWalk over a VA range}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj_hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+_jj+_jjjuh1jIhhhjBhNhNubj)}(hXR**Parameters** ``struct pt_range *range`` Range pointer ``pt_level_fn_t fn`` Walker function to call ``void *arg`` Value to pass to the function **Description** Walk over a VA range. The caller should have done a validity check, at least calling pt_check_range(), when building range. The walk will start at the top most table.h](h)}(h**Parameters**h]j)}(hj5_h]h Parameters}(hj7_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3_ubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj/_ubjc)}(hhh](jh)}(h)``struct pt_range *range`` Range pointer h](jn)}(h``struct pt_range *range``h]j/)}(hjT_h]hstruct pt_range *range}(hjV_hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjR_ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjN_ubj)}(hhh]h)}(h Range pointerh]h Range pointer}(hjm_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji_hMhjj_ubah}(h]h ]h"]h$]h&]uh1j~hjN_ubeh}(h]h ]h"]h$]h&]uh1jghji_hMhjK_ubjh)}(h-``pt_level_fn_t fn`` Walker function to call h](jn)}(h``pt_level_fn_t fn``h]j/)}(hj_h]hpt_level_fn_t fn}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj_ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj_ubj)}(hhh]h)}(hWalker function to callh]hWalker function to call}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1j~hj_ubeh}(h]h ]h"]h$]h&]uh1jghj_hMhjK_ubjh)}(h,``void *arg`` Value to pass to the function h](jn)}(h ``void *arg``h]j/)}(hj_h]h void *arg}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj_ubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj_ubj)}(hhh]h)}(hValue to pass to the functionh]hValue to pass to the function}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1j~hj_ubeh}(h]h ]h"]h$]h&]uh1jghj_hMhjK_ubeh}(h]h ]h"]h$]h&]uh1jbhj/_ubh)}(h**Description**h]j)}(hj`h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj/_ubh)}(hWalk over a VA range. The caller should have done a validity check, at least calling pt_check_range(), when building range. The walk will start at the top most table.h]hWalk over a VA range. The caller should have done a validity check, at least calling pt_check_range(), when building range. The walk will start at the top most table.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj/_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_range_slice (C function)c.pt_range_slicehNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hmstruct pt_range pt_range_slice (const struct pt_state *pts, unsigned int start_index, unsigned int end_index)h]jU)}(hlstruct pt_range pt_range_slice(const struct pt_state *pts, unsigned int start_index, unsigned int end_index)h](j[)}(hj^h]hstruct}(hjF`hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjB`hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hjT`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjB`hhhjS`hMubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hje`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb`ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjg`modnameN classnameNjD jG )}jJ ]jM )}j@ pt_range_slicesbc.pt_range_sliceasbuh1hhjB`hhhjS`hMubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjB`hhhjS`hMubj~)}(hpt_range_sliceh]j)}(hj`h]hpt_range_slice}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjB`hhhjS`hMubj )}(hN(const struct pt_state *pts, unsigned int start_index, unsigned int end_index)h](j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj`hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj`ubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`ubj[)}(hj^h]hstruct}(hj`hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj`ubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj`modnameN classnameNjD jG )}jJ ]j`c.pt_range_sliceasbuh1hhj`ubjm)}(h h]h }(hj ahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`ubja )}(hjd h]h*}(hjahhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hj`ubj)}(hptsh]hpts}(hj%ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj`ubj )}(hunsigned int start_indexh](j )}(hunsignedh]hunsigned}(hj>ahhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:aubjm)}(h h]h }(hjLahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:aubj )}(hinth]hint}(hjZahhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:aubjm)}(h h]h }(hjhahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:aubj)}(h start_indexh]h start_index}(hjvahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:aubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj`ubj )}(hunsigned int end_indexh](j )}(hunsignedh]hunsigned}(hjahhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjaubjm)}(h h]h }(hjahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjaubj )}(hinth]hint}(hjahhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjaubjm)}(h h]h }(hjahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjaubj)}(h end_indexh]h end_index}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj`ubeh}(h]h ]h"]h$]h&]hhuh1j hjB`hhhjS`hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj>`hhhjS`hMubah}(h]j9`ah ](jjeh"]h$]h&]jj)jhuh1jNhjS`hMhj;`hhubj)}(hhh]h)}(h!Return a range that spans indexesh]h!Return a range that spans indexes}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjahhubah}(h]h ]h"]h$]h&]uh1jhj;`hhhjS`hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj bjj bjjjuh1jIhhhjBhNhNubj)}(hX**Parameters** ``const struct pt_state *pts`` Iteration State ``unsigned int start_index`` Starting index within pts ``unsigned int end_index`` Ending index within pts **Description** Create a range than spans an index range of the current table level pt_state points at.h](h)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj bubjc)}(hhh](jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hj2bh]hconst struct pt_state *pts}(hj4bhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj0bubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj,bubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjKbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGbhMhjHbubah}(h]h ]h"]h$]h&]uh1j~hj,bubeh}(h]h ]h"]h$]h&]uh1jghjGbhMhj)bubjh)}(h7``unsigned int start_index`` Starting index within pts h](jn)}(h``unsigned int start_index``h]j/)}(hjkbh]hunsigned int start_index}(hjmbhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjibubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjebubj)}(hhh]h)}(hStarting index within ptsh]hStarting index within pts}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j~hjebubeh}(h]h ]h"]h$]h&]uh1jghjbhMhj)bubjh)}(h3``unsigned int end_index`` Ending index within pts h](jn)}(h``unsigned int end_index``h]j/)}(hjbh]hunsigned int end_index}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjbubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjbubj)}(hhh]h)}(hEnding index within ptsh]hEnding index within pts}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j~hjbubeh}(h]h ]h"]h$]h&]uh1jghjbhMhj)bubeh}(h]h ]h"]h$]h&]uh1jbhj bubh)}(h**Description**h]j)}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj bubh)}(hWCreate a range than spans an index range of the current table level pt_state points at.h]hWCreate a range than spans an index range of the current table level pt_state points at.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj bubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_top_memsize_lg2 (C function)c.pt_top_memsize_lg2hNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hRunsigned int pt_top_memsize_lg2 (struct pt_common *common, uintptr_t top_of_table)h]jU)}(hQunsigned int pt_top_memsize_lg2(struct pt_common *common, uintptr_t top_of_table)h](j )}(hunsignedh]hunsigned}(hj$chhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj chhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hj3chhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj chhhj2chMubj )}(hinth]hint}(hjAchhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj chhhj2chMubjm)}(h h]h }(hjOchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj chhhj2chMubj~)}(hpt_top_memsize_lg2h]j)}(hpt_top_memsize_lg2h]hpt_top_memsize_lg2}(hjachhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]cubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj chhhj2chMubj )}(h2(struct pt_common *common, uintptr_t top_of_table)h](j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hj}chhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjycubjm)}(h h]h }(hjchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjycubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjcmodnameN classnameNjD jG )}jJ ]jM )}j@ jccsbc.pt_top_memsize_lg2asbuh1hhjycubjm)}(h h]h }(hjchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjycubja )}(hjd h]h*}(hjchhhNhNubah}(h]h ]jm ah"]h$]h&]uh1j` hjycubj)}(hcommonh]hcommon}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjycubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjucubj )}(huintptr_t top_of_tableh](h)}(hhh]j)}(h uintptr_th]h uintptr_t}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjcmodnameN classnameNjD jG )}jJ ]jcc.pt_top_memsize_lg2asbuh1hhjcubjm)}(h h]h }(hjdhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjcubj)}(h top_of_tableh]h top_of_table}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjucubeh}(h]h ]h"]h$]h&]hhuh1j hj chhhj2chMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjchhhj2chMubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1jNhj2chMhjchhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjchhhj2chMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjQdjjQdjjjuh1jIhhhjBhNhNubj)}(hX **Parameters** ``struct pt_common *common`` Table ``uintptr_t top_of_table`` Top of table value from _pt_top_set() **Description** Compute the allocation size of the top table. For PT_FEAT_DYNAMIC_TOP this will compute the top size assuming the table will grow.h](h)}(h**Parameters**h]j)}(hj[dh]h Parameters}(hj]dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYdubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjUdubjc)}(hhh](jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjzdh]hstruct pt_common *common}(hj|dhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjxdubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjtdubj)}(hhh]h)}(hTableh]hTable}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjdubah}(h]h ]h"]h$]h&]uh1j~hjtdubeh}(h]h ]h"]h$]h&]uh1jghjdhMhjqdubjh)}(hA``uintptr_t top_of_table`` Top of table value from _pt_top_set() h](jn)}(h``uintptr_t top_of_table``h]j/)}(hjdh]huintptr_t top_of_table}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjdubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjdubj)}(hhh]h)}(h%Top of table value from _pt_top_set()h]h%Top of table value from _pt_top_set()}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjdubah}(h]h ]h"]h$]h&]uh1j~hjdubeh}(h]h ]h"]h$]h&]uh1jghjdhMhjqdubeh}(h]h ]h"]h$]h&]uh1jbhjUdubh)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjUdubh)}(hCompute the allocation size of the top table. For PT_FEAT_DYNAMIC_TOP this will compute the top size assuming the table will grow.h]hCompute the allocation size of the top table. For PT_FEAT_DYNAMIC_TOP this will compute the top size assuming the table will grow.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjUdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE#pt_compute_best_pgsize (C function)c.pt_compute_best_pgsizehNtauh1j8hjBehhhNhNubjJ)}(hhh](jO)}(hnunsigned int pt_compute_best_pgsize (pt_vaddr_t pgsz_bitmap, pt_vaddr_t va, pt_vaddr_t last_va, pt_oaddr_t oa)h]jU)}(hmunsigned int pt_compute_best_pgsize(pt_vaddr_t pgsz_bitmap, pt_vaddr_t va, pt_vaddr_t last_va, pt_oaddr_t oa)h](j )}(hunsignedh]hunsigned}(hj3ehhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/ehhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hjBehhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj/ehhhjAehMubj )}(hinth]hint}(hjPehhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/ehhhjAehMubjm)}(h h]h }(hj^ehhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj/ehhhjAehMubj~)}(hpt_compute_best_pgsizeh]j)}(hpt_compute_best_pgsizeh]hpt_compute_best_pgsize}(hjpehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjleubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj/ehhhjAehMubj )}(hJ(pt_vaddr_t pgsz_bitmap, pt_vaddr_t va, pt_vaddr_t last_va, pt_oaddr_t oa)h](j )}(hpt_vaddr_t pgsz_bitmaph](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjemodnameN classnameNjD jG )}jJ ]jM )}j@ jresbc.pt_compute_best_pgsizeasbuh1hhjeubjm)}(h h]h }(hjehhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjeubj)}(h pgsz_bitmaph]h pgsz_bitmap}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjeubj )}(h pt_vaddr_t vah](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjemodnameN classnameNjD jG )}jJ ]jec.pt_compute_best_pgsizeasbuh1hhjeubjm)}(h h]h }(hjehhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjeubj)}(hvah]hva}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjeubj )}(hpt_vaddr_t last_vah](h)}(hhh]j)}(h pt_vaddr_th]h pt_vaddr_t}(hj!fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetj#fmodnameN classnameNjD jG )}jJ ]jec.pt_compute_best_pgsizeasbuh1hhjfubjm)}(h h]h }(hj?fhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjfubj)}(hlast_vah]hlast_va}(hjMfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjeubj )}(h pt_oaddr_t oah](h)}(hhh]j)}(h pt_oaddr_th]h pt_oaddr_t}(hjifhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjffubah}(h]h ]h"]h$]h&] refdomainjreftypej@ reftargetjkfmodnameN classnameNjD jG )}jJ ]jec.pt_compute_best_pgsizeasbuh1hhjbfubjm)}(h h]h }(hjfhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjbfubj)}(hoah]hoa}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbfubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjeubeh}(h]h ]h"]h$]h&]hhuh1j hj/ehhhjAehMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj+ehhhjAehMubah}(h]j&eah ](jjeh"]h$]h&]jj)jhuh1jNhjAehMhj(ehhubj)}(hhh]h)}(h-Determine the best page size for leaf entriesh]h-Determine the best page size for leaf entries}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjfhhubah}(h]h ]h"]h$]h&]uh1jhj(ehhhjAehMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jIhhhjBhNhNubj)}(hXK**Parameters** ``pt_vaddr_t pgsz_bitmap`` Permitted page sizes ``pt_vaddr_t va`` Starting virtual address for the leaf entry ``pt_vaddr_t last_va`` Last virtual address for the leaf entry, sets the max page size ``pt_oaddr_t oa`` Starting output address for the leaf entry **Description** Compute the largest page size for va, last_va, and oa together and return it in lg2. The largest page size depends on the format's supported page sizes at this level, and the relative alignment of the VA and OA addresses. 0 means the OA cannot be stored with the provided pgsz_bitmap.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjfubjc)}(hhh](jh)}(h0``pt_vaddr_t pgsz_bitmap`` Permitted page sizes h](jn)}(h``pt_vaddr_t pgsz_bitmap``h]j/)}(hjgh]hpt_vaddr_t pgsz_bitmap}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjfubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjfubj)}(hhh]h)}(hPermitted page sizesh]hPermitted page sizes}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1j~hjfubeh}(h]h ]h"]h$]h&]uh1jghjghMhjfubjh)}(h>``pt_vaddr_t va`` Starting virtual address for the leaf entry h](jn)}(h``pt_vaddr_t va``h]j/)}(hj9gh]h pt_vaddr_t va}(hj;ghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj7gubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj3gubj)}(hhh]h)}(h+Starting virtual address for the leaf entryh]h+Starting virtual address for the leaf entry}(hjRghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNghMhjOgubah}(h]h ]h"]h$]h&]uh1j~hj3gubeh}(h]h ]h"]h$]h&]uh1jghjNghMhjfubjh)}(hW``pt_vaddr_t last_va`` Last virtual address for the leaf entry, sets the max page size h](jn)}(h``pt_vaddr_t last_va``h]j/)}(hjrgh]hpt_vaddr_t last_va}(hjtghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjpgubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjlgubj)}(hhh]h)}(h?Last virtual address for the leaf entry, sets the max page sizeh]h?Last virtual address for the leaf entry, sets the max page size}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1j~hjlgubeh}(h]h ]h"]h$]h&]uh1jghjghMhjfubjh)}(h=``pt_oaddr_t oa`` Starting output address for the leaf entry h](jn)}(h``pt_oaddr_t oa``h]j/)}(hjgh]h pt_oaddr_t oa}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjgubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjgubj)}(hhh]h)}(h*Starting output address for the leaf entryh]h*Starting output address for the leaf entry}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1j~hjgubeh}(h]h ]h"]h$]h&]uh1jghjghMhjfubeh}(h]h ]h"]h$]h&]uh1jbhjfubh)}(h**Description**h]j)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjfubh)}(hXCompute the largest page size for va, last_va, and oa together and return it in lg2. The largest page size depends on the format's supported page sizes at this level, and the relative alignment of the VA and OA addresses. 0 means the OA cannot be stored with the provided pgsz_bitmap.h]hXCompute the largest page size for va, last_va, and oa together and return it in lg2. The largest page size depends on the format’s supported page sizes at this level, and the relative alignment of the VA and OA addresses. 0 means the OA cannot be stored with the provided pgsz_bitmap.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEPT_MAKE_LEVELS (C macro)c.PT_MAKE_LEVELShNtauh1j8hjBhhhNhNubjJ)}(hhh](jO)}(hPT_MAKE_LEVELSh]jU)}(hPT_MAKE_LEVELSh]j~)}(hPT_MAKE_LEVELSh]j)}(hj%hh]hPT_MAKE_LEVELS}(hj/hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj'hhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMvubah}(h]h ]h"]h$]h&]hhjuh1jTjjhj#hhhhjBhhMvubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jNhjBhhMvhj hhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj hhhhjBhhMvubeh}(h]h ](jmacroeh"]h$]h&]jjjj[hjj[hjjjuh1jIhhhjBhNhNubh)}(h``PT_MAKE_LEVELS (fn, do_fn)``h]j/)}(hjahh]hPT_MAKE_LEVELS (fn, do_fn)}(hjchhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj_hubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMxhjBhhubj )}(hBuild an unwound walker h]h)}(hBuild an unwound walkerh]hBuild an unwound walker}(hj{hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMvhjwhubah}(h]h ]h"]h$]h&]uh1j hjhhMvhjBhhubj)}(hX**Parameters** ``fn`` Name of the walker function ``do_fn`` Function to call at each level **Description** This builds a function call tree that can be fully inlined. The caller must provide a function body in an __always_inline function:: static __always_inline int do_fn(struct pt_range *range, void *arg, unsigned int level, struct pt_table_p *table, pt_level_fn_t descend_fn) An inline function will be created for each table level that calls do_fn with a compile time constant for level and a pointer to the next lower function. This generates an optimally inlined walk where each of the functions sees a constant level and can codegen the exact constants/etc for that level. Note this can produce a lot of code!h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMzhjhubjc)}(hhh](jh)}(h#``fn`` Name of the walker function h](jn)}(h``fn``h]j/)}(hjhh]hfn}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjhubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMwhjhubj)}(hhh]h)}(hName of the walker functionh]hName of the walker function}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMwhjhubah}(h]h ]h"]h$]h&]uh1j~hjhubeh}(h]h ]h"]h$]h&]uh1jghjhhMwhjhubjh)}(h)``do_fn`` Function to call at each level h](jn)}(h ``do_fn``h]j/)}(hjhh]hdo_fn}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjhubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMxhjhubj)}(hhh]h)}(hFunction to call at each levelh]hFunction to call at each level}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMxhjiubah}(h]h ]h"]h$]h&]uh1j~hjhubeh}(h]h ]h"]h$]h&]uh1jghjihMxhjhubeh}(h]h ]h"]h$]h&]uh1jbhjhubh)}(h**Description**h]j)}(hj)ih]h Description}(hj+ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'iubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMzhjhubh)}(hThis builds a function call tree that can be fully inlined. The caller must provide a function body in an __always_inline function::h]hThis builds a function call tree that can be fully inlined. The caller must provide a function body in an __always_inline function:}(hj?ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMyhjhubj)}(hstatic __always_inline int do_fn(struct pt_range *range, void *arg, unsigned int level, struct pt_table_p *table, pt_level_fn_t descend_fn)h]hstatic __always_inline int do_fn(struct pt_range *range, void *arg, unsigned int level, struct pt_table_p *table, pt_level_fn_t descend_fn)}hjNisbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM|hjhubh)}(hX,An inline function will be created for each table level that calls do_fn with a compile time constant for level and a pointer to the next lower function. This generates an optimally inlined walk where each of the functions sees a constant level and can codegen the exact constants/etc for that level.h]hX,An inline function will be created for each table level that calls do_fn with a compile time constant for level and a pointer to the next lower function. This generates an optimally inlined walk where each of the functions sees a constant level and can codegen the exact constants/etc for that level.}(hj]ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjhubh)}(h$Note this can produce a lot of code!h]h$Note this can produce a lot of code!}(hjlihhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjBhhhNhNubeh}(h]iteration-helpersah ]h"]iteration helpersah$]h&]uh1hhjzhhhhhKGubh)}(hhh](h)}(hWriting a Formath]hWriting a Format}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihhhhhKLubh)}(hIt is best to start from a simple format that is similar to the target. x86_64 is usually a good reference for something simple, and AMDv1 is something fairly complete.h]hIt is best to start from a simple format that is similar to the target. x86_64 is usually a good reference for something simple, and AMDv1 is something fairly complete.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjihhubh)}(h|The required inline functions need to be implemented in the format header. These should all follow the standard pattern of::h]h{The required inline functions need to be implemented in the format header. These should all follow the standard pattern of:}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjihhubj)}(hzstatic inline pt_oaddr_t amdv1pt_entry_oa(const struct pt_state *pts) { [..] } #define pt_entry_oa amdv1pt_entry_oah]hzstatic inline pt_oaddr_t amdv1pt_entry_oa(const struct pt_state *pts) { [..] } #define pt_entry_oa amdv1pt_entry_oa}hjisbah}(h]h ]h"]h$]h&]hhuh1jhhhKUhjihhubh)}(hXAwhere a uniquely named per-format inline function provides the implementation and a define maps it to the generic name. This is intended to make debug symbols work better. inline functions should always be used as the prototypes in pt_common.h will cause the compiler to validate the function signature to prevent errors.h]hXAwhere a uniquely named per-format inline function provides the implementation and a define maps it to the generic name. This is intended to make debug symbols work better. inline functions should always be used as the prototypes in pt_common.h will cause the compiler to validate the function signature to prevent errors.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjihhubh)}(hDReview pt_fmt_defaults.h to understand some of the optional inlines.h]hDReview pt_fmt_defaults.h to understand some of the optional inlines.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjihhubh)}(hOnce the format compiles then it should be run through the generic page table kunit test in kunit_generic_pt.h using kunit. For example::h]hOnce the format compiles then it should be run through the generic page table kunit test in kunit_generic_pt.h using kunit. For example:}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjihhubj)}(hX+$ tools/testing/kunit/kunit.py run --build_dir build_kunit_x86_64 --arch x86_64 --kunitconfig ./drivers/iommu/generic_pt/.kunitconfig amdv1_fmt_test.* [...] [11:15:08] Testing complete. Ran 9 tests: passed: 9 [11:15:09] Elapsed time: 3.137s total, 0.001s configuring, 2.368s building, 0.311s runningh]hX+$ tools/testing/kunit/kunit.py run --build_dir build_kunit_x86_64 --arch x86_64 --kunitconfig ./drivers/iommu/generic_pt/.kunitconfig amdv1_fmt_test.* [...] [11:15:08] Testing complete. Ran 9 tests: passed: 9 [11:15:09] Elapsed time: 3.137s total, 0.001s configuring, 2.368s building, 0.311s running}hjisbah}(h]h ]h"]h$]h&]hhuh1jhhhKfhjihhubh)}(hThe generic tests are intended to prove out the format functions and give clearer failures to speed up finding the problems. Once those pass then the entire kunit suite should be run.h]hThe generic tests are intended to prove out the format functions and give clearer failures to speed up finding the problems. Once those pass then the entire kunit suite should be run.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjihhubeh}(h]writing-a-formatah ]h"]writing a formatah$]h&]uh1hhjzhhhhhKLubh)}(hhh](h)}(hIOMMU Invalidation Featuresh]hIOMMU Invalidation Features}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhKpubh)}(hInvalidation is how the page table algorithms synchronize with a HW cache of the page table memory, typically called the TLB (or IOTLB for IOMMU cases).h]hInvalidation is how the page table algorithms synchronize with a HW cache of the page table memory, typically called the TLB (or IOTLB for IOMMU cases).}(hj$jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjjhhubh)}(hThe TLB can store present PTEs, non-present PTEs and table pointers, depending on its design. Every HW has its own approach on how to describe what has changed to have changed items removed from the TLB.h]hThe TLB can store present PTEs, non-present PTEs and table pointers, depending on its design. Every HW has its own approach on how to describe what has changed to have changed items removed from the TLB.}(hj2jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjjhhubh)}(hhh](h)}(hPT_FEAT_FLUSH_RANGEh]hPT_FEAT_FLUSH_RANGE}(hjCjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@jhhhhhKzubh)}(hXPT_FEAT_FLUSH_RANGE is the easiest scheme to understand. It tries to generate a single range invalidation for each operation, over-invalidating if there are gaps of VA that don't need invalidation. This trades off impacted VA for number of invalidation operations. It does not keep track of what is being invalidated; however, if pages have to be freed then page table pointers have to be cleaned from the walk cache. The range can start/end at any page boundary.h]hXPT_FEAT_FLUSH_RANGE is the easiest scheme to understand. It tries to generate a single range invalidation for each operation, over-invalidating if there are gaps of VA that don’t need invalidation. This trades off impacted VA for number of invalidation operations. It does not keep track of what is being invalidated; however, if pages have to be freed then page table pointers have to be cleaned from the walk cache. The range can start/end at any page boundary.}(hjQjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hj@jhhubeh}(h]pt-feat-flush-rangeah ]h"]pt_feat_flush_rangeah$]h&]uh1hhjjhhhhhKzubh)}(hhh](h)}(hPT_FEAT_FLUSH_RANGE_NO_GAPSh]hPT_FEAT_FLUSH_RANGE_NO_GAPS}(hjjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgjhhhhhKubh)}(hX.PT_FEAT_FLUSH_RANGE_NO_GAPS is similar to PT_FEAT_FLUSH_RANGE; however, it tries to minimize the amount of impacted VA by issuing extra flush operations. This is useful if the cost of processing VA is very high, for instance because a hypervisor is processing the page table with a shadowing algorithm.h]hX.PT_FEAT_FLUSH_RANGE_NO_GAPS is similar to PT_FEAT_FLUSH_RANGE; however, it tries to minimize the amount of impacted VA by issuing extra flush operations. This is useful if the cost of processing VA is very high, for instance because a hypervisor is processing the page table with a shadowing algorithm.}(hjxjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjgjhhubeh}(h]pt-feat-flush-range-no-gapsah ]h"]pt_feat_flush_range_no_gapsah$]h&]uh1hhjjhhhhhKubeh}(h]iommu-invalidation-featuresah ]h"]iommu invalidation featuresah$]h&]uh1hhjzhhhhhKpubeh}(h]usageah ]h"]usageah$]h&]uh1hhhhhhhhKubeh}(h]generic-radix-page-tableah ]h"]generic radix page tableah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjjjjAjAjijijjj jjjjjjdjjajjjjju nametypes}(jjjjjAjijjjjjdjjjuh}(jjhjjjzjAj'jGjPj9j>j j j j jjj/j4j:j?jjjJjOjjj?jDjjjjj|jj+j0j j ju"jz"j%j%j(j(j*j*jK,jP,j.j.j/j/j2j2j3j3j5j5jL7jQ7j8j9j:j:jo<jt<jy>j~>j@j@jijBjBj#BjCjCj Ej%EjFGjKGjHjIjJjJj7Lj`jcjcj&ej+ejhj#hj jjijjjjjajj@jjjjgju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.