void fimg2d_del_command(struct fimg2d_control *info, struct fimg2d_bltcmd *cmd) { int i; size_t j; struct fimg2d_context *ctx = cmd->ctx; for (i = 0; i < MAX_IMAGES; i++) for (j = 0; j < FIMG2D_MAX_PLANES; j++) fimg2d_unmap_dma_buf(info, &cmd->dma[i][j]); spin_lock(&info->bltlock); fimg2d_dequeue(&cmd->node); kfree(cmd); atomic_dec(&ctx->ncmd); spin_unlock(&info->bltlock); }
void fimg2d_del_command(struct fimg2d_control *ctrl, struct fimg2d_bltcmd *cmd) { unsigned long flags; struct fimg2d_context *ctx = cmd->ctx; perf_end(cmd, PERF_TOTAL); perf_print(cmd); g2d_spin_lock(&ctrl->bltlock, flags); fimg2d_dequeue(&cmd->node); kfree(cmd); atomic_dec(&ctx->ncmd); #ifdef BLIT_WORKQUE /* wake up context */ if (!atomic_read(&ctx->ncmd)) wake_up(&ctx->wait_q); #endif g2d_spin_unlock(&ctrl->bltlock, flags); }
void fimg2d4x_bitblt(struct fimg2d_control *info) { struct fimg2d_context *ctx; struct fimg2d_bltcmd *cmd; unsigned long *pgd; fimg2d_debug("enter blitter\n"); #ifdef CONFIG_PM_RUNTIME pm_runtime_get_sync(info->dev); fimg2d_debug("pm_runtime_get_sync\n"); #endif fimg2d_clk_on(info); while ((cmd = fimg2d_get_first_command(info))) { ctx = cmd->ctx; if (info->err) { printk(KERN_ERR "[%s] device error\n", __func__); goto blitend; } atomic_set(&info->busy, 1); info->configure(info, cmd); if (cmd->image[IDST].addr.type != ADDR_PHYS) { pgd = (unsigned long *)ctx->mm->pgd; s5p_sysmmu_enable(info->dev, (unsigned long)virt_to_phys(pgd)); fimg2d_debug("sysmmu enable: pgd %p ctx %p seq_no(%u)\n", pgd, ctx, cmd->seq_no); } fimg2d4x_pre_bitblt(info, cmd); #ifdef PERF_PROFILE perf_start(cmd->ctx, PERF_BLIT); #endif /* start blit */ info->run(info); fimg2d4x_blit_wait(info, cmd); #ifdef PERF_PROFILE perf_end(cmd->ctx, PERF_BLIT); #endif if (cmd->image[IDST].addr.type != ADDR_PHYS) { s5p_sysmmu_disable(info->dev); fimg2d_debug("sysmmu disable\n"); } blitend: spin_lock(&info->bltlock); fimg2d_dequeue(&cmd->node); kfree(cmd); atomic_dec(&ctx->ncmd); /* wake up context */ if (!atomic_read(&ctx->ncmd)) wake_up(&ctx->wait_q); spin_unlock(&info->bltlock); } atomic_set(&info->active, 0); fimg2d_clk_off(info); #ifdef CONFIG_PM_RUNTIME pm_runtime_put_sync(info->dev); fimg2d_debug("pm_runtime_put_sync\n"); #endif fimg2d_debug("exit blitter\n"); }