diff options
Diffstat (limited to 'bsd-core')
| -rw-r--r-- | bsd-core/ati_pcigart.c | 13 | ||||
| -rw-r--r-- | bsd-core/drm_bufs.c | 2 | ||||
| -rw-r--r-- | bsd-core/drm_pci.c | 13 | 
3 files changed, 20 insertions, 8 deletions
| diff --git a/bsd-core/ati_pcigart.c b/bsd-core/ati_pcigart.c index f8d3f18d..c4453ed5 100644 --- a/bsd-core/ati_pcigart.c +++ b/bsd-core/ati_pcigart.c @@ -42,12 +42,17 @@  static int drm_ati_alloc_pcigart_table(struct drm_device *dev,  				       struct drm_ati_pcigart_info *gart_info)  { -	dev->sg->dmah = drm_pci_alloc(dev, gart_info->table_size, -						PAGE_SIZE, -						gart_info->table_mask); -	if (dev->sg->dmah == NULL) +	drm_dma_handle_t *dmah; + +	DRM_UNLOCK(); +	dmah = drm_pci_alloc(dev, gart_info->table_size, PAGE_SIZE, +	    gart_info->table_mask); +	DRM_LOCK(); +	if (dmah == NULL)  		return ENOMEM; +	dev->sg->dmah = dmah; +  	return 0;  } diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index 45e01470..94f51386 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -595,8 +595,10 @@ static int drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *reque  	page_count = 0;  	while (entry->buf_count < count) { +		DRM_SPINUNLOCK(&dev->dma_lock);  		drm_dma_handle_t *dmah = drm_pci_alloc(dev, size, alignment,  		    0xfffffffful); +		DRM_SPINLOCK(&dev->dma_lock);  		if (dmah == NULL) {  			/* Set count correctly so we free the proper amount. */  			entry->buf_count = count; diff --git a/bsd-core/drm_pci.c b/bsd-core/drm_pci.c index f23b2a5b..16c830ec 100644 --- a/bsd-core/drm_pci.c +++ b/bsd-core/drm_pci.c @@ -71,7 +71,14 @@ drm_pci_alloc(struct drm_device *dev, size_t size,  		return NULL;  #ifdef __FreeBSD__ -	DRM_UNLOCK(); +	/* Make sure we aren't holding locks here */ +	mtx_assert(&dev->dev_lock, MA_NOTOWNED); +	if (mtx_owned(&dev->dev_lock)) +	    DRM_ERROR("called while holding dev_lock\n"); +	mtx_assert(&dev->dma_lock, MA_NOTOWNED); +	if (mtx_owned(&dev->dma_lock)) +	    DRM_ERROR("called while holding dma_lock\n"); +  	ret = bus_dma_tag_create(NULL, align, 0, /* tag, align, boundary */  	    maxaddr, BUS_SPACE_MAXADDR, /* lowaddr, highaddr */  	    NULL, NULL, /* filtfunc, filtfuncargs */ @@ -80,7 +87,6 @@ drm_pci_alloc(struct drm_device *dev, size_t size,  	    &dmah->tag);  	if (ret != 0) {  		free(dmah, M_DRM); -		DRM_LOCK();  		return NULL;  	} @@ -89,10 +95,9 @@ drm_pci_alloc(struct drm_device *dev, size_t size,  	if (ret != 0) {  		bus_dma_tag_destroy(dmah->tag);  		free(dmah, M_DRM); -		DRM_LOCK();  		return NULL;  	} -	DRM_LOCK(); +  	ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, size,  	    drm_pci_busdma_callback, dmah, 0);  	if (ret != 0) { | 
