video/rockchip: rga2: Use dma_sync_single_for_device to flush cache

Signed-off-by: Li Huang <putin.li@rock-chips.com>
Change-Id: I551ce3bc8b8440d9a8681981a19b61bb541be30c
This commit is contained in:
Li Huang
2020-07-14 17:32:46 +08:00
parent 5344750cd6
commit 08e925b5a4
4 changed files with 27 additions and 56 deletions

View File

@@ -2,9 +2,31 @@
#ifndef __RGA_API_H__
#define __RGA_API_H__
#include <linux/miscdevice.h>
#include <linux/wakelock.h>
#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

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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);