diff options
Diffstat (limited to 'drivers/char/drm/drm_pci.c')
-rw-r--r-- | drivers/char/drm/drm_pci.c | 30 |
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 | ||
110 | EXPORT_SYMBOL(drm_pci_alloc); | 122 | EXPORT_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 | */ |
117 | void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah) | 129 | void __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 |