From 08e925b5a498e483425bfb559111eb3f9904022e Mon Sep 17 00:00:00 2001 From: Li Huang Date: Tue, 14 Jul 2020 17:32:46 +0800 Subject: [PATCH] video/rockchip: rga2: Use dma_sync_single_for_device to flush cache Signed-off-by: Li Huang Change-Id: I551ce3bc8b8440d9a8681981a19b61bb541be30c --- drivers/video/rockchip/rga2/RGA2_API.h | 22 ++++++++++++ drivers/video/rockchip/rga2/rga2_drv.c | 19 ---------- drivers/video/rockchip/rga2/rga2_mmu_info.c | 40 ++------------------- drivers/video/rockchip/rga2/rga2_mmu_info.h | 2 ++ 4 files changed, 27 insertions(+), 56 deletions(-) diff --git a/drivers/video/rockchip/rga2/RGA2_API.h b/drivers/video/rockchip/rga2/RGA2_API.h index e180b40ac457..e6c4e6247fed 100644 --- a/drivers/video/rockchip/rga2/RGA2_API.h +++ b/drivers/video/rockchip/rga2/RGA2_API.h @@ -2,9 +2,31 @@ #ifndef __RGA_API_H__ #define __RGA_API_H__ +#include +#include + #include "rga2_reg_info.h" #include "rga2.h" +struct rga2_drvdata_t { + struct miscdevice miscdev; + struct device *dev; + void *rga_base; + int irq; + + struct delayed_work power_off_work; + struct wake_lock wake_lock; + void (*rga_irq_callback)(int rga_retval); + + struct clk *aclk_rga2; + struct clk *hclk_rga2; + struct clk *pd_rga2; + struct clk *clk_rga2; + + struct ion_client *ion_client; + char version[16]; +}; + #define ENABLE 1 #define DISABLE 0 diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c index a821ec04f48b..da089b33276e 100644 --- a/drivers/video/rockchip/rga2/rga2_drv.c +++ b/drivers/video/rockchip/rga2/rga2_drv.c @@ -87,25 +87,6 @@ int RGA2_INT_FLAG; rga2_session rga2_session_global; long (*rga2_ioctl_kernel_p)(struct rga_req *); -struct rga2_drvdata_t { - struct miscdevice miscdev; - struct device *dev; - void *rga_base; - int irq; - - struct delayed_work power_off_work; - struct wake_lock wake_lock; - void (*rga_irq_callback)(int rga_retval); - - struct clk *aclk_rga2; - struct clk *hclk_rga2; - struct clk *pd_rga2; - struct clk *clk_rga2; - - struct ion_client * ion_client; - char version[16]; -}; - struct rga2_drvdata_t *rga2_drvdata; struct rga2_service_info rga2_service; struct rga2_mmu_buf_t rga2_mmu_buf; diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c index 376cf291d225..85fdf7ba4140 100644 --- a/drivers/video/rockchip/rga2/rga2_mmu_info.c +++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c @@ -40,51 +40,16 @@ extern struct rga2_mmu_buf_t rga2_mmu_buf; void rga2_dma_flush_range(void *pstart, void *pend) { -#ifdef CONFIG_ARM - dmac_flush_range(pstart, pend); - outer_flush_range(virt_to_phys(pstart), virt_to_phys(pend)); -#elif defined(CONFIG_ARM64) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) - __dma_flush_area(pstart, pend - pstart); -#else - __dma_flush_range(pstart, pend); -#endif -#endif + dma_sync_single_for_device(rga2_drvdata->dev, virt_to_phys(pstart), pend - pstart, DMA_TO_DEVICE); } static void rga2_dma_flush_page(struct page *page) { phys_addr_t paddr; - void *virt; paddr = page_to_phys(page); -#ifdef CONFIG_ARM - if (PageHighMem(page)) { -#ifdef CONFIG_HIGHMEM - if (cache_is_vipt_nonaliasing()) { - virt = kmap_atomic(page); - dmac_flush_range(virt, virt + PAGE_SIZE); - kunmap_atomic(virt); - } else { - virt = kmap_high_get(page); - dmac_flush_range(virt, virt + PAGE_SIZE); - kunmap_high(page); - } -#endif - } else { - virt = page_address(page); - dmac_flush_range(virt, virt + PAGE_SIZE); - } - outer_flush_range(paddr, paddr + PAGE_SIZE); -#elif defined(CONFIG_ARM64) - virt = page_address(page); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) - __dma_flush_area(virt, PAGE_SIZE); -#else - __dma_flush_range(virt, virt + PAGE_SIZE); -#endif -#endif + dma_sync_single_for_device(rga2_drvdata->dev, paddr, PAGE_SIZE, DMA_TO_DEVICE); } #if 0 @@ -620,6 +585,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req) (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1)); MMU_Base_phys = rga2_mmu_buf.buf + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1)); + mutex_unlock(&rga2_service.lock); if (Src0MemSize) { if (req->sg_src0) { diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.h b/drivers/video/rockchip/rga2/rga2_mmu_info.h index fd856df2d0ad..644b10444bb2 100644 --- a/drivers/video/rockchip/rga2/rga2_mmu_info.h +++ b/drivers/video/rockchip/rga2/rga2_mmu_info.h @@ -3,6 +3,7 @@ #define __RGA_MMU_INFO_H__ #include "rga2.h" +#include "RGA2_API.h" #ifndef MIN #define MIN(X, Y) ((X)<(Y)?(X):(Y)) @@ -12,6 +13,7 @@ #define MAX(X, Y) ((X)>(Y)?(X):(Y)) #endif +extern struct rga2_drvdata_t *rga2_drvdata; int rga2_set_mmu_info(struct rga2_reg *reg, struct rga2_req *req); void rga2_dma_flush_range(void *pstart, void *pend);