diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-06-05 13:53:26 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-06-05 13:53:26 -0400 |
| commit | f80c43efb3f568acc1ff12731ecf2b4da4b2fe5c (patch) | |
| tree | ff1523359cbb2b97d23dc874734fbff2ca31469c | |
| parent | fffaee365fded09f9ebf2db19066065fa54323c3 (diff) | |
| parent | 7aaa61b3476462b69f1ac7669fcca8d608ce3cb5 (diff) | |
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm radeon fixes from Dave Airlie:
"This is just radeon fixes and a bunch of new PCI ids. The fixes are
for a deadlock, an audio regression, and a couple of audio fixes."
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
drm/radeon/kms: add new SI PCI ids
drm/radeon/kms: add new BTC PCI ids
drm/radeon/kms: add new Palm, Sumo PCI ids
drm/radeon/kms: add new Trinity PCI ids
drm/radeon: fix vm deadlocks on cayman
drm/radeon: fix gpu_init on si
drm/radeon/hdmi: don't set SEND_MAX_PACKETS bit
drm/radeon/audio: don't hardcode CRTC id
drm/radeon: make audio_init consistent across asics
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_audio.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_kms.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs690.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 477 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 19 | ||||
| -rw-r--r-- | include/drm/drm_pciids.h | 17 |
13 files changed, 255 insertions, 368 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 3df4efa11942..3186522a4458 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -460,15 +460,28 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
| 460 | rdev->config.cayman.max_pipes_per_simd = 4; | 460 | rdev->config.cayman.max_pipes_per_simd = 4; |
| 461 | rdev->config.cayman.max_tile_pipes = 2; | 461 | rdev->config.cayman.max_tile_pipes = 2; |
| 462 | if ((rdev->pdev->device == 0x9900) || | 462 | if ((rdev->pdev->device == 0x9900) || |
| 463 | (rdev->pdev->device == 0x9901)) { | 463 | (rdev->pdev->device == 0x9901) || |
| 464 | (rdev->pdev->device == 0x9905) || | ||
| 465 | (rdev->pdev->device == 0x9906) || | ||
| 466 | (rdev->pdev->device == 0x9907) || | ||
| 467 | (rdev->pdev->device == 0x9908) || | ||
| 468 | (rdev->pdev->device == 0x9909) || | ||
| 469 | (rdev->pdev->device == 0x9910) || | ||
| 470 | (rdev->pdev->device == 0x9917)) { | ||
| 464 | rdev->config.cayman.max_simds_per_se = 6; | 471 | rdev->config.cayman.max_simds_per_se = 6; |
| 465 | rdev->config.cayman.max_backends_per_se = 2; | 472 | rdev->config.cayman.max_backends_per_se = 2; |
| 466 | } else if ((rdev->pdev->device == 0x9903) || | 473 | } else if ((rdev->pdev->device == 0x9903) || |
| 467 | (rdev->pdev->device == 0x9904)) { | 474 | (rdev->pdev->device == 0x9904) || |
| 475 | (rdev->pdev->device == 0x990A) || | ||
| 476 | (rdev->pdev->device == 0x9913) || | ||
| 477 | (rdev->pdev->device == 0x9918)) { | ||
| 468 | rdev->config.cayman.max_simds_per_se = 4; | 478 | rdev->config.cayman.max_simds_per_se = 4; |
| 469 | rdev->config.cayman.max_backends_per_se = 2; | 479 | rdev->config.cayman.max_backends_per_se = 2; |
| 470 | } else if ((rdev->pdev->device == 0x9990) || | 480 | } else if ((rdev->pdev->device == 0x9919) || |
| 471 | (rdev->pdev->device == 0x9991)) { | 481 | (rdev->pdev->device == 0x9990) || |
| 482 | (rdev->pdev->device == 0x9991) || | ||
| 483 | (rdev->pdev->device == 0x9994) || | ||
| 484 | (rdev->pdev->device == 0x99A0)) { | ||
| 472 | rdev->config.cayman.max_simds_per_se = 3; | 485 | rdev->config.cayman.max_simds_per_se = 3; |
| 473 | rdev->config.cayman.max_backends_per_se = 1; | 486 | rdev->config.cayman.max_backends_per_se = 1; |
| 474 | } else { | 487 | } else { |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 45cfcea63507..f30dc95f83b1 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2426,6 +2426,12 @@ int r600_startup(struct radeon_device *rdev) | |||
| 2426 | if (r) | 2426 | if (r) |
| 2427 | return r; | 2427 | return r; |
| 2428 | 2428 | ||
| 2429 | r = r600_audio_init(rdev); | ||
| 2430 | if (r) { | ||
| 2431 | DRM_ERROR("radeon: audio init failed\n"); | ||
| 2432 | return r; | ||
| 2433 | } | ||
| 2434 | |||
| 2429 | return 0; | 2435 | return 0; |
| 2430 | } | 2436 | } |
| 2431 | 2437 | ||
| @@ -2462,12 +2468,6 @@ int r600_resume(struct radeon_device *rdev) | |||
| 2462 | return r; | 2468 | return r; |
| 2463 | } | 2469 | } |
| 2464 | 2470 | ||
| 2465 | r = r600_audio_init(rdev); | ||
| 2466 | if (r) { | ||
| 2467 | DRM_ERROR("radeon: audio resume failed\n"); | ||
| 2468 | return r; | ||
| 2469 | } | ||
| 2470 | |||
| 2471 | return r; | 2471 | return r; |
| 2472 | } | 2472 | } |
| 2473 | 2473 | ||
| @@ -2577,9 +2577,6 @@ int r600_init(struct radeon_device *rdev) | |||
| 2577 | rdev->accel_working = false; | 2577 | rdev->accel_working = false; |
| 2578 | } | 2578 | } |
| 2579 | 2579 | ||
| 2580 | r = r600_audio_init(rdev); | ||
| 2581 | if (r) | ||
| 2582 | return r; /* TODO error handling */ | ||
| 2583 | return 0; | 2580 | return 0; |
| 2584 | } | 2581 | } |
| 2585 | 2582 | ||
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 7c4fa77f018f..7479a5c503e4 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -192,6 +192,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock) | |||
| 192 | struct radeon_device *rdev = dev->dev_private; | 192 | struct radeon_device *rdev = dev->dev_private; |
| 193 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 193 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 194 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 194 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 195 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); | ||
| 195 | int base_rate = 48000; | 196 | int base_rate = 48000; |
| 196 | 197 | ||
| 197 | switch (radeon_encoder->encoder_id) { | 198 | switch (radeon_encoder->encoder_id) { |
| @@ -217,8 +218,8 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock) | |||
| 217 | WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10); | 218 | WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10); |
| 218 | WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071); | 219 | WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071); |
| 219 | 220 | ||
| 220 | /* Some magic trigger or src sel? */ | 221 | /* Select DTO source */ |
| 221 | WREG32_P(0x5ac, 0x01, ~0x77); | 222 | WREG32(0x5ac, radeon_crtc->crtc_id); |
| 222 | } else { | 223 | } else { |
| 223 | switch (dig->dig_encoder) { | 224 | switch (dig->dig_encoder) { |
| 224 | case 0: | 225 | case 0: |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 226379e00ac1..969c27529dfe 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -348,7 +348,6 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 348 | WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset, | 348 | WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset, |
| 349 | HDMI0_AUDIO_SAMPLE_SEND | /* send audio packets */ | 349 | HDMI0_AUDIO_SAMPLE_SEND | /* send audio packets */ |
| 350 | HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */ | 350 | HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */ |
| 351 | HDMI0_AUDIO_SEND_MAX_PACKETS | /* send NULL packets if no audio is available */ | ||
| 352 | HDMI0_AUDIO_PACKETS_PER_LINE(3) | /* should be suffient for all audio modes and small enough for all hblanks */ | 351 | HDMI0_AUDIO_PACKETS_PER_LINE(3) | /* should be suffient for all audio modes and small enough for all hblanks */ |
| 353 | HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ | 352 | HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ |
| 354 | } | 353 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 85dac33e3cce..fefcca55c1eb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -1374,9 +1374,9 @@ struct cayman_asic { | |||
| 1374 | 1374 | ||
| 1375 | struct si_asic { | 1375 | struct si_asic { |
| 1376 | unsigned max_shader_engines; | 1376 | unsigned max_shader_engines; |
| 1377 | unsigned max_pipes_per_simd; | ||
| 1378 | unsigned max_tile_pipes; | 1377 | unsigned max_tile_pipes; |
| 1379 | unsigned max_simds_per_se; | 1378 | unsigned max_cu_per_sh; |
| 1379 | unsigned max_sh_per_se; | ||
| 1380 | unsigned max_backends_per_se; | 1380 | unsigned max_backends_per_se; |
| 1381 | unsigned max_texture_channel_caches; | 1381 | unsigned max_texture_channel_caches; |
| 1382 | unsigned max_gprs; | 1382 | unsigned max_gprs; |
| @@ -1387,7 +1387,6 @@ struct si_asic { | |||
| 1387 | unsigned sc_hiz_tile_fifo_size; | 1387 | unsigned sc_hiz_tile_fifo_size; |
| 1388 | unsigned sc_earlyz_tile_fifo_size; | 1388 | unsigned sc_earlyz_tile_fifo_size; |
| 1389 | 1389 | ||
| 1390 | unsigned num_shader_engines; | ||
| 1391 | unsigned num_tile_pipes; | 1390 | unsigned num_tile_pipes; |
| 1392 | unsigned num_backends_per_se; | 1391 | unsigned num_backends_per_se; |
| 1393 | unsigned backend_disable_mask_per_asic; | 1392 | unsigned backend_disable_mask_per_asic; |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 79db56e6c2ac..59d44937dd9f 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
| @@ -476,12 +476,18 @@ int radeon_vm_bo_add(struct radeon_device *rdev, | |||
| 476 | 476 | ||
| 477 | mutex_lock(&vm->mutex); | 477 | mutex_lock(&vm->mutex); |
| 478 | if (last_pfn > vm->last_pfn) { | 478 | if (last_pfn > vm->last_pfn) { |
| 479 | /* grow va space 32M by 32M */ | 479 | /* release mutex and lock in right order */ |
| 480 | unsigned align = ((32 << 20) >> 12) - 1; | 480 | mutex_unlock(&vm->mutex); |
| 481 | radeon_mutex_lock(&rdev->cs_mutex); | 481 | radeon_mutex_lock(&rdev->cs_mutex); |
| 482 | radeon_vm_unbind_locked(rdev, vm); | 482 | mutex_lock(&vm->mutex); |
| 483 | /* and check again */ | ||
| 484 | if (last_pfn > vm->last_pfn) { | ||
| 485 | /* grow va space 32M by 32M */ | ||
| 486 | unsigned align = ((32 << 20) >> 12) - 1; | ||
| 487 | radeon_vm_unbind_locked(rdev, vm); | ||
| 488 | vm->last_pfn = (last_pfn + align) & ~align; | ||
| 489 | } | ||
| 483 | radeon_mutex_unlock(&rdev->cs_mutex); | 490 | radeon_mutex_unlock(&rdev->cs_mutex); |
| 484 | vm->last_pfn = (last_pfn + align) & ~align; | ||
| 485< | |||
