#endif
}
-static void rga_dma_flush_range(void *ptr, int size)
-{
-#ifdef CONFIG_ARM
- dmac_flush_range(ptr, ptr + size);
- outer_flush_range(virt_to_phys(ptr), virt_to_phys(ptr + size));
-#elif defined CONFIG_ARM64
- __dma_flush_range(ptr, ptr + size);
-#endif
-}
-
static inline void rga_write(struct rockchip_rga *rga, u32 reg, u32 value)
{
writel(value, rga->regs + reg);
dest[reg >> 2] = mmu_ctrl;
}
- rga_dma_flush_range(cmdlist_pool_virt, cmdlist_cnt * RGA_CMDLIST_SIZE);
+ dma_sync_single_for_device(runqueue->drm_dev->dev,
+ virt_to_phys(cmdlist_pool_virt),
+ PAGE_SIZE, DMA_TO_DEVICE);
runqueue->cmdlist_dma_attrs = cmdlist_dma_attrs;
runqueue->cmdlist_pool_virt = cmdlist_pool_virt;
switch (reg) {
case RGA_BUF_TYPE_GEMFD | RGA_DST_Y_RGB_BASE_ADDR:
case RGA_BUF_TYPE_GEMFD | RGA_SRC_Y_RGB_BASE_ADDR:
+ case RGA_BUF_TYPE_GEMFD | RGA_SRC1_RGB_BASE_ADDR:
break;
case RGA_BUF_TYPE_USERPTR | RGA_DST_Y_RGB_BASE_ADDR:
case RGA_BUF_TYPE_USERPTR | RGA_SRC_Y_RGB_BASE_ADDR:
+ case RGA_BUF_TYPE_USERPTR | RGA_SRC1_RGB_BASE_ADDR:
goto err;
default:
for (p = 0; p < len; p++) {
dma_addr_t phys = address + (p << PAGE_SHIFT);
- void *virt = phys_to_virt(phys);
- rga_dma_flush_range(virt, 4 * 1024);
pages[mapped_size + p] = phys;
}
mapped_size += len;
}
- rga_dma_flush_range(pages, 32 * 1024);
+ dma_sync_single_for_device(rga->drm_dev->dev, virt_to_phys(pages),
+ 8 * PAGE_SIZE, DMA_TO_DEVICE);
*mmu_pages = pages;
int index = cmdlist->last - 2 * (i + 1);
switch (cmdlist->data[index]) {
+ case RGA_SRC1_RGB_BASE_ADDR | RGA_BUF_TYPE_GEMFD:
+ fd = cmdlist->data[index + 1];
+ attach = rga_gem_buf_to_pages(rga, &mmu_pages, fd);
+ if (IS_ERR(attach))
+ return PTR_ERR(attach);
+
+ cmdlist->src1_attach = attach;
+ cmdlist->src1_mmu_pages = mmu_pages;
+ break;
+
case RGA_SRC_Y_RGB_BASE_ADDR | RGA_BUF_TYPE_GEMFD:
fd = cmdlist->data[index + 1];
attach = rga_gem_buf_to_pages(rga, &mmu_pages, fd);
}
node->cmdlist.src_attach = NULL;
+ attach = node->cmdlist.src1_attach;
+ if (attach) {
+ dma_buf = attach->dmabuf;
+ dma_buf_detach(dma_buf, attach);
+ dma_buf_put(dma_buf);
+ }
+ node->cmdlist.src1_attach = NULL;
+
attach = node->cmdlist.dst_attach;
if (attach) {
dma_buf = attach->dmabuf;
return -ENOMEM;
}
+ runqueue->drm_dev = drm_dev;
runqueue->dev = rga->dev;
init_completion(&runqueue->complete);
{
struct rockchip_drm_file_private *file_priv = file->driver_priv;
struct rockchip_drm_rga_private *rga_priv;
+ struct rockchip_rga *rga;
+
+ rga = dev_get_drvdata(dev);
+ rga->drm_dev = drm_dev;
rga_priv = kzalloc(sizeof(*rga_priv), GFP_KERNEL);
if (!rga_priv)
rga->rga_workq = create_singlethread_workqueue("rga");
if (!rga->rga_workq) {
dev_err(rga->dev, "failed to create workqueue\n");
- ret = PTR_ERR(rga->rga_workq);
+ ret = -ENOMEM;
goto err_destroy_slab;
}