diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-02-26 15:34:42 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-02-26 15:34:42 -0500 |
| commit | 8e22e1b3499a446df48c2b26667ca36c55bf864c (patch) | |
| tree | 5329f98b3eb3c95a9dcbab0fa4f9b6e62f0e788d /drivers/gpu/drm/omapdrm | |
| parent | 00d3c14f14d51babd8aeafd5fa734ccf04f5ca3d (diff) | |
| parent | 64a577196d66b44e37384bc5c4d78c61f59d5b2a (diff) | |
Merge airlied/drm-next into drm-misc-next
Backmerge the main pull request to sync up with all the newly landed
drivers. Otherwise we'll have chaos even before 4.12 started in
earnest.
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dispc.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_crtc.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 17 |
3 files changed, 35 insertions, 9 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c index 5554b72cf56a..d956e6266368 100644 --- a/drivers/gpu/drm/omapdrm/dss/dispc.c +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c | |||
| @@ -2506,6 +2506,25 @@ static int dispc_ovl_calc_scaling_44xx(unsigned long pclk, unsigned long lclk, | |||
| 2506 | return -EINVAL; | 2506 | return -EINVAL; |
| 2507 | } | 2507 | } |
| 2508 | 2508 | ||
| 2509 | if (*decim_x > 4 && color_mode != OMAP_DSS_COLOR_NV12) { | ||
| 2510 | /* | ||
| 2511 | * Let's disable all scaling that requires horizontal | ||
| 2512 | * decimation with higher factor than 4, until we have | ||
| 2513 | * better estimates of what we can and can not | ||
| 2514 | * do. However, NV12 color format appears to work Ok | ||
| 2515 | * with all decimation factors. | ||
| 2516 | * | ||
| 2517 | * When decimating horizontally by more that 4 the dss | ||
| 2518 | * is not able to fetch the data in burst mode. When | ||
| 2519 | * this happens it is hard to tell if there enough | ||
| 2520 | * bandwidth. Despite what theory says this appears to | ||
| 2521 | * be true also for 16-bit color formats. | ||
| 2522 | */ | ||
| 2523 | DSSERR("Not enough bandwidth, too much downscaling (x-decimation factor %d > 4)", *decim_x); | ||
| 2524 | |||
| 2525 | return -EINVAL; | ||
| 2526 | } | ||
| 2527 | |||
| 2509 | *core_clk = dispc.feat->calc_core_clk(pclk, in_width, in_height, | 2528 | *core_clk = dispc.feat->calc_core_clk(pclk, in_width, in_height, |
| 2510 | out_width, out_height, mem_to_mem); | 2529 | out_width, out_height, mem_to_mem); |
| 2511 | return 0; | 2530 | return 0; |
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index bd18e8c4f1d0..2fe735c269fc 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c | |||
| @@ -410,13 +410,7 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc, | |||
| 410 | dispc_mgr_set_gamma(omap_crtc->channel, lut, length); | 410 | dispc_mgr_set_gamma(omap_crtc->channel, lut, length); |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | /* | 413 | /* Only flush the CRTC if it is currently enabled. */ |
| 414 | * Only flush the CRTC if it is currently enabled. CRTCs that require a | ||
| 415 | * mode set are disabled prior plane updates and enabled afterwards. | ||
| 416 | * They are thus not active (regardless of what their CRTC core state | ||
| 417 | * reports) and the DRM core could thus call this function even though | ||
| 418 | * the CRTC is currently disabled. Do nothing in that case. | ||
| 419 | */ | ||
| 420 | if (!omap_crtc->enabled) | 414 | if (!omap_crtc->enabled) |
| 421 | return; | 415 | return; |
| 422 | 416 | ||
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 586ed630d458..79a4aad35e0f 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c | |||
| @@ -96,9 +96,22 @@ static void omap_atomic_complete(struct omap_atomic_state_commit *commit) | |||
| 96 | dispc_runtime_get(); | 96 | dispc_runtime_get(); |
| 97 | 97 | ||
| 98 | drm_atomic_helper_commit_modeset_disables(dev, old_state); | 98 | drm_atomic_helper_commit_modeset_disables(dev, old_state); |
| 99 | drm_atomic_helper_commit_planes(dev, old_state, | 99 | |
| 100 | DRM_PLANE_COMMIT_ACTIVE_ONLY); | 100 | /* With the current dss dispc implementation we have to enable |
| 101 | * the new modeset before we can commit planes. The dispc ovl | ||
| 102 | * configuration relies on the video mode configuration been | ||
| 103 | * written into the HW when the ovl configuration is | ||
| 104 | * calculated. | ||
| 105 | * | ||
| 106 | * This approach is not ideal because after a mode change the | ||
| 107 | * plane update is executed only after the first vblank | ||
| 108 | * interrupt. The dispc implementation should be fixed so that | ||
| 109 | * it is able use uncommitted drm state information. | ||
| 110 | */ | ||
| 101 | drm_atomic_helper_commit_modeset_enables(dev, old_state); | 111 | drm_atomic_helper_commit_modeset_enables(dev, old_state); |
| 112 | omap_atomic_wait_for_completion(dev, old_state); | ||
| 113 | |||
| 114 | drm_atomic_helper_commit_planes(dev, old_state, 0); | ||
| 102 | 115 | ||
| 103 | omap_atomic_wait_for_completion(dev, old_state); | 116 | omap_atomic_wait_for_completion(dev, old_state); |
| 104 | 117 | ||
