示例#1
0
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;
}
示例#2
0
long g2d_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	__s32	ret = 0;

	if(!mutex_trylock(&para.mutex)) {
			mutex_lock(&para.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(&para.mutex);
	
	return ret;
}