diff options
author | Dave Airlie <airlied@redhat.com> | 2014-01-20 19:26:50 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-01-20 19:26:50 -0500 |
commit | 8c9b2e322d5c9b4e77fd308984ea303de4b63e1c (patch) | |
tree | 707c3d6731c78f8d1d50d7e0a24898b3ad428020 | |
parent | cfd72a4c2089aa3938f37281a34d6eb3306d5fd8 (diff) | |
parent | 5d029339bb8ce69aeb68280c3de67d3cea456146 (diff) |
Merge branch 'drm-next-3.14' of git://people.freedesktop.org/~agd5f/linux into drm-next
New tree with the INFO ioctl merge fixed up. This also adds a couple
of additional minor fixes.
A few more changes for 3.14, mostly just bug fixes. Note that:
drm/radeon: add query to fetch the max engine clock.
will conflict with 3.13 final, but the fix is pretty obvious.
* 'drm-next-3.14' of git://people.freedesktop.org/~agd5f/linux: (22 commits)
drm/radeon: add UVD support for OLAND
drm/radeon: fix minor typos in si_dpm.c
drm/radeon: set the full cache bit for fences on r7xx+
drm/radeon: fix surface sync in fence on cayman (v2)
drm/radeon/dpm: disable mclk switching on desktop RV770
drm/radeon: fix endian handling in radeon_atom_init_mc_reg_table
drm/radeon: write gfx pg bases even when gfx pg is disabled
drm/radeon: bail early from enable ss in certain cases
drm/radeon: handle ss percentage divider properly
drm/radeon: add query to fetch the max engine clock (v2)
drm/radeon/dp: sleep after powering up the display
drm/radeon/dp: use usleep_range rather than udelay
drm/radeon/dp: bump i2c-over-aux retries to 7
drm/radeon: disable ss on DP for DCE3.x
drm/radeon/cik: use hw defaults for TC_CFG registers
drm/radeon: disable dpm on BTC
drm/radeon/cik: use WAIT_REG_MEM special op for CP HDP flush
drm/radeon/cik: use POLL_REG_MEM special op for sDMA HDP flush
drm/radeon: consolidate sdma hdp flushing code for CIK
drm/radeon: consolidate cp hdp flushing code for CIK
...
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 95 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 43 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/nid.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_kms.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_uvd.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv770_dpm.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si_dpm.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v2_2.c | 1 | ||||
-rw-r--r-- | include/uapi/drm/radeon_drm.h | 2 |
18 files changed, 178 insertions, 111 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 0b9621c9aeea..4cf678306c9c 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -423,7 +423,17 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
423 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); | 423 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); |
424 | union atom_enable_ss args; | 424 | union atom_enable_ss args; |
425 | 425 | ||
426 | if (!enable) { | 426 | if (enable) { |
427 | /* Don't mess with SS if percentage is 0 or external ss. | ||
428 | * SS is already disabled previously, and disabling it | ||
429 | * again can cause display problems if the pll is already | ||
430 | * programmed. | ||
431 | */ | ||
432 | if (ss->percentage == 0) | ||
433 | return; | ||
434 | if (ss->type & ATOM_EXTERNAL_SS_MASK) | ||
435 | return; | ||
436 | } else { | ||
427 | for (i = 0; i < rdev->num_crtc; i++) { | 437 | for (i = 0; i < rdev->num_crtc; i++) { |
428 | if (rdev->mode_info.crtcs[i] && | 438 | if (rdev->mode_info.crtcs[i] && |
429 | rdev->mode_info.crtcs[i]->enabled && | 439 | rdev->mode_info.crtcs[i]->enabled && |
@@ -459,8 +469,6 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
459 | args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); | 469 | args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); |
460 | args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step); | 470 | args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step); |
461 | args.v3.ucEnable = enable; | 471 | args.v3.ucEnable = enable; |
462 | if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK) || ASIC_IS_DCE61(rdev)) | ||
463 | args.v3.ucEnable = ATOM_DISABLE; | ||
464 | } else if (ASIC_IS_DCE4(rdev)) { | 472 | } else if (ASIC_IS_DCE4(rdev)) { |
465 | args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 473 | args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
466 | args.v2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; | 474 | args.v2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; |
@@ -480,8 +488,6 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
480 | args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); | 488 | args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); |
481 | args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step); | 489 | args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step); |
482 | args.v2.ucEnable = enable; | 490 | args.v2.ucEnable = enable; |
483 | if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK) || ASIC_IS_DCE41(rdev)) | ||
484 | args.v2.ucEnable = ATOM_DISABLE; | ||
485 | } else if (ASIC_IS_DCE3(rdev)) { | 491 | } else if (ASIC_IS_DCE3(rdev)) { |
486 | args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 492 | args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
487 | args.v1.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; | 493 | args.v1.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; |
@@ -503,8 +509,7 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
503 | args.lvds_ss_2.ucSpreadSpectrumRange = ss->range; | 509 | args.lvds_ss_2.ucSpreadSpectrumRange = ss->range; |
504 | args.lvds_ss_2.ucEnable = enable; | 510 | args.lvds_ss_2.ucEnable = enable; |
505 | } else { | 511 | } else { |
506 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || | 512 | if (enable == ATOM_DISABLE) { |
507 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { | ||
508 | atombios_disable_ss(rdev, pll_id); | 513 | atombios_disable_ss(rdev, pll_id); |
509 | return; | 514 | return; |
510 | } | 515 | } |
@@ -938,11 +943,14 @@ static bool atombios_crtc_prepare_pll(struct drm_crtc *crtc, struct drm_display_ | |||
938 | radeon_atombios_get_ppll_ss_info(rdev, | 943 | radeon_atombios_get_ppll_ss_info(rdev, |
939 | &radeon_crtc->ss, | 944 | &radeon_crtc->ss, |
940 | ATOM_DP_SS_ID1); | 945 | ATOM_DP_SS_ID1); |
941 | } else | 946 | } else { |
942 | radeon_crtc->ss_enabled = | 947 | radeon_crtc->ss_enabled = |
943 | radeon_atombios_get_ppll_ss_info(rdev, | 948 | radeon_atombios_get_ppll_ss_info(rdev, |
944 | &radeon_crtc->ss, | 949 | &radeon_crtc->ss, |
945 | ATOM_DP_SS_ID1); | 950 | ATOM_DP_SS_ID1); |
951 | } | ||
952 | /* disable spread spectrum on DCE3 DP */ | ||
953 | radeon_crtc->ss_enabled = false; | ||
946 | } | 954 | } |
947 | break; | 955 | break; |
948 | case ATOM_ENCODER_MODE_LVDS: | 956 | case ATOM_ENCODER_MODE_LVDS: |
@@ -1039,15 +1047,17 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
1039 | /* calculate ss amount and step size */ | 1047 | /* calculate ss amount and step size */ |
1040 | if (ASIC_IS_DCE4(rdev)) { | 1048 | if (ASIC_IS_DCE4(rdev)) { |
1041 | u32 step_size; | 1049 | u32 step_size; |
1042 | u32 amount = (((fb_div * 10) + frac_fb_div) * radeon_crtc->ss.percentage) / 10000; | 1050 | u32 amount = (((fb_div * 10) + frac_fb_div) * |
1051 | (u32)radeon_crtc->ss.percentage) / | ||
1052 | (100 * (u32)radeon_crtc->ss.percentage_divider); | ||
1043 | radeon_crtc->ss.amount = (amount / 10) & ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK; | 1053 | radeon_crtc->ss.amount = (amount / 10) & ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK; |
1044 | radeon_crtc->ss.amount |= ((amount - (amount / 10)) << ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT) & | 1054 | radeon_crtc->ss.amount |= ((amount - (amount / 10)) << ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT) & |
1045 | ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK; | 1055 | ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK; |
1046 | if (radeon_crtc->ss.type & ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD) | 1056 | if (radeon_crtc->ss.type & ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD) |
1047 | step_size = (4 * amount * ref_div * (radeon_crtc->ss.rate * 2048)) / | 1057 | step_size = (4 * amount * ref_div * ((u32)radeon_crtc->ss.rate * 2048)) / |
1048 | (125 * 25 * pll->reference_freq / 100); | 1058 | (125 * 25 * pll->reference_freq / 100); |
1049 | else | 1059 | else |
1050 | step_size = (2 * amount * ref_div * (radeon_crtc->ss.rate * 2048)) / | 1060 | step_size = (2 * amount * ref_div * ((u32)radeon_crtc->ss.rate * 2048)) / |
1051 | (125 * 25 * pll->reference_freq / 100); | 1061 | (125 * 25 * pll->reference_freq / 100); |
1052 | radeon_crtc->ss.step = step_size; | 1062 | radeon_crtc->ss.step = step_size; |
1053 | } | 1063 | } |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 37289f67f965..4ad7643fce5f 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -161,7 +161,7 @@ static int radeon_dp_aux_native_write(struct radeon_connector *radeon_connector, | |||
161 | msg[3] = (msg_bytes << 4) | (send_bytes - 1); | 161 | msg[3] = (msg_bytes << 4) | (send_bytes - 1); |
162 | memcpy(&msg[4], send, send_bytes); | 162 | memcpy(&msg[4], send, send_bytes); |
163 | 163 | ||
164 | for (retry = 0; retry < 4; retry++) { | 164 | for (retry = 0; retry < 7; retry++) { |
165 | ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, | 165 | ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, |
166 | msg, msg_bytes, NULL, 0, delay, &ack); | 166 | msg, msg_bytes, NULL, 0, delay, &ack); |
167 | if (ret == -EBUSY) | 167 | if (ret == -EBUSY) |
@@ -172,7 +172,7 @@ static int radeon_dp_aux_native_write(struct radeon_connector *radeon_connector, | |||
172 | if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) | 172 | if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) |
173 | return send_bytes; | 173 | return send_bytes; |
174 | else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | 174 | else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) |
175 | udelay(400); | 175 | usleep_range(400, 500); |
176 | else | 176 | else |
177 | return -EIO; | 177 | return -EIO; |
178 | } | 178 | } |
@@ -195,7 +195,7 @@ static int radeon_dp_aux_native_read(struct radeon_connector *radeon_connector, | |||
195 | msg[2] = DP_AUX_NATIVE_READ << 4; | 195 | msg[2] = DP_AUX_NATIVE_READ << 4; |
196 | msg[3] = (msg_bytes << 4) | (recv_bytes - 1); | 196 | msg[3] = (msg_bytes << 4) | (recv_bytes - 1); |
197 | 197 | ||
198 | for (retry = 0; retry < 4; retry++) { | 198 | for (retry = 0; retry < 7; retry++) { |
199 | ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, | 199 | ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, |
200 | msg, msg_bytes, recv, recv_bytes, delay, &ack); | 200 | msg, msg_bytes, recv, recv_bytes, delay, &ack); |
201 | if (ret == -EBUSY) | 201 | if (ret == -EBUSY) |
@@ -206,7 +206,7 @@ static int radeon_dp_aux_native_read(struct radeon_connector *radeon_connector, | |||
206 | if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) | 206 | if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) |
207 | return ret; | 207 | return ret; |
208 | else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) | 208 | else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) |
209 | udelay(400); | 209 | usleep_range(400, 500); |
210 | else if (ret == 0) | 210 | else if (ret == 0) |
211 | return -EPROTO; | 211 | return -EPROTO; |
212 | else | 212 | else |
@@ -274,7 +274,7 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
274 | break; | 274 | break; |
275 | } | 275 | } |
276 | 276 | ||
277 | for (retry = 0; retry < 4; retry++) { | 277 | for (retry = 0; retry < 7; retry++) { |
278 | ret = radeon_process_aux_ch(auxch, | 278 | ret = radeon_process_aux_ch(auxch, |
279 | msg, msg_bytes, reply, reply_bytes, 0, &ack); | 279 | msg, msg_bytes, reply, reply_bytes, 0, &ack); |
280 | if (ret == -EBUSY) | 280 | if (ret == -EBUSY) |
@@ -295,7 +295,7 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
295 | return -EREMOTEIO; | 295 | return -EREMOTEIO; |
296 | case DP_AUX_NATIVE_REPLY_DEFER: | 296 | case DP_AUX_NATIVE_REPLY_DEFER: |
297 | DRM_DEBUG_KMS("aux_ch native defer\n"); | 297 | DRM_DEBUG_KMS("aux_ch native defer\n"); |
298 | udelay(400); | 298 | usleep_range(500, 600); |
299 | continue; | 299 | continue; |
300 | default: | 300 | default: |
301 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", ack); | 301 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", ack); |
@@ -312,7 +312,7 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
312 | return -EREMOTEIO; | 312 | return -EREMOTEIO; |
313 | case DP_AUX_I2C_REPLY_DEFER: | 313 | case DP_AUX_I2C_REPLY_DEFER: |
314 | DRM_DEBUG_KMS("aux_i2c defer\n"); | 314 | DRM_DEBUG_KMS("aux_i2c defer\n"); |
315 | udelay(400); | 315 | usleep_range(400, 500); |
316 | break; | 316 | break; |
317 | default: | 317 | default: |
318 | DRM_ERROR("aux_i2c invalid reply 0x%02x\n", ack); | 318 | DRM_ERROR("aux_i2c invalid reply 0x%02x\n", ack); |
@@ -673,9 +673,11 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | |||
673 | u8 tmp; | 673 | u8 tmp; |
674 | 674 | ||
675 | /* power up the sink */ | 675 | /* power up the sink */ |
676 | if (dp_info->dpcd[0] >= 0x11) | 676 | if (dp_info->dpcd[0] >= 0x11) { |
677 | radeon_write_dpcd_reg(dp_info->radeon_connector, | 677 | radeon_write_dpcd_reg(dp_info->radeon_connector, |
678 | DP_SET_POWER, DP_SET_POWER_D0); | 678 | DP_SET_POWER, DP_SET_POWER_D0); |
679 | usleep_range(1000, 2000); | ||
680 | } | ||
679 | 681 | ||
680 | /* possibly enable downspread on the sink */ | 682 | /* possibly enable downspread on the sink */ |
681 | if (dp_info->dpcd[3] & 0x1) | 683 | if (dp_info->dpcd[3] & 0x1) |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index e7f6334138a1..6ffe824624fb 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -3487,6 +3487,51 @@ int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
3487 | } | 3487 | } |
3488 | 3488 | ||
3489 | /** | 3489 | /** |
3490 | * cik_hdp_flush_cp_ring_emit - emit an hdp flush on the cp | ||
3491 | * | ||
3492 | * @rdev: radeon_device pointer | ||
3493 | * @ridx: radeon ring index | ||
3494 | * | ||
3495 | * Emits an hdp flush on the cp. | ||
3496 | */ | ||
3497 | static void cik_hdp_flush_cp_ring_emit(struct radeon_device *rdev, | ||
3498 | int ridx) | ||
3499 | { | ||
3500 | struct radeon_ring *ring = &rdev->ring[ridx]; | ||
3501 | u32 ref_and_mask; | ||
3502 | |||
3503 | switch (ring->idx) { | ||
3504 | case CAYMAN_RING_TYPE_CP1_INDEX: | ||
3505 | case CAYMAN_RING_TYPE_CP2_INDEX: | ||
3506 | default: | ||
3507 | switch (ring->me) { | ||
3508 | case 0: | ||
3509 | ref_and_mask = CP2 << ring->pipe; | ||
3510 | break; | ||
3511 | case 1: | ||
3512 | ref_and_mask = CP6 << ring->pipe; | ||
3513 | break; | ||
3514 | default: | ||
3515 | return; | ||
3516 | } | ||
3517 | break; | ||
3518 | case RADEON_RING_TYPE_GFX_INDEX: | ||
3519 | ref_and_mask = CP0; | ||
3520 | break; | ||
3521 | } | ||
3522 | |||
3523 | radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
3524 | radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */ | ||
3525 | WAIT_REG_MEM_FUNCTION(3) | /* == */ | ||
3526 | WAIT_REG_MEM_ENGINE(1))); /* pfp */ | ||
3527 | radeon_ring_write(ring, GPU_HDP_FLUSH_REQ >> 2); | ||
3528 | radeon_ring_write(ring, GPU_HDP_FLUSH_DONE >> 2); | ||
3529 | radeon_ring_write(ring, ref_and_mask); | ||
3530 | radeon_ring_write(ring, ref_and_mask); | ||
3531 | radeon_ring_write(ring, 0x20); /* poll interval */ | ||
3532 | } | ||
3533 | |||
3534 | /** | ||
3490 | * cik_fence_gfx_ring_emit - emit a fence on the gfx ring | 3535 | * cik_fence_gfx_ring_emit - emit a fence on the gfx ring |
3491 | * | 3536 | * |
3492 | * @rdev: radeon_device pointer | 3537 | * @rdev: radeon_device pointer |
@@ -3512,15 +3557,7 @@ void cik_fence_gfx_ring_emit(struct radeon_device *rdev, | |||
3512 | radeon_ring_write(ring, fence->seq); | 3557 | radeon_ring_write(ring, fence->seq); |
3513 | radeon_ring_write(ring, 0); | 3558 | radeon_ring_write(ring, 0); |
3514 | /* HDP flush */ | 3559 | /* HDP flush */ |
3515 | /* We should be using the new WAIT_REG_MEM special op packet here | 3560 | cik_hdp_flush_cp_ring_emit(rdev, fence->ring); |
3516 | * but it causes the CP to hang | ||
3517 | */ | ||
3518 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3519 | radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
3520 | WRITE_DATA_DST_SEL(0))); | ||
3521 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); | ||
3522 | radeon_ring_write(ring, 0); | ||
3523 | radeon_ring_write(ring, 0); | ||
3524 | } | 3561 | } |
3525 | 3562 | ||
3526 | /** | 3563 | /** |
@@ -3550,15 +3587,7 @@ void cik_fence_compute_ring_emit(struct radeon_device *rdev, | |||
3550 | radeon_ring_write(ring, fence->seq); | 3587 | radeon_ring_write(ring, fence->seq); |
3551 | radeon_ring_write(ring, 0); | 3588 | radeon_ring_write(ring, 0); |
3552 | /* HDP flush */ | 3589 | /* HDP flush */ |
3553 | /* We should be using the new WAIT_REG_MEM special op packet here | 3590 | cik_hdp_flush_cp_ring_emit(rdev, fence->ring); |
3554 | * but it causes the CP to hang | ||
3555 | */ | ||
3556 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3557 | radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
3558 | WRITE_DATA_DST_SEL(0))); | ||
3559 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); | ||
3560 | radeon_ring_write(ring, 0); | ||
3561 | radeon_ring_write(ring, 0); | ||
3562 | } | 3591 | } |
3563 | 3592 | ||
3564 | bool cik_semaphore_ring_emit(struct radeon_device *rdev, | 3593 | bool cik_semaphore_ring_emit(struct radeon_device *rdev, |
@@ -3566,8 +3595,6 @@ bool cik_semaphore_ring_emit(struct radeon_device *rdev, | |||
3566 | struct radeon_semaphore *semaphore, | 3595 | struct radeon_semaphore *semaphore, |
3567 | bool emit_wait) | 3596 | bool emit_wait) |
3568 | { | 3597 | { |
3569 | /* TODO: figure out why semaphore cause lockups */ | ||
3570 | #if 0 | ||
3571 | uint64_t addr = semaphore->gpu_addr; | 3598 | uint64_t addr = semaphore->gpu_addr; |
3572 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; | 3599 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; |
3573 | 3600 | ||
@@ -3576,9 +3603,6 @@ bool cik_semaphore_ring_emit(struct radeon_device *rdev, | |||
3576 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel); | 3603 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel); |
3577 | 3604 | ||
3578 | return true; | 3605 | return true; |
3579 | #else | ||
3580 | return false; | ||
3581 | #endif | ||
3582 | } | 3606 | } |
3583 | 3607 | ||
3584 | /** | 3608 | /** |
@@ -5329,20 +5353,6 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev) | |||
5329 | WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | | 5353 | WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | |
5330 | WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); | 5354 | WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); |
5331 | 5355 | ||
5332 | /* TC cache setup ??? */ | ||
5333 | WREG32(TC_CFG_L1_LOAD_POLICY0, 0); | ||
5334 | WREG32(TC_CFG_L1_LOAD_POLICY1, 0); | ||
5335 | WREG32(TC_CFG_L1_STORE_POLICY, 0); | ||
5336 | |||
5337 | WREG32(TC_CFG_L2_LOAD_POLICY0, 0); | ||
5338 | WREG32(TC_CFG_L2_LOAD_POLICY1, 0); | ||
5339 | WREG32(TC_CFG_L2_STORE_POLICY0, 0); | ||
5340 | WREG32(TC_CFG_L2_STORE_POLICY1, 0); | ||
5341 | WREG32(TC_CFG_L2_ATOMIC_POLICY, 0); | ||
5342 | |||
5343 | WREG32(TC_CFG_L1_VOLATILE, 0); | ||
5344 | WREG32(TC_CFG_L2_VOLATILE, 0); | ||
5345 | |||
5346 | if (rdev->family == CHIP_KAVERI) { | 5356 | if (rdev->family == CHIP_KAVERI) { |
5347 | u32 tmp = RREG32(CHUB_CONTROL); | 5357 | u32 tmp = RREG32(CHUB_CONTROL); |
5348 | tmp &= ~BYPASS_VM; | 5358 | tmp &= ~BYPASS_VM; |
@@ -5558,16 +5568,7 @@ void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | |||
5558 | radeon_ring_write(ring, VMID(0)); | 5568 | radeon_ring_write(ring, VMID(0)); |
5559 | 5569 | ||
5560 | /* HDP flush */ | 5570 | /* HDP flush */ |
5561 | /* We should be using the WAIT_REG_MEM packet here like in | 5571 | cik_hdp_flush_cp_ring_emit(rdev, ridx); |
5562 | * cik_fence_ring_emit(), but it causes the CP to hang in this | ||
5563 | * context... | ||
5564 | */ | ||
5565 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
5566 | radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
5567 | WRITE_DATA_DST_SEL(0))); | ||
5568 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); | ||
5569 | radeon_ring_write(ring, 0); | ||
5570 | radeon_ring_write(ring, 0); | ||
5571 | 5572 | ||
5572 | /* bits 0-15 are the VM contexts0-15 */ | 5573 | /* bits 0-15 are the VM contexts0-15 */ |
5573 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 5574 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index af520d4d362b..9abea87a9213 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -157,6 +157,35 @@ void cik_sdma_ring_ib_execute(struct radeon_device *rdev, | |||
157 | } | 157 | } |
158 | 158 | ||
159 | /** | 159 | /** |
160 | * cik_sdma_hdp_flush_ring_emit - emit an hdp flush on the DMA ring | ||
161 | * | ||
162 | * @rdev: radeon_device pointer | ||
163 | * @ridx: radeon ring index | ||
164 | * | ||
165 | * Emit an hdp flush packet on the requested DMA ring. | ||
166 | */ | ||
167 | static void cik_sdma_hdp_flush_ring_emit(struct radeon_device *rdev, | ||
168 | int ridx) | ||
169 | { | ||
170 | struct radeon_ring *ring = &rdev->ring[ridx]; | ||
171 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) | | ||
172 | SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ | ||
173 | u32 ref_and_mask; | ||
174 | |||
175 | if (ridx == R600_RING_TYPE_DMA_INDEX) | ||
176 | ref_and_mask = SDMA0; | ||
177 | else | ||
178 | ref_and_mask = SDMA1; | ||
179 | |||
180 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits)); | ||
181 | radeon_ring_write(ring, GPU_HDP_FLUSH_DONE); | ||
182 | radeon_ring_write(ring, GPU_HDP_FLUSH_REQ); | ||
183 | radeon_ring_write(ring, ref_and_mask); /* reference */ | ||
184 | radeon_ring_write(ring, ref_and_mask); /* mask */ | ||
185 | radeon_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */ | ||
186 | } | ||
187 | |||
188 | /** | ||
160 | * cik_sdma_fence_ring_emit - emit a fence on the DMA ring | 189 | * cik_sdma_fence_ring_emit - emit a fence on the DMA ring |
161 | * | 190 | * |
162 | * @rdev: radeon_device pointer | 191 | * @rdev: radeon_device pointer |
@@ -180,12 +209,7 @@ void cik_sdma_fence_ring_emit(struct radeon_device *rdev, | |||
180 | /* generate an interrupt */ | 209 | /* generate an interrupt */ |
181 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0)); | 210 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0)); |
182 | /* flush HDP */ | 211 | /* flush HDP */ |
183 | /* We should be using the new POLL_REG_MEM special op packet here | 212 | cik_sdma_hdp_flush_ring_emit(rdev, fence->ring); |
184 | * but it causes sDMA to hang sometimes | ||
185 | */ | ||
186 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | ||
187 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); | ||
188 | radeon_ring_write(ring, 0); | ||
189 | } | 213 | } |
190 | 214 | ||
191 | /** | 215 | /** |
@@ -816,12 +840,7 @@ void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm | |||
816 | radeon_ring_write(ring, VMID(0)); | 840 | radeon_ring_write(ring, VMID(0)); |
817 | 841 | ||
818 | /* flush HDP */ | 842 | /* flush HDP */ |
819 | /* We should be using the new POLL_REG_MEM special op packet here | 843 | cik_sdma_hdp_flush_ring_emit(rdev, ridx); |
820 | * but it causes sDMA to hang sometimes | ||
821 | */ | ||
822 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | ||
823 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); | ||
824 | radeon_ring_write(ring, 0); | ||
825 | 844 | ||
826 | /* flush TLB */ | 845 | /* flush TLB */ |
827 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 846 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index af45b23675ee..647b1d0fa62c 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1331,13 +1331,12 @@ void cayman_fence_ring_emit(struct radeon_device *rdev, | |||
1331 | { | 1331 | { |
1332 | struct radeon_ring *ring = &rdev->ring[fence->ring]; | 1332 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
1333 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; | 1333 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; |
1334 | u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | | ||
1335 | PACKET3_SH_ACTION_ENA; | ||
1334 | 1336 | ||
1335 | /* flush read cache over gart for this vmid */ | 1337 | /* flush read cache over gart for this vmid */ |
1336 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | ||
1337 | radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2); | ||
1338 | radeon_ring_write(ring, 0); | ||
1339 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); | 1338 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
1340 | radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA); | 1339 | radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); |
1341 | radeon_ring_write(ring, 0xFFFFFFFF); | 1340 | radeon_ring_write(ring, 0xFFFFFFFF); |
1342 | radeon_ring_write(ring, 0); | 1341 | radeon_ring_write(ring, 0); |
1343 | radeon_ring_write(ring, 10); /* poll interval */ | 1342 | radeon_ring_write(ring, 10); /* poll interval */ |
@@ -1353,6 +1352,8 @@ void cayman_fence_ring_emit(struct radeon_device *rdev, | |||
1353 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) | 1352 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) |
1354 | { | 1353 | { |
1355 | struct radeon_ring *ring = &rdev->ring[ib->ring]; | 1354 | struct radeon_ring *ring = &rdev->ring[ib->ring]; |
1355 | u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | | ||
1356 | PACKET3_SH_ACTION_ENA; | ||
1356 | 1357 | ||
1357 | /* set to DX10/11 mode */ | 1358 | /* set to DX10/11 mode */ |
1358 | radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); | 1359 | radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); |
@@ -1377,14 +1378,11 @@ void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) | |||
1377 | (ib->vm ? (ib->vm->id << 24) : 0)); | 1378 | (ib->vm ? (ib->vm->id << 24) : 0)); |
1378 | 1379 | ||
1379 | /* flush read cache over gart for this vmid */ | 1380 | /* flush read cache over gart for this vmid */ |
1380 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | ||
1381 | radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2); | ||
1382 | radeon_ring_write(ring, ib->vm ? ib->vm->id : 0); | ||
1383 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); | 1381 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
1384 | radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA); | 1382 | radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); |
1385 | radeon_ring_write(ring, 0xFFFFFFFF); | 1383 | radeon_ring_write(ring, 0xFFFFFFFF); |
1386 | radeon_ring_write(ring, 0); | 1384 | radeon_ring_write(ring, 0); |
1387 | radeon_ring_write(ring, 10); /* poll interval */ | 1385 | radeon_ring_write(ring, ((ib->vm ? ib->vm->id : 0) << 24) | 10); /* poll interval */ |
1388 | } | 1386 | } |
1389 | 1387 | ||
1390 | static void cayman_cp_enable(struct radeon_device *rdev, bool enable) | 1388 | static void cayman_cp_enable(struct radeon_device *rdev, bool enable) |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index 22421bc80c0d..d996033c243e 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
@@ -1154,6 +1154,7 @@ | |||
1154 | # define PACKET3_DB_ACTION_ENA (1 << 26) | 1154 | # define PACKET3_DB_ACTION_ENA (1 << 26) |
1155 | # define PACKET3_SH_ACTION_ENA (1 << 27) | 1155 | # define PACKET3_SH_ACTION_ENA (1 << 27) |
1156 | # define PACKET3_SX_ACTION_ENA (1 << 28) | 1156 | # define PACKET3_SX_ACTION_ENA (1 << 28) |
1157 | # define PACKET3_ENGINE_ME (1 << 31) | ||
1157 | #define PACKET3_ME_INITIALIZE 0x44 | 1158 | #define PACKET3_ME_INITIALIZE 0x44 |
1158 | #define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) | 1159 | #define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) |
1159 | #define PACKET3_COND_WRITE 0x45 | 1160 | #define PACKET3_COND_WRITE 0x45 |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index ad99bae2e85c..3dce370adc1b 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2706,14 +2706,17 @@ void r600_fence_ring_emit(struct radeon_device *rdev, | |||
2706 | struct radeon_fence *fence) | 2706 | struct radeon_fence *fence) |
2707 | { | 2707 | { |
2708 | struct radeon_ring *ring = &rdev->ring[fence->ring]; | 2708 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
2709 | u32 cp_coher_cntl = PACKET3_TC_ACTION_ENA | PACKET3_VC_ACTION_ENA | | ||
2710 | PACKET3_SH_ACTION_ENA; | ||
2711 | |||
2712 | if (rdev->family >= CHIP_RV770) | ||
2713 | cp_coher_cntl |= PACKET3_FULL_CACHE_ENA; | ||
2709 | 2714 | ||
2710 | if (rdev->wb.use_event) { | 2715 | if (rdev->wb.use_event) { |
2711 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; | 2716 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; |
2712 | /* flush read cache over gart */ | 2717 | /* flush read cache over gart */ |
2713 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); | 2718 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
2714 | radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | | 2719 | radeon_ring_write(ring, cp_coher_cntl); |
2715 | PACKET3_VC_ACTION_ENA | | ||
2716 | PACKET3_SH_ACTION_ENA); | ||
2717 | radeon_ring_write(ring, 0xFFFFFFFF); | 2720 | radeon_ring_write(ring, 0xFFFFFFFF); |
2718 | radeon_ring_write(ring, 0); | 2721 | radeon_ring_write(ring, 0); |
2719 | radeon_ring_write(ring, 10); /* poll interval */ | 2722 | radeon_ring_write(ring, 10); /* poll interval */ |
@@ -2727,9 +2730,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev, | |||
2727 | } else { | 2730 | } else { |
2728 | /* flush read cache over gart */ | 2731 | /* flush read cache over gart */ |
2729 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); | 2732 | radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
2730 | radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | | 2733 | radeon_ring_write(ring, cp_coher_cntl); |
2731 | PACKET3_VC_ACTION_ENA | | ||
2732 | PACKET3_SH_ACTION_ENA); | ||
2733 | radeon_ring_write(ring, 0xFFFFFFFF); | 2734 | radeon_ring_write(ring, 0xFFFFFFFF); |
2734 | radeon_ring_write(ring, 0); | 2735 | radeon_ring_write(ring, 0); |
2735 | radeon_ring_write(ring, 10); /* poll interval */ | 2736 | radeon_ring_write(ring, 10); /* poll interval */ |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 3fca4b9c65ad..37455f65107f 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -1582,6 +1582,7 @@ | |||
1582 | # define PACKET3_CP_DMA_CMD_DAIC (1 << 29) | 1582 | # define PACKET3_CP_DMA_CMD_DAIC (1 << 29) |
1583 | #define PACKET3_SURFACE_SYNC 0x43 | 1583 | #define PACKET3_SURFACE_SYNC 0x43 |
1584 | # define PACKET3_CB0_DEST_BASE_ENA (1 << 6) | 1584 | # define PACKET3_CB0_DEST_BASE_ENA (1 << 6) |
1585 | # define PACKET3_FULL_CACHE_ENA (1 << 20) /* r7xx+ only */ | ||
1585 | # define PACKET3_TC_ACTION_ENA (1 << 23) | 1586 | # define PACKET3_TC_ACTION_ENA (1 << 23) |
1586 | # define PACKET3_VC_ACTION_ENA (1 << 24) | 1587 | # define PACKET3_VC_ACTION_ENA (1 << 24) |
1587 | # define PACKET3_CB_ACTION_ENA (1 << 25) | 1588 | # define PACKET3_CB_ACTION_ENA (1 << 25) |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 80a56ad40c52..00bca1bd5745 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -1511,6 +1511,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1511 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); | 1511 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); |
1512 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; | 1512 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; |
1513 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); | 1513 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); |
1514 | ss->percentage_divider = 100; | ||
1514 | return true; | 1515 | return true; |
1515 | } | 1516 | } |
1516 | ss_assign = (union asic_ss_assignment *) | 1517 | ss_assign = (union asic_ss_assignment *) |
@@ -1528,6 +1529,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1528 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); | 1529 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); |
1529 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; | 1530 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; |
1530 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); | 1531 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); |
1532 | ss->percentage_divider = 100; | ||
1531 | if ((crev == 2) && | 1533 | if ((crev == 2) && |
1532 | ((id == ASIC_INTERNAL_ENGINE_SS) || | 1534 | ((id == ASIC_INTERNAL_ENGINE_SS) || |
1533 | (id == ASIC_INTERNAL_MEMORY_SS))) | 1535 | (id == ASIC_INTERNAL_MEMORY_SS))) |
@@ -1549,6 +1551,11 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1549 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); | 1551 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); |
1550 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; | 1552 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; |
1551 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); | 1553 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); |
1554 | if (ss_assign->v3.ucSpreadSpectrumMode & | ||
1555 | SS_MODE_V3_PERCENTAGE_DIV_BY_1000_MASK) | ||
1556 | ss->percentage_divider = 1000; | ||
1557 | else | ||
1558 | ss->percentage_divider = 100; | ||
1552 | if ((id == ASIC_INTERNAL_ENGINE_SS) || | 1559 | if ((id == ASIC_INTERNAL_ENGINE_SS) || |
1553 | (id == ASIC_INTERNAL_MEMORY_SS)) | 1560 | (id == ASIC_INTERNAL_MEMORY_SS)) |
1554 | ss->rate /= 100; | 1561 | ss->rate /= 100; |
@@ -3867,16 +3874,18 @@ int radeon_atom_init_mc_reg_table(struct radeon_device *rdev, | |||
3867 | ((u8 *)format + sizeof(ATOM_INIT_REG_INDEX_FORMAT)); | 3874 | ((u8 *)format + sizeof(ATOM_INIT_REG_INDEX_FORMAT)); |
3868 | } | 3875 | } |
3869 | reg_table->last = i; | 3876 | reg_table->last = i; |
3870 | while ((*(u32 *)reg_data != END_OF_REG_DATA_BLOCK) && | 3877 | while ((le32_to_cpu(*(u32 *)reg_data) != END_OF_REG_DATA_BLOCK) && |
3871 | (num_ranges < VBIOS_MAX_AC_TIMING_ENTRIES)) { | 3878 | (num_ranges < VBIOS_MAX_AC_TIMING_ENTRIES)) { |
3872 | t_mem_id = (u8)((*(u32 *)reg_data & MEM_ID_MASK) >> MEM_ID_SHIFT); | 3879 | t_mem_id = (u8)((le32_to_cpu(*(u32 *)reg_data) & MEM_ID_MASK) |
3880 | >> MEM_ID_SHIFT); | ||
3873 | if (module_index == t_mem_id) { | 3881 | if (module_index == t_mem_id) { |
3874 | reg_table->mc_reg_table_entry[num_ranges].mclk_max = | 3882 | reg_table->mc_reg_table_entry[num_ranges].mclk_max = |
3875 | (u32)((*(u32 *)reg_data & CLOCK_RANGE_MASK) >> CLOCK_RANGE_SHIFT); | 3883 | (u32)((le32_to_cpu(*(u32 *)reg_data) & CLOCK_RANGE_MASK) |
3884 | >> CLOCK_RANGE_SHIFT); | ||
3876 | for (i = 0, j = 1; i < reg_table->last; i++) { | 3885 | for (i = 0, j = 1; i < reg_table->last; i++) { |
3877 | if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_FROM_TABLE) { | 3886 | if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_FROM_TABLE) { |
3878 | reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = | 3887 | reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = |
3879 | (u32)*((u32 *)reg_data + j); | 3888 | (u32)le32_to_cpu(*((u32 *)reg_data + j)); |
3880 | j++; | 3889 | j++; |
3881 | } else if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_EQU_PREV) { | 3890 | } else if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_EQU_PREV) { |
3882 | reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = | 3891 | reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = |
@@ -3888,7 +3897,7 @@ int radeon_atom_init_mc_reg_table(struct radeon_device *rdev, | |||
3888 | reg_data = (ATOM_MEMORY_SETTING_DATA_BLOCK *) | 3897 | reg_data = (ATOM_MEMORY_SETTING_DATA_BLOCK *) |
3889 | ((u8 *)reg_data + le16_to_cpu(reg_block->usRegDataBlkSize)); | 3898 | ((u8 *)reg_data + le16_to_cpu(reg_block->usRegDataBlkSize)); |
3890 | } | 3899 | } |
3891 | if (*(u32 *)reg_data != END_OF_REG_DATA_BLOCK) | 3900 | if (le32_to_cpu(*(u32 *)reg_data) != END_OF_REG_DATA_BLOCK) |
3892 | return -EINVAL; | 3901 | return -EINVAL; |
3893 | reg_table->num_entries = num_ranges; | 3902 | reg_table->num_entries = num_ranges; |
3894 | } else | 3903 | } else |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 5bf50cec017e..9e3af24e1b05 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -470,6 +470,13 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
470 | DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n"); | 470 | DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n"); |
471 | } | 471 | } |
472 | break; | 472 | break; |
473 | case RADEON_INFO_MAX_SCLK: | ||
474 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && | ||
475 | rdev->pm.dpm_enabled) | ||
476 | *value = rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk * 10; | ||
477 | else | ||
478 | *value = rdev->pm.default_sclk * 10; | ||
479 | break; | ||
473 | default: | 480 | default: |
474 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); | 481 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); |
475 | return -EINVAL; | 482 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 28bba631b80c..7c53fb1cc46d 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -291,6 +291,7 @@ struct radeon_tv_regs { | |||
291 | 291 | ||
292 | struct radeon_atom_ss { | 292 | struct radeon_atom_ss { |
293 | uint16_t percentage; | 293 | uint16_t percentage; |
294 | uint16_t percentage_divider; | ||
294 | uint8_t type; | 295 | uint8_t type; |
295 | uint16_t step; | 296 | uint16_t step; |
296 | uint8_t delay; | 297 | uint8_t delay; |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 0b24c4c7dcf9..4e7f8922ae62 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -924,6 +924,10 @@ void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable) | |||
924 | 924 | ||
925 | if (rdev->asic->dpm.powergate_uvd) { | 925 | if (rdev->asic->dpm.powergate_uvd) { |
926 | mutex_lock(&rdev->pm.mutex); | 926 | mutex_lock(&rdev->pm.mutex); |
927 | /* don't powergate anything if we | ||
928 | have active but pause streams */ | ||
929 | enable |= rdev->pm.dpm.sd > 0; | ||
930 | enable |= rdev->pm.dpm.hd > 0; | ||
927 | /* enable/disable UVD */ | 931 | /* enable/disable UVD */ |
928 | radeon_dpm_powergate_uvd(rdev, !enable); | 932 | radeon_dpm_powergate_uvd(rdev, !enable); |
929 | mutex_unlock(&rdev->pm.mutex); | 933 | mutex_unlock(&rdev->pm.mutex); |
@@ -1231,6 +1235,9 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1231 | case CHIP_RV670: | 1235 | case CHIP_RV670: |
1232 | case CHIP_RS780: | 1236 | case CHIP_RS780: |
1233 | case CHIP_RS880: | 1237 | case CHIP_RS880: |
1238 | case CHIP_BARTS: | ||
1239 | case CHIP_TURKS: | ||
1240 | case CHIP_CAICOS: | ||
1234 | case CHIP_CAYMAN: | 1241 | case CHIP_CAYMAN: |
1235 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ | 1242 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ |
1236 | if (!rdev->rlc_fw) | 1243 | if (!rdev->rlc_fw) |
@@ -1256,9 +1263,6 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1256 | case CHIP_PALM: | 1263 | case CHIP_PALM: |
1257 | case CHIP_SUMO: | 1264 | case CHIP_SUMO: |
1258 | case CHIP_SUMO2: | 1265 | case CHIP_SUMO2: |
1259 | case CHIP_BARTS: | ||
1260 | case CHIP_TURKS: | ||
1261 | case CHIP_CAICOS: | ||
1262 | case CHIP_ARUBA: | 1266 | case CHIP_ARUBA: |
1263 | case CHIP_TAHITI: | 1267 | case CHIP_TAHITI: |
1264 | case CHIP_PITCAIRN: | 1268 | case CHIP_PITCAIRN: |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index b9c0529b4a2e..6781fee1eaad 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
@@ -91,6 +91,7 @@ int radeon_uvd_init(struct radeon_device *rdev) | |||
91 | case CHIP_VERDE: | 91 | case CHIP_VERDE: |
92 | case CHIP_PITCAIRN: | 92 | case CHIP_PITCAIRN: |
93 | case CHIP_ARUBA: | 93 | case CHIP_ARUBA: |
94 | case CHIP_OLAND: | ||
94 | fw_name = FIRMWARE_TAHITI; | 95 | fw_name = FIRMWARE_TAHITI; |
95 | break; | 96 | break; |
96 | 97 | ||
@@ -778,6 +779,8 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work) | |||
778 | 779 | ||
779 | if (radeon_fence_count_emitted(rdev, R600_RING_TYPE_UVD_INDEX) == 0) { | 780 | if (radeon_fence_count_emitted(rdev, R600_RING_TYPE_UVD_INDEX) == 0) { |
780 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { | 781 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { |
782 | radeon_uvd_count_handles(rdev, &rdev->pm.dpm.sd, | ||
783 | &rdev->pm.dpm.hd); | ||
781 | radeon_dpm_enable_uvd(rdev, false); | 784 | radeon_dpm_enable_uvd(rdev, false); |
782 | } else { | 785 | } else { |
783 | radeon_set_uvd_clocks(rdev, 0, 0); | 786 | radeon_set_uvd_clocks(rdev, 0, 0); |
diff --git a/drivers/gpu/drm/radeon/rv770_dpm.c b/drivers/gpu/drm/radeon/rv770_dpm.c index b95267846ff2..80c595aba359 100644 --- a/drivers/gpu/drm/radeon/rv770_dpm.c +++ b/drivers/gpu/drm/radeon/rv770_dpm.c | |||
@@ -2251,14 +2251,12 @@ static void rv7xx_parse_pplib_clock_info(struct radeon_device *rdev, | |||
2251 | pl->vddci = vddci; | 2251 | pl->vddci = vddci; |
2252 | } | 2252 | } |
2253 | 2253 | ||
2254 | if (rdev->family >= CHIP_BARTS) { | 2254 | if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == |
2255 | if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == | 2255 | ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { |
2256 | ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { | 2256 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; |
2257 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; | 2257 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; |
2258 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; | 2258 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; |
2259 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; | 2259 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci; |
2260 | rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci; | ||
2261 | } | ||
2262 | } | 2260 | } |
2263 | } | 2261 | } |
2264 | 2262 | ||
@@ -2538,6 +2536,12 @@ bool rv770_dpm_vblank_too_short(struct radeon_device *rdev) | |||
2538 | (rdev->pdev->subsystem_device == 0x1c42)) | 2536 | (rdev->pdev->subsystem_device == 0x1c42)) |
2539 | switch_limit = 200; | 2537 | switch_limit = 200; |
2540 | 2538 | ||
2539 | /* RV770 */ | ||
2540 | /* mclk switching doesn't seem to work reliably on desktop RV770s */ | ||
2541 | if ((rdev->family == CHIP_RV770) && | ||
2542 | !(rdev->flags & RADEON_IS_MOBILITY)) | ||
2543 | switch_limit = 0xffffffff; /* disable mclk switching */ | ||
2544 | |||
2541 | if (vblank_time < switch_limit) | 2545 | if (vblank_time < switch_limit) |
2542 | return true; | 2546 | return true; |
2543 | else | 2547 | else |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 22d3517ed6ad..07ce58716e44 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -5488,6 +5488,9 @@ static void si_init_pg(struct radeon_device *rdev) | |||
5488 | si_init_ao_cu_mask(rdev); | 5488 | si_init_ao_cu_mask(rdev); |
5489 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { | 5489 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { |
5490 | si_init_gfx_cgpg(rdev); | 5490 | si_init_gfx_cgpg(rdev); |
5491 | } else { | ||
5492 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | ||
5493 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | ||
5491 | } | 5494 | } |
5492 | si_enable_dma_pg(rdev, true); | 5495 | si_enable_dma_pg(rdev, true); |
5493 | si_enable_gfx_cgpg(rdev, true); | 5496 | si_enable_gfx_cgpg(rdev, true); |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 512919b0156a..36a5da4791ce 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -2395,7 +2395,7 @@ static int si_populate_sq_ramping_values(struct radeon_device *rdev, | |||
2395 | if (SISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT)) | 2395 | if (SISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT)) |
2396 | enable_sq_ramping = false; | 2396 | enable_sq_ramping = false; |
2397 | 2397 | ||
2398 | if (NISLANDS_DPM2_SQ_RAMP_LTI_RATIO <= (LTI_RATIO_MASK >> LTI_RATIO_SHIFT)) | 2398 | if (SISLANDS_DPM2_SQ_RAMP_LTI_RATIO <= (LTI_RATIO_MASK >> LTI_RATIO_SHIFT)) |
2399 | enable_sq_ramping = false; | 2399 | enable_sq_ramping = false; |
2400 | 2400 | ||
2401 | for (i = 0; i < state->performance_level_count; i++) { | 2401 | for (i = 0; i < state->performance_level_count; i++) { |
@@ -5413,7 +5413,7 @@ static void si_populate_mc_reg_addresses(struct radeon_device *rdev, | |||
5413 | 5413 | ||
5414 | for (i = 0, j = 0; j < si_pi->mc_reg_table.last; j++) { | 5414 | for (i = 0, j = 0; j < si_pi->mc_reg_table.last; j++) { |
5415 | if (si_pi->mc_reg_table.valid_flag & (1 << j)) { | 5415 | if (si_pi->mc_reg_table.valid_flag & (1 << j)) { |
5416 | if (i >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE) | 5416 | if (i >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) |
5417 | break; | 5417 | break; |
5418 | mc_reg_table->address[i].s0 = | 5418 | mc_reg_table->address[i].s0 = |
5419 | cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s0); | 5419 | cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s0); |
diff --git a/drivers/gpu/drm/radeon/uvd_v2_2.c b/drivers/gpu/drm/radeon/uvd_v2_2.c index b19ef4951085..824550db3fed 100644 --- a/drivers/gpu/drm/radeon/uvd_v2_2.c +++ b/drivers/gpu/drm/radeon/uvd_v2_2.c | |||
@@ -153,6 +153,7 @@ int uvd_v2_2_resume(struct radeon_device *rdev) | |||
153 | chip_id = 0x01000015; | 153 | chip_id = 0x01000015; |
154 | break; | 154 | break; |
155 | case CHIP_PITCAIRN: | 155 | case CHIP_PITCAIRN: |
156 | case CHIP_OLAND: | ||
156 | chip_id = 0x01000016; | 157 | chip_id = 0x01000016; |
157 | break; | 158 | break; |
158 | case CHIP_ARUBA: | 159 | case CHIP_ARUBA: |
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h index fe421e8a431b..d9ea3a73afe2 100644 --- a/include/uapi/drm/radeon_drm.h +++ b/include/uapi/drm/radeon_drm.h | |||
@@ -985,6 +985,8 @@ struct drm_radeon_cs { | |||
985 | #define RADEON_INFO_CIK_MACROTILE_MODE_ARRAY 0x18 | 985 | #define RADEON_INFO_CIK_MACROTILE_MODE_ARRAY 0x18 |
986 | /* query the number of render backends */ | 986 | /* query the number of render backends */ |
987 | #define RADEON_INFO_SI_BACKEND_ENABLED_MASK 0x19 | 987 | #define RADEON_INFO_SI_BACKEND_ENABLED_MASK 0x19 |
988 | /* max engine clock - needed for OpenCL */ | ||
989 | #define RADEON_INFO_MAX_SCLK 0x1a | ||
988 | 990 | ||
989 | 991 | ||
990 | struct drm_radeon_info { | 992 | struct drm_radeon_info { |