diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1e10e3e2ba2a..de88624d5f87 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) |
| @@ -2101,7 +2105,11 @@ static int r600_cp_load_microcode(struct radeon_device *rdev) | |||
| 2101 | 2105 | ||
| 2102 | r600_cp_stop(rdev); | 2106 | r600_cp_stop(rdev); |
| 2103 | 2107 | ||
| 2104 | WREG32(CP_RB_CNTL, RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); | 2108 | WREG32(CP_RB_CNTL, |
| 2109 | #ifdef __BIG_ENDIAN | ||
| 2110 | BUF_SWAP_32BIT | | ||
| 2111 | #endif | ||
| 2112 | RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); | ||
| 2105 | 2113 | ||
| 2106 | /* Reset cp */ | 2114 | /* Reset cp */ |
| 2107 | WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); | 2115 | WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); |
| @@ -2188,7 +2196,11 @@ int r600_cp_resume(struct radeon_device *rdev) | |||
| 2188 | WREG32(CP_RB_WPTR, 0); | 2196 | WREG32(CP_RB_WPTR, 0); |
| 2189 | 2197 | ||
| 2190 | /* set the wb address whether it's enabled or not */ | 2198 | /* set the wb address whether it's enabled or not */ |
| 2191 | WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC); | 2199 | WREG32(CP_RB_RPTR_ADDR, |
| 2200 | #ifdef __BIG_ENDIAN | ||
| 2201 | RB_RPTR_SWAP(2) | | ||
| 2202 | #endif | ||
| 2203 | ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); | ||
| 2192 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); | 2204 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); |
| 2193 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); | 2205 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); |
| 2194 | 2206 | ||
| @@ -2624,7 +2636,11 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) | |||
| 2624 | { | 2636 | { |
| 2625 | /* FIXME: implement */ | 2637 | /* FIXME: implement */ |
| 2626 | radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); | 2638 | radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); |
| 2627 | radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC); | 2639 | radeon_ring_write(rdev, |
| 2640 | #ifdef __BIG_ENDIAN | ||
| 2641 | (2 << 0) | | ||
| 2642 | #endif | ||
| 2643 | (ib->gpu_addr & 0xFFFFFFFC)); | ||
| 2628 | radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF); | 2644 | radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF); |
| 2629 | radeon_ring_write(rdev, ib->length_dw); | 2645 | radeon_ring_write(rdev, ib->length_dw); |
| 2630 | } | 2646 | } |
| @@ -3293,8 +3309,8 @@ restart_ih: | |||
| 3293 | while (rptr != wptr) { | 3309 | while (rptr != wptr) { |
| 3294 | /* wptr/rptr are in bytes! */ | 3310 | /* wptr/rptr are in bytes! */ |
| 3295 | ring_index = rptr / 4; | 3311 | ring_index = rptr / 4; |
| 3296 | src_id = rdev->ih.ring[ring_index] & 0xff; | 3312 | src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff; |
| 3297 | src_data = rdev->ih.ring[ring_index + 1] & 0xfffffff; | 3313 | src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff; |
| 3298 | 3314 | ||
| 3299 | switch (src_id) { | 3315 | switch (src_id) { |
| 3300 | case 1: /* D1 vblank/vline */ | 3316 | case 1: /* D1 vblank/vline */ |
