static int shm_driver_ioctl(struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long arg)
{
	shm_driver_operation_t op;
	int res = 0;

	shm_debug("shm_driver_ioctl cmd = 0x%08x\n", cmd);

    switch(cmd) {

      case SHM_DEVICE_CMD_GET_MEMINFO: {
        
        MV_SHM_MemInfo_t meminfo;
        res = shm_device_get_meminfo(shm_device, &meminfo);
        if (res == 0)
            res = copy_to_user((void __user *)arg, &meminfo, sizeof(meminfo));
       
        break;
        }

      case SHM_DEVICE_CMD_GET_BASEINFO: {

        MV_SHM_BaseInfo_t baseinfo;
        res = shm_device_get_baseinfo(shm_device, &baseinfo);
        if (res == 0)
            res = copy_to_user((void __user *)arg, &baseinfo, sizeof(baseinfo));
       
        break;
        }

      case SHM_DEVICE_CMD_ALLOCATE:
                
        res = copy_from_user(&op, (int __user *)arg, sizeof(op));
        if (res != 0)
            break;       
        op.m_param1 = shm_device_allocate(shm_device, op.m_param1, op.m_param2);
	res = copy_to_user((void __user *)arg, &op, sizeof(op));
      
        break;

      case SHM_DEVICE_CMD_FREE:
                
        res = copy_from_user(&op, (int __user *)arg, sizeof(op));
        if (res != 0)
            break;       
        
        res = shm_device_free(shm_device, op.m_param1);

        break;
        
	  case SHM_DEVICE_CMD_INVALIDATE:
	  	
	  	res = copy_from_user(&op, (int __user *)arg, sizeof(op));
		if ( res == 0)
			 res = shm_device_cache_invalidate((void *)op.m_param1, op.m_param2);

		break;

	  case SHM_DEVICE_CMD_CLEAN:
	  	        
	  	res = copy_from_user(&op, (int __user *)arg, sizeof(op));
		if ( res == 0)
			res = shm_device_cache_clean((void *)op.m_param1, op.m_param2);

		break;

	  case SHM_DEVICE_CMD_CLEANANDINVALIDATE:
	  	
	  	res = copy_from_user(&op, (int __user *)arg, sizeof(op));
		if ( res == 0)
			 res = shm_device_cache_clean_and_invalidate((void *)op.m_param1, op.m_param2);

		break;

	  default:
	    
	    res = -ENOTTY;
	}

	shm_debug("shm_driver_ioctl res = %d\n", res);

	return res;
}
static long shm_driver_ioctl(struct file *filp, unsigned int cmd,
			     unsigned long arg)
{
	int res = 0;
	shm_driver_operation_t op;
	shm_device_t *shm_dev;
	MV_SHM_MemInfo_t meminfo;
	MV_SHM_BaseInfo_t baseinfo;

	struct shm_device_priv_data *priv_data
				= (struct shm_device_priv_data*)filp->private_data;
	if (NULL == priv_data) {
		shm_error("shm_driver_ioctl NULL private data\n");
		return -ENOTTY;
	}

	shm_dev = (shm_device_t*)priv_data->m_device;
	if (NULL == shm_dev) {
		shm_error("shm_driver_ioctl NULL shm device\n");
		return -ENOTTY;
	}

	shm_debug("shm_driver_ioctl cmd = 0x%08x\n, base:0x%08X size:0x%08X\n",
				cmd, shm_dev->m_base, shm_dev->m_size);

	switch (cmd) {
	case SHM_DEVICE_CMD_GET_MEMINFO:
		{
			res = shm_device_get_meminfo(shm_dev, &meminfo);
			if (res == 0)
				res =
				    copy_to_user((void __user *)arg, &meminfo,
						 sizeof(meminfo));
			break;
		}

	case SHM_DEVICE_CMD_GET_DEVINFO:
		{
			res = shm_device_get_baseinfo(shm_dev, &baseinfo);
			if (res == 0)
				res =
				    copy_to_user((void __user *)arg, &baseinfo,
						 sizeof(baseinfo));
			break;
		}

	case SHM_DEVICE_CMD_ALLOCATE:
		{
			res =
			    copy_from_user(&op, (int __user *)arg, sizeof(op));
			if (res != 0)
				break;
			op.m_param1 =
			    shm_device_allocate(shm_dev, op.m_param1,
						op.m_param2);
			res = copy_to_user((void __user *)arg, &op, sizeof(op));

			break;
		}

	case SHM_DEVICE_CMD_FREE:
		{
			res =
			    copy_from_user(&op, (int __user *)arg, sizeof(op));
			if (res != 0)
				break;

			op.m_param1 =
				shm_device_free(shm_dev, op.m_param1);
			res = copy_to_user((void __user *)arg, &op, sizeof(op));

			break;
		}

	case SHM_DEVICE_CMD_INVALIDATE:
	case SHM_DEVICE_CMD_CLEAN:
	case SHM_DEVICE_CMD_CLEANANDINVALIDATE:
		{
			res =
			    copy_from_user(&op, (int __user *)arg, sizeof(op));
			if (res == 0) {
				res = shm_device_cache(shm_dev, cmd, op);
			}
			break;
		}

	default:

		res = -ENOTTY;
	}

	shm_debug("shm_driver_ioctl res = %d\n", res);

	return res;
}
Ejemplo n.º 3
0
static int MV_SHM_Base_Free(shm_device_t *shm_dev, size_t Offset)
{
	if (shm_dev == NULL)
		return -ENODEV;
	return shm_device_free(shm_dev, Offset);
}