|
@@ -46,10 +46,10 @@
|
|
/**
|
|
/**
|
|
* \brief Allocate a PCI consistent memory block, for DMA.
|
|
* \brief Allocate a PCI consistent memory block, for DMA.
|
|
*/
|
|
*/
|
|
-void *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
|
|
|
|
- dma_addr_t maxaddr, dma_addr_t * busaddr)
|
|
|
|
|
|
+drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
|
|
|
|
+ dma_addr_t maxaddr)
|
|
{
|
|
{
|
|
- void *address;
|
|
|
|
|
|
+ drm_dma_handle_t *dmah;
|
|
#if DRM_DEBUG_MEMORY
|
|
#if DRM_DEBUG_MEMORY
|
|
int area = DRM_MEM_DMA;
|
|
int area = DRM_MEM_DMA;
|
|
|
|
|
|
@@ -74,13 +74,19 @@ void *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
- address = pci_alloc_consistent(dev->pdev, size, busaddr);
|
|
|
|
|
|
+ dmah = kmalloc(sizeof(drm_dma_handle_t), GFP_KERNEL);
|
|
|
|
+ if (!dmah)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ dmah->size = size;
|
|
|
|
+ dmah->vaddr = pci_alloc_consistent(dev->pdev, size, &dmah->busaddr);
|
|
|
|
|
|
#if DRM_DEBUG_MEMORY
|
|
#if DRM_DEBUG_MEMORY
|
|
- if (address == NULL) {
|
|
|
|
|
|
+ if (dmah->vaddr == NULL) {
|
|
spin_lock(&drm_mem_lock);
|
|
spin_lock(&drm_mem_lock);
|
|
++drm_mem_stats[area].fail_count;
|
|
++drm_mem_stats[area].fail_count;
|
|
spin_unlock(&drm_mem_lock);
|
|
spin_unlock(&drm_mem_lock);
|
|
|
|
+ kfree(dmah);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,21 +96,25 @@ void *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
|
|
drm_ram_used += size;
|
|
drm_ram_used += size;
|
|
spin_unlock(&drm_mem_lock);
|
|
spin_unlock(&drm_mem_lock);
|
|
#else
|
|
#else
|
|
- if (address == NULL)
|
|
|
|
|
|
+ if (dmah->vaddr == NULL) {
|
|
|
|
+ kfree(dmah);
|
|
return NULL;
|
|
return NULL;
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- memset(address, 0, size);
|
|
|
|
|
|
+ memset(dmah->vaddr, 0, size);
|
|
|
|
|
|
- return address;
|
|
|
|
|
|
+ return dmah;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_pci_alloc);
|
|
EXPORT_SYMBOL(drm_pci_alloc);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * \brief Free a PCI consistent memory block.
|
|
|
|
|
|
+ * \brief Free a PCI consistent memory block with freeing its descriptor.
|
|
|
|
+ *
|
|
|
|
+ * This function is for internal use in the Linux-specific DRM core code.
|
|
*/
|
|
*/
|
|
void
|
|
void
|
|
-drm_pci_free(drm_device_t * dev, size_t size, void *vaddr, dma_addr_t busaddr)
|
|
|
|
|
|
+__drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah)
|
|
{
|
|
{
|
|
#if DRM_DEBUG_MEMORY
|
|
#if DRM_DEBUG_MEMORY
|
|
int area = DRM_MEM_DMA;
|
|
int area = DRM_MEM_DMA;
|
|
@@ -112,12 +122,13 @@ drm_pci_free(drm_device_t * dev, size_t size, void *vaddr, dma_addr_t busaddr)
|
|
int free_count;
|
|
int free_count;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- if (!vaddr) {
|
|
|
|
|
|
+ if (!dmah->vaddr) {
|
|
#if DRM_DEBUG_MEMORY
|
|
#if DRM_DEBUG_MEMORY
|
|
DRM_MEM_ERROR(area, "Attempt to free address 0\n");
|
|
DRM_MEM_ERROR(area, "Attempt to free address 0\n");
|
|
#endif
|
|
#endif
|
|
} else {
|
|
} else {
|
|
- pci_free_consistent(dev->pdev, size, vaddr, busaddr);
|
|
|
|
|
|
+ pci_free_consistent(dev->pdev, dmah->size, dmah->vaddr,
|
|
|
|
+ dmah->busaddr);
|
|
}
|
|
}
|
|
|
|
|
|
#if DRM_DEBUG_MEMORY
|
|
#if DRM_DEBUG_MEMORY
|
|
@@ -135,6 +146,16 @@ drm_pci_free(drm_device_t * dev, size_t size, void *vaddr, dma_addr_t busaddr)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * \brief Free a PCI consistent memory block
|
|
|
|
+ */
|
|
|
|
+void
|
|
|
|
+drm_pci_free(drm_device_t *dev, drm_dma_handle_t *dmah)
|
|
|
|
+{
|
|
|
|
+ __drm_pci_free(dev, dmah);
|
|
|
|
+ kfree(dmah);
|
|
|
|
+}
|
|
EXPORT_SYMBOL(drm_pci_free);
|
|
EXPORT_SYMBOL(drm_pci_free);
|
|
|
|
|
|
/*@}*/
|
|
/*@}*/
|