Skip to content

Commit 1536623

Browse files
committed
drm/xe: Decouple TLB invalidations from GT
Decouple TLB invalidations from the GT by updating the TLB invalidation layer to accept a `struct xe_tlb_inval` instead of a `struct xe_gt`. Also, rename *gt_tlb* to *tlb*. The internals of the TLB invalidation code still operate on a GT, but this is now hidden from the rest of the driver. Signed-off-by: Stuart Summers <stuart.summers@intel.com> Reviewed-by: Stuart Summers <stuart.summers@intel.com> Signed-off-by: Matthew Brost <matthew.brost@intel.com> Link: https://lore.kernel.org/r/20250826182911.392550-7-stuart.summers@intel.com
1 parent 6d1e452 commit 1536623

18 files changed

Lines changed: 330 additions & 304 deletions

drivers/gpu/drm/xe/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ xe-y += xe_bb.o \
6161
xe_gt_pagefault.o \
6262
xe_gt_sysfs.o \
6363
xe_gt_throttle.o \
64-
xe_gt_tlb_inval.o \
65-
xe_gt_tlb_inval_job.o \
6664
xe_gt_topology.o \
6765
xe_guc.o \
6866
xe_guc_ads.o \
@@ -119,6 +117,8 @@ xe-y += xe_bb.o \
119117
xe_sync.o \
120118
xe_tile.o \
121119
xe_tile_sysfs.o \
120+
xe_tlb_inval.o \
121+
xe_tlb_inval_job.o \
122122
xe_trace.o \
123123
xe_trace_bo.o \
124124
xe_trace_guc.o \

drivers/gpu/drm/xe/xe_ggtt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
#include "xe_device.h"
2424
#include "xe_gt.h"
2525
#include "xe_gt_printk.h"
26-
#include "xe_gt_tlb_inval.h"
2726
#include "xe_map.h"
2827
#include "xe_mmio.h"
2928
#include "xe_pm.h"
3029
#include "xe_res_cursor.h"
3130
#include "xe_sriov.h"
3231
#include "xe_tile_sriov_vf.h"
32+
#include "xe_tlb_inval.h"
3333
#include "xe_wa.h"
3434
#include "xe_wopcm.h"
3535

@@ -438,7 +438,7 @@ static void ggtt_invalidate_gt_tlb(struct xe_gt *gt)
438438
if (!gt)
439439
return;
440440

441-
err = xe_gt_tlb_inval_ggtt(gt);
441+
err = xe_tlb_inval_ggtt(&gt->tlb_inval);
442442
xe_gt_WARN(gt, err, "Failed to invalidate GGTT (%pe)", ERR_PTR(err));
443443
}
444444

drivers/gpu/drm/xe/xe_gt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include "xe_gt_sriov_pf.h"
3838
#include "xe_gt_sriov_vf.h"
3939
#include "xe_gt_sysfs.h"
40-
#include "xe_gt_tlb_inval.h"
4140
#include "xe_gt_topology.h"
4241
#include "xe_guc_exec_queue_types.h"
4342
#include "xe_guc_pc.h"
@@ -58,6 +57,7 @@
5857
#include "xe_sa.h"
5958
#include "xe_sched_job.h"
6059
#include "xe_sriov.h"
60+
#include "xe_tlb_inval.h"
6161
#include "xe_tuning.h"
6262
#include "xe_uc.h"
6363
#include "xe_uc_fw.h"
@@ -852,7 +852,7 @@ static int gt_reset(struct xe_gt *gt)
852852

853853
xe_uc_stop(&gt->uc);
854854

855-
xe_gt_tlb_inval_reset(gt);
855+
xe_tlb_inval_reset(&gt->tlb_inval);
856856

857857
err = do_gt_reset(gt);
858858
if (err)
@@ -1066,5 +1066,5 @@ void xe_gt_declare_wedged(struct xe_gt *gt)
10661066
xe_gt_assert(gt, gt_to_xe(gt)->wedged.mode);
10671067

10681068
xe_uc_declare_wedged(&gt->uc);
1069-
xe_gt_tlb_inval_reset(gt);
1069+
xe_tlb_inval_reset(&gt->tlb_inval);
10701070
}

drivers/gpu/drm/xe/xe_gt_tlb_inval.h

Lines changed: 0 additions & 41 deletions
This file was deleted.

drivers/gpu/drm/xe/xe_gt_tlb_inval_job.h

Lines changed: 0 additions & 34 deletions
This file was deleted.

drivers/gpu/drm/xe/xe_gt_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
#include "xe_gt_sriov_pf_types.h"
1313
#include "xe_gt_sriov_vf_types.h"
1414
#include "xe_gt_stats_types.h"
15-
#include "xe_gt_tlb_inval_types.h"
1615
#include "xe_hw_engine_types.h"
1716
#include "xe_hw_fence_types.h"
1817
#include "xe_oa_types.h"
1918
#include "xe_reg_sr_types.h"
2019
#include "xe_sa_types.h"
20+
#include "xe_tlb_inval_types.h"
2121
#include "xe_uc_types.h"
2222

2323
struct xe_exec_queue_ops;

drivers/gpu/drm/xe/xe_guc_ct.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@
2626
#include "xe_gt_sriov_pf_control.h"
2727
#include "xe_gt_sriov_pf_monitor.h"
2828
#include "xe_gt_sriov_printk.h"
29-
#include "xe_gt_tlb_inval.h"
3029
#include "xe_guc.h"
3130
#include "xe_guc_log.h"
3231
#include "xe_guc_relay.h"
3332
#include "xe_guc_submit.h"
3433
#include "xe_map.h"
3534
#include "xe_pm.h"
35+
#include "xe_tlb_inval.h"
3636
#include "xe_trace_guc.h"
3737

3838
static void receive_g2h(struct xe_guc_ct *ct);

drivers/gpu/drm/xe/xe_lmtt.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include "xe_assert.h"
1313
#include "xe_bo.h"
14-
#include "xe_gt_tlb_inval.h"
14+
#include "xe_tlb_inval.h"
1515
#include "xe_lmtt.h"
1616
#include "xe_map.h"
1717
#include "xe_mmio.h"
@@ -228,17 +228,17 @@ void xe_lmtt_init_hw(struct xe_lmtt *lmtt)
228228

229229
static int lmtt_invalidate_hw(struct xe_lmtt *lmtt)
230230
{
231-
struct xe_gt_tlb_inval_fence fences[XE_MAX_GT_PER_TILE];
232-
struct xe_gt_tlb_inval_fence *fence = fences;
231+
struct xe_tlb_inval_fence fences[XE_MAX_GT_PER_TILE];
232+
struct xe_tlb_inval_fence *fence = fences;
233233
struct xe_tile *tile = lmtt_to_tile(lmtt);
234234
struct xe_gt *gt;
235235
int result = 0;
236236
int err;
237237
u8 id;
238238

239239
for_each_gt_on_tile(gt, tile, id) {
240-
xe_gt_tlb_inval_fence_init(gt, fence, true);
241-
err = xe_gt_tlb_inval_all(gt, fence);
240+
xe_tlb_inval_fence_init(&gt->tlb_inval, fence, true);
241+
err = xe_tlb_inval_all(&gt->tlb_inval, fence);
242242
result = result ?: err;
243243
fence++;
244244
}
@@ -252,7 +252,7 @@ static int lmtt_invalidate_hw(struct xe_lmtt *lmtt)
252252
*/
253253
fence = fences;
254254
for_each_gt_on_tile(gt, tile, id)
255-
xe_gt_tlb_inval_fence_wait(fence++);
255+
xe_tlb_inval_fence_wait(fence++);
256256

257257
return result;
258258
}

drivers/gpu/drm/xe/xe_migrate.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct ttm_resource;
1515

1616
struct xe_bo;
1717
struct xe_gt;
18-
struct xe_gt_tlb_inval_job;
18+
struct xe_tlb_inval_job;
1919
struct xe_exec_queue;
2020
struct xe_migrate;
2121
struct xe_migrate_pt_update;
@@ -94,13 +94,13 @@ struct xe_migrate_pt_update {
9494
/** @job: The job if a GPU page-table update. NULL otherwise */
9595
struct xe_sched_job *job;
9696
/**
97-
* @ijob: The GT TLB invalidation job for primary tile. NULL otherwise
97+
* @ijob: The TLB invalidation job for primary GT. NULL otherwise
9898
*/
99-
struct xe_gt_tlb_inval_job *ijob;
99+
struct xe_tlb_inval_job *ijob;
100100
/**
101-
* @mjob: The GT TLB invalidation job for media tile. NULL otherwise
101+
* @mjob: The TLB invalidation job for media GT. NULL otherwise
102102
*/
103-
struct xe_gt_tlb_inval_job *mjob;
103+
struct xe_tlb_inval_job *mjob;
104104
/** @tile_id: Tile ID of the update */
105105
u8 tile_id;
106106
};

drivers/gpu/drm/xe/xe_pt.c

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
#include "xe_drm_client.h"
1414
#include "xe_exec_queue.h"
1515
#include "xe_gt.h"
16-
#include "xe_gt_tlb_inval_job.h"
16+
#include "xe_tlb_inval_job.h"
1717
#include "xe_migrate.h"
1818
#include "xe_pt_types.h"
1919
#include "xe_pt_walk.h"
2020
#include "xe_res_cursor.h"
2121
#include "xe_sched_job.h"
2222
#include "xe_sync.h"
2323
#include "xe_svm.h"
24+
#include "xe_tlb_inval_job.h"
2425
#include "xe_trace.h"
2526
#include "xe_ttm_stolen_mgr.h"
2627
#include "xe_vm.h"
@@ -1276,8 +1277,8 @@ static int op_add_deps(struct xe_vm *vm, struct xe_vma_op *op,
12761277
}
12771278

12781279
static int xe_pt_vm_dependencies(struct xe_sched_job *job,
1279-
struct xe_gt_tlb_inval_job *ijob,
1280-
struct xe_gt_tlb_inval_job *mjob,
1280+
struct xe_tlb_inval_job *ijob,
1281+
struct xe_tlb_inval_job *mjob,
12811282
struct xe_vm *vm,
12821283
struct xe_vma_ops *vops,
12831284
struct xe_vm_pgtable_update_ops *pt_update_ops,
@@ -1347,13 +1348,13 @@ static int xe_pt_vm_dependencies(struct xe_sched_job *job,
13471348

13481349
if (job) {
13491350
if (ijob) {
1350-
err = xe_gt_tlb_inval_job_alloc_dep(ijob);
1351+
err = xe_tlb_inval_job_alloc_dep(ijob);
13511352
if (err)
13521353
return err;
13531354
}
13541355

13551356
if (mjob) {
1356-
err = xe_gt_tlb_inval_job_alloc_dep(mjob);
1357+
err = xe_tlb_inval_job_alloc_dep(mjob);
13571358
if (err)
13581359
return err;
13591360
}
@@ -2353,6 +2354,15 @@ static const struct xe_migrate_pt_update_ops svm_migrate_ops = {
23532354
static const struct xe_migrate_pt_update_ops svm_migrate_ops;
23542355
#endif
23552356

2357+
static struct xe_dep_scheduler *to_dep_scheduler(struct xe_exec_queue *q,
2358+
struct xe_gt *gt)
2359+
{
2360+
if (xe_gt_is_media_type(gt))
2361+
return q->tlb_inval[XE_EXEC_QUEUE_TLB_INVAL_MEDIA_GT].dep_scheduler;
2362+
2363+
return q->tlb_inval[XE_EXEC_QUEUE_TLB_INVAL_PRIMARY_GT].dep_scheduler;
2364+
}
2365+
23562366
/**
23572367
* xe_pt_update_ops_run() - Run PT update operations
23582368
* @tile: Tile of PT update operations
@@ -2371,7 +2381,7 @@ xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops)
23712381
struct xe_vm_pgtable_update_ops *pt_update_ops =
23722382
&vops->pt_update_ops[tile->id];
23732383
struct dma_fence *fence, *ifence, *mfence;
2374-
struct xe_gt_tlb_inval_job *ijob = NULL, *mjob = NULL;
2384+
struct xe_tlb_inval_job *ijob = NULL, *mjob = NULL;
23752385
struct dma_fence **fences = NULL;
23762386
struct dma_fence_array *cf = NULL;
23772387
struct xe_range_fence *rfence;
@@ -2403,23 +2413,30 @@ xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops)
24032413
#endif
24042414

24052415
if (pt_update_ops->needs_invalidation) {
2406-
ijob = xe_gt_tlb_inval_job_create(pt_update_ops->q,
2407-
tile->primary_gt,
2408-
pt_update_ops->start,
2409-
pt_update_ops->last,
2410-
vm->usm.asid);
2416+
struct xe_exec_queue *q = pt_update_ops->q;
2417+
struct xe_dep_scheduler *dep_scheduler =
2418+
to_dep_scheduler(q, tile->primary_gt);
2419+
2420+
ijob = xe_tlb_inval_job_create(q, &tile->primary_gt->tlb_inval,
2421+
dep_scheduler,
2422+
pt_update_ops->start,
2423+
pt_update_ops->last,
2424+
vm->usm.asid);
24112425
if (IS_ERR(ijob)) {
24122426
err = PTR_ERR(ijob);
24132427
goto kill_vm_tile1;
24142428
}
24152429
update.ijob = ijob;
24162430

24172431
if (tile->media_gt) {
2418-
mjob = xe_gt_tlb_inval_job_create(pt_update_ops->q,
2419-
tile->media_gt,
2420-
pt_update_ops->start,
2421-
pt_update_ops->last,
2422-
vm->usm.asid);
2432+
dep_scheduler = to_dep_scheduler(q, tile->media_gt);
2433+
2434+
mjob = xe_tlb_inval_job_create(q,
2435+
&tile->media_gt->tlb_inval,
2436+
dep_scheduler,
2437+
pt_update_ops->start,
2438+
pt_update_ops->last,
2439+
vm->usm.asid);
24232440
if (IS_ERR(mjob)) {
24242441
err = PTR_ERR(mjob);
24252442
goto free_ijob;
@@ -2470,13 +2487,13 @@ xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops)
24702487
if (ijob) {
24712488
struct dma_fence *__fence;
24722489

2473-
ifence = xe_gt_tlb_inval_job_push(ijob, tile->migrate, fence);
2490+
ifence = xe_tlb_inval_job_push(ijob, tile->migrate, fence);
24742491
__fence = ifence;
24752492

24762493
if (mjob) {
24772494
fences[0] = ifence;
2478-
mfence = xe_gt_tlb_inval_job_push(mjob, tile->migrate,
2479-
fence);
2495+
mfence = xe_tlb_inval_job_push(mjob, tile->migrate,
2496+
fence);
24802497
fences[1] = mfence;
24812498

24822499
dma_fence_array_init(cf, 2, fences,
@@ -2519,8 +2536,8 @@ xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops)
25192536
if (pt_update_ops->needs_userptr_lock)
25202537
up_read(&vm->userptr.notifier_lock);
25212538

2522-
xe_gt_tlb_inval_job_put(mjob);
2523-
xe_gt_tlb_inval_job_put(ijob);
2539+
xe_tlb_inval_job_put(mjob);
2540+
xe_tlb_inval_job_put(ijob);
25242541

25252542
return fence;
25262543

@@ -2529,8 +2546,8 @@ xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops)
25292546
free_ijob:
25302547
kfree(cf);
25312548
kfree(fences);
2532-
xe_gt_tlb_inval_job_put(mjob);
2533-
xe_gt_tlb_inval_job_put(ijob);
2549+
xe_tlb_inval_job_put(mjob);
2550+
xe_tlb_inval_job_put(ijob);
25342551
kill_vm_tile1:
25352552
if (err != -EAGAIN && err != -ENODATA && tile->id)
25362553
xe_vm_kill(vops->vm, false);

0 commit comments

Comments
 (0)