diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drmP.h | 28 | ||||
| -rw-r--r-- | linux-core/drm_agpsupport.c | 132 | ||||
| -rw-r--r-- | linux-core/drm_bufs.c | 89 | ||||
| -rw-r--r-- | linux-core/drm_drv.c | 18 | ||||
| -rw-r--r-- | linux-core/drm_memory.c | 4 | ||||
| -rw-r--r-- | linux-core/mga_drv.c | 13 | 
6 files changed, 179 insertions, 105 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 40579bfa..7d5902ef 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -862,10 +862,17 @@ extern int drm_lock_free(drm_device_t * dev,  			 __volatile__ unsigned int *lock, unsigned int context);  				/* Buffer management support (drm_bufs.h) */ -extern int drm_addmap(struct inode *inode, struct file *filp, -		      unsigned int cmd, unsigned long arg); -extern int drm_rmmap(struct inode *inode, struct file *filp, -		     unsigned int cmd, unsigned long arg); +extern int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request); +extern int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request); +extern int drm_addbufs_fb (drm_device_t * dev, drm_buf_desc_t * request); +extern int drm_addmap(drm_device_t * dev, unsigned int offset, +		      unsigned int size, drm_map_type_t type, +		      drm_map_flags_t flags, drm_map_t ** map_ptr); +extern int drm_addmap_ioctl(struct inode *inode, struct file *filp, +			    unsigned int cmd, unsigned long arg); +extern int drm_rmmap(drm_device_t *dev, void *handle); +extern int drm_rmmap_ioctl(struct inode *inode, struct file *filp, +			   unsigned int cmd, unsigned long arg);  extern int drm_initmap(drm_device_t * dev, unsigned int offset,  		       unsigned int size, unsigned int resource, int type,  		       int flags); @@ -913,14 +920,17 @@ extern void drm_vbl_send_signals(drm_device_t * dev);  				/* AGP/GART support (drm_agpsupport.h) */  extern drm_agp_head_t *drm_agp_init(drm_device_t *dev); -extern int drm_agp_acquire(struct inode *inode, struct file *filp, +extern int drm_agp_acquire(drm_device_t * dev); +extern int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,  			   unsigned int cmd, unsigned long arg); -extern void drm_agp_do_release(drm_device_t *dev); -extern int drm_agp_release(struct inode *inode, struct file *filp, +extern int drm_agp_release(drm_device_t *dev); +extern int drm_agp_release_ioctl(struct inode *inode, struct file *filp,  			   unsigned int cmd, unsigned long arg); -extern int drm_agp_enable(struct inode *inode, struct file *filp, +extern int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode); +extern int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,  			  unsigned int cmd, unsigned long arg); -extern int drm_agp_info(struct inode *inode, struct file *filp, +extern int drm_agp_info(drm_device_t * dev, drm_agp_info_t *info); +extern int drm_agp_info_ioctl(struct inode *inode, struct file *filp,  			unsigned int cmd, unsigned long arg);  extern int drm_agp_alloc(struct inode *inode, struct file *filp,  			 unsigned int cmd, unsigned long arg); 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) diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index 50182160..b54aaeb8 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -122,27 +122,23 @@ EXPORT_SYMBOL(drm_initmap);   * type.  Adds the map to the map list drm_device::maplist. Adds MTRR's where   * applicable and if supported by the kernel.   */ -int drm_addmap(struct inode *inode, struct file *filp, -	       unsigned int cmd, unsigned long arg) +int drm_addmap(drm_device_t * dev, unsigned int offset, +	       unsigned int size, drm_map_type_t type, +	       drm_map_flags_t flags, drm_map_t ** map_ptr)  { -	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev;  	drm_map_t *map; -	drm_map_t __user *argp = (void __user *)arg;  	drm_map_list_t *list;  	drm_dma_handle_t *dmah; -	if (!(filp->f_mode & 3)) -		return -EACCES;	/* Require read/write */  	map = drm_alloc(sizeof(*map), DRM_MEM_MAPS);  	if (!map)  		return -ENOMEM; -	if (copy_from_user(map, argp, sizeof(*map))) { -		drm_free(map, sizeof(*map), DRM_MEM_MAPS); -		return -EFAULT; -	} +	map->offset = offset; +	map->size = size; +	map->flags = flags; +	map->type = type;  	/* Only allow shared memory to be removable since we only keep enough  	 * book keeping information about shared memory to allow for removal @@ -289,11 +285,40 @@ int drm_addmap(struct inode *inode, struct file *filp,  	list_add(&list->head, &dev->maplist->head);  	up(&dev->struct_sem);        found_it: -	if (copy_to_user(argp, map, sizeof(*map))) +	*map_ptr = map; +	return 0; +} +EXPORT_SYMBOL(drm_addmap); + +int drm_addmap_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_map_t map; +	drm_map_t *map_ptr; +	drm_map_t __user *argp = (void __user *)arg; +	int err; + +	if (!(filp->f_mode & 3)) +		return -EACCES;	/* Require read/write */ + +	if (copy_from_user(& map, argp, sizeof(map))) {  		return -EFAULT; -	if (map->type != _DRM_SHM) { +	} + +	err = drm_addmap( dev, map.offset, map.size, map.type, map.flags, +			  & map_ptr ); + +	if (err) { +		return err; +	} + +	if (copy_to_user(argp, map_ptr, sizeof(*map_ptr))) +		return -EFAULT; +	if (map_ptr->type != _DRM_SHM) {  		if (copy_to_user(&argp->handle, -				 &map->offset, sizeof(map->offset))) +				 &map_ptr->offset, sizeof(map_ptr->offset)))  			return -EFAULT;  	}  	return 0; @@ -313,23 +338,16 @@ int drm_addmap(struct inode *inode, struct file *filp,   * its being used, and free any associate resource (such as MTRR's) if it's not   * being on use.   * - * \sa addmap(). + * \sa drm_addmap   */ -int drm_rmmap(struct inode *inode, struct file *filp, -	      unsigned int cmd, unsigned long arg) +int drm_rmmap(drm_device_t *dev, void *handle)  { -	drm_file_t *priv = filp->private_data; -	drm_device_t *dev = priv->head->dev;  	struct list_head *list;  	drm_map_list_t *r_list = NULL;  	drm_vma_entry_t *pt, *prev;  	drm_map_t *map; -	drm_map_t request;  	int found_maps = 0; -	if (copy_from_user(&request, (drm_map_t __user *) arg, sizeof(request))) { -		return -EFAULT; -	}  	down(&dev->struct_sem);  	list = &dev->maplist->head; @@ -337,7 +355,7 @@ int drm_rmmap(struct inode *inode, struct file *filp,  		r_list = list_entry(list, drm_map_list_t, head);  		if (r_list->map && -		    r_list->map->handle == request.handle && +		    r_list->map->handle == handle &&  		    r_list->map->flags & _DRM_REMOVABLE)  			break;  	} @@ -389,6 +407,22 @@ int drm_rmmap(struct inode *inode, struct file *filp,  	up(&dev->struct_sem);  	return 0;  } +EXPORT_SYMBOL(drm_rmmap); + +int drm_rmmap_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_map_t request; + + +	if (copy_from_user(&request, (drm_map_t __user *) arg, sizeof(request))) { +		return -EFAULT; +	} + +	return drm_rmmap(dev, request.handle); +}  /**   * Cleanup after an error on one of the addbufs() functions. @@ -444,7 +478,7 @@ static void drm_cleanup_buf_error(drm_device_t * dev, drm_buf_entry_t * entry)   * reallocates the buffer list of the same size order to accommodate the new   * buffers.   */ -static int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request) +int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)  {  	drm_device_dma_t *dma = dev->dma;  	drm_buf_entry_t *entry; @@ -596,9 +630,10 @@ static int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)  	atomic_dec(&dev->buf_alloc);  	return 0;  } +EXPORT_SYMBOL(drm_addbufs_agp);  #endif				/* __OS_HAS_AGP */ -static int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request) +int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)  {  	drm_device_dma_t *dma = dev->dma;  	int count; @@ -814,6 +849,7 @@ static int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)  	return 0;  } +EXPORT_SYMBOL(drm_addbufs_pci);  static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)  { @@ -1127,6 +1163,7 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)  	atomic_dec(&dev->buf_alloc);  	return 0;  } +EXPORT_SYMBOL(drm_addbufs_fb);  /** diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 5a39e34e..39c893ce 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -72,8 +72,8 @@ drm_ioctl_desc_t drm_ioctls[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = {drm_noop, 1, 1},  	[DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = {drm_authmagic, 1, 1}, -	[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = {drm_addmap, 1, 1}, -	[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)] = {drm_rmmap, 1, 0}, +	[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = {drm_addmap_ioctl, 1, 1}, +	[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)] = {drm_rmmap_ioctl, 1, 0},  	[DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = {drm_setsareactx, 1, 1},  	[DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = {drm_getsareactx, 1, 0}, @@ -105,10 +105,10 @@ drm_ioctl_desc_t drm_ioctls[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = {drm_control, 1, 1},  #if __OS_HAS_AGP -	[DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = {drm_agp_acquire, 1, 1}, -	[DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release, 1, 1}, -	[DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable, 1, 1}, -	[DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info, 1, 0}, +	[DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = {drm_agp_acquire_ioctl, 1, 1}, +	[DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release_ioctl, 1, 1}, +	[DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable_ioctl, 1, 1}, +	[DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info_ioctl, 1, 0},  	[DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc, 1, 1},  	[DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free, 1, 1},  	[DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_bind, 1, 1}, @@ -130,7 +130,7 @@ drm_ioctl_desc_t drm_ioctls[] = {   *   * Frees every resource in \p dev.   * - * \sa drm_device and setup(). + * \sa drm_device   */  int drm_takedown(drm_device_t * dev)  { @@ -190,7 +190,7 @@ int drm_takedown(drm_device_t * dev)  		dev->agp->memory = NULL;  		if (dev->agp->acquired) -			drm_agp_do_release(dev); +			drm_agp_release(dev);  		dev->agp->acquired = 0;  		dev->agp->enabled = 0; @@ -365,7 +365,7 @@ EXPORT_SYMBOL(drm_init);   *   * Cleans up all DRM device, calling takedown().   * - * \sa drm_init(). + * \sa drm_init   */  static void __exit drm_cleanup(drm_device_t * dev)  { diff --git a/linux-core/drm_memory.c b/linux-core/drm_memory.c index 55523c62..2cc3dc67 100644 --- a/linux-core/drm_memory.c +++ b/linux-core/drm_memory.c @@ -162,23 +162,27 @@ DRM_AGP_MEM *drm_alloc_agp(struct agp_bridge_data *bridge, int pages, u32 type)  	return drm_agp_allocate_memory(bridge, pages, type);  }  #endif +EXPORT_SYMBOL(drm_alloc_agp);  /** Wrapper around agp_free_memory() */  int drm_free_agp(DRM_AGP_MEM * handle, int pages)  {  	return drm_agp_free_memory(handle) ? 0 : -EINVAL;  } +EXPORT_SYMBOL(drm_free_agp);  /** Wrapper around agp_bind_memory() */  int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start)  {  	return drm_agp_bind_memory(handle, start);  } +EXPORT_SYMBOL(drm_bind_agp);  /** Wrapper around agp_unbind_memory() */  int drm_unbind_agp(DRM_AGP_MEM * handle)  {  	return drm_agp_unbind_memory(handle);  } +EXPORT_SYMBOL(drm_unbind_agp);  #endif				/* agp */  #endif				/* debug_memory */ diff --git a/linux-core/mga_drv.c b/linux-core/mga_drv.c index 43877597..ed55c1f3 100644 --- a/linux-core/mga_drv.c +++ b/linux-core/mga_drv.c @@ -40,6 +40,12 @@  static int mga_driver_device_is_agp(drm_device_t * dev);  static int postinit(struct drm_device *dev, unsigned long flags)  { +	drm_mga_private_t * const dev_priv = +		(drm_mga_private_t *) dev->dev_private; + +	dev_priv->mmio_base = pci_resource_start(dev->pdev, 1); +	dev_priv->mmio_size = pci_resource_len(dev->pdev, 1); +  	dev->counters += 3;  	dev->types[6] = _DRM_STAT_IRQ;  	dev->types[7] = _DRM_STAT_PRIMARY; @@ -78,7 +84,7 @@ extern int mga_max_ioctl;  static int probe(struct pci_dev *pdev, const struct pci_device_id *ent);  static struct drm_driver driver = {  	.driver_features = -	    DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | +	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA |  	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |  	    DRIVER_IRQ_VBL,  	.preinit = mga_driver_preinit, @@ -168,11 +174,6 @@ int mga_driver_device_is_agp(drm_device_t * dev)  	if ( (pdev->device == 0x0525)  	     && (pdev->bus->self->vendor == 0x3388)  	     && (pdev->bus->self->device == 0x0021) ) { -#if defined( __powerpc__ ) -		DRM_ERROR("GXT135p is not yet supported\n"); -#else -		DRM_ERROR("PCI G450 is not yet supported\n"); -#endif  		return 0;  	}  | 
