diff options
| author | Dave Airlie <airlied@redhat.com> | 2015-07-10 01:59:35 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2015-07-10 01:59:35 -0400 |
| commit | 2d28b633c3fa8f53b919a5de86eb1c8e78dde818 (patch) | |
| tree | 791cc8b3a7c6ba0a55c2c2f2caf61e563ef7b5d8 /drivers/gpu/drm | |
| parent | 59e7a16d60ffead64d1407bf8915b8b2078ba870 (diff) | |
| parent | 743c16719f671c206923d23dae4ac57edfd9483c (diff) | |
Merge tag 'omapdrm-4.2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux into drm-fixes
omapdrm fixes for 4.2
Small fixes for omapdrm, including:
* Fix packed 24 bit color formats
* Ensure the planes are inside the crtc
* Handle out-of-dma-memory error
* tag 'omapdrm-4.2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux:
drm/omap: replace ALIGN(PAGE_SIZE) by PAGE_ALIGN
drm/omap: fix align_pitch() for 24 bits per pixel
drm/omap: fix omap_gem_put_paddr() error handling
drm/omap: fix omap_framebuffer_unpin() error handling
drm/omap: increase DMM transaction timeout
drm/omap: check that plane is inside crtc
drm/omap: return error if dma_alloc_writecombine fails
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fbdev.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem.c | 26 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_plane.c | 26 |
6 files changed, 49 insertions, 29 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c index f2daad8c3d96..7841970de48d 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | |||
| @@ -285,7 +285,7 @@ static int dmm_txn_commit(struct dmm_txn *txn, bool wait) | |||
| 285 | 285 | ||
| 286 | if (wait) { | 286 | if (wait) { |
| 287 | if (!wait_for_completion_timeout(&engine->compl, | 287 | if (!wait_for_completion_timeout(&engine->compl, |
| 288 | msecs_to_jiffies(1))) { | 288 | msecs_to_jiffies(100))) { |
| 289 | dev_err(dmm->dev, "timed out waiting for done\n"); | 289 | dev_err(dmm->dev, "timed out waiting for done\n"); |
| 290 | ret = -ETIMEDOUT; | 290 | ret = -ETIMEDOUT; |
| 291 | } | 291 | } |
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index ae2df41f216f..12081e61d45a 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h | |||
| @@ -177,7 +177,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, | |||
| 177 | struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); | 177 | struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); |
| 178 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); | 178 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); |
| 179 | int omap_framebuffer_pin(struct drm_framebuffer *fb); | 179 | int omap_framebuffer_pin(struct drm_framebuffer *fb); |
| 180 | int omap_framebuffer_unpin(struct drm_framebuffer *fb); | 180 | void omap_framebuffer_unpin(struct drm_framebuffer *fb); |
| 181 | void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, | 181 | void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, |
| 182 | struct omap_drm_window *win, struct omap_overlay_info *info); | 182 | struct omap_drm_window *win, struct omap_overlay_info *info); |
| 183 | struct drm_connector *omap_framebuffer_get_next_connector( | 183 | struct drm_connector *omap_framebuffer_get_next_connector( |
| @@ -211,7 +211,7 @@ void omap_gem_dma_sync(struct drm_gem_object *obj, | |||
| 211 | enum dma_data_direction dir); | 211 | enum dma_data_direction dir); |
| 212 | int omap_gem_get_paddr(struct drm_gem_object *obj, | 212 | int omap_gem_get_paddr(struct drm_gem_object *obj, |
| 213 | dma_addr_t *paddr, bool remap); | 213 | dma_addr_t *paddr, bool remap); |
| 214 | int omap_gem_put_paddr(struct drm_gem_object *obj); | 214 | void omap_gem_put_paddr(struct drm_gem_object *obj); |
| 215 | int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, | 215 | int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, |
| 216 | bool remap); | 216 | bool remap); |
| 217 | int omap_gem_put_pages(struct drm_gem_object *obj); | 217 | int omap_gem_put_pages(struct drm_gem_object *obj); |
| @@ -236,7 +236,7 @@ static inline int align_pitch(int pitch, int width, int bpp) | |||
| 236 | /* PVR needs alignment to 8 pixels.. right now that is the most | 236 | /* PVR needs alignment to 8 pixels.. right now that is the most |
| 237 | * restrictive stride requirement.. | 237 | * restrictive stride requirement.. |
| 238 | */ | 238 | */ |
| 239 | return ALIGN(pitch, 8 * bytespp); | 239 | return roundup(pitch, 8 * bytespp); |
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | /* map crtc to vblank mask */ | 242 | /* map crtc to vblank mask */ |
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index 0b967e76df1a..51b1219af87f 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c | |||
| @@ -287,10 +287,10 @@ fail: | |||
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | /* unpin, no longer being scanned out: */ | 289 | /* unpin, no longer being scanned out: */ |
| 290 | int omap_framebuffer_unpin(struct drm_framebuffer *fb) | 290 | void omap_framebuffer_unpin(struct drm_framebuffer *fb) |
| 291 | { | 291 | { |
| 292 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); | 292 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); |
| 293 | int ret, i, n = drm_format_num_planes(fb->pixel_format); | 293 | int i, n = drm_format_num_planes(fb->pixel_format); |
| 294 | 294 | ||
| 295 | mutex_lock(&omap_fb->lock); | 295 | mutex_lock(&omap_fb->lock); |
| 296 | 296 | ||
| @@ -298,24 +298,16 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
| 298 | 298 | ||
| 299 | if (omap_fb->pin_count > 0) { | 299 | if (omap_fb->pin_count > 0) { |
| 300 | mutex_unlock(&omap_fb->lock); | 300 | mutex_unlock(&omap_fb->lock); |
| 301 | return 0; | 301 | return; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | for (i = 0; i < n; i++) { | 304 | for (i = 0; i < n; i++) { |
| 305 | struct plane *plane = &omap_fb->planes[i]; | 305 | struct plane *plane = &omap_fb->planes[i]; |
| 306 | ret = omap_gem_put_paddr(plane->bo); | 306 | omap_gem_put_paddr(plane->bo); |
| 307 | if (ret) | ||
| 308 | goto fail; | ||
| 309 | plane->paddr = 0; | 307 | plane->paddr = 0; |
| 310 | } | 308 | } |
| 311 | 309 | ||
| 312 | mutex_unlock(&omap_fb->lock); | 310 | mutex_unlock(&omap_fb->lock); |
| 313 | |||
| 314 | return 0; | ||
| 315 | |||
| 316 | fail: | ||
| 317 | mutex_unlock(&omap_fb->lock); | ||
| 318 | return ret; | ||
| 319 | } | 311 | } |
| 320 | 312 | ||
| 321 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) | 313 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) |
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c index 23b5a84389e3..720d16bce7e8 100644 --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c | |||
| @@ -135,7 +135,7 @@ static int omap_fbdev_create(struct drm_fb_helper *helper, | |||
| 135 | fbdev->ywrap_enabled = priv->has_dmm && ywrap_enabled; | 135 | fbdev->ywrap_enabled = priv->has_dmm && ywrap_enabled; |
| 136 | if (fbdev->ywrap_enabled) { | 136 | if (fbdev->ywrap_enabled) { |
| 137 | /* need to align pitch to page size if using DMM scrolling */ | 137 | /* need to align pitch to page size if using DMM scrolling */ |
| 138 | mode_cmd.pitches[0] = ALIGN(mode_cmd.pitches[0], PAGE_SIZE); | 138 | mode_cmd.pitches[0] = PAGE_ALIGN(mode_cmd.pitches[0]); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | /* allocate backing bo */ | 141 | /* allocate backing bo */ |
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index 2ab77801cf5f..7ed08fdc4c42 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c | |||
| @@ -808,10 +808,10 @@ fail: | |||
| 808 | /* Release physical address, when DMA is no longer being performed.. this | 808 | /* Release physical address, when DMA is no longer being performed.. this |
| 809 | * could potentially unpin and unmap buffers from TILER | 809 | * could potentially unpin and unmap buffers from TILER |
| 810 | */ | 810 | */ |
| 811 | int omap_gem_put_paddr(struct drm_gem_object *obj) | 811 | void omap_gem_put_paddr(struct drm_gem_object *obj) |
| 812 | { | 812 | { |
| 813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
| 814 | int ret = 0; | 814 | int ret; |
| 815 | 815 | ||
| 816 | mutex_lock(&obj->dev->struct_mutex); | 816 | mutex_lock(&obj->dev->struct_mutex); |
| 817 | if (omap_obj->paddr_cnt > 0) { | 817 | if (omap_obj->paddr_cnt > 0) { |
| @@ -821,7 +821,6 @@ int omap_gem_put_paddr(struct drm_gem_object *obj) | |||
| 821 | if (ret) { | 821 | if (ret) { |
| 822 | dev_err(obj->dev->dev, | 822 | dev_err(obj->dev->dev, |
| 823 | "could not unpin pages: %d\n", ret); | 823 | "could not unpin pages: %d\n", ret); |
| 824 | goto fail; | ||
| 825 | } | 824 | } |
| 826 | ret = tiler_release(omap_obj->block); | 825 | ret = tiler_release(omap_obj->block); |
| 827 | if (ret) { | 826 | if (ret) { |
| @@ -832,9 +831,8 @@ int omap_gem_put_paddr(struct drm_gem_object *obj) | |||
| 832 | omap_obj->block = NULL; | 831 | omap_obj->block = NULL; |
| 833 | } | 832 | } |
| 834 | } | 833 | } |
| 835 | fail: | 834 | |
| 836 | mutex_unlock(&obj->dev->struct_mutex); | 835 | mutex_unlock(&obj->dev->struct_mutex); |
| 837 | return ret; | ||
| 838 | } | 836 | } |
| 839 | 837 | ||
| 840 | /* Get rotated scanout address (only valid if already pinned), at the | 838 | /* Get rotated scanout address (only valid if already pinned), at the |
| @@ -1378,11 +1376,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
| 1378 | 1376 | ||
| 1379 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); | 1377 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); |
| 1380 | if (!omap_obj) | 1378 | if (!omap_obj) |
| 1381 | goto fail; | 1379 | return NULL; |
| 1382 | |||
| 1383 | spin_lock(&priv->list_lock); | ||
| 1384 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
| 1385 | spin_unlock(&priv->list_lock); | ||
| 1386 | 1380 | ||
| 1387 | obj = &omap_obj->base; | 1381 | obj = &omap_obj->base; |
| 1388 | 1382 | ||
| @@ -1392,11 +1386,19 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
| 1392 | */ | 1386 | */ |
| 1393 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, | 1387 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, |
| 1394 | &omap_obj->paddr, GFP_KERNEL); | 1388 | &omap_obj->paddr, GFP_KERNEL); |
| 1395 | if (omap_obj->vaddr) | 1389 | if (!omap_obj->vaddr) { |
| 1396 | flags |= OMAP_BO_DMA; | 1390 | kfree(omap_obj); |
| 1391 | |||
| 1392 | return NULL; | ||
| 1393 | } | ||
| 1397 | 1394 | ||
| 1395 | flags |= OMAP_BO_DMA; | ||
| 1398 | } | 1396 | } |
| 1399 | 1397 | ||
| 1398 | spin_lock(&priv->list_lock); | ||
| 1399 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
| 1400 | spin_unlock(&priv->list_lock); | ||
| 1401 | |||
| 1400 | omap_obj->flags = flags; | 1402 | omap_obj->flags = flags; |
| 1401 | 1403 | ||
| 1402 | if (flags & OMAP_BO_TILED) { | 1404 | if (flags & OMAP_BO_TILED) { |
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c index cfa8276c4deb..098904696a5c 100644 --- a/drivers/gpu/drm/omapdrm/omap_plane.c +++ b/drivers/gpu/drm/omapdrm/omap_plane.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | * this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * this program. If not, see <http://www.gnu.org/licenses/>. |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <drm/drm_atomic.h> | ||
| 20 | #include <drm/drm_atomic_helper.h> | 21 | #include <drm/drm_atomic_helper.h> |
| 21 | #include <drm/drm_plane_helper.h> | 22 | #include <drm/drm_plane_helper.h> |
| 22 | 23 | ||
| @@ -153,9 +154,34 @@ static void omap_plane_atomic_disable(struct drm_plane *plane, | |||
| 153 | dispc_ovl_enable(omap_plane->id, false); | 154 | dispc_ovl_enable(omap_plane->id, false); |
| 154 | } | 155 | } |
| 155 | 156 | ||
| 157 | static int omap_plane_atomic_check(struct drm_plane *plane, | ||
| 158 | struct drm_plane_state *state) | ||
| 159 | { | ||
| 160 | struct drm_crtc_state *crtc_state; | ||
| 161 | |||
| 162 | if (!state->crtc) | ||
| 163 | return 0; | ||
| 164 | |||
| 165 | crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc); | ||
| 166 | if (IS_ERR(crtc_state)) | ||
| 167 | return PTR_ERR(crtc_state); | ||
| 168 | |||
| 169 | if (state->crtc_x < 0 || state->crtc_y < 0) | ||
| 170 | return -EINVAL; | ||
| 171 | |||
| 172 | if (state->crtc_x + state->crtc_w > crtc_state->adjusted_mode.hdisplay) | ||
| 173 | return -EINVAL; | ||
| 174 | |||
| 175 | if (state->crtc_y + state->crtc_h > crtc_state->adjusted_mode.vdisplay) | ||
| 176 | return -EINVAL; | ||
| 177 | |||
| 178 | return 0; | ||
| 179 | } | ||
| 180 | |||
| 156 | static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { | 181 | static const struct drm_plane_helper_funcs omap_plane_helper_funcs = { |
| 157 | .prepare_fb = omap_plane_prepare_fb, | 182 | .prepare_fb = omap_plane_prepare_fb, |
| 158 | .cleanup_fb = omap_plane_cleanup_fb, | 183 | .cleanup_fb = omap_plane_cleanup_fb, |
| 184 | .atomic_check = omap_plane_atomic_check, | ||
| 159 | .atomic_update = omap_plane_atomic_update, | 185 | .atomic_update = omap_plane_atomic_update, |
| 160 | .atomic_disable = omap_plane_atomic_disable, | 186 | .atomic_disable = omap_plane_atomic_disable, |
| 161 | }; | 187 | }; |
