diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index e100f69faeec..d0ebae9dde25 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -92,6 +92,21 @@ void r600_gpu_init(struct radeon_device *rdev); | |||
92 | void r600_fini(struct radeon_device *rdev); | 92 | void r600_fini(struct radeon_device *rdev); |
93 | void r600_irq_disable(struct radeon_device *rdev); | 93 | void r600_irq_disable(struct radeon_device *rdev); |
94 | 94 | ||
95 | /* get temperature in millidegrees */ | ||
96 | u32 rv6xx_get_temp(struct radeon_device *rdev) | ||
97 | { | ||
98 | u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> | ||
99 | ASIC_T_SHIFT; | ||
100 | u32 actual_temp = 0; | ||
101 | |||
102 | if ((temp >> 7) & 1) | ||
103 | actual_temp = 0; | ||
104 | else | ||
105 | actual_temp = (temp >> 1) & 0xff; | ||
106 | |||
107 | return actual_temp * 1000; | ||
108 | } | ||
109 | |||
95 | void r600_pm_get_dynpm_state(struct radeon_device *rdev) | 110 | void r600_pm_get_dynpm_state(struct radeon_device *rdev) |
96 | { | 111 | { |
97 | int i; | 112 | int i; |
@@ -256,7 +271,7 @@ void r600_pm_get_dynpm_state(struct radeon_device *rdev) | |||
256 | } | 271 | } |
257 | } | 272 | } |
258 | 273 | ||
259 | DRM_DEBUG("Requested: e: %d m: %d p: %d\n", | 274 | DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n", |
260 | rdev->pm.power_state[rdev->pm.requested_power_state_index]. | 275 | rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
261 | clock_info[rdev->pm.requested_clock_mode_index].sclk, | 276 | clock_info[rdev->pm.requested_clock_mode_index].sclk, |
262 | rdev->pm.power_state[rdev->pm.requested_power_state_index]. | 277 | rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
@@ -571,7 +586,7 @@ void r600_pm_misc(struct radeon_device *rdev) | |||
571 | if (voltage->voltage != rdev->pm.current_vddc) { | 586 | if (voltage->voltage != rdev->pm.current_vddc) { |
572 | radeon_atom_set_voltage(rdev, voltage->voltage); | 587 | radeon_atom_set_voltage(rdev, voltage->voltage); |
573 | rdev->pm.current_vddc = voltage->voltage; | 588 | rdev->pm.current_vddc = voltage->voltage; |
574 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); | 589 | DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); |
575 | } | 590 | } |
576 | } | 591 | } |
577 | } | 592 | } |
@@ -869,7 +884,17 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
869 | u32 tmp; | 884 | u32 tmp; |
870 | 885 | ||
871 | /* flush hdp cache so updates hit vram */ | 886 | /* flush hdp cache so updates hit vram */ |
872 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | 887 | if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { |
888 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | ||
889 | u32 tmp; | ||
890 | |||
891 | /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read | ||
892 | * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL | ||
893 | */ | ||
894 | WREG32(HDP_DEBUG1, 0); | ||
895 | tmp = readl((void __iomem *)ptr); | ||
896 | } else | ||
897 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
873 | 898 | ||
874 | WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12); | 899 | WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12); |
875 | WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 900 | WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12); |
@@ -1217,8 +1242,8 @@ int r600_mc_init(struct radeon_device *rdev) | |||
1217 | } | 1242 | } |
1218 | rdev->mc.vram_width = numchan * chansize; | 1243 | rdev->mc.vram_width = numchan * chansize; |
1219 | /* Could aper size report 0 ? */ | 1244 | /* Could aper size report 0 ? */ |
1220 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | 1245 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
1221 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | 1246 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
1222 | /* Setup GPU memory space */ | 1247 | /* Setup GPU memory space */ |
1223 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); | 1248 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); |
1224 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); | 1249 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); |
@@ -1609,7 +1634,7 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1609 | r600_count_pipe_bits((cc_rb_backend_disable & | 1634 | r600_count_pipe_bits((cc_rb_backend_disable & |
1610 | R6XX_MAX_BACKENDS_MASK) >> 16)), | 1635 | R6XX_MAX_BACKENDS_MASK) >> 16)), |
1611 | (cc_rb_backend_disable >> 16)); | 1636 | (cc_rb_backend_disable >> 16)); |
1612 | 1637 | rdev->config.r600.tile_config = tiling_config; | |
1613 | tiling_config |= BACKEND_MAP(backend_map); | 1638 | tiling_config |= BACKEND_MAP(backend_map); |
1614 | WREG32(GB_TILING_CONFIG, tiling_config); | 1639 | WREG32(GB_TILING_CONFIG, tiling_config); |
1615 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); | 1640 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); |
@@ -3512,5 +3537,15 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev) | |||
3512 | */ | 3537 | */ |
3513 | void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) | 3538 | void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) |
3514 | { | 3539 | { |
3515 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | 3540 | /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read |
3541 | * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL | ||
3542 | */ | ||
3543 | if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { | ||
3544 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | ||
3545 | u32 tmp; | ||
3546 | |||
3547 | WREG32(HDP_DEBUG1, 0); | ||
3548 | tmp = readl((void __iomem *)ptr); | ||
3549 | } else | ||
3550 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
3516 | } | 3551 | } |