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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEFWWmW3ewYy4RJOWc05gHnSar7m8FAlsacU0ACgkQ05gHnSar 7m+8HxAAgOm55jW3cyUTNKXryquVfCBWu+gI8ByeMt0N7qi216hkXs7mrKc8VwV4 Mg3F0s4thBrj3YNGQH+7OX/bJTfTiRDDiEFrNpgfyEskG/RRKXmxnwI8U6J/zQMq TeIk5yf8wjaOU52g5Yr1yF7y3XsaV0du0e+Rt5xcGZv2dE9s9cR7FJIeWKr835+d 8lqnI1vpDuKMNT/Lpe2s+WGiC3mu4AOH1BUARYkZMbaeRfg7F5GjIAJMH5TOi+GN Czhz9ihCEizRRrg/h8jowy7OhMzp6D4hBMtSJlIOHI+AViWK3PnpC6T2mWPFw32H Su2F+6ZSspgUMY0n+u70pf40U52CMXUVp/v2g06rseFRepCVNFlahApboeHioiAP wV+Ecds4GBhEIcYEhvLJT//uubba5G3SC4IRmRhhUuSo588kegkI7kOXyFE/smAj 2YdWe4OSMuEWF9Hz9fWtXD49pGMfAC02I9V0we2d0BcbMgTfHKjrA0wrFcTvCJ+r SHy+d/U4CWqSrUObaLUdPx22dqXmnYYIpEg+bAZPX2zYVLIyPqeVxId6rK6oTt0t rlkLVOGamkbv/M/TciuOZSRWPj732LJ2L1sYxU/8/gM6qthM+D8Wk4/eOtPT1qoo Ygo/UrnNHIpS5iq3aU08FsoPHuJ8Ljv74H83SYbPyLnDw7v4jOU= =3k4S -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
33ce21d6a2
@ -2909,6 +2909,7 @@ static int init_cmd_table(struct intel_gvt *gvt)
|
||||
if (info) {
|
||||
gvt_err("%s %s duplicated\n", e->info->name,
|
||||
info->name);
|
||||
kfree(e);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,7 @@
|
||||
#define AUX_NATIVE_REPLY_NAK (0x1 << 4)
|
||||
#define AUX_NATIVE_REPLY_DEFER (0x2 << 4)
|
||||
|
||||
#define AUX_BURST_SIZE 16
|
||||
#define AUX_BURST_SIZE 20
|
||||
|
||||
/* DPCD addresses */
|
||||
#define DPCD_REV 0x000
|
||||
|
@ -903,11 +903,14 @@ static int dp_aux_ch_ctl_mmio_write(struct intel_vgpu *vgpu,
|
||||
}
|
||||
|
||||
/*
|
||||
* Write request format: (command + address) occupies
|
||||
* 3 bytes, followed by (len + 1) bytes of data.
|
||||
* Write request format: Headr (command + address + size) occupies
|
||||
* 4 bytes, followed by (len + 1) bytes of data. See details at
|
||||
* intel_dp_aux_transfer().
|
||||
*/
|
||||
if (WARN_ON((len + 4) > AUX_BURST_SIZE))
|
||||
if ((len + 1 + 4) > AUX_BURST_SIZE) {
|
||||
gvt_vgpu_err("dp_aux_header: len %d is too large\n", len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* unpack data from vreg to buf */
|
||||
for (t = 0; t < 4; t++) {
|
||||
@ -971,8 +974,10 @@ static int dp_aux_ch_ctl_mmio_write(struct intel_vgpu *vgpu,
|
||||
/*
|
||||
* Read reply format: ACK (1 byte) plus (len + 1) bytes of data.
|
||||
*/
|
||||
if (WARN_ON((len + 2) > AUX_BURST_SIZE))
|
||||
if ((len + 2) > AUX_BURST_SIZE) {
|
||||
gvt_vgpu_err("dp_aux_header: len %d is too large\n", len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* read from virtual DPCD to vreg */
|
||||
/* first 4 bytes: [ACK][addr][addr+1][addr+2] */
|
||||
|
@ -123,6 +123,12 @@ static int gvt_dma_map_page(struct intel_vgpu *vgpu, unsigned long gfn,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!pfn_valid(pfn)) {
|
||||
gvt_vgpu_err("pfn 0x%lx is not mem backed\n", pfn);
|
||||
vfio_unpin_pages(mdev_dev(vgpu->vdev.mdev), &gfn, 1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Setup DMA mapping. */
|
||||
page = pfn_to_page(pfn);
|
||||
*dma_addr = dma_map_page(dev, page, 0, PAGE_SIZE,
|
||||
@ -583,6 +589,17 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void intel_vgpu_release_msi_eventfd_ctx(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct eventfd_ctx *trigger;
|
||||
|
||||
trigger = vgpu->vdev.msi_trigger;
|
||||
if (trigger) {
|
||||
eventfd_ctx_put(trigger);
|
||||
vgpu->vdev.msi_trigger = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void __intel_vgpu_release(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct kvmgt_guest_info *info;
|
||||
@ -607,6 +624,8 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
|
||||
info = (struct kvmgt_guest_info *)vgpu->handle;
|
||||
kvmgt_guest_exit(info);
|
||||
|
||||
intel_vgpu_release_msi_eventfd_ctx(vgpu);
|
||||
|
||||
vgpu->vdev.kvm = NULL;
|
||||
vgpu->handle = 0;
|
||||
}
|
||||
@ -987,7 +1006,8 @@ static int intel_vgpu_set_msi_trigger(struct intel_vgpu *vgpu,
|
||||
return PTR_ERR(trigger);
|
||||
}
|
||||
vgpu->vdev.msi_trigger = trigger;
|
||||
}
|
||||
} else if ((flags & VFIO_IRQ_SET_DATA_NONE) && !count)
|
||||
intel_vgpu_release_msi_eventfd_ctx(vgpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1592,6 +1612,18 @@ static int kvmgt_inject_msi(unsigned long handle, u32 addr, u16 data)
|
||||
info = (struct kvmgt_guest_info *)handle;
|
||||
vgpu = info->vgpu;
|
||||
|
||||
/*
|
||||
* When guest is poweroff, msi_trigger is set to NULL, but vgpu's
|
||||
* config and mmio register isn't restored to default during guest
|
||||
* poweroff. If this vgpu is still used in next vm, this vgpu's pipe
|
||||
* may be enabled, then once this vgpu is active, it will get inject
|
||||
* vblank interrupt request. But msi_trigger is null until msi is
|
||||
* enabled by guest. so if msi_trigger is null, success is still
|
||||
* returned and don't inject interrupt into guest.
|
||||
*/
|
||||
if (vgpu->vdev.msi_trigger == NULL)
|
||||
return 0;
|
||||
|
||||
if (eventfd_signal(vgpu->vdev.msi_trigger, 1) == 1)
|
||||
return 0;
|
||||
|
||||
|
@ -2972,23 +2972,22 @@ i915_gem_find_active_request(struct intel_engine_cs *engine)
|
||||
struct i915_request *request, *active = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
/* We are called by the error capture and reset at a random
|
||||
* point in time. In particular, note that neither is crucially
|
||||
* ordered with an interrupt. After a hang, the GPU is dead and we
|
||||
* assume that no more writes can happen (we waited long enough for
|
||||
* all writes that were in transaction to be flushed) - adding an
|
||||
/*
|
||||
* We are called by the error capture, reset and to dump engine
|
||||
* state at random points in time. In particular, note that neither is
|
||||
* crucially ordered with an interrupt. After a hang, the GPU is dead
|
||||
* and we assume that no more writes can happen (we waited long enough
|
||||
* for all writes that were in transaction to be flushed) - adding an
|
||||
* extra delay for a recent interrupt is pointless. Hence, we do
|
||||
* not need an engine->irq_seqno_barrier() before the seqno reads.
|
||||
* At all other times, we must assume the GPU is still running, but
|
||||
* we only care about the snapshot of this moment.
|
||||
*/
|
||||
spin_lock_irqsave(&engine->timeline.lock, flags);
|
||||
list_for_each_entry(request, &engine->timeline.requests, link) {
|
||||
if (__i915_request_completed(request, request->global_seqno))
|
||||
continue;
|
||||
|
||||
GEM_BUG_ON(request->engine != engine);
|
||||
GEM_BUG_ON(test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
|
||||
&request->fence.flags));
|
||||
|
||||
active = request;
|
||||
break;
|
||||
}
|
||||
|
@ -2453,12 +2453,13 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc,
|
||||
for_each_new_connector_in_state(old_state, conn, conn_state, i) {
|
||||
struct intel_encoder *encoder =
|
||||
to_intel_encoder(conn_state->best_encoder);
|
||||
enum port port = encoder->port;
|
||||
enum port port;
|
||||
uint32_t val;
|
||||
|
||||
if (conn_state->crtc != crtc)
|
||||
continue;
|
||||
|
||||
port = encoder->port;
|
||||
mutex_lock(&dev_priv->dpll_lock);
|
||||
|
||||
val = I915_READ(DPCLKA_CFGCR0_ICL);
|
||||
@ -2490,11 +2491,12 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
|
||||
for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
|
||||
struct intel_encoder *encoder =
|
||||
to_intel_encoder(old_conn_state->best_encoder);
|
||||
enum port port = encoder->port;
|
||||
enum port port;
|
||||
|
||||
if (old_conn_state->crtc != crtc)
|
||||
continue;
|
||||
|
||||
port = encoder->port;
|
||||
mutex_lock(&dev_priv->dpll_lock);
|
||||
I915_WRITE(DPCLKA_CFGCR0_ICL,
|
||||
I915_READ(DPCLKA_CFGCR0_ICL) |
|
||||
|
@ -3690,11 +3690,6 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
|
||||
plane_color_ctl |= glk_plane_color_ctl_alpha(fb->format->format);
|
||||
|
||||
if (intel_format_is_yuv(fb->format->format)) {
|
||||
if (fb->format->format == DRM_FORMAT_NV12) {
|
||||
plane_color_ctl |=
|
||||
PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
|
||||
goto out;
|
||||
}
|
||||
if (plane_state->base.color_encoding == DRM_COLOR_YCBCR_BT709)
|
||||
plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
|
||||
else
|
||||
@ -3703,7 +3698,7 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
|
||||
if (plane_state->base.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
|
||||
plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
|
||||
}
|
||||
out:
|
||||
|
||||
return plane_color_ctl;
|
||||
}
|
||||
|
||||
|
@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
|
||||
return bpp;
|
||||
}
|
||||
|
||||
static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
|
||||
struct drm_display_mode *m2)
|
||||
{
|
||||
bool bres = false;
|
||||
|
||||
if (m1 && m2)
|
||||
bres = (m1->hdisplay == m2->hdisplay &&
|
||||
m1->hsync_start == m2->hsync_start &&
|
||||
m1->hsync_end == m2->hsync_end &&
|
||||
m1->htotal == m2->htotal &&
|
||||
m1->vdisplay == m2->vdisplay &&
|
||||
m1->vsync_start == m2->vsync_start &&
|
||||
m1->vsync_end == m2->vsync_end &&
|
||||
m1->vtotal == m2->vtotal);
|
||||
return bres;
|
||||
}
|
||||
|
||||
/* Adjust link config limits based on compliance test requests. */
|
||||
static void
|
||||
intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
|
||||
@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
||||
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
|
||||
|
||||
if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
|
||||
struct drm_display_mode *panel_mode =
|
||||
intel_connector->panel.alt_fixed_mode;
|
||||
struct drm_display_mode *req_mode = &pipe_config->base.mode;
|
||||
|
||||
if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
|
||||
panel_mode = intel_connector->panel.fixed_mode;
|
||||
|
||||
drm_mode_debug_printmodeline(panel_mode);
|
||||
|
||||
intel_fixed_panel_mode(panel_mode, adjusted_mode);
|
||||
intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
|
||||
adjusted_mode);
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
int ret;
|
||||
@ -6159,7 +6134,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct drm_connector *connector = &intel_connector->base;
|
||||
struct drm_display_mode *fixed_mode = NULL;
|
||||
struct drm_display_mode *alt_fixed_mode = NULL;
|
||||
struct drm_display_mode *downclock_mode = NULL;
|
||||
bool has_dpcd;
|
||||
struct drm_display_mode *scan;
|
||||
@ -6214,14 +6188,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
||||
}
|
||||
intel_connector->edid = edid;
|
||||
|
||||
/* prefer fixed mode from EDID if available, save an alt mode also */
|
||||
/* prefer fixed mode from EDID if available */
|
||||
list_for_each_entry(scan, &connector->probed_modes, head) {
|
||||
if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
|
||||
fixed_mode = drm_mode_duplicate(dev, scan);
|
||||
downclock_mode = intel_dp_drrs_init(
|
||||
intel_connector, fixed_mode);
|
||||
} else if (!alt_fixed_mode) {
|
||||
alt_fixed_mode = drm_mode_duplicate(dev, scan);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -6258,8 +6231,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
||||
pipe_name(pipe));
|
||||
}
|
||||
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
|
||||
downclock_mode);
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
|
||||
intel_connector->panel.backlight.power = intel_edp_backlight_power;
|
||||
intel_panel_setup_backlight(connector, pipe);
|
||||
|
||||
|
@ -277,7 +277,6 @@ struct intel_encoder {
|
||||
|
||||
struct intel_panel {
|
||||
struct drm_display_mode *fixed_mode;
|
||||
struct drm_display_mode *alt_fixed_mode;
|
||||
struct drm_display_mode *downclock_mode;
|
||||
|
||||
/* backlight */
|
||||
@ -1850,7 +1849,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv);
|
||||
/* intel_panel.c */
|
||||
int intel_panel_init(struct intel_panel *panel,
|
||||
struct drm_display_mode *fixed_mode,
|
||||
struct drm_display_mode *alt_fixed_mode,
|
||||
struct drm_display_mode *downclock_mode);
|
||||
void intel_panel_fini(struct intel_panel *panel);
|
||||
void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
|
||||
|
@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
|
||||
connector->display_info.width_mm = fixed_mode->width_mm;
|
||||
connector->display_info.height_mm = fixed_mode->height_mm;
|
||||
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, NULL, NULL);
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
|
||||
intel_panel_setup_backlight(connector, INVALID_PIPE);
|
||||
|
||||
intel_dsi_add_properties(intel_connector);
|
||||
|
@ -536,7 +536,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
|
||||
*/
|
||||
intel_panel_init(&intel_connector->panel,
|
||||
intel_dvo_get_current_mode(intel_encoder),
|
||||
NULL, NULL);
|
||||
NULL);
|
||||
intel_dvo->panel_wants_dither = true;
|
||||
}
|
||||
|
||||
|
@ -1114,7 +1114,7 @@ static void print_request(struct drm_printer *m,
|
||||
const char *prefix)
|
||||
{
|
||||
const char *name = rq->fence.ops->get_timeline_name(&rq->fence);
|
||||
char buf[80];
|
||||
char buf[80] = "";
|
||||
int x = 0;
|
||||
|
||||
x = print_sched_attr(rq->i915, &rq->sched.attr, buf, x, sizeof(buf));
|
||||
|
@ -1140,8 +1140,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
|
||||
out:
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, NULL,
|
||||
downclock_mode);
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
|
||||
intel_panel_setup_backlight(connector, INVALID_PIPE);
|
||||
|
||||
lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
|
||||
|
@ -1928,13 +1928,11 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
|
||||
|
||||
int intel_panel_init(struct intel_panel *panel,
|
||||
struct drm_display_mode *fixed_mode,
|
||||
struct drm_display_mode *alt_fixed_mode,
|
||||
struct drm_display_mode *downclock_mode)
|
||||
{
|
||||
intel_panel_init_backlight_funcs(panel);
|
||||
|
||||
panel->fixed_mode = fixed_mode;
|
||||
panel->alt_fixed_mode = alt_fixed_mode;
|
||||
panel->downclock_mode = downclock_mode;
|
||||
|
||||
return 0;
|
||||
@ -1948,10 +1946,6 @@ void intel_panel_fini(struct intel_panel *panel)
|
||||
if (panel->fixed_mode)
|
||||
drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
|
||||
|
||||
if (panel->alt_fixed_mode)
|
||||
drm_mode_destroy(intel_connector->base.dev,
|
||||
panel->alt_fixed_mode);
|
||||
|
||||
if (panel->downclock_mode)
|
||||
drm_mode_destroy(intel_connector->base.dev,
|
||||
panel->downclock_mode);
|
||||
|
@ -5150,7 +5150,6 @@ skl_copy_ddb_for_pipe(struct skl_ddb_values *dst,
|
||||
sizeof(dst->ddb.uv_plane[pipe]));
|
||||
memcpy(dst->ddb.plane[pipe], src->ddb.plane[pipe],
|
||||
sizeof(dst->ddb.plane[pipe]));
|
||||
dst->ddb.enabled_slices = src->ddb.enabled_slices;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user