Skip to content

Commit c81dbc4

Browse files
committed
Merge tag 'drm-xe-fixes-2025-05-15-1' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
Core Changes: - Add timeslicing and allocation restriction for SVM Driver Changes: - Fix shrinker debugfs name - Add HW workaround to Xe2 - Fix SVM when mixing GPU and CPU atomics - Fix per client engine utilization due to active contexts not saving timestamp with lite restore enabled. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Lucas De Marchi <lucas.demarchi@intel.com> Link: https://lore.kernel.org/r/qil4scyn6ucnt43u5ju64bi7r7n5r36k4pz5rsh2maz7isle6g@lac3jpsjrrvs
2 parents f7bf6bd + 617d824 commit c81dbc4

23 files changed

+391
-87
lines changed

drivers/gpu/drm/drm_gpusvm.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,10 @@ static void __drm_gpusvm_range_unmap_pages(struct drm_gpusvm *gpusvm,
11181118
lockdep_assert_held(&gpusvm->notifier_lock);
11191119

11201120
if (range->flags.has_dma_mapping) {
1121+
struct drm_gpusvm_range_flags flags = {
1122+
.__flags = range->flags.__flags,
1123+
};
1124+
11211125
for (i = 0, j = 0; i < npages; j++) {
11221126
struct drm_pagemap_device_addr *addr = &range->dma_addr[j];
11231127

@@ -1131,8 +1135,12 @@ static void __drm_gpusvm_range_unmap_pages(struct drm_gpusvm *gpusvm,
11311135
dev, *addr);
11321136
i += 1 << addr->order;
11331137
}
1134-
range->flags.has_devmem_pages = false;
1135-
range->flags.has_dma_mapping = false;
1138+
1139+
/* WRITE_ONCE pairs with READ_ONCE for opportunistic checks */
1140+
flags.has_devmem_pages = false;
1141+
flags.has_dma_mapping = false;
1142+
WRITE_ONCE(range->flags.__flags, flags.__flags);
1143+
11361144
range->dpagemap = NULL;
11371145
}
11381146
}
@@ -1334,6 +1342,7 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
13341342
int err = 0;
13351343
struct dev_pagemap *pagemap;
13361344
struct drm_pagemap *dpagemap;
1345+
struct drm_gpusvm_range_flags flags;
13371346

13381347
retry:
13391348
hmm_range.notifier_seq = mmu_interval_read_begin(notifier);
@@ -1378,7 +1387,8 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
13781387
*/
13791388
drm_gpusvm_notifier_lock(gpusvm);
13801389

1381-
if (range->flags.unmapped) {
1390+
flags.__flags = range->flags.__flags;
1391+
if (flags.unmapped) {
13821392
drm_gpusvm_notifier_unlock(gpusvm);
13831393
err = -EFAULT;
13841394
goto err_free;
@@ -1454,6 +1464,11 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
14541464
goto err_unmap;
14551465
}
14561466

1467+
if (ctx->devmem_only) {
1468+
err = -EFAULT;
1469+
goto err_unmap;
1470+
}
1471+
14571472
addr = dma_map_page(gpusvm->drm->dev,
14581473
page, 0,
14591474
PAGE_SIZE << order,
@@ -1469,14 +1484,17 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
14691484
}
14701485
i += 1 << order;
14711486
num_dma_mapped = i;
1472-
range->flags.has_dma_mapping = true;
1487+
flags.has_dma_mapping = true;
14731488
}
14741489

14751490
if (zdd) {
1476-
range->flags.has_devmem_pages = true;
1491+
flags.has_devmem_pages = true;
14771492
range->dpagemap = dpagemap;
14781493
}
14791494

1495+
/* WRITE_ONCE pairs with READ_ONCE for opportunistic checks */
1496+
WRITE_ONCE(range->flags.__flags, flags.__flags);
1497+
14801498
drm_gpusvm_notifier_unlock(gpusvm);
14811499
kvfree(pfns);
14821500
set_seqno:
@@ -1765,6 +1783,8 @@ int drm_gpusvm_migrate_to_devmem(struct drm_gpusvm *gpusvm,
17651783
goto err_finalize;
17661784

17671785
/* Upon success bind devmem allocation to range and zdd */
1786+
devmem_allocation->timeslice_expiration = get_jiffies_64() +
1787+
msecs_to_jiffies(ctx->timeslice_ms);
17681788
zdd->devmem_allocation = devmem_allocation; /* Owns ref */
17691789

17701790
err_finalize:
@@ -1985,6 +2005,13 @@ static int __drm_gpusvm_migrate_to_ram(struct vm_area_struct *vas,
19852005
void *buf;
19862006
int i, err = 0;
19872007

2008+
if (page) {
2009+
zdd = page->zone_device_data;
2010+
if (time_before64(get_jiffies_64(),
2011+
zdd->devmem_allocation->timeslice_expiration))
2012+
return 0;
2013+
}
2014+
19882015
start = ALIGN_DOWN(fault_addr, size);
19892016
end = ALIGN(fault_addr + 1, size);
19902017

drivers/gpu/drm/xe/instructions/xe_mi_commands.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
#define MI_LRI_FORCE_POSTED REG_BIT(12)
4848
#define MI_LRI_LEN(x) (((x) & 0xff) + 1)
4949

50+
#define MI_STORE_REGISTER_MEM (__MI_INSTR(0x24) | XE_INSTR_NUM_DW(4))
51+
#define MI_SRM_USE_GGTT REG_BIT(22)
52+
#define MI_SRM_ADD_CS_OFFSET REG_BIT(19)
53+
5054
#define MI_FLUSH_DW __MI_INSTR(0x26)
5155
#define MI_FLUSH_DW_PROTECTED_MEM_EN REG_BIT(22)
5256
#define MI_FLUSH_DW_STORE_INDEX REG_BIT(21)

drivers/gpu/drm/xe/regs/xe_engine_regs.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
#define XEHPC_BCS8_RING_BASE 0x3ee000
4444
#define GSCCS_RING_BASE 0x11a000
4545

46+
#define ENGINE_ID(base) XE_REG((base) + 0x8c)
47+
#define ENGINE_INSTANCE_ID REG_GENMASK(9, 4)
48+
#define ENGINE_CLASS_ID REG_GENMASK(2, 0)
49+
4650
#define RING_TAIL(base) XE_REG((base) + 0x30)
4751
#define TAIL_ADDR REG_GENMASK(20, 3)
4852

@@ -154,6 +158,7 @@
154158
#define STOP_RING REG_BIT(8)
155159

156160
#define RING_CTX_TIMESTAMP(base) XE_REG((base) + 0x3a8)
161+
#define RING_CTX_TIMESTAMP_UDW(base) XE_REG((base) + 0x3ac)
157162
#define CSBE_DEBUG_STATUS(base) XE_REG((base) + 0x3fc)
158163

159164
#define RING_FORCE_TO_NONPRIV(base, i) XE_REG(((base) + 0x4d0) + (i) * 4)

drivers/gpu/drm/xe/regs/xe_gt_regs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@
157157
#define XEHPG_SC_INSTDONE_EXTRA2 XE_REG_MCR(0x7108)
158158

159159
#define COMMON_SLICE_CHICKEN4 XE_REG(0x7300, XE_REG_OPTION_MASKED)
160+
#define SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE REG_BIT(12)
160161
#define DISABLE_TDC_LOAD_BALANCING_CALC REG_BIT(6)
161162

162163
#define COMMON_SLICE_CHICKEN3 XE_REG(0x7304, XE_REG_OPTION_MASKED)

drivers/gpu/drm/xe/regs/xe_lrc_layout.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
#define CTX_RING_TAIL (0x06 + 1)
1212
#define CTX_RING_START (0x08 + 1)
1313
#define CTX_RING_CTL (0x0a + 1)
14+
#define CTX_BB_PER_CTX_PTR (0x12 + 1)
1415
#define CTX_TIMESTAMP (0x22 + 1)
16+
#define CTX_TIMESTAMP_UDW (0x24 + 1)
1517
#define CTX_INDIRECT_RING_STATE (0x26 + 1)
1618
#define CTX_PDP0_UDW (0x30 + 1)
1719
#define CTX_PDP0_LDW (0x32 + 1)

drivers/gpu/drm/xe/xe_device_types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ struct xe_device {
330330
u8 has_sriov:1;
331331
/** @info.has_usm: Device has unified shared memory support */
332332
u8 has_usm:1;
333+
/** @info.has_64bit_timestamp: Device supports 64-bit timestamps */
334+
u8 has_64bit_timestamp:1;
333335
/** @info.is_dgfx: is discrete device */
334336
u8 is_dgfx:1;
335337
/**

drivers/gpu/drm/xe/xe_exec_queue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)
830830
{
831831
struct xe_device *xe = gt_to_xe(q->gt);
832832
struct xe_lrc *lrc;
833-
u32 old_ts, new_ts;
833+
u64 old_ts, new_ts;
834834
int idx;
835835

836836
/*

drivers/gpu/drm/xe/xe_guc_submit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ static bool check_timeout(struct xe_exec_queue *q, struct xe_sched_job *job)
941941
return xe_sched_invalidate_job(job, 2);
942942
}
943943

944-
ctx_timestamp = xe_lrc_ctx_timestamp(q->lrc[0]);
944+
ctx_timestamp = lower_32_bits(xe_lrc_ctx_timestamp(q->lrc[0]));
945945
ctx_job_timestamp = xe_lrc_ctx_job_timestamp(q->lrc[0]);
946946

947947
/*

0 commit comments

Comments
 (0)