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/gpu/xe/xe_mmmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/zh_TW/gpu/xe/xe_mmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/it_IT/gpu/xe/xe_mmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ja_JP/gpu/xe/xe_mmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ko_KR/gpu/xe/xe_mmmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/sp_SP/gpu/xe/xe_mmmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h*SPDX-License-Identifier: (GPL-2.0+ OR MIT)h]h*SPDX-License-Identifier: (GPL-2.0+ OR MIT)}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh:/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm.rsthKubhsection)}(hhh](htitle)}(hMemory Managementh]hMemory Management}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h BO managementh]h BO management}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhNhNubh paragraph)}(h8TTM manages (placement, eviction, etc...) all BOs in XE.h]h8TTM manages (placement, eviction, etc...) all BOs in XE.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK hhubeh}(h] bo-managementah ]h"] bo managementah$]h&]uh1hhhhhhNhNubh)}(hhh](h)}(h BO creationh]h BO creation}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhNhNubh)}(hCreate a chunk of memory which can be used by the GPU. Placement rules (sysmem or vram region) passed in upon creation. TTM handles placement of BO and can trigger eviction of other BOs to make space for the new BO.h]hCreate a chunk of memory which can be used by the GPU. Placement rules (sysmem or vram region) passed in upon creation. TTM handles placement of BO and can trigger eviction of other BOs to make space for the new BO.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhhubh)}(hhh](h)}(h Kernel BOsh]h Kernel BOs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(hXA kernel BO is created as part of driver load (e.g. uC firmware images, GuC ADS, etc...) or a BO created as part of a user operation which requires a kernel BO (e.g. engine state, memory for page tables, etc...). These BOs are typically mapped in the GGTT (any kernel BOs aside memory for page tables are in the GGTT), are pinned (can't move or be evicted at runtime), have a vmap (XE can access the memory via xe_map layer) and have contiguous physical memory.h]hXA kernel BO is created as part of driver load (e.g. uC firmware images, GuC ADS, etc...) or a BO created as part of a user operation which requires a kernel BO (e.g. engine state, memory for page tables, etc...). These BOs are typically mapped in the GGTT (any kernel BOs aside memory for page tables are in the GGTT), are pinned (can’t move or be evicted at runtime), have a vmap (XE can access the memory via xe_map layer) and have contiguous physical memory.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubh)}(h?More details of why kernel BOs are pinned and contiguous below.h]h?More details of why kernel BOs are pinned and contiguous below.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK!hjubeh}(h] kernel-bosah ]h"] kernel bosah$]h&]uh1hhhubh)}(hhh](h)}(hUser BOsh]hUser BOs}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhNhNubh)}(hXA user BO is created via the DRM_IOCTL_XE_GEM_CREATE IOCTL. Once it is created the BO can be mmap'd (via DRM_IOCTL_XE_GEM_MMAP_OFFSET) for user access and it can be bound for GPU access (via DRM_IOCTL_XE_VM_BIND). All user BOs are evictable and user BOs are never pinned by XE. The allocation of the backing store can be deferred from creation time until first use which is either mmap, bind, or pagefault.h]hXA user BO is created via the DRM_IOCTL_XE_GEM_CREATE IOCTL. Once it is created the BO can be mmap’d (via DRM_IOCTL_XE_GEM_MMAP_OFFSET) for user access and it can be bound for GPU access (via DRM_IOCTL_XE_VM_BIND). All user BOs are evictable and user BOs are never pinned by XE. The allocation of the backing store can be deferred from creation time until first use which is either mmap, bind, or pagefault.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK&hjJubh)}(hhh](h)}(h Private BOsh]h Private BOs}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhNhNubh)}(hXbA private BO is a user BO created with a valid VM argument passed into the create IOCTL. If a BO is private it cannot be exported via prime FD and mappings can only be created for the BO within the VM it is tied to. Lastly, the BO dma-resv slots / lock point to the VM's dma-resv slots / lock (all private BOs to a VM share common dma-resv slots / lock).h]hXdA private BO is a user BO created with a valid VM argument passed into the create IOCTL. If a BO is private it cannot be exported via prime FD and mappings can only be created for the BO within the VM it is tied to. Lastly, the BO dma-resv slots / lock point to the VM’s dma-resv slots / lock (all private BOs to a VM share common dma-resv slots / lock).}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK0hjjubeh}(h] private-bosah ]h"] private bosah$]h&]uh1hhjJubh)}(hhh](h)}(h External BOsh]h External BOs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(hXAn external BO is a user BO created with a NULL VM argument passed into the create IOCTL. An external BO can be shared with different UMDs / devices via prime FD and the BO can be mapped into multiple VMs. An external BO has its own unique dma-resv slots / lock. An external BO will be in an array of all VMs which has a mapping of the BO. This allows VMs to lookup and lock all external BOs mapped in the VM as needed.h]hXAn external BO is a user BO created with a NULL VM argument passed into the create IOCTL. An external BO can be shared with different UMDs / devices via prime FD and the BO can be mapped into multiple VMs. An external BO has its own unique dma-resv slots / lock. An external BO will be in an array of all VMs which has a mapping of the BO. This allows VMs to lookup and lock all external BOs mapped in the VM as needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK9hjubeh}(h] external-bosah ]h"] external bosah$]h&]uh1hhjJubh)}(hhh](h)}(h BO placementh]h BO placement}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(huWhen a user BO is created, a mask of valid placements is passed indicating which memory regions are considered valid.h]huWhen a user BO is created, a mask of valid placements is passed indicating which memory regions are considered valid.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKChjubh)}(hKThe memory region information is available via query uAPI (TODO: add link).h]hKThe memory region information is available via query uAPI (TODO: add link).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKFhjubeh}(h] bo-placementah ]h"] bo placementah$]h&]uh1hhjJubeh}(h]user-bosah ]h"]user bosah$]h&]uh1hhhubeh}(h] bo-creationah ]h"] bo creationah$]h&]uh1hhhhhhNhNubh)}(hhh](h)}(h BO validationh]h BO validation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(hX,BO validation (ttm_bo_validate) refers to ensuring a BO has a valid placement. If a BO was swapped to temporary storage, a validation call will trigger a move back to a valid (location where GPU can access BO) placement. Validation of a BO may evict other BOs to make room for the BO being validated.h]hX,BO validation (ttm_bo_validate) refers to ensuring a BO has a valid placement. If a BO was swapped to temporary storage, a validation call will trigger a move back to a valid (location where GPU can access BO) placement. Validation of a BO may evict other BOs to make room for the BO being validated.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKKhjubeh}(h] bo-validationah ]h"] bo validationah$]h&]uh1hhhhhhNhNubh)}(hhh](h)}(hBO eviction / movingh]hBO eviction / moving}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hNhNubh)}(hAll eviction (or in other words, moving a BO from one memory location to another) is routed through TTM with a callback into XE.h]hAll eviction (or in other words, moving a BO from one memory location to another) is routed through TTM with a callback into XE.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKThj)ubh)}(hhh](h)}(hRuntime evictionh]hRuntime eviction}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhNhNubh)}(hRuntime evictions refers to during normal operations where TTM decides it needs to move a BO. Typically this is because TTM needs to make room for another BO and the evicted BO is first BO on LRU list that is not locked.h]hRuntime evictions refers to during normal operations where TTM decides it needs to move a BO. Typically this is because TTM needs to make room for another BO and the evicted BO is first BO on LRU list that is not locked.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKZhjIubh)}(hXAn example of this is a new BO which can only be placed in VRAM but there is not space in VRAM. There could be multiple BOs which have sysmem and VRAM placement rules which currently reside in VRAM, TTM trigger a will move of one (or multiple) of these BO(s) until there is room in VRAM to place the new BO. The evicted BO(s) are valid but still need new bindings before the BO used again (exec or compute mode rebind worker).h]hXAn example of this is a new BO which can only be placed in VRAM but there is not space in VRAM. There could be multiple BOs which have sysmem and VRAM placement rules which currently reside in VRAM, TTM trigger a will move of one (or multiple) of these BO(s) until there is room in VRAM to place the new BO. The evicted BO(s) are valid but still need new bindings before the BO used again (exec or compute mode rebind worker).}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhK^hjIubh)}(hX+Another example would be, TTM can't find a BO to evict which has another valid placement. In this case TTM will evict one (or multiple) unlocked BO(s) to a temporary unreachable (invalid) placement. The evicted BO(s) are invalid and before next use need to be moved to a valid placement and rebound.h]hX-Another example would be, TTM can’t find a BO to evict which has another valid placement. In this case TTM will evict one (or multiple) unlocked BO(s) to a temporary unreachable (invalid) placement. The evicted BO(s) are invalid and before next use need to be moved to a valid placement and rebound.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKehjIubh)}(h]In both cases, moves of these BOs are scheduled behind the fences in the BO's dma-resv slots.h]h_In both cases, moves of these BOs are scheduled behind the fences in the BO’s dma-resv slots.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKjhjIubh)}(h`WW locking tries to ensures if 2 VMs use 51% of the memory forward progress is made on both VMs.h]h`WW locking tries to ensures if 2 VMs use 51% of the memory forward progress is made on both VMs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKmhjIubh)}(hRuntime eviction uses per a GT migration engine (TODO: link to migration engine doc) to do a GPU memcpy from one location to another.h]hRuntime eviction uses per a GT migration engine (TODO: link to migration engine doc) to do a GPU memcpy from one location to another.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKphjIubeh}(h]runtime-evictionah ]h"]runtime evictionah$]h&]uh1hhj)ubh)}(hhh](h)}(hRebinds after runtime evictionh]hRebinds after runtime eviction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(hXWhen BOs are moved, every mapping (VMA) of the BO needs to rebound before the BO is used again. Every VMA is added to an evicted list of its VM when the BO is moved. This is safe because of the VM locking structure (TODO: link to VM locking doc). On the next use of a VM (exec or compute mode rebind worker) the evicted VMA list is checked and rebinds are triggered. In the case of faulting VM, the rebind is done in the page fault handler.h]hXWhen BOs are moved, every mapping (VMA) of the BO needs to rebound before the BO is used again. Every VMA is added to an evicted list of its VM when the BO is moved. This is safe because of the VM locking structure (TODO: link to VM locking doc). On the next use of a VM (exec or compute mode rebind worker) the evicted VMA list is checked and rebinds are triggered. In the case of faulting VM, the rebind is done in the page fault handler.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKvhjubeh}(h]rebinds-after-runtime-evictionah ]h"]rebinds after runtime evictionah$]h&]uh1hhj)ubh)}(hhh](h)}(h!Suspend / resume eviction of VRAMh]h!Suspend / resume eviction of VRAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhNhNubh)}(hDuring device suspend / resume VRAM may lose power which means the contents of VRAM's memory is blown away. Thus BOs present in VRAM at the time of suspend must be moved to sysmem in order for their contents to be saved.h]hDuring device suspend / resume VRAM may lose power which means the contents of VRAM’s memory is blown away. Thus BOs present in VRAM at the time of suspend must be moved to sysmem in order for their contents to be saved.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubh)}(hA simple TTM call (ttm_resource_manager_evict_all) can move all non-pinned (user) BOs to sysmem. External BOs that are pinned need to be manually evicted with a simple loop + xe_bo_evict call. It gets a little trickier with kernel BOs.h]hA simple TTM call (ttm_resource_manager_evict_all) can move all non-pinned (user) BOs to sysmem. External BOs that are pinned need to be manually evicted with a simple loop + xe_bo_evict call. It gets a little trickier with kernel BOs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubh)}(hSome kernel BOs are used by the GT migration engine to do moves, thus we can't move all of the BOs via the GT migration engine. For simplity, use a TTM memcpy (CPU) to move any kernel (pinned) BO on either suspend or resume.h]hSome kernel BOs are used by the GT migration engine to do moves, thus we can’t move all of the BOs via the GT migration engine. For simplity, use a TTM memcpy (CPU) to move any kernel (pinned) BO on either suspend or resume.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubh)}(hX Some kernel BOs need to be restored to the exact same physical location. TTM makes this rather easy but the caveat is the memory must be contiguous. Again for simplity, we enforce that all kernel (pinned) BOs are contiguous and restored to the same physical location.h]hX Some kernel BOs need to be restored to the exact same physical location. TTM makes this rather easy but the caveat is the memory must be contiguous. Again for simplity, we enforce that all kernel (pinned) BOs are contiguous and restored to the same physical location.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubh)}(h?Pinned external BOs in VRAM are restored on resume via the GPU.h]h?Pinned external BOs in VRAM are restored on resume via the GPU.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjubeh}(h]suspend-resume-eviction-of-vramah ]h"]!suspend / resume eviction of vramah$]h&]uh1hhj)ubh)}(hhh](h)}(hRebinds after suspend / resumeh]hRebinds after suspend / resume}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhNhNubh)}(hMost kernel BOs have GGTT mappings which must be restored during the resume process. All user BOs are rebound after validation on their next use.h]hMost kernel BOs have GGTT mappings which must be restored during the resume process. All user BOs are rebound after validation on their next use.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjHubeh}(h]rebinds-after-suspend-resumeah ]h"]rebinds after suspend / resumeah$]h&]uh1hhj)ubeh}(h]bo-eviction-movingah ]h"]bo eviction / movingah$]h&]uh1hhhhhhNhNubh)}(hhh](h)}(h Future workh]h Future work}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhNhNubh)}(hTrim the list of BOs which is saved / restored via TTM memcpy on suspend / resume. All we really need to save / restore via TTM memcpy is the memory required for the GuC to load and the memory for the GT migrate engine to operate.h]hTrim the list of BOs which is saved / restored via TTM memcpy on suspend / resume. All we really need to save / restore via TTM memcpy is the memory required for the GuC to load and the memory for the GT migrate engine to operate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjxubh)}(hXDo not require kernel BOs to be contiguous in physical memory / restored to the same physical address on resume. In all likelihood the only memory that needs to be restored to the same physical address is memory used for page tables. All of that memory is allocated 1 page at time so the contiguous requirement isn't needed. Some work on the vmap code would need to be done if kernel BOs are not contiguous too.h]hXDo not require kernel BOs to be contiguous in physical memory / restored to the same physical address on resume. In all likelihood the only memory that needs to be restored to the same physical address is memory used for page tables. All of that memory is allocated 1 page at time so the contiguous requirement isn’t needed. Some work on the vmap code would need to be done if kernel BOs are not contiguous too.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjxubh)}(hMake some kernel BO evictable rather than pinned. An example of this would be engine state, in all likelihood if the dma-slots of these BOs where properly used rather than pinning we could safely evict + rebind these BOs as needed.h]hMake some kernel BO evictable rather than pinned. An example of this would be engine state, in all likelihood if the dma-slots of these BOs where properly used rather than pinning we could safely evict + rebind these BOs as needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjxubh)}(hSome kernel BOs do not need to be restored on resume (e.g. GuC ADS as that is repopulated on resume), add flag to mark such objects as no save / restore.h]hSome kernel BOs do not need to be restored on resume (e.g. GuC ADS as that is repopulated on resume), add flag to mark such objects as no save / restore.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:7: ./drivers/gpu/drm/xe/xe_bo_doc.hhKhjxubeh}(h] future-workah ]h"] future workah$]h&]uh1hhhhhhNhNubh)}(hhh](h)}(hGGTTh]hGGTT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK ubh)}(hX?Xe GGTT implements the support for a Global Virtual Address space that is used for resources that are accessible to privileged (i.e. kernel-mode) processes, and not tied to a specific user-level process. For example, the Graphics micro-Controller (GuC) and Display Engine (if present) utilize this Global address space.h]hX?Xe GGTT implements the support for a Global Virtual Address space that is used for resources that are accessible to privileged (i.e. kernel-mode) processes, and not tied to a specific user-level process. For example, the Graphics micro-Controller (GuC) and Display Engine (if present) utilize this Global address space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:13: ./drivers/gpu/drm/xe/xe_ggtt.chK#hjhhubh)}(hThe Global GTT (GGTT) translates from the Global virtual address to a physical address that can be accessed by HW. The GGTT is a flat, single-level table.h]hThe Global GTT (GGTT) translates from the Global virtual address to a physical address that can be accessed by HW. The GGTT is a flat, single-level table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:13: ./drivers/gpu/drm/xe/xe_ggtt.chK)hjhhubh)}(hXXe implements a simplified version of the GGTT specifically managing only a certain range of it that goes from the Write Once Protected Content Memory (WOPCM) Layout to a predefined GUC_GGTT_TOP. This approach avoids complications related to the GuC (Graphics Microcontroller) hardware limitations. The GuC address space is limited on both ends of the GGTT, because the GuC shim HW redirects accesses to those addresses to other HW areas instead of going through the GGTT. On the bottom end, the GuC can't access offsets below the WOPCM size, while on the top side the limit is fixed at GUC_GGTT_TOP. To keep things simple, instead of checking each object to see if they are accessed by GuC or not, we just exclude those areas from the allocator. Additionally, to simplify the driver load, we use the maximum WOPCM size in this logic instead of the programmed one, so we don't need to wait until the actual size to be programmed is determined (which requires FW fetch) before initializing the GGTT. These simplifications might waste space in the GGTT (about 20-25 MBs depending on the platform) but we can live with this. Another benefit of this is the GuC bootrom can't access anything below the WOPCM max size so anything the bootrom needs to access (e.g. a RSA key) needs to be placed in the GGTT above the WOPCM max size. Starting the GGTT allocations above the WOPCM max give us the correct placement for free.h]hXXe implements a simplified version of the GGTT specifically managing only a certain range of it that goes from the Write Once Protected Content Memory (WOPCM) Layout to a predefined GUC_GGTT_TOP. This approach avoids complications related to the GuC (Graphics Microcontroller) hardware limitations. The GuC address space is limited on both ends of the GGTT, because the GuC shim HW redirects accesses to those addresses to other HW areas instead of going through the GGTT. On the bottom end, the GuC can’t access offsets below the WOPCM size, while on the top side the limit is fixed at GUC_GGTT_TOP. To keep things simple, instead of checking each object to see if they are accessed by GuC or not, we just exclude those areas from the allocator. Additionally, to simplify the driver load, we use the maximum WOPCM size in this logic instead of the programmed one, so we don’t need to wait until the actual size to be programmed is determined (which requires FW fetch) before initializing the GGTT. These simplifications might waste space in the GGTT (about 20-25 MBs depending on the platform) but we can live with this. Another benefit of this is the GuC bootrom can’t access anything below the WOPCM max size so anything the bootrom needs to access (e.g. a RSA key) needs to be placed in the GGTT above the WOPCM max size. Starting the GGTT allocations above the WOPCM max give us the correct placement for free.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:13: ./drivers/gpu/drm/xe/xe_ggtt.chK,hjhhubh)}(hhh](h)}(hGGTT Internal APIh]hGGTT Internal API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlexe_ggtt (C struct) c.xe_ggtthNtauh1jhj hhhNhNubhdesc)}(hhh](hdesc_signature)}(hxe_ggtth]hdesc_signature_line)}(hstruct xe_ggtth](hdesc_sig_keyword)}(hstructh]hstruct}(hj@hhhNhNubah}(h]h ]kah"]h$]h&]uh1j>hj:hhh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKubhdesc_sig_space)}(h h]h }(hjRhhhNhNubah}(h]h ]wah"]h$]h&]uh1jPhj:hhhjOhKubh desc_name)}(hxe_ggtth]h desc_sig_name)}(hj6h]hxe_ggtt}(hjihhhNhNubah}(h]h ]nah"]h$]h&]uh1jghjcubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jahj:hhhjOhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1j8sphinx_line_type declaratorhj4hhhjOhKubah}(h]j+ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j2hjOhKhj/hhubh desc_content)}(hhh]h)}(hMain GGTT structh]hMain GGTT struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhj/hhhjOhKubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1j-hhhj hNhNubh container)}(hX**Definition**:: struct xe_ggtt { struct xe_tile *tile; u64 size; #define XE_GGTT_FLAGS_64K BIT(0); unsigned int flags; struct xe_bo *scratch; struct mutex lock; u64 __iomem *gsm; const struct xe_ggtt_pt_ops *pt_ops; struct drm_mm mm; unsigned int access_count; struct workqueue_struct *wq; }; **Members** ``tile`` Back pointer to tile where this GGTT belongs ``size`` Total size of this GGTT ``flags`` Flags for this GGTT Acceptable flags: - ``XE_GGTT_FLAGS_64K`` - if PTE size is 64K. Otherwise, regular is 4K. ``scratch`` Internal object allocation used as a scratch page ``lock`` Mutex lock to protect GGTT data ``gsm`` The iomem pointer to the actual location of the translation table located in the GSM for easy PTE manipulation ``pt_ops`` Page Table operations per platform ``mm`` The memory manager used to manage individual GGTT allocations ``access_count`` counts GGTT writes ``wq`` Dedicated unordered work queue to process node removalsh](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubh literal_block)}(hX<struct xe_ggtt { struct xe_tile *tile; u64 size; #define XE_GGTT_FLAGS_64K BIT(0); unsigned int flags; struct xe_bo *scratch; struct mutex lock; u64 __iomem *gsm; const struct xe_ggtt_pt_ops *pt_ops; struct drm_mm mm; unsigned int access_count; struct workqueue_struct *wq; };h]hX<struct xe_ggtt { struct xe_tile *tile; u64 size; #define XE_GGTT_FLAGS_64K BIT(0); unsigned int flags; struct xe_bo *scratch; struct mutex lock; u64 __iomem *gsm; const struct xe_ggtt_pt_ops *pt_ops; struct drm_mm mm; unsigned int access_count; struct workqueue_struct *wq; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK%hjubhdefinition_list)}(hhh](hdefinition_list_item)}(h6``tile`` Back pointer to tile where this GGTT belongs h](hterm)}(h``tile``h]hliteral)}(hjh]htile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubh definition)}(hhh]h)}(h,Back pointer to tile where this GGTT belongsh]h,Back pointer to tile where this GGTT belongs}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hKhj2ubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhj/hKhj ubj)}(h!``size`` Total size of this GGTT h](j)}(h``size``h]j)}(hjUh]hsize}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjOubj1)}(hhh]h)}(hTotal size of this GGTTh]hTotal size of this GGTT}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhKhjkubah}(h]h ]h"]h$]h&]uh1j0hjOubeh}(h]h ]h"]h$]h&]uh1jhjjhKhj ubj)}(hx``flags`` Flags for this GGTT Acceptable flags: - ``XE_GGTT_FLAGS_64K`` - if PTE size is 64K. Otherwise, regular is 4K. h](j)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK!hjubj1)}(hhh]h)}(hmFlags for this GGTT Acceptable flags: - ``XE_GGTT_FLAGS_64K`` - if PTE size is 64K. Otherwise, regular is 4K.h](h(Flags for this GGTT Acceptable flags: - }(hjhhhNhNubj)}(h``XE_GGTT_FLAGS_64K``h]hXE_GGTT_FLAGS_64K}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0 - if PTE size is 64K. Otherwise, regular is 4K.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhK!hj ubj)}(h>``scratch`` Internal object allocation used as a scratch page h](j)}(h ``scratch``h]j)}(hjh]hscratch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(h1Internal object allocation used as a scratch pageh]h1Internal object allocation used as a scratch page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubj)}(h)``lock`` Mutex lock to protect GGTT data h](j)}(h``lock``h]j)}(hjh]hlock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj ubj1)}(hhh]h)}(hMutex lock to protect GGTT datah]hMutex lock to protect GGTT data}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKhj)ubah}(h]h ]h"]h$]h&]uh1j0hj ubeh}(h]h ]h"]h$]h&]uh1jhj(hKhj ubj)}(hw``gsm`` The iomem pointer to the actual location of the translation table located in the GSM for easy PTE manipulation h](j)}(h``gsm``h]j)}(hjLh]hgsm}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK*hjFubj1)}(hhh]h)}(hnThe iomem pointer to the actual location of the translation table located in the GSM for easy PTE manipulationh]hnThe iomem pointer to the actual location of the translation table located in the GSM for easy PTE manipulation}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK)hjbubah}(h]h ]h"]h$]h&]uh1j0hjFubeh}(h]h ]h"]h$]h&]uh1jhjahK*hj ubj)}(h.``pt_ops`` Page Table operations per platform h](j)}(h ``pt_ops``h]j)}(hjh]hpt_ops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(h"Page Table operations per platformh]h"Page Table operations per platform}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubj)}(hE``mm`` The memory manager used to manage individual GGTT allocations h](j)}(h``mm``h]j)}(hjh]hmm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(h=The memory manager used to manage individual GGTT allocationsh]h=The memory manager used to manage individual GGTT allocations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubj)}(h$``access_count`` counts GGTT writes h](j)}(h``access_count``h]j)}(hjh]h access_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(hcounts GGTT writesh]hcounts GGTT writes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h>``wq`` Dedicated unordered work queue to process node removalsh](j)}(h``wq``h]j)}(hj1h]hwq}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj+ubj1)}(hhh]h)}(h7Dedicated unordered work queue to process node removalsh]h7Dedicated unordered work queue to process node removals}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjGubah}(h]h ]h"]h$]h&]uh1j0hj+ubeh}(h]h ]h"]h$]h&]uh1jhjFhKhj ubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubh)}(h**Description**h]j)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj hhubh)}(h]In general, each tile can contains its own Global Graphics Translation Table (GGTT) instance.h]h]In general, each tile can contains its own Global Graphics Translation Table (GGTT) instance.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_node (C struct)c.xe_ggtt_nodehNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h xe_ggtt_nodeh]j9)}(hstruct xe_ggtt_nodeh](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjhhh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjhhhjhKubjb)}(h xe_ggtt_nodeh]jh)}(hjh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j2hjhKhjhhubj)}(hhh]h)}(hA node in GGTT.h]hA node in GGTT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK7hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1j-hhhj hNhNubj)}(hX**Definition**:: struct xe_ggtt_node { struct xe_ggtt *ggtt; struct drm_mm_node base; struct work_struct delayed_removal_work; bool invalidate_on_remove; }; **Members** ``ggtt`` Back pointer to xe_ggtt where this region will be inserted at ``base`` A drm_mm_node ``delayed_removal_work`` The work struct for the delayed removal ``invalidate_on_remove`` If it needs invalidation upon removalh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK;hjubj)}(hstruct xe_ggtt_node { struct xe_ggtt *ggtt; struct drm_mm_node base; struct work_struct delayed_removal_work; bool invalidate_on_remove; };h]hstruct xe_ggtt_node { struct xe_ggtt *ggtt; struct drm_mm_node base; struct work_struct delayed_removal_work; bool invalidate_on_remove; };}hj1sbah}(h]h ]h"]h$]h&]hhuh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK=hjubh)}(h **Members**h]j)}(hjBh]hMembers}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKDhjubj )}(hhh](j)}(hG``ggtt`` Back pointer to xe_ggtt where this region will be inserted at h](j)}(h``ggtt``h]j)}(hjah]hggtt}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK>hj[ubj1)}(hhh]h)}(h=Back pointer to xe_ggtt where this region will be inserted ath]h=Back pointer to xe_ggtt where this region will be inserted at}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhK>hjwubah}(h]h ]h"]h$]h&]uh1j0hj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhK>hjXubj)}(h``base`` A drm_mm_node h](j)}(h``base``h]j)}(hjh]hbase}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(h A drm_mm_nodeh]h A drm_mm_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjXubj)}(hA``delayed_removal_work`` The work struct for the delayed removal h](j)}(h``delayed_removal_work``h]j)}(hjh]hdelayed_removal_work}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjubj1)}(hhh]h)}(h'The work struct for the delayed removalh]h'The work struct for the delayed removal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjXubj)}(h>``invalidate_on_remove`` If it needs invalidation upon removalh](j)}(h``invalidate_on_remove``h]j)}(hj h]hinvalidate_on_remove}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj ubj1)}(hhh]h)}(h%If it needs invalidation upon removalh]h%If it needs invalidation upon removal}(hj% hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj" ubah}(h]h ]h"]h$]h&]uh1j0hj ubeh}(h]h ]h"]h$]h&]uh1jhj! hKhjXubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubh)}(h**Description**h]j)}(hjO h]h Description}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj hhubh)}(hThis struct needs to be initialized (only-once) with xe_ggtt_node_init() before any node insertion, reservation, or 'ballooning'. It will, then, be finalized by either xe_ggtt_node_remove() or xe_ggtt_node_deballoon().h]hThis struct needs to be initialized (only-once) with xe_ggtt_node_init() before any node insertion, reservation, or ‘ballooning’. It will, then, be finalized by either xe_ggtt_node_remove() or xe_ggtt_node_deballoon().}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK8hj hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_pt_ops (C struct)c.xe_ggtt_pt_opshNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hxe_ggtt_pt_opsh]j9)}(hstruct xe_ggtt_pt_opsh](j?)}(hjBh]hstruct}(hj hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj hhh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhK?ubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj hhhj hK?ubjb)}(hxe_ggtt_pt_opsh]jh)}(hj h]hxe_ggtt_pt_ops}(hj hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj hhhj hK?ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj hhhj hK?ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j2hj hK?hj hhubj)}(hhh]h)}(hDGGTT Page table operations Which can vary from platform to platform.h]hDGGTT Page table operations Which can vary from platform to platform.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKIhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hK?ubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1j-hhhj hNhNubj)}(hX8**Definition**:: struct xe_ggtt_pt_ops { u64 (*pte_encode_bo)(struct xe_bo *bo, u64 bo_offset, u16 pat_index); void (*ggtt_set_pte)(struct xe_ggtt *ggtt, u64 addr, u64 pte); }; **Members** ``pte_encode_bo`` Encode PTE address for a given BO ``ggtt_set_pte`` Directly write into GGTT's PTEh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKMhj ubj)}(hstruct xe_ggtt_pt_ops { u64 (*pte_encode_bo)(struct xe_bo *bo, u64 bo_offset, u16 pat_index); void (*ggtt_set_pte)(struct xe_ggtt *ggtt, u64 addr, u64 pte); };h]hstruct xe_ggtt_pt_ops { u64 (*pte_encode_bo)(struct xe_bo *bo, u64 bo_offset, u16 pat_index); void (*ggtt_set_pte)(struct xe_ggtt *ggtt, u64 addr, u64 pte); };}hj sbah}(h]h ]h"]h$]h&]hhuh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKOhj ubh)}(h **Members**h]j)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKThj ubj )}(hhh](j)}(h4``pte_encode_bo`` Encode PTE address for a given BO h](j)}(h``pte_encode_bo``h]j)}(hj< h]h pte_encode_bo}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj: ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKMhj6 ubj1)}(hhh]h)}(h!Encode PTE address for a given BOh]h!Encode PTE address for a given BO}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ hKMhjR ubah}(h]h ]h"]h$]h&]uh1j0hj6 ubeh}(h]h ]h"]h$]h&]uh1jhjQ hKMhj3 ubj)}(h/``ggtt_set_pte`` Directly write into GGTT's PTEh](j)}(h``ggtt_set_pte``h]j)}(hju h]h ggtt_set_pte}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs ubah}(h]h ]h"]h$]h&]uh1jh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhjo ubj1)}(hhh]h)}(hDirectly write into GGTT's PTEh]h Directly write into GGTT’s PTE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:19: ./drivers/gpu/drm/xe/xe_ggtt_types.hhKhj ubah}(h]h ]h"]h$]h&]uh1j0hjo ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj3 ubeh}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_init_early (C function)c.xe_ggtt_init_earlyhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h-int xe_ggtt_init_early (struct xe_ggtt *ggtt)h]j9)}(h,int xe_ggtt_init_early(struct xe_ggtt *ggtt)h](hdesc_sig_keyword_type)}(hinth]hint}(hj hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j hj hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj hhhj hKubjb)}(hxe_ggtt_init_earlyh]jh)}(hxe_ggtt_init_earlyh]hxe_ggtt_init_early}(hj hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj hhhj hKubhdesc_parameterlist)}(h(struct xe_ggtt *ggtt)h]hdesc_parameter)}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hj hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj ubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj1 hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj. ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetj3 modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jL ASTIdentifier)}jG j sbc.xe_ggtt_init_earlyasbuh1hhj ubjQ)}(h h]h }(hjY hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj ubhdesc_sig_punctuation)}(h*h]h*}(hji hhhNhNubah}(h]h ]pah"]h$]h&]uh1jg hj ubjh)}(hggtth]hggtt}(hjx hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubah}(h]h ]h"]h$]h&]hhuh1j hj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j2hj hKhj hhubj)}(hhh]h)}(hEarly GGTT initializationh]hEarly GGTT initialization}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1j-hhhj hNhNubj)}(hX**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be initialized **Description** It allows to create new mappings usable by the GuC. Mappings are not usable by the HW engines, as it doesn't have scratch nor initial clear done to it yet. That will happen in the regular, non-early GGTT initialization. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubj )}(hhh]j)}(hA``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be initialized h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hj h]hstruct xe_ggtt *ggtt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubj1)}(hhh]h)}(h'the :c:type:`xe_ggtt` to be initializedh](hthe }(hj hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj h]hxe_ggtt}(hj hhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdoc gpu/xe/xe_mm refdomainjreftypetype refexplicitrefwarnjK jN )}jQ ]sb reftargetxe_ggttuh1hhj hKhj ubh to be initialized}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1j0hj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j)}(hjG h]h Description}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubh)}(hIt allows to create new mappings usable by the GuC. Mappings are not usable by the HW engines, as it doesn't have scratch nor initial clear done to it yet. That will happen in the regular, non-early GGTT initialization.h]hIt allows to create new mappings usable by the GuC. Mappings are not usable by the HW engines, as it doesn’t have scratch nor initial clear done to it yet. That will happen in the regular, non-early GGTT initialization.}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubh)}(h **Return**h]j)}(hjn h]hReturn}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j) xe_ggtt_node_remove (C function)c.xe_ggtt_node_removehNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hEvoid xe_ggtt_node_remove (struct xe_ggtt_node *node, bool invalidate)h]j9)}(hDvoid xe_ggtt_node_remove(struct xe_ggtt_node *node, bool invalidate)h](j )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMJubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj hhhj hMJubjb)}(hxe_ggtt_node_removeh]jh)}(hxe_ggtt_node_removeh]hxe_ggtt_node_remove}(hj hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj hhhj hMJubj )}(h,(struct xe_ggtt_node *node, bool invalidate)h](j )}(hstruct xe_ggtt_node *nodeh](j?)}(hjBh]hstruct}(hj hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj ubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj ubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hj hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj modnameN classnameNjK jN )}jQ ]jT )}jG j sbc.xe_ggtt_node_removeasbuh1hhj ubjQ)}(h h]h }(hj. hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj ubjh )}(hjk h]h*}(hj< hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj ubjh)}(hnodeh]hnode}(hjI hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubj )}(hbool invalidateh](j )}(hboolh]hbool}(hjb hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^ ubjQ)}(h h]h }(hjp hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj^ ubjh)}(h invalidateh]h invalidate}(hj~ hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj^ ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj ubeh}(h]h ]h"]h$]h&]hhuh1j hj hhhj hMJubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj hhhj hMJubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j2hj hMJhj hhubj)}(hhh]h)}(h-Remove a :c:type:`xe_ggtt_node` from the GGTTh](h Remove a }(hj hhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj h]h xe_ggtt_node}(hj hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK jN )}jQ ]j* c.xe_ggtt_node_removeasbj' xe_ggtt_nodeuh1hhj hKhj ubh from the GGTT}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMFhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMJubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be removed ``bool invalidate`` if node needs invalidation upon removalh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMJhj ubj )}(hhh](j)}(hG``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be removed h](j)}(h``struct xe_ggtt_node *node``h]j)}(hjh]hstruct xe_ggtt_node *node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMGhj ubj1)}(hhh]h)}(h(the :c:type:`xe_ggtt_node` to be removedh](hthe }(hj*hhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj4h]h xe_ggtt_node}(hj6hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhj&hMGhj*ubh to be removed}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&hMGhj'ubah}(h]h ]h"]h$]h&]uh1j0hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMGhjubj)}(h;``bool invalidate`` if node needs invalidation upon removalh](j)}(h``bool invalidate``h]j)}(hjmh]hbool invalidate}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMIhjgubj1)}(hhh]h)}(h'if node needs invalidation upon removalh]h'if node needs invalidation upon removal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMHhjubah}(h]h ]h"]h$]h&]uh1j0hjgubeh}(h]h ]h"]h$]h&]uh1jhjhMIhjubeh}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_init (C function)c.xe_ggtt_inithNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h'int xe_ggtt_init (struct xe_ggtt *ggtt)h]j9)}(h&int xe_ggtt_init(struct xe_ggtt *ggtt)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMeubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjhhhjhMeubjb)}(h xe_ggtt_inith]jh)}(h xe_ggtt_inith]h xe_ggtt_init}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjhhhjhMeubj )}(h(struct xe_ggtt *ggtt)h]j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj"hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj$modnameN classnameNjK jN )}jQ ]jT )}jG jsbc.xe_ggtt_initasbuh1hhjubjQ)}(h h]h }(hjBhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hjPhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hggtth]hggtt}(hj]hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhMeubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjhhhjhMeubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j2hjhMehjhhubj)}(hhh]h)}(h%Regular non-early GGTT initializationh]h%Regular non-early GGTT initialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM`hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMeubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be initialized **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMdhjubj )}(hhh]j)}(hA``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be initialized h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hjh]hstruct xe_ggtt *ggtt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMahjubj1)}(hhh]h)}(h'the :c:type:`xe_ggtt` to be initializedh](hthe }(hjhhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hjh]hxe_ggtt}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhjhMahjubh to be initialized}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMahjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMahjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hj&h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMchjubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMchjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)(xe_ggtt_node_insert_balloon (C function)c.xe_ggtt_node_insert_balloonhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hOint xe_ggtt_node_insert_balloon (struct xe_ggtt_node *node, u64 start, u64 end)h]j9)}(hNint xe_ggtt_node_insert_balloon(struct xe_ggtt_node *node, u64 start, u64 end)h](j )}(hinth]hint}(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjghhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hjzhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjghhhjyhMubjb)}(hxe_ggtt_node_insert_balloonh]jh)}(hxe_ggtt_node_insert_balloonh]hxe_ggtt_node_insert_balloon}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjghhhjyhMubj )}(h/(struct xe_ggtt_node *node, u64 start, u64 end)h](j )}(hstruct xe_ggtt_node *nodeh](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jT )}jG jsbc.xe_ggtt_node_insert_balloonasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hjhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(h u64 starth](h)}(hhh]jh)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jc.xe_ggtt_node_insert_balloonasbuh1hhjubjQ)}(h h]h }(hj;hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh)}(hstarth]hstart}(hjIhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(hu64 endh](h)}(hhh]jh)}(hu64h]hu64}(hjehhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjbubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjgmodnameN classnameNjK jN )}jQ ]jc.xe_ggtt_node_insert_balloonasbuh1hhj^ubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj^ubjh)}(hendh]hend}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubeh}(h]h ]h"]h$]h&]hhuh1j hjghhhjyhMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjchhhjyhMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1j2hjyhMhj`hhubj)}(hhh]h)}(h.prevent allocation of specified GGTT addressesh]h.prevent allocation of specified GGTT addresses}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(hXw**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to hold reserved GGTT node ``u64 start`` the starting GGTT address of the reserved region ``u64 end`` then end GGTT address of the reserved region **Description** Use xe_ggtt_node_remove_balloon() to release a reserved GGTT node. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj )}(hhh](j)}(hT``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to hold reserved GGTT node h](j)}(h``struct xe_ggtt_node *node``h]j)}(hjh]hstruct xe_ggtt_node *node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(h5the :c:type:`xe_ggtt_node` to hold reserved GGTT nodeh](hthe }(hjhhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hjh]h xe_ggtt_node}(hj!hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhjhMhjubh to hold reserved GGTT node}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h?``u64 start`` the starting GGTT address of the reserved region h](j)}(h ``u64 start``h]j)}(hjXh]h u64 start}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjRubj1)}(hhh]h)}(h0the starting GGTT address of the reserved regionh]h0the starting GGTT address of the reserved region}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjnubah}(h]h ]h"]h$]h&]uh1j0hjRubeh}(h]h ]h"]h$]h&]uh1jhjmhMhjubj)}(h9``u64 end`` then end GGTT address of the reserved region h](j)}(h ``u64 end``h]j)}(hjh]hu64 end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(h,then end GGTT address of the reserved regionh]h,then end GGTT address of the reserved region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(hBUse xe_ggtt_node_remove_balloon() to release a reserved GGTT node.h]hBUse xe_ggtt_node_remove_balloon() to release a reserved GGTT node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)(xe_ggtt_node_remove_balloon (C function)c.xe_ggtt_node_remove_balloonhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hhjqubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjqubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jT )}jG j[sbc.xe_ggtt_node_remove_balloonasbuh1hhjqubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjqubjh )}(hjk h]h*}(hjhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjqubjh)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjqubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjmubah}(h]h ]h"]h$]h&]hhuh1j hj4hhhjFhMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj0hhhjFhMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1j2hjFhMhj-hhubj)}(hhh]h)}(hrelease a reserved GGTT regionh]hrelease a reserved GGTT region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj-hhhjFhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` with reserved GGTT region **Description** See xe_ggtt_node_insert_balloon() for details.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj )}(hhh]j)}(hS``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` with reserved GGTT region h](j)}(h``struct xe_ggtt_node *node``h]j)}(hj9h]hstruct xe_ggtt_node *node}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj3ubj1)}(hhh]h)}(h4the :c:type:`xe_ggtt_node` with reserved GGTT regionh](hthe }(hjRhhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj\h]h xe_ggtt_node}(hj^hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhjNhMhjRubh with reserved GGTT region}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j0hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhj0ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h.See xe_ggtt_node_insert_balloon() for details.h]h.See xe_ggtt_node_insert_balloon() for details.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)'xe_ggtt_node_insert_locked (C function)c.xe_ggtt_node_insert_lockedhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h]int xe_ggtt_node_insert_locked (struct xe_ggtt_node *node, u32 size, u32 align, u32 mm_flags)h]j9)}(h\int xe_ggtt_node_insert_locked(struct xe_ggtt_node *node, u32 size, u32 align, u32 mm_flags)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjhhhjhMubjb)}(hxe_ggtt_node_insert_lockedh]jh)}(hxe_ggtt_node_insert_lockedh]hxe_ggtt_node_insert_locked}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjhhhjhMubj )}(h>(struct xe_ggtt_node *node, u32 size, u32 align, u32 mm_flags)h](j )}(hstruct xe_ggtt_node *nodeh](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hj&hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hj7hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj4ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj9modnameN classnameNjK jN )}jQ ]jT )}jG jsbc.xe_ggtt_node_insert_lockedasbuh1hhjubjQ)}(h h]h }(hjWhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hjehhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hnodeh]hnode}(hjrhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(hu32 sizeh](h)}(hhh]jh)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jSc.xe_ggtt_node_insert_lockedasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(h u32 alignh](h)}(hhh]jh)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jSc.xe_ggtt_node_insert_lockedasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh)}(halignh]halign}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(h u32 mm_flagsh](h)}(hhh]jh)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj modnameN classnameNjK jN )}jQ ]jSc.xe_ggtt_node_insert_lockedasbuh1hhjubjQ)}(h h]h }(hj<hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh)}(hmm_flagsh]hmm_flags}(hjJhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubeh}(h]h ]h"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j2hjhMhjhhubj)}(hhh]h)}(h?Locked version to insert a :c:type:`xe_ggtt_node` into the GGTTh](hLocked version to insert a }(hjthhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj~h]h xe_ggtt_node}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK jN )}jQ ]jSc.xe_ggtt_node_insert_lockedasbj' xe_ggtt_nodeuh1hhj hKhjtubh into the GGTT}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjqhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(hX**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inserted ``u32 size`` size of the node ``u32 align`` alignment constrain of the node ``u32 mm_flags`` flags to control the node behavior **Description** It cannot be called without first having called xe_ggtt_init() once. To be used in cases where ggtt->lock is already taken. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj )}(hhh](j)}(hH``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inserted h](j)}(h``struct xe_ggtt_node *node``h]j)}(hjh]hstruct xe_ggtt_node *node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(h)the :c:type:`xe_ggtt_node` to be insertedh](hthe }(hjhhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hjh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhjhMhjubh to be inserted}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``u32 size`` size of the node h](j)}(h ``u32 size``h]j)}(hj9h]hu32 size}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj3ubj1)}(hhh]h)}(hsize of the nodeh]hsize of the node}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j0hj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjubj)}(h.``u32 align`` alignment constrain of the node h](j)}(h ``u32 align``h]j)}(hjrh]h u32 align}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjlubj1)}(hhh]h)}(halignment constrain of the nodeh]halignment constrain of the node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjlubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h4``u32 mm_flags`` flags to control the node behavior h](j)}(h``u32 mm_flags``h]j)}(hjh]h u32 mm_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(h"flags to control the node behaviorh]h"flags to control the node behavior}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h{It cannot be called without first having called xe_ggtt_init() once. To be used in cases where ggtt->lock is already taken.h]h{It cannot be called without first having called xe_ggtt_init() once. To be used in cases where ggtt->lock is already taken.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h **Return**h]j)}(hj h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j) xe_ggtt_node_insert (C function)c.xe_ggtt_node_inserthNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hHint xe_ggtt_node_insert (struct xe_ggtt_node *node, u32 size, u32 align)h]j9)}(hGint xe_ggtt_node_insert(struct xe_ggtt_node *node, u32 size, u32 align)h](j )}(hinth]hint}(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjNhhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM ubjQ)}(h h]h }(hjahhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjNhhhj`hM ubjb)}(hxe_ggtt_node_inserth]jh)}(hxe_ggtt_node_inserth]hxe_ggtt_node_insert}(hjshhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjoubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjNhhhj`hM ubj )}(h0(struct xe_ggtt_node *node, u32 size, u32 align)h](j )}(hstruct xe_ggtt_node *nodeh](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jT )}jG jusbc.xe_ggtt_node_insertasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hjhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(hu32 sizeh](h)}(hhh]jh)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jc.xe_ggtt_node_insertasbuh1hhjubjQ)}(h h]h }(hj"hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh)}(hsizeh]hsize}(hj0hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubj )}(h u32 alignh](h)}(hhh]jh)}(hu32h]hu32}(hjLhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjIubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjNmodnameN classnameNjK jN )}jQ ]jc.xe_ggtt_node_insertasbuh1hhjEubjQ)}(h h]h }(hjjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjEubjh)}(halignh]halign}(hjxhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjEubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubeh}(h]h ]h"]h$]h&]hhuh1j hjNhhhj`hM ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjJhhhj`hM ubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1j2hj`hM hjGhhubj)}(hhh]h)}(h-Insert a :c:type:`xe_ggtt_node` into the GGTTh](h Insert a }(hjhhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hjh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK jN )}jQ ]jc.xe_ggtt_node_insertasbj' xe_ggtt_nodeuh1hhj hKhjubh into the GGTT}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhj`hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(hXA**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inserted ``u32 size`` size of the node ``u32 align`` alignment constrain of the node **Description** It cannot be called without first having called xe_ggtt_init() once. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj )}(hhh](j)}(hH``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inserted h](j)}(h``struct xe_ggtt_node *node``h]j)}(hj h]hstruct xe_ggtt_node *node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(h)the :c:type:`xe_ggtt_node` to be insertedh](hthe }(hj$hhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj.h]h xe_ggtt_node}(hj0hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhj hMhj$ubh to be inserted}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h``u32 size`` size of the node h](j)}(h ``u32 size``h]j)}(hjgh]hu32 size}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjaubj1)}(hhh]h)}(hsize of the nodeh]hsize of the node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1j0hjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhjubj)}(h.``u32 align`` alignment constrain of the node h](j)}(h ``u32 align``h]j)}(hjh]h u32 align}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(halignment constrain of the nodeh]halignment constrain of the node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(hDIt cannot be called without first having called xe_ggtt_init() once.h]hDIt cannot be called without first having called xe_ggtt_init() once.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_node_init (C function)c.xe_ggtt_node_inithNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h>struct xe_ggtt_node * xe_ggtt_node_init (struct xe_ggtt *ggtt)h]j9)}(hhjChhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM%ubjQ)}(h h]h }(hjUhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjChhhjThM%ubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjfhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjcubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjhmodnameN classnameNjK jN )}jQ ]jT )}jG xe_ggtt_node_initsbc.xe_ggtt_node_initasbuh1hhjChhhjThM%ubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjChhhjThM%ubjh )}(hjk h]h*}(hjhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjChhhjThM%ubjb)}(hxe_ggtt_node_inith]jh)}(hjh]hxe_ggtt_node_init}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjChhhjThM%ubj )}(h(struct xe_ggtt *ggtt)h]j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jc.xe_ggtt_node_initasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hj hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hggtth]hggtt}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjChhhjThM%ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj?hhhjThM%ubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1j2hjThM%hj<hhubj)}(hhh]h)}(h"Initialize ``xe_ggtt_node`` structh](h Initialize }(hjBhhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh struct}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj?hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhjThM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjljjljjjuh1j-hhhj hNhNubj)}(hX**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where the new node will later be inserted/reserved. **Description** This function will allocated the struct ``xe_ggtt_node`` and return it's pointer. This struct will then be freed after the node removal upon xe_ggtt_node_remove() or xe_ggtt_node_remove_balloon(). Having ``xe_ggtt_node`` struct allocated doesn't mean that the node is already allocated in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT. **Return** A pointer to ``xe_ggtt_node`` struct on success. An ERR_PTR otherwise.h](h)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjpubj )}(hhh]j)}(hc``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where the new node will later be inserted/reserved. h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hjh]hstruct xe_ggtt *ggtt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjubj1)}(hhh]h)}(hIthe :c:type:`xe_ggtt` where the new node will later be inserted/reserved.h](hthe }(hjhhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hjh]hxe_ggtt}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhjhMhjubh4 where the new node will later be inserted/reserved.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjpubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjpubh)}(hXThis function will allocated the struct ``xe_ggtt_node`` and return it's pointer. This struct will then be freed after the node removal upon xe_ggtt_node_remove() or xe_ggtt_node_remove_balloon(). Having ``xe_ggtt_node`` struct allocated doesn't mean that the node is already allocated in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT.h](h(This function will allocated the struct }(hj hhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh and return it’s pointer. This struct will then be freed after the node removal upon xe_ggtt_node_remove() or xe_ggtt_node_remove_balloon(). Having }(hj hhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh struct allocated doesn’t mean that the node is already allocated in GGTT. Only the xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), xe_ggtt_node_insert_balloon() will ensure the node is inserted or reserved in GGTT.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjpubh)}(h **Return**h]j)}(hj>h]hReturn}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM#hjpubh)}(hFA pointer to ``xe_ggtt_node`` struct on success. An ERR_PTR otherwise.h](h A pointer to }(hjThhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh) struct on success. An ERR_PTR otherwise.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM#hjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_node_fini (C function)c.xe_ggtt_node_finihNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h2void xe_ggtt_node_fini (struct xe_ggtt_node *node)h]j9)}(h1void xe_ggtt_node_fini(struct xe_ggtt_node *node)h](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM:ubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjhhhjhM:ubjb)}(hxe_ggtt_node_finih]jh)}(hxe_ggtt_node_finih]hxe_ggtt_node_fini}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjhhhjhM:ubj )}(h(struct xe_ggtt_node *node)h]j )}(hstruct xe_ggtt_node *nodeh](j?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jT )}jG jsbc.xe_ggtt_node_finiasbuh1hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hjhhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hnodeh]hnode}(hj+hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjhhhjhM:ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjhhhjhM:ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j2hjhM:hjhhubj)}(hhh]h)}(h)Forcebly finalize ``xe_ggtt_node`` structh](hForcebly finalize }(hjUhhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh struct}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM3hjRhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM:ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j-hhhj hNhNubj)}(hXZ**Parameters** ``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be freed **Description** If anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), or xe_ggtt_node_insert_balloon(); and this **node** is not going to be reused, then, this function needs to be called to free the ``xe_ggtt_node`` structh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM7hjubj )}(hhh]j)}(hE``struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be freed h](j)}(h``struct xe_ggtt_node *node``h]j)}(hjh]hstruct xe_ggtt_node *node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM4hjubj1)}(hhh]h)}(h&the :c:type:`xe_ggtt_node` to be freedh](hthe }(hjhhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hjh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhjhM4hjubh to be freed}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM4hjubah}(h]h ]h"]h$]h&]uh1j0hjubeh}(h]h ]h"]h$]h&]uh1jhjhM4hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM6hjubh)}(hIf anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), or xe_ggtt_node_insert_balloon(); and this **node** is not going to be reused, then, this function needs to be called to free the ``xe_ggtt_node`` structh](hIf anything went wrong with either xe_ggtt_node_insert(), xe_ggtt_node_insert_locked(), or xe_ggtt_node_insert_balloon(); and this }(hjhhhNhNubj)}(h**node**h]hnode}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhO is not going to be reused, then, this function needs to be called to free the }(hjhhhNhNubj)}(h``xe_ggtt_node``h]h xe_ggtt_node}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh struct}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM6hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)#xe_ggtt_node_allocated (C function)c.xe_ggtt_node_allocatedhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h=bool xe_ggtt_node_allocated (const struct xe_ggtt_node *node)h]j9)}(hhjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubj?)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjubjQ)}(h h]h }(hjhhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hjhhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjmodnameN classnameNjK jN )}jQ ]jT )}jG jsbc.xe_ggtt_node_allocatedasbuh1hhjubjQ)}(h h]h }(hj hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjubjh )}(hjk h]h*}(hj hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjubjh)}(hnodeh]hnode}(hj hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j hjkhhhj|hMEubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjghhhj|hMEubah}(h]jbah ](jjeh"]h$]h&]jj)jhuh1j2hj|hMEhjdhhubj)}(hhh]h)}(h"Check if node is allocated in GGTTh]h"Check if node is allocated in GGTT}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM@hjG hhubah}(h]h ]h"]h$]h&]uh1jhjdhhhj|hMEubeh}(h]h ](jfunctioneh"]h$]h&]jjjjb jjb jjjuh1j-hhhj hNhNubj)}(h**Parameters** ``const struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inspected **Return** True if allocated, False otherwise.h](h)}(h**Parameters**h]j)}(hjl h]h Parameters}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMDhjf ubj )}(hhh]j)}(hO``const struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to be inspected h](j)}(h#``const struct xe_ggtt_node *node``h]j)}(hj h]hconst struct xe_ggtt_node *node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMAhj ubj1)}(hhh]h)}(h*the :c:type:`xe_ggtt_node` to be inspectedh](hthe }(hj hhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj h]h xe_ggtt_node}(hj hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhj hMAhj ubh to be inspected}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMAhj ubah}(h]h ]h"]h$]h&]uh1j0hj ubeh}(h]h ]h"]h$]h&]uh1jhj hMAhj ubah}(h]h ]h"]h$]h&]uh1j hjf ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMChjf ubh)}(h#True if allocated, False otherwise.h]h#True if allocated, False otherwise.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMChjf ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_map_bo (C function)c.xe_ggtt_map_bohNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hhjg!ubjQ)}(h h]h }(hjx!hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjg!ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj!hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj!ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj!modnameN classnameNjK jN )}jQ ]jT )}jG jQ!sbc.xe_ggtt_map_boasbuh1hhjg!ubjQ)}(h h]h }(hj!hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjg!ubjh )}(hjk h]h*}(hj!hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjg!ubjh)}(hggtth]hggtt}(hj!hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjg!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc!ubj )}(hstruct xe_bo *boh](j?)}(hjBh]hstruct}(hj!hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj!ubjQ)}(h h]h }(hj!hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj!ubh)}(hhh]jh)}(hxe_boh]hxe_bo}(hj!hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj!ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj!modnameN classnameNjK jN )}jQ ]j!c.xe_ggtt_map_boasbuh1hhj!ubjQ)}(h h]h }(hj"hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj!ubjh )}(hjk h]h*}(hj'"hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj!ubjh)}(hboh]hbo}(hj4"hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc!ubeh}(h]h ]h"]h$]h&]hhuh1j hj*!hhhjhj#ubjQ)}(h h]h }(hj#hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj#hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj#ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj#modnameN classnameNjK jN )}jQ ]jT )}jG j#sbc.xe_ggtt_insert_bo_atasbuh1hhj#ubjQ)}(h h]h }(hj#hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#ubjh )}(hjk h]h*}(hj$hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj#ubjh)}(hggtth]hggtt}(hj$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj#ubj )}(hstruct xe_bo *boh](j?)}(hjBh]hstruct}(hj'$hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj#$ubjQ)}(h h]h }(hj4$hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#$ubh)}(hhh]jh)}(hxe_boh]hxe_bo}(hjE$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjB$ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjG$modnameN classnameNjK jN )}jQ ]j#c.xe_ggtt_insert_bo_atasbuh1hhj#$ubjQ)}(h h]h }(hjc$hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#$ubjh )}(hjk h]h*}(hjq$hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj#$ubjh)}(hboh]hbo}(hj~$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj#$ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj#ubj )}(h u64 starth](h)}(hhh]jh)}(hu64h]hu64}(hj$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj$ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj$modnameN classnameNjK jN )}jQ ]j#c.xe_ggtt_insert_bo_atasbuh1hhj$ubjQ)}(h h]h }(hj$hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj$ubjh)}(hstarth]hstart}(hj$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj#ubj )}(hu64 endh](h)}(hhh]jh)}(hu64h]hu64}(hj$hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj$ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj$modnameN classnameNjK jN )}jQ ]j#c.xe_ggtt_insert_bo_atasbuh1hhj$ubjQ)}(h h]h }(hj%hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj$ubjh)}(hendh]hend}(hj%hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj#ubeh}(h]h ]h"]h$]h&]hhuh1j hjt#hhhj#hMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjp#hhhj#hMubah}(h]jk#ah ](jjeh"]h$]h&]jj)jhuh1j2hj#hMhjm#hhubj)}(hhh]h)}(h"Insert BO at a specific GGTT spaceh]h"Insert BO at a specific GGTT space}(hj8%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj5%hhubah}(h]h ]h"]h$]h&]uh1jhjm#hhhj#hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjP%jjP%jjjuh1j-hhhj hNhNubj)}(hXA**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where bo will be inserted ``struct xe_bo *bo`` the :c:type:`xe_bo` to be inserted ``u64 start`` address where it will be inserted ``u64 end`` end of the range where it will be inserted **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hjZ%h]h Parameters}(hj\%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX%ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjT%ubj )}(hhh](j)}(hI``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where bo will be inserted h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hjy%h]hstruct xe_ggtt *ggtt}(hj{%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw%ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjs%ubj1)}(hhh]h)}(h/the :c:type:`xe_ggtt` where bo will be insertedh](hthe }(hj%hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj%h]hxe_ggtt}(hj%hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhj%hMhj%ubh where bo will be inserted}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j0hjs%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhjp%ubj)}(h8``struct xe_bo *bo`` the :c:type:`xe_bo` to be inserted h](j)}(h``struct xe_bo *bo``h]j)}(hj%h]hstruct xe_bo *bo}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj%ubj1)}(hhh]h)}(h"the :c:type:`xe_bo` to be insertedh](hthe }(hj%hhhNhNubh)}(h:c:type:`xe_bo`h]j)}(hj%h]hxe_bo}(hj%hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_bouh1hhj%hMhj%ubh to be inserted}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j0hj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhjp%ubj)}(h0``u64 start`` address where it will be inserted h](j)}(h ``u64 start``h]j)}(hj1&h]h u64 start}(hj3&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/&ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj+&ubj1)}(hhh]h)}(h!address where it will be insertedh]h!address where it will be inserted}(hjJ&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjF&hMhjG&ubah}(h]h ]h"]h$]h&]uh1j0hj+&ubeh}(h]h ]h"]h$]h&]uh1jhjF&hMhjp%ubj)}(h7``u64 end`` end of the range where it will be inserted h](j)}(h ``u64 end``h]j)}(hjj&h]hu64 end}(hjl&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh&ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjd&ubj1)}(hhh]h)}(h*end of the range where it will be insertedh]h*end of the range where it will be inserted}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1j0hjd&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjp%ubeh}(h]h ]h"]h$]h&]uh1j hjT%ubh)}(h **Return**h]j)}(hj&h]hReturn}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjT%ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjT%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_insert_bo (C function)c.xe_ggtt_insert_bohNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h>int xe_ggtt_insert_bo (struct xe_ggtt *ggtt, struct xe_bo *bo)h]j9)}(h=int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)h](j )}(hinth]hint}(hj&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj&hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hj&hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj&hhhj&hMubjb)}(hxe_ggtt_insert_boh]jh)}(hxe_ggtt_insert_boh]hxe_ggtt_insert_bo}(hj 'hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj'ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj&hhhj&hMubj )}(h((struct xe_ggtt *ggtt, struct xe_bo *bo)h](j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hj''hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj#'ubjQ)}(h h]h }(hj4'hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#'ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hjE'hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjB'ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjG'modnameN classnameNjK jN )}jQ ]jT )}jG j 'sbc.xe_ggtt_insert_boasbuh1hhj#'ubjQ)}(h h]h }(hje'hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj#'ubjh )}(hjk h]h*}(hjs'hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj#'ubjh)}(hggtth]hggtt}(hj'hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj#'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj'ubj )}(hstruct xe_bo *boh](j?)}(hjBh]hstruct}(hj'hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj'ubjQ)}(h h]h }(hj'hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj'ubh)}(hhh]jh)}(hxe_boh]hxe_bo}(hj'hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj'ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj'modnameN classnameNjK jN )}jQ ]ja'c.xe_ggtt_insert_boasbuh1hhj'ubjQ)}(h h]h }(hj'hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj'ubjh )}(hjk h]h*}(hj'hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj'ubjh)}(hboh]hbo}(hj'hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj'ubeh}(h]h ]h"]h$]h&]hhuh1j hj&hhhj&hMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj&hhhj&hMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1j2hj&hMhj&hhubj)}(hhh]h)}(hInsert BO into GGTTh]hInsert BO into GGTT}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2(jj2(jjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where bo will be inserted ``struct xe_bo *bo`` the :c:type:`xe_bo` to be inserted **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hj<(h]h Parameters}(hj>(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:(ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj6(ubj )}(hhh](j)}(hI``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where bo will be inserted h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hj[(h]hstruct xe_ggtt *ggtt}(hj](hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY(ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjU(ubj1)}(hhh]h)}(h/the :c:type:`xe_ggtt` where bo will be insertedh](hthe }(hjt(hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj~(h]hxe_ggtt}(hj(hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj|(ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhjp(hMhjt(ubh where bo will be inserted}(hjt(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjp(hMhjq(ubah}(h]h ]h"]h$]h&]uh1j0hjU(ubeh}(h]h ]h"]h$]h&]uh1jhjp(hMhjR(ubj)}(h8``struct xe_bo *bo`` the :c:type:`xe_bo` to be inserted h](j)}(h``struct xe_bo *bo``h]j)}(hj(h]hstruct xe_bo *bo}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj(ubj1)}(hhh]h)}(h"the :c:type:`xe_bo` to be insertedh](hthe }(hj(hhhNhNubh)}(h:c:type:`xe_bo`h]j)}(hj(h]hxe_bo}(hj(hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_bouh1hhj(hMhj(ubh to be inserted}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1j0hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhjR(ubeh}(h]h ]h"]h$]h&]uh1j hj6(ubh)}(h **Return**h]j)}(hj)h]hReturn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj6(ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj+)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj6(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_remove_bo (C function)c.xe_ggtt_remove_bohNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h?void xe_ggtt_remove_bo (struct xe_ggtt *ggtt, struct xe_bo *bo)h]j9)}(h>void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)h](j )}(hvoidh]hvoid}(hjZ)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjV)hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hji)hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjV)hhhjh)hMubjb)}(hxe_ggtt_remove_boh]jh)}(hxe_ggtt_remove_boh]hxe_ggtt_remove_bo}(hj{)hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjw)ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjV)hhhjh)hMubj )}(h((struct xe_ggtt *ggtt, struct xe_bo *bo)h](j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hj)hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj)ubjQ)}(h h]h }(hj)hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj)ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj)hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj)ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj)modnameN classnameNjK jN )}jQ ]jT )}jG j})sbc.xe_ggtt_remove_boasbuh1hhj)ubjQ)}(h h]h }(hj)hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj)ubjh )}(hjk h]h*}(hj)hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj)ubjh)}(hggtth]hggtt}(hj)hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj)ubj )}(hstruct xe_bo *boh](j?)}(hjBh]hstruct}(hj *hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj*ubjQ)}(h h]h }(hj*hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj*ubh)}(hhh]jh)}(hxe_boh]hxe_bo}(hj'*hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj$*ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj)*modnameN classnameNjK jN )}jQ ]j)c.xe_ggtt_remove_boasbuh1hhj*ubjQ)}(h h]h }(hjE*hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj*ubjh )}(hjk h]h*}(hjS*hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj*ubjh)}(hboh]hbo}(hj`*hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj)ubeh}(h]h ]h"]h$]h&]hhuh1j hjV)hhhjh)hMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjR)hhhjh)hMubah}(h]jM)ah ](jjeh"]h$]h&]jj)jhuh1j2hjh)hMhjO)hhubj)}(hhh]h)}(hRemove a BO from the GGTTh]hRemove a BO from the GGTT}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj*hhubah}(h]h ]h"]h$]h&]uh1jhjO)hhhjh)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where node will be removed ``struct xe_bo *bo`` the :c:type:`xe_bo` to be removedh](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj*ubj )}(hhh](j)}(hJ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` where node will be removed h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hj*h]hstruct xe_ggtt *ggtt}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj*ubj1)}(hhh]h)}(h0the :c:type:`xe_ggtt` where node will be removedh](hthe }(hj*hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj*h]hxe_ggtt}(hj*hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhj*hMhj*ubh where node will be removed}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j0hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj*ubj)}(h6``struct xe_bo *bo`` the :c:type:`xe_bo` to be removedh](j)}(h``struct xe_bo *bo``h]j)}(hj'+h]hstruct xe_bo *bo}(hj)+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%+ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj!+ubj1)}(hhh]h)}(h!the :c:type:`xe_bo` to be removedh](hthe }(hj@+hhhNhNubh)}(h:c:type:`xe_bo`h]j)}(hjJ+h]hxe_bo}(hjL+hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjH+ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_bouh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj@+ubh to be removed}(hj@+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjg+hMhj=+ubah}(h]h ]h"]h$]h&]uh1j0hj!+ubeh}(h]h ]h"]h$]h&]uh1jhj<+hMhj*ubeh}(h]h ]h"]h$]h&]uh1j hj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)!xe_ggtt_largest_hole (C function)c.xe_ggtt_largest_holehNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hJu64 xe_ggtt_largest_hole (struct xe_ggtt *ggtt, u64 alignment, u64 *spare)h]j9)}(hIu64 xe_ggtt_largest_hole(struct xe_ggtt *ggtt, u64 alignment, u64 *spare)h](h)}(hhh]jh)}(hu64h]hu64}(hj+hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj+ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj+modnameN classnameNjK jN )}jQ ]jT )}jG xe_ggtt_largest_holesbc.xe_ggtt_largest_holeasbuh1hhj+hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hj+hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj+hhhj+hMubjb)}(hxe_ggtt_largest_holeh]jh)}(hj+h]hxe_ggtt_largest_hole}(hj+hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj+ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj+hhhj+hMubj )}(h1(struct xe_ggtt *ggtt, u64 alignment, u64 *spare)h](j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hj+hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj+ubjQ)}(h h]h }(hj,hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj+ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj,ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj,modnameN classnameNjK jN )}jQ ]j+c.xe_ggtt_largest_holeasbuh1hhj+ubjQ)}(h h]h }(hj2,hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj+ubjh )}(hjk h]h*}(hj@,hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj+ubjh)}(hggtth]hggtt}(hjM,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubj )}(h u64 alignmenth](h)}(hhh]jh)}(hu64h]hu64}(hji,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjf,ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjk,modnameN classnameNjK jN )}jQ ]j+c.xe_ggtt_largest_holeasbuh1hhjb,ubjQ)}(h h]h }(hj,hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjb,ubjh)}(h alignmenth]h alignment}(hj,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjb,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubj )}(h u64 *spareh](h)}(hhh]jh)}(hu64h]hu64}(hj,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj,ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj,modnameN classnameNjK jN )}jQ ]j+c.xe_ggtt_largest_holeasbuh1hhj,ubjQ)}(h h]h }(hj,hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj,ubjh )}(hjk h]h*}(hj,hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj,ubjh)}(hspareh]hspare}(hj,hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubeh}(h]h ]h"]h$]h&]hhuh1j hj+hhhj+hMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj+hhhj+hMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1j2hj+hMhj+hhubj)}(hhh]h)}(hLargest GGTT holeh]hLargest GGTT hole}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj-hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj+hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,-jj,-jjjuh1j-hhhj hNhNubj)}(hX**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` that will be inspected ``u64 alignment`` minimum alignment ``u64 *spare`` If not NULL: in: desired memory size to be spared / out: Adjusted possible spare **Return** size of the largest continuous GGTT regionh](h)}(h**Parameters**h]j)}(hj6-h]h Parameters}(hj8-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4-ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj0-ubj )}(hhh](j)}(hF``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` that will be inspected h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hjU-h]hstruct xe_ggtt *ggtt}(hjW-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS-ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjO-ubj1)}(hhh]h)}(h,the :c:type:`xe_ggtt` that will be inspectedh](hthe }(hjn-hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hjx-h]hxe_ggtt}(hjz-hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhjv-ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhjj-hMhjn-ubh that will be inspected}(hjn-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjj-hMhjk-ubah}(h]h ]h"]h$]h&]uh1j0hjO-ubeh}(h]h ]h"]h$]h&]uh1jhjj-hMhjL-ubj)}(h$``u64 alignment`` minimum alignment h](j)}(h``u64 alignment``h]j)}(hj-h]h u64 alignment}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj-ubj1)}(hhh]h)}(hminimum alignmenth]hminimum alignment}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j0hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhjL-ubj)}(h```u64 *spare`` If not NULL: in: desired memory size to be spared / out: Adjusted possible spare h](j)}(h``u64 *spare``h]j)}(hj-h]h u64 *spare}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj-ubj1)}(hhh]h)}(hPIf not NULL: in: desired memory size to be spared / out: Adjusted possible spareh]hPIf not NULL: in: desired memory size to be spared / out: Adjusted possible spare}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj.ubah}(h]h ]h"]h$]h&]uh1j0hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhjL-ubeh}(h]h ]h"]h$]h&]uh1j hj0-ubh)}(h **Return**h]j)}(hj%.h]hReturn}(hj'.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#.ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj0-ubh)}(h*size of the largest continuous GGTT regionh]h*size of the largest continuous GGTT region}(hj;.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj0-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_assign (C function)c.xe_ggtt_assignhNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h?void xe_ggtt_assign (const struct xe_ggtt_node *node, u16 vfid)h]j9)}(h>void xe_ggtt_assign(const struct xe_ggtt_node *node, u16 vfid)h](j )}(hvoidh]hvoid}(hjj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjf.hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM ubjQ)}(h h]h }(hjy.hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjf.hhhjx.hM ubjb)}(hxe_ggtt_assignh]jh)}(hxe_ggtt_assignh]hxe_ggtt_assign}(hj.hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj.ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahjf.hhhjx.hM ubj )}(h+(const struct xe_ggtt_node *node, u16 vfid)h](j )}(hconst struct xe_ggtt_node *nodeh](j?)}(hjh]hconst}(hj.hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj.ubjQ)}(h h]h }(hj.hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj.ubj?)}(hjBh]hstruct}(hj.hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj.ubjQ)}(h h]h }(hj.hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj.ubh)}(hhh]jh)}(h xe_ggtt_nodeh]h xe_ggtt_node}(hj.hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj.ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj.modnameN classnameNjK jN )}jQ ]jT )}jG j.sbc.xe_ggtt_assignasbuh1hhj.ubjQ)}(h h]h }(hj/hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj.ubjh )}(hjk h]h*}(hj/hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj.ubjh)}(hnodeh]hnode}(hj/hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj.ubj )}(hu16 vfidh](h)}(hhh]jh)}(hu16h]hu16}(hj7/hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj4/ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj9/modnameN classnameNjK jN )}jQ ]j.c.xe_ggtt_assignasbuh1hhj0/ubjQ)}(h h]h }(hjU/hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj0/ubjh)}(hvfidh]hvfid}(hjc/hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj0/ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj.ubeh}(h]h ]h"]h$]h&]hhuh1j hjf.hhhjx.hM ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhjb.hhhjx.hM ubah}(h]j].ah ](jjeh"]h$]h&]jj)jhuh1j2hjx.hM hj_.hhubj)}(hhh]h)}(hassign a GGTT region to the VFh]hassign a GGTT region to the VF}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jhj_.hhhjx.hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1j-hhhj hNhNubj)}(hXI**Parameters** ``const struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to update ``u16 vfid`` the VF identifier **Description** This function is used by the PF driver to assign a GGTT region to the VF. In addition to PTE's VFID bits 11:2 also PRESENT bit 0 is set as on some platforms VFs can't modify that either.h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj/ubj )}(hhh](j)}(hI``const struct xe_ggtt_node *node`` the :c:type:`xe_ggtt_node` to update h](j)}(h#``const struct xe_ggtt_node *node``h]j)}(hj/h]hconst struct xe_ggtt_node *node}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj/ubj1)}(hhh]h)}(h$the :c:type:`xe_ggtt_node` to updateh](hthe }(hj/hhhNhNubh)}(h:c:type:`xe_ggtt_node`h]j)}(hj/h]h xe_ggtt_node}(hj/hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggtt_nodeuh1hhj/hMhj/ubh to update}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1j0hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhj/ubj)}(h``u16 vfid`` the VF identifier h](j)}(h ``u16 vfid``h]j)}(hj*0h]hu16 vfid}(hj,0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(0ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj$0ubj1)}(hhh]h)}(hthe VF identifierh]hthe VF identifier}(hjC0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?0hMhj@0ubah}(h]h ]h"]h$]h&]uh1j0hj$0ubeh}(h]h ]h"]h$]h&]uh1jhj?0hMhj/ubeh}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j)}(hje0h]h Description}(hjg0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc0ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj/ubh)}(hThis function is used by the PF driver to assign a GGTT region to the VF. In addition to PTE's VFID bits 11:2 also PRESENT bit 0 is set as on some platforms VFs can't modify that either.h]hThis function is used by the PF driver to assign a GGTT region to the VF. In addition to PTE’s VFID bits 11:2 also PRESENT bit 0 is set as on some platforms VFs can’t modify that either.}(hj{0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)xe_ggtt_dump (C function)c.xe_ggtt_dumphNtauh1jhj hhhNhNubj.)}(hhh](j3)}(h>int xe_ggtt_dump (struct xe_ggtt *ggtt, struct drm_printer *p)h]j9)}(h=int xe_ggtt_dump(struct xe_ggtt *ggtt, struct drm_printer *p)h](j )}(hinth]hint}(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj0hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMubjQ)}(h h]h }(hj0hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj0hhhj0hMubjb)}(h xe_ggtt_dumph]jh)}(h xe_ggtt_dumph]h xe_ggtt_dump}(hj0hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj0ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj0hhhj0hMubj )}(h-(struct xe_ggtt *ggtt, struct drm_printer *p)h](j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hj0hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj0ubjQ)}(h h]h }(hj0hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj0ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj1hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj1ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj1modnameN classnameNjK jN )}jQ ]jT )}jG j0sbc.xe_ggtt_dumpasbuh1hhj0ubjQ)}(h h]h }(hj%1hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj0ubjh )}(hjk h]h*}(hj31hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj0ubjh)}(hggtth]hggtt}(hj@1hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj0ubj )}(hstruct drm_printer *ph](j?)}(hjBh]hstruct}(hjY1hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjU1ubjQ)}(h h]h }(hjf1hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjU1ubh)}(hhh]jh)}(h drm_printerh]h drm_printer}(hjw1hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjt1ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjy1modnameN classnameNjK jN )}jQ ]j!1c.xe_ggtt_dumpasbuh1hhjU1ubjQ)}(h h]h }(hj1hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjU1ubjh )}(hjk h]h*}(hj1hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjU1ubjh)}(hjt h]hp}(hj1hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjU1ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj0ubeh}(h]h ]h"]h$]h&]hhuh1j hj0hhhj0hMubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj0hhhj0hMubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1j2hj0hMhj0hhubj)}(hhh]h)}(hDump GGTT for debugh]hDump GGTT for debug}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj1hhubah}(h]h ]h"]h$]h&]uh1jhj0hhhj0hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1j-hhhj hNhNubj)}(h**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be dumped ``struct drm_printer *p`` the :c:type:`drm_mm_printer` helper handle to be used to dump the information **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj1ubj )}(hhh](j)}(h<``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be dumped h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hj2h]hstruct xe_ggtt *ggtt}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj2ubj1)}(hhh]h)}(h"the :c:type:`xe_ggtt` to be dumpedh](hthe }(hj32hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj=2h]hxe_ggtt}(hj?2hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj;2ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhj/2hMhj32ubh to be dumped}(hj32hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/2hMhj02ubah}(h]h ]h"]h$]h&]uh1j0hj2ubeh}(h]h ]h"]h$]h&]uh1jhj/2hMhj2ubj)}(hh``struct drm_printer *p`` the :c:type:`drm_mm_printer` helper handle to be used to dump the information h](j)}(h``struct drm_printer *p``h]j)}(hjv2h]hstruct drm_printer *p}(hjx2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt2ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhjp2ubj1)}(hhh]h)}(hMthe :c:type:`drm_mm_printer` helper handle to be used to dump the informationh](hthe }(hj2hhhNhNubh)}(h:c:type:`drm_mm_printer`h]j)}(hj2h]hdrm_mm_printer}(hj2hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' drm_mm_printeruh1hhj2hMhj2ubh1 helper handle to be used to dump the information}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j0hjp2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj2ubeh}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h **Return**h]j)}(hj2h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj1ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j) xe_ggtt_print_holes (C function)c.xe_ggtt_print_holeshNtauh1jhj hhhNhNubj.)}(hhh](j3)}(hTu64 xe_ggtt_print_holes (struct xe_ggtt *ggtt, u64 alignment, struct drm_printer *p)h]j9)}(hSu64 xe_ggtt_print_holes(struct xe_ggtt *ggtt, u64 alignment, struct drm_printer *p)h](h)}(hhh]jh)}(hu64h]hu64}(hj3hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj3modnameN classnameNjK jN )}jQ ]jT )}jG xe_ggtt_print_holessbc.xe_ggtt_print_holesasbuh1hhj3hhhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM/ubjQ)}(h h]h }(hj>3hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj3hhhj=3hM/ubjb)}(hxe_ggtt_print_holesh]jh)}(hj:3h]hxe_ggtt_print_holes}(hjP3hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjL3ubah}(h]h ](jzj{eh"]h$]h&]hhuh1jahj3hhhj=3hM/ubj )}(h<(struct xe_ggtt *ggtt, u64 alignment, struct drm_printer *p)h](j )}(hstruct xe_ggtt *ggtth](j?)}(hjBh]hstruct}(hjk3hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hjg3ubjQ)}(h h]h }(hjx3hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjg3ubh)}(hhh]jh)}(hxe_ggtth]hxe_ggtt}(hj3hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj3modnameN classnameNjK jN )}jQ ]j83c.xe_ggtt_print_holesasbuh1hhjg3ubjQ)}(h h]h }(hj3hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhjg3ubjh )}(hjk h]h*}(hj3hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hjg3ubjh)}(hggtth]hggtt}(hj3hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghjg3ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc3ubj )}(h u64 alignmenth](h)}(hhh]jh)}(hu64h]hu64}(hj3hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj3ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetj3modnameN classnameNjK jN )}jQ ]j83c.xe_ggtt_print_holesasbuh1hhj3ubjQ)}(h h]h }(hj3hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj3ubjh)}(h alignmenth]h alignment}(hj 4hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc3ubj )}(hstruct drm_printer *ph](j?)}(hjBh]hstruct}(hj#4hhhNhNubah}(h]h ]jKah"]h$]h&]uh1j>hj4ubjQ)}(h h]h }(hj04hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj4ubh)}(hhh]jh)}(h drm_printerh]h drm_printer}(hjA4hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj>4ubah}(h]h ]h"]h$]h&] refdomainjreftypejG reftargetjC4modnameN classnameNjK jN )}jQ ]j83c.xe_ggtt_print_holesasbuh1hhj4ubjQ)}(h h]h }(hj_4hhhNhNubah}(h]h ]j]ah"]h$]h&]uh1jPhj4ubjh )}(hjk h]h*}(hjm4hhhNhNubah}(h]h ]jt ah"]h$]h&]uh1jg hj4ubjh)}(hjt h]hp}(hjz4hhhNhNubah}(h]h ]jsah"]h$]h&]uh1jghj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc3ubeh}(h]h ]h"]h$]h&]hhuh1j hj3hhhj=3hM/ubeh}(h]h ]h"]h$]h&]hhjuh1j8jjhj3hhhj=3hM/ubah}(h]j 3ah ](jjeh"]h$]h&]jj)jhuh1j2hj=3hM/hj3hhubj)}(hhh]h)}(h Print holesh]h Print holes}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM&hj4hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj=3hM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1j-hhhj hNhNubj)}(hX%**Parameters** ``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be inspected ``u64 alignment`` min alignment ``struct drm_printer *p`` the :c:type:`drm_printer` **Description** Print GGTT ranges that are available and return total size available. **Return** Total available size.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM*hj4ubj )}(hhh](j)}(h?``struct xe_ggtt *ggtt`` the :c:type:`xe_ggtt` to be inspected h](j)}(h``struct xe_ggtt *ggtt``h]j)}(hj4h]hstruct xe_ggtt *ggtt}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM'hj4ubj1)}(hhh]h)}(h%the :c:type:`xe_ggtt` to be inspectedh](hthe }(hj4hhhNhNubh)}(h:c:type:`xe_ggtt`h]j)}(hj5h]hxe_ggtt}(hj 5hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' xe_ggttuh1hhj4hM'hj4ubh to be inspected}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj4hM'hj4ubah}(h]h ]h"]h$]h&]uh1j0hj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hM'hj4ubj)}(h ``u64 alignment`` min alignment h](j)}(h``u64 alignment``h]j)}(hj@5h]h u64 alignment}(hjB5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>5ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM(hj:5ubj1)}(hhh]h)}(h min alignmenth]h min alignment}(hjY5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU5hM(hjV5ubah}(h]h ]h"]h$]h&]uh1j0hj:5ubeh}(h]h ]h"]h$]h&]uh1jhjU5hM(hj4ubj)}(h4``struct drm_printer *p`` the :c:type:`drm_printer` h](j)}(h``struct drm_printer *p``h]j)}(hjy5h]hstruct drm_printer *p}(hj{5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw5ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM)hjs5ubj1)}(hhh]h)}(hthe :c:type:`drm_printer`h](hthe }(hj5hhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hj5h]h drm_printer}(hj5hhhNhNubah}(h]h ](j jc-typeeh"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjK j$ j' drm_printeruh1hhj5hM)hj5ubeh}(h]h ]h"]h$]h&]uh1hhj5hM)hj5ubah}(h]h ]h"]h$]h&]uh1j0hjs5ubeh}(h]h ]h"]h$]h&]uh1jhj5hM)hj4ubeh}(h]h ]h"]h$]h&]uh1j hj4ubh)}(h**Description**h]j)}(hj5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM+hj4ubh)}(hEPrint GGTT ranges that are available and return total size available.h]hEPrint GGTT ranges that are available and return total size available.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM+hj4ubh)}(h **Return**h]j)}(hj5h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM-hj4ubh)}(hTotal available size.h]hTotal available size.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:22: ./drivers/gpu/drm/xe/xe_ggtt.chM-hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj hhhNhNubeh}(h]ggtt-internal-apiah ]h"]ggtt internal apiah$]h&]uh1hhjhhhhhKubeh}(h]ggttah ]h"]ggttah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hPagetable buildingh]hPagetable building}(hj96hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj66hhhhhKubh)}(hBelow we use the term "page-table" for both page-directories, containing pointers to lower level page-directories or page-tables, and level 0 page-tables that contain only page-table-entries pointing to memory pages.h]hBelow we use the term “page-table” for both page-directories, containing pointers to lower level page-directories or page-tables, and level 0 page-tables that contain only page-table-entries pointing to memory pages.}(hjG6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:28: ./drivers/gpu/drm/xe/xe_pt.chKhj66hhubh)}(hXWhen inserting an address range in an already existing page-table tree there will typically be a set of page-tables that are shared with other address ranges, and a set that are private to this address range. The set of shared page-tables can be at most two per level, and those can't be updated immediately because the entries of those page-tables may still be in use by the gpu for other mappings. Therefore when inserting entries into those, we instead stage those insertions by adding insertion data into struct xe_vm_pgtable_update structures. This data, (subtrees for the cpu and page-table-entries for the gpu) is then added in a separate commit step. CPU-data is committed while still under the vm lock, the object lock and for userptr, the notifier lock in read mode. The GPU async data is committed either by the GPU or CPU after fulfilling relevant dependencies. For non-shared page-tables (and, in fact, for shared ones that aren't existing at the time of staging), we add the data in-place without the special update structures. This private part of the page-table tree will remain disconnected from the vm page-table tree until data is committed to the shared page tables of the vm tree in the commit phase.h]hXWhen inserting an address range in an already existing page-table tree there will typically be a set of page-tables that are shared with other address ranges, and a set that are private to this address range. The set of shared page-tables can be at most two per level, and those can’t be updated immediately because the entries of those page-tables may still be in use by the gpu for other mappings. Therefore when inserting entries into those, we instead stage those insertions by adding insertion data into struct xe_vm_pgtable_update structures. This data, (subtrees for the cpu and page-table-entries for the gpu) is then added in a separate commit step. CPU-data is committed while still under the vm lock, the object lock and for userptr, the notifier lock in read mode. The GPU async data is committed either by the GPU or CPU after fulfilling relevant dependencies. For non-shared page-tables (and, in fact, for shared ones that aren’t existing at the time of staging), we add the data in-place without the special update structures. This private part of the page-table tree will remain disconnected from the vm page-table tree until data is committed to the shared page tables of the vm tree in the commit phase.}(hjV6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_mm:28: ./drivers/gpu/drm/xe/xe_pt.chKhj66hhubeh}(h]pagetable-buildingah ]h"]pagetable buildingah$]h&]uh1hhhhhhhhKubeh}(h]memory-managementah ]h"]memory managementah$]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_handlerj6error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _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}(jr6jo6hhjjjGjDjjjjjjjjj&j#jujrjjjjjEjBjmjjjjj36j06j+6j(6jj6jg6u nametypes}(jr6hjjGjjjjj&jujjjEjmjj36j+6jj6uh}(jo6hhhjhjDjjjJjjjjjjjj#jjrj)jjIjjjBjjjjHjjxj06jj(6j j+j4jjj j j j j j jjj^jcj+j0jjjEjJj:j?jjjbjgj!!j&!jk#jp#j&j&jM)jR)j+j+j].jb.j0j0j 3j3jg6j66u 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.