diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-23 13:46:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-23 13:46:21 -0400 |
| commit | f70f97546800c5dfaf8c580db90df02c824a937a (patch) | |
| tree | ec83ea53f628669b8ddcd51a9cd5a8344a2a4a55 | |
| parent | 69dd3d8e29e294caaf63eb5e8a72d250279f9e5f (diff) | |
| parent | f2b60717e692550bf753a5d64a5b69ea430fc832 (diff) | |
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
drm/radeon: Extended DDC Probing for Toshiba L300D Radeon Mobility X1100 HDMI-A Connector
drm/ttm: ensure ttm for new node is bound before calling move_notify()
drm/ttm: unbind ttm before destroying node in accel move cleanup
drm/ttm: fix ttm_bo_add_ttm(user) failure path
drm/radeon: Make vramlimit parameter actually work.
drm/radeon: Explicitly print GTT/VRAM offsets on test failure.
drm/radeon: Take IH ring into account for test size calculation.
drm/radeon/alpha: Add Alpha support to Radeon DRM code
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_test.c | 34 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 2 |
6 files changed, 70 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 7f65940f918f..4f0c1ecac72e 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -466,6 +466,16 @@ static bool radeon_connector_needs_extended_probe(struct radeon_device *dev, | |||
| 466 | (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) | 466 | (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) |
| 467 | return true; | 467 | return true; |
| 468 | } | 468 | } |
| 469 | /* TOSHIBA Satellite L300D with ATI Mobility Radeon x1100 | ||
| 470 | * (RS690M) sends data to i2c bus for a HDMI connector that | ||
| 471 | * is not implemented */ | ||
| 472 | if ((dev->pdev->device == 0x791f) && | ||
| 473 | (dev->pdev->subsystem_vendor == 0x1179) && | ||
| 474 | (dev->pdev->subsystem_device == 0xff68)) { | ||
| 475 | if ((connector_type == DRM_MODE_CONNECTOR_HDMIA) && | ||
| 476 | (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) | ||
| 477 | return true; | ||
| 478 | } | ||
| 469 | 479 | ||
| 470 | /* Default: no EDID header probe required for DDC probing */ | 480 | /* Default: no EDID header probe required for DDC probing */ |
| 471 | return false; | 481 | return false; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index a3b011b49465..b51e15725c6e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -301,6 +301,8 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 | |||
| 301 | mc->mc_vram_size = mc->aper_size; | 301 | mc->mc_vram_size = mc->aper_size; |
| 302 | } | 302 | } |
| 303 | mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; | 303 | mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; |
| 304 | if (radeon_vram_limit && radeon_vram_limit < mc->real_vram_size) | ||
| 305 | mc->real_vram_size = radeon_vram_limit; | ||
| 304 | dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", | 306 | dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", |
| 305 | mc->mc_vram_size >> 20, mc->vram_start, | 307 | mc->mc_vram_size >> 20, mc->vram_start, |
| 306 | mc->vram_end, mc->real_vram_size >> 20); | 308 | mc->vram_end, mc->real_vram_size >> 20); |
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index dee4a0c1b4b2..602fa3541c45 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c | |||
| @@ -40,10 +40,14 @@ void radeon_test_moves(struct radeon_device *rdev) | |||
| 40 | size = 1024 * 1024; | 40 | size = 1024 * 1024; |
| 41 | 41 | ||
| 42 | /* Number of tests = | 42 | /* Number of tests = |
| 43 | * (Total GTT - IB pool - writeback page - ring buffer) / test size | 43 | * (Total GTT - IB pool - writeback page - ring buffers) / test size |
| 44 | */ | 44 | */ |
| 45 | n = ((u32)(rdev->mc.gtt_size - RADEON_IB_POOL_SIZE*64*1024 - RADEON_GPU_PAGE_SIZE - | 45 | n = rdev->mc.gtt_size - RADEON_IB_POOL_SIZE*64*1024 - rdev->cp.ring_size; |
| 46 | rdev->cp.ring_size)) / size; | 46 | if (rdev->wb.wb_obj) |
| 47 | n -= RADEON_GPU_PAGE_SIZE; | ||
| 48 | if (rdev->ih.ring_obj) | ||
| 49 | n -= rdev->ih.ring_size; | ||
| 50 | n /= size; | ||
| 47 | 51 | ||
| 48 | gtt_obj = kzalloc(n * sizeof(*gtt_obj), GFP_KERNEL); | 52 | gtt_obj = kzalloc(n * sizeof(*gtt_obj), GFP_KERNEL); |
| 49 | if (!gtt_obj) { | 53 | if (!gtt_obj) { |
| @@ -132,9 +136,15 @@ void radeon_test_moves(struct radeon_device *rdev) | |||
| 132 | gtt_start++, vram_start++) { | 136 | gtt_start++, vram_start++) { |
| 133 | if (*vram_start != gtt_start) { | 137 | if (*vram_start != gtt_start) { |
| 134 | DRM_ERROR("Incorrect GTT->VRAM copy %d: Got 0x%p, " | 138 | DRM_ERROR("Incorrect GTT->VRAM copy %d: Got 0x%p, " |
| 135 | "expected 0x%p (GTT map 0x%p-0x%p)\n", | 139 | "expected 0x%p (GTT/VRAM offset " |
| 136 | i, *vram_start, gtt_start, gtt_map, | 140 | "0x%16llx/0x%16llx)\n", |
| 137 | gtt_end); | 141 | i, *vram_start, gtt_start, |
| 142 | (unsigned long long) | ||
| 143 | (gtt_addr - rdev->mc.gtt_start + | ||
| 144 | (void*)gtt_start - gtt_map), | ||
| 145 | (unsigned long long) | ||
| 146 | (vram_addr - rdev->mc.vram_start + | ||
| 147 | (void*)gtt_start - gtt_map)); | ||
| 138 | radeon_bo_kunmap(vram_obj); | 148 | radeon_bo_kunmap(vram_obj); |
| 139 | goto out_cleanup; | 149 | goto out_cleanup; |
| 140 | } | 150 | } |
| @@ -175,9 +185,15 @@ void radeon_test_moves(struct radeon_device *rdev) | |||
| 175 | gtt_start++, vram_start++) { | 185 | gtt_start++, vram_start++) { |
| 176 | if (*gtt_start != vram_start) { | 186 | if (*gtt_start != vram_start) { |
| 177 | DRM_ERROR("Incorrect VRAM->GTT copy %d: Got 0x%p, " | 187 | DRM_ERROR("Incorrect VRAM->GTT copy %d: Got 0x%p, " |
| 178 | "expected 0x%p (VRAM map 0x%p-0x%p)\n", | 188 | "expected 0x%p (VRAM/GTT offset " |
| 179 | i, *gtt_start, vram_start, vram_map, | 189 | "0x%16llx/0x%16llx)\n", |
| 180 | vram_end); | 190 | i, *gtt_start, vram_start, |
| 191 | (unsigned long long) | ||
| 192 | (vram_addr - rdev->mc.vram_start + | ||
| 193 | (void*)vram_start - vram_map), | ||
| 194 | (unsigned long long) | ||
| 195 | (gtt_addr - rdev->mc.gtt_start + | ||
| 196 | (void*)vram_start - vram_map)); | ||
| 181 | radeon_bo_kunmap(gtt_obj[i]); | 197 | radeon_bo_kunmap(gtt_obj[i]); |
| 182 | goto out_cleanup; | 198 | goto out_cleanup; |
| 183 | } | 199 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 60125ddba1e9..9b86fb0e4122 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -450,6 +450,29 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_ | |||
| 450 | return -EINVAL; | 450 | return -EINVAL; |
| 451 | mem->bus.base = rdev->mc.aper_base; | 451 | mem->bus.base = rdev->mc.aper_base; |
| 452 | mem->bus.is_iomem = true; | 452 | mem->bus.is_iomem = true; |
| 453 | #ifdef __alpha__ | ||
| 454 | /* | ||
| 455 | * Alpha: use bus.addr to hold the ioremap() return, | ||
| 456 | * so we can modify bus.base below. | ||
| 457 | */ | ||
| 458 | if (mem->placement & TTM_PL_FLAG_WC) | ||
| 459 | mem->bus.addr = | ||
| 460 | ioremap_wc(mem->bus.base + mem->bus.offset, | ||
| 461 | mem->bus.size); | ||
| 462 | else | ||
| 463 | mem->bus.addr = | ||
| 464 | ioremap_nocache(mem->bus.base + mem->bus.offset, | ||
| 465 | mem->bus.size); | ||
| 466 | |||
| 467 | /* | ||
| 468 | * Alpha: Use just the bus offset plus | ||
| 469 | * the hose/domain memory base for bus.base. | ||
| 470 | * It then can be used to build PTEs for VRAM | ||
| 471 | * access, as done in ttm_bo_vm_fault(). | ||
| 472 | */ | ||
| 473 | mem->bus.base = (mem->bus.base & 0x0ffffffffUL) + | ||
| 474 | rdev->ddev->hose->dense_mem_base; | ||
| 475 | #endif | ||
| 453 | break; | 476 | break; |
| 454 | default: | 477 | default: |
| 455 | return -EINVAL; | 478 | return -EINVAL; |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 56619f64b6bf..a4d38d85909a 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
| @@ -353,8 +353,10 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc) | |||
| 353 | 353 | ||
| 354 | ret = ttm_tt_set_user(bo->ttm, current, | 354 | ret = ttm_tt_set_user(bo->ttm, current, |
| 355 | bo->buffer_start, bo->num_pages); | 355 | bo->buffer_start, bo->num_pages); |
| 356 | if (unlikely(ret != 0)) | 356 | if (unlikely(ret != 0)) { |
| 357 | ttm_tt_destroy(bo->ttm); | 357 | ttm_tt_destroy(bo->ttm); |
| 358 | bo->ttm = NULL; | ||
| 359 | } | ||
| 358 | break; | 360 | break; |
| 359 | default: | 361 | default: |
| 360 | printk(KERN_ERR TTM_PFX "Illegal buffer object type\n"); | 362 | printk(KERN_ERR TTM_PFX "Illegal buffer object type\n"); |
| @@ -390,10 +392,12 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, | |||
| 390 | * Create and bind a ttm if required. | 392 | * Create and bind a ttm if required. |
| 391 | */ | 393 | */ |
| 392 | 394 | ||
| 393 | if (!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED) && (bo->ttm == NULL)) { | 395 | if (!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) { |
| 394 | ret = ttm_bo_add_ttm(bo, false); | 396 | if (bo->ttm == NULL) { |
| 395 | if (ret) | 397 | ret = ttm_bo_add_ttm(bo, false); |
| 396 | goto out_err; | 398 | if (ret) |
| 399 | goto out_err; | ||
| 400 | } | ||
| 397 | 401 | ||
| 398 | ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); | 402 | ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); |
| 399 | if (ret) | 403 | if (ret) |
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 77dbf408c0d0..ae3c6f5dd2b7 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c | |||
| @@ -635,13 +635,13 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo, | |||
| 635 | if (ret) | 635 | if (ret) |
| 636 | return ret; | 636 | return ret; |
| 637 | 637 | ||
| 638 | ttm_bo_free_old_node(bo); | ||
| 639 | if ((man->flags & TTM_MEMTYPE_FLAG_FIXED) && | 638 | if ((man->flags & TTM_MEMTYPE_FLAG_FIXED) && |
| 640 | (bo->ttm != NULL)) { | 639 | (bo->ttm != NULL)) { |
| 641 | ttm_tt_unbind(bo->ttm); | 640 | ttm_tt_unbind(bo->ttm); |
| 642 | ttm_tt_destroy(bo->ttm); | 641 | ttm_tt_destroy(bo->ttm); |
| 643 | bo->ttm = NULL; | 642 | bo->ttm = NULL; |
| 644 | } | 643 | } |
| 644 | ttm_bo_free_old_node(bo); | ||
| 645 | } else { | 645 | } else { |
| 646 | /** | 646 | /** |
| 647 | * This should help pipeline ordinary buffer moves. | 647 | * This should help pipeline ordinary buffer moves. |
