Commit ed8c37e158cb697df905d6b4933bc107c69e8936
Exists in
master
and in
13 other branches
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
- MAINTAINERS
- drivers/gpu/drm/exynos/exynos_drm_crtc.c
- drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
- drivers/gpu/drm/exynos/exynos_drm_dsi.c
- drivers/gpu/drm/exynos/exynos_drm_vidi.c
- drivers/gpu/drm/i915/i915_gem_gtt.c
- drivers/gpu/drm/i915/i915_irq.c
- drivers/gpu/drm/i915/i915_reg.h
- drivers/gpu/drm/i915/intel_display.c
- drivers/gpu/drm/i915/intel_dp.c
- drivers/gpu/drm/i915/intel_drv.h
- drivers/gpu/drm/i915/intel_fbdev.c
- drivers/gpu/drm/i915/intel_hdmi.c
- drivers/gpu/drm/i915/intel_ringbuffer.c
- drivers/gpu/drm/i915/intel_ringbuffer.h
- drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
- drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c
- drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
- drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h
- drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c
- drivers/gpu/drm/msm/msm_fbdev.c
- drivers/gpu/drm/msm/msm_gem.c
- drivers/gpu/drm/tegra/dc.c
- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
MAINTAINERS
... | ... | @@ -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
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
drivers/gpu/drm/i915/i915_gem_gtt.c
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
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, |