Skip to content

Commit d115a38

Browse files
committed
Merge tag 'drm-intel-gt-next-2025-02-26' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next
UAPI Changes: - Add sysfs for SLPC power profiles [slpc] (Vinay Belgaumkar) Driver Changes: Fixes/improvements/new stuff: - Fix zero delta busyness issue [pmu] (Umesh Nerlige Ramappa) - Fix page cleanup on DMA remap failure (Brian Geffon) - Debug print LRC state entries only if the context is pinned [guc] (Daniele Ceraolo Spurio) - Drop custom hotplug code [pmu] (Lucas De Marchi) - Use spin_lock_irqsave() in interruptible context [guc] (Krzysztof Karas) - Add wait on depth stall done bit handling [gen12] (Juha-Pekka Heikkila) Miscellaneous: - Change throttle criteria for rps [selftest] (Raag Jadav) - Add debug print about hw config table size (John Harrison) - Include requested frequency in slow firmware load messages [uc] (John Harrison) - Remove i915_pmu_event_event_idx() [pmu] (Lucas De Marchi) - Remove unused live_context_for_engine (Dr. David Alan Gilbert) - Add Wa_22010465259 in its respective WA list (Ranu Maurya) - Correct frequency handling in RPS power measurement [selftests] (Sk Anirban) - Add helper function slpc_measure_power [guc/slpc] (Sk Anirban) - Revert "drm/i915/gt: Log reason for setting TAINT_WARN at reset" [gt] (Sebastian Brzezinka) - Avoid using uninitialized context [selftests] (Krzysztof Karas) - Use struct_size() helper in kmalloc() (luoqing) - Use prandom in selftest [selftests] (Markus Theil) - Replace kmap with its safer kmap_local_page counterpart [gt] (Andi Shyti) Merges: - Merge drm/drm-next into drm-intel-gt-next (Tvrtko Ursulin) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Tvrtko Ursulin <tursulin@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/Z77NLt2mR7SqxJ4u@linux
2 parents 4e64a62 + 7ded94b commit d115a38

23 files changed

+193
-212
lines changed

drivers/gpu/drm/i915/gem/selftests/mock_context.c

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -107,44 +107,6 @@ live_context(struct drm_i915_private *i915, struct file *file)
107107
return ERR_PTR(err);
108108
}
109109

110-
struct i915_gem_context *
111-
live_context_for_engine(struct intel_engine_cs *engine, struct file *file)
112-
{
113-
struct i915_gem_engines *engines;
114-
struct i915_gem_context *ctx;
115-
struct intel_sseu null_sseu = {};
116-
struct intel_context *ce;
117-
118-
engines = alloc_engines(1);
119-
if (!engines)
120-
return ERR_PTR(-ENOMEM);
121-
122-
ctx = live_context(engine->i915, file);
123-
if (IS_ERR(ctx)) {
124-
__free_engines(engines, 0);
125-
return ctx;
126-
}
127-
128-
ce = intel_context_create(engine);
129-
if (IS_ERR(ce)) {
130-
__free_engines(engines, 0);
131-
return ERR_CAST(ce);
132-
}
133-
134-
intel_context_set_gem(ce, ctx, null_sseu);
135-
engines->engines[0] = ce;
136-
engines->num_engines = 1;
137-
138-
mutex_lock(&ctx->engines_mutex);
139-
i915_gem_context_set_user_engines(ctx);
140-
engines = rcu_replace_pointer(ctx->engines, engines, 1);
141-
mutex_unlock(&ctx->engines_mutex);
142-
143-
engines_idle_release(ctx, engines);
144-
145-
return ctx;
146-
}
147-
148110
struct i915_gem_context *
149111
kernel_context(struct drm_i915_private *i915,
150112
struct i915_address_space *vm)

drivers/gpu/drm/i915/gem/selftests/mock_context.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ void mock_context_close(struct i915_gem_context *ctx);
2323
struct i915_gem_context *
2424
live_context(struct drm_i915_private *i915, struct file *file);
2525

26-
struct i915_gem_context *
27-
live_context_for_engine(struct intel_engine_cs *engine, struct file *file);
28-
2926
struct i915_gem_context *kernel_context(struct drm_i915_private *i915,
3027
struct i915_address_space *vm);
3128
void kernel_context_close(struct i915_gem_context *ctx);

drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ static struct dma_buf *mock_dmabuf(int npages)
103103
struct dma_buf *dmabuf;
104104
int i;
105105

106-
mock = kmalloc(sizeof(*mock) + npages * sizeof(struct page *),
107-
GFP_KERNEL);
106+
mock = kmalloc(struct_size(mock, pages, npages), GFP_KERNEL);
108107
if (!mock)
109108
return ERR_PTR(-ENOMEM);
110109

drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,15 +750,15 @@ static void swizzle_page(struct page *page)
750750
char *vaddr;
751751
int i;
752752

753-
vaddr = kmap(page);
753+
vaddr = kmap_local_page(page);
754754

755755
for (i = 0; i < PAGE_SIZE; i += 128) {
756756
memcpy(temp, &vaddr[i], 64);
757757
memcpy(&vaddr[i], &vaddr[i + 64], 64);
758758
memcpy(&vaddr[i + 64], temp, 64);
759759
}
760760

761-
kunmap(page);
761+
kunmap_local(vaddr);
762762
}
763763

764764
/**

drivers/gpu/drm/i915/gt/intel_gt_regs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,9 @@
409409
#define GEN7_SO_PRIM_STORAGE_NEEDED(n) _MMIO(0x5240 + (n) * 8)
410410
#define GEN7_SO_PRIM_STORAGE_NEEDED_UDW(n) _MMIO(0x5240 + (n) * 8 + 4)
411411

412+
#define GEN8_WM_CHICKEN2 MCR_REG(0x5584)
413+
#define WAIT_ON_DEPTH_STALL_DONE_DISABLE REG_BIT(5)
414+
412415
#define GEN9_WM_CHICKEN3 _MMIO(0x5588)
413416
#define GEN9_FACTOR_IN_CLR_VAL_HIZ (1 << 9)
414417

drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,45 @@ static ssize_t slpc_ignore_eff_freq_store(struct kobject *kobj,
464464
return err ?: count;
465465
}
466466

467+
static ssize_t slpc_power_profile_show(struct kobject *kobj,
468+
struct kobj_attribute *attr,
469+
char *buff)
470+
{
471+
struct intel_gt *gt = intel_gt_sysfs_get_drvdata(kobj, attr->attr.name);
472+
struct intel_guc_slpc *slpc = &gt->uc.guc.slpc;
473+
474+
switch (slpc->power_profile) {
475+
case SLPC_POWER_PROFILES_BASE:
476+
return sysfs_emit(buff, "[%s] %s\n", "base", "power_saving");
477+
case SLPC_POWER_PROFILES_POWER_SAVING:
478+
return sysfs_emit(buff, "%s [%s]\n", "base", "power_saving");
479+
}
480+
481+
return sysfs_emit(buff, "%u\n", slpc->power_profile);
482+
}
483+
484+
static ssize_t slpc_power_profile_store(struct kobject *kobj,
485+
struct kobj_attribute *attr,
486+
const char *buff, size_t count)
487+
{
488+
struct intel_gt *gt = intel_gt_sysfs_get_drvdata(kobj, attr->attr.name);
489+
struct intel_guc_slpc *slpc = &gt->uc.guc.slpc;
490+
char power_saving[] = "power_saving";
491+
char base[] = "base";
492+
int err;
493+
u32 val;
494+
495+
if (!strncmp(buff, power_saving, sizeof(power_saving) - 1))
496+
val = SLPC_POWER_PROFILES_POWER_SAVING;
497+
else if (!strncmp(buff, base, sizeof(base) - 1))
498+
val = SLPC_POWER_PROFILES_BASE;
499+
else
500+
return -EINVAL;
501+
502+
err = intel_guc_slpc_set_power_profile(slpc, val);
503+
return err ?: count;
504+
}
505+
467506
struct intel_gt_bool_throttle_attr {
468507
struct attribute attr;
469508
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
@@ -668,6 +707,7 @@ INTEL_GT_ATTR_RO(media_RP0_freq_mhz);
668707
INTEL_GT_ATTR_RO(media_RPn_freq_mhz);
669708

670709
INTEL_GT_ATTR_RW(slpc_ignore_eff_freq);
710+
INTEL_GT_ATTR_RW(slpc_power_profile);
671711

672712
static const struct attribute *media_perf_power_attrs[] = {
673713
&attr_media_freq_factor.attr,
@@ -864,6 +904,13 @@ void intel_gt_sysfs_pm_init(struct intel_gt *gt, struct kobject *kobj)
864904
gt_warn(gt, "failed to create ignore_eff_freq sysfs (%pe)", ERR_PTR(ret));
865905
}
866906

907+
if (intel_uc_uses_guc_slpc(&gt->uc)) {
908+
ret = sysfs_create_file(kobj, &attr_slpc_power_profile.attr);
909+
if (ret)
910+
gt_warn(gt, "failed to create slpc_power_profile sysfs (%pe)",
911+
ERR_PTR(ret));
912+
}
913+
867914
if (i915_mmio_reg_valid(intel_gt_perf_limit_reasons_reg(gt))) {
868915
ret = sysfs_create_files(kobj, throttle_reason_attrs);
869916
if (ret)

drivers/gpu/drm/i915/gt/intel_reset.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,6 @@ static bool __intel_gt_unset_wedged(struct intel_gt *gt)
11131113
* Warn CI about the unrecoverable wedged condition.
11141114
* Time for a reboot.
11151115
*/
1116-
gt_err(gt, "Unrecoverable wedged condition\n");
11171116
add_taint_for_CI(gt->i915, TAINT_WARN);
11181117
return false;
11191118
}
@@ -1272,10 +1271,8 @@ void intel_gt_reset(struct intel_gt *gt,
12721271
}
12731272

12741273
ret = resume(gt);
1275-
if (ret) {
1276-
gt_err(gt, "Failed to resume (%d)\n", ret);
1274+
if (ret)
12771275
goto taint;
1278-
}
12791276

12801277
finish:
12811278
reset_finish(gt, awake);
@@ -1641,7 +1638,6 @@ void intel_gt_set_wedged_on_init(struct intel_gt *gt)
16411638
set_bit(I915_WEDGED_ON_INIT, &gt->reset.flags);
16421639

16431640
/* Wedged on init is non-recoverable */
1644-
gt_err(gt, "Non-recoverable wedged on init\n");
16451641
add_taint_for_CI(gt->i915, TAINT_WARN);
16461642
}
16471643

drivers/gpu/drm/i915/gt/intel_rps.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,10 @@ void intel_rps_boost(struct i915_request *rq)
10251025
if (rps_uses_slpc(rps)) {
10261026
slpc = rps_to_slpc(rps);
10271027

1028+
/* Waitboost should not be done with power saving profile */
1029+
if (slpc->power_profile == SLPC_POWER_PROFILES_POWER_SAVING)
1030+
return;
1031+
10281032
if (slpc->min_freq_softlimit >= slpc->boost_freq)
10291033
return;
10301034

drivers/gpu/drm/i915/gt/intel_workarounds.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -691,16 +691,17 @@ static void gen12_ctx_workarounds_init(struct intel_engine_cs *engine,
691691
struct drm_i915_private *i915 = engine->i915;
692692

693693
/*
694-
* Wa_1409142259:tgl,dg1,adl-p
694+
* Wa_1409142259:tgl,dg1,adl-p,adl-n
695695
* Wa_1409347922:tgl,dg1,adl-p
696696
* Wa_1409252684:tgl,dg1,adl-p
697697
* Wa_1409217633:tgl,dg1,adl-p
698698
* Wa_1409207793:tgl,dg1,adl-p
699-
* Wa_1409178076:tgl,dg1,adl-p
700-
* Wa_1408979724:tgl,dg1,adl-p
701-
* Wa_14010443199:tgl,rkl,dg1,adl-p
702-
* Wa_14010698770:tgl,rkl,dg1,adl-s,adl-p
703-
* Wa_1409342910:tgl,rkl,dg1,adl-s,adl-p
699+
* Wa_1409178076:tgl,dg1,adl-p,adl-n
700+
* Wa_1408979724:tgl,dg1,adl-p,adl-n
701+
* Wa_14010443199:tgl,rkl,dg1,adl-p,adl-n
702+
* Wa_14010698770:tgl,rkl,dg1,adl-s,adl-p,adl-n
703+
* Wa_1409342910:tgl,rkl,dg1,adl-s,adl-p,adl-n
704+
* Wa_22010465259:tgl,rkl,dg1,adl-s,adl-p,adl-n
704705
*/
705706
wa_masked_en(wal, GEN11_COMMON_SLICE_CHICKEN3,
706707
GEN12_DISABLE_CPS_AWARE_COLOR_PIPE);
@@ -741,6 +742,12 @@ static void gen12_ctx_workarounds_init(struct intel_engine_cs *engine,
741742
/* Wa_1606376872 */
742743
wa_masked_en(wal, COMMON_SLICE_CHICKEN4, DISABLE_TDC_LOAD_BALANCING_CALC);
743744
}
745+
746+
/*
747+
* This bit must be set to enable performance optimization for fast
748+
* clears.
749+
*/
750+
wa_mcr_write_or(wal, GEN8_WM_CHICKEN2, WAIT_ON_DEPTH_STALL_DONE_DISABLE);
744751
}
745752

746753
static void dg1_ctx_workarounds_init(struct intel_engine_cs *engine,

drivers/gpu/drm/i915/gt/selftest_rps.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -477,12 +477,13 @@ int live_rps_control(void *arg)
477477
limit, intel_gpu_freq(rps, limit),
478478
min, max, ktime_to_ns(min_dt), ktime_to_ns(max_dt));
479479

480-
if (limit == rps->min_freq) {
481-
pr_err("%s: GPU throttled to minimum!\n",
482-
engine->name);
480+
if (limit != rps->max_freq) {
481+
u32 throttle = intel_uncore_read(gt->uncore,
482+
intel_gt_perf_limit_reasons_reg(gt));
483+
484+
pr_warn("%s: GPU throttled with reasons 0x%08x\n",
485+
engine->name, throttle & GT0_PERF_LIMIT_REASONS_MASK);
483486
show_pstate_limits(rps);
484-
err = -ENODEV;
485-
break;
486487
}
487488

488489
if (igt_flush_test(gt->i915)) {
@@ -1115,7 +1116,7 @@ static u64 measure_power(struct intel_rps *rps, int *freq)
11151116
for (i = 0; i < 5; i++)
11161117
x[i] = __measure_power(5);
11171118

1118-
*freq = (*freq + intel_rps_read_actual_frequency(rps)) / 2;
1119+
*freq = (*freq + read_cagf(rps)) / 2;
11191120

11201121
/* A simple triangle filter for better result stability */
11211122
sort(x, 5, sizeof(*x), cmp_u64, NULL);

0 commit comments

Comments
 (0)