aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/drm/drm_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/drm/drm_pci.c')
-rw-r--r--drivers/char/drm/drm_pci.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/char/drm/drm_pci.c b/drivers/char/drm/drm_pci.c
index 1fd7ff164817..86a0f1c22091 100644
--- a/drivers/char/drm/drm_pci.c
+++ b/drivers/char/drm/drm_pci.c
@@ -37,6 +37,7 @@
37 */ 37 */
38 38
39#include <linux/pci.h> 39#include <linux/pci.h>
40#include <linux/dma-mapping.h>
40#include "drmP.h" 41#include "drmP.h"
41 42
42/**********************************************************************/ 43/**********************************************************************/
@@ -50,6 +51,10 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
50 dma_addr_t maxaddr) 51 dma_addr_t maxaddr)
51{ 52{
52 drm_dma_handle_t *dmah; 53 drm_dma_handle_t *dmah;
54#if 1
55 unsigned long addr;
56 size_t sz;
57#endif
53#ifdef DRM_DEBUG_MEMORY 58#ifdef DRM_DEBUG_MEMORY
54 int area = DRM_MEM_DMA; 59 int area = DRM_MEM_DMA;
55 60
@@ -79,7 +84,7 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
79 return NULL; 84 return NULL;
80 85
81 dmah->size = size; 86 dmah->size = size;
82 dmah->vaddr = pci_alloc_consistent(dev->pdev, size, &dmah->busaddr); 87 dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL | __GFP_COMP);
83 88
84#ifdef DRM_DEBUG_MEMORY 89#ifdef DRM_DEBUG_MEMORY
85 if (dmah->vaddr == NULL) { 90 if (dmah->vaddr == NULL) {
@@ -104,18 +109,29 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
104 109
105 memset(dmah->vaddr, 0, size); 110 memset(dmah->vaddr, 0, size);
106 111
112 /* XXX - Is virt_to_page() legal for consistent mem? */
113 /* Reserve */
114 for (addr = (unsigned long)dmah->vaddr, sz = size;
115 sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
116 SetPageReserved(virt_to_page(addr));
117 }
118
107 return dmah; 119 return dmah;
108} 120}
109 121
110EXPORT_SYMBOL(drm_pci_alloc); 122EXPORT_SYMBOL(drm_pci_alloc);
111 123
112/** 124/**
113 * \brief Free a PCI consistent memory block with freeing its descriptor. 125 * \brief Free a PCI consistent memory block without freeing its descriptor.
114 * 126 *
115 * This function is for internal use in the Linux-specific DRM core code. 127 * This function is for internal use in the Linux-specific DRM core code.
116 */ 128 */
117void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah) 129void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah)
118{ 130{
131#if 1
132 unsigned long addr;
133 size_t sz;
134#endif
119#ifdef DRM_DEBUG_MEMORY 135#ifdef DRM_DEBUG_MEMORY
120 int area = DRM_MEM_DMA; 136 int area = DRM_MEM_DMA;
121 int alloc_count; 137 int alloc_count;
@@ -127,8 +143,14 @@ void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah)
127 DRM_MEM_ERROR(area, "Attempt to free address 0\n"); 143 DRM_MEM_ERROR(area, "Attempt to free address 0\n");
128#endif 144#endif
129 } else { 145 } else {
130 pci_free_consistent(dev->pdev, dmah->size, dmah->vaddr, 146 /* XXX - Is virt_to_page() legal for consistent mem? */
131 dmah->busaddr); 147 /* Unreserve */
148 for (addr = (unsigned long)dmah->vaddr, sz = dmah->size;
149 sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
150 ClearPageReserved(virt_to_page(addr));
151 }
152 dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr,
153 dmah->busaddr);
132 } 154 }
133 155
134#ifdef DRM_DEBUG_MEMORY 156#ifdef DRM_DEBUG_MEMORY