From: Greg Kroah-Hartman Date: Mon, 19 Jan 2015 11:11:09 +0000 (+0800) Subject: 3.18-stable patches X-Git-Tag: v3.10.66~57 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=23d5343f9a5b28edf352bbadbc697f5cfd67c750;p=thirdparty%2Fkernel%2Fstable-queue.git 3.18-stable patches added patches: drm-dp-mst-remove-branches-before-dropping-the-reference.patch drm-dp-retry-aux-transactions-32-times-v1.1.patch drm-fb_helper-move-deferred-fb-checking-into-restore-mode-v2.patch drm-radeon-adjust-default-bapm-settings-for-kv.patch drm-radeon-check-the-right-ring-in-radeon_evict_flags.patch drm-radeon-fix-sad_count-check-for-dce3.patch drm-radeon-fix-typo-in-ci-dpm-disable.patch drm-radeon-kv-has-three-pplls-v2.patch drm-radeon-properly-filter-dp1.2-4k-modes-on-non-dp1.2-hw.patch drm-radeon-work-around-a-hw-bug-in-mgcg-on-cik.patch drm-ttm-avoid-memory-allocation-from-shrinker-functions.patch drm-vmwgfx-don-t-use-memory-accounting-for-kernel-side-fence-objects.patch drm-vmwgfx-fix-error-printout-on-signals-pending.patch drm-vmwgfx-fix-fence-event-code.patch --- diff --git a/queue-3.18/drm-dp-mst-remove-branches-before-dropping-the-reference.patch b/queue-3.18/drm-dp-mst-remove-branches-before-dropping-the-reference.patch new file mode 100644 index 00000000000..122f352dfbd --- /dev/null +++ b/queue-3.18/drm-dp-mst-remove-branches-before-dropping-the-reference.patch @@ -0,0 +1,81 @@ +From 0391359ddf79b52bb7e7bb9ace08e34fb08b0e76 Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Mon, 8 Dec 2014 22:55:22 +0100 +Subject: drm/dp-mst: Remove branches before dropping the reference + +From: Daniel Vetter + +commit 0391359ddf79b52bb7e7bb9ace08e34fb08b0e76 upstream. + +When we unplug a dp mst branch we unreference the entire tree from +the root towards the leaves. Which is ok, since that's the way the +pointers and so also the refcounts go. + +But when we drop the reference we must make sure that we remove the +branches/ports from the lists/pointers before dropping the reference. +Otherwise the get_validated functions will still return it instead +of returning NULL (which indicates a potentially on-going unplug). + +The mst branch destroy gets this right for ports: First it deletes +the port from the ports list, then it unrefs. But the ports destroy +function gets it wrong: First it unrefs, then it drops the ref. Which +means a zombie mst branch can still be validate with get_validated_mstb_ref +when it shouldn't. + +Fix this. + +This should address a backtrace Dave dug out somewhere on unplug: + + [] drm_dp_mst_get_validated_mstb_ref_locked+0x92/0xa0 [drm_kms_helper] + [] drm_dp_mst_get_validated_mstb_ref_locked+0x41/0xa0 [drm_kms_helper] + [] drm_dp_get_validated_mstb_ref+0x3a/0x60 [drm_kms_helper] + [] drm_dp_payload_send_msg.isra.14+0x2b/0x100 [drm_kms_helper] + [] drm_dp_update_payload_part1+0x177/0x360 [drm_kms_helper] + [] intel_mst_disable_dp+0x3e/0x80 [i915] + [] haswell_crtc_disable+0x1cb/0x340 [i915] + [] intel_crtc_control+0x49/0x100 [i915] + [] intel_crtc_update_dpms+0x67/0x80 [i915] + [] intel_connector_dpms+0x59/0x70 [i915] + [] intel_dp_destroy_mst_connector+0x32/0xc0 [i915] + [] drm_dp_destroy_port+0x6b/0xa0 [drm_kms_helper] + [] drm_dp_destroy_mst_branch_device+0x108/0x130 [drm_kms_helper] + [] drm_dp_port_teardown_pdt+0x3d/0x50 [drm_kms_helper] + [] drm_dp_mst_handle_up_req+0x499/0x540 [drm_kms_helper] + [] ? trace_hardirqs_on_caller+0x15d/0x200 [] + drm_dp_mst_hpd_irq+0x53/0xa00 [drm_kms_helper] [] + ? drm_dp_dpcd_read+0x1b/0x20 [drm_kms_helper] [] + ? intel_dp_dpcd_read_wake+0x38/0x70 [i915] [] + intel_dp_check_mst_status+0xb5/0x250 [i915] [] + intel_dp_hpd_pulse+0x181/0x210 [i915] [] + i915_digport_work_func+0x96/0x120 [i915] + +Signed-off-by: Daniel Vetter +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -839,6 +839,8 @@ static void drm_dp_put_mst_branch_device + + static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt) + { ++ struct drm_dp_mst_branch *mstb; ++ + switch (old_pdt) { + case DP_PEER_DEVICE_DP_LEGACY_CONV: + case DP_PEER_DEVICE_SST_SINK: +@@ -846,8 +848,9 @@ static void drm_dp_port_teardown_pdt(str + drm_dp_mst_unregister_i2c_bus(&port->aux); + break; + case DP_PEER_DEVICE_MST_BRANCHING: +- drm_dp_put_mst_branch_device(port->mstb); ++ mstb = port->mstb; + port->mstb = NULL; ++ drm_dp_put_mst_branch_device(mstb); + break; + } + } diff --git a/queue-3.18/drm-dp-retry-aux-transactions-32-times-v1.1.patch b/queue-3.18/drm-dp-retry-aux-transactions-32-times-v1.1.patch new file mode 100644 index 00000000000..275b9f35557 --- /dev/null +++ b/queue-3.18/drm-dp-retry-aux-transactions-32-times-v1.1.patch @@ -0,0 +1,44 @@ +From 19a93f042fc241ecdf98543cedfe7c171f8cdf53 Mon Sep 17 00:00:00 2001 +From: Dave Airlie +Date: Wed, 26 Nov 2014 13:13:09 +1000 +Subject: drm/dp: retry AUX transactions 32 times (v1.1) + +From: Dave Airlie + +commit 19a93f042fc241ecdf98543cedfe7c171f8cdf53 upstream. + +At least on two MST devices I've tested with, when +they are link training downstream, they are totally +unable to handle aux ch msgs, so they defer like nuts. +I tried 16, it wasn't enough, 32 seems better. + +This fixes one Dell 4k monitor and one of the +MST hubs. + +v1.1: fixup comment (Tom). + +Acked-by: Alex Deucher +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/drm_dp_helper.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/drm_dp_helper.c ++++ b/drivers/gpu/drm/drm_dp_helper.c +@@ -378,10 +378,11 @@ static int drm_dp_dpcd_access(struct drm + + /* + * The specification doesn't give any recommendation on how often to +- * retry native transactions, so retry 7 times like for I2C-over-AUX +- * transactions. ++ * retry native transactions. We used to retry 7 times like for ++ * aux i2c transactions but real world devices this wasn't ++ * sufficient, bump to 32 which makes Dell 4k monitors happier. + */ +- for (retry = 0; retry < 7; retry++) { ++ for (retry = 0; retry < 32; retry++) { + + mutex_lock(&aux->hw_mutex); + err = aux->transfer(aux, &msg); diff --git a/queue-3.18/drm-fb_helper-move-deferred-fb-checking-into-restore-mode-v2.patch b/queue-3.18/drm-fb_helper-move-deferred-fb-checking-into-restore-mode-v2.patch new file mode 100644 index 00000000000..c529d452b54 --- /dev/null +++ b/queue-3.18/drm-fb_helper-move-deferred-fb-checking-into-restore-mode-v2.patch @@ -0,0 +1,61 @@ +From e2809c7db818df6bbd0edf843e1beb2fbc9d8541 Mon Sep 17 00:00:00 2001 +From: Dave Airlie +Date: Wed, 26 Nov 2014 13:15:24 +1000 +Subject: drm/fb_helper: move deferred fb checking into restore mode (v2) + +From: Dave Airlie + +commit e2809c7db818df6bbd0edf843e1beb2fbc9d8541 upstream. + +On MST systems the monitors don't appear when we set the fb up, +but plymouth opens the drm device and holds it open while they +come up, when plymouth finishes and lastclose gets called we +don't do the delayed fb probe, so the monitor never appears on the +console. + +Fix this by moving the delayed checking into the mode restore. + +v2: Daniel suggested that ->delayed_hotplug is set under +the mode_config mutex, so we should check it under that as +well, while we are in the area. + +Reviewed-by: Daniel Vetter +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/drm_fb_helper.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/drm_fb_helper.c ++++ b/drivers/gpu/drm/drm_fb_helper.c +@@ -347,9 +347,18 @@ bool drm_fb_helper_restore_fbdev_mode_un + { + struct drm_device *dev = fb_helper->dev; + bool ret; ++ bool do_delayed = false; ++ + drm_modeset_lock_all(dev); + ret = restore_fbdev_mode(fb_helper); ++ ++ do_delayed = fb_helper->delayed_hotplug; ++ if (do_delayed) ++ fb_helper->delayed_hotplug = false; + drm_modeset_unlock_all(dev); ++ ++ if (do_delayed) ++ drm_fb_helper_hotplug_event(fb_helper); + return ret; + } + EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked); +@@ -888,10 +897,6 @@ int drm_fb_helper_set_par(struct fb_info + + drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); + +- if (fb_helper->delayed_hotplug) { +- fb_helper->delayed_hotplug = false; +- drm_fb_helper_hotplug_event(fb_helper); +- } + return 0; + } + EXPORT_SYMBOL(drm_fb_helper_set_par); diff --git a/queue-3.18/drm-radeon-adjust-default-bapm-settings-for-kv.patch b/queue-3.18/drm-radeon-adjust-default-bapm-settings-for-kv.patch new file mode 100644 index 00000000000..5457e87ed4d --- /dev/null +++ b/queue-3.18/drm-radeon-adjust-default-bapm-settings-for-kv.patch @@ -0,0 +1,39 @@ +From 02ae7af53a451a1b0a51022c4693f5b339133e79 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 15 Dec 2014 17:24:19 -0500 +Subject: drm/radeon: adjust default bapm settings for KV + +From: Alex Deucher + +commit 02ae7af53a451a1b0a51022c4693f5b339133e79 upstream. + +Enabling bapm seems to cause clocking problems on some +KV configurations. Disable it by default for now. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/kv_dpm.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/radeon/kv_dpm.c ++++ b/drivers/gpu/drm/radeon/kv_dpm.c +@@ -2745,13 +2745,11 @@ int kv_dpm_init(struct radeon_device *rd + pi->enable_auto_thermal_throttling = true; + pi->disable_nb_ps3_in_battery = false; + if (radeon_bapm == -1) { +- /* There are stability issues reported on with +- * bapm enabled on an asrock system. +- */ +- if (rdev->pdev->subsystem_vendor == 0x1849) +- pi->bapm_enable = false; +- else ++ /* only enable bapm on KB, ML by default */ ++ if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) + pi->bapm_enable = true; ++ else ++ pi->bapm_enable = false; + } else if (radeon_bapm == 0) { + pi->bapm_enable = false; + } else { diff --git a/queue-3.18/drm-radeon-check-the-right-ring-in-radeon_evict_flags.patch b/queue-3.18/drm-radeon-check-the-right-ring-in-radeon_evict_flags.patch new file mode 100644 index 00000000000..456a9da6467 --- /dev/null +++ b/queue-3.18/drm-radeon-check-the-right-ring-in-radeon_evict_flags.patch @@ -0,0 +1,35 @@ +From 5e5c21cac1001089007260c48b0c89ebaace0e71 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 3 Dec 2014 00:03:49 -0500 +Subject: drm/radeon: check the right ring in radeon_evict_flags() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alex Deucher + +commit 5e5c21cac1001089007260c48b0c89ebaace0e71 upstream. + +Check the that ring we are using for copies is functional +rather than the GFX ring. On newer asics we use the DMA +ring for bo moves. + +Reviewed-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_ttm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/radeon_ttm.c ++++ b/drivers/gpu/drm/radeon/radeon_ttm.c +@@ -196,7 +196,7 @@ static void radeon_evict_flags(struct tt + rbo = container_of(bo, struct radeon_bo, tbo); + switch (bo->mem.mem_type) { + case TTM_PL_VRAM: +- if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false) ++ if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false) + radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); + else + radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); diff --git a/queue-3.18/drm-radeon-fix-sad_count-check-for-dce3.patch b/queue-3.18/drm-radeon-fix-sad_count-check-for-dce3.patch new file mode 100644 index 00000000000..7924936b2dd --- /dev/null +++ b/queue-3.18/drm-radeon-fix-sad_count-check-for-dce3.patch @@ -0,0 +1,33 @@ +From 5665c3ebe5ee8a2c516925461f7214ba59c2e6d7 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Tue, 9 Dec 2014 10:04:01 -0500 +Subject: drm/radeon: fix sad_count check for dce3 + +From: Alex Deucher + +commit 5665c3ebe5ee8a2c516925461f7214ba59c2e6d7 upstream. + +Make it consistent with the sad code for other asics to deal +with monitors that don't report sads. + +bug: +https://bugzilla.kernel.org/show_bug.cgi?id=89461 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/dce3_1_afmt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/dce3_1_afmt.c ++++ b/drivers/gpu/drm/radeon/dce3_1_afmt.c +@@ -103,7 +103,7 @@ static void dce3_2_afmt_write_sad_regs(s + } + + sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); +- if (sad_count < 0) { ++ if (sad_count <= 0) { + DRM_ERROR("Couldn't read SADs: %d\n", sad_count); + return; + } diff --git a/queue-3.18/drm-radeon-fix-typo-in-ci-dpm-disable.patch b/queue-3.18/drm-radeon-fix-typo-in-ci-dpm-disable.patch new file mode 100644 index 00000000000..30f698a564d --- /dev/null +++ b/queue-3.18/drm-radeon-fix-typo-in-ci-dpm-disable.patch @@ -0,0 +1,29 @@ +From 129acb7c0b682512e89c4f65c33593d50f2f49a9 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 7 Nov 2014 11:05:04 -0500 +Subject: drm/radeon: fix typo in CI dpm disable + +From: Alex Deucher + +commit 129acb7c0b682512e89c4f65c33593d50f2f49a9 upstream. + +Need to disable DS, not enable it when disabling dpm. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/ci_dpm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/ci_dpm.c ++++ b/drivers/gpu/drm/radeon/ci_dpm.c +@@ -4729,7 +4729,7 @@ void ci_dpm_disable(struct radeon_device + ci_enable_spread_spectrum(rdev, false); + ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false); + ci_stop_dpm(rdev); +- ci_enable_ds_master_switch(rdev, true); ++ ci_enable_ds_master_switch(rdev, false); + ci_enable_ulv(rdev, false); + ci_clear_vc(rdev); + ci_reset_to_default(rdev); diff --git a/queue-3.18/drm-radeon-kv-has-three-pplls-v2.patch b/queue-3.18/drm-radeon-kv-has-three-pplls-v2.patch new file mode 100644 index 00000000000..7166adc1b99 --- /dev/null +++ b/queue-3.18/drm-radeon-kv-has-three-pplls-v2.patch @@ -0,0 +1,54 @@ +From fbedf1c3fc3a1e9f249c2efe2f4553d8df9d86d3 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 5 Dec 2014 13:46:07 -0500 +Subject: drm/radeon: KV has three PPLLs (v2) + +From: Alex Deucher + +commit fbedf1c3fc3a1e9f249c2efe2f4553d8df9d86d3 upstream. + +Enable all three in the driver. Early documentation +indicated the 3rd one was used for something else, but +that is not the case. + +v2: handle disable as well + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/atombios_crtc.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/radeon/atombios_crtc.c ++++ b/drivers/gpu/drm/radeon/atombios_crtc.c +@@ -1851,10 +1851,9 @@ static int radeon_atom_pick_pll(struct d + return pll; + } + /* otherwise, pick one of the plls */ +- if ((rdev->family == CHIP_KAVERI) || +- (rdev->family == CHIP_KABINI) || ++ if ((rdev->family == CHIP_KABINI) || + (rdev->family == CHIP_MULLINS)) { +- /* KB/KV/ML has PPLL1 and PPLL2 */ ++ /* KB/ML has PPLL1 and PPLL2 */ + pll_in_use = radeon_get_pll_use_mask(crtc); + if (!(pll_in_use & (1 << ATOM_PPLL2))) + return ATOM_PPLL2; +@@ -1863,7 +1862,7 @@ static int radeon_atom_pick_pll(struct d + DRM_ERROR("unable to allocate a PPLL\n"); + return ATOM_PPLL_INVALID; + } else { +- /* CI has PPLL0, PPLL1, and PPLL2 */ ++ /* CI/KV has PPLL0, PPLL1, and PPLL2 */ + pll_in_use = radeon_get_pll_use_mask(crtc); + if (!(pll_in_use & (1 << ATOM_PPLL2))) + return ATOM_PPLL2; +@@ -2154,6 +2153,7 @@ static void atombios_crtc_disable(struct + case ATOM_PPLL0: + /* disable the ppll */ + if ((rdev->family == CHIP_ARUBA) || ++ (rdev->family == CHIP_KAVERI) || + (rdev->family == CHIP_BONAIRE) || + (rdev->family == CHIP_HAWAII)) + atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, diff --git a/queue-3.18/drm-radeon-properly-filter-dp1.2-4k-modes-on-non-dp1.2-hw.patch b/queue-3.18/drm-radeon-properly-filter-dp1.2-4k-modes-on-non-dp1.2-hw.patch new file mode 100644 index 00000000000..1ce4392a919 --- /dev/null +++ b/queue-3.18/drm-radeon-properly-filter-dp1.2-4k-modes-on-non-dp1.2-hw.patch @@ -0,0 +1,38 @@ +From 410cce2a6b82299b46ff316c6384e789ce275ecb Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 10 Dec 2014 09:42:10 -0500 +Subject: drm/radeon: properly filter DP1.2 4k modes on non-DP1.2 hw + +From: Alex Deucher + +commit 410cce2a6b82299b46ff316c6384e789ce275ecb upstream. + +The check was already in place in the dp mode_valid check, but +radeon_dp_get_dp_link_clock() never returned the high clock +mode_valid was checking for because that function clipped the +clock based on the hw capabilities. Add an explicit check +in the mode_valid function. + +bug: +https://bugs.freedesktop.org/show_bug.cgi?id=87172 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/atombios_dp.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/gpu/drm/radeon/atombios_dp.c ++++ b/drivers/gpu/drm/radeon/atombios_dp.c +@@ -492,6 +492,10 @@ int radeon_dp_mode_valid_helper(struct d + struct radeon_connector_atom_dig *dig_connector; + int dp_clock; + ++ if ((mode->clock > 340000) && ++ (!radeon_connector_is_dp12_capable(connector))) ++ return MODE_CLOCK_HIGH; ++ + if (!radeon_connector->con_priv) + return MODE_CLOCK_HIGH; + dig_connector = radeon_connector->con_priv; diff --git a/queue-3.18/drm-radeon-work-around-a-hw-bug-in-mgcg-on-cik.patch b/queue-3.18/drm-radeon-work-around-a-hw-bug-in-mgcg-on-cik.patch new file mode 100644 index 00000000000..c3b87fa692e --- /dev/null +++ b/queue-3.18/drm-radeon-work-around-a-hw-bug-in-mgcg-on-cik.patch @@ -0,0 +1,38 @@ +From 4bb62c95a7e781a238b2ab374f34b1bf91e01ddc Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 17 Nov 2014 15:08:17 -0500 +Subject: drm/radeon: work around a hw bug in MGCG on CIK + +From: Alex Deucher + +commit 4bb62c95a7e781a238b2ab374f34b1bf91e01ddc upstream. + +Always need to set bit 0 of RLC_CGTT_MGCG_OVERRIDE +to avoid unreliable doorbell updates in some cases. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/cik.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -6314,6 +6314,7 @@ static void cik_enable_mgcg(struct radeo + } + + orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); ++ data |= 0x00000001; + data &= 0xfffffffd; + if (orig != data) + WREG32(RLC_CGTT_MGCG_OVERRIDE, data); +@@ -6345,7 +6346,7 @@ static void cik_enable_mgcg(struct radeo + } + } else { + orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); +- data |= 0x00000002; ++ data |= 0x00000003; + if (orig != data) + WREG32(RLC_CGTT_MGCG_OVERRIDE, data); + diff --git a/queue-3.18/drm-ttm-avoid-memory-allocation-from-shrinker-functions.patch b/queue-3.18/drm-ttm-avoid-memory-allocation-from-shrinker-functions.patch new file mode 100644 index 00000000000..67b23978411 --- /dev/null +++ b/queue-3.18/drm-ttm-avoid-memory-allocation-from-shrinker-functions.patch @@ -0,0 +1,232 @@ +From 881fdaa5e4cb0d68e52acab0ad4e1820e2bfffa4 Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Thu, 13 Nov 2014 22:43:23 +0900 +Subject: drm/ttm: Avoid memory allocation from shrinker functions. + +From: Tetsuo Handa + +commit 881fdaa5e4cb0d68e52acab0ad4e1820e2bfffa4 upstream. + +Andrew Morton wrote: +> On Wed, 12 Nov 2014 13:08:55 +0900 Tetsuo Handa wrote: +> +> > Andrew Morton wrote: +> > > Poor ttm guys - this is a bit of a trap we set for them. +> > +> > Commit a91576d7916f6cce ("drm/ttm: Pass GFP flags in order to avoid deadlock.") +> > changed to use sc->gfp_mask rather than GFP_KERNEL. +> > +> > - pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), +> > - GFP_KERNEL); +> > + pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); +> > +> > But this bug is caused by sc->gfp_mask containing some flags which are not +> > in GFP_KERNEL, right? Then, I think +> > +> > - pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); +> > + pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp & GFP_KERNEL); +> > +> > would hide this bug. +> > +> > But I think we should use GFP_ATOMIC (or drop __GFP_WAIT flag) +> +> Well no - ttm_page_pool_free() should stop calling kmalloc altogether. +> Just do +> +> struct page *pages_to_free[16]; +> +> and rework the code to free 16 pages at a time. Easy. + +Well, ttm code wants to process 512 pages at a time for performance. +Memory footprint increased by 512 * sizeof(struct page *) buffer is +only 4096 bytes. What about using static buffer like below? +---------- +>From d3cb5393c9c8099d6b37e769f78c31af1541fe8c Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Thu, 13 Nov 2014 22:21:54 +0900 +Subject: drm/ttm: Avoid memory allocation from shrinker functions. + +Commit a91576d7916f6cce ("drm/ttm: Pass GFP flags in order to avoid +deadlock.") caused BUG_ON() due to sc->gfp_mask containing flags +which are not in GFP_KERNEL. + + https://bugzilla.kernel.org/show_bug.cgi?id=87891 + +Changing from sc->gfp_mask to (sc->gfp_mask & GFP_KERNEL) would +avoid the BUG_ON(), but avoiding memory allocation from shrinker +function is better and reliable fix. + +Shrinker function is already serialized by global lock, and +clean up function is called after shrinker function is unregistered. +Thus, we can use static buffer when called from shrinker function +and clean up function. + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc.c | 26 +++++++++++++++----------- + drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 25 +++++++++++++++---------- + 2 files changed, 30 insertions(+), 21 deletions(-) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c +@@ -297,11 +297,12 @@ static void ttm_pool_update_free_locked( + * + * @pool: to free the pages from + * @free_all: If set to true will free all pages in pool +- * @gfp: GFP flags. ++ * @use_static: Safe to use static buffer + **/ + static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, +- gfp_t gfp) ++ bool use_static) + { ++ static struct page *static_buf[NUM_PAGES_TO_ALLOC]; + unsigned long irq_flags; + struct page *p; + struct page **pages_to_free; +@@ -311,7 +312,11 @@ static int ttm_page_pool_free(struct ttm + if (NUM_PAGES_TO_ALLOC < nr_free) + npages_to_free = NUM_PAGES_TO_ALLOC; + +- pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); ++ if (use_static) ++ pages_to_free = static_buf; ++ else ++ pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), ++ GFP_KERNEL); + if (!pages_to_free) { + pr_err("Failed to allocate memory for pool free operation\n"); + return 0; +@@ -374,7 +379,8 @@ restart: + if (freed_pages) + ttm_pages_put(pages_to_free, freed_pages); + out: +- kfree(pages_to_free); ++ if (pages_to_free != static_buf) ++ kfree(pages_to_free); + return nr_free; + } + +@@ -383,8 +389,6 @@ out: + * + * XXX: (dchinner) Deadlock warning! + * +- * We need to pass sc->gfp_mask to ttm_page_pool_free(). +- * + * This code is crying out for a shrinker per pool.... + */ + static unsigned long +@@ -407,8 +411,8 @@ ttm_pool_shrink_scan(struct shrinker *sh + if (shrink_pages == 0) + break; + pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; +- shrink_pages = ttm_page_pool_free(pool, nr_free, +- sc->gfp_mask); ++ /* OK to use static buffer since global mutex is held. */ ++ shrink_pages = ttm_page_pool_free(pool, nr_free, true); + freed += nr_free - shrink_pages; + } + mutex_unlock(&lock); +@@ -710,7 +714,7 @@ static void ttm_put_pages(struct page ** + } + spin_unlock_irqrestore(&pool->lock, irq_flags); + if (npages) +- ttm_page_pool_free(pool, npages, GFP_KERNEL); ++ ttm_page_pool_free(pool, npages, false); + } + + /* +@@ -849,9 +853,9 @@ void ttm_page_alloc_fini(void) + pr_info("Finalizing pool allocator\n"); + ttm_pool_mm_shrink_fini(_manager); + ++ /* OK to use static buffer since global mutex is no longer used. */ + for (i = 0; i < NUM_POOLS; ++i) +- ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES, +- GFP_KERNEL); ++ ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES, true); + + kobject_put(&_manager->kobj); + _manager = NULL; +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -411,11 +411,12 @@ static void ttm_dma_page_put(struct dma_ + * + * @pool: to free the pages from + * @nr_free: If set to true will free all pages in pool +- * @gfp: GFP flags. ++ * @use_static: Safe to use static buffer + **/ + static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, +- gfp_t gfp) ++ bool use_static) + { ++ static struct page *static_buf[NUM_PAGES_TO_ALLOC]; + unsigned long irq_flags; + struct dma_page *dma_p, *tmp; + struct page **pages_to_free; +@@ -432,7 +433,11 @@ static unsigned ttm_dma_page_pool_free(s + npages_to_free, nr_free); + } + #endif +- pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); ++ if (use_static) ++ pages_to_free = static_buf; ++ else ++ pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), ++ GFP_KERNEL); + + if (!pages_to_free) { + pr_err("%s: Failed to allocate memory for pool free operation\n", +@@ -502,7 +507,8 @@ restart: + if (freed_pages) + ttm_dma_pages_put(pool, &d_pages, pages_to_free, freed_pages); + out: +- kfree(pages_to_free); ++ if (pages_to_free != static_buf) ++ kfree(pages_to_free); + return nr_free; + } + +@@ -531,7 +537,8 @@ static void ttm_dma_free_pool(struct dev + if (pool->type != type) + continue; + /* Takes a spinlock.. */ +- ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, GFP_KERNEL); ++ /* OK to use static buffer since global mutex is held. */ ++ ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, true); + WARN_ON(((pool->npages_in_use + pool->npages_free) != 0)); + /* This code path is called after _all_ references to the + * struct device has been dropped - so nobody should be +@@ -986,7 +993,7 @@ void ttm_dma_unpopulate(struct ttm_dma_t + + /* shrink pool if necessary (only on !is_cached pools)*/ + if (npages) +- ttm_dma_page_pool_free(pool, npages, GFP_KERNEL); ++ ttm_dma_page_pool_free(pool, npages, false); + ttm->state = tt_unpopulated; + } + EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); +@@ -996,8 +1003,6 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); + * + * XXX: (dchinner) Deadlock warning! + * +- * We need to pass sc->gfp_mask to ttm_dma_page_pool_free(). +- * + * I'm getting sadder as I hear more pathetical whimpers about needing per-pool + * shrinkers + */ +@@ -1030,8 +1035,8 @@ ttm_dma_pool_shrink_scan(struct shrinker + if (++idx < pool_offset) + continue; + nr_free = shrink_pages; +- shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, +- sc->gfp_mask); ++ /* OK to use static buffer since global mutex is held. */ ++ shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, true); + freed += nr_free - shrink_pages; + + pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n", diff --git a/queue-3.18/drm-vmwgfx-don-t-use-memory-accounting-for-kernel-side-fence-objects.patch b/queue-3.18/drm-vmwgfx-don-t-use-memory-accounting-for-kernel-side-fence-objects.patch new file mode 100644 index 00000000000..eb077db343d --- /dev/null +++ b/queue-3.18/drm-vmwgfx-don-t-use-memory-accounting-for-kernel-side-fence-objects.patch @@ -0,0 +1,80 @@ +From 1f563a6a46544602183e7493b6ef69769d3d76d9 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 2 Dec 2014 03:32:24 -0800 +Subject: drm/vmwgfx: Don't use memory accounting for kernel-side fence objects + +From: Thomas Hellstrom + +commit 1f563a6a46544602183e7493b6ef69769d3d76d9 upstream. + +Kernel side fence objects are used when unbinding resources and may thus be +created as part of a memory reclaim operation. This might trigger recursive +memory reclaims and result in the kernel running out of stack space. + +So a simple way out is to avoid accounting of these fence objects. +In principle this is OK since while user-space can trigger the creation of +such objects, it can't really hold on to them. However, their lifetime is +quite long, so some form of accounting should perhaps be implemented in the +future. + +Fixes kernel crashes when running, for example viewperf11 ensight-04 test 3 +with low system memory settings. + +Signed-off-by: Thomas Hellstrom +Reviewed-by: Jakob Bornecrantz +Reviewed-by: Sinclair Yeh +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 22 ++-------------------- + 1 file changed, 2 insertions(+), 20 deletions(-) + +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +@@ -545,35 +545,19 @@ void vmw_fence_obj_flush(struct vmw_fenc + + static void vmw_fence_destroy(struct vmw_fence_obj *fence) + { +- struct vmw_fence_manager *fman = fman_from_fence(fence); +- + fence_free(&fence->base); +- +- /* +- * Free kernel space accounting. +- */ +- ttm_mem_global_free(vmw_mem_glob(fman->dev_priv), +- fman->fence_size); + } + + int vmw_fence_create(struct vmw_fence_manager *fman, + uint32_t seqno, + struct vmw_fence_obj **p_fence) + { +- struct ttm_mem_global *mem_glob = vmw_mem_glob(fman->dev_priv); + struct vmw_fence_obj *fence; + int ret; + +- ret = ttm_mem_global_alloc(mem_glob, fman->fence_size, +- false, false); +- if (unlikely(ret != 0)) +- return ret; +- + fence = kzalloc(sizeof(*fence), GFP_KERNEL); +- if (unlikely(fence == NULL)) { +- ret = -ENOMEM; +- goto out_no_object; +- } ++ if (unlikely(fence == NULL)) ++ return -ENOMEM; + + ret = vmw_fence_obj_init(fman, fence, seqno, + vmw_fence_destroy); +@@ -585,8 +569,6 @@ int vmw_fence_create(struct vmw_fence_ma + + out_err_init: + kfree(fence); +-out_no_object: +- ttm_mem_global_free(mem_glob, fman->fence_size); + return ret; + } + diff --git a/queue-3.18/drm-vmwgfx-fix-error-printout-on-signals-pending.patch b/queue-3.18/drm-vmwgfx-fix-error-printout-on-signals-pending.patch new file mode 100644 index 00000000000..b63cc6af963 --- /dev/null +++ b/queue-3.18/drm-vmwgfx-fix-error-printout-on-signals-pending.patch @@ -0,0 +1,40 @@ +From e338c4c2b620ba4e75fd3576f8142eb93be12ce3 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 25 Nov 2014 08:20:05 +0100 +Subject: drm/vmwgfx: Fix error printout on signals pending + +From: Thomas Hellstrom + +commit e338c4c2b620ba4e75fd3576f8142eb93be12ce3 upstream. + +The function vmw_master_check() might return -ERESTARTSYS if there is a +signal pending, indicating that the IOCTL should be rerun, potentially from +user-space. At that point we shouldn't print out an error message since that +is not an error condition. In short, avoid bloating the kernel log when a +process refuses to die on SIGTERM. + +Signed-off-by: Thomas Hellstrom +Reviewed-by: Jakob Bornecrantz +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +@@ -1063,8 +1063,12 @@ static long vmw_generic_ioctl(struct fil + + vmaster = vmw_master_check(dev, file_priv, flags); + if (unlikely(IS_ERR(vmaster))) { +- DRM_INFO("IOCTL ERROR %d\n", nr); +- return PTR_ERR(vmaster); ++ ret = PTR_ERR(vmaster); ++ ++ if (ret != -ERESTARTSYS) ++ DRM_INFO("IOCTL ERROR Command %d, Error %ld.\n", ++ nr, ret); ++ return ret; + } + + ret = ioctl_func(filp, cmd, arg); diff --git a/queue-3.18/drm-vmwgfx-fix-fence-event-code.patch b/queue-3.18/drm-vmwgfx-fix-fence-event-code.patch new file mode 100644 index 00000000000..fda0c31556e --- /dev/null +++ b/queue-3.18/drm-vmwgfx-fix-fence-event-code.patch @@ -0,0 +1,58 @@ +From 89669e7a7f96be3ee8d9a22a071d7c0d3b4428fc Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Tue, 2 Dec 2014 03:36:57 -0800 +Subject: drm/vmwgfx: Fix fence event code + +From: Thomas Hellstrom + +commit 89669e7a7f96be3ee8d9a22a071d7c0d3b4428fc upstream. + +The commit "vmwgfx: Rework fence event action" introduced a number of bugs +that are fixed with this commit: + +a) A forgotten return stateemnt. +b) An if statement with identical branches. + +Reported-by: Rob Clark +Signed-off-by: Thomas Hellstrom +Reviewed-by: Jakob Bornecrantz +Reviewed-by: Sinclair Yeh +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +@@ -1087,6 +1087,8 @@ static int vmw_event_fence_action_create + if (ret != 0) + goto out_no_queue; + ++ return 0; ++ + out_no_queue: + event->base.destroy(&event->base); + out_no_event: +@@ -1162,17 +1164,10 @@ int vmw_fence_event_ioctl(struct drm_dev + + BUG_ON(fence == NULL); + +- if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME) +- ret = vmw_event_fence_action_create(file_priv, fence, +- arg->flags, +- arg->user_data, +- true); +- else +- ret = vmw_event_fence_action_create(file_priv, fence, +- arg->flags, +- arg->user_data, +- true); +- ++ ret = vmw_event_fence_action_create(file_priv, fence, ++ arg->flags, ++ arg->user_data, ++ true); + if (unlikely(ret != 0)) { + if (ret != -ERESTARTSYS) + DRM_ERROR("Failed to attach event to fence.\n"); diff --git a/queue-3.18/series b/queue-3.18/series index f25c0ba054b..dfdd7ccaa48 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -23,3 +23,17 @@ xen-netback-fixing-the-propagation-of-the-transmit-shaper-timeout.patch alx-fix-alx_poll.patch team-avoid-possible-underflow-of-count_pending-value-for-notify_peers-and-mcast_rejoin.patch enic-fix-rx-skb-checksum.patch +drm-vmwgfx-don-t-use-memory-accounting-for-kernel-side-fence-objects.patch +drm-vmwgfx-fix-error-printout-on-signals-pending.patch +drm-vmwgfx-fix-fence-event-code.patch +drm-ttm-avoid-memory-allocation-from-shrinker-functions.patch +drm-fb_helper-move-deferred-fb-checking-into-restore-mode-v2.patch +drm-dp-retry-aux-transactions-32-times-v1.1.patch +drm-dp-mst-remove-branches-before-dropping-the-reference.patch +drm-radeon-fix-typo-in-ci-dpm-disable.patch +drm-radeon-work-around-a-hw-bug-in-mgcg-on-cik.patch +drm-radeon-check-the-right-ring-in-radeon_evict_flags.patch +drm-radeon-kv-has-three-pplls-v2.patch +drm-radeon-fix-sad_count-check-for-dce3.patch +drm-radeon-adjust-default-bapm-settings-for-kv.patch +drm-radeon-properly-filter-dp1.2-4k-modes-on-non-dp1.2-hw.patch