Commit ed8c37e158cb697df905d6b4933bc107c69e8936

Authored by Linus Torvalds

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie:
 "Smattering of fixes, i915, exynos, tegra, msm, vmwgfx.

  A bit of framebuffer reference counting fallout fixes, i915 GM45
  regression fix, DVI regression fix, vmware info leak between processes
  fix"

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
  drm/exynos: use %pad for dma_addr_t
  drm/exynos: dsi: use IS_ERR() to check devm_ioremap_resource() results
  MAINTAINERS: update maintainer entry for Exynos DP driver
  drm/exynos: balance framebuffer refcount
  drm/i915: Move all ring resets before setting the HWS page
  drm/i915: Don't WARN nor handle unexpected hpd interrupts on gmch platforms
  drm/msm/mdp4: cure for the cursor blues (v2)
  drm/msm: default to XR24 rather than AR24
  drm/msm: fix memory leak
  drm/tegra: restrict plane loops to legacy planes
  drm/i915: Allow full PPGTT with param override
  drm/i915: Discard BIOS framebuffers too small to accommodate chosen mode
  drm/vmwgfx: Make sure user-space can't DMA across buffer object boundaries v2
  drm/i915: get power domain in case the BIOS enabled eDP VDD
  drm/i915: Don't check gmch state on inherited configs
  drm/i915: Allow user modes to exceed DVI 165MHz limit

Showing 24 changed files Side-by-side Diff

... ... @@ -3485,6 +3485,12 @@
3485 3485 F: drivers/extcon/
3486 3486 F: Documentation/extcon/
3487 3487  
  3488 +EXYNOS DP DRIVER
  3489 +M: Jingoo Han <jg1.han@samsung.com>
  3490 +L: dri-devel@lists.freedesktop.org
  3491 +S: Maintained
  3492 +F: drivers/gpu/drm/exynos/exynos_dp*
  3493 +
3488 3494 EXYNOS MIPI DISPLAY DRIVERS
3489 3495 M: Inki Dae <inki.dae@samsung.com>
3490 3496 M: Donghwa Lee <dh09.lee@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_crtc.c
... ... @@ -145,6 +145,7 @@
145 145  
146 146 plane->crtc = crtc;
147 147 plane->fb = crtc->primary->fb;
  148 + drm_framebuffer_reference(plane->fb);
148 149  
149 150 return 0;
150 151 }
drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
... ... @@ -263,7 +263,7 @@
263 263 buffer->sgt = sgt;
264 264 exynos_gem_obj->base.import_attach = attach;
265 265  
266   - DRM_DEBUG_PRIME("dma_addr = 0x%x, size = 0x%lx\n", buffer->dma_addr,
  266 + DRM_DEBUG_PRIME("dma_addr = %pad, size = 0x%lx\n", &buffer->dma_addr,
267 267 buffer->size);
268 268  
269 269 return &exynos_gem_obj->base;
drivers/gpu/drm/exynos/exynos_drm_dsi.c
... ... @@ -1426,9 +1426,9 @@
1426 1426  
1427 1427 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1428 1428 dsi->reg_base = devm_ioremap_resource(&pdev->dev, res);
1429   - if (!dsi->reg_base) {
  1429 + if (IS_ERR(dsi->reg_base)) {
1430 1430 dev_err(&pdev->dev, "failed to remap io region\n");
1431   - return -EADDRNOTAVAIL;
  1431 + return PTR_ERR(dsi->reg_base);
1432 1432 }
1433 1433  
1434 1434 dsi->phy = devm_phy_get(&pdev->dev, "dsim");
drivers/gpu/drm/exynos/exynos_drm_vidi.c
... ... @@ -220,7 +220,7 @@
220 220  
221 221 win_data->enabled = true;
222 222  
223   - DRM_DEBUG_KMS("dma_addr = 0x%x\n", win_data->dma_addr);
  223 + DRM_DEBUG_KMS("dma_addr = %pad\n", &win_data->dma_addr);
224 224  
225 225 if (ctx->vblank_on)
226 226 schedule_work(&ctx->work);
drivers/gpu/drm/i915/i915_gem_gtt.c
... ... @@ -50,7 +50,7 @@
50 50  
51 51 /* Full ppgtt disabled by default for now due to issues. */
52 52 if (full)
53   - return false; /* HAS_PPGTT(dev) */
  53 + return HAS_PPGTT(dev) && (i915.enable_ppgtt == 2);
54 54 else
55 55 return HAS_ALIASING_PPGTT(dev);
56 56 }
drivers/gpu/drm/i915/i915_irq.c
... ... @@ -1362,10 +1362,20 @@
1362 1362 spin_lock(&dev_priv->irq_lock);
1363 1363 for (i = 1; i < HPD_NUM_PINS; i++) {
1364 1364  
1365   - WARN_ONCE(hpd[i] & hotplug_trigger &&
1366   - dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED,
1367   - "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n",
1368   - hotplug_trigger, i, hpd[i]);
  1365 + if (hpd[i] & hotplug_trigger &&
  1366 + dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) {
  1367 + /*
  1368 + * On GMCH platforms the interrupt mask bits only
  1369 + * prevent irq generation, not the setting of the
  1370 + * hotplug bits itself. So only WARN about unexpected
  1371 + * interrupts on saner platforms.
  1372 + */
  1373 + WARN_ONCE(INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev),
  1374 + "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n",
  1375 + hotplug_trigger, i, hpd[i]);
  1376 +
  1377 + continue;
  1378 + }
1369 1379  
1370 1380 if (!(hpd[i] & hotplug_trigger) ||
1371 1381 dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED)
drivers/gpu/drm/i915/i915_reg.h
... ... @@ -827,6 +827,7 @@
827 827 # define MI_FLUSH_ENABLE (1 << 12)
828 828 # define ASYNC_FLIP_PERF_DISABLE (1 << 14)
829 829 # define MODE_IDLE (1 << 9)
  830 +# define STOP_RING (1 << 8)
830 831  
831 832 #define GEN6_GT_MODE 0x20d0
832 833 #define GEN7_GT_MODE 0x7008
drivers/gpu/drm/i915/intel_display.c
... ... @@ -9654,11 +9654,22 @@
9654 9654 PIPE_CONF_CHECK_I(pipe_src_w);
9655 9655 PIPE_CONF_CHECK_I(pipe_src_h);
9656 9656  
9657   - PIPE_CONF_CHECK_I(gmch_pfit.control);
9658   - /* pfit ratios are autocomputed by the hw on gen4+ */
9659   - if (INTEL_INFO(dev)->gen < 4)
9660   - PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios);
9661   - PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits);
  9657 + /*
  9658 + * FIXME: BIOS likes to set up a cloned config with lvds+external
  9659 + * screen. Since we don't yet re-compute the pipe config when moving
  9660 + * just the lvds port away to another pipe the sw tracking won't match.
  9661 + *
  9662 + * Proper atomic modesets with recomputed global state will fix this.
  9663 + * Until then just don't check gmch state for inherited modes.
  9664 + */
  9665 + if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_INHERITED_MODE)) {
  9666 + PIPE_CONF_CHECK_I(gmch_pfit.control);
  9667 + /* pfit ratios are autocomputed by the hw on gen4+ */
  9668 + if (INTEL_INFO(dev)->gen < 4)
  9669 + PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios);
  9670 + PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits);
  9671 + }
  9672 +
9662 9673 PIPE_CONF_CHECK_I(pch_pfit.enabled);
9663 9674 if (current_config->pch_pfit.enabled) {
9664 9675 PIPE_CONF_CHECK_I(pch_pfit.pos);
... ... @@ -11615,6 +11626,8 @@
11615 11626 list_for_each_entry(crtc, &dev->mode_config.crtc_list,
11616 11627 base.head) {
11617 11628 memset(&crtc->config, 0, sizeof(crtc->config));
  11629 +
  11630 + crtc->config.quirks |= PIPE_CONFIG_QUIRK_INHERITED_MODE;
11618 11631  
11619 11632 crtc->active = dev_priv->display.get_pipe_config(crtc,
11620 11633 &crtc->config);
drivers/gpu/drm/i915/intel_dp.c
... ... @@ -3619,7 +3619,8 @@
3619 3619 {
3620 3620 struct drm_connector *connector = &intel_connector->base;
3621 3621 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3622   - struct drm_device *dev = intel_dig_port->base.base.dev;
  3622 + struct intel_encoder *intel_encoder = &intel_dig_port->base;
  3623 + struct drm_device *dev = intel_encoder->base.dev;
3623 3624 struct drm_i915_private *dev_priv = dev->dev_private;
3624 3625 struct drm_display_mode *fixed_mode = NULL;
3625 3626 bool has_dpcd;
... ... @@ -3628,6 +3629,14 @@
3628 3629  
3629 3630 if (!is_edp(intel_dp))
3630 3631 return true;
  3632 +
  3633 + /* The VDD bit needs a power domain reference, so if the bit is already
  3634 + * enabled when we boot, grab this reference. */
  3635 + if (edp_have_panel_vdd(intel_dp)) {
  3636 + enum intel_display_power_domain power_domain;
  3637 + power_domain = intel_display_port_power_domain(intel_encoder);
  3638 + intel_display_power_get(dev_priv, power_domain);
  3639 + }
3631 3640  
3632 3641 /* Cache DPCD and EDID for edp. */
3633 3642 intel_edp_panel_vdd_on(intel_dp);
drivers/gpu/drm/i915/intel_drv.h
... ... @@ -236,7 +236,8 @@
236 236 * tracked with quirk flags so that fastboot and state checker can act
237 237 * accordingly.
238 238 */
239   -#define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */
  239 +#define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */
  240 +#define PIPE_CONFIG_QUIRK_INHERITED_MODE (1<<1) /* mode inherited from firmware */
240 241 unsigned long quirks;
241 242  
242 243 /* User requested mode, only valid as a starting point to
drivers/gpu/drm/i915/intel_fbdev.c
... ... @@ -132,6 +132,16 @@
132 132  
133 133 mutex_lock(&dev->struct_mutex);
134 134  
  135 + if (intel_fb &&
  136 + (sizes->fb_width > intel_fb->base.width ||
  137 + sizes->fb_height > intel_fb->base.height)) {
  138 + DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d),"
  139 + " releasing it\n",
  140 + intel_fb->base.width, intel_fb->base.height,
  141 + sizes->fb_width, sizes->fb_height);
  142 + drm_framebuffer_unreference(&intel_fb->base);
  143 + intel_fb = ifbdev->fb = NULL;
  144 + }
135 145 if (!intel_fb || WARN_ON(!intel_fb->obj)) {
136 146 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n");
137 147 ret = intelfb_alloc(helper, sizes);
drivers/gpu/drm/i915/intel_hdmi.c
... ... @@ -821,11 +821,11 @@
821 821 }
822 822 }
823 823  
824   -static int hdmi_portclock_limit(struct intel_hdmi *hdmi)
  824 +static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
825 825 {
826 826 struct drm_device *dev = intel_hdmi_to_dev(hdmi);
827 827  
828   - if (!hdmi->has_hdmi_sink || IS_G4X(dev))
  828 + if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev))
829 829 return 165000;
830 830 else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
831 831 return 300000;
... ... @@ -837,7 +837,8 @@
837 837 intel_hdmi_mode_valid(struct drm_connector *connector,
838 838 struct drm_display_mode *mode)
839 839 {
840   - if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector)))
  840 + if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
  841 + true))
841 842 return MODE_CLOCK_HIGH;
842 843 if (mode->clock < 20000)
843 844 return MODE_CLOCK_LOW;
... ... @@ -879,7 +880,7 @@
879 880 struct drm_device *dev = encoder->base.dev;
880 881 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
881 882 int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2;
882   - int portclock_limit = hdmi_portclock_limit(intel_hdmi);
  883 + int portclock_limit = hdmi_portclock_limit(intel_hdmi, false);
883 884 int desired_bpp;
884 885  
885 886 if (intel_hdmi->color_range_auto) {
drivers/gpu/drm/i915/intel_ringbuffer.c
... ... @@ -437,32 +437,41 @@
437 437 I915_WRITE(HWS_PGA, addr);
438 438 }
439 439  
440   -static int init_ring_common(struct intel_ring_buffer *ring)
  440 +static bool stop_ring(struct intel_ring_buffer *ring)
441 441 {
442   - struct drm_device *dev = ring->dev;
443   - struct drm_i915_private *dev_priv = dev->dev_private;
444   - struct drm_i915_gem_object *obj = ring->obj;
445   - int ret = 0;
446   - u32 head;
  442 + struct drm_i915_private *dev_priv = to_i915(ring->dev);
447 443  
448   - gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
  444 + if (!IS_GEN2(ring->dev)) {
  445 + I915_WRITE_MODE(ring, _MASKED_BIT_ENABLE(STOP_RING));
  446 + if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) {
  447 + DRM_ERROR("%s :timed out trying to stop ring\n", ring->name);
  448 + return false;
  449 + }
  450 + }
449 451  
450   - /* Stop the ring if it's running. */
451 452 I915_WRITE_CTL(ring, 0);
452 453 I915_WRITE_HEAD(ring, 0);
453 454 ring->write_tail(ring, 0);
454   - if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000))
455   - DRM_ERROR("%s :timed out trying to stop ring\n", ring->name);
456 455  
457   - if (I915_NEED_GFX_HWS(dev))
458   - intel_ring_setup_status_page(ring);
459   - else
460   - ring_setup_phys_status_page(ring);
  456 + if (!IS_GEN2(ring->dev)) {
  457 + (void)I915_READ_CTL(ring);
  458 + I915_WRITE_MODE(ring, _MASKED_BIT_DISABLE(STOP_RING));
  459 + }
461 460  
462   - head = I915_READ_HEAD(ring) & HEAD_ADDR;
  461 + return (I915_READ_HEAD(ring) & HEAD_ADDR) == 0;
  462 +}
463 463  
464   - /* G45 ring initialization fails to reset head to zero */
465   - if (head != 0) {
  464 +static int init_ring_common(struct intel_ring_buffer *ring)
  465 +{
  466 + struct drm_device *dev = ring->dev;
  467 + struct drm_i915_private *dev_priv = dev->dev_private;
  468 + struct drm_i915_gem_object *obj = ring->obj;
  469 + int ret = 0;
  470 +
  471 + gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
  472 +
  473 + if (!stop_ring(ring)) {
  474 + /* G45 ring initialization often fails to reset head to zero */
466 475 DRM_DEBUG_KMS("%s head not reset to zero "
467 476 "ctl %08x head %08x tail %08x start %08x\n",
468 477 ring->name,
... ... @@ -471,9 +480,7 @@
471 480 I915_READ_TAIL(ring),
472 481 I915_READ_START(ring));
473 482  
474   - I915_WRITE_HEAD(ring, 0);
475   -
476   - if (I915_READ_HEAD(ring) & HEAD_ADDR) {
  483 + if (!stop_ring(ring)) {
477 484 DRM_ERROR("failed to set %s head to zero "
478 485 "ctl %08x head %08x tail %08x start %08x\n",
479 486 ring->name,
480 487  
... ... @@ -481,8 +488,15 @@
481 488 I915_READ_HEAD(ring),
482 489 I915_READ_TAIL(ring),
483 490 I915_READ_START(ring));
  491 + ret = -EIO;
  492 + goto out;
484 493 }
485 494 }
  495 +
  496 + if (I915_NEED_GFX_HWS(dev))
  497 + intel_ring_setup_status_page(ring);
  498 + else
  499 + ring_setup_phys_status_page(ring);
486 500  
487 501 /* Initialize the ring. This must happen _after_ we've cleared the ring
488 502 * registers with the above sequence (the readback of the HEAD registers
drivers/gpu/drm/i915/intel_ringbuffer.h
... ... @@ -34,6 +34,7 @@
34 34 #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)
35 35  
36 36 #define I915_READ_MODE(ring) I915_READ(RING_MI_MODE((ring)->mmio_base))
  37 +#define I915_WRITE_MODE(ring, val) I915_WRITE(RING_MI_MODE((ring)->mmio_base), val)
37 38  
38 39 enum intel_ring_hangcheck_action {
39 40 HANGCHECK_IDLE = 0,
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
... ... @@ -510,9 +510,8 @@
510 510 MDP4_DMA_CURSOR_BLEND_CONFIG_CURSOR_EN);
511 511 } else {
512 512 /* disable cursor: */
513   - mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma), 0);
514   - mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BLEND_CONFIG(dma),
515   - MDP4_DMA_CURSOR_BLEND_CONFIG_FORMAT(CURSOR_ARGB));
  513 + mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma),
  514 + mdp4_kms->blank_cursor_iova);
516 515 }
517 516  
518 517 /* and drop the iova ref + obj rev when done scanning out: */
519 518  
... ... @@ -574,11 +573,9 @@
574 573  
575 574 if (old_bo) {
576 575 /* drop our previous reference: */
577   - msm_gem_put_iova(old_bo, mdp4_kms->id);
578   - drm_gem_object_unreference_unlocked(old_bo);
  576 + drm_flip_work_queue(&mdp4_crtc->unref_cursor_work, old_bo);
579 577 }
580 578  
581   - crtc_flush(crtc);
582 579 request_pending(crtc, PENDING_CURSOR);
583 580  
584 581 return 0;
drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c
... ... @@ -70,11 +70,11 @@
70 70  
71 71 VERB("status=%08x", status);
72 72  
  73 + mdp_dispatch_irqs(mdp_kms, status);
  74 +
73 75 for (id = 0; id < priv->num_crtcs; id++)
74 76 if (status & mdp4_crtc_vblank(priv->crtcs[id]))
75 77 drm_handle_vblank(dev, id);
76   -
77   - mdp_dispatch_irqs(mdp_kms, status);
78 78  
79 79 return IRQ_HANDLED;
80 80 }
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
... ... @@ -144,6 +144,10 @@
144 144 static void mdp4_destroy(struct msm_kms *kms)
145 145 {
146 146 struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
  147 + if (mdp4_kms->blank_cursor_iova)
  148 + msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id);
  149 + if (mdp4_kms->blank_cursor_bo)
  150 + drm_gem_object_unreference(mdp4_kms->blank_cursor_bo);
147 151 kfree(mdp4_kms);
148 152 }
149 153  
... ... @@ -369,6 +373,23 @@
369 373 ret = modeset_init(mdp4_kms);
370 374 if (ret) {
371 375 dev_err(dev->dev, "modeset_init failed: %d\n", ret);
  376 + goto fail;
  377 + }
  378 +
  379 + mutex_lock(&dev->struct_mutex);
  380 + mdp4_kms->blank_cursor_bo = msm_gem_new(dev, SZ_16K, MSM_BO_WC);
  381 + mutex_unlock(&dev->struct_mutex);
  382 + if (IS_ERR(mdp4_kms->blank_cursor_bo)) {
  383 + ret = PTR_ERR(mdp4_kms->blank_cursor_bo);
  384 + dev_err(dev->dev, "could not allocate blank-cursor bo: %d\n", ret);
  385 + mdp4_kms->blank_cursor_bo = NULL;
  386 + goto fail;
  387 + }
  388 +
  389 + ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id,
  390 + &mdp4_kms->blank_cursor_iova);
  391 + if (ret) {
  392 + dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret);
372 393 goto fail;
373 394 }
374 395  
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h
... ... @@ -44,6 +44,10 @@
44 44 struct clk *lut_clk;
45 45  
46 46 struct mdp_irq error_handler;
  47 +
  48 + /* empty/blank cursor bo to use when cursor is "disabled" */
  49 + struct drm_gem_object *blank_cursor_bo;
  50 + uint32_t blank_cursor_iova;
47 51 };
48 52 #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base)
49 53  
drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c
... ... @@ -71,11 +71,11 @@
71 71  
72 72 VERB("status=%08x", status);
73 73  
  74 + mdp_dispatch_irqs(mdp_kms, status);
  75 +
74 76 for (id = 0; id < priv->num_crtcs; id++)
75 77 if (status & mdp5_crtc_vblank(priv->crtcs[id]))
76 78 drm_handle_vblank(dev, id);
77   -
78   - mdp_dispatch_irqs(mdp_kms, status);
79 79 }
80 80  
81 81 irqreturn_t mdp5_irq(struct msm_kms *kms)
drivers/gpu/drm/msm/msm_fbdev.c
... ... @@ -62,11 +62,8 @@
62 62 dma_addr_t paddr;
63 63 int ret, size;
64 64  
65   - /* only doing ARGB32 since this is what is needed to alpha-blend
66   - * with video overlays:
67   - */
68 65 sizes->surface_bpp = 32;
69   - sizes->surface_depth = 32;
  66 + sizes->surface_depth = 24;
70 67  
71 68 DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width,
72 69 sizes->surface_height, sizes->surface_bpp,
drivers/gpu/drm/msm/msm_gem.c
... ... @@ -118,8 +118,10 @@
118 118  
119 119 if (iommu_present(&platform_bus_type))
120 120 drm_gem_put_pages(obj, msm_obj->pages, true, false);
121   - else
  121 + else {
122 122 drm_mm_remove_node(msm_obj->vram_node);
  123 + drm_free_large(msm_obj->pages);
  124 + }
123 125  
124 126 msm_obj->pages = NULL;
125 127 }
drivers/gpu/drm/tegra/dc.c
... ... @@ -312,7 +312,7 @@
312 312 struct drm_device *drm = crtc->dev;
313 313 struct drm_plane *plane;
314 314  
315   - list_for_each_entry(plane, &drm->mode_config.plane_list, head) {
  315 + drm_for_each_legacy_plane(plane, &drm->mode_config.plane_list) {
316 316 if (plane->crtc == crtc) {
317 317 tegra_plane_disable(plane);
318 318 plane->crtc = NULL;
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
... ... @@ -1214,13 +1214,35 @@
1214 1214 SVGA3dCmdSurfaceDMA dma;
1215 1215 } *cmd;
1216 1216 int ret;
  1217 + SVGA3dCmdSurfaceDMASuffix *suffix;
  1218 + uint32_t bo_size;
1217 1219  
1218 1220 cmd = container_of(header, struct vmw_dma_cmd, header);
  1221 + suffix = (SVGA3dCmdSurfaceDMASuffix *)((unsigned long) &cmd->dma +
  1222 + header->size - sizeof(*suffix));
  1223 +
  1224 + /* Make sure device and verifier stays in sync. */
  1225 + if (unlikely(suffix->suffixSize != sizeof(*suffix))) {
  1226 + DRM_ERROR("Invalid DMA suffix size.\n");
  1227 + return -EINVAL;
  1228 + }
  1229 +
1219 1230 ret = vmw_translate_guest_ptr(dev_priv, sw_context,
1220 1231 &cmd->dma.guest.ptr,
1221 1232 &vmw_bo);
1222 1233 if (unlikely(ret != 0))
1223 1234 return ret;
  1235 +
  1236 + /* Make sure DMA doesn't cross BO boundaries. */
  1237 + bo_size = vmw_bo->base.num_pages * PAGE_SIZE;
  1238 + if (unlikely(cmd->dma.guest.ptr.offset > bo_size)) {
  1239 + DRM_ERROR("Invalid DMA offset.\n");
  1240 + return -EINVAL;
  1241 + }
  1242 +
  1243 + bo_size -= cmd->dma.guest.ptr.offset;
  1244 + if (unlikely(suffix->maximumOffset > bo_size))
  1245 + suffix->maximumOffset = bo_size;
1224 1246  
1225 1247 ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
1226 1248 user_surface_converter, &cmd->dma.host.sid,