Skip to content

Commit 33ce21d

Browse files
committed
Merge tag 'drm-intel-next-fixes-2018-06-08-2' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
First batch of i915 fixes for v4.18: - gvt fixes that missed v4.17, potentially need to be backported - eDP resolution regression revert - remove broken nv12 special casing - remove stale asserts from find active requests Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/87y3fp4h15.fsf@intel.com
2 parents 68a1413 + 807cba6 commit 33ce21d

File tree

15 files changed

+66
-70
lines changed

15 files changed

+66
-70
lines changed

drivers/gpu/drm/i915/gvt/cmd_parser.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,6 +2909,7 @@ static int init_cmd_table(struct intel_gvt *gvt)
29092909
if (info) {
29102910
gvt_err("%s %s duplicated\n", e->info->name,
29112911
info->name);
2912+
kfree(e);
29122913
return -EEXIST;
29132914
}
29142915

drivers/gpu/drm/i915/gvt/display.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
#define AUX_NATIVE_REPLY_NAK (0x1 << 4)
6868
#define AUX_NATIVE_REPLY_DEFER (0x2 << 4)
6969

70-
#define AUX_BURST_SIZE 16
70+
#define AUX_BURST_SIZE 20
7171

7272
/* DPCD addresses */
7373
#define DPCD_REV 0x000

drivers/gpu/drm/i915/gvt/handlers.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -903,11 +903,14 @@ static int dp_aux_ch_ctl_mmio_write(struct intel_vgpu *vgpu,
903903
}
904904

905905
/*
906-
* Write request format: (command + address) occupies
907-
* 3 bytes, followed by (len + 1) bytes of data.
906+
* Write request format: Headr (command + address + size) occupies
907+
* 4 bytes, followed by (len + 1) bytes of data. See details at
908+
* intel_dp_aux_transfer().
908909
*/
909-
if (WARN_ON((len + 4) > AUX_BURST_SIZE))
910+
if ((len + 1 + 4) > AUX_BURST_SIZE) {
911+
gvt_vgpu_err("dp_aux_header: len %d is too large\n", len);
910912
return -EINVAL;
913+
}
911914

912915
/* unpack data from vreg to buf */
913916
for (t = 0; t < 4; t++) {
@@ -971,8 +974,10 @@ static int dp_aux_ch_ctl_mmio_write(struct intel_vgpu *vgpu,
971974
/*
972975
* Read reply format: ACK (1 byte) plus (len + 1) bytes of data.
973976
*/
974-
if (WARN_ON((len + 2) > AUX_BURST_SIZE))
977+
if ((len + 2) > AUX_BURST_SIZE) {
978+
gvt_vgpu_err("dp_aux_header: len %d is too large\n", len);
975979
return -EINVAL;
980+
}
976981

977982
/* read from virtual DPCD to vreg */
978983
/* first 4 bytes: [ACK][addr][addr+1][addr+2] */

drivers/gpu/drm/i915/gvt/kvmgt.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ static int gvt_dma_map_page(struct intel_vgpu *vgpu, unsigned long gfn,
123123
return -EINVAL;
124124
}
125125

126+
if (!pfn_valid(pfn)) {
127+
gvt_vgpu_err("pfn 0x%lx is not mem backed\n", pfn);
128+
vfio_unpin_pages(mdev_dev(vgpu->vdev.mdev), &gfn, 1);
129+
return -EINVAL;
130+
}
131+
126132
/* Setup DMA mapping. */
127133
page = pfn_to_page(pfn);
128134
*dma_addr = dma_map_page(dev, page, 0, PAGE_SIZE,
@@ -583,6 +589,17 @@ static int intel_vgpu_open(struct mdev_device *mdev)
583589
return ret;
584590
}
585591

592+
static void intel_vgpu_release_msi_eventfd_ctx(struct intel_vgpu *vgpu)
593+
{
594+
struct eventfd_ctx *trigger;
595+
596+
trigger = vgpu->vdev.msi_trigger;
597+
if (trigger) {
598+
eventfd_ctx_put(trigger);
599+
vgpu->vdev.msi_trigger = NULL;
600+
}
601+
}
602+
586603
static void __intel_vgpu_release(struct intel_vgpu *vgpu)
587604
{
588605
struct kvmgt_guest_info *info;
@@ -607,6 +624,8 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
607624
info = (struct kvmgt_guest_info *)vgpu->handle;
608625
kvmgt_guest_exit(info);
609626

627+
intel_vgpu_release_msi_eventfd_ctx(vgpu);
628+
610629
vgpu->vdev.kvm = NULL;
611630
vgpu->handle = 0;
612631
}
@@ -987,7 +1006,8 @@ static int intel_vgpu_set_msi_trigger(struct intel_vgpu *vgpu,
9871006
return PTR_ERR(trigger);
9881007
}
9891008
vgpu->vdev.msi_trigger = trigger;
990-
}
1009+
} else if ((flags & VFIO_IRQ_SET_DATA_NONE) && !count)
1010+
intel_vgpu_release_msi_eventfd_ctx(vgpu);
9911011

9921012
return 0;
9931013
}
@@ -1592,6 +1612,18 @@ static int kvmgt_inject_msi(unsigned long handle, u32 addr, u16 data)
15921612
info = (struct kvmgt_guest_info *)handle;
15931613
vgpu = info->vgpu;
15941614

1615+
/*
1616+
* When guest is poweroff, msi_trigger is set to NULL, but vgpu's
1617+
* config and mmio register isn't restored to default during guest
1618+
* poweroff. If this vgpu is still used in next vm, this vgpu's pipe
1619+
* may be enabled, then once this vgpu is active, it will get inject
1620+
* vblank interrupt request. But msi_trigger is null until msi is
1621+
* enabled by guest. so if msi_trigger is null, success is still
1622+
* returned and don't inject interrupt into guest.
1623+
*/
1624+
if (vgpu->vdev.msi_trigger == NULL)
1625+
return 0;
1626+
15951627
if (eventfd_signal(vgpu->vdev.msi_trigger, 1) == 1)
15961628
return 0;
15971629

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,23 +2972,22 @@ i915_gem_find_active_request(struct intel_engine_cs *engine)
29722972
struct i915_request *request, *active = NULL;
29732973
unsigned long flags;
29742974

2975-
/* We are called by the error capture and reset at a random
2976-
* point in time. In particular, note that neither is crucially
2977-
* ordered with an interrupt. After a hang, the GPU is dead and we
2978-
* assume that no more writes can happen (we waited long enough for
2979-
* all writes that were in transaction to be flushed) - adding an
2975+
/*
2976+
* We are called by the error capture, reset and to dump engine
2977+
* state at random points in time. In particular, note that neither is
2978+
* crucially ordered with an interrupt. After a hang, the GPU is dead
2979+
* and we assume that no more writes can happen (we waited long enough
2980+
* for all writes that were in transaction to be flushed) - adding an
29802981
* extra delay for a recent interrupt is pointless. Hence, we do
29812982
* not need an engine->irq_seqno_barrier() before the seqno reads.
2983+
* At all other times, we must assume the GPU is still running, but
2984+
* we only care about the snapshot of this moment.
29822985
*/
29832986
spin_lock_irqsave(&engine->timeline.lock, flags);
29842987
list_for_each_entry(request, &engine->timeline.requests, link) {
29852988
if (__i915_request_completed(request, request->global_seqno))
29862989
continue;
29872990

2988-
GEM_BUG_ON(request->engine != engine);
2989-
GEM_BUG_ON(test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
2990-
&request->fence.flags));
2991-
29922991
active = request;
29932992
break;
29942993
}

drivers/gpu/drm/i915/intel_ddi.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,12 +2453,13 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc,
24532453
for_each_new_connector_in_state(old_state, conn, conn_state, i) {
24542454
struct intel_encoder *encoder =
24552455
to_intel_encoder(conn_state->best_encoder);
2456-
enum port port = encoder->port;
2456+
enum port port;
24572457
uint32_t val;
24582458

24592459
if (conn_state->crtc != crtc)
24602460
continue;
24612461

2462+
port = encoder->port;
24622463
mutex_lock(&dev_priv->dpll_lock);
24632464

24642465
val = I915_READ(DPCLKA_CFGCR0_ICL);
@@ -2490,11 +2491,12 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
24902491
for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
24912492
struct intel_encoder *encoder =
24922493
to_intel_encoder(old_conn_state->best_encoder);
2493-
enum port port = encoder->port;
2494+
enum port port;
24942495

24952496
if (old_conn_state->crtc != crtc)
24962497
continue;
24972498

2499+
port = encoder->port;
24982500
mutex_lock(&dev_priv->dpll_lock);
24992501
I915_WRITE(DPCLKA_CFGCR0_ICL,
25002502
I915_READ(DPCLKA_CFGCR0_ICL) |

drivers/gpu/drm/i915/intel_display.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3690,11 +3690,6 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
36903690
plane_color_ctl |= glk_plane_color_ctl_alpha(fb->format->format);
36913691

36923692
if (intel_format_is_yuv(fb->format->format)) {
3693-
if (fb->format->format == DRM_FORMAT_NV12) {
3694-
plane_color_ctl |=
3695-
PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
3696-
goto out;
3697-
}
36983693
if (plane_state->base.color_encoding == DRM_COLOR_YCBCR_BT709)
36993694
plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
37003695
else
@@ -3703,7 +3698,7 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
37033698
if (plane_state->base.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
37043699
plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
37053700
}
3706-
out:
3701+
37073702
return plane_color_ctl;
37083703
}
37093704

drivers/gpu/drm/i915/intel_dp.c

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
16791679
return bpp;
16801680
}
16811681

1682-
static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
1683-
struct drm_display_mode *m2)
1684-
{
1685-
bool bres = false;
1686-
1687-
if (m1 && m2)
1688-
bres = (m1->hdisplay == m2->hdisplay &&
1689-
m1->hsync_start == m2->hsync_start &&
1690-
m1->hsync_end == m2->hsync_end &&
1691-
m1->htotal == m2->htotal &&
1692-
m1->vdisplay == m2->vdisplay &&
1693-
m1->vsync_start == m2->vsync_start &&
1694-
m1->vsync_end == m2->vsync_end &&
1695-
m1->vtotal == m2->vtotal);
1696-
return bres;
1697-
}
1698-
16991682
/* Adjust link config limits based on compliance test requests. */
17001683
static void
17011684
intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
@@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder *encoder,
18601843
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
18611844

18621845
if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
1863-
struct drm_display_mode *panel_mode =
1864-
intel_connector->panel.alt_fixed_mode;
1865-
struct drm_display_mode *req_mode = &pipe_config->base.mode;
1866-
1867-
if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
1868-
panel_mode = intel_connector->panel.fixed_mode;
1869-
1870-
drm_mode_debug_printmodeline(panel_mode);
1871-
1872-
intel_fixed_panel_mode(panel_mode, adjusted_mode);
1846+
intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
1847+
adjusted_mode);
18731848

18741849
if (INTEL_GEN(dev_priv) >= 9) {
18751850
int ret;
@@ -6159,7 +6134,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
61596134
struct drm_i915_private *dev_priv = to_i915(dev);
61606135
struct drm_connector *connector = &intel_connector->base;
61616136
struct drm_display_mode *fixed_mode = NULL;
6162-
struct drm_display_mode *alt_fixed_mode = NULL;
61636137
struct drm_display_mode *downclock_mode = NULL;
61646138
bool has_dpcd;
61656139
struct drm_display_mode *scan;
@@ -6214,14 +6188,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
62146188
}
62156189
intel_connector->edid = edid;
62166190

6217-
/* prefer fixed mode from EDID if available, save an alt mode also */
6191+
/* prefer fixed mode from EDID if available */
62186192
list_for_each_entry(scan, &connector->probed_modes, head) {
62196193
if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
62206194
fixed_mode = drm_mode_duplicate(dev, scan);
62216195
downclock_mode = intel_dp_drrs_init(
62226196
intel_connector, fixed_mode);
6223-
} else if (!alt_fixed_mode) {
6224-
alt_fixed_mode = drm_mode_duplicate(dev, scan);
6197+
break;
62256198
}
62266199
}
62276200

@@ -6258,8 +6231,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
62586231
pipe_name(pipe));
62596232
}
62606233

6261-
intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
6262-
downclock_mode);
6234+
intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
62636235
intel_connector->panel.backlight.power = intel_edp_backlight_power;
62646236
intel_panel_setup_backlight(connector, pipe);
62656237

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,6 @@ struct intel_encoder {
277277

278278
struct intel_panel {
279279
struct drm_display_mode *fixed_mode;
280-
struct drm_display_mode *alt_fixed_mode;
281280
struct drm_display_mode *downclock_mode;
282281

283282
/* backlight */
@@ -1850,7 +1849,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv);
18501849
/* intel_panel.c */
18511850
int intel_panel_init(struct intel_panel *panel,
18521851
struct drm_display_mode *fixed_mode,
1853-
struct drm_display_mode *alt_fixed_mode,
18541852
struct drm_display_mode *downclock_mode);
18551853
void intel_panel_fini(struct intel_panel *panel);
18561854
void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,

drivers/gpu/drm/i915/intel_dsi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
18461846
connector->display_info.width_mm = fixed_mode->width_mm;
18471847
connector->display_info.height_mm = fixed_mode->height_mm;
18481848

1849-
intel_panel_init(&intel_connector->panel, fixed_mode, NULL, NULL);
1849+
intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
18501850
intel_panel_setup_backlight(connector, INVALID_PIPE);
18511851

18521852
intel_dsi_add_properties(intel_connector);

0 commit comments

Comments
 (0)