diff options
Diffstat (limited to 'bsd-core')
| -rw-r--r-- | bsd-core/ati_pcigart.c | 4 | ||||
| -rw-r--r-- | bsd-core/drmP.h | 12 | ||||
| -rw-r--r-- | bsd-core/drm_drv.c | 30 | ||||
| -rw-r--r-- | bsd-core/drm_irq.c | 46 | ||||
| -rw-r--r-- | bsd-core/drm_lock.c | 2 | ||||
| -rw-r--r-- | bsd-core/i915_drv.c | 4 | ||||
| -rw-r--r-- | bsd-core/radeon_drv.c | 2 | 
7 files changed, 69 insertions, 31 deletions
| diff --git a/bsd-core/ati_pcigart.c b/bsd-core/ati_pcigart.c index db19a75d..bb0c46e2 100644 --- a/bsd-core/ati_pcigart.c +++ b/bsd-core/ati_pcigart.c @@ -35,7 +35,7 @@  #define ATI_PCIGART_PAGE_SIZE		4096	/* PCI GART page size */ -int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) +int drm_ati_pcigart_init(drm_device_t *dev, struct drm_ati_pcigart_info *gart_info)  {  	unsigned long pages;  	u32 *pci_gart = NULL, page_base; @@ -94,7 +94,7 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)  	return 1;  } -int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info) +int drm_ati_pcigart_cleanup(drm_device_t *dev, struct drm_ati_pcigart_info *gart_info)  {  	if (dev->sg == NULL) {  		DRM_ERROR( "no scatter/gather memory!\n" ); diff --git a/bsd-core/drmP.h b/bsd-core/drmP.h index 1dd27282..99457bf8 100644 --- a/bsd-core/drmP.h +++ b/bsd-core/drmP.h @@ -388,7 +388,7 @@ for ( ret = 0 ; !ret && !(condition) ; ) {			\  	DRM_UNLOCK();						\  	mtx_lock(&dev->irq_lock);				\  	if (!(condition))					\ -	   ret = -msleep(&(queue), &dev->irq_lock, 		\ +	   ret = -mtx_sleep(&(queue), &dev->irq_lock, 		\  			 PZERO | PCATCH, "drmwtq", (timeout));	\  	mtx_unlock(&dev->irq_lock);				\  	DRM_LOCK();						\ @@ -614,14 +614,14 @@ typedef struct drm_vbl_sig {  #define DRM_ATI_GART_PCIE 2  #define DRM_ATI_GART_IGP  3 -typedef struct ati_pcigart_info { +struct drm_ati_pcigart_info {  	int gart_table_location;  	int gart_reg_if;  	void *addr;  	dma_addr_t bus_addr;  	drm_local_map_t mapping;  	int table_size; -} drm_ati_pcigart_info; +};  struct drm_driver_info {  	int	(*load)(struct drm_device *, unsigned long flags); @@ -650,6 +650,7 @@ struct drm_driver_info {  	void	(*irq_uninstall)(drm_device_t *dev);  	void	(*irq_handler)(DRM_IRQ_ARGS);  	int	(*vblank_wait)(drm_device_t *dev, unsigned int *sequence); +	int	(*vblank_wait2)(drm_device_t *dev, unsigned int *sequence);  	drm_pci_id_list_t *id_entry;	/* PCI ID, name, and chipset private */ @@ -686,6 +687,7 @@ struct drm_driver_info {  	unsigned use_dma_queue :1;  	unsigned use_irq :1;  	unsigned use_vbl_irq :1; +	unsigned use_vbl_irq2 :1;  	unsigned use_mtrr :1;  }; @@ -925,9 +927,9 @@ extern int		drm_sysctl_cleanup(drm_device_t *dev);  /* ATI PCIGART support (ati_pcigart.c) */  int	drm_ati_pcigart_init(drm_device_t *dev, -			     drm_ati_pcigart_info *gart_info); +				struct drm_ati_pcigart_info *gart_info);  int	drm_ati_pcigart_cleanup(drm_device_t *dev, -				drm_ati_pcigart_info *gart_info); +				struct drm_ati_pcigart_info *gart_info);  /* Locking IOCTL support (drm_drv.c) */  int	drm_lock(drm_device_t *dev, void *data, struct drm_file *file_priv); diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c index d6868b9c..8466ce33 100644 --- a/bsd-core/drm_drv.c +++ b/bsd-core/drm_drv.c @@ -403,17 +403,6 @@ static int drm_firstopen(drm_device_t *dev)  			return i;  	} -	dev->counters  = 6; -	dev->types[0]  = _DRM_STAT_LOCK; -	dev->types[1]  = _DRM_STAT_OPENS; -	dev->types[2]  = _DRM_STAT_CLOSES; -	dev->types[3]  = _DRM_STAT_IOCTLS; -	dev->types[4]  = _DRM_STAT_LOCKS; -	dev->types[5]  = _DRM_STAT_UNLOCKS; - -	for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ ) -		atomic_set( &dev->counts[i], 0 ); -  	for ( i = 0 ; i < DRM_HASH_SIZE ; i++ ) {  		dev->magiclist[i].head = NULL;  		dev->magiclist[i].tail = NULL; @@ -495,10 +484,10 @@ static int drm_lastclose(drm_device_t *dev)  	}  	TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) { -		drm_rmmap(dev, map); +		if (!(map->flags & _DRM_DRIVER)) +			drm_rmmap(dev, map);  	} -  	drm_dma_takedown(dev);  	if ( dev->lock.hw_lock ) {  		dev->lock.hw_lock = NULL; /* SHM removed */ @@ -511,7 +500,7 @@ static int drm_lastclose(drm_device_t *dev)  static int drm_load(drm_device_t *dev)  { -	int retcode; +	int i, retcode;  	DRM_DEBUG( "\n" ); @@ -536,6 +525,17 @@ static int drm_load(drm_device_t *dev)  #endif  	TAILQ_INIT(&dev->files); +	dev->counters  = 6; +	dev->types[0]  = _DRM_STAT_LOCK; +	dev->types[1]  = _DRM_STAT_OPENS; +	dev->types[2]  = _DRM_STAT_CLOSES; +	dev->types[3]  = _DRM_STAT_IOCTLS; +	dev->types[4]  = _DRM_STAT_LOCKS; +	dev->types[5]  = _DRM_STAT_UNLOCKS; + +	for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ ) +		atomic_set( &dev->counts[i], 0 ); +  	if (dev->driver.load != NULL) {  		DRM_LOCK();  		/* Shared code returns -errno. */ @@ -772,7 +772,7 @@ int drm_close(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p)  			}  				/* Contention */  #if defined(__FreeBSD__) && __FreeBSD_version > 500000 -			retcode = msleep((void *)&dev->lock.lock_queue, +			retcode = mtx_sleep((void *)&dev->lock.lock_queue,  			    &dev->dev_lock, PZERO | PCATCH, "drmlk2", 0);  #else  			retcode = tsleep((void *)&dev->lock.lock_queue, diff --git a/bsd-core/drm_irq.c b/bsd-core/drm_irq.c index 0772445a..40d0b71f 100644 --- a/bsd-core/drm_irq.c +++ b/bsd-core/drm_irq.c @@ -211,17 +211,43 @@ int drm_wait_vblank(drm_device_t *dev, void *data, struct drm_file *file_priv)  {  	drm_wait_vblank_t *vblwait = data;  	struct timeval now; -	int ret, flags; +	int ret = 0; +	int flags, seq;  	if (!dev->irq_enabled)  		return EINVAL; -	if (vblwait->request.type & _DRM_VBLANK_RELATIVE) { -		vblwait->request.sequence += atomic_read(&dev->vbl_received); -		vblwait->request.type &= ~_DRM_VBLANK_RELATIVE; +	if (vblwait->request.type & +	    ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { +		DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", +		    vblwait->request.type, +		    (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)); +		return EINVAL;  	}  	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; + +	if ((flags & _DRM_VBLANK_SECONDARY) && !dev->driver.use_vbl_irq2) +		return EINVAL; +	 +	seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? +	    &dev->vbl_received2 : &dev->vbl_received); + +	switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) { +	case _DRM_VBLANK_RELATIVE: +		vblwait->request.sequence += seq; +		vblwait->request.type &= ~_DRM_VBLANK_RELATIVE; +	case _DRM_VBLANK_ABSOLUTE: +		break; +	default: +		return EINVAL; +	} + +	if ((flags & _DRM_VBLANK_NEXTONMISS) && +	    (seq - vblwait->request.sequence) <= (1<<23)) { +		vblwait->request.sequence = seq + 1; +	} +  	if (flags & _DRM_VBLANK_SIGNAL) {  #if 0 /* disabled */  		drm_vbl_sig_t *vbl_sig = malloc(sizeof(drm_vbl_sig_t), M_DRM, @@ -244,8 +270,14 @@ int drm_wait_vblank(drm_device_t *dev, void *data, struct drm_file *file_priv)  	} else {  		DRM_LOCK();  		/* shared code returns -errno */ -		ret = -dev->driver.vblank_wait(dev, -		    &vblwait->request.sequence); +		if (flags & _DRM_VBLANK_SECONDARY) { +			if (dev->driver.vblank_wait2) +				ret = -dev->driver.vblank_wait2(dev, +				    &vblwait->request.sequence); +		} else if (dev->driver.vblank_wait) +			ret = -dev->driver.vblank_wait(dev, +			    &vblwait->request.sequence); +  		DRM_UNLOCK();  		microtime(&now); @@ -303,7 +335,7 @@ static void drm_locked_task(void *context, int pending __unused)  		/* Contention */  #if defined(__FreeBSD__) && __FreeBSD_version > 500000 -		ret = msleep((void *)&dev->lock.lock_queue, &dev->dev_lock, +		ret = mtx_sleep((void *)&dev->lock.lock_queue, &dev->dev_lock,  		    PZERO | PCATCH, "drmlk2", 0);  #else  		ret = tsleep((void *)&dev->lock.lock_queue, PZERO | PCATCH, diff --git a/bsd-core/drm_lock.c b/bsd-core/drm_lock.c index fb86fc68..9731ff92 100644 --- a/bsd-core/drm_lock.c +++ b/bsd-core/drm_lock.c @@ -140,7 +140,7 @@ int drm_lock(drm_device_t *dev, void *data, struct drm_file *file_priv)  		/* Contention */  #if defined(__FreeBSD__) && __FreeBSD_version > 500000 -		ret = msleep((void *)&dev->lock.lock_queue, &dev->dev_lock, +		ret = mtx_sleep((void *)&dev->lock.lock_queue, &dev->dev_lock,  		    PZERO | PCATCH, "drmlk2", 0);  #else  		ret = tsleep((void *)&dev->lock.lock_queue, PZERO | PCATCH, diff --git a/bsd-core/i915_drv.c b/bsd-core/i915_drv.c index d42b2076..e8897fbe 100644 --- a/bsd-core/i915_drv.c +++ b/bsd-core/i915_drv.c @@ -46,8 +46,9 @@ static void i915_configure(drm_device_t *dev)  	dev->driver.load		= i915_driver_load;  	dev->driver.preclose		= i915_driver_preclose;  	dev->driver.lastclose		= i915_driver_lastclose; -	dev->driver.device_is_agp	= i915_driver_device_is_agp, +	dev->driver.device_is_agp	= i915_driver_device_is_agp;  	dev->driver.vblank_wait		= i915_driver_vblank_wait; +	dev->driver.vblank_wait2	= i915_driver_vblank_wait2;  	dev->driver.irq_preinstall	= i915_driver_irq_preinstall;  	dev->driver.irq_postinstall	= i915_driver_irq_postinstall;  	dev->driver.irq_uninstall	= i915_driver_irq_uninstall; @@ -68,6 +69,7 @@ static void i915_configure(drm_device_t *dev)  	dev->driver.use_mtrr		= 1;  	dev->driver.use_irq		= 1;  	dev->driver.use_vbl_irq		= 1; +	dev->driver.use_vbl_irq2	= 1;  }  #ifdef __FreeBSD__ diff --git a/bsd-core/radeon_drv.c b/bsd-core/radeon_drv.c index f66bc795..93f875c5 100644 --- a/bsd-core/radeon_drv.c +++ b/bsd-core/radeon_drv.c @@ -53,6 +53,7 @@ static void radeon_configure(drm_device_t *dev)  	dev->driver.postclose		= radeon_driver_postclose;  	dev->driver.lastclose		= radeon_driver_lastclose;  	dev->driver.vblank_wait		= radeon_driver_vblank_wait; +	dev->driver.vblank_wait2	= radeon_driver_vblank_wait2;  	dev->driver.irq_preinstall	= radeon_driver_irq_preinstall;  	dev->driver.irq_postinstall	= radeon_driver_irq_postinstall;  	dev->driver.irq_uninstall	= radeon_driver_irq_uninstall; @@ -76,6 +77,7 @@ static void radeon_configure(drm_device_t *dev)  	dev->driver.use_dma		= 1;  	dev->driver.use_irq		= 1;  	dev->driver.use_vbl_irq		= 1; +	dev->driver.use_vbl_irq2	= 1;  }  #ifdef __FreeBSD__ | 
