diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
29 files changed, 395 insertions, 144 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index b0ab185b86f..b1537000a10 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -555,6 +555,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 555 | dp_clock = dig_connector->dp_clock; | 555 | dp_clock = dig_connector->dp_clock; |
| 556 | } | 556 | } |
| 557 | } | 557 | } |
| 558 | /* this might work properly with the new pll algo */ | ||
| 558 | #if 0 /* doesn't work properly on some laptops */ | 559 | #if 0 /* doesn't work properly on some laptops */ |
| 559 | /* use recommended ref_div for ss */ | 560 | /* use recommended ref_div for ss */ |
| 560 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 561 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
| @@ -572,6 +573,11 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 572 | adjusted_clock = mode->clock * 2; | 573 | adjusted_clock = mode->clock * 2; |
| 573 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) | 574 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) |
| 574 | pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; | 575 | pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; |
| 576 | /* rv515 needs more testing with this option */ | ||
| 577 | if (rdev->family != CHIP_RV515) { | ||
| 578 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | ||
| 579 | pll->flags |= RADEON_PLL_IS_LCD; | ||
| 580 | } | ||
| 575 | } else { | 581 | } else { |
| 576 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC) | 582 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC) |
| 577 | pll->flags |= RADEON_PLL_NO_ODD_POST_DIV; | 583 | pll->flags |= RADEON_PLL_NO_ODD_POST_DIV; |
| @@ -606,14 +612,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 606 | args.v1.usPixelClock = cpu_to_le16(mode->clock / 10); | 612 | args.v1.usPixelClock = cpu_to_le16(mode->clock / 10); |
| 607 | args.v1.ucTransmitterID = radeon_encoder->encoder_id; | 613 | args.v1.ucTransmitterID = radeon_encoder->encoder_id; |
| 608 | args.v1.ucEncodeMode = encoder_mode; | 614 | args.v1.ucEncodeMode = encoder_mode; |
| 609 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { | 615 | if (ss_enabled) |
| 610 | if (ss_enabled) | ||
| 611 | args.v1.ucConfig |= | ||
| 612 | ADJUST_DISPLAY_CONFIG_SS_ENABLE; | ||
| 613 | } else if (encoder_mode == ATOM_ENCODER_MODE_LVDS) { | ||
| 614 | args.v1.ucConfig |= | 616 | args.v1.ucConfig |= |
| 615 | ADJUST_DISPLAY_CONFIG_SS_ENABLE; | 617 | ADJUST_DISPLAY_CONFIG_SS_ENABLE; |
| 616 | } | ||
| 617 | 618 | ||
| 618 | atom_execute_table(rdev->mode_info.atom_context, | 619 | atom_execute_table(rdev->mode_info.atom_context, |
| 619 | index, (uint32_t *)&args); | 620 | index, (uint32_t *)&args); |
| @@ -624,12 +625,12 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 624 | args.v3.sInput.ucTransmitterID = radeon_encoder->encoder_id; | 625 | args.v3.sInput.ucTransmitterID = radeon_encoder->encoder_id; |
| 625 | args.v3.sInput.ucEncodeMode = encoder_mode; | 626 | args.v3.sInput.ucEncodeMode = encoder_mode; |
| 626 | args.v3.sInput.ucDispPllConfig = 0; | 627 | args.v3.sInput.ucDispPllConfig = 0; |
| 628 | if (ss_enabled) | ||
| 629 | args.v3.sInput.ucDispPllConfig |= | ||
| 630 | DISPPLL_CONFIG_SS_ENABLE; | ||
| 627 | if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 631 | if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { |
| 628 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 632 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 629 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { | 633 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { |
| 630 | if (ss_enabled) | ||
| 631 | args.v3.sInput.ucDispPllConfig |= | ||
| 632 | DISPPLL_CONFIG_SS_ENABLE; | ||
| 633 | args.v3.sInput.ucDispPllConfig |= | 634 | args.v3.sInput.ucDispPllConfig |= |
| 634 | DISPPLL_CONFIG_COHERENT_MODE; | 635 | DISPPLL_CONFIG_COHERENT_MODE; |
| 635 | /* 16200 or 27000 */ | 636 | /* 16200 or 27000 */ |
| @@ -649,18 +650,11 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 649 | } | 650 | } |
| 650 | } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 651 | } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
| 651 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { | 652 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { |
| 652 | if (ss_enabled) | ||
| 653 | args.v3.sInput.ucDispPllConfig |= | ||
| 654 | DISPPLL_CONFIG_SS_ENABLE; | ||
| 655 | args.v3.sInput.ucDispPllConfig |= | 653 | args.v3.sInput.ucDispPllConfig |= |
| 656 | DISPPLL_CONFIG_COHERENT_MODE; | 654 | DISPPLL_CONFIG_COHERENT_MODE; |
| 657 | /* 16200 or 27000 */ | 655 | /* 16200 or 27000 */ |
| 658 | args.v3.sInput.usPixelClock = cpu_to_le16(dp_clock / 10); | 656 | args.v3.sInput.usPixelClock = cpu_to_le16(dp_clock / 10); |
| 659 | } else if (encoder_mode == ATOM_ENCODER_MODE_LVDS) { | 657 | } else if (encoder_mode != ATOM_ENCODER_MODE_LVDS) { |
| 660 | if (ss_enabled) | ||
| 661 | args.v3.sInput.ucDispPllConfig |= | ||
| 662 | DISPPLL_CONFIG_SS_ENABLE; | ||
| 663 | } else { | ||
| 664 | if (mode->clock > 165000) | 658 | if (mode->clock > 165000) |
| 665 | args.v3.sInput.ucDispPllConfig |= | 659 | args.v3.sInput.ucDispPllConfig |= |
| 666 | DISPPLL_CONFIG_DUAL_LINK; | 660 | DISPPLL_CONFIG_DUAL_LINK; |
| @@ -963,8 +957,16 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
| 963 | /* adjust pixel clock as needed */ | 957 | /* adjust pixel clock as needed */ |
| 964 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); | 958 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); |
| 965 | 959 | ||
| 966 | radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | 960 | /* rv515 seems happier with the old algo */ |
| 967 | &ref_div, &post_div); | 961 | if (rdev->family == CHIP_RV515) |
| 962 | radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | ||
| 963 | &ref_div, &post_div); | ||
| 964 | else if (ASIC_IS_AVIVO(rdev)) | ||
| 965 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | ||
| 966 | &ref_div, &post_div); | ||
| 967 | else | ||
| 968 | radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | ||
| 969 | &ref_div, &post_div); | ||
| 968 | 970 | ||
| 969 | atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss); | 971 | atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss); |
| 970 | 972 | ||
| @@ -1006,6 +1008,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1006 | struct radeon_bo *rbo; | 1008 | struct radeon_bo *rbo; |
| 1007 | uint64_t fb_location; | 1009 | uint64_t fb_location; |
| 1008 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1010 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
| 1011 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); | ||
| 1009 | int r; | 1012 | int r; |
| 1010 | 1013 | ||
| 1011 | /* no fb bound */ | 1014 | /* no fb bound */ |
| @@ -1057,11 +1060,17 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1057 | case 16: | 1060 | case 16: |
| 1058 | fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | | 1061 | fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | |
| 1059 | EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565)); | 1062 | EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565)); |
| 1063 | #ifdef __BIG_ENDIAN | ||
| 1064 | fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); | ||
| 1065 | #endif | ||
| 1060 | break; | 1066 | break; |
| 1061 | case 24: | 1067 | case 24: |
| 1062 | case 32: | 1068 | case 32: |
| 1063 | fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | | 1069 | fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | |
| 1064 | EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); | 1070 | EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); |
| 1071 | #ifdef __BIG_ENDIAN | ||
| 1072 | fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); | ||
| 1073 | #endif | ||
| 1065 | break; | 1074 | break; |
| 1066 | default: | 1075 | default: |
| 1067 | DRM_ERROR("Unsupported screen depth %d\n", | 1076 | DRM_ERROR("Unsupported screen depth %d\n", |
| @@ -1106,6 +1115,7 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1106 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | 1115 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, |
| 1107 | (u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK); | 1116 | (u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK); |
| 1108 | WREG32(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); | 1117 | WREG32(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); |
| 1118 | WREG32(EVERGREEN_GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap); | ||
| 1109 | 1119 | ||
| 1110 | WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); | 1120 | WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); |
| 1111 | WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); | 1121 | WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); |
| @@ -1162,6 +1172,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1162 | struct drm_framebuffer *target_fb; | 1172 | struct drm_framebuffer *target_fb; |
| 1163 | uint64_t fb_location; | 1173 | uint64_t fb_location; |
| 1164 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1174 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
| 1175 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; | ||
| 1165 | int r; | 1176 | int r; |
| 1166 | 1177 | ||
| 1167 | /* no fb bound */ | 1178 | /* no fb bound */ |
| @@ -1215,12 +1226,18 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1215 | fb_format = | 1226 | fb_format = |
| 1216 | AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | | 1227 | AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | |
| 1217 | AVIVO_D1GRPH_CONTROL_16BPP_RGB565; | 1228 | AVIVO_D1GRPH_CONTROL_16BPP_RGB565; |
| 1229 | #ifdef __BIG_ENDIAN | ||
| 1230 | fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; | ||
| 1231 | #endif | ||
| 1218 | break; | 1232 | break; |
| 1219 | case 24: | 1233 | case 24: |
| 1220 | case 32: | 1234 | case 32: |
| 1221 | fb_format = | 1235 | fb_format = |
| 1222 | AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | | 1236 | AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | |
| 1223 | AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; | 1237 | AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; |
| 1238 | #ifdef __BIG_ENDIAN | ||
| 1239 | fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT; | ||
| 1240 | #endif | ||
| 1224 | break; | 1241 | break; |
| 1225 | default: | 1242 | default: |
| 1226 | DRM_ERROR("Unsupported screen depth %d\n", | 1243 | DRM_ERROR("Unsupported screen depth %d\n", |
| @@ -1260,6 +1277,8 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1260 | WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + | 1277 | WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + |
| 1261 | radeon_crtc->crtc_offset, (u32) fb_location); | 1278 | radeon_crtc->crtc_offset, (u32) fb_location); |
| 1262 | WREG32(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); | 1279 | WREG32(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); |
| 1280 | if (rdev->family >= CHIP_R600) | ||
| 1281 | WREG32(R600_D1GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap); | ||
| 1263 | 1282 | ||
| 1264 | WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); | 1283 | WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); |
| 1265 | WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); | 1284 | WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 4e7778d44b8..695de9a3850 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -187,9 +187,9 @@ static int dp_link_clock_for_mode_clock(u8 dpcd[DP_DPCD_SIZE], int mode_clock) | |||
| 187 | int dp_mode_valid(u8 dpcd[DP_DPCD_SIZE], int mode_clock) | 187 | int dp_mode_valid(u8 dpcd[DP_DPCD_SIZE], int mode_clock) |
| 188 | { | 188 | { |
| 189 | int lanes = dp_lanes_for_mode_clock(dpcd, mode_clock); | 189 | int lanes = dp_lanes_for_mode_clock(dpcd, mode_clock); |
| 190 | int bw = dp_lanes_for_mode_clock(dpcd, mode_clock); | 190 | int dp_clock = dp_link_clock_for_mode_clock(dpcd, mode_clock); |
| 191 | 191 | ||
| 192 | if ((lanes == 0) || (bw == 0)) | 192 | if ((lanes == 0) || (dp_clock == 0)) |
| 193 | return MODE_CLOCK_HIGH; | 193 | return MODE_CLOCK_HIGH; |
| 194 | 194 | ||
| 195 | return MODE_OK; | 195 | return MODE_OK; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index a8973acb398..ffdc8332b76 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -97,26 +97,29 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | |||
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | /* get temperature in millidegrees */ | 99 | /* get temperature in millidegrees */ |
| 100 | u32 evergreen_get_temp(struct radeon_device *rdev) | 100 | int evergreen_get_temp(struct radeon_device *rdev) |
| 101 | { | 101 | { |
| 102 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | 102 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> |
| 103 | ASIC_T_SHIFT; | 103 | ASIC_T_SHIFT; |
| 104 | u32 actual_temp = 0; | 104 | u32 actual_temp = 0; |
| 105 | 105 | ||
| 106 | if ((temp >> 10) & 1) | 106 | if (temp & 0x400) |
| 107 | actual_temp = 0; | 107 | actual_temp = -256; |
| 108 | else if ((temp >> 9) & 1) | 108 | else if (temp & 0x200) |
| 109 | actual_temp = 255; | 109 | actual_temp = 255; |
| 110 | else | 110 | else if (temp & 0x100) { |
| 111 | actual_temp = (temp >> 1) & 0xff; | 111 | actual_temp = temp & 0x1ff; |
| 112 | actual_temp |= ~0x1ff; | ||
| 113 | } else | ||
| 114 | actual_temp = temp & 0xff; | ||
| 112 | 115 | ||
| 113 | return actual_temp * 1000; | 116 | return (actual_temp * 1000) / 2; |
| 114 | } | 117 | } |
| 115 | 118 | ||
| 116 | u32 sumo_get_temp(struct radeon_device *rdev) | 119 | int sumo_get_temp(struct radeon_device *rdev) |
| 117 | { | 120 | { |
| 118 | u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff; | 121 | u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff; |
| 119 | u32 actual_temp = (temp >> 1) & 0xff; | 122 | int actual_temp = temp - 49; |
| 120 | 123 | ||
| 121 | return actual_temp * 1000; | 124 | return actual_temp * 1000; |
| 122 | } | 125 | } |
| @@ -1182,6 +1185,18 @@ static void evergreen_mc_program(struct radeon_device *rdev) | |||
| 1182 | /* | 1185 | /* |
| 1183 | * CP. | 1186 | * CP. |
| 1184 | */ | 1187 | */ |
| 1188 | void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) | ||
| 1189 | { | ||
| 1190 | /* set to DX10/11 mode */ | ||
| 1191 | radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0)); | ||
| 1192 | radeon_ring_write(rdev, 1); | ||
| 1193 | /* FIXME: implement */ | ||
| 1194 | radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); | ||
| 1195 | radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC); | ||
| 1196 | radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF); | ||
| 1197 | radeon_ring_write(rdev, ib->length_dw); | ||
| 1198 | } | ||
| 1199 | |||
| 1185 | 1200 | ||
| 1186 | static int evergreen_cp_load_microcode(struct radeon_device *rdev) | 1201 | static int evergreen_cp_load_microcode(struct radeon_device *rdev) |
| 1187 | { | 1202 | { |
| @@ -1233,7 +1248,7 @@ static int evergreen_cp_start(struct radeon_device *rdev) | |||
| 1233 | cp_me = 0xff; | 1248 | cp_me = 0xff; |
| 1234 | WREG32(CP_ME_CNTL, cp_me); | 1249 | WREG32(CP_ME_CNTL, cp_me); |
| 1235 | 1250 | ||
| 1236 | r = radeon_ring_lock(rdev, evergreen_default_size + 15); | 1251 | r = radeon_ring_lock(rdev, evergreen_default_size + 19); |
| 1237 | if (r) { | 1252 | if (r) { |
| 1238 | DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); | 1253 | DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); |
| 1239 | return r; | 1254 | return r; |
| @@ -1266,6 +1281,11 @@ static int evergreen_cp_start(struct radeon_device *rdev) | |||
| 1266 | radeon_ring_write(rdev, 0xffffffff); | 1281 | radeon_ring_write(rdev, 0xffffffff); |
| 1267 | radeon_ring_write(rdev, 0xffffffff); | 1282 | radeon_ring_write(rdev, 0xffffffff); |
| 1268 | 1283 | ||
| 1284 | radeon_ring_write(rdev, 0xc0026900); | ||
| 1285 | radeon_ring_write(rdev, 0x00000316); | ||
| 1286 | radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ | ||
| 1287 | radeon_ring_write(rdev, 0x00000010); /* */ | ||
| 1288 | |||
| 1269 | radeon_ring_unlock_commit(rdev); | 1289 | radeon_ring_unlock_commit(rdev); |
| 1270 | 1290 | ||
| 1271 | return 0; | 1291 | return 0; |
| @@ -2072,6 +2092,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2072 | WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); | 2092 | WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); |
| 2073 | 2093 | ||
| 2074 | WREG32(VGT_GS_VERTEX_REUSE, 16); | 2094 | WREG32(VGT_GS_VERTEX_REUSE, 16); |
| 2095 | WREG32(PA_SU_LINE_STIPPLE_VALUE, 0); | ||
| 2075 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); | 2096 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); |
| 2076 | 2097 | ||
| 2077 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); | 2098 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); |
| @@ -2201,6 +2222,9 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | |||
| 2201 | struct evergreen_mc_save save; | 2222 | struct evergreen_mc_save save; |
| 2202 | u32 grbm_reset = 0; | 2223 | u32 grbm_reset = 0; |
| 2203 | 2224 | ||
| 2225 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | ||
| 2226 | return 0; | ||
| 2227 | |||
| 2204 | dev_info(rdev->dev, "GPU softreset \n"); | 2228 | dev_info(rdev->dev, "GPU softreset \n"); |
| 2205 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | 2229 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", |
| 2206 | RREG32(GRBM_STATUS)); | 2230 | RREG32(GRBM_STATUS)); |
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c index b758dc7f2f2..a1ba4b3053d 100644 --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c | |||
| @@ -232,7 +232,7 @@ draw_auto(struct radeon_device *rdev) | |||
| 232 | 232 | ||
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | /* emits 30 */ | 235 | /* emits 36 */ |
| 236 | static void | 236 | static void |
| 237 | set_default_state(struct radeon_device *rdev) | 237 | set_default_state(struct radeon_device *rdev) |
| 238 | { | 238 | { |
| @@ -245,6 +245,8 @@ set_default_state(struct radeon_device *rdev) | |||
| 245 | int num_hs_threads, num_ls_threads; | 245 | int num_hs_threads, num_ls_threads; |
| 246 | int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries; | 246 | int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries; |
| 247 | int num_hs_stack_entries, num_ls_stack_entries; | 247 | int num_hs_stack_entries, num_ls_stack_entries; |
| 248 | u64 gpu_addr; | ||
| 249 | int dwords; | ||
| 248 | 250 | ||
| 249 | switch (rdev->family) { | 251 | switch (rdev->family) { |
| 250 | case CHIP_CEDAR: | 252 | case CHIP_CEDAR: |
| @@ -497,6 +499,18 @@ set_default_state(struct radeon_device *rdev) | |||
| 497 | radeon_ring_write(rdev, 0x00000000); | 499 | radeon_ring_write(rdev, 0x00000000); |
| 498 | radeon_ring_write(rdev, 0x00000000); | 500 | radeon_ring_write(rdev, 0x00000000); |
| 499 | 501 | ||
| 502 | /* set to DX10/11 mode */ | ||
| 503 | radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0)); | ||
| 504 | radeon_ring_write(rdev, 1); | ||
| 505 | |||
| 506 | /* emit an IB pointing at default state */ | ||
| 507 | dwords = ALIGN(rdev->r600_blit.state_len, 0x10); | ||
| 508 | gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset; | ||
| 509 | radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); | ||
| 510 | radeon_ring_write(rdev, gpu_addr & 0xFFFFFFFC); | ||
| 511 | radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF); | ||
| 512 | radeon_ring_write(rdev, dwords); | ||
| 513 | |||
| 500 | } | 514 | } |
| 501 | 515 | ||
| 502 | static inline uint32_t i2f(uint32_t input) | 516 | static inline uint32_t i2f(uint32_t input) |
| @@ -527,8 +541,10 @@ static inline uint32_t i2f(uint32_t input) | |||
| 527 | int evergreen_blit_init(struct radeon_device *rdev) | 541 | int evergreen_blit_init(struct radeon_device *rdev) |
| 528 | { | 542 | { |
| 529 | u32 obj_size; | 543 | u32 obj_size; |
| 530 | int r; | 544 | int r, dwords; |
| 531 | void *ptr; | 545 | void *ptr; |
| 546 | u32 packet2s[16]; | ||
| 547 | int num_packet2s = 0; | ||
| 532 | 548 | ||
| 533 | /* pin copy shader into vram if already initialized */ | 549 | /* pin copy shader into vram if already initialized */ |
| 534 | if (rdev->r600_blit.shader_obj) | 550 | if (rdev->r600_blit.shader_obj) |
| @@ -536,8 +552,17 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
| 536 | 552 | ||
| 537 | mutex_init(&rdev->r600_blit.mutex); | 553 | mutex_init(&rdev->r600_blit.mutex); |
| 538 | rdev->r600_blit.state_offset = 0; | 554 | rdev->r600_blit.state_offset = 0; |
| 539 | rdev->r600_blit.state_len = 0; | 555 | |
| 540 | obj_size = 0; | 556 | rdev->r600_blit.state_len = evergreen_default_size; |
| 557 | |||
| 558 | dwords = rdev->r600_blit.state_len; | ||
| 559 | while (dwords & 0xf) { | ||
| 560 | packet2s[num_packet2s++] = PACKET2(0); | ||
| 561 | dwords++; | ||
| 562 | } | ||
| 563 | |||
| 564 | obj_size = dwords * 4; | ||
| 565 | obj_size = ALIGN(obj_size, 256); | ||
| 541 | 566 | ||
| 542 | rdev->r600_blit.vs_offset = obj_size; | 567 | rdev->r600_blit.vs_offset = obj_size; |
| 543 | obj_size += evergreen_vs_size * 4; | 568 | obj_size += evergreen_vs_size * 4; |
| @@ -567,6 +592,12 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
| 567 | return r; | 592 | return r; |
| 568 | } | 593 | } |
| 569 | 594 | ||
| 595 | memcpy_toio(ptr + rdev->r600_blit.state_offset, | ||
| 596 | evergreen_default_state, rdev->r600_blit.state_len * 4); | ||
| 597 | |||
| 598 | if (num_packet2s) | ||
| 599 | memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), | ||
| 600 | packet2s, num_packet2s * 4); | ||
| 570 | memcpy(ptr + rdev->r600_blit.vs_offset, evergreen_vs, evergreen_vs_size * 4); | 601 | memcpy(ptr + rdev->r600_blit.vs_offset, evergreen_vs, evergreen_vs_size * 4); |
| 571 | memcpy(ptr + rdev->r600_blit.ps_offset, evergreen_ps, evergreen_ps_size * 4); | 602 | memcpy(ptr + rdev->r600_blit.ps_offset, evergreen_ps, evergreen_ps_size * 4); |
| 572 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); | 603 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); |
| @@ -652,7 +683,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
| 652 | /* calculate number of loops correctly */ | 683 | /* calculate number of loops correctly */ |
| 653 | ring_size = num_loops * dwords_per_loop; | 684 | ring_size = num_loops * dwords_per_loop; |
| 654 | /* set default + shaders */ | 685 | /* set default + shaders */ |
| 655 | ring_size += 46; /* shaders + def state */ | 686 | ring_size += 52; /* shaders + def state */ |
| 656 | ring_size += 10; /* fence emit for VB IB */ | 687 | ring_size += 10; /* fence emit for VB IB */ |
| 657 | ring_size += 5; /* done copy */ | 688 | ring_size += 5; /* done copy */ |
| 658 | ring_size += 10; /* fence emit for done copy */ | 689 | ring_size += 10; /* fence emit for done copy */ |
| @@ -660,7 +691,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
| 660 | if (r) | 691 | if (r) |
| 661 | return r; | 692 | return r; |
| 662 | 693 | ||
| 663 | set_default_state(rdev); /* 30 */ | 694 | set_default_state(rdev); /* 36 */ |
| 664 | set_shaders(rdev); /* 16 */ | 695 | set_shaders(rdev); /* 16 */ |
| 665 | return 0; | 696 | return 0; |
| 666 | } | 697 | } |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 36d32d83d86..afec1aca2a7 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -240,6 +240,7 @@ | |||
| 240 | #define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0) | 240 | #define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0) |
| 241 | #define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16) | 241 | #define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16) |
| 242 | #define PA_SC_LINE_STIPPLE 0x28A0C | 242 | #define PA_SC_LINE_STIPPLE 0x28A0C |
| 243 | #define PA_SU_LINE_STIPPLE_VALUE 0x8A60 | ||
| 243 | #define PA_SC_LINE_STIPPLE_STATE 0x8B10 | 244 | #define PA_SC_LINE_STIPPLE_STATE 0x8B10 |
| 244 | 245 | ||
| 245 | #define SCRATCH_REG0 0x8500 | 246 | #define SCRATCH_REG0 0x8500 |
| @@ -652,6 +653,7 @@ | |||
| 652 | #define PACKET3_DISPATCH_DIRECT 0x15 | 653 | #define PACKET3_DISPATCH_DIRECT 0x15 |
| 653 | #define PACKET3_DISPATCH_INDIRECT 0x16 | 654 | #define PACKET3_DISPATCH_INDIRECT 0x16 |
| 654 | #define PACKET3_INDIRECT_BUFFER_END 0x17 | 655 | #define PACKET3_INDIRECT_BUFFER_END 0x17 |
| 656 | #define PACKET3_MODE_CONTROL 0x18 | ||
| 655 | #define PACKET3_SET_PREDICATION 0x20 | 657 | #define PACKET3_SET_PREDICATION 0x20 |
| 656 | #define PACKET3_REG_RMW 0x21 | 658 | #define PACKET3_REG_RMW 0x21 |
| 657 | #define PACKET3_COND_EXEC 0x22 | 659 | #define PACKET3_COND_EXEC 0x22 |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 46da5142b13..5f15820efe1 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1031,8 +1031,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1031 | WREG32(RADEON_CP_CSQ_MODE, | 1031 | WREG32(RADEON_CP_CSQ_MODE, |
| 1032 | REG_SET(RADEON_INDIRECT2_START, indirect2_start) | | 1032 | REG_SET(RADEON_INDIRECT2_START, indirect2_start) | |
| 1033 | REG_SET(RADEON_INDIRECT1_START, indirect1_start)); | 1033 | REG_SET(RADEON_INDIRECT1_START, indirect1_start)); |
| 1034 | WREG32(0x718, 0); | 1034 | WREG32(RADEON_CP_RB_WPTR_DELAY, 0); |
| 1035 | WREG32(0x744, 0x00004D4D); | 1035 | WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D); |
| 1036 | WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM); | 1036 | WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM); |
| 1037 | radeon_ring_start(rdev); | 1037 | radeon_ring_start(rdev); |
| 1038 | r = radeon_ring_test(rdev); | 1038 | r = radeon_ring_test(rdev); |
| @@ -2347,10 +2347,10 @@ void r100_vga_set_state(struct radeon_device *rdev, bool state) | |||
| 2347 | 2347 | ||
| 2348 | temp = RREG32(RADEON_CONFIG_CNTL); | 2348 | temp = RREG32(RADEON_CONFIG_CNTL); |
| 2349 | if (state == false) { | 2349 | if (state == false) { |
| 2350 | temp &= ~(1<<8); | 2350 | temp &= ~RADEON_CFG_VGA_RAM_EN; |
| 2351 | temp |= (1<<9); | 2351 | temp |= RADEON_CFG_VGA_IO_DIS; |
| 2352 | } else { | 2352 | } else { |
| 2353 | temp &= ~(1<<9); | 2353 | temp &= ~RADEON_CFG_VGA_IO_DIS; |
| 2354 | } | 2354 | } |
| 2355 | WREG32(RADEON_CONFIG_CNTL, temp); | 2355 | WREG32(RADEON_CONFIG_CNTL, temp); |
| 2356 | } | 2356 | } |
| @@ -3522,7 +3522,7 @@ int r100_ring_test(struct radeon_device *rdev) | |||
| 3522 | if (i < rdev->usec_timeout) { | 3522 | if (i < rdev->usec_timeout) { |
| 3523 | DRM_INFO("ring test succeeded in %d usecs\n", i); | 3523 | DRM_INFO("ring test succeeded in %d usecs\n", i); |
| 3524 | } else { | 3524 | } else { |
| 3525 | DRM_ERROR("radeon: ring test failed (sracth(0x%04X)=0x%08X)\n", | 3525 | DRM_ERROR("radeon: ring test failed (scratch(0x%04X)=0x%08X)\n", |
| 3526 | scratch, tmp); | 3526 | scratch, tmp); |
| 3527 | r = -EINVAL; | 3527 | r = -EINVAL; |
| 3528 | } | 3528 | } |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index cf862ca580b..55fe5ba7def 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -69,6 +69,9 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
| 69 | mb(); | 69 | mb(); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | #define R300_PTE_WRITEABLE (1 << 2) | ||
| 73 | #define R300_PTE_READABLE (1 << 3) | ||
| 74 | |||
| 72 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 75 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
| 73 | { | 76 | { |
| 74 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | 77 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
| @@ -78,7 +81,7 @@ int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 78 | } | 81 | } |
| 79 | addr = (lower_32_bits(addr) >> 8) | | 82 | addr = (lower_32_bits(addr) >> 8) | |
| 80 | ((upper_32_bits(addr) & 0xff) << 24) | | 83 | ((upper_32_bits(addr) & 0xff) << 24) | |
| 81 | 0xc; | 84 | R300_PTE_WRITEABLE | R300_PTE_READABLE; |
| 82 | /* on x86 we want this to be CPU endian, on powerpc | 85 | /* on x86 we want this to be CPU endian, on powerpc |
| 83 | * on powerpc without HW swappers, it'll get swapped on way | 86 | * on powerpc without HW swappers, it'll get swapped on way |
| 84 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | 87 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
| @@ -135,7 +138,7 @@ int rv370_pcie_gart_enable(struct radeon_device *rdev) | |||
| 135 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start); | 138 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start); |
| 136 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); | 139 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); |
| 137 | /* Clear error */ | 140 | /* Clear error */ |
| 138 | WREG32_PCIE(0x18, 0); | 141 | WREG32_PCIE(RADEON_PCIE_TX_GART_ERROR, 0); |
| 139 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); | 142 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
| 140 | tmp |= RADEON_PCIE_TX_GART_EN; | 143 | tmp |= RADEON_PCIE_TX_GART_EN; |
| 141 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; | 144 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index c387346f93a..0b59ed7c7d2 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -96,7 +96,7 @@ void r420_pipes_init(struct radeon_device *rdev) | |||
| 96 | "programming pipes. Bad things might happen.\n"); | 96 | "programming pipes. Bad things might happen.\n"); |
| 97 | } | 97 | } |
| 98 | /* get max number of pipes */ | 98 | /* get max number of pipes */ |
| 99 | gb_pipe_select = RREG32(0x402C); | 99 | gb_pipe_select = RREG32(R400_GB_PIPE_SELECT); |
| 100 | num_pipes = ((gb_pipe_select >> 12) & 3) + 1; | 100 | num_pipes = ((gb_pipe_select >> 12) & 3) + 1; |
| 101 | 101 | ||
| 102 | /* SE chips have 1 pipe */ | 102 | /* SE chips have 1 pipe */ |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 3c8677f9e38..2ce80d97656 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -79,8 +79,8 @@ static void r520_gpu_init(struct radeon_device *rdev) | |||
| 79 | WREG32(0x4128, 0xFF); | 79 | WREG32(0x4128, 0xFF); |
| 80 | } | 80 | } |
| 81 | r420_pipes_init(rdev); | 81 | r420_pipes_init(rdev); |
| 82 | gb_pipe_select = RREG32(0x402C); | 82 | gb_pipe_select = RREG32(R400_GB_PIPE_SELECT); |
| 83 | tmp = RREG32(0x170C); | 83 | tmp = RREG32(R300_DST_PIPE_CONFIG); |
| 84 | pipe_select_current = (tmp >> 2) & 3; | 84 | pipe_select_current = (tmp >> 2) & 3; |
| 85 | tmp = (1 << pipe_select_current) | | 85 | tmp = (1 << pipe_select_current) | |
| 86 | (((gb_pipe_select >> 8) & 0xF) << 4); | 86 | (((gb_pipe_select >> 8) & 0xF) << 4); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index aca2236268f..650672a0f5a 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -97,12 +97,16 @@ void r600_irq_disable(struct radeon_device *rdev); | |||
| 97 | static void r600_pcie_gen2_enable(struct radeon_device *rdev); | 97 | static void r600_pcie_gen2_enable(struct radeon_device *rdev); |
| 98 | 98 | ||
| 99 | /* get temperature in millidegrees */ | 99 | /* get temperature in millidegrees */ |
| 100 | u32 rv6xx_get_temp(struct radeon_device *rdev) | 100 | int rv6xx_get_temp(struct radeon_device *rdev) |
| 101 | { | 101 | { |
| 102 | u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> | 102 | u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> |
| 103 | ASIC_T_SHIFT; | 103 | ASIC_T_SHIFT; |
| 104 | int actual_temp = temp & 0xff; | ||
| 104 | 105 | ||
| 105 | return temp * 1000; | 106 | if (temp & 0x100) |
| 107 | actual_temp -= 256; | ||
| 108 | |||
| 109 | return actual_temp * 1000; | ||
| 106 | } | 110 | } |
| 107 | 111 | ||
| 108 | void r600_pm_get_dynpm_state(struct radeon_device *rdev) | 112 | void r600_pm_get_dynpm_state(struct radeon_device *rdev) |
| @@ -1287,6 +1291,9 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 1287 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); | 1291 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); |
| 1288 | u32 tmp; | 1292 | u32 tmp; |
| 1289 | 1293 | ||
| 1294 | if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) | ||
| 1295 | return 0; | ||
| 1296 | |||
| 1290 | dev_info(rdev->dev, "GPU softreset \n"); | 1297 | dev_info(rdev->dev, "GPU softreset \n"); |
| 1291 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | 1298 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", |
| 1292 | RREG32(R_008010_GRBM_STATUS)); | 1299 | RREG32(R_008010_GRBM_STATUS)); |
diff --git a/drivers/gpu/drm/radeon/r600_reg.h b/drivers/gpu/drm/radeon/r600_reg.h index 33cda016b08..f869897c745 100644 --- a/drivers/gpu/drm/radeon/r600_reg.h +++ b/drivers/gpu/drm/radeon/r600_reg.h | |||
| @@ -81,7 +81,11 @@ | |||
| 81 | #define R600_MEDIUM_VID_LOWER_GPIO_CNTL 0x720 | 81 | #define R600_MEDIUM_VID_LOWER_GPIO_CNTL 0x720 |
| 82 | #define R600_LOW_VID_LOWER_GPIO_CNTL 0x724 | 82 | #define R600_LOW_VID_LOWER_GPIO_CNTL 0x724 |
| 83 | 83 | ||
| 84 | 84 | #define R600_D1GRPH_SWAP_CONTROL 0x610C | |
| 85 | # define R600_D1GRPH_SWAP_ENDIAN_NONE (0 << 0) | ||
| 86 | # define R600_D1GRPH_SWAP_ENDIAN_16BIT (1 << 0) | ||
| 87 | # define R600_D1GRPH_SWAP_ENDIAN_32BIT (2 << 0) | ||
| 88 | # define R600_D1GRPH_SWAP_ENDIAN_64BIT (3 << 0) | ||
| 85 | 89 | ||
| 86 | #define R600_HDP_NONSURFACE_BASE 0x2c04 | 90 | #define R600_HDP_NONSURFACE_BASE 0x2c04 |
| 87 | 91 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 71d2a554bbe..56c48b67ef3 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -179,10 +179,10 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev); | |||
| 179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
| 180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); | 180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); |
| 181 | void rs690_pm_info(struct radeon_device *rdev); | 181 | void rs690_pm_info(struct radeon_device *rdev); |
| 182 | extern u32 rv6xx_get_temp(struct radeon_device *rdev); | 182 | extern int rv6xx_get_temp(struct radeon_device *rdev); |
| 183 | extern u32 rv770_get_temp(struct radeon_device *rdev); | 183 | extern int rv770_get_temp(struct radeon_device *rdev); |
| 184 | extern u32 evergreen_get_temp(struct radeon_device *rdev); | 184 | extern int evergreen_get_temp(struct radeon_device *rdev); |
| 185 | extern u32 sumo_get_temp(struct radeon_device *rdev); | 185 | extern int sumo_get_temp(struct radeon_device *rdev); |
| 186 | 186 | ||
| 187 | /* | 187 | /* |
| 188 | * Fences. | 188 | * Fences. |
| @@ -812,8 +812,7 @@ struct radeon_pm { | |||
| 812 | fixed20_12 sclk; | 812 | fixed20_12 sclk; |
| 813 | fixed20_12 mclk; | 813 | fixed20_12 mclk; |
| 814 | fixed20_12 needed_bandwidth; | 814 | fixed20_12 needed_bandwidth; |
| 815 | /* XXX: use a define for num power modes */ | 815 | struct radeon_power_state *power_state; |
| 816 | struct radeon_power_state power_state[8]; | ||
| 817 | /* number of valid power states */ | 816 | /* number of valid power states */ |
| 818 | int num_power_states; | 817 | int num_power_states; |
| 819 | int current_power_state_index; | 818 | int current_power_state_index; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 3a1b1618622..e75d63b8e21 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -759,7 +759,7 @@ static struct radeon_asic evergreen_asic = { | |||
| 759 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, | 759 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 760 | .gart_set_page = &rs600_gart_set_page, | 760 | .gart_set_page = &rs600_gart_set_page, |
| 761 | .ring_test = &r600_ring_test, | 761 | .ring_test = &r600_ring_test, |
| 762 | .ring_ib_execute = &r600_ring_ib_execute, | 762 | .ring_ib_execute = &evergreen_ring_ib_execute, |
| 763 | .irq_set = &evergreen_irq_set, | 763 | .irq_set = &evergreen_irq_set, |
| 764 | .irq_process = &evergreen_irq_process, | 764 | .irq_process = &evergreen_irq_process, |
| 765 | .get_vblank_counter = &evergreen_get_vblank_counter, | 765 | .get_vblank_counter = &evergreen_get_vblank_counter, |
| @@ -805,7 +805,7 @@ static struct radeon_asic sumo_asic = { | |||
| 805 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, | 805 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 806 | .gart_set_page = &rs600_gart_set_page, | 806 | .gart_set_page = &rs600_gart_set_page, |
| 807 | .ring_test = &r600_ring_test, | 807 | .ring_test = &r600_ring_test, |
| 808 | .ring_ib_execute = &r600_ring_ib_execute, | 808 | .ring_ib_execute = &evergreen_ring_ib_execute, |
| 809 | .irq_set = &evergreen_irq_set, | 809 | .irq_set = &evergreen_irq_set, |
| 810 | .irq_process = &evergreen_irq_process, | 810 | .irq_process = &evergreen_irq_process, |
| 811 | .get_vblank_counter = &evergreen_get_vblank_counter, | 811 | .get_vblank_counter = &evergreen_get_vblank_counter, |
| @@ -848,7 +848,7 @@ static struct radeon_asic btc_asic = { | |||
| 848 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, | 848 | .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 849 | .gart_set_page = &rs600_gart_set_page, | 849 | .gart_set_page = &rs600_gart_set_page, |
| 850 | .ring_test = &r600_ring_test, | 850 | .ring_test = &r600_ring_test, |
| 851 | .ring_ib_execute = &r600_ring_ib_execute, | 851 | .ring_ib_execute = &evergreen_ring_ib_execute, |
| 852 | .irq_set = &evergreen_irq_set, | 852 | .irq_set = &evergreen_irq_set, |
| 853 | .irq_process = &evergreen_irq_process, | 853 | .irq_process = &evergreen_irq_process, |
| 854 | .get_vblank_counter = &evergreen_get_vblank_counter, | 854 | .get_vblank_counter = &evergreen_get_vblank_counter, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index e01f0771853..c59bd98a202 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -355,6 +355,7 @@ int evergreen_resume(struct radeon_device *rdev); | |||
| 355 | bool evergreen_gpu_is_lockup(struct radeon_device *rdev); | 355 | bool evergreen_gpu_is_lockup(struct radeon_device *rdev); |
| 356 | int evergreen_asic_reset(struct radeon_device *rdev); | 356 | int evergreen_asic_reset(struct radeon_device *rdev); |
| 357 | void evergreen_bandwidth_update(struct radeon_device *rdev); | 357 | void evergreen_bandwidth_update(struct radeon_device *rdev); |
| 358 | void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | ||
| 358 | int evergreen_copy_blit(struct radeon_device *rdev, | 359 | int evergreen_copy_blit(struct radeon_device *rdev, |
| 359 | uint64_t src_offset, uint64_t dst_offset, | 360 | uint64_t src_offset, uint64_t dst_offset, |
| 360 | unsigned num_pages, struct radeon_fence *fence); | 361 | unsigned num_pages, struct radeon_fence *fence); |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 1573202a641..5c1cc7ad9a1 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -387,15 +387,11 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
| 387 | *line_mux = 0x90; | 387 | *line_mux = 0x90; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | /* mac rv630 */ | 390 | /* mac rv630, rv730, others */ |
| 391 | if ((dev->pdev->device == 0x9588) && | 391 | if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) && |
| 392 | (dev->pdev->subsystem_vendor == 0x106b) && | 392 | (*connector_type == DRM_MODE_CONNECTOR_DVII)) { |
| 393 | (dev->pdev->subsystem_device == 0x00a6)) { | 393 | *connector_type = DRM_MODE_CONNECTOR_9PinDIN; |
| 394 | if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) && | 394 | *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1; |
| 395 | (*connector_type == DRM_MODE_CONNECTOR_DVII)) { | ||
| 396 | *connector_type = DRM_MODE_CONNECTOR_9PinDIN; | ||
| 397 | *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1; | ||
| 398 | } | ||
| 399 | } | 395 | } |
| 400 | 396 | ||
| 401 | /* ASUS HD 3600 XT board lists the DVI port as HDMI */ | 397 | /* ASUS HD 3600 XT board lists the DVI port as HDMI */ |
| @@ -1167,16 +1163,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) | |||
| 1167 | p1pll->pll_out_min = 64800; | 1163 | p1pll->pll_out_min = 64800; |
| 1168 | else | 1164 | else |
| 1169 | p1pll->pll_out_min = 20000; | 1165 | p1pll->pll_out_min = 20000; |
| 1170 | } else if (p1pll->pll_out_min > 64800) { | ||
| 1171 | /* Limiting the pll output range is a good thing generally as | ||
| 1172 | * it limits the number of possible pll combinations for a given | ||
| 1173 | * frequency presumably to the ones that work best on each card. | ||
| 1174 | * However, certain duallink DVI monitors seem to like | ||
| 1175 | * pll combinations that would be limited by this at least on | ||
| 1176 | * pre-DCE 3.0 r6xx hardware. This might need to be adjusted per | ||
| 1177 | * family. | ||
| 1178 | */ | ||
| 1179 | p1pll->pll_out_min = 64800; | ||
| 1180 | } | 1166 | } |
| 1181 | 1167 | ||
| 1182 | p1pll->pll_in_min = | 1168 | p1pll->pll_in_min = |
| @@ -1991,6 +1977,9 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev) | |||
| 1991 | num_modes = power_info->info.ucNumOfPowerModeEntries; | 1977 | num_modes = power_info->info.ucNumOfPowerModeEntries; |
| 1992 | if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) | 1978 | if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) |
| 1993 | num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK; | 1979 | num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK; |
| 1980 | rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL); | ||
| 1981 | if (!rdev->pm.power_state) | ||
| 1982 | return state_index; | ||
| 1994 | /* last mode is usually default, array is low to high */ | 1983 | /* last mode is usually default, array is low to high */ |
| 1995 | for (i = 0; i < num_modes; i++) { | 1984 | for (i = 0; i < num_modes; i++) { |
| 1996 | rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; | 1985 | rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; |
| @@ -2342,6 +2331,10 @@ static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev) | |||
| 2342 | power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); | 2331 | power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); |
| 2343 | 2332 | ||
| 2344 | radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController); | 2333 | radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController); |
| 2334 | rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * | ||
| 2335 | power_info->pplib.ucNumStates, GFP_KERNEL); | ||
| 2336 | if (!rdev->pm.power_state) | ||
| 2337 | return state_index; | ||
| 2345 | /* first mode is usually default, followed by low to high */ | 2338 | /* first mode is usually default, followed by low to high */ |
| 2346 | for (i = 0; i < power_info->pplib.ucNumStates; i++) { | 2339 | for (i = 0; i < power_info->pplib.ucNumStates; i++) { |
| 2347 | mode_index = 0; | 2340 | mode_index = 0; |
| @@ -2422,6 +2415,10 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev) | |||
| 2422 | non_clock_info_array = (struct NonClockInfoArray *) | 2415 | non_clock_info_array = (struct NonClockInfoArray *) |
| 2423 | (mode_info->atom_context->bios + data_offset + | 2416 | (mode_info->atom_context->bios + data_offset + |
| 2424 | power_info->pplib.usNonClockInfoArrayOffset); | 2417 | power_info->pplib.usNonClockInfoArrayOffset); |
| 2418 | rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * | ||
| 2419 | state_array->ucNumEntries, GFP_KERNEL); | ||
| 2420 | if (!rdev->pm.power_state) | ||
| 2421 | return state_index; | ||
| 2425 | for (i = 0; i < state_array->ucNumEntries; i++) { | 2422 | for (i = 0; i < state_array->ucNumEntries; i++) { |
| 2426 | mode_index = 0; | 2423 | mode_index = 0; |
| 2427 | power_state = (union pplib_power_state *)&state_array->states[i]; | 2424 | power_state = (union pplib_power_state *)&state_array->states[i]; |
| @@ -2495,19 +2492,22 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev) | |||
| 2495 | break; | 2492 | break; |
| 2496 | } | 2493 | } |
| 2497 | } else { | 2494 | } else { |
| 2498 | /* add the default mode */ | 2495 | rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL); |
| 2499 | rdev->pm.power_state[state_index].type = | 2496 | if (rdev->pm.power_state) { |
| 2500 | POWER_STATE_TYPE_DEFAULT; | 2497 | /* add the default mode */ |
| 2501 | rdev->pm.power_state[state_index].num_clock_modes = 1; | 2498 | rdev->pm.power_state[state_index].type = |
| 2502 | rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk; | 2499 | POWER_STATE_TYPE_DEFAULT; |
| 2503 | rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk; | 2500 | rdev->pm.power_state[state_index].num_clock_modes = 1; |
| 2504 | rdev->pm.power_state[state_index].default_clock_mode = | 2501 | rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk; |
| 2505 | &rdev->pm.power_state[state_index].clock_info[0]; | 2502 | rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk; |
| 2506 | rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; | 2503 | rdev->pm.power_state[state_index].default_clock_mode = |
| 2507 | rdev->pm.power_state[state_index].pcie_lanes = 16; | 2504 | &rdev->pm.power_state[state_index].clock_info[0]; |
| 2508 | rdev->pm.default_power_state_index = state_index; | 2505 | rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; |
| 2509 | rdev->pm.power_state[state_index].flags = 0; | 2506 | rdev->pm.power_state[state_index].pcie_lanes = 16; |
| 2510 | state_index++; | 2507 | rdev->pm.default_power_state_index = state_index; |
| 2508 | rdev->pm.power_state[state_index].flags = 0; | ||
| 2509 | state_index++; | ||
| 2510 | } | ||
| 2511 | } | 2511 | } |
| 2512 | 2512 | ||
| 2513 | rdev->pm.num_power_states = state_index; | 2513 | rdev->pm.num_power_states = state_index; |
| @@ -2623,7 +2623,7 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) | |||
| 2623 | bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE; | 2623 | bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE; |
| 2624 | 2624 | ||
| 2625 | /* tell the bios not to handle mode switching */ | 2625 | /* tell the bios not to handle mode switching */ |
| 2626 | bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH | ATOM_S6_ACC_MODE); | 2626 | bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH; |
| 2627 | 2627 | ||
| 2628 | if (rdev->family >= CHIP_R600) { | 2628 | if (rdev->family >= CHIP_R600) { |
| 2629 | WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); | 2629 | WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); |
| @@ -2674,10 +2674,13 @@ void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock) | |||
| 2674 | else | 2674 | else |
| 2675 | bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); | 2675 | bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); |
| 2676 | 2676 | ||
| 2677 | if (lock) | 2677 | if (lock) { |
| 2678 | bios_6_scratch |= ATOM_S6_CRITICAL_STATE; | 2678 | bios_6_scratch |= ATOM_S6_CRITICAL_STATE; |
| 2679 | else | 2679 | bios_6_scratch &= ~ATOM_S6_ACC_MODE; |
| 2680 | } else { | ||
| 2680 | bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE; | 2681 | bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE; |
| 2682 | bios_6_scratch |= ATOM_S6_ACC_MODE; | ||
| 2683 | } | ||
| 2681 | 2684 | ||
| 2682 | if (rdev->family >= CHIP_R600) | 2685 | if (rdev->family >= CHIP_R600) |
| 2683 | WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); | 2686 | WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 591fcae8f22..d27ef74590c 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -2442,6 +2442,17 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev) | |||
| 2442 | 2442 | ||
| 2443 | rdev->pm.default_power_state_index = -1; | 2443 | rdev->pm.default_power_state_index = -1; |
| 2444 | 2444 | ||
| 2445 | /* allocate 2 power states */ | ||
| 2446 | rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * 2, GFP_KERNEL); | ||
| 2447 | if (!rdev->pm.power_state) { | ||
| 2448 | rdev->pm.default_power_state_index = state_index; | ||
| 2449 | rdev->pm.num_power_states = 0; | ||
| 2450 | |||
| 2451 | rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; | ||
| 2452 | rdev->pm.current_clock_mode_index = 0; | ||
| 2453 | return; | ||
| 2454 | } | ||
| 2455 | |||
| 2445 | if (rdev->flags & RADEON_IS_MOBILITY) { | 2456 | if (rdev->flags & RADEON_IS_MOBILITY) { |
| 2446 | offset = combios_get_table_offset(dev, COMBIOS_POWERPLAY_INFO_TABLE); | 2457 | offset = combios_get_table_offset(dev, COMBIOS_POWERPLAY_INFO_TABLE); |
| 2447 | if (offset) { | 2458 | if (offset) { |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 26091d602b8..0d478932b1a 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -891,9 +891,9 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
| 891 | pci_disable_device(dev->pdev); | 891 | pci_disable_device(dev->pdev); |
| 892 | pci_set_power_state(dev->pdev, PCI_D3hot); | 892 | pci_set_power_state(dev->pdev, PCI_D3hot); |
| 893 | } | 893 | } |
| 894 | acquire_console_sem(); | 894 | console_lock(); |
| 895 | radeon_fbdev_set_suspend(rdev, 1); | 895 | radeon_fbdev_set_suspend(rdev, 1); |
| 896 | release_console_sem(); | 896 | console_unlock(); |
| 897 | return 0; | 897 | return 0; |
| 898 | } | 898 | } |
| 899 | 899 | ||
| @@ -905,11 +905,11 @@ int radeon_resume_kms(struct drm_device *dev) | |||
| 905 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 905 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
| 906 | return 0; | 906 | return 0; |
| 907 | 907 | ||
| 908 | acquire_console_sem(); | 908 | console_lock(); |
| 909 | pci_set_power_state(dev->pdev, PCI_D0); | 909 | pci_set_power_state(dev->pdev, PCI_D0); |
| 910 | pci_restore_state(dev->pdev); | 910 | pci_restore_state(dev->pdev); |
| 911 | if (pci_enable_device(dev->pdev)) { | 911 | if (pci_enable_device(dev->pdev)) { |
| 912 | release_console_sem(); | 912 | console_unlock(); |
| 913 | return -1; | 913 | return -1; |
| 914 | } | 914 | } |
| 915 | pci_set_master(dev->pdev); | 915 | pci_set_master(dev->pdev); |
| @@ -920,7 +920,7 @@ int radeon_resume_kms(struct drm_device *dev) | |||
| 920 | radeon_restore_bios_scratch_regs(rdev); | 920 | radeon_restore_bios_scratch_regs(rdev); |
| 921 | 921 | ||
| 922 | radeon_fbdev_set_suspend(rdev, 0); | 922 | radeon_fbdev_set_suspend(rdev, 0); |
| 923 | release_console_sem(); | 923 | console_unlock(); |
| 924 | 924 | ||
| 925 | /* reset hpd state */ | 925 | /* reset hpd state */ |
| 926 | radeon_hpd_init(rdev); | 926 | radeon_hpd_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index d26dabf878d..2eff98cfd72 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -780,6 +780,115 @@ static int radeon_ddc_dump(struct drm_connector *connector) | |||
| 780 | return ret; | 780 | return ret; |
| 781 | } | 781 | } |
| 782 | 782 | ||
| 783 | /* avivo */ | ||
| 784 | static void avivo_get_fb_div(struct radeon_pll *pll, | ||
| 785 | u32 target_clock, | ||
| 786 | u32 post_div, | ||
| 787 | u32 ref_div, | ||
| 788 | u32 *fb_div, | ||
| 789 | u32 *frac_fb_div) | ||
| 790 | { | ||
| 791 | u32 tmp = post_div * ref_div; | ||
| 792 | |||
| 793 | tmp *= target_clock; | ||
| 794 | *fb_div = tmp / pll->reference_freq; | ||
| 795 | *frac_fb_div = tmp % pll->reference_freq; | ||
| 796 | } | ||
| 797 | |||
| 798 | static u32 avivo_get_post_div(struct radeon_pll *pll, | ||
| 799 | u32 target_clock) | ||
| 800 | { | ||
| 801 | u32 vco, post_div, tmp; | ||
| 802 | |||
| 803 | if (pll->flags & RADEON_PLL_USE_POST_DIV) | ||
| 804 | return pll->post_div; | ||
| 805 | |||
| 806 | if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) { | ||
| 807 | if (pll->flags & RADEON_PLL_IS_LCD) | ||
| 808 | vco = pll->lcd_pll_out_min; | ||
| 809 | else | ||
| 810 | vco = pll->pll_out_min; | ||
| 811 | } else { | ||
| 812 | if (pll->flags & RADEON_PLL_IS_LCD) | ||
| 813 | vco = pll->lcd_pll_out_max; | ||
| 814 | else | ||
| 815 | vco = pll->pll_out_max; | ||
| 816 | } | ||
| 817 | |||
| 818 | post_div = vco / target_clock; | ||
| 819 | tmp = vco % target_clock; | ||
| 820 | |||
| 821 | if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) { | ||
| 822 | if (tmp) | ||
| 823 | post_div++; | ||
| 824 | } else { | ||
| 825 | if (!tmp) | ||
| 826 | post_div--; | ||
| 827 | } | ||
| 828 | |||
| 829 | return post_div; | ||
| 830 | } | ||
| 831 | |||
| 832 | #define MAX_TOLERANCE 10 | ||
| 833 | |||
| 834 | void radeon_compute_pll_avivo(struct radeon_pll *pll, | ||
| 835 | u32 freq, | ||
| 836 | u32 *dot_clock_p, | ||
| 837 | u32 *fb_div_p, | ||
| 838 | u32 *frac_fb_div_p, | ||
| 839 | u32 *ref_div_p, | ||
| 840 | u32 *post_div_p) | ||
| 841 | { | ||
| 842 | u32 target_clock = freq / 10; | ||
| 843 | u32 post_div = avivo_get_post_div(pll, target_clock); | ||
| 844 | u32 ref_div = pll->min_ref_div; | ||
| 845 | u32 fb_div = 0, frac_fb_div = 0, tmp; | ||
| 846 | |||
| 847 | if (pll->flags & RADEON_PLL_USE_REF_DIV) | ||
| 848 | ref_div = pll->reference_div; | ||
| 849 | |||
| 850 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) { | ||
| 851 | avivo_get_fb_div(pll, target_clock, post_div, ref_div, &fb_div, &frac_fb_div); | ||
| 852 | frac_fb_div = (100 * frac_fb_div) / pll->reference_freq; | ||
| 853 | if (frac_fb_div >= 5) { | ||
| 854 | frac_fb_div -= 5; | ||
| 855 | frac_fb_div = frac_fb_div / 10; | ||
| 856 | frac_fb_div++; | ||
| 857 | } | ||
| 858 | if (frac_fb_div >= 10) { | ||
| 859 | fb_div++; | ||
| 860 | frac_fb_div = 0; | ||
| 861 | } | ||
| 862 | } else { | ||
| 863 | while (ref_div <= pll->max_ref_div) { | ||
| 864 | avivo_get_fb_div(pll, target_clock, post_div, ref_div, | ||
| 865 | &fb_div, &frac_fb_div); | ||
| 866 | if (frac_fb_div >= (pll->reference_freq / 2)) | ||
| 867 | fb_div++; | ||
| 868 | frac_fb_div = 0; | ||
| 869 | tmp = (pll->reference_freq * fb_div) / (post_div * ref_div); | ||
| 870 | tmp = (tmp * 10000) / target_clock; | ||
| 871 | |||
| 872 | if (tmp > (10000 + MAX_TOLERANCE)) | ||
| 873 | ref_div++; | ||
| 874 | else if (tmp >= (10000 - MAX_TOLERANCE)) | ||
| 875 | break; | ||
| 876 | else | ||
| 877 | ref_div++; | ||
| 878 | } | ||
| 879 | } | ||
| 880 | |||
| 881 | *dot_clock_p = ((pll->reference_freq * fb_div * 10) + (pll->reference_freq * frac_fb_div)) / | ||
| 882 | (ref_div * post_div * 10); | ||
| 883 | *fb_div_p = fb_div; | ||
| 884 | *frac_fb_div_p = frac_fb_div; | ||
| 885 | *ref_div_p = ref_div; | ||
| 886 | *post_div_p = post_div; | ||
| 887 | DRM_DEBUG_KMS("%d, pll dividers - fb: %d.%d ref: %d, post %d\n", | ||
| 888 | *dot_clock_p, fb_div, frac_fb_div, ref_div, post_div); | ||
| 889 | } | ||
| 890 | |||
| 891 | /* pre-avivo */ | ||
| 783 | static inline uint32_t radeon_div(uint64_t n, uint32_t d) | 892 | static inline uint32_t radeon_div(uint64_t n, uint32_t d) |
| 784 | { | 893 | { |
| 785 | uint64_t mod; | 894 | uint64_t mod; |
| @@ -790,13 +899,13 @@ static inline uint32_t radeon_div(uint64_t n, uint32_t d) | |||
| 790 | return n; | 899 | return n; |
| 791 | } | 900 | } |
| 792 | 901 | ||
| 793 | void radeon_compute_pll(struct radeon_pll *pll, | 902 | void radeon_compute_pll_legacy(struct radeon_pll *pll, |
| 794 | uint64_t freq, | 903 | uint64_t freq, |
| 795 | uint32_t *dot_clock_p, | 904 | uint32_t *dot_clock_p, |
| 796 | uint32_t *fb_div_p, | 905 | uint32_t *fb_div_p, |
| 797 | uint32_t *frac_fb_div_p, | 906 | uint32_t *frac_fb_div_p, |
| 798 | uint32_t *ref_div_p, | 907 | uint32_t *ref_div_p, |
| 799 | uint32_t *post_div_p) | 908 | uint32_t *post_div_p) |
| 800 | { | 909 | { |
| 801 | uint32_t min_ref_div = pll->min_ref_div; | 910 | uint32_t min_ref_div = pll->min_ref_div; |
| 802 | uint32_t max_ref_div = pll->max_ref_div; | 911 | uint32_t max_ref_div = pll->max_ref_div; |
| @@ -826,6 +935,9 @@ void radeon_compute_pll(struct radeon_pll *pll, | |||
| 826 | pll_out_max = pll->pll_out_max; | 935 | pll_out_max = pll->pll_out_max; |
| 827 | } | 936 | } |
| 828 | 937 | ||
| 938 | if (pll_out_min > 64800) | ||
| 939 | pll_out_min = 64800; | ||
| 940 | |||
| 829 | if (pll->flags & RADEON_PLL_USE_REF_DIV) | 941 | if (pll->flags & RADEON_PLL_USE_REF_DIV) |
| 830 | min_ref_div = max_ref_div = pll->reference_div; | 942 | min_ref_div = max_ref_div = pll->reference_div; |
| 831 | else { | 943 | else { |
| @@ -849,7 +961,7 @@ void radeon_compute_pll(struct radeon_pll *pll, | |||
| 849 | max_fractional_feed_div = pll->max_frac_feedback_div; | 961 | max_fractional_feed_div = pll->max_frac_feedback_div; |
| 850 | } | 962 | } |
| 851 | 963 | ||
| 852 | for (post_div = max_post_div; post_div >= min_post_div; --post_div) { | 964 | for (post_div = min_post_div; post_div <= max_post_div; ++post_div) { |
| 853 | uint32_t ref_div; | 965 | uint32_t ref_div; |
| 854 | 966 | ||
| 855 | if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) | 967 | if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) |
| @@ -965,6 +1077,10 @@ void radeon_compute_pll(struct radeon_pll *pll, | |||
| 965 | *frac_fb_div_p = best_frac_feedback_div; | 1077 | *frac_fb_div_p = best_frac_feedback_div; |
| 966 | *ref_div_p = best_ref_div; | 1078 | *ref_div_p = best_ref_div; |
| 967 | *post_div_p = best_post_div; | 1079 | *post_div_p = best_post_div; |
| 1080 | DRM_DEBUG_KMS("%d %d, pll dividers - fb: %d.%d ref: %d, post %d\n", | ||
| 1081 | freq, best_freq / 1000, best_feedback_div, best_frac_feedback_div, | ||
| 1082 | best_ref_div, best_post_div); | ||
| 1083 | |||
| 968 | } | 1084 | } |
| 969 | 1085 | ||
| 970 | static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb) | 1086 | static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb) |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index d5680a0c87a..275b26a708d 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -48,7 +48,7 @@ | |||
| 48 | * - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen | 48 | * - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen |
| 49 | * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500) | 49 | * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500) |
| 50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs | 50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs |
| 51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK | 51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query |
| 52 | */ | 52 | */ |
| 53 | #define KMS_DRIVER_MAJOR 2 | 53 | #define KMS_DRIVER_MAJOR 2 |
| 54 | #define KMS_DRIVER_MINOR 8 | 54 | #define KMS_DRIVER_MINOR 8 |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 8fd184286c0..d4a54224761 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -641,7 +641,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 641 | switch (connector->connector_type) { | 641 | switch (connector->connector_type) { |
| 642 | case DRM_MODE_CONNECTOR_DVII: | 642 | case DRM_MODE_CONNECTOR_DVII: |
| 643 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | 643 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
| 644 | if (drm_detect_monitor_audio(radeon_connector->edid)) { | 644 | if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) { |
| 645 | /* fix me */ | 645 | /* fix me */ |
| 646 | if (ASIC_IS_DCE4(rdev)) | 646 | if (ASIC_IS_DCE4(rdev)) |
| 647 | return ATOM_ENCODER_MODE_DVI; | 647 | return ATOM_ENCODER_MODE_DVI; |
| @@ -655,7 +655,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 655 | case DRM_MODE_CONNECTOR_DVID: | 655 | case DRM_MODE_CONNECTOR_DVID: |
| 656 | case DRM_MODE_CONNECTOR_HDMIA: | 656 | case DRM_MODE_CONNECTOR_HDMIA: |
| 657 | default: | 657 | default: |
| 658 | if (drm_detect_monitor_audio(radeon_connector->edid)) { | 658 | if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) { |
| 659 | /* fix me */ | 659 | /* fix me */ |
| 660 | if (ASIC_IS_DCE4(rdev)) | 660 | if (ASIC_IS_DCE4(rdev)) |
| 661 | return ATOM_ENCODER_MODE_DVI; | 661 | return ATOM_ENCODER_MODE_DVI; |
| @@ -673,7 +673,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 673 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 673 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 674 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 674 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
| 675 | return ATOM_ENCODER_MODE_DP; | 675 | return ATOM_ENCODER_MODE_DP; |
| 676 | else if (drm_detect_monitor_audio(radeon_connector->edid)) { | 676 | else if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) { |
| 677 | /* fix me */ | 677 | /* fix me */ |
| 678 | if (ASIC_IS_DCE4(rdev)) | 678 | if (ASIC_IS_DCE4(rdev)) |
| 679 | return ATOM_ENCODER_MODE_DVI; | 679 | return ATOM_ENCODER_MODE_DVI; |
| @@ -1063,7 +1063,7 @@ atombios_set_edp_panel_power(struct drm_connector *connector, int action) | |||
| 1063 | if (!ASIC_IS_DCE4(rdev)) | 1063 | if (!ASIC_IS_DCE4(rdev)) |
| 1064 | return; | 1064 | return; |
| 1065 | 1065 | ||
| 1066 | if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) || | 1066 | if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) && |
| 1067 | (action != ATOM_TRANSMITTER_ACTION_POWER_OFF)) | 1067 | (action != ATOM_TRANSMITTER_ACTION_POWER_OFF)) |
| 1068 | return; | 1068 | return; |
| 1069 | 1069 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index a289646e8aa..9ec830c77af 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
| @@ -110,11 +110,14 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) | |||
| 110 | 110 | ||
| 111 | int radeon_irq_kms_init(struct radeon_device *rdev) | 111 | int radeon_irq_kms_init(struct radeon_device *rdev) |
| 112 | { | 112 | { |
| 113 | int i; | ||
| 113 | int r = 0; | 114 | int r = 0; |
| 114 | 115 | ||
| 115 | INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); | 116 | INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); |
| 116 | 117 | ||
| 117 | spin_lock_init(&rdev->irq.sw_lock); | 118 | spin_lock_init(&rdev->irq.sw_lock); |
| 119 | for (i = 0; i < rdev->num_crtc; i++) | ||
| 120 | spin_lock_init(&rdev->irq.pflip_lock[i]); | ||
| 118 | r = drm_vblank_init(rdev->ddev, rdev->num_crtc); | 121 | r = drm_vblank_init(rdev->ddev, rdev->num_crtc); |
| 119 | if (r) { | 122 | if (r) { |
| 120 | return r; | 123 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 28a53e4a925..8387d32caaa 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -201,6 +201,10 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 201 | } | 201 | } |
| 202 | radeon_set_filp_rights(dev, &rdev->cmask_filp, filp, &value); | 202 | radeon_set_filp_rights(dev, &rdev->cmask_filp, filp, &value); |
| 203 | break; | 203 | break; |
| 204 | case RADEON_INFO_CLOCK_CRYSTAL_FREQ: | ||
| 205 | /* return clock value in KHz */ | ||
| 206 | value = rdev->clock.spll.reference_freq * 10; | ||
| 207 | break; | ||
| 204 | default: | 208 | default: |
| 205 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); | 209 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); |
| 206 | return -EINVAL; | 210 | return -EINVAL; |
| @@ -243,6 +247,8 @@ void radeon_driver_preclose_kms(struct drm_device *dev, | |||
| 243 | struct radeon_device *rdev = dev->dev_private; | 247 | struct radeon_device *rdev = dev->dev_private; |
| 244 | if (rdev->hyperz_filp == file_priv) | 248 | if (rdev->hyperz_filp == file_priv) |
| 245 | rdev->hyperz_filp = NULL; | 249 | rdev->hyperz_filp = NULL; |
| 250 | if (rdev->cmask_filp == file_priv) | ||
| 251 | rdev->cmask_filp = NULL; | ||
| 246 | } | 252 | } |
| 247 | 253 | ||
| 248 | /* | 254 | /* |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index ace2e6384d4..cf0638c3b7c 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
| @@ -778,9 +778,9 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
| 778 | DRM_DEBUG_KMS("\n"); | 778 | DRM_DEBUG_KMS("\n"); |
| 779 | 779 | ||
| 780 | if (!use_bios_divs) { | 780 | if (!use_bios_divs) { |
| 781 | radeon_compute_pll(pll, mode->clock, | 781 | radeon_compute_pll_legacy(pll, mode->clock, |
| 782 | &freq, &feedback_div, &frac_fb_div, | 782 | &freq, &feedback_div, &frac_fb_div, |
| 783 | &reference_div, &post_divider); | 783 | &reference_div, &post_divider); |
| 784 | 784 | ||
| 785 | for (post_div = &post_divs[0]; post_div->divider; ++post_div) { | 785 | for (post_div = &post_divs[0]; post_div->divider; ++post_div) { |
| 786 | if (post_div->divider == post_divider) | 786 | if (post_div->divider == post_divider) |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 12bdeab91c8..6794cdf91f2 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -149,6 +149,7 @@ struct radeon_tmds_pll { | |||
| 149 | #define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) | 149 | #define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) |
| 150 | #define RADEON_PLL_USE_POST_DIV (1 << 12) | 150 | #define RADEON_PLL_USE_POST_DIV (1 << 12) |
| 151 | #define RADEON_PLL_IS_LCD (1 << 13) | 151 | #define RADEON_PLL_IS_LCD (1 << 13) |
| 152 | #define RADEON_PLL_PREFER_MINM_OVER_MAXP (1 << 14) | ||
| 152 | 153 | ||
| 153 | struct radeon_pll { | 154 | struct radeon_pll { |
| 154 | /* reference frequency */ | 155 | /* reference frequency */ |
| @@ -510,13 +511,21 @@ extern bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
| 510 | struct radeon_atom_ss *ss, | 511 | struct radeon_atom_ss *ss, |
| 511 | int id, u32 clock); | 512 | int id, u32 clock); |
| 512 | 513 | ||
| 513 | extern void radeon_compute_pll(struct radeon_pll *pll, | 514 | extern void radeon_compute_pll_legacy(struct radeon_pll *pll, |
| 514 | uint64_t freq, | 515 | uint64_t freq, |
| 515 | uint32_t *dot_clock_p, | 516 | uint32_t *dot_clock_p, |
| 516 | uint32_t *fb_div_p, | 517 | uint32_t *fb_div_p, |
| 517 | uint32_t *frac_fb_div_p, | 518 | uint32_t *frac_fb_div_p, |
| 518 | uint32_t *ref_div_p, | 519 | uint32_t *ref_div_p, |
| 519 | uint32_t *post_div_p); | 520 | uint32_t *post_div_p); |
| 521 | |||
| 522 | extern void radeon_compute_pll_avivo(struct radeon_pll *pll, | ||
| 523 | u32 freq, | ||
| 524 | u32 *dot_clock_p, | ||
| 525 | u32 *fb_div_p, | ||
| 526 | u32 *frac_fb_div_p, | ||
| 527 | u32 *ref_div_p, | ||
| 528 | u32 *post_div_p); | ||
| 520 | 529 | ||
| 521 | extern void radeon_setup_encoder_clones(struct drm_device *dev); | 530 | extern void radeon_setup_encoder_clones(struct drm_device *dev); |
| 522 | 531 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 3b1b2bf9cdd..2aed03bde4b 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -430,7 +430,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev, | |||
| 430 | { | 430 | { |
| 431 | struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev)); | 431 | struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev)); |
| 432 | struct radeon_device *rdev = ddev->dev_private; | 432 | struct radeon_device *rdev = ddev->dev_private; |
| 433 | u32 temp; | 433 | int temp; |
| 434 | 434 | ||
| 435 | switch (rdev->pm.int_thermal_type) { | 435 | switch (rdev->pm.int_thermal_type) { |
| 436 | case THERMAL_TYPE_RV6XX: | 436 | case THERMAL_TYPE_RV6XX: |
| @@ -646,6 +646,9 @@ void radeon_pm_fini(struct radeon_device *rdev) | |||
| 646 | #endif | 646 | #endif |
| 647 | } | 647 | } |
| 648 | 648 | ||
| 649 | if (rdev->pm.power_state) | ||
| 650 | kfree(rdev->pm.power_state); | ||
| 651 | |||
| 649 | radeon_hwmon_fini(rdev); | 652 | radeon_hwmon_fini(rdev); |
| 650 | } | 653 | } |
| 651 | 654 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index 3cd4dace57c..ec93a75369e 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
| @@ -375,6 +375,8 @@ | |||
| 375 | #define RADEON_CONFIG_APER_SIZE 0x0108 | 375 | #define RADEON_CONFIG_APER_SIZE 0x0108 |
| 376 | #define RADEON_CONFIG_BONDS 0x00e8 | 376 | #define RADEON_CONFIG_BONDS 0x00e8 |
| 377 | #define RADEON_CONFIG_CNTL 0x00e0 | 377 | #define RADEON_CONFIG_CNTL 0x00e0 |
| 378 | # define RADEON_CFG_VGA_RAM_EN (1 << 8) | ||
| 379 | # define RADEON_CFG_VGA_IO_DIS (1 << 9) | ||
| 378 | # define RADEON_CFG_ATI_REV_A11 (0 << 16) | 380 | # define RADEON_CFG_ATI_REV_A11 (0 << 16) |
| 379 | # define RADEON_CFG_ATI_REV_A12 (1 << 16) | 381 | # define RADEON_CFG_ATI_REV_A12 (1 << 16) |
| 380 | # define RADEON_CFG_ATI_REV_A13 (2 << 16) | 382 | # define RADEON_CFG_ATI_REV_A13 (2 << 16) |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 5512e4e5e63..c76283d9eb3 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -203,6 +203,9 @@ void rs400_gart_fini(struct radeon_device *rdev) | |||
| 203 | radeon_gart_table_ram_free(rdev); | 203 | radeon_gart_table_ram_free(rdev); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | #define RS400_PTE_WRITEABLE (1 << 2) | ||
| 207 | #define RS400_PTE_READABLE (1 << 3) | ||
| 208 | |||
| 206 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 209 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
| 207 | { | 210 | { |
| 208 | uint32_t entry; | 211 | uint32_t entry; |
| @@ -213,7 +216,7 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 213 | 216 | ||
| 214 | entry = (lower_32_bits(addr) & PAGE_MASK) | | 217 | entry = (lower_32_bits(addr) & PAGE_MASK) | |
| 215 | ((upper_32_bits(addr) & 0xff) << 4) | | 218 | ((upper_32_bits(addr) & 0xff) << 4) | |
| 216 | 0xc; | 219 | RS400_PTE_WRITEABLE | RS400_PTE_READABLE; |
| 217 | entry = cpu_to_le32(entry); | 220 | entry = cpu_to_le32(entry); |
| 218 | rdev->gart.table.ram.ptr[i] = entry; | 221 | rdev->gart.table.ram.ptr[i] = entry; |
| 219 | return 0; | 222 | return 0; |
| @@ -226,8 +229,8 @@ int rs400_mc_wait_for_idle(struct radeon_device *rdev) | |||
| 226 | 229 | ||
| 227 | for (i = 0; i < rdev->usec_timeout; i++) { | 230 | for (i = 0; i < rdev->usec_timeout; i++) { |
| 228 | /* read MC_STATUS */ | 231 | /* read MC_STATUS */ |
| 229 | tmp = RREG32(0x0150); | 232 | tmp = RREG32(RADEON_MC_STATUS); |
| 230 | if (tmp & (1 << 2)) { | 233 | if (tmp & RADEON_MC_IDLE) { |
| 231 | return 0; | 234 | return 0; |
| 232 | } | 235 | } |
| 233 | DRM_UDELAY(1); | 236 | DRM_UDELAY(1); |
| @@ -241,7 +244,7 @@ void rs400_gpu_init(struct radeon_device *rdev) | |||
| 241 | r420_pipes_init(rdev); | 244 | r420_pipes_init(rdev); |
| 242 | if (rs400_mc_wait_for_idle(rdev)) { | 245 | if (rs400_mc_wait_for_idle(rdev)) { |
| 243 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " | 246 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
| 244 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); | 247 | "programming pipes. Bad things might happen. %08x\n", RREG32(RADEON_MC_STATUS)); |
| 245 | } | 248 | } |
| 246 | } | 249 | } |
| 247 | 250 | ||
| @@ -300,9 +303,9 @@ static int rs400_debugfs_gart_info(struct seq_file *m, void *data) | |||
| 300 | seq_printf(m, "MCCFG_AGP_BASE_2 0x%08x\n", tmp); | 303 | seq_printf(m, "MCCFG_AGP_BASE_2 0x%08x\n", tmp); |
| 301 | tmp = RREG32_MC(RS690_MCCFG_AGP_LOCATION); | 304 | tmp = RREG32_MC(RS690_MCCFG_AGP_LOCATION); |
| 302 | seq_printf(m, "MCCFG_AGP_LOCATION 0x%08x\n", tmp); | 305 | seq_printf(m, "MCCFG_AGP_LOCATION 0x%08x\n", tmp); |
| 303 | tmp = RREG32_MC(0x100); | 306 | tmp = RREG32_MC(RS690_MCCFG_FB_LOCATION); |
| 304 | seq_printf(m, "MCCFG_FB_LOCATION 0x%08x\n", tmp); | 307 | seq_printf(m, "MCCFG_FB_LOCATION 0x%08x\n", tmp); |
| 305 | tmp = RREG32(0x134); | 308 | tmp = RREG32(RS690_HDP_FB_LOCATION); |
| 306 | seq_printf(m, "HDP_FB_LOCATION 0x%08x\n", tmp); | 309 | seq_printf(m, "HDP_FB_LOCATION 0x%08x\n", tmp); |
| 307 | } else { | 310 | } else { |
| 308 | tmp = RREG32(RADEON_AGP_BASE); | 311 | tmp = RREG32(RADEON_AGP_BASE); |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 5d569f41f4a..64b57af9371 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -69,13 +69,13 @@ void rv515_ring_start(struct radeon_device *rdev) | |||
| 69 | ISYNC_CPSCRATCH_IDLEGUI); | 69 | ISYNC_CPSCRATCH_IDLEGUI); |
| 70 | radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0)); | 70 | radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0)); |
| 71 | radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); | 71 | radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); |
| 72 | radeon_ring_write(rdev, PACKET0(0x170C, 0)); | 72 | radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
| 73 | radeon_ring_write(rdev, 1 << 31); | 73 | radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG); |
| 74 | radeon_ring_write(rdev, PACKET0(GB_SELECT, 0)); | 74 | radeon_ring_write(rdev, PACKET0(GB_SELECT, 0)); |
| 75 | radeon_ring_write(rdev, 0); | 75 | radeon_ring_write(rdev, 0); |
| 76 | radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0)); | 76 | radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0)); |
| 77 | radeon_ring_write(rdev, 0); | 77 | radeon_ring_write(rdev, 0); |
| 78 | radeon_ring_write(rdev, PACKET0(0x42C8, 0)); | 78 | radeon_ring_write(rdev, PACKET0(R500_SU_REG_DEST, 0)); |
| 79 | radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1); | 79 | radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1); |
| 80 | radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0)); | 80 | radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0)); |
| 81 | radeon_ring_write(rdev, 0); | 81 | radeon_ring_write(rdev, 0); |
| @@ -153,8 +153,8 @@ void rv515_gpu_init(struct radeon_device *rdev) | |||
| 153 | } | 153 | } |
| 154 | rv515_vga_render_disable(rdev); | 154 | rv515_vga_render_disable(rdev); |
| 155 | r420_pipes_init(rdev); | 155 | r420_pipes_init(rdev); |
| 156 | gb_pipe_select = RREG32(0x402C); | 156 | gb_pipe_select = RREG32(R400_GB_PIPE_SELECT); |
| 157 | tmp = RREG32(0x170C); | 157 | tmp = RREG32(R300_DST_PIPE_CONFIG); |
| 158 | pipe_select_current = (tmp >> 2) & 3; | 158 | pipe_select_current = (tmp >> 2) & 3; |
| 159 | tmp = (1 << pipe_select_current) | | 159 | tmp = (1 << pipe_select_current) | |
| 160 | (((gb_pipe_select >> 8) & 0xF) << 4); | 160 | (((gb_pipe_select >> 8) & 0xF) << 4); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 491dc900065..2211a323db4 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -78,18 +78,23 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | |||
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | /* get temperature in millidegrees */ | 80 | /* get temperature in millidegrees */ |
| 81 | u32 rv770_get_temp(struct radeon_device *rdev) | 81 | int rv770_get_temp(struct radeon_device *rdev) |
| 82 | { | 82 | { |
| 83 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | 83 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> |
| 84 | ASIC_T_SHIFT; | 84 | ASIC_T_SHIFT; |
| 85 | u32 actual_temp = 0; | 85 | int actual_temp; |
| 86 | 86 | ||
| 87 | if ((temp >> 9) & 1) | 87 | if (temp & 0x400) |
| 88 | actual_temp = 0; | 88 | actual_temp = -256; |
| 89 | else | 89 | else if (temp & 0x200) |
| 90 | actual_temp = (temp >> 1) & 0xff; | 90 | actual_temp = 255; |
| 91 | 91 | else if (temp & 0x100) { | |
| 92 | return actual_temp * 1000; | 92 | actual_temp = temp & 0x1ff; |
| 93 | actual_temp |= ~0x1ff; | ||
| 94 | } else | ||
| 95 | actual_temp = temp & 0xff; | ||
| 96 | |||
| 97 | return (actual_temp * 1000) / 2; | ||
| 93 | } | 98 | } |
| 94 | 99 | ||
| 95 | void rv770_pm_misc(struct radeon_device *rdev) | 100 | void rv770_pm_misc(struct radeon_device *rdev) |
