long g2d_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { __s32 ret = 0; switch (cmd) { /* Proceed to the operation */ case G2D_CMD_BITBLT: { g2d_blt blit_para; if(copy_from_user(&blit_para, (g2d_blt *)arg, sizeof(g2d_blt))) { kfree(&blit_para); return -EFAULT; } ret = g2d_blit(&blit_para); break; } case G2D_CMD_FILLRECT: { g2d_fillrect fill_para; if(copy_from_user(&fill_para, (g2d_fillrect *)arg, sizeof(g2d_fillrect))) { kfree(&fill_para); return -EFAULT; } ret = g2d_fill(&fill_para); break; } case G2D_CMD_STRETCHBLT: { g2d_stretchblt stre_para; if(copy_from_user(&stre_para, (g2d_stretchblt *)arg, sizeof(g2d_stretchblt))) { kfree(&stre_para); return -EFAULT; } ret = g2d_stretchblit(&stre_para); break; } case G2D_CMD_PALETTE_TBL: { g2d_palette pale_para; if(copy_from_user(&pale_para, (g2d_palette *)arg, sizeof(g2d_palette))) { kfree(&pale_para); return -EFAULT; } ret = g2d_set_palette_table(&pale_para); break; } /* just management memory for test */ case G2D_CMD_MEM_REQUEST: ret = g2d_mem_request(arg); break; case G2D_CMD_MEM_RELEASE: ret = g2d_mem_release(arg); break; case G2D_CMD_MEM_SELIDX: g2d_mem_sel = arg; break; case G2D_CMD_MEM_GETADR: if(g2d_mem[arg].b_used) { ret = g2d_mem[arg].phy_addr; } else { ERR("mem not used in G2D_CMD_MEM_GETADR\n"); ret = -1; } break; /* Invalid IOCTL call */ default: return -EINVAL; } return ret; }
long g2d_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { __s32 ret = 0; if(!mutex_trylock(¶.mutex)) { mutex_lock(¶.mutex); } switch (cmd) { /* Proceed to the operation */ case G2D_CMD_BITBLT:{ g2d_blt blit_para; if(copy_from_user(&blit_para, (g2d_blt *)arg, sizeof(g2d_blt))) { kfree(&blit_para); ret = -EFAULT; goto err_noput; } ret = g2d_blit(&blit_para); break; } case G2D_CMD_FILLRECT:{ g2d_fillrect fill_para; if(copy_from_user(&fill_para, (g2d_fillrect *)arg, sizeof(g2d_fillrect))) { kfree(&fill_para); ret = -EFAULT; goto err_noput; } ret = g2d_fill(&fill_para); break; } case G2D_CMD_STRETCHBLT:{ g2d_stretchblt stre_para; if(copy_from_user(&stre_para, (g2d_stretchblt *)arg, sizeof(g2d_stretchblt))) { kfree(&stre_para); ret = -EFAULT; goto err_noput; } ret = g2d_stretchblit(&stre_para); break; } case G2D_CMD_PALETTE_TBL:{ g2d_palette pale_para; if(copy_from_user(&pale_para, (g2d_palette *)arg, sizeof(g2d_palette))) { kfree(&pale_para); ret = -EFAULT; goto err_noput; } ret = g2d_set_palette_table(&pale_para); break; } case G2D_CMD_QUEUE:{ unsigned int cmdq_addr; if(copy_from_user(&cmdq_addr, (unsigned int *)arg, sizeof(unsigned int))) { kfree(&cmdq_addr); ret = -EFAULT; goto err_noput; } ret = g2d_cmdq(cmdq_addr); break; } /* just management memory for test */ case G2D_CMD_MEM_REQUEST: ret = g2d_mem_request(arg); break; case G2D_CMD_MEM_RELEASE: ret = g2d_mem_release(arg); break; case G2D_CMD_MEM_SELIDX: g2d_mem_sel = arg; break; case G2D_CMD_MEM_GETADR: if(g2d_mem[arg].b_used) { ret = g2d_mem[arg].phy_addr; } else { ERR("mem not used in G2D_CMD_MEM_GETADR\n"); ret = -1; } break; case G2D_CMD_MEM_FLUSH_CACHE: { g2d_cache_range cache_range; if(copy_from_user(&cache_range, (u32 *)arg, sizeof(cache_range))) { ret = -1; goto err_noput; } pr_debug("%s, G2D_CMD_FUSH_CACHE_RANGE, start 0x%08x, end 0x%08x\n", __func__, (u32)cache_range.start, (u32)cache_range.end); ret = flush_clean_user_range(cache_range.start, cache_range.end); if(0 != ret) pr_err("%s, G2D_CMD_FUSH_CACHE_RANGE return %d\n", __func__, ret); break; } /* Invalid IOCTL call */ default: return -EINVAL; } err_noput: mutex_unlock(¶.mutex); return ret; }