diff options
Diffstat (limited to 'linux-core/drm_agpsupport.c')
| -rw-r--r-- | linux-core/drm_agpsupport.c | 132 | 
1 files changed, 77 insertions, 55 deletions
diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c index fcbe56a3..686efcc9 100644 --- a/linux-core/drm_agpsupport.c +++ b/linux-core/drm_agpsupport.c @@ -37,7 +37,7 @@  #if __OS_HAS_AGP  /** - * AGP information ioctl. + * Get AGP information.   *   * \param inode device inode.   * \param filp file pointer. @@ -48,50 +48,56 @@   * Verifies the AGP device has been initialized and acquired and fills in the   * drm_agp_info structure with the information in drm_agp_head::agp_info.   */ -int drm_agp_info(struct inode *inode, struct file *filp, -		 unsigned int cmd, unsigned long arg) +int drm_agp_info(drm_device_t * dev, drm_agp_info_t *info)  { -	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev;  	DRM_AGP_KERN *kern; -	drm_agp_info_t info;  	if (!dev->agp || !dev->agp->acquired)  		return -EINVAL;  	kern = &dev->agp->agp_info; -	info.agp_version_major = kern->version.major; -	info.agp_version_minor = kern->version.minor; -	info.mode = kern->mode; -	info.aperture_base = kern->aper_base; -	info.aperture_size = kern->aper_size * 1024 * 1024; -	info.memory_allowed = kern->max_memory << PAGE_SHIFT; -	info.memory_used = kern->current_memory << PAGE_SHIFT; -	info.id_vendor = kern->device->vendor; -	info.id_device = kern->device->device; +	info->agp_version_major = kern->version.major; +	info->agp_version_minor = kern->version.minor; +	info->mode = kern->mode; +	info->aperture_base = kern->aper_base; +	info->aperture_size = kern->aper_size * 1024 * 1024; +	info->memory_allowed = kern->max_memory << PAGE_SHIFT; +	info->memory_used = kern->current_memory << PAGE_SHIFT; +	info->id_vendor = kern->device->vendor; +	info->id_device = kern->device->device; + +	return 0; +} +EXPORT_SYMBOL(drm_agp_info); + +int drm_agp_info_ioctl(struct inode *inode, struct file *filp, +		 unsigned int cmd, unsigned long arg) +{ +	drm_file_t *priv = filp->private_data; +	drm_device_t *dev = priv->head->dev; +	drm_agp_info_t info; +	int err; +	err = drm_agp_info(dev, &info); +	if (err) +		return err; +	  	if (copy_to_user((drm_agp_info_t __user *) arg, &info, sizeof(info)))  		return -EFAULT;  	return 0;  }  /** - * Acquire the AGP device (ioctl). + * Acquire the AGP device   * - * \param inode device inode. - * \param filp file pointer. - * \param cmd command. - * \param arg user argument. + * \param dev DRM device that is to acquire AGP.   * \return zero on success or a negative number on failure.   *   * Verifies the AGP device hasn't been acquired before and calls - * agp_backend_acquire(). + * \c agp_backend_acquire.   */ -int drm_agp_acquire(struct inode *inode, struct file *filp, -		    unsigned int cmd, unsigned long arg) +int drm_agp_acquire(drm_device_t * dev)  { -	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev;  #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)  	int retcode;  #endif @@ -115,9 +121,10 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,  	dev->agp->acquired = 1;  	return 0;  } +EXPORT_SYMBOL(drm_agp_acquire);  /** - * Release the AGP device (ioctl). + * Acquire the AGP device (ioctl).   *   * \param inode device inode.   * \param filp file pointer. @@ -125,14 +132,27 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,   * \param arg user argument.   * \return zero on success or a negative number on failure.   * - * Verifies the AGP device has been acquired and calls agp_backend_release(). + * Verifies the AGP device hasn't been acquired before and calls + * \c agp_backend_acquire.   */ -int drm_agp_release(struct inode *inode, struct file *filp, -		    unsigned int cmd, unsigned long arg) +int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, +			  unsigned int cmd, unsigned long arg)  {  	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev; +	 +	return drm_agp_acquire( (drm_device_t *) priv->head->dev ); +} +/** + * Release the AGP device + * + * \param dev DRM device that is to release AGP. + * \return zero on success or a negative number on failure. + * + * Verifies the AGP device has been acquired and calls \c agp_backend_release. + */ +int drm_agp_release(drm_device_t *dev) +{  	if (!dev->agp || !dev->agp->acquired)  		return -EINVAL;  #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11) @@ -144,46 +164,32 @@ int drm_agp_release(struct inode *inode, struct file *filp,  	return 0;  } +EXPORT_SYMBOL(drm_agp_release); -/** - * Release the AGP device. - * - * Calls agp_backend_release(). - */ -void drm_agp_do_release(drm_device_t *dev) +int drm_agp_release_ioctl(struct inode *inode, struct file *filp, +			  unsigned int cmd, unsigned long arg)  { -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11) -	agp_backend_release(); -#else -	agp_backend_release(dev->agp->bridge); -#endif +	drm_file_t *priv = filp->private_data; +	drm_device_t *dev = priv->head->dev; +	 +	return drm_agp_release(dev);  }  /**   * Enable the AGP bus.   * - * \param inode device inode. - * \param filp file pointer. - * \param cmd command. - * \param arg pointer to a drm_agp_mode structure. + * \param dev DRM device that has previously acquired AGP. + * \param mode Requested AGP mode.   * \return zero on success or a negative number on failure.   *   * Verifies the AGP device has been acquired but not enabled, and calls - * agp_enable(). + * \c agp_enable.   */ -int drm_agp_enable(struct inode *inode, struct file *filp, -		   unsigned int cmd, unsigned long arg) +int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode)  { -	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev; -	drm_agp_mode_t mode; -  	if (!dev->agp || !dev->agp->acquired)  		return -EINVAL; -	if (copy_from_user(&mode, (drm_agp_mode_t __user *) arg, sizeof(mode))) -		return -EFAULT; -  	dev->agp->mode = mode.mode;  #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)  	agp_enable(mode.mode); @@ -194,6 +200,21 @@ int drm_agp_enable(struct inode *inode, struct file *filp,  	dev->agp->enabled = 1;  	return 0;  } +EXPORT_SYMBOL(drm_agp_enable); + +int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, +		   unsigned int cmd, unsigned long arg) +{ +	drm_file_t *priv = filp->private_data; +	drm_device_t *dev = priv->head->dev; +	drm_agp_mode_t mode; + + +	if (copy_from_user(&mode, (drm_agp_mode_t __user *) arg, sizeof(mode))) +		return -EFAULT; + +	return drm_agp_enable(dev, mode); +}  /**   * Allocate AGP memory. @@ -479,6 +500,7 @@ int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start)  		return -EINVAL;  	return agp_bind_memory(handle, start);  } +EXPORT_SYMBOL(drm_agp_bind_memory);  /** Calls agp_unbind_memory() */  int drm_agp_unbind_memory(DRM_AGP_MEM * handle)  | 
