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.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. 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}(hju hhhNhNubah}(h]h ]ktah"]h$]h&]uh1js hjo 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&]uh1jlhjo 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}hjo 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]j ASTIdentifier)}j j sbc.pt_attr_from_entryasbuh1hhj ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubhdesc_sig_punctuation)}(h*h]h*}(hj) hhhNhNubah}(h]h ]pah"]h$]h&]uh1j' hj ubj)}(hptsh]hpts}(hj8 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}(hjQ hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjM ubjm)}(h h]h }(hj^ hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjM ubh)}(hhh]j)}(hpt_write_attrsh]hpt_write_attrs}(hjo hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjq modnameN classnameNj j )}j ]j c.pt_attr_from_entryasbuh1hhjM ubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjM ubj( )}(hj+ h]h*}(hj hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjM ubj)}(hattrsh]hattrs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubeh}(h]h ]h"]h$]h&]hhuh1j hjo hhhj hK ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjk hhhj hK ubah}(h]jf ah ](jjeh"]h$]h&]jj)jhuh1jNhj hK hjh 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&]uh1jhjh 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/)}(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.hhK!hj ubj)}(hhh]h)}(hEntry to convert fromh]hEntry to convert from}(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!hj ubjh)}(h1``struct pt_write_attrs *attrs`` Resulting attrs h](jn)}(h ``struct pt_write_attrs *attrs``h]j/)}(hjL h]hstruct pt_write_attrs *attrs}(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)}(hResulting attrsh]hResulting attrs}(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"hj 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](jt )}(hboolh]hbool}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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}(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 }(hj1 hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjB hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjD modnameN classnameNj j )}j ]j )}j j sbc.pt_can_have_leafasbuh1hhj ubjm)}(h h]h }(hjb hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj ubj( )}(hj+ h]h*}(hjp hhhNhNubah}(h]h ]j4 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)}(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.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.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)}(hThe current levelh]hThe current level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK-hj ubah}(h]h ]h"]h$]h&]uh1j~hj ubeh}(h]h ]h"]h$]h&]uh1jghj hK-hj 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.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.}(hj9hhhNhNubah}(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](jt )}(hj h]hbool}(hjhhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjdhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK5ubjm)}(h h]h }(hjvhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjdhhhjuhK5ubj~)}(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}hjdhhhjuhK5ubj )}(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 classnameNj j )}j ]j )}j jsbc.pt_can_have_tableasbuh1hhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hj hhhNhNubah}(h]h ]j4 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 hjdhhhjuhK5ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj`hhhjuhK5ubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jNhjuhK5hj]hhubj)}(hhh]h)}(h0True if the current level can have a lower tableh]h0True if the current level can have a lower table}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK5hj?hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjuhK5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZjjZjjjuh1jIhhhj'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)}(hjdh]h Parameters}(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.hhK9hj^ubjc)}(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.hhK6hj}ubj)}(hhh]h)}(hThe current levelh]hThe current level}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK6hjubah}(h]h ]h"]h$]h&]uh1j~hj}ubeh}(h]h ]h"]h$]h&]uh1jghjhK6hjzubah}(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.hhK8hj^ubh)}(h6Every level except 0 is allowed to have a lower table.h]h6Every level except 0 is allowed to have a lower 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.hhK7hj^ubeh}(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](jt )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKAubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKAubj~)}(hpt_clear_entriesh]j)}(hpt_clear_entriesh]hpt_clear_entries}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhjhKAubj )}(h3(struct pt_state *pts, unsigned int num_contig_lg2)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hj@hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj<ubjm)}(h h]h }(hjMhhhNhNubah}(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 classnameNj j )}j ]j )}j j&sbc.pt_clear_entriesasbuh1hhj<ubjm)}(h h]h }(hj~hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj<ubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj<ubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj8ubj )}(hunsigned int num_contig_lg2h](jt )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubjt )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj)}(hnum_contig_lg2h]hnum_contig_lg2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj8ubeh}(h]h ]h"]h$]h&]hhuh1j hjhhhjhKAubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKAubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKAhjhhubj)}(hhh]h)}(h Make entries empty (non-present)h]h Make entries empty (non-present)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKAhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKAubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,jj,jjjuh1jIhhhj'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)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKEhj0ubjc)}(hhh](jh)}(h.``struct pt_state *pts`` Starting table index h](jn)}(h``struct pt_state *pts``h]j/)}(hjUh]hstruct pt_state *pts}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjSubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKBhjOubj)}(hhh]h)}(hStarting table indexh]hStarting table index}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhKBhjkubah}(h]h ]h"]h$]h&]uh1j~hjOubeh}(h]h ]h"]h$]h&]uh1jghjjhKBhjLubjh)}(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&]uh1jghjhKChjLubeh}(h]h ]h"]h$]h&]uh1jbhj0ubh)}(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.hhKEhj0ubh)}(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.hhKDhj0ubeh}(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](jt )}(hj h]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKMubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj hhhjhKMubj~)}(hpt_entry_make_write_dirtyh]j)}(hpt_entry_make_write_dirtyh]hpt_entry_make_write_dirty}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj hhhjhKMubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjJhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjFubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjFubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjjmodnameN classnameNj j )}j ]j )}j j0sbc.pt_entry_make_write_dirtyasbuh1hhjFubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjFubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjFubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjBubah}(h]h ]h"]h$]h&]hhuh1j hj hhhjhKMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKMhjhhubj)}(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&]uh1jhjhhhjhKMubeh}(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)}(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.hhKQhjubjc)}(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.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.hhKNhjubj)}(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~hjubeh}(h]h ]h"]h$]h&]uh1jghj#hKNhjubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKPhjubh)}(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.}(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.hhKOhjubeh}(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](jt )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.pt_entry_make_write_cleanasbuh1hhjubjm)}(h h]h }(hj hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 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}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKWhjKhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKWubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjjjuh1jIhhhj'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)}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK[hjjubjc)}(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&]uh1jbhjjubh)}(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.hhKZhjjubh)}(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.hhKYhjjubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhK_hjjubeh}(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](jt )}(hj h]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKfubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhj+hKfubj~)}(hpt_entry_is_write_dirtyh]j)}(hpt_entry_is_write_dirtyh]hpt_entry_is_write_dirty}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhj+hKfubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjZhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjVubjm)}(h h]h }(hjghhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVubj[)}(hj^h]hstruct}(hjuhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjVubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j j@sbc.pt_entry_is_write_dirtyasbuh1hhjVubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjVubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjRubah}(h]h ]h"]h$]h&]hhuh1j hjhhhj+hKfubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhj+hKfubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhj+hKfhjhhubj)}(hhh]h)}(h%True if the entry has been written toh]h%True if the entry has been written to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKfhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj+hKfubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'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)}(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.hhKjhjubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hj9h]hconst struct pt_state *pts}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj7ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKghj3ubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhKghjOubah}(h]h ]h"]h$]h&]uh1j~hj3ubeh}(h]h ]h"]h$]h&]uh1jghjNhKghj0ubah}(h]h ]h"]h$]h&]uh1jbhjubh)}(h**Description**h]j)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKihjubh)}(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.hhKhhjubeh}(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](jt )}(hj h]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.pt_dirty_supportedasbuh1hhjubjm)}(h h]h }(hj3hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hjAhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjubj)}(hcommonh]hcommon}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(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}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKphjuhhubah}(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}(hjhhhNhNubah}(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](jt )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjhhhj/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&]uh1jlhjhhhj!hKvubjt )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjhhhj!hKvubjm)}(h h]h }(hj>hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhj!hKvubj~)}(hpt_entry_num_contig_lg2h]j)}(hpt_entry_num_contig_lg2h]hpt_entry_num_contig_lg2}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjhhhj!hKvubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjlhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjhubjm)}(h h]h }(hjyhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjhubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jRsbc.pt_entry_num_contig_lg2asbuh1hhjhubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjhubj)}(hptsh]hpts}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjdubah}(h]h ]h"]h$]h&]hhuh1j hjhhhj!hKvubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj hhhj!hKvubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhj!hKvhjhhubj)}(hhh]h)}(h.Number of contiguous items for this leaf entryh]h.Number of contiguous items for this leaf 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.hhKvhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hKvubeh}(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)}(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.hhKzhj&ubjc)}(hhh]jh)}(h.``const struct pt_state *pts`` Entry to query h](jn)}(h``const struct pt_state *pts``h]j/)}(hjKh]hconst struct pt_state *pts}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjIubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKwhjEubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hKwhjaubah}(h]h ]h"]h$]h&]uh1j~hjEubeh}(h]h ]h"]h$]h&]uh1jghj`hKwhjBubah}(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 reftargetjmodnameN classnameNj j )}j ]j )}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 }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjhhhjhKubj~)}(h pt_entry_oah]j)}(hjh]h pt_entry_oa}(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 }(hj*hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj[)}(hj^h]hstruct}(hj8hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjXmodnameN classnameNj j )}j ]j c.pt_entry_oaasbuh1hhjubjm)}(h h]h }(hjthhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 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 hjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jNhjhKhjhhubj)}(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&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jIhhhj'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/)}(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)}(hj5h]h Description}(hj7hhhNhNubah}(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.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.:}(hjKhhhNhNubah}(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}hjZsbah}(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.}(hjihhhNhNubah}(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](jt )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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&]uh1jlhjhhhjhKubjt )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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&]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}(hj hhhNhNubah}(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&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj,modnameN classnameNj j )}j ]j )}j jsbc.pt_entry_oa_lg2szasbuh1hhjubjm)}(h h]h }(hjJhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hjXhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjubj)}(hptsh]hpts}(hjehhhNhNubah}(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]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/)}(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)}(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.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.}(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_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}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjUmodnameN classnameNj j )}j ]j )}j pt_entry_oa_exactsbc.pt_entry_oa_exactasbuh1hhjLhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKubjm)}(h h]h }(hjuhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjLhhhjthKubj~)}(hpt_entry_oa_exacth]j)}(hjqh]hpt_entry_oa_exact}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjLhhhjthKubj )}(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 classnameNj j )}j ]joc.pt_entry_oa_exactasbuh1hhjubjm)}(h h]h }(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj( )}(hj+ h]h*}(hjhhhNhNubah}(h]h ]j4 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 hjLhhhjthKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjHhhhjthKubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jNhjthKhjEhhubj)}(hhh]h)}(h#Return the complete OA for an entryh]h#Return the complete OA for an 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&]uh1jhjEhhhjthKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1jIhhhj'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)}(hj`h]h Parameters}(hjbhhhNhNubah}(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.hhKhjZubjc)}(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.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.hhKhjyubj)}(hhh]h)}(hEntry to queryh]hEntry to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j~hjyubeh}(h]h ]h"]h$]h&]uh1jghjhKhjvubah}(h]h ]h"]h$]h&]uh1jbhjZubh)}(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.hhKhjZubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjZubeh}(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"hhubj)}(hhh]h)}(hWrite a leaf entry to the tableh]hWrite a leaf 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>"hhhjW"hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjE$jjE$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)}(hjO$h]h Parameters}(hjQ$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM$ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjI$ubjc)}(hhh](jh)}(h/``struct pt_state *pts`` Table index to change h](jn)}(h``struct pt_state *pts``h]j/)}(hjn$h]hstruct pt_state *pts}(hjp$hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjl$ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjh$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~hjh$ubeh}(h]h ]h"]h$]h&]uh1jghj$hKhje$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$hKhje$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}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj$ubah}(h]h ]h"]h$]h&]uh1j~hj$ubeh}(h]h ]h"]h$]h&]uh1jghj$hKhje$ubjh)}(hF``const struct pt_write_attrs *attrs`` Attributes to modify the entry h](jn)}(h&``const struct pt_write_attrs *attrs``h]j/)}(hj%h]h"const struct 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.hhKhj%ubj)}(hhh]h)}(hAttributes to modify the entryh]hAttributes to modify the entry}(hj2%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.%hKhj/%ubah}(h]h ]h"]h$]h&]uh1j~hj%ubeh}(h]h ]h"]h$]h&]uh1jghj.%hKhje$ubeh}(h]h ]h"]h$]h&]uh1jbhjI$ubh)}(h**Description**h]j)}(hjT%h]h Description}(hjV%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR%ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjI$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.}(hjj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjI$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.}(hjy%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjI$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.hhKhjI$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](jt )}(hj h]hbool}(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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 }(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 classnameNj j )}j ]j )}j j%sbc.pt_install_tableasbuh1hhj%ubjm)}(h h]h }(hj1&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj%ubj( )}(hj+ h]h*}(hj?&hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj%ubj)}(hptsh]hpts}(hjL&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}(hjh&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje&ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjj&modnameN classnameNj j )}j ]j-&c.pt_install_tableasbuh1hhja&ubjm)}(h h]h }(hj&hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhja&ubj)}(htable_pah]htable_pa}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja&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 classnameNj j )}j ]j-&c.pt_install_tableasbuh1hhj&ubjm)}(h h]h }(hj'hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj&ubj( )}(hj+ h]h*}(hj'hhhNhNubah}(h]h ]j4 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&]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}(hjI'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjF'hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjja'jja'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)}(hjk'h]h Parameters}(hjm'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji'ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhje'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/)}(hj'h]h"const struct 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.hhKhj'ubj)}(hhh]h)}(h$Attributes to modify the table indexh]h$Attributes to modify the table index}(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'ubeh}(h]h ]h"]h$]h&]uh1jbhje'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.hhKhje'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.}(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.hhKhje'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.hhKhje'ubh)}(h **Return**h]j)}(hjm(h]hReturn}(hjo(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk(ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhje'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.hhKhje'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 classnameNj j )}j ]j )}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&]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 classnameNj j )}j ]j( c.pt_item_oaasbuh1hhj)ubjm)}(h h]h }(hj[)hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj)ubj( )}(hj+ h]h*}(hji)hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj)ubj)}(hptsh]hpts}(hjv)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!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}(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)}(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.}(hj2*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.}(hjA*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}(hjp*hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjl*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&]uh1jlhjl*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 classnameNj j )}j ]j )}j pt_load_entry_rawsbc.pt_load_entry_rawasbuh1hhjl*hhhj}*hKubjm)}(h h]h }(hj*hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjl*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}hjl*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}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*modnameN classnameNj j )}j ]j*c.pt_load_entry_rawasbuh1hhj*ubjm)}(h h]h }(hj+hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj*ubj( )}(hj+ h]h*}(hj'+hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj*ubj)}(hptsh]hpts}(hj4+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj*ubah}(h]h ]h"]h$]h&]hhuh1j hjl*hhhj}*hKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjh*hhhj}*hKubah}(h]jc*ah ](jjeh"]h$]h&]jj)jhuh1jNhj}*hKhje*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&]uh1jhje*hhhj}*hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjv+jjv+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.hhKhjz+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&]uh1jbhjz+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.hhKhjz+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.hhKhjz+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](jt )}(hunsignedh]hunsigned}(hj,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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-,hKubjt )}(hinth]hint}(hj<,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj,hhhj-,hKubjm)}(h h]h }(hjJ,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,hhhj-,hKubj~)}(h pt_max_oa_lg2h]j)}(h pt_max_oa_lg2h]h pt_max_oa_lg2}(hj\,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX,ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj,hhhj-,hKubj )}(h (const struct pt_common *common)h]j )}(hconst struct pt_common *commonh](j[)}(hj h]hconst}(hjx,hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjt,ubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt,ubj[)}(hj^h]hstruct}(hj,hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjt,ubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt,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 classnameNj j )}j ]j )}j j^,sbc.pt_max_oa_lg2asbuh1hhjt,ubjm)}(h h]h }(hj,hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt,ubj( )}(hj+ h]h*}(hj,hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjt,ubj)}(hcommonh]hcommon}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjp,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/Return the maximum OA the table format can holdh]h/Return the maximum OA the table format can hold}(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_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)}(hj8-h]h Parameters}(hj:-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6-ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhj2-ubjc)}(hhh]jh)}(h7``const struct pt_common *common`` Page table to query h](jn)}(h"``const struct pt_common *common``h]j/)}(hjW-h]hconst struct pt_common *common}(hjY-hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjU-ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhKhjQ-ubj)}(hhh]h)}(hPage table to queryh]hPage table to query}(hjp-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjl-hKhjm-ubah}(h]h ]h"]h$]h&]uh1j~hjQ-ubeh}(h]h ]h"]h$]h&]uh1jghjl-hKhjN-ubah}(h]h ]h"]h$]h&]uh1jbhj2-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.hhKhj2-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.hhKhj2-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](jt )}(hunsignedh]hunsigned}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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-hMubjt )}(hinth]hint}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.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}(hj0.hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,.ubjm)}(h h]h }(hj=.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,.ubj[)}(hj^h]hstruct}(hjK.hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,.ubjm)}(h h]h }(hjX.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,.ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hji.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf.ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjk.modnameN classnameNj j )}j ]j )}j j.sbc.pt_num_items_lg2asbuh1hhj,.ubjm)}(h h]h }(hj.hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,.ubj( )}(hj+ h]h*}(hj.hhhNhNubah}(h]h ]j4 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-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/)}(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.hhMhj /ubj)}(hhh]h)}(hThe current levelh]hThe current level}(hj(/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$/hMhj%/ubah}(h]h ]h"]h$]h&]uh1j~hj /ubeh}(h]h ]h"]h$]h&]uh1jghj$/hMhj/ubah}(h]h ]h"]h$]h&]uh1jbhj.ubh)}(h**Description**h]j)}(hjJ/h]h Description}(hjL/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH/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:}(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.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](jt )}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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/hMubjt )}(hinth]hint}(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj/hhhj/hMubjm)}(h h]h }(hj/hhhNhNubah}(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/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(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}(hj0hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj0ubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj0ubh)}(hhh]j)}(h pt_commonh]h pt_common}(hj$0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!0ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&0modnameN classnameNj j )}j ]j )}j j/sbc.pt_pgsz_lg2_to_levelasbuh1hhj0ubjm)}(h h]h }(hjD0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj0ubj( )}(hj+ h]h*}(hjR0hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj0ubj)}(hcommonh]hcommon}(hj_0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj/ubj )}(hunsigned int pgsize_lg2h](jt )}(hunsignedh]hunsigned}(hjx0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjt0ubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt0ubjt )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjt0ubjm)}(h h]h }(hj0hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjt0ubj)}(h pgsize_lg2h]h pgsize_lg2}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt0ubeh}(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)}(h(Return the level that maps the page sizeh]h(Return the level that maps the page size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj0hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0jj0jjjuh1jIhhhj'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)}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj0ubjc)}(hhh](jh)}(h1``struct pt_common *common`` Page table to query h](jn)}(h``struct pt_common *common``h]j/)}(hj1h]hstruct pt_common *common}(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)}(hPage table to queryh]hPage table to query}(hj41hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj01hMhj11ubah}(h]h ]h"]h$]h&]uh1j~hj1ubeh}(h]h ]h"]h$]h&]uh1jghj01hMhj1ubjh)}(h+``unsigned int pgsize_lg2`` Log2 page size h](jn)}(h``unsigned int pgsize_lg2``h]j/)}(hjT1h]hunsigned int pgsize_lg2}(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)}(hLog2 page sizeh]hLog2 page size}(hjm1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji1hMhjj1ubah}(h]h ]h"]h$]h&]uh1j~hjN1ubeh}(h]h ]h"]h$]h&]uh1jghji1hMhj1ubeh}(h]h ]h"]h$]h&]uh1jbhj0ubh)}(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.hhMhj0ubh)}(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.hhMhj0ubeh}(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}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj1modnameN classnameNj j )}j ]j )}j pt_possible_sizessbc.pt_possible_sizesasbuh1hhj1hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMubjm)}(h h]h }(hj1hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj1hhhj1hMubj~)}(hpt_possible_sizesh]j)}(hj1h]hpt_possible_sizes}(hj 2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj1hhhj1hMubj )}(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 }(hj32hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj"2ubj[)}(hj^h]hstruct}(hjA2hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj"2ubjm)}(h h]h }(hjN2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj"2ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj_2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetja2modnameN classnameNj j )}j ]j1c.pt_possible_sizesasbuh1hhj"2ubjm)}(h h]h }(hj}2hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj"2ubj( )}(hj+ h]h*}(hj2hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj"2ubj)}(hptsh]hpts}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"2ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj2ubah}(h]h ]h"]h$]h&]hhuh1j hj1hhhj1hMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj1hhhj1hMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jNhj1hMhj1hhubj)}(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&]uh1jhj1hhhj1hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2jj2jjjuh1jIhhhj'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)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj2ubjc)}(hhh]jh)}(h1``const struct pt_state *pts`` The current level h](jn)}(h``const struct pt_state *pts``h]j/)}(hj3h]hconst struct pt_state *pts}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj3ubah}(h]h ]h"]h$]h&]uh1jmhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj2ubj)}(hhh]h)}(hThe current levelh]hThe current level}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1j~hj2ubeh}(h]h ]h"]h$]h&]uh1jghj3hMhj2ubah}(h]h ]h"]h$]h&]uh1jbhj2ubh)}(h**Description**h]j)}(hj>3h]h Description}(hj@3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<3ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj2ubh)}(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.}(hjT3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMhj2ubh)}(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.}(hjc3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM hj2ubh)}(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.}(hjr3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhM&hj2ubeh}(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)}(hReturn 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)}(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.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.}(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.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](jt )}(hj h]hbool}(hjC<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj?<hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMcubjm)}(h h]h }(hjQ<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj?<hhhjP<hMcubj~)}(hpt_test_sw_bit_acquireh]j)}(hpt_test_sw_bit_acquireh]hpt_test_sw_bit_acquire}(hjc<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_<ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj?<hhhjP<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 classnameNj j )}j ]j )}j je<sbc.pt_test_sw_bit_acquireasbuh1hhj{<ubjm)}(h h]h }(hj<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj{<ubj( )}(hj+ h]h*}(hj<hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj{<ubj)}(hptsh]hpts}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjw<ubj )}(hunsigned int bitnrh](jt )}(hunsignedh]hunsigned}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj<ubjm)}(h h]h }(hj<hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj<ubjt )}(hinth]hint}(hj =hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj<ubjm)}(h h]h }(hj=hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj<ubj)}(hbitnrh]hbitnr}(hj)=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjw<ubeh}(h]h ]h"]h$]h&]hhuh1j hj?<hhhjP<hMcubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj;<hhhjP<hMcubah}(h]j6<ah ](jjeh"]h$]h&]jj)jhuh1jNhjP<hMchj8<hhubj)}(hhh]h)}(hRead a software bit in an itemh]hRead a software bit in an item}(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.hhMchjP=hhubah}(h]h ]h"]h$]h&]uh1jhj8<hhhjP<hMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjk=jjk=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)}(hju=h]h Parameters}(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.hhMghjo=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&]uh1jbhjo=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.hhMghjo=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.}(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.hhMfhjo=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](jt )}(hvoidh]hvoid}(hjM>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjI>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&]uh1jlhjI>hhhj[>hMnubj~)}(hpt_set_sw_bit_releaseh]j)}(hpt_set_sw_bit_releaseh]hpt_set_sw_bit_release}(hjn>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj>ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjI>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 classnameNj j )}j ]j )}j jp>sbc.pt_set_sw_bit_releaseasbuh1hhj>ubjm)}(h h]h }(hj>hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>ubj( )}(hj+ h]h*}(hj>hhhNhNubah}(h]h ]j4 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](jt )}(hunsignedh]hunsigned}(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj>ubjm)}(h h]h }(hj ?hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>ubjt )}(hinth]hint}(hj?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj>ubjm)}(h h]h }(hj&?hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj>ubj)}(hbitnrh]hbitnr}(hj4?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj>ubeh}(h]h ]h"]h$]h&]hhuh1j hjI>hhhj[>hMnubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjE>hhhj[>hMnubah}(h]j@>ah ](jjeh"]h$]h&]jj)jhuh1jNhj[>hMnhjB>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&]uh1jhjB>hhhj[>hMnubeh}(h]h ](jfunctioneh"]h$]h&]jjjjv?jjv?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.hhMrhjz?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&]uh1jbhjz?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.hhMrhjz?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.}(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.hhMqhjz?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](jt )}(hvoidh]hvoid}(hjX@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjT@hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMyubjm)}(h h]h }(hjg@hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjT@hhhjf@hMyubj~)}(h pt_load_entryh]j)}(h pt_load_entryh]h pt_load_entry}(hjy@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju@ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjT@hhhjf@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 classnameNj j )}j ]j )}j j{@sbc.pt_load_entryasbuh1hhj@ubjm)}(h h]h }(hj@hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@ubj( )}(hj+ h]h*}(hj@hhhNhNubah}(h]h ]j4 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 hjT@hhhjf@hMyubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjP@hhhjf@hMyubah}(h]jK@ah ](jjeh"]h$]h&]jj)jhuh1jNhjf@hMyhjM@hhubj)}(hhh]h)}(h1Read from the location pts points at into the ptsh]h1Read from the location pts points at into the pts}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:68: ./drivers/iommu/generic_pt/pt_common.hhMyhjAhhubah}(h]h ]h"]h$]h&]uh1jhjM@hhhjf@hMyubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0Ajj0Ajjjuh1jIhhhj'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)}(hj:Ah]h Parameters}(hjentry 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{hj4Aubeh}(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}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhhhhhKGubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_check_range (C function)c.pt_check_rangehNtauh1j8hjAhhhNhNubjJ)}(hhh](jO)}(h+int pt_check_range (struct pt_range *range)h]jU)}(h*int pt_check_range(struct pt_range *range)h](jt )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjAhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubjm)}(h h]h }(hjBhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjAhhhjBhKubj~)}(hpt_check_rangeh]j)}(hpt_check_rangeh]hpt_check_range}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjAhhhjBhKubj )}(h(struct pt_range *range)h]j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hj/BhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj+Bubjm)}(h h]h }(hjva to the current pts->indexh]h*Update range->va to the current pts->index}(hj3DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK2hj0Dhhubah}(h]h ]h"]h$]h&]uh1jhjhChhhjChK2ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjKDjjKDjjjuh1jIhhhjAhNhNubj)}(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)}(hjUDh]h Parameters}(hjWDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSDubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK6hjODubjc)}(hhh]jh)}(h)``struct pt_state *pts`` Iteration State h](jn)}(h``struct pt_state *pts``h]j/)}(hjtDh]hstruct pt_state *pts}(hjvDhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjrDubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK3hjnDubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhK3hjDubah}(h]h ]h"]h$]h&]uh1j~hjnDubeh}(h]h ]h"]h$]h&]uh1jghjDhK3hjkDubah}(h]h ]h"]h$]h&]uh1jbhjODubh)}(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.hhK5hjODubh)}(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.hhK4hjODubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE#pt_entry_fully_covered (C function)c.pt_entry_fully_coveredhNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hj h]hbool}(hjDhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjDhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKMubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjDhhhjEhKMubj~)}(hpt_entry_fully_coveredh]j)}(hpt_entry_fully_coveredh]hpt_entry_fully_covered}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjDhhhjEhKMubj )}(h3(const struct pt_state *pts, unsigned int oasz_lg2)h](j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj0EhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,Eubjm)}(h h]h }(hj=EhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,Eubj[)}(hj^h]hstruct}(hjKEhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj,Eubjm)}(h h]h }(hjXEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,Eubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjiEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjkEmodnameN classnameNj j )}j ]j )}j jEsbc.pt_entry_fully_coveredasbuh1hhj,Eubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj,Eubj( )}(hj+ h]h*}(hjEhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj,Eubj)}(hptsh]hpts}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Eubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj(Eubj )}(hunsigned int oasz_lg2h](jt )}(hunsignedh]hunsigned}(hjEhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjEubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjEubjt )}(hinth]hint}(hjEhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjEubjm)}(h h]h }(hjEhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjEubj)}(hoasz_lg2h]hoasz_lg2}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj(Eubeh}(h]h ]h"]h$]h&]hhuh1j hjDhhhjEhKMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjDhhhjEhKMubah}(h]jDah ](jjeh"]h$]h&]jj)jhuh1jNhjEhKMhjDhhubj)}(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}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKMhjFhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhjEhKMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj7Fjj7Fjjjuh1jIhhhjAhNhNubj)}(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)}(hjAFh]h Parameters}(hjCFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Fubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKQhj;Fubjc)}(hhh](jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hj`Fh]hconst struct pt_state *pts}(hjbFhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj^Fubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKOhjZFubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjyFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuFhKOhjvFubah}(h]h ]h"]h$]h&]uh1j~hjZFubeh}(h]h ]h"]h$]h&]uh1jghjuFhKOhjWFubjh)}(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&]uh1jghjFhKQhjWFubeh}(h]h ]h"]h$]h&]uh1jbhj;Fubh)}(h **Return**h]j)}(hjFh]hReturn}(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.hhKShj;Fubh)}(h5true if the item is fully enclosed by the pts->range.h]h5true if the item is fully enclosed by the pts->range.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKShj;Fubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_range_to_index (C function)c.pt_range_to_indexhNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hunsignedh]hunsigned}(hjGhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjGhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKgubjm)}(h h]h }(hj)GhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjGhhhj(GhKgubjt )}(hinth]hint}(hj7GhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjGhhhj(GhKgubjm)}(h h]h }(hjEGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjGhhhj(GhKgubj~)}(hpt_range_to_indexh]j)}(hpt_range_to_indexh]hpt_range_to_index}(hjWGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSGubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjGhhhj(GhKgubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hjsGhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjoGubjm)}(h h]h }(hjGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjoGubj[)}(hj^h]hstruct}(hjGhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjoGubjm)}(h h]h }(hjGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjoGubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjGmodnameN classnameNj j )}j ]j )}j jYGsbc.pt_range_to_indexasbuh1hhjoGubjm)}(h h]h }(hjGhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjoGubj( )}(hj+ h]h*}(hjGhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjoGubj)}(hptsh]hpts}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoGubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjkGubah}(h]h ]h"]h$]h&]hhuh1j hjGhhhj(GhKgubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjGhhhj(GhKgubah}(h]j Gah ](jjeh"]h$]h&]jj)jhuh1jNhj(GhKghjGhhubj)}(hhh]h)}(hStarting index for an iterationh]hStarting index for an iteration}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKghjHhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhj(GhKgubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)Hjj)Hjjjuh1jIhhhjAhNhNubj)}(hz**Parameters** ``const struct pt_state *pts`` Iteration State **Return** the starting index for the iteration in pts.h](h)}(h**Parameters**h]j)}(hj3Hh]h Parameters}(hj5HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Hubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKkhj-Hubjc)}(hhh]jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hjRHh]hconst struct pt_state *pts}(hjTHhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjPHubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhhjLHubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjkHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgHhKhhjhHubah}(h]h ]h"]h$]h&]uh1j~hjLHubeh}(h]h ]h"]h$]h&]uh1jghjgHhKhhjIHubah}(h]h ]h"]h$]h&]uh1jbhj-Hubh)}(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.hhKjhj-Hubh)}(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.hhKjhj-Hubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE"pt_range_to_end_index (C function)c.pt_range_to_end_indexhNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hunsignedh]hunsigned}(hjHhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjHhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKzubjm)}(h h]h }(hjHhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjHhhhjHhKzubjt )}(hinth]hint}(hjHhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjHhhhjHhKzubjm)}(h h]h }(hjHhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjHhhhjHhKzubj~)}(hpt_range_to_end_indexh]j)}(hpt_range_to_end_indexh]hpt_range_to_end_index}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Iubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjHhhhjHhKzubj )}(h(const struct pt_state *pts)h]j )}(hconst struct pt_state *ptsh](j[)}(hj h]hconst}(hj+IhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj'Iubjm)}(h h]h }(hj8IhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj'Iubj[)}(hj^h]hstruct}(hjFIhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj'Iubjm)}(h h]h }(hjSIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj'Iubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjdIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaIubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjfImodnameN classnameNj j )}j ]j )}j jIsbc.pt_range_to_end_indexasbuh1hhj'Iubjm)}(h h]h }(hjIhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj'Iubj( )}(hj+ h]h*}(hjIhhhNhNubah}(h]h ]j4 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 hjHhhhjHhKzubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjHhhhjHhKzubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jNhjHhKzhjHhhubj)}(hhh]h)}(hEnding index iterationh]hEnding index iteration}(hjIhhhNhNubah}(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&]uh1jhjHhhhjHhKzubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1jIhhhjAhNhNubj)}(hv**Parameters** ``const struct pt_state *pts`` Iteration State **Return** the last index for the iteration in pts.h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK~hjIubjc)}(hhh]jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hj Jh]hconst struct pt_state *pts}(hj JhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjJubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK{hjJubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hj#JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhK{hj Jubah}(h]h ]h"]h$]h&]uh1j~hjJubeh}(h]h ]h"]h$]h&]uh1jghjJhK{hjJubah}(h]h ]h"]h$]h&]uh1jbhjIubh)}(h **Return**h]j)}(hjEJh]hReturn}(hjGJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCJubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK}hjIubh)}(h(the last index for the iteration in pts.h]h(the last index for the iteration in pts.}(hj[JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhK}hjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_next_entry (C function)c.pt_next_entryhNtauh1j8hjAhhhNhNubjJ)}(hhh](jO)}(h)void pt_next_entry (struct pt_state *pts)h]jU)}(h(void pt_next_entry(struct pt_state *pts)h](jt )}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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}(hjJhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjJubjm)}(h h]h }(hjJhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjJmodnameN classnameNj j )}j ]j )}j jJsbc.pt_next_entryasbuh1hhjJubjm)}(h h]h }(hjKhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjJubj( )}(hj+ h]h*}(hjKhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjJubj)}(hptsh]hpts}(hj KhhhNhNubah}(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]j}Jah ](jjeh"]h$]h&]jj)jhuh1jNhjJhKhjJhhubj)}(hhh]h)}(hAdvance pts to the next entryh]hAdvance pts to the next entry}(hjJKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjGKhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjJhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbKjjbKjjjuh1jIhhhjAhNhNubj)}(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)}(hjlKh]h Parameters}(hjnKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjKubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjfKubjc)}(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&]uh1jbhjfKubh)}(h**Description**h]j)}(hjKh]h Description}(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.hhKhjfKubh)}(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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjfKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE!for_each_pt_level_entry (C macro)c.for_each_pt_level_entryhNtauh1j8hjAhhhNhNubjJ)}(hhh](jO)}(hfor_each_pt_level_entryh]jU)}(hfor_each_pt_level_entryh]j~)}(hfor_each_pt_level_entryh]j)}(hjLh]hfor_each_pt_level_entry}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Lubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjLhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubah}(h]h ]h"]h$]h&]hhjuh1jTjjhjLhhhj"LhKubah}(h]jKah ](jjeh"]h$]h&]jj)jhuh1jNhj"LhKhjLhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjLhhhj"LhKubeh}(h]h ](jmacroeh"]h$]h&]jjjj;Ljj;Ljjjuh1jIhhhjAhNhNubh)}(h!``for_each_pt_level_entry (pts)``h]j/)}(hjALh]hfor_each_pt_level_entry (pts)}(hjCLhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hj?Lubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjAhhubj )}(h+For loop wrapper over entries in the range h]h)}(h*For loop wrapper over entries in the rangeh]h*For loop wrapper over entries in the range}(hj[LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjWLubah}(h]h ]h"]h$]h&]uh1j hjiLhKhjAhhubj)}(h**Parameters** ``pts`` Iteration State **Description** This 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](h)}(h**Parameters**h]j)}(hjvLh]h Parameters}(hjxLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtLubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjpLubjc)}(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&]uh1jbhjpLubh)}(h**Description**h]j)}(hjLh]h Description}(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.hhKhjpLubh)}(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).}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjpLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jE!pt_load_single_entry (C function)c.pt_load_single_entryhNtauh1j8hjAhhhNhNubjJ)}(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}(hjMhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjMhhhh/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&]uh1jlhjMhhhj"MhKubh)}(hhh]j)}(h pt_entry_typeh]h pt_entry_type}(hj4MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1Mubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6MmodnameN classnameNj j )}j ]j )}j pt_load_single_entrysbc.pt_load_single_entryasbuh1hhjMhhhj"MhKubjm)}(h h]h }(hjUMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjMhhhj"MhKubj~)}(hpt_load_single_entryh]j)}(hjRMh]hpt_load_single_entry}(hjgMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcMubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjMhhhj"MhKubj )}(h(struct pt_state *pts)h]j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjMhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj~Mubjm)}(h h]h }(hjMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj~Mubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjMmodnameN classnameNj j )}j ]jPMc.pt_load_single_entryasbuh1hhj~Mubjm)}(h h]h }(hjMhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj~Mubj( )}(hj+ h]h*}(hjMhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj~Mubj)}(hptsh]hpts}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~Mubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjzMubah}(h]h ]h"]h$]h&]hhuh1j hjMhhhj"MhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj Mhhhj"MhKubah}(h]jMah ](jjeh"]h$]h&]jj)jhuh1jNhj"MhKhj Mhhubj)}(hhh]h)}(h1Version of pt_load_entry() usable within a walkerh]h1Version of pt_load_entry() usable within a walker}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjNhhubah}(h]h ]h"]h$]h&]uh1jhj Mhhhj"MhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jIhhhjAhNhNubj)}(h**Parameters** ``struct pt_state *pts`` Iteration State **Description** Alternative to for_each_pt_level_entry() if the walker function uses only a single entry.h](h)}(h**Parameters**h]j)}(hj%Nh]h Parameters}(hj'NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Nubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjNubjc)}(hhh]jh)}(h)``struct pt_state *pts`` Iteration State h](jn)}(h``struct pt_state *pts``h]j/)}(hjDNh]hstruct pt_state *pts}(hjFNhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjBNubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhj>Nubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hj]NhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYNhKhjZNubah}(h]h ]h"]h$]h&]uh1j~hj>Nubeh}(h]h ]h"]h$]h&]uh1jghjYNhKhj;Nubah}(h]h ]h"]h$]h&]uh1jbhjNubh)}(h**Description**h]j)}(hjNh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}Nubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjNubh)}(hYAlternative to for_each_pt_level_entry() if the walker function uses only a single entry.h]hYAlternative to for_each_pt_level_entry() if the walker function uses only a single entry.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_top_range (C function)c.pt_top_rangehNtauh1j8hjAhhhNhNubjJ)}(hhh ](jO)}(h7struct pt_range pt_top_range (struct pt_common *common)h]jU)}(h6struct pt_range pt_top_range(struct pt_common *common)h](j[)}(hj^h]hstruct}(hjNhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjNhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKubjm)}(h h]h }(hjNhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjNhhhjNhKubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjNmodnameN classnameNj j )}j ]j )}j pt_top_rangesbc.pt_top_rangeasbuh1hhjNhhhjNhKubjm)}(h h]h }(hjOhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjNhhhjNhKubj~)}(h pt_top_rangeh]j)}(hjOh]h pt_top_range}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjNhhhjNhKubj )}(h(struct pt_common *common)h]j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hj1OhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj-Oubjm)}(h h]h }(hj>OhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj-Oubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjOOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLOubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQOmodnameN classnameNj j )}j ]jNc.pt_top_rangeasbuh1hhj-Oubjm)}(h h]h }(hjmOhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj-Oubj( )}(hj+ h]h*}(hj{OhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj-Oubj)}(hcommonh]hcommon}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Oubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj)Oubah}(h]h ]h"]h$]h&]hhuh1j hjNhhhjNhKubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjNhhhjNhKubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1jNhjNhKhjNhhubj)}(hhh]h)}(h/Return a range that spans part of the top levelh]h/Return a range that spans part of the top level}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjOhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjNhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjjjuh1jIhhhjAhNhNubj)}(h**Parameters** ``struct pt_common *common`` Table **Description** For PT_FEAT_SIGN_EXTEND this will return the lower range, and cover half the total page table. Otherwise it returns the entire page table.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjOubjc)}(hhh]jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjOh]hstruct pt_common *common}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjOubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjOubj)}(hhh]h)}(hTableh]hTable}(hj PhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhKhj Pubah}(h]h ]h"]h$]h&]uh1j~hjOubeh}(h]h ]h"]h$]h&]uh1jghjPhKhjOubah}(h]h ]h"]h$]h&]uh1jbhjOubh)}(h**Description**h]j)}(hj.Ph]h Description}(hj0PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,Pubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjOubh)}(hFor PT_FEAT_SIGN_EXTEND this will return the lower 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 lower range, and cover half the total page table. Otherwise it returns the entire page table.}(hjDPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhKhjOubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_all_range (C function)c.pt_all_rangehNtauh1j8hjAhhhNhNubjJ)}(hhh](jO)}(h7struct pt_range pt_all_range (struct pt_common *common)h]jU)}(h6struct pt_range pt_all_range(struct pt_common *common)h](j[)}(hj^h]hstruct}(hjsPhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjoPhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hjPhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjoPhhhjPhMubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjPmodnameN classnameNj j )}j ]j )}j pt_all_rangesbc.pt_all_rangeasbuh1hhjoPhhhjPhMubjm)}(h h]h }(hjPhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjoPhhhjPhMubj~)}(h pt_all_rangeh]j)}(hjPh]h pt_all_range}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjoPhhhjPhMubj )}(h(struct pt_common *common)h]j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hjPhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjPubjm)}(h h]h }(hjPhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjPubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQmodnameN classnameNj j )}j ]jPc.pt_all_rangeasbuh1hhjPubjm)}(h h]h }(hjQhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjPubj( )}(hj+ h]h*}(hj*QhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjPubj)}(hcommonh]hcommon}(hj7QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjPubah}(h]h ]h"]h$]h&]hhuh1j hjoPhhhjPhMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjkPhhhjPhMubah}(h]jfPah ](jjeh"]h$]h&]jj)jhuh1jNhjPhMhjhPhhubj)}(hhh]h)}(h/Return a range that spans the entire page tableh]h/Return a range that spans the entire page table}(hjaQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj^Qhhubah}(h]h ]h"]h$]h&]uh1jhjhPhhhjPhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjyQjjyQjjjuh1jIhhhjAhNhNubj)}(h**Parameters** ``struct pt_common *common`` Table **Description** The 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](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 hj}Qubjc)}(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&]uh1jbhj}Qubh)}(h**Description**h]j)}(hjQh]h Description}(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.hhMhj}Qubh)}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj}Qubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_upper_range (C function)c.pt_upper_rangehNtauh1j8hjAhhhNhNubjJ)}(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&]uh1jZhjRhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hj0RhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRhhhj/RhMubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjARhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Rubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCRmodnameN classnameNj j )}j ]j )}j pt_upper_rangesbc.pt_upper_rangeasbuh1hhjRhhhj/RhMubjm)}(h h]h }(hjbRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRhhhj/RhMubj~)}(hpt_upper_rangeh]j)}(hj_Rh]hpt_upper_range}(hjtRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpRubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjRhhhj/RhMubj )}(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 classnameNj j )}j ]j]Rc.pt_upper_rangeasbuh1hhjRubjm)}(h h]h }(hjRhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRubj( )}(hj+ h]h*}(hjRhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjRubj)}(hcommonh]hcommon}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjRubah}(h]h ]h"]h$]h&]hhuh1j hjRhhhj/RhMubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjRhhhj/RhMubah}(h]jRah ](jjeh"]h$]h&]jj)jhuh1jNhj/RhMhjRhhubj)}(hhh]h)}(h/Return a range that spans part of the top levelh]h/Return a range that spans part of the top level}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhj Shhubah}(h]h ]h"]h$]h&]uh1jhjRhhhj/RhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(Sjj(Sjjjuh1jIhhhjAhNhNubj)}(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)}(hj2Sh]h Parameters}(hj4ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0Subah}(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,Subjc)}(hhh]jh)}(h#``struct pt_common *common`` Table h](jn)}(h``struct pt_common *common``h]j/)}(hjQSh]hstruct pt_common *common}(hjSShhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjOSubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjKSubj)}(hhh]h)}(hTableh]hTable}(hjjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfShMhjgSubah}(h]h ]h"]h$]h&]uh1j~hjKSubeh}(h]h ]h"]h$]h&]uh1jghjfShMhjHSubah}(h]h ]h"]h$]h&]uh1jbhj,Subh)}(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.hhMhj,Subh)}(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.hhMhj,Subeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_make_range (C function)c.pt_make_rangehNtauh1j8hjAhhhNhNubjJ)}(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}(hjShhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjShhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM/ubjm)}(h h]h }(hjShhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjShhhjShM/ubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjSmodnameN classnameNj j )}j ]j )}j pt_make_rangesbc.pt_make_rangeasbuh1hhjShhhjShM/ubjm)}(h h]h }(hjThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjShhhjShM/ubj~)}(h pt_make_rangeh]j)}(hjTh]h pt_make_range}(hj#ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjShhhjShM/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}(hj>ThhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj:Tubjm)}(h h]h }(hjKThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:Tubh)}(hhh]j)}(h pt_commonh]h pt_common}(hj\ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYTubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj^TmodnameN classnameNj j )}j ]j Tc.pt_make_rangeasbuh1hhj:Tubjm)}(h h]h }(hjzThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj:Tubj( )}(hj+ h]h*}(hjThhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj:Tubj)}(hcommonh]hcommon}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:Tubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj6Tubj )}(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 classnameNj j )}j ]j Tc.pt_make_rangeasbuh1hhjTubjm)}(h h]h }(hjThhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjTubj)}(hvah]hva}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj6Tubj )}(hpt_vaddr_t last_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 classnameNj j )}j ]j Tc.pt_make_rangeasbuh1hhjTubjm)}(h h]h }(hjUhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjTubj)}(hlast_vah]hlast_va}(hj%UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj6Tubeh}(h]h ]h"]h$]h&]hhuh1j hjShhhjShM/ubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjShhhjShM/ubah}(h]jSah ](jjeh"]h$]h&]jj)jhuh1jNhjShM/hjShhubj)}(hhh]h)}(h+Return a range that spans part of the tableh]h+Return a range that spans part of the table}(hjOUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM/hjLUhhubah}(h]h ]h"]h$]h&]uh1jhjShhhjShM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgUjjgUjjjuh1jIhhhjAhNhNubj)}(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)}(hjqUh]h Parameters}(hjsUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoUubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM3hjkUubjc)}(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/)}(hjUh]h pt_vaddr_t va}(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.hhM1hjUubj)}(hhh]h)}(h Start addressh]h Start address}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM1hjUubah}(h]h ]h"]h$]h&]uh1j~hjUubeh}(h]h ]h"]h$]h&]uh1jghjUhM1hjUubjh)}(h$``pt_vaddr_t last_va`` Last address h](jn)}(h``pt_vaddr_t last_va``h]j/)}(hjVh]hpt_vaddr_t last_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.hhM2hjUubj)}(hhh]h)}(h Last addressh]h Last address}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhM2hjVubah}(h]h ]h"]h$]h&]uh1j~hjUubeh}(h]h ]h"]h$]h&]uh1jghjVhM2hjUubeh}(h]h ]h"]h$]h&]uh1jbhjkUubh)}(h**Description**h]j)}(hj=Vh]h Description}(hj?VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;Vubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM4hjkUubh)}(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.}(hjSVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM3hjkUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_init (C function) c.pt_inithNtauh1j8hjAhhhNhNubjJ)}(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&]uh1jZhj~Vhhhh/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&]uh1jlhj~VhhhjVhMVubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjVmodnameN classnameNj j )}j ]j )}j pt_initsb c.pt_initasbuh1hhj~VhhhjVhMVubjm)}(h h]h }(hjVhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj~VhhhjVhMVubj~)}(hpt_inith]j)}(hjVh]hpt_init}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj~VhhhjVhMVubj )}(hF(struct pt_range *range, unsigned int level, struct pt_table_p *table)h](j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hjVhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjVubjm)}(h h]h }(hjVhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hj WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjWmodnameN classnameNj j )}j ]jV c.pt_initasbuh1hhjVubjm)}(h h]h }(hj+WhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjVubj( )}(hj+ h]h*}(hj9WhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjVubj)}(hrangeh]hrange}(hjFWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjVubj )}(hunsigned int levelh](jt )}(hunsignedh]hunsigned}(hj_WhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj[Wubjm)}(h h]h }(hjmWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[Wubjt )}(hinth]hint}(hj{WhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj[Wubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[Wubj)}(hlevelh]hlevel}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Wubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjVubj )}(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}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjWmodnameN classnameNj j )}j ]jV c.pt_initasbuh1hhjWubjm)}(h h]h }(hjWhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjWubj( )}(hj+ h]h*}(hjWhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjWubj)}(htableh]htable}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjVubeh}(h]h ]h"]h$]h&]hhuh1j hj~VhhhjVhMVubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhjzVhhhjVhMVubah}(h]juVah ](jjeh"]h$]h&]jj)jhuh1jNhjVhMVhjwVhhubj)}(hhh]h)}(h"Initialize a pt_state on the stackh]h"Initialize a pt_state on the stack}(hj1XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMVhj.Xhhubah}(h]h ]h"]h$]h&]uh1jhjwVhhhjVhMVubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIXjjIXjjjuh1jIhhhjAhNhNubj)}(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)}(hjSXh]h Parameters}(hjUXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQXubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMZhjMXubjc)}(hhh](jh)}(h?``struct pt_range *range`` Range pointer to embed in the state h](jn)}(h``struct pt_range *range``h]j/)}(hjrXh]hstruct pt_range *range}(hjtXhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjpXubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMWhjlXubj)}(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~hjlXubeh}(h]h ]h"]h$]h&]uh1jghjXhMWhjiXubjh)}(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&]uh1jghjXhMXhjiXubjh)}(hB``struct pt_table_p *table`` Pointer to the table memory at level h](jn)}(h``struct pt_table_p *table``h]j/)}(hjXh]hstruct pt_table_p *table}(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.hhMYhjXubj)}(hhh]h)}(h$Pointer to the table memory at levelh]h$Pointer to the table memory at level}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMYhjXubah}(h]h ]h"]h$]h&]uh1j~hjXubeh}(h]h ]h"]h$]h&]uh1jghjXhMYhjiXubeh}(h]h ]h"]h$]h&]uh1jbhjMXubh)}(h**Description**h]j)}(hjYh]h Description}(hj!YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM[hjMXubh)}(hAHelper to initialize the on-stack pt_state from walker arguments.h]hAHelper to initialize the on-stack pt_state from walker arguments.}(hj5YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMZhjMXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_init_top (C function) c.pt_init_tophNtauh1j8hjAhhhNhNubjJ)}(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}(hjdYhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj`Yhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMiubjm)}(h h]h }(hjrYhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`YhhhjqYhMiubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjYmodnameN classnameNj j )}j ]j )}j pt_init_topsb c.pt_init_topasbuh1hhj`YhhhjqYhMiubjm)}(h h]h }(hjYhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj`YhhhjqYhMiubj~)}(h pt_init_toph]j)}(hjYh]h pt_init_top}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj`YhhhjqYhMiubj )}(h(struct pt_range *range)h]j )}(hstruct pt_range *rangeh](j[)}(hj^h]hstruct}(hjYhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjYubjm)}(h h]h }(hjYhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjYubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjYmodnameN classnameNj j )}j ]jY c.pt_init_topasbuh1hhjYubjm)}(h h]h }(hj ZhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjYubj( )}(hj+ h]h*}(hjZhhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjYubj)}(hrangeh]hrange}(hj(ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjYubah}(h]h ]h"]h$]h&]hhuh1j hj`YhhhjqYhMiubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj\YhhhjqYhMiubah}(h]jWYah ](jjeh"]h$]h&]jj)jhuh1jNhjqYhMihjYYhhubj)}(hhh]h)}(h"Initialize a pt_state on the stackh]h"Initialize a pt_state on the stack}(hjRZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMihjOZhhubah}(h]h ]h"]h$]h&]uh1jhjYYhhhjqYhMiubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjZjjjZjjjuh1jIhhhjAhNhNubj)}(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)}(hjtZh]h Parameters}(hjvZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrZubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMmhjnZubjc)}(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&]uh1jbhjnZubh)}(h**Description**h]j)}(hjZh]h Description}(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.hhMlhjnZubh)}(h*The pt_state points to the top most level.h]h*The pt_state points to the top most level.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMkhjnZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_descend (C function) c.pt_descendhNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hinth]hint}(hj[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj[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&]uh1jlhj[hhhj![hMwubj~)}(h pt_descendh]j)}(h pt_descendh]h pt_descend}(hj4[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0[ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj[hhhj![hMwubj )}(h3(struct pt_state *pts, void *arg, pt_level_fn_t fn)h](j )}(hstruct pt_state *ptsh](j[)}(hj^h]hstruct}(hjP[hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjL[ubjm)}(h h]h }(hj][hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjL[ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hjn[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjp[modnameN classnameNj j )}j ]j )}j j6[sb c.pt_descendasbuh1hhjL[ubjm)}(h h]h }(hj[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjL[ubj( )}(hj+ h]h*}(hj[hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjL[ubj)}(hptsh]hpts}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjH[ubj )}(h void *argh](jt )}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj[ubjm)}(h h]h }(hj[hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj[ubj( )}(hj+ h]h*}(hj[hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj[ubj)}(hargh]harg}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjH[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 reftargetj \modnameN classnameNj j )}j ]j[ c.pt_descendasbuh1hhj\ubjm)}(h h]h }(hj%\hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj\ubj)}(hfnh]hfn}(hj3\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjH[ubeh}(h]h ]h"]h$]h&]hhuh1j hj[hhhj![hMwubeh}(h]h ]h"]h$]h&]hhjuh1jTjjhj [hhhj![hMwubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jNhj![hMwhj[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.hhMwhjZ\hhubah}(h]h ]h"]h$]h&]uh1jhj[hhhj![hMwubeh}(h]h ](jfunctioneh"]h$]h&]jjjju\jju\jjjuh1jIhhhjAhNhNubj)}(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{hjy\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/)}(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.hhMzhj ]ubj)}(hhh]h)}(hWalker function to callh]hWalker function to call}(hj)]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%]hMzhj&]ubah}(h]h ]h"]h$]h&]uh1j~hj ]ubeh}(h]h ]h"]h$]h&]uh1jghj%]hMzhj\ubeh}(h]h ]h"]h$]h&]uh1jbhjy\ubh)}(h**Description**h]j)}(hjK]h]h Description}(hjM]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI]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|hjy\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.}(hja]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{hjy\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_walk_range (C function)c.pt_walk_rangehNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hinth]hint}(hj]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js 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 classnameNj j )}j ]j )}j j]sbc.pt_walk_rangeasbuh1hhj]ubjm)}(h h]h }(hj ^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj]ubj( )}(hj+ h]h*}(hj^hhhNhNubah}(h]h ]j4 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}(hjB^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?^ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjD^modnameN classnameNj j )}j ]j^c.pt_walk_rangeasbuh1hhj;^ubjm)}(h h]h }(hj`^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj;^ubj)}(hfnh]hfn}(hjn^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj]ubj )}(h void *argh](jt )}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hj^ubjm)}(h h]h }(hj^hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj^ubj( )}(hj+ h]h*}(hj^hhhNhNubah}(h]h ]j4 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^jjjuh1jIhhhjAhNhNubj)}(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)}(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.hhMhj^ubjc)}(hhh](jh)}(h)``struct pt_range *range`` Range pointer h](jn)}(h``struct pt_range *range``h]j/)}(hj_h]hstruct pt_range *range}(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)}(h Range pointerh]h Range pointer}(hj4_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0_hMhj1_ubah}(h]h ]h"]h$]h&]uh1j~hj_ubeh}(h]h ]h"]h$]h&]uh1jghj0_hMhj_ubjh)}(h-``pt_level_fn_t fn`` Walker function to call h](jn)}(h``pt_level_fn_t fn``h]j/)}(hjT_h]hpt_level_fn_t fn}(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)}(hWalker function to callh]hWalker function to call}(hjm_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji_hMhjj_ubah}(h]h ]h"]h$]h&]uh1j~hjN_ubeh}(h]h ]h"]h$]h&]uh1jghji_hMhj_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_hMhj_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&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_range_slice (C function)c.pt_range_slicehNtauh1j8hjAhhhNhNubjJ)}(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}(hj `hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj `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`hMubh)}(hhh]j)}(hpt_rangeh]hpt_range}(hj,`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)`ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj.`modnameN classnameNj j )}j ]j )}j pt_range_slicesbc.pt_range_sliceasbuh1hhj `hhhj`hMubjm)}(h h]h }(hjM`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj `hhhj`hMubj~)}(hpt_range_sliceh]j)}(hjJ`h]hpt_range_slice}(hj_`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[`ubah}(h]h ](jjeh"]h$]h&]hhuh1j}hj `hhhj`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}(hjz`hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjv`ubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjv`ubj[)}(hj^h]hstruct}(hj`hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjv`ubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjv`ubh)}(hhh]j)}(hpt_stateh]hpt_state}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNj j )}j ]jH`c.pt_range_sliceasbuh1hhjv`ubjm)}(h h]h }(hj`hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjv`ubj( )}(hj+ h]h*}(hj`hhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hjv`ubj)}(hptsh]hpts}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv`ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjr`ubj )}(hunsigned int start_indexh](jt )}(hunsignedh]hunsigned}(hjahhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjaubjm)}(h h]h }(hjahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjaubjt )}(hinth]hint}(hj!ahhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjaubjm)}(h h]h }(hj/ahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjaubj)}(h start_indexh]h start_index}(hj=ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjr`ubj )}(hunsigned int end_indexh](jt )}(hunsignedh]hunsigned}(hjVahhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjRaubjm)}(h h]h }(hjdahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRaubjt )}(hinth]hint}(hjrahhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjRaubjm)}(h h]h }(hjahhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjRaubj)}(h end_indexh]h end_index}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRaubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjr`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)}(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`hhhj`hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjajjajjjuh1jIhhhjAhNhNubj)}(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)}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjaubjc)}(hhh](jh)}(h/``const struct pt_state *pts`` Iteration State h](jn)}(h``const struct pt_state *pts``h]j/)}(hjah]hconst struct pt_state *pts}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjaubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjaubj)}(hhh]h)}(hIteration Stateh]hIteration State}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j~hjaubeh}(h]h ]h"]h$]h&]uh1jghjbhMhjaubjh)}(h7``unsigned int start_index`` Starting index within pts h](jn)}(h``unsigned int start_index``h]j/)}(hj2bh]hunsigned int start_index}(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)}(hStarting index within ptsh]hStarting index within pts}(hjKbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGbhMhjHbubah}(h]h ]h"]h$]h&]uh1j~hj,bubeh}(h]h ]h"]h$]h&]uh1jghjGbhMhjaubjh)}(h3``unsigned int end_index`` Ending index within pts h](jn)}(h``unsigned int end_index``h]j/)}(hjkbh]hunsigned int end_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)}(hEnding index within ptsh]hEnding index within pts}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjbubah}(h]h ]h"]h$]h&]uh1j~hjebubeh}(h]h ]h"]h$]h&]uh1jghjbhMhjaubeh}(h]h ]h"]h$]h&]uh1jbhjaubh)}(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.hhMhjaubh)}(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.hhMhjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEpt_top_memsize_lg2 (C function)c.pt_top_memsize_lg2hNtauh1j8hjAhhhNhNubjJ)}(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](jt )}(hunsignedh]hunsigned}(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjbhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMubjm)}(h h]h }(hjbhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjbhhhjbhMubjt )}(hinth]hint}(hjchhhNhNubah}(h]h ]j ah"]h$]h&]uh1js hjbhhhjbhMubjm)}(h h]h }(hjchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjbhhhjbhMubj~)}(hpt_top_memsize_lg2h]j)}(hpt_top_memsize_lg2h]hpt_top_memsize_lg2}(hj(chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$cubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjbhhhjbhMubj )}(h2(struct pt_common *common, uintptr_t top_of_table)h](j )}(hstruct pt_common *commonh](j[)}(hj^h]hstruct}(hjDchhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj@cubjm)}(h h]h }(hjQchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@cubh)}(hhh]j)}(h pt_commonh]h pt_common}(hjbchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_cubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjdcmodnameN classnameNj j )}j ]j )}j j*csbc.pt_top_memsize_lg2asbuh1hhj@cubjm)}(h h]h }(hjchhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhj@cubj( )}(hj+ h]h*}(hjchhhNhNubah}(h]h ]j4 ah"]h$]h&]uh1j' hj@cubj)}(hcommonh]hcommon}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@cubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj``pt_vaddr_t va`` Starting virtual address for the leaf entry h](jn)}(h``pt_vaddr_t va``h]j/)}(hjgh]h pt_vaddr_t va}(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)}(h+Starting virtual address for the leaf entryh]h+Starting virtual address for the leaf entry}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1j~hjfubeh}(h]h ]h"]h$]h&]uh1jghjghMhjfubjh)}(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/)}(hj9gh]hpt_vaddr_t last_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?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}(hjRghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNghMhjOgubah}(h]h ]h"]h$]h&]uh1j~hj3gubeh}(h]h ]h"]h$]h&]uh1jghjNghMhjfubjh)}(h=``pt_oaddr_t oa`` Starting output address for the leaf entry h](jn)}(h``pt_oaddr_t oa``h]j/)}(hjrgh]h pt_oaddr_t oa}(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*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~hjlgubeh}(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&]uh1jhjAhhhNhNubj9)}(hhh]h}(h]h ]h"]h$]h&]entries](jEPT_MAKE_LEVELS (C macro)c.PT_MAKE_LEVELShNtauh1j8hjAhhhNhNubjJ)}(hhh](jO)}(hPT_MAKE_LEVELSh]jU)}(hPT_MAKE_LEVELSh]j~)}(hPT_MAKE_LEVELSh]j)}(hjgh]hPT_MAKE_LEVELS}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]hhuh1j}hjghhhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMvubah}(h]h ]h"]h$]h&]hhjuh1jTjjhjghhhj hhMvubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jNhj hhMvhjghhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjghhhj hhMvubeh}(h]h ](jmacroeh"]h$]h&]jjjj"hjj"hjjjuh1jIhhhjAhNhNubh)}(h``PT_MAKE_LEVELS (fn, do_fn)``h]j/)}(hj(hh]hPT_MAKE_LEVELS (fn, do_fn)}(hj*hhhhNhNubah}(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.hhMxhjAhhubj )}(hBuild an unwound walker h]h)}(hBuild an unwound walkerh]hBuild an unwound walker}(hjBhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMvhj>hubah}(h]h ]h"]h$]h&]uh1j hjPhhMvhjAhhubj)}(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)}(hj]hh]h Parameters}(hj_hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[hubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMzhjWhubjc)}(hhh](jh)}(h#``fn`` Name of the walker function h](jn)}(h``fn``h]j/)}(hj|hh]hfn}(hj~hhhhNhNubah}(h]h ]h"]h$]h&]uh1j.hjzhubah}(h]h ]h"]h$]h&]uh1jmhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMwhjvhubj)}(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~hjvhubeh}(h]h ]h"]h$]h&]uh1jghjhhMwhjshubjh)}(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}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMxhjhubah}(h]h ]h"]h$]h&]uh1j~hjhubeh}(h]h ]h"]h$]h&]uh1jghjhhMxhjshubeh}(h]h ]h"]h$]h&]uh1jbhjWhubh)}(h**Description**h]j)}(hjhh]h Description}(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.hhMzhjWhubh)}(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:}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMyhjWhubj)}(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)}hjisbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhM|hjWhubh)}(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.hhMhjWhubh)}(h$Note this can produce a lot of code!h]h$Note this can produce a lot of code!}(hj3ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhh/var/lib/git/docbuild/linux/Documentation/driver-api/generic_pt:73: ./drivers/iommu/generic_pt/pt_iter.hhMhjWhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubeh}(h]iteration-helpersah ]h"]iteration helpersah$]h&]uh1hhjzhhhhhKGubh)}(hhh](h)}(hWriting a Formath]hWriting a Format}(hjTihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQihhhhhKLubh)}(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.}(hjbihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjQihhubh)}(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:}(hjpihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjQihhubj)}(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}hj~isbah}(h]h ]h"]h$]h&]hhuh1jhhhKUhjQihhubh)}(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[hjQihhubh)}(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&]uh1hhhhKahjQihhubh)}(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&]uh1hhhhKchjQihhubj)}(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&]hhuh1jhhhKfhjQihhubh)}(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&]uh1hhhhKkhjQihhubeh}(h]writing-a-formatah ]h"]writing a formatah$]h&]uh1hhjzhhhhhKLubh)}(hhh](h)}(hIOMMU Invalidation Featuresh]hIOMMU Invalidation Features}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihhhhhKpubh)}(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).}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjihhubh)}(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.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjihhubh)}(hhh](h)}(hPT_FEAT_FLUSH_RANGEh]hPT_FEAT_FLUSH_RANGE}(hj jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhKzubh)}(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.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjjhhubeh}(h]pt-feat-flush-rangeah ]h"]pt_feat_flush_rangeah$]h&]uh1hhjihhhhhKzubh)}(hhh](h)}(hPT_FEAT_FLUSH_RANGE_NO_GAPSh]hPT_FEAT_FLUSH_RANGE_NO_GAPS}(hj1jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.jhhhhhKubh)}(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.}(hj?jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj.jhhubeh}(h]pt-feat-flush-range-no-gapsah ]h"]pt_feat_flush_range_no_gapsah$]h&]uh1hhjihhhhhKubeh}(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}(jjjjgjjbjj_jjAjAjNijKijijijZjjWjj+jj(jjRjjOju nametypes}(jjjjbjjAjNijijZjj+jjRjuh}(jgjhj_jjzjAj'jGjPj9j>jf jk j j j[j`jjjjjjjjjjjj jjjjjCjHjjj j j<"jA"j%j%j(j(jc*jh*j,j,j-j-j/j/j1j1j3j3j[5j`5j7j7j8j8j:j:j6<j;<j@>jE>jK@jP@jKijAjAjAjfCjkCjDjDj GjGjHjHj}JjJjKjLjMj MjNjNjfPjkPjRjRjSjSjuVjzVjWYj\Yj[j [j]j]j`j`jbjbjdjdjgjgjijQijWjjij(jjjjOjj.ju 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.