drm/msm: honor GPU_READONLY flag
Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
@@ -250,7 +250,8 @@ void msm_gem_purge_vma(struct msm_gem_address_space *aspace,
|
|||||||
void msm_gem_unmap_vma(struct msm_gem_address_space *aspace,
|
void msm_gem_unmap_vma(struct msm_gem_address_space *aspace,
|
||||||
struct msm_gem_vma *vma);
|
struct msm_gem_vma *vma);
|
||||||
int msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
int msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
||||||
struct msm_gem_vma *vma, struct sg_table *sgt, int npages);
|
struct msm_gem_vma *vma, int prot,
|
||||||
|
struct sg_table *sgt, int npages);
|
||||||
void msm_gem_close_vma(struct msm_gem_address_space *aspace,
|
void msm_gem_close_vma(struct msm_gem_address_space *aspace,
|
||||||
struct msm_gem_vma *vma);
|
struct msm_gem_vma *vma);
|
||||||
|
|
||||||
|
|||||||
@@ -391,6 +391,10 @@ static int msm_gem_pin_iova(struct drm_gem_object *obj,
|
|||||||
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
||||||
struct msm_gem_vma *vma;
|
struct msm_gem_vma *vma;
|
||||||
struct page **pages;
|
struct page **pages;
|
||||||
|
int prot = IOMMU_READ;
|
||||||
|
|
||||||
|
if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
|
||||||
|
prot |= IOMMU_WRITE;
|
||||||
|
|
||||||
WARN_ON(!mutex_is_locked(&msm_obj->lock));
|
WARN_ON(!mutex_is_locked(&msm_obj->lock));
|
||||||
|
|
||||||
@@ -405,8 +409,8 @@ static int msm_gem_pin_iova(struct drm_gem_object *obj,
|
|||||||
if (IS_ERR(pages))
|
if (IS_ERR(pages))
|
||||||
return PTR_ERR(pages);
|
return PTR_ERR(pages);
|
||||||
|
|
||||||
return msm_gem_map_vma(aspace, vma, msm_obj->sgt,
|
return msm_gem_map_vma(aspace, vma, prot,
|
||||||
obj->size >> PAGE_SHIFT);
|
msm_obj->sgt, obj->size >> PAGE_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get iova and pin it. Should have a matching put */
|
/* get iova and pin it. Should have a matching put */
|
||||||
|
|||||||
@@ -68,7 +68,8 @@ void msm_gem_unmap_vma(struct msm_gem_address_space *aspace,
|
|||||||
|
|
||||||
int
|
int
|
||||||
msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
||||||
struct msm_gem_vma *vma, struct sg_table *sgt, int npages)
|
struct msm_gem_vma *vma, int prot,
|
||||||
|
struct sg_table *sgt, int npages)
|
||||||
{
|
{
|
||||||
unsigned size = npages << PAGE_SHIFT;
|
unsigned size = npages << PAGE_SHIFT;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -86,7 +87,7 @@ msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
|||||||
|
|
||||||
if (aspace->mmu)
|
if (aspace->mmu)
|
||||||
ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt,
|
ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt,
|
||||||
size, IOMMU_READ | IOMMU_WRITE);
|
size, prot);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
vma->mapped = false;
|
vma->mapped = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user