aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-08-25 19:39:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-08-25 19:39:51 -0400
commit9e15400180a17c3b41b86a03bb96b2aebed86e64 (patch)
treee2b54b5819571a5928669f6cc94d10b2cfe9b09e
parent90a6cd503982bfd33ce8c70eb49bd2dd33bc6325 (diff)
parentda6119797705c2270f17b287660a1e7bd782a1eb (diff)
Merge tag 'drm-fixes-for-v4.13-rc7' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "Fixes for rc7, nothing too crazy, some core, i915, and sunxi fixes, Intel CI has been responsible for some of these fixes being required" * tag 'drm-fixes-for-v4.13-rc7' of git://people.freedesktop.org/~airlied/linux: drm/i915/gvt: Fix the kernel null pointer error drm: Release driver tracking before making the object available again drm/i915: Clear lost context-switch interrupts across reset drm/i915/bxt: use NULL for GPIO connection ID drm/i915/cnl: Fix LSPCON support. drm/i915/vbt: ignore extraneous child devices for a port drm/i915: Initialize 'data' in intel_dsi_dcs_backlight.c drm/atomic: If the atomic check fails, return its value first drm/atomic: Handle -EDEADLK with out-fences correctly drm: Fix framebuffer leak drm/imx: ipuv3-plane: fix YUV framebuffer scanout on the base plane gpu: ipu-v3: add DRM dependency drm/rockchip: Fix suspend crash when drm is not bound drm/sun4i: Implement drm_driver lastclose to restore fbdev console
-rw-r--r--drivers/gpu/drm/drm_atomic.c11
-rw-r--r--drivers/gpu/drm/drm_gem.c6
-rw-r--r--drivers/gpu/drm/drm_plane.c1
-rw-r--r--drivers/gpu/drm/i915/gvt/cmd_parser.c2
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c15
-rw-r--r--drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c2
-rw-r--r--drivers/gpu/drm/i915/intel_dsi_vbt.c2
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c23
-rw-r--r--drivers/gpu/drm/i915/intel_lspcon.c4
-rw-r--r--drivers/gpu/drm/imx/ipuv3-plane.c6
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_drv.c12
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_drv.c8
-rw-r--r--drivers/gpu/ipu-v3/Kconfig1
13 files changed, 69 insertions, 24 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index c0f336d23f9c..aed25c4183bb 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -1655,6 +1655,9 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
1655 if (config->funcs->atomic_check) 1655 if (config->funcs->atomic_check)
1656 ret = config->funcs->atomic_check(state->dev, state); 1656 ret = config->funcs->atomic_check(state->dev, state);
1657 1657
1658 if (ret)
1659 return ret;
1660
1658 if (!state->allow_modeset) { 1661 if (!state->allow_modeset) {
1659 for_each_new_crtc_in_state(state, crtc, crtc_state, i) { 1662 for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1660 if (drm_atomic_crtc_needs_modeset(crtc_state)) { 1663 if (drm_atomic_crtc_needs_modeset(crtc_state)) {
@@ -1665,7 +1668,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
1665 } 1668 }
1666 } 1669 }
1667 1670
1668 return ret; 1671 return 0;
1669} 1672}
1670EXPORT_SYMBOL(drm_atomic_check_only); 1673EXPORT_SYMBOL(drm_atomic_check_only);
1671 1674
@@ -2167,10 +2170,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
2167 struct drm_atomic_state *state; 2170 struct drm_atomic_state *state;
2168 struct drm_modeset_acquire_ctx ctx; 2171 struct drm_modeset_acquire_ctx ctx;
2169 struct drm_plane *plane; 2172 struct drm_plane *plane;
2170 struct drm_out_fence_state *fence_state = NULL; 2173 struct drm_out_fence_state *fence_state;
2171 unsigned plane_mask; 2174 unsigned plane_mask;
2172 int ret = 0; 2175 int ret = 0;
2173 unsigned int i, j, num_fences = 0; 2176 unsigned int i, j, num_fences;
2174 2177
2175 /* disallow for drivers not supporting atomic: */ 2178 /* disallow for drivers not supporting atomic: */
2176 if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) 2179 if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
@@ -2211,6 +2214,8 @@ retry:
2211 plane_mask = 0; 2214 plane_mask = 0;
2212 copied_objs = 0; 2215 copied_objs = 0;
2213 copied_props = 0; 2216 copied_props = 0;
2217 fence_state = NULL;
2218 num_fences = 0;
2214 2219
2215 for (i = 0; i < arg->count_objs; i++) { 2220 for (i = 0; i < arg->count_objs; i++) {
2216 uint32_t obj_id, count_props; 2221 uint32_t obj_id, count_props;
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 8dc11064253d..cdaac37907b1 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -255,13 +255,13 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
255 struct drm_gem_object *obj = ptr; 255 struct drm_gem_object *obj = ptr;
256 struct drm_device *dev = obj->dev; 256 struct drm_device *dev = obj->dev;
257 257
258 if (dev->driver->gem_close_object)
259 dev->driver->gem_close_object(obj, file_priv);
260
258 if (drm_core_check_feature(dev, DRIVER_PRIME)) 261 if (drm_core_check_feature(dev, DRIVER_PRIME))
259 drm_gem_remove_prime_handles(obj, file_priv); 262 drm_gem_remove_prime_handles(obj, file_priv);
260 drm_vma_node_revoke(&obj->vma_node, file_priv); 263 drm_vma_node_revoke(&obj->vma_node, file_priv);
261 264
262 if (dev->driver->gem_close_object)
263 dev->driver->gem_close_object(obj, file_priv);
264
265 drm_gem_object_handle_put_unlocked(obj); 265 drm_gem_object_handle_put_unlocked(obj);
266 266
267 return 0; 267 return 0;
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 5dc8c4350602..e40c12fabbde 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -601,6 +601,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
601 601
602 crtc = drm_crtc_find(dev, plane_req->crtc_id); 602 crtc = drm_crtc_find(dev, plane_req->crtc_id);
603 if (!crtc) { 603 if (!crtc) {
604 drm_framebuffer_put(fb);
604 DRM_DEBUG_KMS("Unknown crtc ID %d\n", 605 DRM_DEBUG_KMS("Unknown crtc ID %d\n",
605 plane_req->crtc_id); 606 plane_req->crtc_id);
606 return -ENOENT; 607 return -ENOENT;
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index 713848c36349..e556a46cd4c2 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -2714,7 +2714,7 @@ static int shadow_indirect_ctx(struct intel_shadow_wa_ctx *wa_ctx)
2714unmap_src: 2714unmap_src:
2715 i915_gem_object_unpin_map(obj); 2715 i915_gem_object_unpin_map(obj);
2716put_obj: 2716put_obj:
2717 i915_gem_object_put(wa_ctx->indirect_ctx.obj); 2717 i915_gem_object_put(obj);
2718 return ret; 2718 return ret;
2719} 2719}
2720 2720
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 639d45c1dd2e..7ea7fd1e8856 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -1120,8 +1120,8 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
1120 bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; 1120 bool is_dvi, is_hdmi, is_dp, is_edp, is_crt;
1121 uint8_t aux_channel, ddc_pin; 1121 uint8_t aux_channel, ddc_pin;
1122 /* Each DDI port can have more than one value on the "DVO Port" field, 1122 /* Each DDI port can have more than one value on the "DVO Port" field,
1123 * so look for all the possible values for each port and abort if more 1123 * so look for all the possible values for each port.
1124 * than one is found. */ 1124 */
1125 int dvo_ports[][3] = { 1125 int dvo_ports[][3] = {
1126 {DVO_PORT_HDMIA, DVO_PORT_DPA, -1}, 1126 {DVO_PORT_HDMIA, DVO_PORT_DPA, -1},
1127 {DVO_PORT_HDMIB, DVO_PORT_DPB, -1}, 1127 {DVO_PORT_HDMIB, DVO_PORT_DPB, -1},
@@ -1130,7 +1130,10 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
1130 {DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE}, 1130 {DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE},
1131 }; 1131 };
1132 1132
1133 /* Find the child device to use, abort if more than one found. */ 1133 /*
1134 * Find the first child device to reference the port, report if more
1135 * than one found.
1136 */
1134 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1137 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
1135 it = dev_priv->vbt.child_dev + i; 1138 it = dev_priv->vbt.child_dev + i;
1136 1139
@@ -1140,11 +1143,11 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
1140 1143
1141 if (it->common.dvo_port == dvo_ports[port][j]) { 1144 if (it->common.dvo_port == dvo_ports[port][j]) {
1142 if (child) { 1145 if (child) {
1143 DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n", 1146 DRM_DEBUG_KMS("More than one child device for port %c in VBT, using the first.\n",
1144 port_name(port)); 1147 port_name(port));
1145 return; 1148 } else {
1149 child = it;
1146 } 1150 }
1147 child = it;
1148 } 1151 }
1149 } 1152 }
1150 } 1153 }
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
index 6e09ceb71500..150a156f3b1e 100644
--- a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
+++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
@@ -46,7 +46,7 @@ static u32 dcs_get_backlight(struct intel_connector *connector)
46 struct intel_encoder *encoder = connector->encoder; 46 struct intel_encoder *encoder = connector->encoder;
47 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); 47 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
48 struct mipi_dsi_device *dsi_device; 48 struct mipi_dsi_device *dsi_device;
49 u8 data; 49 u8 data = 0;
50 enum port port; 50 enum port port;
51 51
52 /* FIXME: Need to take care of 16 bit brightness level */ 52 /* FIXME: Need to take care of 16 bit brightness level */
diff --git a/drivers/gpu/drm/i915/intel_dsi_vbt.c b/drivers/gpu/drm/i915/intel_dsi_vbt.c
index 7158c7ce9c09..91c07b0c8db9 100644
--- a/drivers/gpu/drm/i915/intel_dsi_vbt.c
+++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c
@@ -306,7 +306,7 @@ static void bxt_exec_gpio(struct drm_i915_private *dev_priv,
306 306
307 if (!gpio_desc) { 307 if (!gpio_desc) {
308 gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, 308 gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev,
309 "panel", gpio_index, 309 NULL, gpio_index,
310 value ? GPIOD_OUT_LOW : 310 value ? GPIOD_OUT_LOW :
311 GPIOD_OUT_HIGH); 311 GPIOD_OUT_HIGH);
312 312
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 7404cf2aac28..2afa4daa88e8 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1221,6 +1221,14 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine)
1221 return ret; 1221 return ret;
1222} 1222}
1223 1223
1224static u8 gtiir[] = {
1225 [RCS] = 0,
1226 [BCS] = 0,
1227 [VCS] = 1,
1228 [VCS2] = 1,
1229 [VECS] = 3,
1230};
1231
1224static int gen8_init_common_ring(struct intel_engine_cs *engine) 1232static int gen8_init_common_ring(struct intel_engine_cs *engine)
1225{ 1233{
1226 struct drm_i915_private *dev_priv = engine->i915; 1234 struct drm_i915_private *dev_priv = engine->i915;
@@ -1245,9 +1253,22 @@ static int gen8_init_common_ring(struct intel_engine_cs *engine)
1245 1253
1246 DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name); 1254 DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name);
1247 1255
1248 /* After a GPU reset, we may have requests to replay */ 1256 GEM_BUG_ON(engine->id >= ARRAY_SIZE(gtiir));
1257
1258 /*
1259 * Clear any pending interrupt state.
1260 *
1261 * We do it twice out of paranoia that some of the IIR are double
1262 * buffered, and if we only reset it once there may still be
1263 * an interrupt pending.
1264 */
1265 I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]),
1266 GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift);
1267 I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]),
1268 GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift);
1249 clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); 1269 clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
1250 1270
1271 /* After a GPU reset, we may have requests to replay */
1251 submit = false; 1272 submit = false;
1252 for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) { 1273 for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) {
1253 if (!port_isset(&port[n])) 1274 if (!port_isset(&port[n]))
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
index 5abef482eacf..beb9baaf2f2e 100644
--- a/drivers/gpu/drm/i915/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/intel_lspcon.c
@@ -210,8 +210,8 @@ bool lspcon_init(struct intel_digital_port *intel_dig_port)
210 struct drm_device *dev = intel_dig_port->base.base.dev; 210 struct drm_device *dev = intel_dig_port->base.base.dev;
211 struct drm_i915_private *dev_priv = to_i915(dev); 211 struct drm_i915_private *dev_priv = to_i915(dev);
212 212
213 if (!IS_GEN9(dev_priv)) { 213 if (!HAS_LSPCON(dev_priv)) {
214 DRM_ERROR("LSPCON is supported on GEN9 only\n"); 214 DRM_ERROR("LSPCON is not supported on this platform\n");
215 return false; 215 return false;
216 } 216 }
217 217
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
index 6276bb834b4f..d3845989a29d 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -545,15 +545,13 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
545 return; 545 return;
546 } 546 }
547 547
548 ics = ipu_drm_fourcc_to_colorspace(fb->format->format);
548 switch (ipu_plane->dp_flow) { 549 switch (ipu_plane->dp_flow) {
549 case IPU_DP_FLOW_SYNC_BG: 550 case IPU_DP_FLOW_SYNC_BG:
550 ipu_dp_setup_channel(ipu_plane->dp, 551 ipu_dp_setup_channel(ipu_plane->dp, ics, IPUV3_COLORSPACE_RGB);
551 IPUV3_COLORSPACE_RGB,
552 IPUV3_COLORSPACE_RGB);
553 ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); 552 ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true);
554 break; 553 break;
555 case IPU_DP_FLOW_SYNC_FG: 554 case IPU_DP_FLOW_SYNC_FG:
556 ics = ipu_drm_fourcc_to_colorspace(state->fb->format->format);
557 ipu_dp_setup_channel(ipu_plane->dp, ics, 555 ipu_dp_setup_channel(ipu_plane->dp, ics,
558 IPUV3_COLORSPACE_UNKNOWN); 556 IPUV3_COLORSPACE_UNKNOWN);
559 /* Enable local alpha on partial plane */ 557 /* Enable local alpha on partial plane */
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index c6b1b7f3a2a3..c16bc0a7115b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -275,11 +275,15 @@ static void rockchip_drm_fb_resume(struct drm_device *drm)
275static int rockchip_drm_sys_suspend(struct device *dev) 275static int rockchip_drm_sys_suspend(struct device *dev)
276{ 276{
277 struct drm_device *drm = dev_get_drvdata(dev); 277 struct drm_device *drm = dev_get_drvdata(dev);
278 struct rockchip_drm_private *priv = drm->dev_private; 278 struct rockchip_drm_private *priv;
279
280 if (!drm)
281 return 0;
279 282
280 drm_kms_helper_poll_disable(drm); 283 drm_kms_helper_poll_disable(drm);
281 rockchip_drm_fb_suspend(drm); 284 rockchip_drm_fb_suspend(drm);
282 285
286 priv = drm->dev_private;
283 priv->state = drm_atomic_helper_suspend(drm); 287 priv->state = drm_atomic_helper_suspend(drm);
284 if (IS_ERR(priv->state)) { 288 if (IS_ERR(priv->state)) {
285 rockchip_drm_fb_resume(drm); 289 rockchip_drm_fb_resume(drm);
@@ -293,8 +297,12 @@ static int rockchip_drm_sys_suspend(struct device *dev)
293static int rockchip_drm_sys_resume(struct device *dev) 297static int rockchip_drm_sys_resume(struct device *dev)
294{ 298{
295 struct drm_device *drm = dev_get_drvdata(dev); 299 struct drm_device *drm = dev_get_drvdata(dev);
296 struct rockchip_drm_private *priv = drm->dev_private; 300 struct rockchip_drm_private *priv;
301
302 if (!drm)
303 return 0;
297 304
305 priv = drm->dev_private;
298 drm_atomic_helper_resume(drm, priv->state); 306 drm_atomic_helper_resume(drm, priv->state);
299 rockchip_drm_fb_resume(drm); 307 rockchip_drm_fb_resume(drm);
300 drm_kms_helper_poll_enable(drm); 308 drm_kms_helper_poll_enable(drm);
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
index abc7d8fe06b4..a45a627283a1 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -25,12 +25,20 @@
25#include "sun4i_framebuffer.h" 25#include "sun4i_framebuffer.h"
26#include "sun4i_tcon.h" 26#include "sun4i_tcon.h"
27 27
28static void sun4i_drv_lastclose(struct drm_device *dev)
29{
30 struct sun4i_drv *drv = dev->dev_private;
31
32 drm_fbdev_cma_restore_mode(drv->fbdev);
33}
34
28DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops); 35DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops);
29 36
30static struct drm_driver sun4i_drv_driver = { 37static struct drm_driver sun4i_drv_driver = {
31 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC, 38 .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
32 39
33 /* Generic Operations */ 40 /* Generic Operations */
41 .lastclose = sun4i_drv_lastclose,
34 .fops = &sun4i_drv_fops, 42 .fops = &sun4i_drv_fops,
35 .name = "sun4i-drm", 43 .name = "sun4i-drm",
36 .desc = "Allwinner sun4i Display Engine", 44 .desc = "Allwinner sun4i Display Engine",
diff --git a/drivers/gpu/ipu-v3/Kconfig b/drivers/gpu/ipu-v3/Kconfig
index 08766c6e7856..87a20b3dcf7a 100644
--- a/drivers/gpu/ipu-v3/Kconfig
+++ b/drivers/gpu/ipu-v3/Kconfig
@@ -1,6 +1,7 @@
1config IMX_IPUV3_CORE 1config IMX_IPUV3_CORE
2 tristate "IPUv3 core support" 2 tristate "IPUv3 core support"
3 depends on SOC_IMX5 || SOC_IMX6Q || ARCH_MULTIPLATFORM 3 depends on SOC_IMX5 || SOC_IMX6Q || ARCH_MULTIPLATFORM
4 depends on DRM || !DRM # if DRM=m, this can't be 'y'
4 select GENERIC_IRQ_CHIP 5 select GENERIC_IRQ_CHIP
5 help 6 help
6 Choose this if you have a i.MX5/6 system and want to use the Image 7 Choose this if you have a i.MX5/6 system and want to use the Image