Skip to content

Commit 524d4f7

Browse files
committed
Merge tag 'drm-intel-fixes-2020-07-15' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
drm/i915 fixes for v5.8-rc6: - FBC w/a stride fix - Fix use-after-free fix on module reload - Ignore irq enabling on the virtual engines to fix device sleep - Use GTT when saving/restoring engine GPR - Fix selftest sort function Signed-off-by: Dave Airlie <[email protected]> From: Jani Nikula <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 03d54ef + 92e0575 commit 524d4f7

File tree

6 files changed

+39
-33
lines changed

6 files changed

+39
-33
lines changed

drivers/gpu/drm/i915/display/intel_fbc.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,25 @@ static bool intel_fbc_cfb_size_changed(struct drm_i915_private *dev_priv)
719719
fbc->compressed_fb.size * fbc->threshold;
720720
}
721721

722+
static u16 intel_fbc_gen9_wa_cfb_stride(struct drm_i915_private *dev_priv)
723+
{
724+
struct intel_fbc *fbc = &dev_priv->fbc;
725+
struct intel_fbc_state_cache *cache = &fbc->state_cache;
726+
727+
if ((IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) &&
728+
cache->fb.modifier != I915_FORMAT_MOD_X_TILED)
729+
return DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->threshold) * 8;
730+
else
731+
return 0;
732+
}
733+
734+
static bool intel_fbc_gen9_wa_cfb_stride_changed(struct drm_i915_private *dev_priv)
735+
{
736+
struct intel_fbc *fbc = &dev_priv->fbc;
737+
738+
return fbc->params.gen9_wa_cfb_stride != intel_fbc_gen9_wa_cfb_stride(dev_priv);
739+
}
740+
722741
static bool intel_fbc_can_enable(struct drm_i915_private *dev_priv)
723742
{
724743
struct intel_fbc *fbc = &dev_priv->fbc;
@@ -877,6 +896,7 @@ static void intel_fbc_get_reg_params(struct intel_crtc *crtc,
877896
params->crtc.i9xx_plane = to_intel_plane(crtc->base.primary)->i9xx_plane;
878897

879898
params->fb.format = cache->fb.format;
899+
params->fb.modifier = cache->fb.modifier;
880900
params->fb.stride = cache->fb.stride;
881901

882902
params->cfb_size = intel_fbc_calculate_cfb_size(dev_priv, cache);
@@ -906,6 +926,9 @@ static bool intel_fbc_can_flip_nuke(const struct intel_crtc_state *crtc_state)
906926
if (params->fb.format != cache->fb.format)
907927
return false;
908928

929+
if (params->fb.modifier != cache->fb.modifier)
930+
return false;
931+
909932
if (params->fb.stride != cache->fb.stride)
910933
return false;
911934

@@ -1185,7 +1208,8 @@ void intel_fbc_enable(struct intel_atomic_state *state,
11851208

11861209
if (fbc->crtc) {
11871210
if (fbc->crtc != crtc ||
1188-
!intel_fbc_cfb_size_changed(dev_priv))
1211+
(!intel_fbc_cfb_size_changed(dev_priv) &&
1212+
!intel_fbc_gen9_wa_cfb_stride_changed(dev_priv)))
11891213
goto out;
11901214

11911215
__intel_fbc_disable(dev_priv);
@@ -1207,12 +1231,7 @@ void intel_fbc_enable(struct intel_atomic_state *state,
12071231
goto out;
12081232
}
12091233

1210-
if ((IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) &&
1211-
plane_state->hw.fb->modifier != I915_FORMAT_MOD_X_TILED)
1212-
cache->gen9_wa_cfb_stride =
1213-
DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->threshold) * 8;
1214-
else
1215-
cache->gen9_wa_cfb_stride = 0;
1234+
cache->gen9_wa_cfb_stride = intel_fbc_gen9_wa_cfb_stride(dev_priv);
12161235

12171236
drm_dbg_kms(&dev_priv->drm, "Enabling FBC on pipe %c\n",
12181237
pipe_name(crtc->pipe));

drivers/gpu/drm/i915/display/intel_hdmi.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,19 +2867,13 @@ intel_hdmi_connector_register(struct drm_connector *connector)
28672867
return ret;
28682868
}
28692869

2870-
static void intel_hdmi_destroy(struct drm_connector *connector)
2870+
static void intel_hdmi_connector_unregister(struct drm_connector *connector)
28712871
{
28722872
struct cec_notifier *n = intel_attached_hdmi(to_intel_connector(connector))->cec_notifier;
28732873

28742874
cec_notifier_conn_unregister(n);
28752875

2876-
intel_connector_destroy(connector);
2877-
}
2878-
2879-
static void intel_hdmi_connector_unregister(struct drm_connector *connector)
2880-
{
28812876
intel_hdmi_remove_i2c_symlink(connector);
2882-
28832877
intel_connector_unregister(connector);
28842878
}
28852879

@@ -2891,7 +2885,7 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
28912885
.atomic_set_property = intel_digital_connector_atomic_set_property,
28922886
.late_register = intel_hdmi_connector_register,
28932887
.early_unregister = intel_hdmi_connector_unregister,
2894-
.destroy = intel_hdmi_destroy,
2888+
.destroy = intel_connector_destroy,
28952889
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
28962890
.atomic_duplicate_state = intel_digital_connector_duplicate_state,
28972891
};

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5396,13 +5396,8 @@ static void virtual_engine_initial_hint(struct virtual_engine *ve)
53965396
* typically be the first we inspect for submission.
53975397
*/
53985398
swp = prandom_u32_max(ve->num_siblings);
5399-
if (!swp)
5400-
return;
5401-
5402-
swap(ve->siblings[swp], ve->siblings[0]);
5403-
if (!intel_engine_has_relative_mmio(ve->siblings[0]))
5404-
virtual_update_register_offsets(ve->context.lrc_reg_state,
5405-
ve->siblings[0]);
5399+
if (swp)
5400+
swap(ve->siblings[swp], ve->siblings[0]);
54065401
}
54075402

54085403
static int virtual_context_alloc(struct intel_context *ce)
@@ -5415,15 +5410,9 @@ static int virtual_context_alloc(struct intel_context *ce)
54155410
static int virtual_context_pin(struct intel_context *ce)
54165411
{
54175412
struct virtual_engine *ve = container_of(ce, typeof(*ve), context);
5418-
int err;
54195413

54205414
/* Note: we must use a real engine class for setting up reg state */
5421-
err = __execlists_context_pin(ce, ve->siblings[0]);
5422-
if (err)
5423-
return err;
5424-
5425-
virtual_engine_initial_hint(ve);
5426-
return 0;
5415+
return __execlists_context_pin(ce, ve->siblings[0]);
54275416
}
54285417

54295418
static void virtual_context_enter(struct intel_context *ce)
@@ -5688,6 +5677,7 @@ intel_execlists_create_virtual(struct intel_engine_cs **siblings,
56885677
intel_engine_init_active(&ve->base, ENGINE_VIRTUAL);
56895678
intel_engine_init_breadcrumbs(&ve->base);
56905679
intel_engine_init_execlists(&ve->base);
5680+
ve->base.breadcrumbs.irq_armed = true; /* fake HW, used for irq_work */
56915681

56925682
ve->base.cops = &virtual_context_ops;
56935683
ve->base.request_alloc = execlists_request_alloc;
@@ -5769,6 +5759,7 @@ intel_execlists_create_virtual(struct intel_engine_cs **siblings,
57695759

57705760
ve->base.flags |= I915_ENGINE_IS_VIRTUAL;
57715761

5762+
virtual_engine_initial_hint(ve);
57725763
return &ve->context;
57735764

57745765
err_put:

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ static int cmp_u64(const void *A, const void *B)
4444
{
4545
const u64 *a = A, *b = B;
4646

47-
if (a < b)
47+
if (*a < *b)
4848
return -1;
49-
else if (a > b)
49+
else if (*a > *b)
5050
return 1;
5151
else
5252
return 0;
@@ -56,9 +56,9 @@ static int cmp_u32(const void *A, const void *B)
5656
{
5757
const u32 *a = A, *b = B;
5858

59-
if (a < b)
59+
if (*a < *b)
6060
return -1;
61-
else if (a > b)
61+
else if (*a > *b)
6262
return 1;
6363
else
6464
return 0;

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ struct intel_fbc {
440440
struct {
441441
const struct drm_format_info *format;
442442
unsigned int stride;
443+
u64 modifier;
443444
} fb;
444445

445446
int cfb_size;

drivers/gpu/drm/i915/i915_perf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,7 @@ static u32 *save_restore_register(struct i915_perf_stream *stream, u32 *cs,
15921592
u32 d;
15931593

15941594
cmd = save ? MI_STORE_REGISTER_MEM : MI_LOAD_REGISTER_MEM;
1595+
cmd |= MI_SRM_LRM_GLOBAL_GTT;
15951596
if (INTEL_GEN(stream->perf->i915) >= 8)
15961597
cmd++;
15971598

0 commit comments

Comments
 (0)