mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user