diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/ni.c')
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 48 |
1 files changed, 10 insertions, 38 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 44c4750f4518..8c79ca97753d 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -39,6 +39,7 @@ extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev); | |||
39 | extern void evergreen_mc_program(struct radeon_device *rdev); | 39 | extern void evergreen_mc_program(struct radeon_device *rdev); |
40 | extern void evergreen_irq_suspend(struct radeon_device *rdev); | 40 | extern void evergreen_irq_suspend(struct radeon_device *rdev); |
41 | extern int evergreen_mc_init(struct radeon_device *rdev); | 41 | extern int evergreen_mc_init(struct radeon_device *rdev); |
42 | extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); | ||
42 | 43 | ||
43 | #define EVERGREEN_PFP_UCODE_SIZE 1120 | 44 | #define EVERGREEN_PFP_UCODE_SIZE 1120 |
44 | #define EVERGREEN_PM4_UCODE_SIZE 1376 | 45 | #define EVERGREEN_PM4_UCODE_SIZE 1376 |
@@ -568,36 +569,6 @@ static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | |||
568 | return backend_map; | 569 | return backend_map; |
569 | } | 570 | } |
570 | 571 | ||
571 | static void cayman_program_channel_remap(struct radeon_device *rdev) | ||
572 | { | ||
573 | u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp; | ||
574 | |||
575 | tmp = RREG32(MC_SHARED_CHMAP); | ||
576 | switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { | ||
577 | case 0: | ||
578 | case 1: | ||
579 | case 2: | ||
580 | case 3: | ||
581 | default: | ||
582 | /* default mapping */ | ||
583 | mc_shared_chremap = 0x00fac688; | ||
584 | break; | ||
585 | } | ||
586 | |||
587 | switch (rdev->family) { | ||
588 | case CHIP_CAYMAN: | ||
589 | default: | ||
590 | //tcp_chan_steer_lo = 0x54763210 | ||
591 | tcp_chan_steer_lo = 0x76543210; | ||
592 | tcp_chan_steer_hi = 0x0000ba98; | ||
593 | break; | ||
594 | } | ||
595 | |||
596 | WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo); | ||
597 | WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi); | ||
598 | WREG32(MC_SHARED_CHREMAP, mc_shared_chremap); | ||
599 | } | ||
600 | |||
601 | static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev, | 572 | static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev, |
602 | u32 disable_mask_per_se, | 573 | u32 disable_mask_per_se, |
603 | u32 max_disable_mask_per_se, | 574 | u32 max_disable_mask_per_se, |
@@ -669,6 +640,8 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
669 | 640 | ||
670 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); | 641 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
671 | 642 | ||
643 | evergreen_fix_pci_max_read_req_size(rdev); | ||
644 | |||
672 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); | 645 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); |
673 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); | 646 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); |
674 | 647 | ||
@@ -839,8 +812,6 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
839 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 812 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
840 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | 813 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
841 | 814 | ||
842 | cayman_program_channel_remap(rdev); | ||
843 | |||
844 | /* primary versions */ | 815 | /* primary versions */ |
845 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 816 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); |
846 | WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 817 | WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); |
@@ -1159,6 +1130,7 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1159 | SOFT_RESET_PA | | 1130 | SOFT_RESET_PA | |
1160 | SOFT_RESET_SH | | 1131 | SOFT_RESET_SH | |
1161 | SOFT_RESET_VGT | | 1132 | SOFT_RESET_VGT | |
1133 | SOFT_RESET_SPI | | ||
1162 | SOFT_RESET_SX)); | 1134 | SOFT_RESET_SX)); |
1163 | RREG32(GRBM_SOFT_RESET); | 1135 | RREG32(GRBM_SOFT_RESET); |
1164 | mdelay(15); | 1136 | mdelay(15); |
@@ -1183,7 +1155,8 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1183 | 1155 | ||
1184 | /* Initialize the ring buffer's read and write pointers */ | 1156 | /* Initialize the ring buffer's read and write pointers */ |
1185 | WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA); | 1157 | WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA); |
1186 | WREG32(CP_RB0_WPTR, 0); | 1158 | rdev->cp.wptr = 0; |
1159 | WREG32(CP_RB0_WPTR, rdev->cp.wptr); | ||
1187 | 1160 | ||
1188 | /* set the wb address wether it's enabled or not */ | 1161 | /* set the wb address wether it's enabled or not */ |
1189 | WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC); | 1162 | WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC); |
@@ -1203,7 +1176,6 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1203 | WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8); | 1176 | WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8); |
1204 | 1177 | ||
1205 | rdev->cp.rptr = RREG32(CP_RB0_RPTR); | 1178 | rdev->cp.rptr = RREG32(CP_RB0_RPTR); |
1206 | rdev->cp.wptr = RREG32(CP_RB0_WPTR); | ||
1207 | 1179 | ||
1208 | /* ring1 - compute only */ | 1180 | /* ring1 - compute only */ |
1209 | /* Set ring buffer size */ | 1181 | /* Set ring buffer size */ |
@@ -1216,7 +1188,8 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1216 | 1188 | ||
1217 | /* Initialize the ring buffer's read and write pointers */ | 1189 | /* Initialize the ring buffer's read and write pointers */ |
1218 | WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA); | 1190 | WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA); |
1219 | WREG32(CP_RB1_WPTR, 0); | 1191 | rdev->cp1.wptr = 0; |
1192 | WREG32(CP_RB1_WPTR, rdev->cp1.wptr); | ||
1220 | 1193 | ||
1221 | /* set the wb address wether it's enabled or not */ | 1194 | /* set the wb address wether it's enabled or not */ |
1222 | WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC); | 1195 | WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC); |
@@ -1228,7 +1201,6 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1228 | WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8); | 1201 | WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8); |
1229 | 1202 | ||
1230 | rdev->cp1.rptr = RREG32(CP_RB1_RPTR); | 1203 | rdev->cp1.rptr = RREG32(CP_RB1_RPTR); |
1231 | rdev->cp1.wptr = RREG32(CP_RB1_WPTR); | ||
1232 | 1204 | ||
1233 | /* ring2 - compute only */ | 1205 | /* ring2 - compute only */ |
1234 | /* Set ring buffer size */ | 1206 | /* Set ring buffer size */ |
@@ -1241,7 +1213,8 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1241 | 1213 | ||
1242 | /* Initialize the ring buffer's read and write pointers */ | 1214 | /* Initialize the ring buffer's read and write pointers */ |
1243 | WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA); | 1215 | WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA); |
1244 | WREG32(CP_RB2_WPTR, 0); | 1216 | rdev->cp2.wptr = 0; |
1217 | WREG32(CP_RB2_WPTR, rdev->cp2.wptr); | ||
1245 | 1218 | ||
1246 | /* set the wb address wether it's enabled or not */ | 1219 | /* set the wb address wether it's enabled or not */ |
1247 | WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC); | 1220 | WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC); |
@@ -1253,7 +1226,6 @@ int cayman_cp_resume(struct radeon_device *rdev) | |||
1253 | WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8); | 1226 | WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8); |
1254 | 1227 | ||
1255 | rdev->cp2.rptr = RREG32(CP_RB2_RPTR); | 1228 | rdev->cp2.rptr = RREG32(CP_RB2_RPTR); |
1256 | rdev->cp2.wptr = RREG32(CP_RB2_WPTR); | ||
1257 | 1229 | ||
1258 | /* start the rings */ | 1230 | /* start the rings */ |
1259 | cayman_cp_start(rdev); | 1231 | cayman_cp_start(rdev); |