Skip to content

Commit fd6fe08

Browse files
icklejlahtine-intel
authored andcommitted
drm/i915/gt: Call intel_gt_sanitize() directly
Assume all responsibility for operating on the HW to sanitize the GT state upon load/resume in intel_gt_sanitize() itself. Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Andi Shyti <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 797a615) Signed-off-by: Joonas Lahtinen <[email protected]>
1 parent 8eb4704 commit fd6fe08

File tree

10 files changed

+43
-58
lines changed

10 files changed

+43
-58
lines changed

drivers/gpu/drm/i915/gem/i915_gem_pm.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ void i915_gem_suspend(struct drm_i915_private *i915)
7474
* not rely on its state.
7575
*/
7676
intel_gt_suspend(&i915->gt);
77-
intel_uc_suspend(&i915->gt.uc);
7877

7978
i915_gem_drain_freed_objects(i915);
8079
}
@@ -140,8 +139,6 @@ void i915_gem_suspend_late(struct drm_i915_private *i915)
140139
list_splice_tail(&keep, *phase);
141140
}
142141
spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
143-
144-
i915_gem_sanitize(i915);
145142
}
146143

147144
void i915_gem_resume(struct drm_i915_private *i915)
@@ -161,8 +158,6 @@ void i915_gem_resume(struct drm_i915_private *i915)
161158
if (intel_gt_resume(&i915->gt))
162159
goto err_wedged;
163160

164-
intel_uc_resume(&i915->gt.uc);
165-
166161
/* Always reload a context for powersaving. */
167162
if (!switch_to_kernel_context_sync(&i915->gt))
168163
goto err_wedged;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
3131
intel_uc_init_early(&gt->uc);
3232
}
3333

34-
void intel_gt_init_hw_early(struct drm_i915_private *i915)
34+
void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt)
3535
{
36-
i915->gt.ggtt = &i915->ggtt;
36+
gt->ggtt = ggtt;
37+
38+
intel_gt_sanitize(gt, false);
3739
}
3840

3941
static void init_unused_ring(struct intel_gt *gt, u32 base)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static inline struct intel_gt *huc_to_gt(struct intel_huc *huc)
2828
}
2929

3030
void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915);
31-
void intel_gt_init_hw_early(struct drm_i915_private *i915);
31+
void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt);
3232
int __must_check intel_gt_init_hw(struct intel_gt *gt);
3333
int intel_gt_init(struct intel_gt *gt);
3434
void intel_gt_driver_register(struct intel_gt *gt);

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,31 @@ void intel_gt_sanitize(struct intel_gt *gt, bool force)
118118
{
119119
struct intel_engine_cs *engine;
120120
enum intel_engine_id id;
121+
intel_wakeref_t wakeref;
121122

122-
GEM_TRACE("\n");
123+
GEM_TRACE("force:%s\n", yesno(force));
124+
125+
/* Use a raw wakeref to avoid calling intel_display_power_get early */
126+
wakeref = intel_runtime_pm_get(gt->uncore->rpm);
127+
intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
128+
129+
/*
130+
* As we have just resumed the machine and woken the device up from
131+
* deep PCI sleep (presumably D3_cold), assume the HW has been reset
132+
* back to defaults, recovering from whatever wedged state we left it
133+
* in and so worth trying to use the device once more.
134+
*/
135+
if (intel_gt_is_wedged(gt))
136+
intel_gt_unset_wedged(gt);
123137

124138
intel_uc_sanitize(&gt->uc);
125139

126140
for_each_engine(engine, gt, id)
127141
if (engine->reset.prepare)
128142
engine->reset.prepare(engine);
129143

144+
intel_uc_reset_prepare(&gt->uc);
145+
130146
if (reset_engines(gt) || force) {
131147
for_each_engine(engine, gt, id)
132148
__intel_engine_reset(engine, false);
@@ -135,6 +151,9 @@ void intel_gt_sanitize(struct intel_gt *gt, bool force)
135151
for_each_engine(engine, gt, id)
136152
if (engine->reset.finish)
137153
engine->reset.finish(engine);
154+
155+
intel_uncore_forcewake_put(gt->uncore, FORCEWAKE_ALL);
156+
intel_runtime_pm_put(gt->uncore->rpm, wakeref);
138157
}
139158

140159
void intel_gt_pm_fini(struct intel_gt *gt)
@@ -148,6 +167,8 @@ int intel_gt_resume(struct intel_gt *gt)
148167
enum intel_engine_id id;
149168
int err = 0;
150169

170+
GEM_TRACE("\n");
171+
151172
/*
152173
* After resume, we may need to poke into the pinned kernel
153174
* contexts to paper over any damage caused by the sudden suspend.
@@ -186,6 +207,9 @@ int intel_gt_resume(struct intel_gt *gt)
186207
}
187208

188209
intel_rc6_enable(&gt->rc6);
210+
211+
intel_uc_resume(&gt->uc);
212+
189213
intel_uncore_forcewake_put(gt->uncore, FORCEWAKE_ALL);
190214
intel_gt_pm_put(gt);
191215

@@ -212,20 +236,30 @@ void intel_gt_suspend(struct intel_gt *gt)
212236
/* We expect to be idle already; but also want to be independent */
213237
wait_for_idle(gt);
214238

239+
intel_uc_suspend(&gt->uc);
240+
215241
with_intel_runtime_pm(gt->uncore->rpm, wakeref) {
216242
intel_rps_disable(&gt->rps);
217243
intel_rc6_disable(&gt->rc6);
218244
intel_llc_disable(&gt->llc);
219245
}
246+
247+
intel_gt_sanitize(gt, false);
248+
249+
GEM_TRACE("\n");
220250
}
221251

222252
void intel_gt_runtime_suspend(struct intel_gt *gt)
223253
{
224254
intel_uc_runtime_suspend(&gt->uc);
255+
256+
GEM_TRACE("\n");
225257
}
226258

227259
int intel_gt_runtime_resume(struct intel_gt *gt)
228260
{
261+
GEM_TRACE("\n");
262+
229263
intel_gt_init_swizzling(gt);
230264

231265
return intel_uc_runtime_resume(&gt->uc);

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
603603
if (ret)
604604
goto err_uncore;
605605

606-
i915_gem_init_mmio(dev_priv);
607-
608606
return 0;
609607

610608
err_uncore:
@@ -1177,7 +1175,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
11771175
if (ret)
11781176
goto err_ggtt;
11791177

1180-
intel_gt_init_hw_early(dev_priv);
1178+
intel_gt_init_hw_early(&dev_priv->gt, &dev_priv->ggtt);
11811179

11821180
ret = i915_ggtt_enable_hw(dev_priv);
11831181
if (ret) {
@@ -1821,7 +1819,7 @@ static int i915_drm_resume(struct drm_device *dev)
18211819

18221820
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
18231821

1824-
i915_gem_sanitize(dev_priv);
1822+
intel_gt_sanitize(&dev_priv->gt, true);
18251823

18261824
ret = i915_ggtt_enable_hw(dev_priv);
18271825
if (ret)
@@ -1952,8 +1950,6 @@ static int i915_drm_resume_early(struct drm_device *dev)
19521950

19531951
intel_power_domains_resume(dev_priv);
19541952

1955-
intel_gt_sanitize(&dev_priv->gt, true);
1956-
19571953
enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
19581954

19591955
return ret;

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,7 +1779,6 @@ int i915_getparam_ioctl(struct drm_device *dev, void *data,
17791779
/* i915_gem.c */
17801780
int i915_gem_init_userptr(struct drm_i915_private *dev_priv);
17811781
void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv);
1782-
void i915_gem_sanitize(struct drm_i915_private *i915);
17831782
void i915_gem_init_early(struct drm_i915_private *dev_priv);
17841783
void i915_gem_cleanup_early(struct drm_i915_private *dev_priv);
17851784
int i915_gem_freeze(struct drm_i915_private *dev_priv);
@@ -1863,7 +1862,6 @@ static inline u32 i915_reset_engine_count(struct i915_gpu_error *error,
18631862
return atomic_read(&error->reset_engine_count[engine->uabi_class]);
18641863
}
18651864

1866-
void i915_gem_init_mmio(struct drm_i915_private *i915);
18671865
int __must_check i915_gem_init(struct drm_i915_private *dev_priv);
18681866
void i915_gem_driver_register(struct drm_i915_private *i915);
18691867
void i915_gem_driver_unregister(struct drm_i915_private *i915);

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,38 +1039,6 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
10391039
return err;
10401040
}
10411041

1042-
void i915_gem_sanitize(struct drm_i915_private *i915)
1043-
{
1044-
intel_wakeref_t wakeref;
1045-
1046-
GEM_TRACE("\n");
1047-
1048-
wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1049-
intel_uncore_forcewake_get(&i915->uncore, FORCEWAKE_ALL);
1050-
1051-
/*
1052-
* As we have just resumed the machine and woken the device up from
1053-
* deep PCI sleep (presumably D3_cold), assume the HW has been reset
1054-
* back to defaults, recovering from whatever wedged state we left it
1055-
* in and so worth trying to use the device once more.
1056-
*/
1057-
if (intel_gt_is_wedged(&i915->gt))
1058-
intel_gt_unset_wedged(&i915->gt);
1059-
1060-
/*
1061-
* If we inherit context state from the BIOS or earlier occupants
1062-
* of the GPU, the GPU may be in an inconsistent state when we
1063-
* try to take over. The only way to remove the earlier state
1064-
* is by resetting. However, resetting on earlier gen is tricky as
1065-
* it may impact the display and we are uncertain about the stability
1066-
* of the reset, so this could be applied to even earlier gen.
1067-
*/
1068-
intel_gt_sanitize(&i915->gt, false);
1069-
1070-
intel_uncore_forcewake_put(&i915->uncore, FORCEWAKE_ALL);
1071-
intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1072-
}
1073-
10741042
static int __intel_engines_record_defaults(struct intel_gt *gt)
10751043
{
10761044
struct i915_request *requests[I915_NUM_ENGINES] = {};
@@ -1413,11 +1381,6 @@ void i915_gem_driver_release(struct drm_i915_private *dev_priv)
14131381
WARN_ON(!list_empty(&dev_priv->gem.contexts.list));
14141382
}
14151383

1416-
void i915_gem_init_mmio(struct drm_i915_private *i915)
1417-
{
1418-
i915_gem_sanitize(i915);
1419-
}
1420-
14211384
static void i915_gem_init__mm(struct drm_i915_private *i915)
14221385
{
14231386
spin_lock_init(&i915->mm.obj_lock);

drivers/gpu/drm/i915/selftests/i915_gem.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ static void pm_resume(struct drm_i915_private *i915)
124124
*/
125125
with_intel_runtime_pm(&i915->runtime_pm, wakeref) {
126126
intel_gt_sanitize(&i915->gt, false);
127-
i915_gem_sanitize(i915);
128127

129128
i915_gem_restore_gtt_mappings(i915);
130129
i915_gem_restore_fences(&i915->ggtt);

drivers/gpu/drm/i915/selftests/mock_gem_device.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ struct drm_i915_private *mock_gem_device(void)
183183
intel_timelines_init(i915);
184184

185185
mock_init_ggtt(i915, &i915->ggtt);
186-
i915->gt.ggtt = &i915->ggtt;
187186

188187
mkwrite_device_info(i915)->engine_mask = BIT(0);
189188

drivers/gpu/drm/i915/selftests/mock_gtt.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ void mock_init_ggtt(struct drm_i915_private *i915, struct i915_ggtt *ggtt)
118118
ggtt->vm.vma_ops.clear_pages = clear_pages;
119119

120120
i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT);
121-
122-
intel_gt_init_hw_early(i915);
121+
i915->gt.ggtt = ggtt;
123122
}
124123

125124
void mock_fini_ggtt(struct i915_ggtt *ggtt)

0 commit comments

Comments
 (0)