diff options
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 1687b72def52..613bf8a5d9b2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #include "drmP.h" | 26 | #include "drmP.h" |
| 27 | #include "drm.h" | 27 | #include "drm.h" |
| 28 | #include "exynos_drm.h" | ||
| 28 | #include "exynos_drm_drv.h" | 29 | #include "exynos_drm_drv.h" |
| 29 | #include "exynos_drm_gem.h" | 30 | #include "exynos_drm_gem.h" |
| 30 | 31 | ||
| @@ -190,7 +191,7 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | |||
| 190 | struct exynos_drm_gem_obj *exynos_gem_obj; | 191 | struct exynos_drm_gem_obj *exynos_gem_obj; |
| 191 | struct exynos_drm_gem_buf *buffer; | 192 | struct exynos_drm_gem_buf *buffer; |
| 192 | struct page *page; | 193 | struct page *page; |
| 193 | int ret, i = 0; | 194 | int ret; |
| 194 | 195 | ||
| 195 | DRM_DEBUG_PRIME("%s\n", __FILE__); | 196 | DRM_DEBUG_PRIME("%s\n", __FILE__); |
| 196 | 197 | ||
| @@ -240,13 +241,25 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | |||
| 240 | } | 241 | } |
| 241 | 242 | ||
| 242 | sgl = sgt->sgl; | 243 | sgl = sgt->sgl; |
| 243 | buffer->dma_addr = sg_dma_address(sgl); | ||
| 244 | 244 | ||
| 245 | while (i < sgt->nents) { | 245 | if (sgt->nents == 1) { |
| 246 | buffer->pages[i] = sg_page(sgl); | 246 | buffer->dma_addr = sg_dma_address(sgt->sgl); |
| 247 | buffer->size += sg_dma_len(sgl); | 247 | buffer->size = sg_dma_len(sgt->sgl); |
| 248 | sgl = sg_next(sgl); | 248 | |
| 249 | i++; | 249 | /* always physically continuous memory if sgt->nents is 1. */ |
| 250 | exynos_gem_obj->flags |= EXYNOS_BO_CONTIG; | ||
| 251 | } else { | ||
| 252 | unsigned int i = 0; | ||
| 253 | |||
| 254 | buffer->dma_addr = sg_dma_address(sgl); | ||
| 255 | while (i < sgt->nents) { | ||
| 256 | buffer->pages[i] = sg_page(sgl); | ||
| 257 | buffer->size += sg_dma_len(sgl); | ||
| 258 | sgl = sg_next(sgl); | ||
| 259 | i++; | ||
| 260 | } | ||
| 261 | |||
| 262 | exynos_gem_obj->flags |= EXYNOS_BO_NONCONTIG; | ||
| 250 | } | 263 | } |
| 251 | 264 | ||
| 252 | exynos_gem_obj->buffer = buffer; | 265 | exynos_gem_obj->buffer = buffer; |
