aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_gart.c
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-10-17 17:15:08 -0400
committerDave Airlie <airlied@redhat.com>2011-12-06 05:39:44 -0500
commitc52494f69538f6fe1a234972f024011b17a48329 (patch)
treecb532a596f4c06b7b2efc05e887cfa78940348fa /drivers/gpu/drm/radeon/radeon_gart.c
parent2334b75ffbef6b8932f09ec4418b65ddb764ae99 (diff)
drm/radeon/kms: enable the ttm dma pool if swiotlb is on V4
With the exception that we do not handle the AGP case. We only deal with PCIe cards such as ATI ES1000 or HD3200 that have been detected to only do DMA up to 32-bits. V2 force dma32 if we fail to set bigger dma mask V3 Rebase on top of no memory account changes (where/when is my delorean when i need it ?) V4 add debugfs entry is swiotlb is active not only if we are on dma 32bits only gpu CC: Dave Airlie <airlied@redhat.com> CC: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gart.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c29
1 files changed, 1 insertions, 28 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index ba7ab79e12c..a4d98160858 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -157,9 +157,6 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
157 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 157 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
158 for (i = 0; i < pages; i++, p++) { 158 for (i = 0; i < pages; i++, p++) {
159 if (rdev->gart.pages[p]) { 159 if (rdev->gart.pages[p]) {
160 if (!rdev->gart.ttm_alloced[p])
161 pci_unmap_page(rdev->pdev, rdev->gart.pages_addr[p],
162 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
163 rdev->gart.pages[p] = NULL; 160 rdev->gart.pages[p] = NULL;
164 rdev->gart.pages_addr[p] = rdev->dummy_page.addr; 161 rdev->gart.pages_addr[p] = rdev->dummy_page.addr;
165 page_base = rdev->gart.pages_addr[p]; 162 page_base = rdev->gart.pages_addr[p];
@@ -191,23 +188,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
191 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 188 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
192 189
193 for (i = 0; i < pages; i++, p++) { 190 for (i = 0; i < pages; i++, p++) {
194 /* we reverted the patch using dma_addr in TTM for now but this 191 rdev->gart.pages_addr[p] = dma_addr[i];
195 * code stops building on alpha so just comment it out for now */
196 if (0) { /*dma_addr[i] != DMA_ERROR_CODE) */
197 rdev->gart.ttm_alloced[p] = true;
198 rdev->gart.pages_addr[p] = dma_addr[i];
199 } else {
200 /* we need to support large memory configurations */
201 /* assume that unbind have already been call on the range */
202 rdev->gart.pages_addr[p] = pci_map_page(rdev->pdev, pagelist[i],
203 0, PAGE_SIZE,
204 PCI_DMA_BIDIRECTIONAL);
205 if (pci_dma_mapping_error(rdev->pdev, rdev->gart.pages_addr[p])) {
206 /* FIXME: failed to map page (return -ENOMEM?) */
207 radeon_gart_unbind(rdev, offset, pages);
208 return -ENOMEM;
209 }
210 }
211 rdev->gart.pages[p] = pagelist[i]; 192 rdev->gart.pages[p] = pagelist[i];
212 if (rdev->gart.ptr) { 193 if (rdev->gart.ptr) {
213 page_base = rdev->gart.pages_addr[p]; 194 page_base = rdev->gart.pages_addr[p];
@@ -274,12 +255,6 @@ int radeon_gart_init(struct radeon_device *rdev)
274 radeon_gart_fini(rdev); 255 radeon_gart_fini(rdev);
275 return -ENOMEM; 256 return -ENOMEM;
276 } 257 }
277 rdev->gart.ttm_alloced = kzalloc(sizeof(bool) *
278 rdev->gart.num_cpu_pages, GFP_KERNEL);
279 if (rdev->gart.ttm_alloced == NULL) {
280 radeon_gart_fini(rdev);
281 return -ENOMEM;
282 }
283 /* set GART entry to point to the dummy page by default */ 258 /* set GART entry to point to the dummy page by default */
284 for (i = 0; i < rdev->gart.num_cpu_pages; i++) { 259 for (i = 0; i < rdev->gart.num_cpu_pages; i++) {
285 rdev->gart.pages_addr[i] = rdev->dummy_page.addr; 260 rdev->gart.pages_addr[i] = rdev->dummy_page.addr;
@@ -296,10 +271,8 @@ void radeon_gart_fini(struct radeon_device *rdev)
296 rdev->gart.ready = false; 271 rdev->gart.ready = false;
297 kfree(rdev->gart.pages); 272 kfree(rdev->gart.pages);
298 kfree(rdev->gart.pages_addr); 273 kfree(rdev->gart.pages_addr);
299 kfree(rdev->gart.ttm_alloced);
300 rdev->gart.pages = NULL; 274 rdev->gart.pages = NULL;
301 rdev->gart.pages_addr = NULL; 275 rdev->gart.pages_addr = NULL;
302 rdev->gart.ttm_alloced = NULL;
303 276
304 radeon_dummy_page_fini(rdev); 277 radeon_dummy_page_fini(rdev);
305} 278}