From 2d09e1f8e088e508398dbf0754b859c19e91efad Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Thu, 22 Apr 2021 18:08:25 +0800 Subject: [PATCH] video: rockchip: mpp: Encapsulate the rw lock of IOMMU as functions Change-Id: I5e176bbcdc33bacafeaa8c3b80b5f8337d13bb9a Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_common.c | 24 +++++++++---------- drivers/video/rockchip/mpp/mpp_iommu.h | 32 +++++++++++++++++++++++++ drivers/video/rockchip/mpp/mpp_rkvenc.c | 4 ++-- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 32712a5c07ab..6bb67c45291c 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -462,7 +462,7 @@ int mpp_dev_reset(struct mpp_dev *mpp) if (mpp->hw_ops->reduce_freq) mpp->hw_ops->reduce_freq(mpp); /* FIXME lock resource lock of the other devices in combo */ - down_write(&mpp->iommu_info->rw_sem); + mpp_iommu_down_write(mpp->iommu_info); mpp_reset_down_write(mpp->reset_group); atomic_set(&mpp->reset_request, 0); mpp_iommu_detach(mpp->iommu_info); @@ -480,7 +480,7 @@ int mpp_dev_reset(struct mpp_dev *mpp) mpp_iommu_attach(mpp->iommu_info); mpp_reset_up_write(mpp->reset_group); - up_write(&mpp->iommu_info->rw_sem); + mpp_iommu_up_write(mpp->iommu_info); dev_info(mpp->dev, "reset done\n"); @@ -1029,9 +1029,9 @@ static int mpp_process_request(struct mpp_session *session, return -EINVAL; mpp_session_clear(mpp, session); - down_write(&mpp->iommu_info->rw_sem); + mpp_iommu_down_write(mpp->iommu_info); ret = mpp_dma_session_destroy(session->dma); - up_write(&mpp->iommu_info->rw_sem); + mpp_iommu_up_write(mpp->iommu_info); } return ret; } break; @@ -1058,10 +1058,10 @@ static int mpp_process_request(struct mpp_session *session, struct mpp_dma_buffer *buffer; int fd = data[i]; - down_read(&mpp->iommu_info->rw_sem); + mpp_iommu_down_read(mpp->iommu_info); buffer = mpp_dma_import_fd(mpp->iommu_info, session->dma, fd); - up_read(&mpp->iommu_info->rw_sem); + mpp_iommu_up_read(mpp->iommu_info); if (IS_ERR_OR_NULL(buffer)) { mpp_err("can not import fd %d\n", fd); return -EINVAL; @@ -1268,9 +1268,9 @@ static int mpp_dev_release(struct inode *inode, struct file *filp) /* remove this filp from the asynchronusly notified filp's */ mpp_session_clear(mpp, session); - down_read(&mpp->iommu_info->rw_sem); + mpp_iommu_down_read(mpp->iommu_info); mpp_dma_session_destroy(session->dma); - up_read(&mpp->iommu_info->rw_sem); + mpp_iommu_up_read(mpp->iommu_info); } mutex_lock(&session->srv->session_lock); list_del_init(&session->session_link); @@ -1322,9 +1322,9 @@ mpp_task_attach_fd(struct mpp_task *task, int fd) if (!mem_region) return ERR_PTR(-ENOMEM); - down_read(&mpp->iommu_info->rw_sem); + mpp_iommu_down_read(mpp->iommu_info); buffer = mpp_dma_import_fd(mpp->iommu_info, dma, fd); - up_read(&mpp->iommu_info->rw_sem); + mpp_iommu_up_read(mpp->iommu_info); if (IS_ERR_OR_NULL(buffer)) { mpp_err("can't import dma-buf %d\n", fd); goto fail; @@ -1543,9 +1543,9 @@ int mpp_task_finalize(struct mpp_session *session, list_for_each_entry_safe(mem_region, n, &task->mem_region_list, reg_link) { - down_read(&mpp->iommu_info->rw_sem); + mpp_iommu_down_read(mpp->iommu_info); mpp_dma_release(session->dma, mem_region->hdl); - up_read(&mpp->iommu_info->rw_sem); + mpp_iommu_up_read(mpp->iommu_info); list_del_init(&mem_region->reg_link); kfree(mem_region); } diff --git a/drivers/video/rockchip/mpp/mpp_iommu.h b/drivers/video/rockchip/mpp/mpp_iommu.h index 0b111287f3b4..a2de8abb0a4b 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.h +++ b/drivers/video/rockchip/mpp/mpp_iommu.h @@ -109,4 +109,36 @@ int mpp_iommu_disable(struct mpp_rk_iommu *iommu); int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev); int mpp_iommu_flush_tlb(struct mpp_iommu_info *info); +static inline int mpp_iommu_down_read(struct mpp_iommu_info *info) +{ + if (info) + down_read(&info->rw_sem); + + return 0; +} + +static inline int mpp_iommu_up_read(struct mpp_iommu_info *info) +{ + if (info) + up_read(&info->rw_sem); + + return 0; +} + +static inline int mpp_iommu_down_write(struct mpp_iommu_info *info) +{ + if (info) + down_write(&info->rw_sem); + + return 0; +} + +static inline int mpp_iommu_up_write(struct mpp_iommu_info *info) +{ + if (info) + up_write(&info->rw_sem); + + return 0; +} + #endif diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 4d9a2f695d97..0a6cda29ddad 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -1112,7 +1112,7 @@ static void rkvenc_iommu_handle_work(struct work_struct *work_s) mpp_debug_enter(); /* avoid another page fault occur after page fault */ - down_write(&mpp->iommu_info->rw_sem); + mpp_iommu_down_write(mpp->iommu_info); if (enc->aux_iova != -1) { iommu_unmap(mpp->iommu_info->domain, enc->aux_iova, IOMMU_PAGE_SIZE); @@ -1129,7 +1129,7 @@ static void rkvenc_iommu_handle_work(struct work_struct *work_s) enc->aux_iova = page_iova; rk_iommu_unmask_irq(mpp->dev); - up_write(&mpp->iommu_info->rw_sem); + mpp_iommu_up_write(mpp->iommu_info); mpp_debug_leave(); }