diff --git a/drivers/gpu/drm/tegra/uapi/gather_bo.c b/drivers/gpu/drm/tegra/uapi/gather_bo.c index 755c2da6..903fef2c 100644 --- a/drivers/gpu/drm/tegra/uapi/gather_bo.c +++ b/drivers/gpu/drm/tegra/uapi/gather_bo.c @@ -19,7 +19,8 @@ static void gather_bo_release(struct kref *ref) { struct gather_bo *bo = container_of(ref, struct gather_bo, ref); - kfree(bo->gather_data); + dma_free_attrs(bo->dev, bo->gather_data_words * 4, bo->gather_data, bo->gather_data_dma, + 0); kfree(bo); } diff --git a/drivers/gpu/drm/tegra/uapi/gather_bo.h b/drivers/gpu/drm/tegra/uapi/gather_bo.h index a9b6ec1c..8820e908 100644 --- a/drivers/gpu/drm/tegra/uapi/gather_bo.h +++ b/drivers/gpu/drm/tegra/uapi/gather_bo.h @@ -12,7 +12,9 @@ struct gather_bo { struct kref ref; + struct device *dev; u32 *gather_data; + dma_addr_t gather_data_dma; size_t gather_data_words; }; diff --git a/drivers/gpu/drm/tegra/uapi/submit.c b/drivers/gpu/drm/tegra/uapi/submit.c index 6a6fc226..0b148d36 100644 --- a/drivers/gpu/drm/tegra/uapi/submit.c +++ b/drivers/gpu/drm/tegra/uapi/submit.c @@ -82,8 +82,10 @@ static int submit_copy_gather_data(struct drm_device *drm, kref_init(&bo->ref); host1x_bo_init(&bo->base, &gather_bo_ops); + bo->dev = drm->dev; - bo->gather_data = kmalloc(copy_len, GFP_KERNEL | __GFP_NOWARN); + bo->gather_data = dma_alloc_attrs(bo->dev, copy_len, &bo->gather_data_dma, + GFP_KERNEL | __GFP_NOWARN, 0); if (!bo->gather_data) { kfree(bo); return -ENOMEM; @@ -93,6 +95,7 @@ static int submit_copy_gather_data(struct drm_device *drm, u64_to_user_ptr(args->gather_data_ptr), copy_len); if (copy_err) { + dma_free_attrs(drm->dev, copy_len, bo->gather_data, bo->gather_data_dma, 0); kfree(bo->gather_data); kfree(bo); return -EFAULT;