Fix performance regressions with TLB and add GuC support
Subsystems (4)
Mauro Carvalho Chehab
maintainercover Fix performance regressions with TLB and add GuC support
TLB invalidation is a slow operation. It should not be doing lightly, as it causes performance regressions, like this:
[178.821002] i915 0000:00:02.0: [drm] *ERROR* rcs0 TLB invalidation did not complete in 4ms!
This series contain
1) some patches that makes TLB invalidation to happen only on active, non-wedged engines, doing cache invalidation in batch and only when GT objects are exposed to userspace:
drm/i915/gt: Ignore TLB invalidations on idle engines drm/i915/gt: Only invalidate TLBs exposed to user manipulation drm/i915/gt: Skip TLB invalidations once wedged drm/i915/gt: Batch TLB invalidations
drm/i915/gt: Move TLB invalidation to its own file
2) It fixes two bugs, being the first a workaround:
drm/i915/gt: Invalidate TLB of the OA unit at TLB invalidations drm/i915: Invalidate the TLBs on each GT
drm/i915/guc: Introduce TLB_INVALIDATION_ALL action
3) It adds GuC support. Besides providing TLB invalidation on some additional hardware, this should also help serializing GuC operations with TLB invalidation:
drm/i915/guc: Introduce TLB_INVALIDATION_ALL action drm/i915/guc: Define CTB based TLB invalidation routines drm/i915: Add platform macro for selective tlb flush drm/i915: Define GuC Based TLB invalidation routines drm/i915: Add generic interface for tlb invalidation for XeHP drm/i915: Use selective tlb invalidations where supported
4) It adds the corresponding kernel-doc markups for the kAPI used for TLB invalidation.
While I could have split this into smaller pieces, I'm opting to send them altogether, in order for CI trybot to better verify what issues will be closed with this series.
---
Chris Wilson (7):
drm/i915/gt: Ignore TLB invalidations on idle engines drm/i915/gt: Invalidate TLB of the OA unit at TLB invalidations drm/i915/gt: Only invalidate TLBs exposed to user manipulation drm/i915/gt: Skip TLB invalidations once wedged drm/i915/gt: Batch TLB invalidations
drm/i915/gt: Move TLB invalidation to its own file drm/i915: Invalidate the TLBs on each GT
Mauro Carvalho Chehab (8):
drm/i915/gt: document with_intel_gt_pm_if_awake() drm/i915/gt: describe the new tlb parameter at i915_vma_resource drm/i915/guc: use kernel-doc for enum intel_guc_tlb_inval_mode drm/i915/guc: document the TLB invalidation struct members drm/i915: document tlb field at struct drm_i915_gem_object drm/i915/gt: document TLB cache invalidation functions drm/i915/guc: describe enum intel_guc_tlb_invalidation_type drm/i915/guc: document TLB cache invalidation functions
Piotr Piórkowski (1):
drm/i915/guc: Introduce TLB_INVALIDATION_ALL action
Prathap Kumar Valsan (5):
drm/i915/guc: Define CTB based TLB invalidation routines drm/i915: Add platform macro for selective tlb flush drm/i915: Define GuC Based TLB invalidation routines drm/i915: Add generic interface for tlb invalidation for XeHP drm/i915: Use selective tlb invalidations where supported
drivers/gpu/drm/i915/Makefile | 1 + .../gpu/drm/i915/gem/i915_gem_object_types.h | 6 +- drivers/gpu/drm/i915/gem/i915_gem_pages.c | 28 +- drivers/gpu/drm/i915/gt/intel_engine.h | 1 + drivers/gpu/drm/i915/gt/intel_gt.c | 125 +------- drivers/gpu/drm/i915/gt/intel_gt.h | 2 - .../gpu/drm/i915/gt/intel_gt_buffer_pool.h | 3 +- drivers/gpu/drm/i915/gt/intel_gt_defines.h | 11 + drivers/gpu/drm/i915/gt/intel_gt_pm.h | 10 + drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 + drivers/gpu/drm/i915/gt/intel_gt_types.h | 22 +- drivers/gpu/drm/i915/gt/intel_ppgtt.c | 8 +- drivers/gpu/drm/i915/gt/intel_tlb.c | 295 ++++++++++++++++++ drivers/gpu/drm/i915/gt/intel_tlb.h | 30 ++ .../gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 54 ++++ drivers/gpu/drm/i915/gt/uc/intel_guc.c | 232 ++++++++++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.h | 36 +++ drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c | 24 +- drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h | 9 + .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 91 +++++- drivers/gpu/drm/i915/i915_drv.h | 4 +- drivers/gpu/drm/i915/i915_pci.c | 1 + drivers/gpu/drm/i915/i915_vma.c | 46 ++- drivers/gpu/drm/i915/i915_vma.h | 2 + drivers/gpu/drm/i915/i915_vma_resource.c | 9 +- drivers/gpu/drm/i915/i915_vma_resource.h | 6 +- drivers/gpu/drm/i915/intel_device_info.h | 1 + 27 files changed, 910 insertions(+), 155 deletions(-) create mode 100644 drivers/gpu/drm/i915/gt/intel_gt_defines.h create mode 100644 drivers/gpu/drm/i915/gt/intel_tlb.c create mode 100644 drivers/gpu/drm/i915/gt/intel_tlb.h
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 1/21 drm/i915/gt: Ignore TLB invalidations on idle engines
From: Chris Wilson <[email protected]>
Check if the device is powered down prior to any engine activity, as, on such cases, all the TLBs were already invalidated, so an explicit TLB invalidation is not needed, thus reducing the performance regression impact due to it.
This becomes more significant with GuC, as it can only do so when the connection to the GuC is awake.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 10 ++++++---- drivers/gpu/drm/i915/gt/intel_gt.c | 17 ++++++++++------- drivers/gpu/drm/i915/gt/intel_gt_pm.h | 3 +++ 3 files changed, 19 insertions(+), 11 deletions(-)
drivers/gpu/drm/i915/gem/i915_gem_pages.c +6 -4
@@ -6,14 +6,15 @@#include <drm/drm_cache.h> +#include "gt/intel_gt.h" +#include "gt/intel_gt_pm.h" +#include "i915_drv.h" #include "i915_gem_object.h" #include "i915_scatterlist.h" #include "i915_gem_lmem.h" #include "i915_gem_mman.h" -#include "gt/intel_gt.h" -void __i915_gem_object_set_pages (struct drm_i915_gem_object *obj,struct sg_table *pages,unsigned int sg_page_sizes)
@@ -217,10 +218,11 @@ __i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)if (test_and_clear_bit (I915_BO_WAS_BOUND_BIT , &obj->flags)) {struct drm_i915_private *i915 =to_i915 (obj->base.dev); +struct intel_gt *gt =to_gt (i915);intel_wakeref_t wakeref; - with_intel_runtime_pm_if_active(&i915->runtime_pm, wakeref) -intel_gt_invalidate_tlbs (to_gt (i915)); + with_intel_gt_pm_if_awake(gt, wakeref) +intel_gt_invalidate_tlbs (gt); }return pages;
drivers/gpu/drm/i915/gt/intel_gt.c +10 -7
@@ -12,6 +12,7 @@#include "i915_drv.h" #include "intel_context.h" +#include "intel_engine_pm.h" #include "intel_engine_regs.h" #include "intel_ggtt_gmch.h" #include "intel_gt.h"
@@ -924,6 +925,7 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt)struct drm_i915_private *i915 = gt->i915;struct intel_uncore *uncore = gt->uncore;struct intel_engine_cs *engine; +intel_engine_mask_t awake, tmp;enum intel_engine_id id;const i915_reg_t *regs;unsigned int num =0 ;
@@ -947,26 +949,31 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt)GEM_TRACE ("\n" ); -assert_rpm_wakelock_held (&i915->runtime_pm); -mutex_lock (>->tlb_invalidate_lock);intel_uncore_forcewake_get (uncore,FORCEWAKE_ALL );spin_lock_irq (&uncore->lock);/* serialise invalidate with GT reset */ + awake =0 ;for_each_engine (engine, gt, id) {struct reg_and_bit rb; +if (!intel_engine_pm_is_awake (engine)) +continue ; + rb =get_reg_and_bit (engine, regs == gen8_regs, regs, num);if (!i915_mmio_reg_offset (rb.reg))continue ;intel_uncore_write_fw (uncore, rb.reg, rb.bit); + awake |= engine->mask; }spin_unlock_irq (&uncore->lock); -for_each_engine (engine, gt, id) { +for_each_engine_masked (engine, gt, awake, tmp) { +struct reg_and_bit rb; +/* * HW architecture suggest typical invalidation time at 40us, * with pessimistic cases up to 100us and a recommendation to
@@ -974,12 +981,8 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt)*/ const unsigned int timeout_us =100 ;const unsigned int timeout_ms =4 ; -struct reg_and_bit rb; rb =get_reg_and_bit (engine, regs == gen8_regs, regs, num); -if (!i915_mmio_reg_offset (rb.reg)) -continue ; - if (__intel_wait_for_register_fw(uncore, rb.reg, rb.bit, 0, timeout_us, timeout_ms,
drivers/gpu/drm/i915/gt/intel_gt_pm.h +3 -0
@@ -55,6 +55,9 @@ static inline void intel_gt_pm_might_put(struct intel_gt *gt)for (tmp =1 ,intel_gt_pm_get (gt); tmp; \ intel_gt_pm_put(gt), tmp = 0) +#define with_intel_gt_pm_if_awake (gt, wf) \ + for (wf = intel_gt_pm_get_if_awake(gt); wf; intel_gt_pm_put_async(gt), wf = 0) +static inline int intel_gt_pm_wait_for_idle (struct intel_gt *gt) {return intel_wakeref_wait_for_idle (>->wakeref);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 2/21 drm/i915/gt: document with_intel_gt_pm_if_awake()
In reply to Mauro Carvalho ChehabAdd a kernel-doc markup to document this new macro.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_gt_pm.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/i915/gt/intel_gt_pm.h +7 -0
@@ -55,6 +55,13 @@ static inline void intel_gt_pm_might_put(struct intel_gt *gt)for (tmp =1 ,intel_gt_pm_get (gt); tmp; \intel_gt_pm_put (gt), tmp =0 ) +/** +* with_intel_gt_pm_if_awake - if GT is PM awake, get a reference to prevent +* it to sleep, run some code and then put the reference away. +* +* @gt: pointer to the gt +* @wf: pointer to a temporary wakeref. + */#define with_intel_gt_pm_if_awake (gt, wf) \ for (wf = intel_gt_pm_get_if_awake(gt); wf; intel_gt_pm_put_async(gt), wf = 0)
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 3/21 drm/i915/gt: Invalidate TLB of the OA unit at TLB invalidations
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
Ensure that the TLB of the OA unit is also invalidated on gen12 HW, as just invalidating the TLB of an engine is not enough.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_gt.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/i915/gt/intel_gt.c +10 -0
@@ -11,6 +11,7 @@#include "pxp/intel_pxp.h" #include "i915_drv.h" +#include "i915_perf_oa_regs.h" #include "intel_context.h" #include "intel_engine_pm.h" #include "intel_engine_regs.h"
@@ -969,6 +970,15 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt) awake |= engine->mask; } +/* Wa_2207587034:tgl,dg1,rkl,adl-s,adl-p */ +if (awake && + (IS_TIGERLAKE (i915) || +IS_DG1 (i915) || +IS_ROCKETLAKE (i915) || +IS_ALDERLAKE_S (i915) || +IS_ALDERLAKE_P (i915))) +intel_uncore_write_fw (uncore,GEN12_OA_TLB_INV_CR ,1 ); +spin_unlock_irq (&uncore->lock);for_each_engine_masked (engine, gt, awake, tmp) {
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 4/21 drm/i915/gt: Only invalidate TLBs exposed to user manipulation
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
Don't flush TLBs when the buffer is only used in the GGTT under full control of the kernel, as there's no risk of concurrent access and stale access from prefetch.
We only need to invalidate the TLB if they are accessible by the user. That helps to reduce the performance regression introduced by TLB invalidate logic.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/i915_vma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_vma.c +2 -1
@@ -538,7 +538,8 @@ int i915_vma_bind(struct i915_vma *vma, bind_flags); } -set_bit (I915_BO_WAS_BOUND_BIT , &vma->obj->flags); +if (bind_flags &I915_VMA_LOCAL_BIND ) +set_bit (I915_BO_WAS_BOUND_BIT , &vma->obj->flags);atomic_or (bind_flags, &vma->flags);return 0 ;
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 5/21 drm/i915/gt: Skip TLB invalidations once wedged
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
Skip all further TLB invalidations once the device is wedged and had been reset, as, on such cases, it can no longer process instructions on the GPU and the user no longer has access to the TLB's in each engine.
That helps to reduce the performance regression introduced by TLB invalidate logic.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_gt.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/i915/gt/intel_gt.c +3 -0
@@ -934,6 +934,9 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt)if (I915_SELFTEST_ONLY (gt->awake == -ENODEV ))return ; +if (intel_gt_is_wedged (gt)) +return ; +if (GRAPHICS_VER (i915) ==12 ) { regs = gen12_regs; num =ARRAY_SIZE (gen12_regs);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 6/21 drm/i915/gt: Batch TLB invalidations
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
Invalidate TLB in patch, in order to reduce performance regressions.
Currently, every caller performs a full barrier around a TLB invalidation, ignoring all other invalidations that may have already removed their PTEs from the cache. As this is a synchronous operation and can be quite slow, we cause multiple threads to contend on the TLB invalidate mutex blocking userspace.
We only need to invalidate the TLB once after replacing our PTE to ensure that there is no possible continued access to the physical address before releasing our pages. By tracking a seqno for each full TLB invalidate we can quickly determine if one has been performed since rewriting the PTE, and only if necessary trigger one for ourselves.
That helps to reduce the performance regression introduced by TLB invalidate logic.
[mchehab: rebased to not require moving the code to a separate file]
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
.../gpu/drm/i915/gem/i915_gem_object_types.h | 3 +- drivers/gpu/drm/i915/gem/i915_gem_pages.c | 21 +++++--- drivers/gpu/drm/i915/gt/intel_gt.c | 53 ++++++++++++++----- drivers/gpu/drm/i915/gt/intel_gt.h | 12 ++++- drivers/gpu/drm/i915/gt/intel_gt_types.h | 18 ++++++- drivers/gpu/drm/i915/gt/intel_ppgtt.c | 8 ++- drivers/gpu/drm/i915/i915_vma.c | 34 +++++++++--- drivers/gpu/drm/i915/i915_vma.h | 1 + drivers/gpu/drm/i915/i915_vma_resource.c | 5 +- drivers/gpu/drm/i915/i915_vma_resource.h | 6 ++- 10 files changed, 125 insertions(+), 36 deletions(-)
drivers/gpu/drm/i915/gem/i915_gem_object_types.h +2 -1
@@ -335,7 +335,6 @@ struct drm_i915_gem_object {#define I915_BO_READONLY BIT(7)#define I915_TILING_QUIRK_BIT 8/* unknown swizzling; do not release! */ #define I915_BO_PROTECTED BIT(9) -#define I915_BO_WAS_BOUND_BIT 10/** * @mem_flags - Mutable placement-related flags *
@@ -616,6 +615,8 @@ struct drm_i915_gem_object {* pages were last acquired. */ bool dirty:1; + +u32 tlb; } mm;struct {
drivers/gpu/drm/i915/gem/i915_gem_pages.c +13 -8
@@ -191,6 +191,18 @@ static void unmap_object(struct drm_i915_gem_object *obj, void *ptr)vunmap (ptr); } +static void flush_tlb_invalidate (struct drm_i915_gem_object *obj) +{ +struct drm_i915_private *i915 =to_i915 (obj->base.dev); +struct intel_gt *gt =to_gt (i915); + +if (!obj->mm.tlb) +return ; + +intel_gt_invalidate_tlb (gt, obj->mm.tlb); + obj->mm.tlb =0 ; +} +struct sg_table *__i915_gem_object_unset_pages (struct drm_i915_gem_object *obj) {
@@ -216,14 +228,7 @@ __i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)__i915_gem_object_reset_page_iter (obj); obj->mm.page_sizes.phys = obj->mm.page_sizes.sg =0 ; -if (test_and_clear_bit (I915_BO_WAS_BOUND_BIT , &obj->flags)) { -struct drm_i915_private *i915 =to_i915 (obj->base.dev); -struct intel_gt *gt =to_gt (i915); -intel_wakeref_t wakeref; - - with_intel_gt_pm_if_awake(gt, wakeref) -intel_gt_invalidate_tlbs (gt); - } +flush_tlb_invalidate (obj);return pages; }
drivers/gpu/drm/i915/gt/intel_gt.c +40 -13
99 lines not on this page · raw message
drivers/gpu/drm/i915/gt/intel_gt.h +11 -1
@@ -101,6 +101,16 @@ void intel_gt_info_print(const struct intel_gt_info *info,void intel_gt_watchdog_work (struct work_struct *work); -void intel_gt_invalidate_tlbs (struct intel_gt *gt); +static inline u32 intel_gt_tlb_seqno (const struct intel_gt *gt) +{ +return seqprop_sequence (>->tlb.seqno); +} + +static inline u32 intel_gt_next_invalidate_tlb_full (const struct intel_gt *gt) +{ +return intel_gt_tlb_seqno (gt) |1 ; +} + +void intel_gt_invalidate_tlb (struct intel_gt *gt,u32 seqno);#endif /* __INTEL_GT_H__ */
drivers/gpu/drm/i915/gt/intel_gt_types.h +17 -1
@@ -11,6 +11,7 @@#include <linux/llist.h> #include <linux/mutex.h> #include <linux/notifier.h> +#include <linux/seqlock.h> #include <linux/spinlock.h> #include <linux/types.h> #include <linux/workqueue.h>
@@ -83,7 +84,22 @@ struct intel_gt {struct intel_uc uc;struct intel_gsc gsc; -struct mutex tlb_invalidate_lock; +struct { +/* Serialize global tlb invalidations */ +struct mutex invalidate_lock; + +/* +* Batch TLB invalidations +* +* After unbinding the PTE, we need to ensure the TLB +* are invalidated prior to releasing the physical pages. +* But we only need one such invalidation for all unbinds, +* so we track how many TLB invalidations have been +* performed since unbind the PTE and only emit an extra +* invalidate if no full barrier has been passed. +*/ +seqcount_mutex_t seqno; + } tlb;struct i915_wa_list wa_list;
drivers/gpu/drm/i915/gt/intel_ppgtt.c +6 -2
@@ -206,8 +206,12 @@ void ppgtt_bind_vma(struct i915_address_space *vm,void ppgtt_unbind_vma (struct i915_address_space *vm,struct i915_vma_resource *vma_res) { -if (vma_res->allocated) - vm->clear_range (vm, vma_res->start, vma_res->vma_size); +if (!vma_res->allocated) +return ; + + vm->clear_range (vm, vma_res->start, vma_res->vma_size); +if (vma_res->tlb) +vma_invalidate_tlb (vm, *vma_res->tlb); }static unsigned long pd_count (u64 size,int shift)
drivers/gpu/drm/i915/i915_vma.c +26 -8
@@ -538,9 +538,6 @@ int i915_vma_bind(struct i915_vma *vma, bind_flags); } -if (bind_flags &I915_VMA_LOCAL_BIND ) -set_bit (I915_BO_WAS_BOUND_BIT , &vma->obj->flags); -atomic_or (bind_flags, &vma->flags);return 0 ; }
@@ -1311,6 +1308,19 @@ I915_SELFTEST_EXPORT int i915_vma_get_pages(struct i915_vma *vma)return err; } +void vma_invalidate_tlb (struct i915_address_space *vm,u32 tlb) +{ +/* +* Before we release the pages that were bound by this vma, we +* must invalidate all the TLBs that may still have a reference +* back to our physical address. It only needs to be done once, +* so after updating the PTE to point away from the pages, record +* the most recent TLB invalidation seqno, and if we have not yet +* flushed the TLBs upon release, perform a full invalidation. +*/ +WRITE_ONCE (tlb,intel_gt_next_invalidate_tlb_full (vm->gt)); +} +static void __vma_put_pages (struct i915_vma *vma,unsigned int count) {/* We allocate under vma_get_pages, so beware the shrinker */
@@ -1942,7 +1952,12 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async) vma->vm->skip_pte_rewrite;trace_i915_vma_unbind (vma); - unbind_fence =i915_vma_resource_unbind (vma_res); +if (async) + unbind_fence =i915_vma_resource_unbind (vma_res, + &vma->obj->mm.tlb); +else + unbind_fence =i915_vma_resource_unbind (vma_res,NULL ); + vma->resource =NULL ; atomic_and(~(I915_VMA_BIND_MASK | I915_VMA_ERROR | I915_VMA_GGTT_WRITE),
@@ -1950,10 +1965,13 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async)i915_vma_detach (vma); -if (!async && unbind_fence) { -dma_fence_wait (unbind_fence, false); -dma_fence_put (unbind_fence); - unbind_fence =NULL ; +if (!async) { +if (unbind_fence) { +dma_fence_wait (unbind_fence, false); +dma_fence_put (unbind_fence); + unbind_fence =NULL ; + } +vma_invalidate_tlb (vma->vm, vma->obj->mm.tlb); }/*
drivers/gpu/drm/i915/i915_vma.h +1 -0
@@ -213,6 +213,7 @@ bool i915_vma_misplaced(const struct i915_vma *vma, u64 size, u64 alignment, u64 flags);void __i915_vma_set_map_and_fenceable (struct i915_vma *vma);void i915_vma_revoke_mmap (struct i915_vma *vma); +void vma_invalidate_tlb (struct i915_address_space *vm,u32 tlb);struct dma_fence *__i915_vma_evict (struct i915_vma *vma,bool async);int __i915_vma_unbind (struct i915_vma *vma);int __must_check i915_vma_unbind (struct i915_vma *vma);
drivers/gpu/drm/i915/i915_vma_resource.c +4 -1
@@ -223,10 +223,13 @@ i915_vma_resource_fence_notify(struct i915_sw_fence *fence,* Return: A refcounted pointer to a dma-fence that signals when unbinding is * complete. */ -struct dma_fence *i915_vma_resource_unbind (struct i915_vma_resource *vma_res) +struct dma_fence *i915_vma_resource_unbind (struct i915_vma_resource *vma_res, +u32 *tlb) {struct i915_address_space *vm = vma_res->vm; + vma_res->tlb = tlb; +/* Reference for the sw fence */ i915_vma_resource_get (vma_res);
drivers/gpu/drm/i915/i915_vma_resource.h +5 -1
@@ -67,6 +67,7 @@ struct i915_page_sizes {* taken when the unbind is scheduled. * @skip_pte_rewrite: During ggtt suspend and vm takedown pte rewriting * needs to be skipped for unbind. +* @tlb: pointer for obj->mm.tlb, if async unbind. Otherwise, NULL * * The lifetime of a struct i915_vma_resource is from a binding request to * the actual possible asynchronous unbind has completed.
@@ -119,6 +120,8 @@ struct i915_vma_resource { bool immediate_unbind:1; bool needs_wakeref:1; bool skip_pte_rewrite:1; + +u32 *tlb; }; bool i915_vma_resource_hold(struct i915_vma_resource *vma_res,
@@ -131,7 +134,8 @@ struct i915_vma_resource *i915_vma_resource_alloc(void);void i915_vma_resource_free (struct i915_vma_resource *vma_res); -struct dma_fence *i915_vma_resource_unbind (struct i915_vma_resource *vma_res); +struct dma_fence *i915_vma_resource_unbind (struct i915_vma_resource *vma_res, +u32 *tlb);void __i915_vma_resource_init (struct i915_vma_resource *vma_res);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 7/21 drm/i915/gt: describe the new tlb parameter at i915_vma_resource
In reply to Mauro Carvalho ChehabTLB cache invalidation can happen on two different situations:
1. synchronously, at __vma_put_pages();
2. asynchronously.
On the first case, TLB cache invalidation happens inside __vma_put_pages(). So, no need to do it later on.
However, on the second case, the pages will keep in memory until __i915_vma_evict() is called.
So, we need to store the TLB data at struct i915_vma_resource, in order to do a TLB cache invalidation before allowing userspace to re-use the same memory.
So, i915_vma_resource_unbind() has gained a new parameter in order to store the TLB data at the second case.
Document it.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/i915_vma_resource.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/i915/i915_vma_resource.c +4 -0
@@ -216,6 +216,10 @@ i915_vma_resource_fence_notify(struct i915_sw_fence *fence,/** * i915_vma_resource_unbind - Unbind a vma resource * @vma_res: The vma resource to unbind. +* @tlb: pointer to vma->obj->mm.tlb associated with the resource +* to be stored at vma_res->tlb. When not-NULL, it will be used +* to do TLB cache invalidation before freeing a VMA resource. +* used only for async unbind. * * At this point this function does little more than publish a fence that * signals immediately unless signaling is held back.
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 8/21 drm/i915/gt: Move TLB invalidation to its own file
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
Prepare for supporting more TLB invalidation scenarios by moving the current MMIO invalidation to its own file.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/gem/i915_gem_pages.c | 4 +- drivers/gpu/drm/i915/gt/intel_gt.c | 168 +------------------- drivers/gpu/drm/i915/gt/intel_gt.h | 12 -- drivers/gpu/drm/i915/gt/intel_tlb.c | 183 ++++++++++++++++++++++ drivers/gpu/drm/i915/gt/intel_tlb.h | 29 ++++ drivers/gpu/drm/i915/i915_vma.c | 1 + 7 files changed, 219 insertions(+), 179 deletions(-) create mode 100644 drivers/gpu/drm/i915/gt/intel_tlb.c create mode 100644 drivers/gpu/drm/i915/gt/intel_tlb.h
drivers/gpu/drm/i915/Makefile +1 -0
@@ -126,6 +126,7 @@ gt-y += \ gt/intel_sseu.o \ gt/intel_sseu_debugfs.o \ gt/intel_timeline.o \ + gt/intel_tlb.o \ gt/intel_workarounds.o \ gt/shmem_utils.o \ gt/sysfs_engines.o
drivers/gpu/drm/i915/gem/i915_gem_pages.c +2 -2
@@ -7,7 +7,7 @@#include <drm/drm_cache.h> #include "gt/intel_gt.h" -#include "gt/intel_gt_pm.h" +#include "gt/intel_tlb.h" #include "i915_drv.h" #include "i915_gem_object.h"
@@ -199,7 +199,7 @@ static void flush_tlb_invalidate(struct drm_i915_gem_object *obj)if (!obj->mm.tlb)return ; -intel_gt_invalidate_tlb (gt, obj->mm.tlb); +intel_gt_invalidate_tlb_full (gt, obj->mm.tlb); obj->mm.tlb =0 ; }
drivers/gpu/drm/i915/gt/intel_gt.c +3 -165
196 lines not on this page · raw message
drivers/gpu/drm/i915/gt/intel_gt.h +0 -12
@@ -101,16 +101,4 @@ void intel_gt_info_print(const struct intel_gt_info *info,void intel_gt_watchdog_work (struct work_struct *work); -static inline u32 intel_gt_tlb_seqno (const struct intel_gt *gt) -{ -return seqprop_sequence (>->tlb.seqno); -} - -static inline u32 intel_gt_next_invalidate_tlb_full (const struct intel_gt *gt) -{ -return intel_gt_tlb_seqno (gt) |1 ; -} - -void intel_gt_invalidate_tlb (struct intel_gt *gt,u32 seqno); -#endif /* __INTEL_GT_H__ */
drivers/gpu/drm/i915/gt/intel_tlb.c new file +183 -0
183 lines not on this page · raw message
drivers/gpu/drm/i915/gt/intel_tlb.h new file +29 -0
@@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: MIT */ +/* +* Copyright © 2022 Intel Corporation +*/ + +#ifndef INTEL_TLB_H +#define INTEL_TLB_H + +#include <linux/seqlock.h> +#include <linux/types.h> + +#include "intel_gt_types.h" + +void intel_gt_invalidate_tlb_full (struct intel_gt *gt,u32 seqno); + +void intel_gt_init_tlb (struct intel_gt *gt); +void intel_gt_fini_tlb (struct intel_gt *gt); + +static inline u32 intel_gt_tlb_seqno (const struct intel_gt *gt) +{ +return seqprop_sequence (>->tlb.seqno); +} + +static inline u32 intel_gt_next_invalidate_tlb_full (const struct intel_gt *gt) +{ +return intel_gt_tlb_seqno (gt) |1 ; +} + +#endif /* INTEL_TLB_H */
drivers/gpu/drm/i915/i915_vma.c +1 -0
@@ -33,6 +33,7 @@#include "gt/intel_engine_heartbeat.h" #include "gt/intel_gt.h" #include "gt/intel_gt_requests.h" +#include "gt/intel_tlb.h" #include "i915_drv.h" #include "i915_gem_evict.h"
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 9/21 drm/i915/guc: Define CTB based TLB invalidation routines
In reply to Mauro Carvalho ChehabFrom: Prathap Kumar Valsan <[email protected]>
Add routines to interface with GuC firmware for TLB invalidation.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
.../gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 35 +++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.c | 90 ++++++++++++++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.h | 13 +++ drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c | 24 ++++- drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h | 6 ++ .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 91 ++++++++++++++++++- 6 files changed, 253 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +35 -0
@@ -134,6 +134,10 @@ enum intel_guc_action {INTEL_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC =0x4601 ,INTEL_GUC_ACTION_CLIENT_SOFT_RESET =0x5507 ,INTEL_GUC_ACTION_SET_ENG_UTIL_BUFF =0x550A , +INTEL_GUC_ACTION_NOTIFY_MEMORY_CAT_ERROR =0x6000 , +INTEL_GUC_ACTION_PAGE_FAULT_NOTIFICATION =0x6001 , +INTEL_GUC_ACTION_TLB_INVALIDATION =0x7000 , +INTEL_GUC_ACTION_TLB_INVALIDATION_DONE =0x7001 ,INTEL_GUC_ACTION_STATE_CAPTURE_NOTIFICATION =0x8002 ,INTEL_GUC_ACTION_NOTIFY_FLUSH_LOG_BUFFER_TO_FILE =0x8003 , INTEL_GUC_ACTION_NOTIFY_CRASH_DUMP_POSTED = 0x8004,
@@ -177,4 +181,35 @@ enum intel_guc_state_capture_event_status {#define INTEL_GUC_STATE_CAPTURE_EVENT_STATUS_MASK 0x000000FF +#define INTEL_GUC_TLB_INVAL_TYPE_SHIFT 0 +#define INTEL_GUC_TLB_INVAL_MODE_SHIFT 8 +/* Flush PPC or SMRO caches along with TLB invalidation request */ +#define INTEL_GUC_TLB_INVAL_FLUSH_CACHE (1 << 31) + +enum intel_guc_tlb_invalidation_type { +INTEL_GUC_TLB_INVAL_GUC =0x3 , +}; + +/* +* 0: Heavy mode of Invalidation: +* The pipeline of the engine(s) for which the invalidation is targeted to is +* blocked, and all the in-flight transactions are guaranteed to be Globally +* Observed before completing the TLB invalidation +* 1: Lite mode of Invalidation: +* TLBs of the targeted engine(s) are immediately invalidated. +* In-flight transactions are NOT guaranteed to be Globally Observed before +* completing TLB invalidation. +* Light Invalidation Mode is to be used only when +* it can be guaranteed (by SW) that the address translations remain invariant +* for the in-flight transactions across the TLB invalidation. In other words, +* this mode can be used when the TLB invalidation is intended to clear out the +* stale cached translations that are no longer in use. Light Invalidation Mode +* is much faster than the Heavy Invalidation Mode, as it does not wait for the +* in-flight transactions to be GOd. +*/ +enum intel_guc_tlb_inval_mode { +INTEL_GUC_TLB_INVAL_MODE_HEAVY =0x0 , +INTEL_GUC_TLB_INVAL_MODE_LITE =0x1 , +}; +#endif /* _ABI_GUC_ACTIONS_ABI_H */
drivers/gpu/drm/i915/gt/uc/intel_guc.c +90 -0
96 lines not on this page · raw message
drivers/gpu/drm/i915/gt/uc/intel_guc.h +13 -0
@@ -77,6 +77,10 @@ struct intel_guc {atomic_t outstanding_submission_g2h;/** @interrupts: pointers to GuC interrupt-managing functions. */ +struct xarray tlb_lookup; +u32 serial_slot; +u32 next_seqno; +struct {void (*reset)(struct intel_guc *guc);void (*enable)(struct intel_guc *guc);
@@ -248,6 +252,11 @@ struct intel_guc {#endif }; +struct intel_guc_tlb_wait { +struct wait_queue_head wq; +u8 status; +}__aligned(4) ; +static inline struct intel_guc *log_to_guc (struct intel_guc_log *log) { return container_of(log, struct intel_guc, log);
@@ -363,6 +372,9 @@ int intel_guc_allocate_and_map_vma(struct intel_guc *guc, u32 size,int intel_guc_self_cfg32 (struct intel_guc *guc,u16 key,u32 value);int intel_guc_self_cfg64 (struct intel_guc *guc,u16 key,u64 value); +int intel_guc_invalidate_tlb_guc (struct intel_guc *guc, +enum intel_guc_tlb_inval_mode mode); +static inline bool intel_guc_is_supported (struct intel_guc *guc) {return intel_uc_fw_is_supported (&guc->fw);
@@ -440,6 +452,7 @@ int intel_guc_engine_failure_process_msg(struct intel_guc *guc, const u32 *msg, u32 len);int intel_guc_error_capture_process_msg (struct intel_guc *guc,const u32 *msg,u32 len); +void intel_guc_tlb_invalidation_done (struct intel_guc *guc,u32 seqno);struct intel_engine_cs *intel_guc_lookup_engine (struct intel_guc *guc,u8 guc_class,u8 instance);
drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c +20 -4
@@ -1023,7 +1023,7 @@ static int ct_process_request(struct intel_guc_ct *ct, struct ct_incoming_msg *rreturn 0 ; } -static bool ct_process_incoming_requests (struct intel_guc_ct *ct) +static bool ct_process_incoming_requests (struct intel_guc_ct *ct,struct list_head *incoming) {unsigned long flags;struct ct_incoming_msg *request;
@@ -1031,11 +1031,11 @@ static bool ct_process_incoming_requests(struct intel_guc_ct *ct)int err;spin_lock_irqsave (&ct->requests.lock, flags); - request =list_first_entry_or_null (&ct->requests.incoming, + request =list_first_entry_or_null (incoming, struct ct_incoming_msg, link);if (request)list_del (&request->link); - done = !!list_empty (&ct->requests.incoming); + done = !!list_empty (incoming);spin_unlock_irqrestore (&ct->requests.lock, flags);if (!request)
@@ -1058,7 +1058,7 @@ static void ct_incoming_request_worker_func(struct work_struct *w)bool done;do { - done =ct_process_incoming_requests (ct); + done =ct_process_incoming_requests (ct, &ct->requests.incoming); }while (!done); }
@@ -1078,14 +1078,30 @@ static int ct_handle_event(struct intel_guc_ct *ct, struct ct_incoming_msg *requswitch (action) {case INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_DONE :case INTEL_GUC_ACTION_DEREGISTER_CONTEXT_DONE : +case INTEL_GUC_ACTION_TLB_INVALIDATION_DONE :g2h_release_space (ct, request->size); } +/* Handle tlb invalidation response in interrupt context */ +if (action ==INTEL_GUC_ACTION_TLB_INVALIDATION_DONE ) { +const u32 *payload; +u32 hxg_len, len; + + hxg_len = request->size -GUC_CTB_MSG_MIN_LEN ; + len = hxg_len -GUC_HXG_MSG_MIN_LEN ; +if (unlikely (len <1 )) +return -EPROTO ; + payload = &hxg[GUC_HXG_MSG_MIN_LEN ]; +intel_guc_tlb_invalidation_done (ct_to_guc (ct), payload[0 ]); +ct_free_msg (request); +return 0 ; + }spin_lock_irqsave (&ct->requests.lock, flags);list_add_tail (&request->link, &ct->requests.incoming);spin_unlock_irqrestore (&ct->requests.lock, flags);queue_work (system_unbound_wq, &ct->requests.worker); +return 0 ; }
drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h +6 -0
@@ -22,6 +22,7 @@/* Payload length only i.e. don't include G2H header length */ #define G2H_LEN_DW_SCHED_CONTEXT_MODE_SET 2#define G2H_LEN_DW_DEREGISTER_CONTEXT 1 +#define G2H_LEN_DW_INVALIDATE_TLB 1#define GUC_CONTEXT_DISABLE 0#define GUC_CONTEXT_ENABLE 1
@@ -431,4 +432,9 @@ enum intel_guc_recv_message { INTEL_GUC_RECV_MSG_EXCEPTION = BIT(30), }; +#define INTEL_GUC_SUPPORTS_TLB_INVALIDATION (guc) \ + ((intel_guc_ct_enabled(&(guc)->ct)) && \ + (intel_guc_submission_is_used(guc)) && \ + (GRAPHICS_VER(guc_to_gt((guc))->i915) >= 12)) +#endif
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c +89 -2
144 lines not on this page · raw message
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 10/21 drm/i915/guc: use kernel-doc for enum intel_guc_tlb_inval_mode
In reply to Mauro Carvalho ChehabTransform the comments for intel_guc_tlb_inval_mode into a kernel-doc markup.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +7 -4
@@ -190,15 +190,18 @@ enum intel_guc_tlb_invalidation_type { INTEL_GUC_TLB_INVAL_GUC = 0x3, }; -/* -* 0: Heavy mode of Invalidation: +/** +* enum intel_guc_tlb_inval_mode - define the mode for TLB cache invlidation +* +* @INTEL_GUC_TLB_INVAL_MODE_HEAVY: Heavy Invalidation Mode. * The pipeline of the engine(s) for which the invalidation is targeted to is * blocked, and all the in-flight transactions are guaranteed to be Globally -* Observed before completing the TLB invalidation -* 1: Lite mode of Invalidation: +* Observed before completing the TLB invalidation. +* @INTEL_GUC_TLB_INVAL_MODE_LITE: Light Invalidation Mode. * TLBs of the targeted engine(s) are immediately invalidated. * In-flight transactions are NOT guaranteed to be Globally Observed before * completing TLB invalidation. +* * Light Invalidation Mode is to be used only when * it can be guaranteed (by SW) that the address translations remain invariant * for the in-flight transactions across the TLB invalidation. In other words,
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 11/21 drm/i915/guc: document the TLB invalidation struct members
In reply to Mauro Carvalho ChehabAdd documentation for the 3 new members of struct intel_guc that are used to handle TLB cache invalidation logic.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/uc/intel_guc.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/uc/intel_guc.h +13 -1
@@ -76,11 +76,23 @@ struct intel_guc {*/ atomic_t outstanding_submission_g2h; -/** @interrupts: pointers to GuC interrupt-managing functions. */ +/** +* @tlb_lookup: TLB cache invalidation lookup table. +*/ struct xarray tlb_lookup; + +/** +* @serial_slot: index to the latest allocated element at the +* @tlb_lookup xarray. +*/ u32 serial_slot; + +/** +* @next_seqno: next index to be allocated at the @tlb_lookup xarray. +*/ u32 next_seqno; +/** @interrupts: pointers to GuC interrupt-managing functions. */ struct {void (*reset)(struct intel_guc *guc);void (*enable)(struct intel_guc *guc);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 12/21 drm/i915/guc: Introduce TLB_INVALIDATION_ALL action
In reply to Mauro Carvalho ChehabFrom: Piotr Piórkowski <[email protected]>
Add a new way to invalidate TLB via GuC using actions 0x7002 (TLB_INVALIDATION_ALL).
Those actions will be used on upcoming patches.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 1 + drivers/gpu/drm/i915/gt/uc/intel_guc.c | 14 ++++++++++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.h | 1 + 3 files changed, 16 insertions(+)
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +1 -0
@@ -138,6 +138,7 @@ enum intel_guc_action {INTEL_GUC_ACTION_PAGE_FAULT_NOTIFICATION =0x6001 ,INTEL_GUC_ACTION_TLB_INVALIDATION =0x7000 ,INTEL_GUC_ACTION_TLB_INVALIDATION_DONE =0x7001 , +INTEL_GUC_ACTION_TLB_INVALIDATION_ALL =0x7002 ,INTEL_GUC_ACTION_STATE_CAPTURE_NOTIFICATION =0x8002 ,INTEL_GUC_ACTION_NOTIFY_FLUSH_LOG_BUFFER_TO_FILE =0x8003 , INTEL_GUC_ACTION_NOTIFY_CRASH_DUMP_POSTED = 0x8004,
drivers/gpu/drm/i915/gt/uc/intel_guc.c +14 -0
@@ -945,6 +945,20 @@ int intel_guc_invalidate_tlb_guc(struct intel_guc *guc,return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); } +int intel_guc_invalidate_tlb_all (struct intel_guc *guc) +{ +u32 action[] = { +INTEL_GUC_ACTION_TLB_INVALIDATION_ALL , +0 , +INTEL_GUC_TLB_INVAL_MODE_HEAVY <<INTEL_GUC_TLB_INVAL_MODE_SHIFT | +INTEL_GUC_TLB_INVAL_FLUSH_CACHE , + }; + +GEM_BUG_ON (!INTEL_GUC_SUPPORTS_TLB_INVALIDATION (guc)); + +return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); +} +/** * intel_guc_load_status - dump information about GuC load status * @guc: the GuC
drivers/gpu/drm/i915/gt/uc/intel_guc.h +1 -0
@@ -386,6 +386,7 @@ int intel_guc_self_cfg64(struct intel_guc *guc, u16 key, u64 value);int intel_guc_invalidate_tlb_guc (struct intel_guc *guc,enum intel_guc_tlb_inval_mode mode); +int intel_guc_invalidate_tlb_all (struct intel_guc *guc);static inline bool intel_guc_is_supported (struct intel_guc *guc) {
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 13/21 drm/i915: Invalidate the TLBs on each GT
In reply to Mauro Carvalho ChehabFrom: Chris Wilson <[email protected]>
With multi-GT devices, the object may have been bound on each GT. Invalidate the TLBs across all GT before releasing the pages back to the system.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gem/i915_gem_object_types.h | 4 +++- drivers/gpu/drm/i915/gem/i915_gem_pages.c | 13 ++++++++----- drivers/gpu/drm/i915/gt/intel_engine.h | 1 + drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.h | 3 ++- drivers/gpu/drm/i915/gt/intel_gt_defines.h | 11 +++++++++++ drivers/gpu/drm/i915/gt/intel_gt_types.h | 4 +++- drivers/gpu/drm/i915/gt/intel_ppgtt.c | 4 ++-- drivers/gpu/drm/i915/i915_drv.h | 1 - drivers/gpu/drm/i915/i915_vma.c | 14 +++++++++++--- drivers/gpu/drm/i915/i915_vma.h | 2 +- 10 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 drivers/gpu/drm/i915/gt/intel_gt_defines.h
drivers/gpu/drm/i915/gem/i915_gem_object_types.h +3 -1
@@ -17,6 +17,8 @@#include "i915_selftest.h" #include "i915_vma_resource.h" +#include "gt/intel_gt_defines.h" +struct drm_i915_gem_object ;struct intel_fronbuffer ;struct intel_memory_region ;
@@ -616,7 +618,7 @@ struct drm_i915_gem_object {*/ bool dirty:1; -u32 tlb; +u32 tlb[I915_MAX_GT ]; } mm;struct {
drivers/gpu/drm/i915/gem/i915_gem_pages.c +8 -5
@@ -194,13 +194,16 @@ static void unmap_object(struct drm_i915_gem_object *obj, void *ptr)static void flush_tlb_invalidate (struct drm_i915_gem_object *obj) {struct drm_i915_private *i915 =to_i915 (obj->base.dev); -struct intel_gt *gt =to_gt (i915); +struct intel_gt *gt; +int id; -if (!obj->mm.tlb) -return ; +for_each_gt (gt, i915, id) { +if (!obj->mm.tlb[id]) +continue ; -intel_gt_invalidate_tlb_full (gt, obj->mm.tlb); - obj->mm.tlb =0 ; +intel_gt_invalidate_tlb_full (gt, obj->mm.tlb[id]); + obj->mm.tlb[id] =0 ; + } } struct sg_table *
drivers/gpu/drm/i915/gt/intel_engine.h +1 -0
@@ -18,6 +18,7 @@#include "intel_gt_types.h" #include "intel_timeline.h" #include "intel_workarounds.h" +#include "uc/intel_guc_submission.h" struct drm_printer ;struct intel_context ;
drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.h +2 -1
@@ -11,8 +11,9 @@#include "i915_active.h" #include "intel_gt_buffer_pool_types.h" -struct intel_gt ; +enum i915_map_type ;struct i915_request ; +struct intel_gt ;struct intel_gt_buffer_pool_node * intel_gt_get_buffer_pool(struct intel_gt *gt, size_t size,
drivers/gpu/drm/i915/gt/intel_gt_defines.h new file +11 -0
@@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: MIT */ +/* +* Copyright © 2019 Intel Corporation +*/ + +#ifndef __INTEL_GT_DEFINES__ +#define __INTEL_GT_DEFINES__ + +#define I915_MAX_GT 4 + +#endif
drivers/gpu/drm/i915/gt/intel_gt_types.h +3 -1
@@ -19,7 +19,6 @@#include "uc/intel_uc.h" #include "intel_gsc.h" -#include "i915_vma.h" #include "intel_engine_types.h" #include "intel_gt_buffer_pool_types.h" #include "intel_hwconfig.h"
@@ -31,8 +30,11 @@#include "intel_wakeref.h" #include "pxp/intel_pxp_types.h" +#include "intel_gt_defines.h" +struct drm_i915_private ;struct i915_ggtt ; +struct i915_vma ;struct intel_engine_cs ;struct intel_uncore ;
drivers/gpu/drm/i915/gt/intel_ppgtt.c +2 -2
@@ -8,6 +8,7 @@#include "gem/i915_gem_lmem.h" #include "i915_trace.h" +#include "intel_gt.h" #include "intel_gtt.h" #include "gen6_ppgtt.h" #include "gen8_ppgtt.h"
@@ -210,8 +211,7 @@ void ppgtt_unbind_vma(struct i915_address_space *vm,return ; vm->clear_range (vm, vma_res->start, vma_res->vma_size); -if (vma_res->tlb) -vma_invalidate_tlb (vm, *vma_res->tlb); +vma_invalidate_tlb (vm, vma_res->tlb); }static unsigned long pd_count (u64 size,int shift)
drivers/gpu/drm/i915/i915_drv.h +0 -1
@@ -711,7 +711,6 @@ struct drm_i915_private {/* * i915->gt[0] == &i915->gt0 */ -#define I915_MAX_GT 4struct intel_gt *gt[I915_MAX_GT ];struct kobject *sysfs_gt;
drivers/gpu/drm/i915/i915_vma.c +11 -3
@@ -1309,8 +1309,14 @@ I915_SELFTEST_EXPORT int i915_vma_get_pages(struct i915_vma *vma)return err; } -void vma_invalidate_tlb (struct i915_address_space *vm,u32 tlb) +void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb) { +struct intel_gt *gt; +int id; + +if (!tlb) +return ; +/* * Before we release the pages that were bound by this vma, we * must invalidate all the TLBs that may still have a reference
@@ -1319,7 +1325,9 @@ void vma_invalidate_tlb(struct i915_address_space *vm, u32 tlb)* the most recent TLB invalidation seqno, and if we have not yet * flushed the TLBs upon release, perform a full invalidation. */ -WRITE_ONCE (tlb,intel_gt_next_invalidate_tlb_full (vm->gt)); +for_each_gt (gt, vm->i915, id) +WRITE_ONCE (tlb[id], +intel_gt_next_invalidate_tlb_full (vm->gt)); }static void __vma_put_pages (struct i915_vma *vma,unsigned int count)
@@ -1955,7 +1963,7 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async)if (async) unbind_fence =i915_vma_resource_unbind (vma_res, - &vma->obj->mm.tlb); + vma->obj->mm.tlb);else unbind_fence =i915_vma_resource_unbind (vma_res,NULL );
drivers/gpu/drm/i915/i915_vma.h +1 -1
@@ -213,7 +213,7 @@ bool i915_vma_misplaced(const struct i915_vma *vma, u64 size, u64 alignment, u64 flags);void __i915_vma_set_map_and_fenceable (struct i915_vma *vma);void i915_vma_revoke_mmap (struct i915_vma *vma); -void vma_invalidate_tlb (struct i915_address_space *vm,u32 tlb); +void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb);struct dma_fence *__i915_vma_evict (struct i915_vma *vma,bool async);int __i915_vma_unbind (struct i915_vma *vma);int __must_check i915_vma_unbind (struct i915_vma *vma);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 14/21 drm/i915: document tlb field at struct drm_i915_gem_object
In reply to Mauro Carvalho ChehabAdd documentation to the TLB field inside
struct drm_i915_gem_object.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gem/i915_gem_object_types.h | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/i915/gem/i915_gem_object_types.h +1 -0
@@ -618,6 +618,7 @@ struct drm_i915_gem_object {*/ bool dirty:1; +/** @mm.tlb: array with TLB invalidate IDs */ u32 tlb[I915_MAX_GT ]; } mm;
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 15/21 drm/i915: Add platform macro for selective tlb flush
In reply to Mauro Carvalho ChehabFrom: Prathap Kumar Valsan <[email protected]>
Add support for selective TLB invalidation, which is a platform feature supported on XeHP.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/i915_drv.h | 3 +++ drivers/gpu/drm/i915/i915_pci.c | 1 + drivers/gpu/drm/i915/intel_device_info.h | 1 + 3 files changed, 5 insertions(+)
drivers/gpu/drm/i915/i915_drv.h +3 -0
@@ -1312,6 +1312,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,#define HAS_GT_UC (dev_priv) (INTEL_INFO(dev_priv)->has_gt_uc) +#define HAS_SELECTIVE_TLB_INVALIDATION (dev_priv) \ + (INTEL_INFO(dev_priv)->has_selective_tlb_invalidation) +#define HAS_POOLED_EU (dev_priv) (INTEL_INFO(dev_priv)->has_pooled_eu)#define HAS_GLOBAL_MOCS_REGISTERS (dev_priv) (INTEL_INFO(dev_priv)->has_global_mocs)
drivers/gpu/drm/i915/i915_pci.c +1 -0
@@ -1022,6 +1022,7 @@ static const struct intel_device_info adl_p_info = { .has_reset_engine = 1, \ .has_rps = 1, \ .has_runtime_pm = 1, \ + .has_selective_tlb_invalidation = 1, \ .ppgtt_size =48 , \ .ppgtt_type = INTEL_PPGTT_FULL
drivers/gpu/drm/i915/intel_device_info.h +1 -0
@@ -170,6 +170,7 @@ enum intel_ppgtt_type {func (has_rc6p); \func (has_rps); \func (has_runtime_pm); \ +func (has_selective_tlb_invalidation); \func (has_snoop); \func (has_coherent_ggtt); \func (unfenced_needs_alignment); \
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 16/21 drm/i915: Define GuC Based TLB invalidation routines
In reply to Mauro Carvalho ChehabFrom: Prathap Kumar Valsan <[email protected]>
Add routines to interface with GuC firmware for selective TLB invalidation supported on XeHP.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
.../gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 3 + drivers/gpu/drm/i915/gt/uc/intel_guc.c | 90 +++++++++++++++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.h | 10 +++ drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h | 3 + 4 files changed, 106 insertions(+)
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +3 -0
@@ -188,6 +188,9 @@ enum intel_guc_state_capture_event_status {#define INTEL_GUC_TLB_INVAL_FLUSH_CACHE (1 << 31)enum intel_guc_tlb_invalidation_type { +INTEL_GUC_TLB_INVAL_FULL =0x0 , +INTEL_GUC_TLB_INVAL_PAGE_SELECTIVE =0x1 , +INTEL_GUC_TLB_INVAL_PAGE_SELECTIVE_CTX =0x2 ,INTEL_GUC_TLB_INVAL_GUC =0x3 , };
drivers/gpu/drm/i915/gt/uc/intel_guc.c +90 -0
96 lines not on this page · raw message
drivers/gpu/drm/i915/gt/uc/intel_guc.h +10 -0
@@ -384,6 +384,16 @@ int intel_guc_allocate_and_map_vma(struct intel_guc *guc, u32 size,int intel_guc_self_cfg32 (struct intel_guc *guc,u16 key,u32 value);int intel_guc_self_cfg64 (struct intel_guc *guc,u16 key,u64 value); +int intel_guc_g2g_register (struct intel_guc *guc); + +int intel_guc_invalidate_tlb_full (struct intel_guc *guc, +enum intel_guc_tlb_inval_mode mode); +int intel_guc_invalidate_tlb_page_selective (struct intel_guc *guc, +enum intel_guc_tlb_inval_mode mode, +u64 start,u64 length); +int intel_guc_invalidate_tlb_page_selective_ctx (struct intel_guc *guc, +enum intel_guc_tlb_inval_mode mode, +u64 start,u64 length,u32 ctxid);int intel_guc_invalidate_tlb_guc (struct intel_guc *guc,enum intel_guc_tlb_inval_mode mode);int intel_guc_invalidate_tlb_all (struct intel_guc *guc);
drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h +3 -0
@@ -436,5 +436,8 @@ enum intel_guc_recv_message { ((intel_guc_ct_enabled (&(guc)->ct)) && \ (intel_guc_submission_is_used (guc)) && \ (GRAPHICS_VER(guc_to_gt((guc))->i915) >= 12)) +#define INTEL_GUC_SUPPORTS_TLB_INVALIDATION_SELECTIVE (guc) \ + (INTEL_GUC_SUPPORTS_TLB_INVALIDATION(guc) && \ + HAS_SELECTIVE_TLB_INVALIDATION(guc_to_gt(guc)->i915))#endif
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 17/21 drm/i915: Add generic interface for tlb invalidation for XeHP
In reply to Mauro Carvalho ChehabFrom: Prathap Kumar Valsan <[email protected]>
Add an interface for GuC TLB actions, supporting both selective and full TLB invalidations. After this change, when GuC is enabled, tlb invalidations use GuC ct. Otherwise, use mmio interface.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_gt_regs.h | 8 +++ drivers/gpu/drm/i915/gt/intel_tlb.c | 78 ++++++++++++++++++++++++- drivers/gpu/drm/i915/gt/intel_tlb.h | 1 + 3 files changed, 86 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_gt_regs.h +8 -0
@@ -1054,6 +1054,14 @@#define GEN12_GAM_DONE _MMIO(0xcf68) +#define XEHP_TLB_INV_DESC0 _MMIO(0xcf7c) +#define XEHP_TLB_INV_DESC0_ADDR_LO REG_GENMASK(31, 12) +#define XEHP_TLB_INV_DESC0_ADDR_MASK REG_GENMASK(8, 3) +#define XEHP_TLB_INV_DESC0_G REG_GENMASK(2, 1) +#define XEHP_TLB_INV_DESC0_VALID REG_BIT(0) +#define XEHP_TLB_INV_DESC1 _MMIO(0xcf80) +#define XEHP_TLB_INV_DESC0_ADDR_HI REG_GENMASK(31, 0) +#define GEN7_HALF_SLICE_CHICKEN1 _MMIO(0xe100)/* IVB GT1 + VLV */ #define GEN7_MAX_PS_THREAD_DEP (8 << 12)#define GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1 << 10)
drivers/gpu/drm/i915/gt/intel_tlb.c +77 -1
100 lines not on this page · raw message
drivers/gpu/drm/i915/gt/intel_tlb.h +1 -0
@@ -12,6 +12,7 @@#include "intel_gt_types.h" void intel_gt_invalidate_tlb_full (struct intel_gt *gt,u32 seqno); +bool intel_gt_invalidate_tlb_range (struct intel_gt *gt,u64 start,u64 length);void intel_gt_init_tlb (struct intel_gt *gt);void intel_gt_fini_tlb (struct intel_gt *gt);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 18/21 drm/i915: Use selective tlb invalidations where supported
In reply to Mauro Carvalho ChehabFrom: Prathap Kumar Valsan <[email protected]>
For platforms supporting selective tlb invalidations, we don't need to do a full tlb invalidation. Rather do a range based tlb invalidation for every unbind of purged vma belongs to an active vm.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_ppgtt.c | 2 +- drivers/gpu/drm/i915/i915_vma.c | 14 +++++++++----- drivers/gpu/drm/i915/i915_vma.h | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/gt/intel_ppgtt.c +1 -1
@@ -211,7 +211,7 @@ void ppgtt_unbind_vma(struct i915_address_space *vm,return ; vm->clear_range (vm, vma_res->start, vma_res->vma_size); -vma_invalidate_tlb (vm, vma_res->tlb); +vma_invalidate_tlb (vm, vma_res->tlb, vma_res->start, vma_res->vma_size); }static unsigned long pd_count (u64 size,int shift)
drivers/gpu/drm/i915/i915_vma.c +9 -5
@@ -1309,7 +1309,8 @@ I915_SELFTEST_EXPORT int i915_vma_get_pages(struct i915_vma *vma)return err; } -void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb) +void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb, +u64 start,u64 size) {struct intel_gt *gt;int id;
@@ -1325,9 +1326,11 @@ void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb)* the most recent TLB invalidation seqno, and if we have not yet * flushed the TLBs upon release, perform a full invalidation. */ -for_each_gt (gt, vm->i915, id) -WRITE_ONCE (tlb[id], -intel_gt_next_invalidate_tlb_full (vm->gt)); +for_each_gt (gt, vm->i915, id) { +if (!intel_gt_invalidate_tlb_range (gt, start, size)) +WRITE_ONCE (tlb[id], +intel_gt_next_invalidate_tlb_full (vm->gt)); + } }static void __vma_put_pages (struct i915_vma *vma,unsigned int count)
@@ -1980,7 +1983,8 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async)dma_fence_put (unbind_fence); unbind_fence =NULL ; } -vma_invalidate_tlb (vma->vm, vma->obj->mm.tlb); +vma_invalidate_tlb (vma->vm, vma->obj->mm.tlb, + vma->node.start, vma->size); }/*
drivers/gpu/drm/i915/i915_vma.h +2 -1
@@ -213,7 +213,8 @@ bool i915_vma_misplaced(const struct i915_vma *vma, u64 size, u64 alignment, u64 flags);void __i915_vma_set_map_and_fenceable (struct i915_vma *vma);void i915_vma_revoke_mmap (struct i915_vma *vma); -void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb); +void vma_invalidate_tlb (struct i915_address_space *vm,u32 *tlb, +u64 start,u64 size);struct dma_fence *__i915_vma_evict (struct i915_vma *vma,bool async);int __i915_vma_unbind (struct i915_vma *vma);int __must_check i915_vma_unbind (struct i915_vma *vma);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 19/21 drm/i915/gt: document TLB cache invalidation functions
In reply to Mauro Carvalho ChehabAdd a description for the kAPI functions inside intel_tlb.c.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/intel_tlb.c | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
drivers/gpu/drm/i915/gt/intel_tlb.c +36 -0
@@ -146,6 +146,18 @@ static void mmio_invalidate_full(struct intel_gt *gt)intel_uncore_forcewake_put_delayed (uncore,FORCEWAKE_ALL ); } +/** +* intel_gt_invalidate_tlb_full - do full TLB cache invalidation +* @gt: GT structure +* @seqno: sequence number +* +* Do a full TLB cache invalidation if the @seqno is bigger than the last +* full TLB cache invalidation. +* +* Note: +* The TLB cache invalidation logic depends on GEN-specific registers. +* It currently supports GEN8 to GEN12 and GuC-based TLB cache invalidation. +*/ void intel_gt_invalidate_tlb_full (struct intel_gt *gt,u32 seqno) {intel_wakeref_t wakeref;
@@ -220,6 +232,17 @@ static bool mmio_invalidate_range(struct intel_gt *gt, u64 start, u64 length)return err ==0 ; } +/** +* intel_gt_invalidate_tlb_range - do full TLB cache invalidation +* @gt: GT structure +* @start: range start +* @length: range length +* +* Do a selected TLB cache invalidation on a range pointed by @start +* with @length size. +* +* Only some GuC-based GPUs can do a selective cache invalidation. +*/ bool intel_gt_invalidate_tlb_range (struct intel_gt *gt,u64 start,u64 length) {
@@ -247,12 +270,25 @@ bool intel_gt_invalidate_tlb_range(struct intel_gt *gt,return true; } +/** +* intel_gt_init_tlb - initialize TLB-specific vars +* @gt: GT structure +* +* TLB cache invalidation logic internally uses some resources that require +* initialization. Should be called before doing any TLB cache invalidation. +*/ void intel_gt_init_tlb (struct intel_gt *gt) {mutex_init (>->tlb.invalidate_lock);seqcount_mutex_init (>->tlb.seqno, >->tlb.invalidate_lock); } +/** +* intel_gt_fini_tlb - initialize TLB-specific vars +* @gt: GT structure +* +* Frees any resources needed by TLB cache invalidation logic. +*/ void intel_gt_fini_tlb (struct intel_gt *gt) {mutex_destroy (>->tlb.invalidate_lock);
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 20/21 drm/i915/guc: describe enum intel_guc_tlb_invalidation_type
In reply to Mauro Carvalho ChehabAdd a description for intel_guc_tlb_invalidation_type enum.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +12 -0
@@ -187,6 +187,18 @@ enum intel_guc_state_capture_event_status {/* Flush PPC or SMRO caches along with TLB invalidation request */ #define INTEL_GUC_TLB_INVAL_FLUSH_CACHE (1 << 31) +/** +* enum intel_guc_tlb_invalidation_type - type of TLB cache invalidation +* +* @INTEL_GUC_TLB_INVAL_FULL: +* Global TLB invalidation +* @INTEL_GUC_TLB_INVAL_PAGE_SELECTIVE: +* Page-selective TLB cache invalidation +* @INTEL_GUC_TLB_INVAL_PAGE_SELECTIVE_CTX: +* Context-selective TLB cache invalidation +* @INTEL_GUC_TLB_INVAL_GUC: +* Invalidate TLB on GuC itself +*/ enum intel_guc_tlb_invalidation_type {INTEL_GUC_TLB_INVAL_FULL =0x0 ,INTEL_GUC_TLB_INVAL_PAGE_SELECTIVE =0x1 ,
Signature · 1 line
2.36.1
Mauro Carvalho Chehab
maintainerPATCH 21/21 drm/i915/guc: document TLB cache invalidation functions
In reply to Mauro Carvalho ChehabAdd documentation for the kAPI functions that do TLB cache invalidation via GuC.
---
See [PATCH 00/21] at: https://lore.kernel.org/all/[email protected]/
drivers/gpu/drm/i915/gt/uc/intel_guc.c | 52 ++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/gt/uc/intel_guc.c +45 -7
@@ -923,7 +923,14 @@ static int guc_send_invalidate_tlb(struct intel_guc *guc, u32 *action, u32 size)return err; } -/* Full TLB invalidation */ +/** +* intel_guc_invalidate_tlb_full - GuC full TLB invalidation +* +* @guc: the guc +* @mode: mode of TLB cache invalidation (heavy or lite) +* +* Use GuC to do a full TLB cache invalidation if supported. +*/ int intel_guc_invalidate_tlb_full (struct intel_guc *guc,enum intel_guc_tlb_inval_mode mode) {
@@ -943,8 +950,17 @@ int intel_guc_invalidate_tlb_full(struct intel_guc *guc,return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); } -/* -* Selective TLB Invalidation for Address Range: +/** +* intel_guc_invalidate_tlb_page_selective - GuC selective TLB invalidation +* for an address range +* +* @guc: the guc +* @mode: mode of TLB cache invalidation (heavy or lite) +* @start: range start +* @length: range length +* +* Use GuC to do a selective TLB invalidation if supported. +* * TLB's in the Address Range is Invalidated across all engines. */ int intel_guc_invalidate_tlb_page_selective(struct intel_guc *guc,
@@ -978,8 +994,18 @@ int intel_guc_invalidate_tlb_page_selective(struct intel_guc *guc,return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); } -/* -* Selective TLB Invalidation for Context: +/** +* intel_guc_invalidate_tlb_page_selective_ctx - GuC selective TLB +* invalidation for a context +* +* @guc: the guc +* @mode: mode of TLB cache invalidation (heavy or lite) +* @start: range start +* @length: range length +* @ctxid: context ID +* +* Use GuC to do a selective TLB invalidation on a context if supported. +* * Invalidates all TLB's for a specific context across all engines. */ int intel_guc_invalidate_tlb_page_selective_ctx(struct intel_guc *guc,
@@ -1013,8 +1039,13 @@ int intel_guc_invalidate_tlb_page_selective_ctx(struct intel_guc *guc,return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); } -/* -* Guc TLB Invalidation: Invalidate the TLB's of GuC itself. +/** +* intel_guc_invalidate_tlb_guc - GuC self TLB invalidation +* +* @guc: the guc +* @mode: mode of TLB cache invalidation (heavy or lite) +* +* Use GuC to invalidate the TLB's of GuC itself. */ int intel_guc_invalidate_tlb_guc (struct intel_guc *guc,enum intel_guc_tlb_inval_mode mode)
@@ -1035,6 +1066,13 @@ int intel_guc_invalidate_tlb_guc(struct intel_guc *guc,return guc_send_invalidate_tlb (guc, action,ARRAY_SIZE (action)); } +/** +* intel_guc_invalidate_tlb_all - GuC global TLB invalidation +* +* @guc: the guc +* +* Use GuC to do a complete TLB invalidation on all tables +*/ int intel_guc_invalidate_tlb_all (struct intel_guc *guc) {u32 action[] = {
Signature · 1 line
2.36.1
Patchwork
CI[Intel-gfx] ✗ Fi.CI.BUILD: failure for Fix performance regressions with TLB and add GuC support
In reply to Mauro Carvalho Chehab== Series Details ==
== Series Details ==
Series: Fix performance regressions with TLB and add GuC support
URL : https://patchwork.freedesktop.org/series/106293/
State : failure
== Summary ==
Error: patch https://patchwork.freedesktop.org/api/1.0/series/106293/revisions/1/mbox/ not found
Patchwork
CI[Intel-gfx] ✗ Fi.CI.BUILD: failure for Fix performance regressions with TLB and add GuC support (rev2)
In reply to Mauro Carvalho Chehab== Series Details ==
== Series Details ==
Series: Fix performance regressions with TLB and add GuC support (rev2)
URL : https://patchwork.freedesktop.org/series/106293/
State : failure
== Summary ==
Error: patch https://patchwork.freedesktop.org/api/1.0/series/106293/revisions/2/mbox/ not applied
Applying: drm/i915/gt: Ignore TLB invalidations on idle engines
Using index info to reconstruct a base tree...
M drivers/gpu/drm/i915/gt/intel_gt.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/gpu/drm/i915/gt/intel_gt.c
CONFLICT (content): Merge conflict in drivers/gpu/drm/i915/gt/intel_gt.c
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Patch failed at 0001 drm/i915/gt: Ignore TLB invalidations on idle engines
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".