diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/Makefile | 2 | ||||
| -rw-r--r-- | linux-core/drm_irq.c | 20 | ||||
| -rw-r--r-- | linux-core/drm_lock.c | 12 | ||||
| -rw-r--r-- | linux-core/drm_memory.c | 2 | ||||
| -rw-r--r-- | linux-core/drm_sysfs.c | 2 | ||||
| -rw-r--r-- | linux-core/drm_ttm.c | 6 | ||||
| -rw-r--r-- | linux-core/nouveau_sgdma.c | 8 | 
7 files changed, 33 insertions, 19 deletions
| diff --git a/linux-core/Makefile b/linux-core/Makefile index aa212cf9..66bc4f25 100644 --- a/linux-core/Makefile +++ b/linux-core/Makefile @@ -346,7 +346,7 @@ CONFIG_DRM_I915 := m  endif  endif -GIT_REVISION := $(shell cd "$(DRMSRCDIR)" && git-describe --abbrev=17) +GIT_REVISION := $(shell cd "$(DRMSRCDIR)" && git describe --abbrev=17)  ifneq ($(GIT_REVISION),)  EXTRA_CFLAGS+=-D"GIT_REVISION=\"$(GIT_REVISION)\""  endif diff --git a/linux-core/drm_irq.c b/linux-core/drm_irq.c index 800768ae..b317d863 100644 --- a/linux-core/drm_irq.c +++ b/linux-core/drm_irq.c @@ -841,27 +841,31 @@ static void drm_locked_tasklet_func(unsigned long data)  {  	struct drm_device *dev = (struct drm_device *)data;  	unsigned long irqflags; - +	void (*tasklet_func)(struct drm_device *); +	  	spin_lock_irqsave(&dev->tasklet_lock, irqflags); +	tasklet_func = dev->locked_tasklet_func; +	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); -	if (!dev->locked_tasklet_func || +	if (!tasklet_func ||  	    !drm_lock_take(&dev->primary->master->lock,  			   DRM_KERNEL_CONTEXT)) { -		spin_unlock_irqrestore(&dev->tasklet_lock, irqflags);  		return;  	}  	dev->primary->master->lock.lock_time = jiffies;  	atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); -	dev->locked_tasklet_func(dev); +	spin_lock_irqsave(&dev->tasklet_lock, irqflags); +	tasklet_func = dev->locked_tasklet_func; +	dev->locked_tasklet_func = NULL; +	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); +	 +	if (tasklet_func != NULL) +		tasklet_func(dev);  	drm_lock_free(&dev->primary->master->lock,  		      DRM_KERNEL_CONTEXT); - -	dev->locked_tasklet_func = NULL; - -	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags);  }  /** diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c index 59f95e4e..8dd2e5ee 100644 --- a/linux-core/drm_lock.c +++ b/linux-core/drm_lock.c @@ -158,6 +158,7 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)  	struct drm_lock *lock = data;  	struct drm_master *master = file_priv->master;  	unsigned long irqflags; +	void (*tasklet_func)(struct drm_device *);  	if (lock->context == DRM_KERNEL_CONTEXT) {  		DRM_ERROR("Process %d using kernel context %d\n", @@ -166,14 +167,11 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)  	}  	spin_lock_irqsave(&dev->tasklet_lock, irqflags); - -	if (dev->locked_tasklet_func) { -		dev->locked_tasklet_func(dev); - -		dev->locked_tasklet_func = NULL; -	} - +	tasklet_func = dev->locked_tasklet_func; +	dev->locked_tasklet_func = NULL;  	spin_unlock_irqrestore(&dev->tasklet_lock, irqflags); +	if (tasklet_func != NULL) +		tasklet_func(dev);  	atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); diff --git a/linux-core/drm_memory.c b/linux-core/drm_memory.c index fe648933..38b93bca 100644 --- a/linux-core/drm_memory.c +++ b/linux-core/drm_memory.c @@ -183,7 +183,7 @@ void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area)  	if (!(pt = kmalloc(size, GFP_KERNEL)))  		return NULL;  	if (oldpt && oldsize) { -		memcpy(pt, oldpt, oldsize); +		memcpy(pt, oldpt, DRM_MIN(oldsize,size));  		kfree(oldpt);  	}  	return pt; diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c index 3b217342..f5366e8c 100644 --- a/linux-core/drm_sysfs.c +++ b/linux-core/drm_sysfs.c @@ -511,7 +511,7 @@ int drm_sysfs_device_add(struct drm_minor *minor)  err_out_files:  	if (i > 0)  		for (j = 0; j < i; j++) -			device_remove_file(&minor->kdev, &dri_attrs[i]); +			device_remove_file(&minor->kdev, &dri_attrs[j]);  	device_unregister(&minor->kdev);  err_out: diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index aa137dda..054a7ce8 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -72,7 +72,11 @@ void drm_ttm_cache_flush(struct page *pages[], unsigned long num_pages)  		return;  	}  #endif -	if (drm_on_each_cpu(drm_ttm_ipi_handler, NULL, 1) != 0) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +	if (on_each_cpu(drm_ttm_ipi_handler, NULL, 1)) +#else + 	if (on_each_cpu(drm_ttm_ipi_handler, NULL, 1, 1) != 0) +#endif  		DRM_ERROR("Timed out waiting for drm cache flush.\n");  }  EXPORT_SYMBOL(drm_ttm_cache_flush); diff --git a/linux-core/nouveau_sgdma.c b/linux-core/nouveau_sgdma.c index cc4d5a92..739e0252 100644 --- a/linux-core/nouveau_sgdma.c +++ b/linux-core/nouveau_sgdma.c @@ -48,7 +48,11 @@ nouveau_sgdma_populate(struct drm_ttm_backend *be, unsigned long num_pages,  							 page, o,  							 NV_CTXDMA_PAGE_SIZE,  							 PCI_DMA_BIDIRECTIONAL); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +			if (pci_dma_mapping_error(nvbe->dev->pdev, nvbe->pagelist[d])) { +#else  			if (pci_dma_mapping_error(nvbe->pagelist[d])) { +#endif  				be->func->clear(be);  				DRM_ERROR("pci_map_page failed\n");  				return -EINVAL; @@ -223,7 +227,11 @@ nouveau_sgdma_init(struct drm_device *dev)  	dev_priv->gart_info.sg_dummy_page =  		alloc_page(GFP_KERNEL|__GFP_DMA32); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +	set_page_locked(dev_priv->gart_info.sg_dummy_page); +#else  	SetPageLocked(dev_priv->gart_info.sg_dummy_page); +#endif  	dev_priv->gart_info.sg_dummy_bus =  		pci_map_page(dev->pdev, dev_priv->gart_info.sg_dummy_page, 0,  			     PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); | 
