Skip to content

Commit d6f20ff

Browse files
Yu Qiaoweirkhuangtao
authored andcommitted
video/rockchip: rga2: invalidate dst page.
When dst needs to write data to the virtual address, it needs to make the dst page invlaid after rga runs. Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: I7abf580fbca302dba043bb0f84d32cb0369e4e48
1 parent ae13119 commit d6f20ff

4 files changed

Lines changed: 26 additions & 1 deletion

File tree

drivers/video/rockchip/rga2/rga2.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ struct rga2_reg {
682682

683683
uint32_t *MMU_base;
684684
uint32_t MMU_len;
685+
uint32_t MMU_count;
685686
bool MMU_map;
686687

687688
struct sg_table *sg_src0;

drivers/video/rockchip/rga2/rga2_drv.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,13 +2028,30 @@ static int rga2_release(struct inode *inode, struct file *file)
20282028
return 0;
20292029
}
20302030

2031+
static void RGA2_flush_page(void)
2032+
{
2033+
struct rga2_reg *reg;
2034+
int i;
2035+
2036+
reg = list_entry(rga2_service.running.prev,
2037+
struct rga2_reg, status_link);
2038+
2039+
if (reg == NULL && reg->MMU_base == NULL)
2040+
return;
2041+
2042+
for (i = 0; i < reg->MMU_count; i++)
2043+
rga2_dma_flush_page(phys_to_page(reg->MMU_base[i]),
2044+
MMU_UNMAP_INVALID);
2045+
}
2046+
20312047
static irqreturn_t rga2_irq_thread(int irq, void *dev_id)
20322048
{
20332049
#if RGA2_DEBUGFS
20342050
if (RGA2_INT_FLAG)
20352051
INFO("irqthread INT[%x],STATS[%x]\n", rga2_read(RGA2_INT),
20362052
rga2_read(RGA2_STATUS));
20372053
#endif
2054+
RGA2_flush_page();
20382055
mutex_lock(&rga2_service.lock);
20392056
if (rga2_service.enable) {
20402057
rga2_del_running_list();

drivers/video/rockchip/rga2/rga2_mmu_info.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void rga2_dma_flush_range(void *pstart, void *pend)
4343
dma_sync_single_for_device(rga2_drvdata->dev, virt_to_phys(pstart), pend - pstart, DMA_TO_DEVICE);
4444
}
4545

46-
static void rga2_dma_flush_page(struct page *page, int map)
46+
void rga2_dma_flush_page(struct page *page, int map)
4747
{
4848
dma_addr_t paddr;
4949

@@ -766,6 +766,9 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
766766
req->src.format,
767767
2);
768768
#endif
769+
/* Save the physical address of dst to invalid cache */
770+
reg->MMU_base = (MMU_Base + Src0MemSize + Src1MemSize);
771+
reg->MMU_count = DstPageCount;
769772
} else {
770773
ret = rga2_MapUserMemory(&pages[0], MMU_Base
771774
+ Src0MemSize + Src1MemSize,
@@ -777,6 +780,9 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
777780
req->src.vir_h, req->src.format,
778781
2);
779782
#endif
783+
/* Save the physical address of dst to invalid cache */
784+
reg->MMU_base = (MMU_Base + Src0MemSize + Src1MemSize);
785+
reg->MMU_count = DstPageCount;
780786
}
781787
if (ret < 0) {
782788
pr_err("rga2 map dst memory failed\n");

drivers/video/rockchip/rga2/rga2_mmu_info.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ enum {
2626

2727
int rga2_set_mmu_info(struct rga2_reg *reg, struct rga2_req *req);
2828
void rga2_dma_flush_range(void *pstart, void *pend);
29+
void rga2_dma_flush_page(struct page *page, int map);
2930

3031
#endif
3132

0 commit comments

Comments
 (0)