diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 89 |
1 files changed, 44 insertions, 45 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 3453910ee0f3..43fd01674489 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -353,7 +353,7 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, | |||
| 353 | struct drm_display_mode *mode, | 353 | struct drm_display_mode *mode, |
| 354 | struct drm_display_mode *other_mode) | 354 | struct drm_display_mode *other_mode) |
| 355 | { | 355 | { |
| 356 | u32 tmp = 0; | 356 | u32 tmp; |
| 357 | /* | 357 | /* |
| 358 | * Line Buffer Setup | 358 | * Line Buffer Setup |
| 359 | * There are 3 line buffers, each one shared by 2 display controllers. | 359 | * There are 3 line buffers, each one shared by 2 display controllers. |
| @@ -363,64 +363,63 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, | |||
| 363 | * first display controller | 363 | * first display controller |
| 364 | * 0 - first half of lb (3840 * 2) | 364 | * 0 - first half of lb (3840 * 2) |
| 365 | * 1 - first 3/4 of lb (5760 * 2) | 365 | * 1 - first 3/4 of lb (5760 * 2) |
| 366 | * 2 - whole lb (7680 * 2) | 366 | * 2 - whole lb (7680 * 2), other crtc must be disabled |
| 367 | * 3 - first 1/4 of lb (1920 * 2) | 367 | * 3 - first 1/4 of lb (1920 * 2) |
| 368 | * second display controller | 368 | * second display controller |
| 369 | * 4 - second half of lb (3840 * 2) | 369 | * 4 - second half of lb (3840 * 2) |
| 370 | * 5 - second 3/4 of lb (5760 * 2) | 370 | * 5 - second 3/4 of lb (5760 * 2) |
| 371 | * 6 - whole lb (7680 * 2) | 371 | * 6 - whole lb (7680 * 2), other crtc must be disabled |
| 372 | * 7 - last 1/4 of lb (1920 * 2) | 372 | * 7 - last 1/4 of lb (1920 * 2) |
| 373 | */ | 373 | */ |
| 374 | if (mode && other_mode) { | 374 | /* this can get tricky if we have two large displays on a paired group |
| 375 | if (mode->hdisplay > other_mode->hdisplay) { | 375 | * of crtcs. Ideally for multiple large displays we'd assign them to |
| 376 | if (mode->hdisplay > 2560) | 376 | * non-linked crtcs for maximum line buffer allocation. |
| 377 | tmp = 1; /* 3/4 */ | 377 | */ |
| 378 | else | 378 | if (radeon_crtc->base.enabled && mode) { |
| 379 | tmp = 0; /* 1/2 */ | 379 | if (other_mode) |
| 380 | } else if (other_mode->hdisplay > mode->hdisplay) { | ||
| 381 | if (other_mode->hdisplay > 2560) | ||
| 382 | tmp = 3; /* 1/4 */ | ||
| 383 | else | ||
| 384 | tmp = 0; /* 1/2 */ | ||
| 385 | } else | ||
| 386 | tmp = 0; /* 1/2 */ | 380 | tmp = 0; /* 1/2 */ |
| 387 | } else if (mode) | 381 | else |
| 388 | tmp = 2; /* whole */ | 382 | tmp = 2; /* whole */ |
| 389 | else if (other_mode) | 383 | } else |
| 390 | tmp = 3; /* 1/4 */ | 384 | tmp = 0; |
| 391 | 385 | ||
| 392 | /* second controller of the pair uses second half of the lb */ | 386 | /* second controller of the pair uses second half of the lb */ |
| 393 | if (radeon_crtc->crtc_id % 2) | 387 | if (radeon_crtc->crtc_id % 2) |
| 394 | tmp += 4; | 388 | tmp += 4; |
| 395 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); | 389 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); |
| 396 | 390 | ||
| 397 | switch (tmp) { | 391 | if (radeon_crtc->base.enabled && mode) { |
| 398 | case 0: | 392 | switch (tmp) { |
| 399 | case 4: | 393 | case 0: |
| 400 | default: | 394 | case 4: |
| 401 | if (ASIC_IS_DCE5(rdev)) | 395 | default: |
| 402 | return 4096 * 2; | 396 | if (ASIC_IS_DCE5(rdev)) |
| 403 | else | 397 | return 4096 * 2; |
| 404 | return 3840 * 2; | 398 | else |
| 405 | case 1: | 399 | return 3840 * 2; |
| 406 | case 5: | 400 | case 1: |
| 407 | if (ASIC_IS_DCE5(rdev)) | 401 | case 5: |
| 408 | return 6144 * 2; | 402 | if (ASIC_IS_DCE5(rdev)) |
| 409 | else | 403 | return 6144 * 2; |
| 410 | return 5760 * 2; | 404 | else |
| 411 | case 2: | 405 | return 5760 * 2; |
| 412 | case 6: | 406 | case 2: |
| 413 | if (ASIC_IS_DCE5(rdev)) | 407 | case 6: |
| 414 | return 8192 * 2; | 408 | if (ASIC_IS_DCE5(rdev)) |
| 415 | else | 409 | return 8192 * 2; |
| 416 | return 7680 * 2; | 410 | else |
| 417 | case 3: | 411 | return 7680 * 2; |
| 418 | case 7: | 412 | case 3: |
| 419 | if (ASIC_IS_DCE5(rdev)) | 413 | case 7: |
| 420 | return 2048 * 2; | 414 | if (ASIC_IS_DCE5(rdev)) |
| 421 | else | 415 | return 2048 * 2; |
| 422 | return 1920 * 2; | 416 | else |
| 417 | return 1920 * 2; | ||
| 418 | } | ||
| 423 | } | 419 | } |
| 420 | |||
| 421 | /* controller not enabled, so no lb used */ | ||
| 422 | return 0; | ||
| 424 | } | 423 | } |
| 425 | 424 | ||
| 426 | static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) | 425 | static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) |
