diff options
| author | Alex Deucher <alexdeucher@gmail.com> | 2010-08-02 12:13:46 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2010-08-03 19:49:20 -0400 |
| commit | e06b14ee91a2ddefc9a67443a6cd8ee0fa800115 (patch) | |
| tree | 621e5dc5f78e538ff80a0448a803fb1f3ce93add /drivers | |
| parent | ba4420c224c2808f2661cf8428f43ceef7a73a4a (diff) | |
drm/radeon/kms: handle the case of no active displays properly in the bandwidth code
Logic was:
if (mode0 && mode1)
else if (mode0)
else
Should be:
if (mode0 && mode1)
else if (mode0)
else if (mode1)
Otherwise we may end up calculating the priority regs with
unitialized values.
Fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=16492
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Cc: stable@kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/radeon/rs690.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 23 |
2 files changed, 18 insertions, 32 deletions
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index f3a8c9344c64..6fbb874583f4 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -398,7 +398,9 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 398 | struct drm_display_mode *mode1 = NULL; | 398 | struct drm_display_mode *mode1 = NULL; |
| 399 | struct rs690_watermark wm0; | 399 | struct rs690_watermark wm0; |
| 400 | struct rs690_watermark wm1; | 400 | struct rs690_watermark wm1; |
| 401 | u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt; | 401 | u32 tmp; |
| 402 | u32 d1mode_priority_a_cnt = S_006548_D1MODE_PRIORITY_A_OFF(1); | ||
| 403 | u32 d2mode_priority_a_cnt = S_006548_D1MODE_PRIORITY_A_OFF(1); | ||
| 402 | fixed20_12 priority_mark02, priority_mark12, fill_rate; | 404 | fixed20_12 priority_mark02, priority_mark12, fill_rate; |
| 403 | fixed20_12 a, b; | 405 | fixed20_12 a, b; |
| 404 | 406 | ||
| @@ -495,10 +497,6 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 495 | d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1); | 497 | d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1); |
| 496 | d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1); | 498 | d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1); |
| 497 | } | 499 | } |
| 498 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | ||
| 499 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 500 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 501 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 502 | } else if (mode0) { | 500 | } else if (mode0) { |
| 503 | if (dfixed_trunc(wm0.dbpp) > 64) | 501 | if (dfixed_trunc(wm0.dbpp) > 64) |
| 504 | a.full = dfixed_mul(wm0.dbpp, wm0.num_line_pair); | 502 | a.full = dfixed_mul(wm0.dbpp, wm0.num_line_pair); |
| @@ -528,13 +526,7 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 528 | d1mode_priority_a_cnt = dfixed_trunc(priority_mark02); | 526 | d1mode_priority_a_cnt = dfixed_trunc(priority_mark02); |
| 529 | if (rdev->disp_priority == 2) | 527 | if (rdev->disp_priority == 2) |
| 530 | d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1); | 528 | d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1); |
| 531 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | 529 | } else if (mode1) { |
| 532 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 533 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, | ||
| 534 | S_006D48_D2MODE_PRIORITY_A_OFF(1)); | ||
| 535 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, | ||
| 536 | S_006D4C_D2MODE_PRIORITY_B_OFF(1)); | ||
| 537 | } else { | ||
| 538 | if (dfixed_trunc(wm1.dbpp) > 64) | 530 | if (dfixed_trunc(wm1.dbpp) > 64) |
| 539 | a.full = dfixed_mul(wm1.dbpp, wm1.num_line_pair); | 531 | a.full = dfixed_mul(wm1.dbpp, wm1.num_line_pair); |
| 540 | else | 532 | else |
| @@ -563,13 +555,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 563 | d2mode_priority_a_cnt = dfixed_trunc(priority_mark12); | 555 | d2mode_priority_a_cnt = dfixed_trunc(priority_mark12); |
| 564 | if (rdev->disp_priority == 2) | 556 | if (rdev->disp_priority == 2) |
| 565 | d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1); | 557 | d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1); |
| 566 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, | ||
| 567 | S_006548_D1MODE_PRIORITY_A_OFF(1)); | ||
| 568 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, | ||
| 569 | S_00654C_D1MODE_PRIORITY_B_OFF(1)); | ||
| 570 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 571 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 572 | } | 558 | } |
| 559 | |||
| 560 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | ||
| 561 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 562 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 563 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 573 | } | 564 | } |
| 574 | 565 | ||
| 575 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 566 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index b951b8790175..4d6e86041a9f 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -927,7 +927,9 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev) | |||
| 927 | struct drm_display_mode *mode1 = NULL; | 927 | struct drm_display_mode *mode1 = NULL; |
| 928 | struct rv515_watermark wm0; | 928 | struct rv515_watermark wm0; |
| 929 | struct rv515_watermark wm1; | 929 | struct rv515_watermark wm1; |
| 930 | u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt; | 930 | u32 tmp; |
| 931 | u32 d1mode_priority_a_cnt = MODE_PRIORITY_OFF; | ||
| 932 | u32 d2mode_priority_a_cnt = MODE_PRIORITY_OFF; | ||
| 931 | fixed20_12 priority_mark02, priority_mark12, fill_rate; | 933 | fixed20_12 priority_mark02, priority_mark12, fill_rate; |
| 932 | fixed20_12 a, b; | 934 | fixed20_12 a, b; |
| 933 | 935 | ||
| @@ -1001,10 +1003,6 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev) | |||
| 1001 | d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; | 1003 | d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; |
| 1002 | d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; | 1004 | d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; |
| 1003 | } | 1005 | } |
| 1004 | WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | ||
| 1005 | WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 1006 | WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 1007 | WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 1008 | } else if (mode0) { | 1006 | } else if (mode0) { |
| 1009 | if (dfixed_trunc(wm0.dbpp) > 64) | 1007 | if (dfixed_trunc(wm0.dbpp) > 64) |
| 1010 | a.full = dfixed_div(wm0.dbpp, wm0.num_line_pair); | 1008 | a.full = dfixed_div(wm0.dbpp, wm0.num_line_pair); |
| @@ -1034,11 +1032,7 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev) | |||
| 1034 | d1mode_priority_a_cnt = dfixed_trunc(priority_mark02); | 1032 | d1mode_priority_a_cnt = dfixed_trunc(priority_mark02); |
| 1035 | if (rdev->disp_priority == 2) | 1033 | if (rdev->disp_priority == 2) |
| 1036 | d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; | 1034 | d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; |
| 1037 | WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | 1035 | } else if (mode1) { |
| 1038 | WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 1039 | WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | ||
| 1040 | WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | ||
| 1041 | } else { | ||
| 1042 | if (dfixed_trunc(wm1.dbpp) > 64) | 1036 | if (dfixed_trunc(wm1.dbpp) > 64) |
| 1043 | a.full = dfixed_div(wm1.dbpp, wm1.num_line_pair); | 1037 | a.full = dfixed_div(wm1.dbpp, wm1.num_line_pair); |
| 1044 | else | 1038 | else |
| @@ -1067,11 +1061,12 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev) | |||
| 1067 | d2mode_priority_a_cnt = dfixed_trunc(priority_mark12); | 1061 | d2mode_priority_a_cnt = dfixed_trunc(priority_mark12); |
| 1068 | if (rdev->disp_priority == 2) | 1062 | if (rdev->disp_priority == 2) |
| 1069 | d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; | 1063 | d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; |
| 1070 | WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | ||
| 1071 | WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | ||
| 1072 | WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 1073 | WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 1074 | } | 1064 | } |
| 1065 | |||
| 1066 | WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); | ||
| 1067 | WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); | ||
| 1068 | WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); | ||
| 1069 | WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt); | ||
| 1075 | } | 1070 | } |
| 1076 | 1071 | ||
| 1077 | void rv515_bandwidth_update(struct radeon_device *rdev) | 1072 | void rv515_bandwidth_update(struct radeon_device *rdev) |
