diff options
Diffstat (limited to 'drivers/gpu/drm/via')
| -rw-r--r-- | drivers/gpu/drm/via/via_dma.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_dmablit.c | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_drv.c | 77 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_drv.h | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_irq.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_map.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_mm.c | 149 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_verifier.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/via/via_video.c | 12 | 
9 files changed, 199 insertions, 129 deletions
diff --git a/drivers/gpu/drm/via/via_dma.c b/drivers/gpu/drm/via/via_dma.c index cc0ffa9abd0..6fc0648dd37 100644 --- a/drivers/gpu/drm/via/via_dma.c +++ b/drivers/gpu/drm/via/via_dma.c @@ -34,9 +34,8 @@   *    Thomas Hellstrom.   */ -#include "drmP.h" -#include "drm.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h"  #include "via_3d_reg.h" @@ -61,7 +60,7 @@  	dev_priv->dma_low += 8;					\  } -#define via_flush_write_combine() DRM_MEMORYBARRIER() +#define via_flush_write_combine() mb()  #define VIA_OUT_RING_QW(w1, w2)	do {		\  	*vb++ = (w1);				\ @@ -235,13 +234,13 @@ static int via_dma_init(struct drm_device *dev, void *data, struct drm_file *fil  	switch (init->func) {  	case VIA_INIT_DMA: -		if (!DRM_SUSER(DRM_CURPROC)) +		if (!capable(CAP_SYS_ADMIN))  			retcode = -EPERM;  		else  			retcode = via_initialize(dev, dev_priv, init);  		break;  	case VIA_CLEANUP_DMA: -		if (!DRM_SUSER(DRM_CURPROC)) +		if (!capable(CAP_SYS_ADMIN))  			retcode = -EPERM;  		else  			retcode = via_dma_cleanup(dev); @@ -274,7 +273,7 @@ static int via_dispatch_cmdbuffer(struct drm_device *dev, drm_via_cmdbuffer_t *c  	if (cmd->size > VIA_PCI_BUF_SIZE)  		return -ENOMEM; -	if (DRM_COPY_FROM_USER(dev_priv->pci_buf, cmd->buf, cmd->size)) +	if (copy_from_user(dev_priv->pci_buf, cmd->buf, cmd->size))  		return -EFAULT;  	/* @@ -347,7 +346,7 @@ static int via_dispatch_pci_cmdbuffer(struct drm_device *dev,  	if (cmd->size > VIA_PCI_BUF_SIZE)  		return -ENOMEM; -	if (DRM_COPY_FROM_USER(dev_priv->pci_buf, cmd->buf, cmd->size)) +	if (copy_from_user(dev_priv->pci_buf, cmd->buf, cmd->size))  		return -EFAULT;  	if ((ret = @@ -544,7 +543,7 @@ static void via_cmdbuf_start(drm_via_private_t *dev_priv)  	VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_hi);  	VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_lo); -	DRM_WRITEMEMORYBARRIER(); +	wmb();  	VIA_WRITE(VIA_REG_TRANSPACE, command | HC_HAGPCMNT_MASK);  	VIA_READ(VIA_REG_TRANSPACE); @@ -721,7 +720,7 @@ static int via_cmdbuf_size(struct drm_device *dev, void *data, struct drm_file *  	return ret;  } -struct drm_ioctl_desc via_ioctls[] = { +const struct drm_ioctl_desc via_ioctls[] = {  	DRM_IOCTL_DEF_DRV(VIA_ALLOCMEM, via_mem_alloc, DRM_AUTH),  	DRM_IOCTL_DEF_DRV(VIA_FREEMEM, via_mem_free, DRM_AUTH),  	DRM_IOCTL_DEF_DRV(VIA_AGP_INIT, via_agp_init, DRM_AUTH|DRM_MASTER), @@ -738,4 +737,4 @@ struct drm_ioctl_desc via_ioctls[] = {  	DRM_IOCTL_DEF_DRV(VIA_BLIT_SYNC, via_dma_blit_sync, DRM_AUTH)  }; -int via_max_ioctl = DRM_ARRAY_SIZE(via_ioctls); +int via_max_ioctl = ARRAY_SIZE(via_ioctls); diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index 3e038a394c5..ba33cf67918 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c @@ -34,8 +34,8 @@   * the same DMA mappings?   */ -#include "drmP.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h"  #include "via_dmablit.h" @@ -217,7 +217,7 @@ via_fire_dmablit(struct drm_device *dev, drm_via_sg_info_t *vsg, int engine)  	VIA_WRITE(VIA_PCI_DMA_MR0  + engine*0x04, VIA_DMA_MR_CM | VIA_DMA_MR_TDIE);  	VIA_WRITE(VIA_PCI_DMA_BCR0 + engine*0x10, 0);  	VIA_WRITE(VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start); -	DRM_WRITEMEMORYBARRIER(); +	wmb();  	VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DE | VIA_DMA_CSR_TS);  	VIA_READ(VIA_PCI_DMA_CSR0 + engine*0x04);  } @@ -338,7 +338,7 @@ via_dmablit_handler(struct drm_device *dev, int engine, int from_irq)  		blitq->blits[cur]->aborted = blitq->aborting;  		blitq->done_blit_handle++; -		DRM_WAKEUP(blitq->blit_queue + cur); +		wake_up(blitq->blit_queue + cur);  		cur++;  		if (cur >= VIA_NUM_BLIT_SLOTS) @@ -363,7 +363,7 @@ via_dmablit_handler(struct drm_device *dev, int engine, int from_irq)  		via_abort_dmablit(dev, engine);  		blitq->aborting = 1; -		blitq->end = jiffies + DRM_HZ; +		blitq->end = jiffies + HZ;  	}  	if (!blitq->is_active) { @@ -372,7 +372,7 @@ via_dmablit_handler(struct drm_device *dev, int engine, int from_irq)  			blitq->is_active = 1;  			blitq->cur = cur;  			blitq->num_outstanding--; -			blitq->end = jiffies + DRM_HZ; +			blitq->end = jiffies + HZ;  			if (!timer_pending(&blitq->poll_timer))  				mod_timer(&blitq->poll_timer, jiffies + 1);  		} else { @@ -436,7 +436,7 @@ via_dmablit_sync(struct drm_device *dev, uint32_t handle, int engine)  	int ret = 0;  	if (via_dmablit_active(blitq, engine, handle, &queue)) { -		DRM_WAIT_ON(ret, *queue, 3 * DRM_HZ, +		DRM_WAIT_ON(ret, *queue, 3 * HZ,  			    !via_dmablit_active(blitq, engine, handle, NULL));  	}  	DRM_DEBUG("DMA blit sync handle 0x%x engine %d returned %d\n", @@ -521,7 +521,7 @@ via_dmablit_workqueue(struct work_struct *work)  		spin_unlock_irqrestore(&blitq->blit_lock, irqsave); -		DRM_WAKEUP(&blitq->busy_queue); +		wake_up(&blitq->busy_queue);  		via_free_sg_info(dev->pdev, cur_sg);  		kfree(cur_sg); @@ -561,8 +561,8 @@ via_init_dmablit(struct drm_device *dev)  		blitq->aborting = 0;  		spin_lock_init(&blitq->blit_lock);  		for (j = 0; j < VIA_NUM_BLIT_SLOTS; ++j) -			DRM_INIT_WAITQUEUE(blitq->blit_queue + j); -		DRM_INIT_WAITQUEUE(&blitq->busy_queue); +			init_waitqueue_head(blitq->blit_queue + j); +		init_waitqueue_head(&blitq->busy_queue);  		INIT_WORK(&blitq->wq, via_dmablit_workqueue);  		setup_timer(&blitq->poll_timer, via_dmablit_timer,  				(unsigned long)blitq); @@ -688,7 +688,7 @@ via_dmablit_grab_slot(drm_via_blitq_t *blitq, int engine)  	while (blitq->num_free == 0) {  		spin_unlock_irqrestore(&blitq->blit_lock, irqsave); -		DRM_WAIT_ON(ret, blitq->busy_queue, DRM_HZ, blitq->num_free > 0); +		DRM_WAIT_ON(ret, blitq->busy_queue, HZ, blitq->num_free > 0);  		if (ret)  			return (-EINTR == ret) ? -EAGAIN : ret; @@ -713,7 +713,7 @@ via_dmablit_release_slot(drm_via_blitq_t *blitq)  	spin_lock_irqsave(&blitq->blit_lock, irqsave);  	blitq->num_free++;  	spin_unlock_irqrestore(&blitq->blit_lock, irqsave); -	DRM_WAKEUP(&blitq->busy_queue); +	wake_up(&blitq->busy_queue);  }  /* diff --git a/drivers/gpu/drm/via/via_drv.c b/drivers/gpu/drm/via/via_drv.c index e1ff4e7a6eb..50abc2adfae 100644 --- a/drivers/gpu/drm/via/via_drv.c +++ b/drivers/gpu/drm/via/via_drv.c @@ -22,22 +22,63 @@   * DEALINGS IN THE SOFTWARE.   */ -#include "drmP.h" -#include "via_drm.h" +#include <linux/module.h> + +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h" -#include "drm_pciids.h" +#include <drm/drm_pciids.h> + +static int via_driver_open(struct drm_device *dev, struct drm_file *file) +{ +	struct via_file_private *file_priv; + +	DRM_DEBUG_DRIVER("\n"); +	file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL); +	if (!file_priv) +		return -ENOMEM; + +	file->driver_priv = file_priv; + +	INIT_LIST_HEAD(&file_priv->obj_list); + +	return 0; +} + +static void via_driver_postclose(struct drm_device *dev, struct drm_file *file) +{ +	struct via_file_private *file_priv = file->driver_priv; + +	kfree(file_priv); +}  static struct pci_device_id pciidlist[] = {  	viadrv_PCI_IDS  }; +static const struct file_operations via_driver_fops = { +	.owner = THIS_MODULE, +	.open = drm_open, +	.release = drm_release, +	.unlocked_ioctl = drm_ioctl, +	.mmap = drm_mmap, +	.poll = drm_poll, +#ifdef CONFIG_COMPAT +	.compat_ioctl = drm_compat_ioctl, +#endif +	.llseek = noop_llseek, +}; +  static struct drm_driver driver = {  	.driver_features = -	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_IRQ | +	    DRIVER_USE_AGP | DRIVER_HAVE_IRQ |  	    DRIVER_IRQ_SHARED,  	.load = via_driver_load,  	.unload = via_driver_unload, +	.open = via_driver_open, +	.preclose = via_reclaim_buffers_locked, +	.postclose = via_driver_postclose,  	.context_dtor = via_final_context,  	.get_vblank_counter = via_get_vblank_counter,  	.enable_vblank = via_enable_vblank, @@ -47,26 +88,9 @@ static struct drm_driver driver = {  	.irq_uninstall = via_driver_irq_uninstall,  	.irq_handler = via_driver_irq_handler,  	.dma_quiescent = via_driver_dma_quiescent, -	.reclaim_buffers = drm_core_reclaim_buffers, -	.reclaim_buffers_locked = NULL, -	.reclaim_buffers_idlelocked = via_reclaim_buffers_locked,  	.lastclose = via_lastclose,  	.ioctls = via_ioctls, -	.fops = { -		.owner = THIS_MODULE, -		.open = drm_open, -		.release = drm_release, -		.unlocked_ioctl = drm_ioctl, -		.mmap = drm_mmap, -		.poll = drm_poll, -		.fasync = drm_fasync, -		.llseek = noop_llseek, -		}, -	.pci_driver = { -		.name = DRIVER_NAME, -		.id_table = pciidlist, -	}, - +	.fops = &via_driver_fops,  	.name = DRIVER_NAME,  	.desc = DRIVER_DESC,  	.date = DRIVER_DATE, @@ -75,16 +99,21 @@ static struct drm_driver driver = {  	.patchlevel = DRIVER_PATCHLEVEL,  }; +static struct pci_driver via_pci_driver = { +	.name = DRIVER_NAME, +	.id_table = pciidlist, +}; +  static int __init via_init(void)  {  	driver.num_ioctls = via_max_ioctl;  	via_init_command_verifier(); -	return drm_init(&driver); +	return drm_pci_init(&driver, &via_pci_driver);  }  static void __exit via_exit(void)  { -	drm_exit(&driver); +	drm_pci_exit(&driver, &via_pci_driver);  }  module_init(via_init); diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h index 9cf87d91232..ad0273256be 100644 --- a/drivers/gpu/drm/via/via_drv.h +++ b/drivers/gpu/drm/via/via_drv.h @@ -24,7 +24,7 @@  #ifndef _VIA_DRV_H_  #define _VIA_DRV_H_ -#include "drm_sman.h" +#include <drm/drm_mm.h>  #define DRIVER_AUTHOR	"Various"  #define DRIVER_NAME		"via" @@ -88,9 +88,12 @@ typedef struct drm_via_private {  	uint32_t irq_pending_mask;  	int *irq_map;  	unsigned int idle_fault; -	struct drm_sman sman;  	int vram_initialized; +	struct drm_mm vram_mm;  	int agp_initialized; +	struct drm_mm agp_mm; +	/** Mapping of userspace keys to mm objects */ +	struct idr object_idr;  	unsigned long vram_offset;  	unsigned long agp_offset;  	drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES]; @@ -111,7 +114,7 @@ enum via_family {  #define VIA_READ8(reg)		DRM_READ8(VIA_BASE, reg)  #define VIA_WRITE8(reg, val)	DRM_WRITE8(VIA_BASE, reg, val) -extern struct drm_ioctl_desc via_ioctls[]; +extern const struct drm_ioctl_desc via_ioctls[];  extern int via_max_ioctl;  extern int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv); @@ -135,7 +138,7 @@ extern u32 via_get_vblank_counter(struct drm_device *dev, int crtc);  extern int via_enable_vblank(struct drm_device *dev, int crtc);  extern void via_disable_vblank(struct drm_device *dev, int crtc); -extern irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS); +extern irqreturn_t via_driver_irq_handler(int irq, void *arg);  extern void via_driver_irq_preinstall(struct drm_device *dev);  extern int via_driver_irq_postinstall(struct drm_device *dev);  extern void via_driver_irq_uninstall(struct drm_device *dev); diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c index d391f48ef87..1319433816d 100644 --- a/drivers/gpu/drm/via/via_irq.c +++ b/drivers/gpu/drm/via/via_irq.c @@ -35,9 +35,8 @@   * The refresh rate is also calculated for video playback sync purposes.   */ -#include "drmP.h" -#include "drm.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h"  #define VIA_REG_INTERRUPT       0x200 @@ -105,7 +104,7 @@ u32 via_get_vblank_counter(struct drm_device *dev, int crtc)  	return atomic_read(&dev_priv->vbl_received);  } -irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS) +irqreturn_t via_driver_irq_handler(int irq, void *arg)  {  	struct drm_device *dev = (struct drm_device *) arg;  	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; @@ -139,7 +138,7 @@ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)  	for (i = 0; i < dev_priv->num_irqs; ++i) {  		if (status & cur_irq->pending_mask) {  			atomic_inc(&cur_irq->irq_received); -			DRM_WAKEUP(&cur_irq->irq_queue); +			wake_up(&cur_irq->irq_queue);  			handled = 1;  			if (dev_priv->irq_map[drm_via_irq_dma0_td] == i)  				via_dmablit_handler(dev, 0, 1); @@ -240,12 +239,12 @@ via_driver_irq_wait(struct drm_device *dev, unsigned int irq, int force_sequence  	cur_irq = dev_priv->via_irqs + real_irq;  	if (masks[real_irq][2] && !force_sequence) { -		DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * DRM_HZ, +		DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ,  			    ((VIA_READ(masks[irq][2]) & masks[irq][3]) ==  			     masks[irq][4]));  		cur_irq_sequence = atomic_read(&cur_irq->irq_received);  	} else { -		DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * DRM_HZ, +		DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ,  			    (((cur_irq_sequence =  			       atomic_read(&cur_irq->irq_received)) -  			      *sequence) <= (1 << 23))); @@ -288,7 +287,7 @@ void via_driver_irq_preinstall(struct drm_device *dev)  			atomic_set(&cur_irq->irq_received, 0);  			cur_irq->enable_mask = dev_priv->irq_masks[i][0];  			cur_irq->pending_mask = dev_priv->irq_masks[i][1]; -			DRM_INIT_WAITQUEUE(&cur_irq->irq_queue); +			init_waitqueue_head(&cur_irq->irq_queue);  			dev_priv->irq_enable_mask |= cur_irq->enable_mask;  			dev_priv->irq_pending_mask |= cur_irq->pending_mask;  			cur_irq++; diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index 6cca9a709f7..d0ab3fb32ac 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c @@ -21,8 +21,8 @@   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER   * DEALINGS IN THE SOFTWARE.   */ -#include "drmP.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h"  static int via_do_init_map(struct drm_device *dev, drm_via_init_t *init) @@ -100,19 +100,15 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset)  	if (dev_priv == NULL)  		return -ENOMEM; +	idr_init(&dev_priv->object_idr);  	dev->dev_private = (void *)dev_priv;  	dev_priv->chipset = chipset; -	ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); -	if (ret) { -		kfree(dev_priv); -		return ret; -	} +	pci_set_master(dev->pdev);  	ret = drm_vblank_init(dev, 1);  	if (ret) { -		drm_sman_takedown(&dev_priv->sman);  		kfree(dev_priv);  		return ret;  	} @@ -124,7 +120,7 @@ int via_driver_unload(struct drm_device *dev)  {  	drm_via_private_t *dev_priv = dev->dev_private; -	drm_sman_takedown(&dev_priv->sman); +	idr_destroy(&dev_priv->object_idr);  	kfree(dev_priv); diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c index 6cc2dadae3e..d70b1e1544b 100644 --- a/drivers/gpu/drm/via/via_mm.c +++ b/drivers/gpu/drm/via/via_mm.c @@ -25,29 +25,25 @@   * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>   */ -#include "drmP.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h" -#include "drm_sman.h"  #define VIA_MM_ALIGN_SHIFT 4  #define VIA_MM_ALIGN_MASK ((1 << VIA_MM_ALIGN_SHIFT) - 1) +struct via_memblock { +	struct drm_mm_node mm_node; +	struct list_head owner_list; +}; +  int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)  {  	drm_via_agp_t *agp = data;  	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; -	int ret;  	mutex_lock(&dev->struct_mutex); -	ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_AGP, 0, -				 agp->size >> VIA_MM_ALIGN_SHIFT); - -	if (ret) { -		DRM_ERROR("AGP memory manager initialisation error\n"); -		mutex_unlock(&dev->struct_mutex); -		return ret; -	} +	drm_mm_init(&dev_priv->agp_mm, 0, agp->size >> VIA_MM_ALIGN_SHIFT);  	dev_priv->agp_initialized = 1;  	dev_priv->agp_offset = agp->offset; @@ -61,17 +57,9 @@ int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv)  {  	drm_via_fb_t *fb = data;  	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; -	int ret;  	mutex_lock(&dev->struct_mutex); -	ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_VIDEO, 0, -				 fb->size >> VIA_MM_ALIGN_SHIFT); - -	if (ret) { -		DRM_ERROR("VRAM memory manager initialisation error\n"); -		mutex_unlock(&dev->struct_mutex); -		return ret; -	} +	drm_mm_init(&dev_priv->vram_mm, 0, fb->size >> VIA_MM_ALIGN_SHIFT);  	dev_priv->vram_initialized = 1;  	dev_priv->vram_offset = fb->offset; @@ -91,7 +79,7 @@ int via_final_context(struct drm_device *dev, int context)  	/* Linux specific until context tracking code gets ported to BSD */  	/* Last context, perform cleanup */ -	if (dev->ctx_count == 1 && dev->dev_private) { +	if (list_is_singular(&dev->ctxlist)) {  		DRM_DEBUG("Last Context\n");  		drm_irq_uninstall(dev);  		via_cleanup_futex(dev_priv); @@ -108,19 +96,25 @@ void via_lastclose(struct drm_device *dev)  		return;  	mutex_lock(&dev->struct_mutex); -	drm_sman_cleanup(&dev_priv->sman); -	dev_priv->vram_initialized = 0; -	dev_priv->agp_initialized = 0; +	if (dev_priv->vram_initialized) { +		drm_mm_takedown(&dev_priv->vram_mm); +		dev_priv->vram_initialized = 0; +	} +	if (dev_priv->agp_initialized) { +		drm_mm_takedown(&dev_priv->agp_mm); +		dev_priv->agp_initialized = 0; +	}  	mutex_unlock(&dev->struct_mutex);  }  int via_mem_alloc(struct drm_device *dev, void *data, -		  struct drm_file *file_priv) +		  struct drm_file *file)  {  	drm_via_mem_t *mem = data; -	int retval = 0; -	struct drm_memblock_item *item; +	int retval = 0, user_key; +	struct via_memblock *item;  	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; +	struct via_file_private *file_priv = file->driver_priv;  	unsigned long tmpSize;  	if (mem->type > VIA_MEM_AGP) { @@ -136,24 +130,50 @@ int via_mem_alloc(struct drm_device *dev, void *data,  		return -EINVAL;  	} -	tmpSize = (mem->size + VIA_MM_ALIGN_MASK) >> VIA_MM_ALIGN_SHIFT; -	item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, -			      (unsigned long)file_priv); -	mutex_unlock(&dev->struct_mutex); -	if (item) { -		mem->offset = ((mem->type == VIA_MEM_VIDEO) ? -			      dev_priv->vram_offset : dev_priv->agp_offset) + -		    (item->mm-> -		     offset(item->mm, item->mm_info) << VIA_MM_ALIGN_SHIFT); -		mem->index = item->user_hash.key; -	} else { -		mem->offset = 0; -		mem->size = 0; -		mem->index = 0; -		DRM_DEBUG("Video memory allocation failed\n"); +	item = kzalloc(sizeof(*item), GFP_KERNEL); +	if (!item) {  		retval = -ENOMEM; +		goto fail_alloc;  	} +	tmpSize = (mem->size + VIA_MM_ALIGN_MASK) >> VIA_MM_ALIGN_SHIFT; +	if (mem->type == VIA_MEM_AGP) +		retval = drm_mm_insert_node(&dev_priv->agp_mm, +					    &item->mm_node, +					    tmpSize, 0, DRM_MM_SEARCH_DEFAULT); +	else +		retval = drm_mm_insert_node(&dev_priv->vram_mm, +					    &item->mm_node, +					    tmpSize, 0, DRM_MM_SEARCH_DEFAULT); +	if (retval) +		goto fail_alloc; + +	retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL); +	if (retval < 0) +		goto fail_idr; +	user_key = retval; + +	list_add(&item->owner_list, &file_priv->obj_list); +	mutex_unlock(&dev->struct_mutex); + +	mem->offset = ((mem->type == VIA_MEM_VIDEO) ? +		      dev_priv->vram_offset : dev_priv->agp_offset) + +	    ((item->mm_node.start) << VIA_MM_ALIGN_SHIFT); +	mem->index = user_key; + +	return 0; + +fail_idr: +	drm_mm_remove_node(&item->mm_node); +fail_alloc: +	kfree(item); +	mutex_unlock(&dev->struct_mutex); + +	mem->offset = 0; +	mem->size = 0; +	mem->index = 0; +	DRM_DEBUG("Video memory allocation failed\n"); +  	return retval;  } @@ -161,32 +181,57 @@ int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv)  {  	drm_via_private_t *dev_priv = dev->dev_private;  	drm_via_mem_t *mem = data; -	int ret; +	struct via_memblock *obj;  	mutex_lock(&dev->struct_mutex); -	ret = drm_sman_free_key(&dev_priv->sman, mem->index); +	obj = idr_find(&dev_priv->object_idr, mem->index); +	if (obj == NULL) { +		mutex_unlock(&dev->struct_mutex); +		return -EINVAL; +	} + +	idr_remove(&dev_priv->object_idr, mem->index); +	list_del(&obj->owner_list); +	drm_mm_remove_node(&obj->mm_node); +	kfree(obj);  	mutex_unlock(&dev->struct_mutex); +  	DRM_DEBUG("free = 0x%lx\n", mem->index); -	return ret; +	return 0;  }  void via_reclaim_buffers_locked(struct drm_device *dev, -				struct drm_file *file_priv) +				struct drm_file *file)  { -	drm_via_private_t *dev_priv = dev->dev_private; +	struct via_file_private *file_priv = file->driver_priv; +	struct via_memblock *entry, *next; + +	if (!(file->minor->master && file->master->lock.hw_lock)) +		return; + +	drm_idlelock_take(&file->master->lock);  	mutex_lock(&dev->struct_mutex); -	if (drm_sman_owner_clean(&dev_priv->sman, (unsigned long)file_priv)) { +	if (list_empty(&file_priv->obj_list)) {  		mutex_unlock(&dev->struct_mutex); +		drm_idlelock_release(&file->master->lock); +  		return;  	} -	if (dev->driver->dma_quiescent) -		dev->driver->dma_quiescent(dev); +	via_driver_dma_quiescent(dev); -	drm_sman_owner_cleanup(&dev_priv->sman, (unsigned long)file_priv); +	list_for_each_entry_safe(entry, next, &file_priv->obj_list, +				 owner_list) { +		list_del(&entry->owner_list); +		drm_mm_remove_node(&entry->mm_node); +		kfree(entry); +	}  	mutex_unlock(&dev->struct_mutex); + +	drm_idlelock_release(&file->master->lock); +  	return;  } diff --git a/drivers/gpu/drm/via/via_verifier.c b/drivers/gpu/drm/via/via_verifier.c index 48957b856d4..9dbc92bd151 100644 --- a/drivers/gpu/drm/via/via_verifier.c +++ b/drivers/gpu/drm/via/via_verifier.c @@ -29,9 +29,8 @@   */  #include "via_3d_reg.h" -#include "drmP.h" -#include "drm.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_verifier.h"  #include "via_drv.h" diff --git a/drivers/gpu/drm/via/via_video.c b/drivers/gpu/drm/via/via_video.c index 675d311f038..a9ffbad1cfd 100644 --- a/drivers/gpu/drm/via/via_video.c +++ b/drivers/gpu/drm/via/via_video.c @@ -25,8 +25,8 @@   * Video and XvMC related functions.   */ -#include "drmP.h" -#include "via_drm.h" +#include <drm/drmP.h> +#include <drm/via_drm.h>  #include "via_drv.h"  void via_init_futex(drm_via_private_t *dev_priv) @@ -36,7 +36,7 @@ void via_init_futex(drm_via_private_t *dev_priv)  	DRM_DEBUG("\n");  	for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) { -		DRM_INIT_WAITQUEUE(&(dev_priv->decoder_queue[i])); +		init_waitqueue_head(&(dev_priv->decoder_queue[i]));  		XVMCLOCKPTR(dev_priv->sarea_priv, i)->lock = 0;  	}  } @@ -58,7 +58,7 @@ void via_release_futex(drm_via_private_t *dev_priv, int context)  		if ((_DRM_LOCKING_CONTEXT(*lock) == context)) {  			if (_DRM_LOCK_IS_HELD(*lock)  			    && (*lock & _DRM_LOCK_CONT)) { -				DRM_WAKEUP(&(dev_priv->decoder_queue[i])); +				wake_up(&(dev_priv->decoder_queue[i]));  			}  			*lock = 0;  		} @@ -83,10 +83,10 @@ int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_  	switch (fx->func) {  	case VIA_FUTEX_WAIT:  		DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx->lock], -			    (fx->ms / 10) * (DRM_HZ / 100), *lock != fx->val); +			    (fx->ms / 10) * (HZ / 100), *lock != fx->val);  		return ret;  	case VIA_FUTEX_WAKE: -		DRM_WAKEUP(&(dev_priv->decoder_queue[fx->lock])); +		wake_up(&(dev_priv->decoder_queue[fx->lock]));  		return 0;  	}  	return 0;  | 
