aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-01-20 19:26:50 -0500
committerDave Airlie <airlied@redhat.com>2014-01-20 19:26:50 -0500
commit8c9b2e322d5c9b4e77fd308984ea303de4b63e1c (patch)
tree707c3d6731c78f8d1d50d7e0a24898b3ad428020
parentcfd72a4c2089aa3938f37281a34d6eb3306d5fd8 (diff)
parent5d029339bb8ce69aeb68280c3de67d3cea456146 (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.c32
-rw-r--r--drivers/gpu/drm/radeon/atombios_dp.c18
-rw-r--r--drivers/gpu/drm/radeon/cik.c95
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c43
-rw-r--r--drivers/gpu/drm/radeon/ni.c16
-rw-r--r--drivers/gpu/drm/radeon/nid.h1
-rw-r--r--drivers/gpu/drm/radeon/r600.c13
-rw-r--r--drivers/gpu/drm/radeon/r600d.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c19
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_uvd.c3
-rw-r--r--drivers/gpu/drm/radeon/rv770_dpm.c20
-rw-r--r--drivers/gpu/drm/radeon/si.c3
-rw-r--r--drivers/gpu/drm/radeon/si_dpm.c4
-rw-r--r--drivers/gpu/drm/radeon/uvd_v2_2.c1
-rw-r--r--include/uapi/drm/radeon_drm.h2
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 */
3497static 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
3564bool cik_semaphore_ring_emit(struct radeon_device *rdev, 3593bool 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 */
167static 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,
1353void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 1352void 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
1390static void cayman_cp_enable(struct radeon_device *rdev, bool enable) 1388static 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
292struct radeon_atom_ss { 292struct 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
990struct drm_radeon_info { 992struct drm_radeon_info {