Rev 3764 | Rev 5179 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3764 | Rev 5078 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | #include "evergreend.h" |
31 | #include "evergreend.h" |
32 | #include "atom.h" |
32 | #include "atom.h" |
33 | #include "avivod.h" |
33 | #include "avivod.h" |
34 | #include "evergreen_reg.h" |
34 | #include "evergreen_reg.h" |
35 | #include "evergreen_blit_shaders.h" |
35 | #include "evergreen_blit_shaders.h" |
36 | - | ||
37 | #define EVERGREEN_PFP_UCODE_SIZE 1120 |
- | |
38 | #define EVERGREEN_PM4_UCODE_SIZE 1376 |
36 | #include "radeon_ucode.h" |
Line 39... | Line 37... | ||
39 | 37 | ||
40 | static const u32 crtc_offsets[6] = |
38 | static const u32 crtc_offsets[6] = |
41 | { |
39 | { |
42 | EVERGREEN_CRTC0_REGISTER_OFFSET, |
40 | EVERGREEN_CRTC0_REGISTER_OFFSET, |
Line 45... | Line 43... | ||
45 | EVERGREEN_CRTC3_REGISTER_OFFSET, |
43 | EVERGREEN_CRTC3_REGISTER_OFFSET, |
46 | EVERGREEN_CRTC4_REGISTER_OFFSET, |
44 | EVERGREEN_CRTC4_REGISTER_OFFSET, |
47 | EVERGREEN_CRTC5_REGISTER_OFFSET |
45 | EVERGREEN_CRTC5_REGISTER_OFFSET |
48 | }; |
46 | }; |
Line -... | Line 47... | ||
- | 47 | ||
- | 48 | #include "clearstate_evergreen.h" |
|
- | 49 | ||
- | 50 | static const u32 sumo_rlc_save_restore_register_list[] = |
|
- | 51 | { |
|
- | 52 | 0x98fc, |
|
- | 53 | 0x9830, |
|
- | 54 | 0x9834, |
|
- | 55 | 0x9838, |
|
- | 56 | 0x9870, |
|
- | 57 | 0x9874, |
|
- | 58 | 0x8a14, |
|
- | 59 | 0x8b24, |
|
- | 60 | 0x8bcc, |
|
- | 61 | 0x8b10, |
|
- | 62 | 0x8d00, |
|
- | 63 | 0x8d04, |
|
- | 64 | 0x8c00, |
|
- | 65 | 0x8c04, |
|
- | 66 | 0x8c08, |
|
- | 67 | 0x8c0c, |
|
- | 68 | 0x8d8c, |
|
- | 69 | 0x8c20, |
|
- | 70 | 0x8c24, |
|
- | 71 | 0x8c28, |
|
- | 72 | 0x8c18, |
|
- | 73 | 0x8c1c, |
|
- | 74 | 0x8cf0, |
|
- | 75 | 0x8e2c, |
|
- | 76 | 0x8e38, |
|
- | 77 | 0x8c30, |
|
- | 78 | 0x9508, |
|
- | 79 | 0x9688, |
|
- | 80 | 0x9608, |
|
- | 81 | 0x960c, |
|
- | 82 | 0x9610, |
|
- | 83 | 0x9614, |
|
- | 84 | 0x88c4, |
|
- | 85 | 0x88d4, |
|
- | 86 | 0xa008, |
|
- | 87 | 0x900c, |
|
- | 88 | 0x9100, |
|
- | 89 | 0x913c, |
|
- | 90 | 0x98f8, |
|
- | 91 | 0x98f4, |
|
- | 92 | 0x9b7c, |
|
- | 93 | 0x3f8c, |
|
- | 94 | 0x8950, |
|
- | 95 | 0x8954, |
|
- | 96 | 0x8a18, |
|
- | 97 | 0x8b28, |
|
- | 98 | 0x9144, |
|
- | 99 | 0x9148, |
|
- | 100 | 0x914c, |
|
- | 101 | 0x3f90, |
|
- | 102 | 0x3f94, |
|
- | 103 | 0x915c, |
|
- | 104 | 0x9160, |
|
- | 105 | 0x9178, |
|
- | 106 | 0x917c, |
|
- | 107 | 0x9180, |
|
- | 108 | 0x918c, |
|
- | 109 | 0x9190, |
|
- | 110 | 0x9194, |
|
- | 111 | 0x9198, |
|
- | 112 | 0x919c, |
|
- | 113 | 0x91a8, |
|
- | 114 | 0x91ac, |
|
- | 115 | 0x91b0, |
|
- | 116 | 0x91b4, |
|
- | 117 | 0x91b8, |
|
- | 118 | 0x91c4, |
|
- | 119 | 0x91c8, |
|
- | 120 | 0x91cc, |
|
- | 121 | 0x91d0, |
|
- | 122 | 0x91d4, |
|
- | 123 | 0x91e0, |
|
- | 124 | 0x91e4, |
|
- | 125 | 0x91ec, |
|
- | 126 | 0x91f0, |
|
- | 127 | 0x91f4, |
|
- | 128 | 0x9200, |
|
- | 129 | 0x9204, |
|
- | 130 | 0x929c, |
|
- | 131 | 0x9150, |
|
- | 132 | 0x802c, |
|
- | 133 | }; |
|
49 | 134 | ||
50 | static void evergreen_gpu_init(struct radeon_device *rdev); |
135 | static void evergreen_gpu_init(struct radeon_device *rdev); |
51 | void evergreen_fini(struct radeon_device *rdev); |
136 | void evergreen_fini(struct radeon_device *rdev); |
- | 137 | void evergreen_pcie_gen2_enable(struct radeon_device *rdev); |
|
52 | void evergreen_pcie_gen2_enable(struct radeon_device *rdev); |
138 | void evergreen_program_aspm(struct radeon_device *rdev); |
53 | extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev, |
139 | extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev, |
- | 140 | int ring, u32 cp_int_cntl); |
|
- | 141 | extern void cayman_vm_decode_fault(struct radeon_device *rdev, |
|
- | 142 | u32 status, u32 addr); |
|
- | 143 | void cik_init_cp_pg_table(struct radeon_device *rdev); |
|
- | 144 | ||
- | 145 | extern u32 si_get_csb_size(struct radeon_device *rdev); |
|
- | 146 | extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer); |
|
- | 147 | extern u32 cik_get_csb_size(struct radeon_device *rdev); |
|
- | 148 | extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer); |
|
Line 54... | Line 149... | ||
54 | int ring, u32 cp_int_cntl); |
149 | extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev); |
55 | 150 | ||
56 | static const u32 evergreen_golden_registers[] = |
151 | static const u32 evergreen_golden_registers[] = |
57 | { |
152 | { |
Line 92... | Line 187... | ||
92 | 0x8c24, 0xffffffff, 0x00800080, |
187 | 0x8c24, 0xffffffff, 0x00800080, |
93 | 0x8c18, 0xffffffff, 0x20202078, |
188 | 0x8c18, 0xffffffff, 0x20202078, |
94 | 0x8c1c, 0xffffffff, 0x00001010, |
189 | 0x8c1c, 0xffffffff, 0x00001010, |
95 | 0x28350, 0xffffffff, 0x00000000, |
190 | 0x28350, 0xffffffff, 0x00000000, |
96 | 0xa008, 0xffffffff, 0x00010000, |
191 | 0xa008, 0xffffffff, 0x00010000, |
97 | 0x5cc, 0xffffffff, 0x00000001, |
192 | 0x5c4, 0xffffffff, 0x00000001, |
98 | 0x9508, 0xffffffff, 0x00000002, |
193 | 0x9508, 0xffffffff, 0x00000002, |
99 | 0x913c, 0x0000000f, 0x0000000a |
194 | 0x913c, 0x0000000f, 0x0000000a |
100 | }; |
195 | }; |
Line 101... | Line 196... | ||
101 | 196 | ||
Line 379... | Line 474... | ||
379 | 0x8c24, 0xffffffff, 0x00800080, |
474 | 0x8c24, 0xffffffff, 0x00800080, |
380 | 0x8c18, 0xffffffff, 0x20202078, |
475 | 0x8c18, 0xffffffff, 0x20202078, |
381 | 0x8c1c, 0xffffffff, 0x00001010, |
476 | 0x8c1c, 0xffffffff, 0x00001010, |
382 | 0x28350, 0xffffffff, 0x00000000, |
477 | 0x28350, 0xffffffff, 0x00000000, |
383 | 0xa008, 0xffffffff, 0x00010000, |
478 | 0xa008, 0xffffffff, 0x00010000, |
384 | 0x5cc, 0xffffffff, 0x00000001, |
479 | 0x5c4, 0xffffffff, 0x00000001, |
385 | 0x9508, 0xffffffff, 0x00000002 |
480 | 0x9508, 0xffffffff, 0x00000002 |
386 | }; |
481 | }; |
Line 387... | Line 482... | ||
387 | 482 | ||
388 | static const u32 cedar_mgcg_init[] = |
483 | static const u32 cedar_mgcg_init[] = |
Line 538... | Line 633... | ||
538 | }; |
633 | }; |
Line 539... | Line 634... | ||
539 | 634 | ||
540 | static const u32 supersumo_golden_registers[] = |
635 | static const u32 supersumo_golden_registers[] = |
541 | { |
636 | { |
542 | 0x5eb4, 0xffffffff, 0x00000002, |
637 | 0x5eb4, 0xffffffff, 0x00000002, |
543 | 0x5cc, 0xffffffff, 0x00000001, |
638 | 0x5c4, 0xffffffff, 0x00000001, |
544 | 0x7030, 0xffffffff, 0x00000011, |
639 | 0x7030, 0xffffffff, 0x00000011, |
545 | 0x7c30, 0xffffffff, 0x00000011, |
640 | 0x7c30, 0xffffffff, 0x00000011, |
546 | 0x6104, 0x01000300, 0x00000000, |
641 | 0x6104, 0x01000300, 0x00000000, |
547 | 0x5bc0, 0x00300000, 0x00000000, |
642 | 0x5bc0, 0x00300000, 0x00000000, |
Line 622... | Line 717... | ||
622 | }; |
717 | }; |
Line 623... | Line 718... | ||
623 | 718 | ||
624 | static const u32 wrestler_golden_registers[] = |
719 | static const u32 wrestler_golden_registers[] = |
625 | { |
720 | { |
626 | 0x5eb4, 0xffffffff, 0x00000002, |
721 | 0x5eb4, 0xffffffff, 0x00000002, |
627 | 0x5cc, 0xffffffff, 0x00000001, |
722 | 0x5c4, 0xffffffff, 0x00000001, |
628 | 0x7030, 0xffffffff, 0x00000011, |
723 | 0x7030, 0xffffffff, 0x00000011, |
629 | 0x7c30, 0xffffffff, 0x00000011, |
724 | 0x7c30, 0xffffffff, 0x00000011, |
630 | 0x6104, 0x01000300, 0x00000000, |
725 | 0x6104, 0x01000300, 0x00000000, |
631 | 0x5bc0, 0x00300000, 0x00000000, |
726 | 0x5bc0, 0x00300000, 0x00000000, |
Line 1078... | Line 1173... | ||
1078 | return 0; |
1173 | return 0; |
1079 | } |
1174 | } |
Line 1080... | Line 1175... | ||
1080 | 1175 | ||
1081 | void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) |
1176 | void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) |
1082 | { |
- | |
1083 | u16 ctl, v; |
1177 | { |
1084 | int err; |
- | |
1085 | - | ||
1086 | err = pcie_capability_read_word(rdev->pdev, PCI_EXP_DEVCTL, &ctl); |
- | |
1087 | if (err) |
1178 | int readrq; |
1088 | return; |
- | |
1089 | - | ||
Line -... | Line 1179... | ||
- | 1179 | u16 v; |
|
- | 1180 | ||
1090 | v = (ctl & PCI_EXP_DEVCTL_READRQ) >> 12; |
1181 | readrq = pcie_get_readrq(rdev->pdev); |
1091 | 1182 | v = ffs(readrq) - 8; |
|
1092 | /* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it |
1183 | /* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it |
1093 | * to avoid hangs or perfomance issues |
1184 | * to avoid hangs or perfomance issues |
- | 1185 | */ |
|
- | 1186 | if ((v == 0) || (v == 6) || (v == 7)) |
|
- | 1187 | pcie_set_readrq(rdev->pdev, 512); |
|
- | 1188 | } |
|
- | 1189 | ||
- | 1190 | void dce4_program_fmt(struct drm_encoder *encoder) |
|
- | 1191 | { |
|
- | 1192 | struct drm_device *dev = encoder->dev; |
|
- | 1193 | struct radeon_device *rdev = dev->dev_private; |
|
- | 1194 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
|
- | 1195 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); |
|
- | 1196 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
|
- | 1197 | int bpc = 0; |
|
- | 1198 | u32 tmp = 0; |
|
- | 1199 | enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE; |
|
- | 1200 | ||
- | 1201 | if (connector) { |
|
- | 1202 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 1203 | bpc = radeon_get_monitor_bpc(connector); |
|
- | 1204 | dither = radeon_connector->dither; |
|
- | 1205 | } |
|
- | 1206 | ||
- | 1207 | /* LVDS/eDP FMT is set up by atom */ |
|
- | 1208 | if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT) |
|
- | 1209 | return; |
|
- | 1210 | ||
- | 1211 | /* not needed for analog */ |
|
- | 1212 | if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) || |
|
- | 1213 | (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2)) |
|
- | 1214 | return; |
|
- | 1215 | ||
- | 1216 | if (bpc == 0) |
|
- | 1217 | return; |
|
- | 1218 | ||
- | 1219 | switch (bpc) { |
|
- | 1220 | case 6: |
|
- | 1221 | if (dither == RADEON_FMT_DITHER_ENABLE) |
|
1094 | */ |
1222 | /* XXX sort out optimal dither settings */ |
- | 1223 | tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE | |
|
1095 | if ((v == 0) || (v == 6) || (v == 7)) { |
1224 | FMT_SPATIAL_DITHER_EN); |
- | 1225 | else |
|
- | 1226 | tmp |= FMT_TRUNCATE_EN; |
|
- | 1227 | break; |
|
- | 1228 | case 8: |
|
- | 1229 | if (dither == RADEON_FMT_DITHER_ENABLE) |
|
- | 1230 | /* XXX sort out optimal dither settings */ |
|
1096 | ctl &= ~PCI_EXP_DEVCTL_READRQ; |
1231 | tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE | |
- | 1232 | FMT_RGB_RANDOM_ENABLE | |
|
- | 1233 | FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH); |
|
- | 1234 | else |
|
- | 1235 | tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH); |
|
- | 1236 | break; |
|
- | 1237 | case 10: |
|
- | 1238 | default: |
|
1097 | ctl |= (2 << 12); |
1239 | /* not needed */ |
- | 1240 | break; |
|
- | 1241 | } |
|
1098 | pcie_capability_write_word(rdev->pdev, PCI_EXP_DEVCTL, ctl); |
1242 | |
Line 1099... | Line 1243... | ||
1099 | } |
1243 | WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp); |
1100 | } |
1244 | } |
1101 | 1245 | ||
Line 1154... | Line 1298... | ||
1154 | break; |
1298 | break; |
1155 | } |
1299 | } |
1156 | } |
1300 | } |
1157 | } |
1301 | } |
Line 1158... | Line -... | ||
1158 | - | ||
1159 | 1302 | ||
1160 | /** |
1303 | /** |
1161 | * evergreen_page_flip - pageflip callback. |
1304 | * evergreen_page_flip - pageflip callback. |
1162 | * |
1305 | * |
1163 | * @rdev: radeon_device pointer |
1306 | * @rdev: radeon_device pointer |
Line 1168... | Line 1311... | ||
1168 | * During vblank we take the crtc lock and wait for the update_pending |
1311 | * During vblank we take the crtc lock and wait for the update_pending |
1169 | * bit to go high, when it does, we release the lock, and allow the |
1312 | * bit to go high, when it does, we release the lock, and allow the |
1170 | * double buffered update to take place. |
1313 | * double buffered update to take place. |
1171 | * Returns the current update pending status. |
1314 | * Returns the current update pending status. |
1172 | */ |
1315 | */ |
1173 | u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) |
1316 | void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) |
1174 | { |
1317 | { |
1175 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; |
1318 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; |
1176 | u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset); |
1319 | u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset); |
1177 | int i; |
1320 | int i; |
Line 1200... | Line 1343... | ||
1200 | DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n"); |
1343 | DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n"); |
Line 1201... | Line 1344... | ||
1201 | 1344 | ||
1202 | /* Unlock the lock, so double-buffering can take place inside vblank */ |
1345 | /* Unlock the lock, so double-buffering can take place inside vblank */ |
1203 | tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK; |
1346 | tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK; |
- | 1347 | WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); |
|
- | 1348 | } |
|
- | 1349 | ||
- | 1350 | /** |
|
- | 1351 | * evergreen_page_flip_pending - check if page flip is still pending |
|
- | 1352 | * |
|
- | 1353 | * @rdev: radeon_device pointer |
|
- | 1354 | * @crtc_id: crtc to check |
|
- | 1355 | * |
|
- | 1356 | * Returns the current update pending status. |
|
- | 1357 | */ |
|
- | 1358 | bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id) |
|
- | 1359 | { |
|
Line 1204... | Line 1360... | ||
1204 | WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); |
1360 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; |
1205 | 1361 | ||
- | 1362 | /* Return current update_pending status: */ |
|
1206 | /* Return current update_pending status: */ |
1363 | return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & |
Line 1207... | Line 1364... | ||
1207 | return RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING; |
1364 | EVERGREEN_GRPH_SURFACE_UPDATE_PENDING); |
1208 | } |
1365 | } |
1209 | 1366 | ||
Line 1386... | Line 1543... | ||
1386 | int req_cm_idx = rdev->pm.requested_clock_mode_index; |
1543 | int req_cm_idx = rdev->pm.requested_clock_mode_index; |
1387 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; |
1544 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; |
1388 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
1545 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
Line 1389... | Line 1546... | ||
1389 | 1546 | ||
1390 | if (voltage->type == VOLTAGE_SW) { |
1547 | if (voltage->type == VOLTAGE_SW) { |
1391 | /* 0xff01 is a flag rather then an actual voltage */ |
1548 | /* 0xff0x are flags rather then an actual voltage */ |
1392 | if (voltage->voltage == 0xff01) |
1549 | if ((voltage->voltage & 0xff00) == 0xff00) |
1393 | return; |
1550 | return; |
1394 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { |
1551 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { |
1395 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
1552 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
1396 | rdev->pm.current_vddc = voltage->voltage; |
1553 | rdev->pm.current_vddc = voltage->voltage; |
Line 1407... | Line 1564... | ||
1407 | ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) || |
1564 | ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) || |
1408 | (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX))) |
1565 | (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX))) |
1409 | voltage = &rdev->pm.power_state[req_ps_idx]. |
1566 | voltage = &rdev->pm.power_state[req_ps_idx]. |
1410 | clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage; |
1567 | clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage; |
Line 1411... | Line 1568... | ||
1411 | 1568 | ||
1412 | /* 0xff01 is a flag rather then an actual voltage */ |
1569 | /* 0xff0x are flags rather then an actual voltage */ |
1413 | if (voltage->vddci == 0xff01) |
1570 | if ((voltage->vddci & 0xff00) == 0xff00) |
1414 | return; |
1571 | return; |
1415 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { |
1572 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { |
1416 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1573 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1417 | rdev->pm.current_vddci = voltage->vddci; |
1574 | rdev->pm.current_vddci = voltage->vddci; |
Line 1687... | Line 1844... | ||
1687 | static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, |
1844 | static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, |
1688 | struct radeon_crtc *radeon_crtc, |
1845 | struct radeon_crtc *radeon_crtc, |
1689 | struct drm_display_mode *mode, |
1846 | struct drm_display_mode *mode, |
1690 | struct drm_display_mode *other_mode) |
1847 | struct drm_display_mode *other_mode) |
1691 | { |
1848 | { |
1692 | u32 tmp; |
1849 | u32 tmp, buffer_alloc, i; |
- | 1850 | u32 pipe_offset = radeon_crtc->crtc_id * 0x20; |
|
1693 | /* |
1851 | /* |
1694 | * Line Buffer Setup |
1852 | * Line Buffer Setup |
1695 | * There are 3 line buffers, each one shared by 2 display controllers. |
1853 | * There are 3 line buffers, each one shared by 2 display controllers. |
1696 | * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between |
1854 | * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between |
1697 | * the display controllers. The paritioning is done via one of four |
1855 | * the display controllers. The paritioning is done via one of four |
Line 1710... | Line 1868... | ||
1710 | /* this can get tricky if we have two large displays on a paired group |
1868 | /* this can get tricky if we have two large displays on a paired group |
1711 | * of crtcs. Ideally for multiple large displays we'd assign them to |
1869 | * of crtcs. Ideally for multiple large displays we'd assign them to |
1712 | * non-linked crtcs for maximum line buffer allocation. |
1870 | * non-linked crtcs for maximum line buffer allocation. |
1713 | */ |
1871 | */ |
1714 | if (radeon_crtc->base.enabled && mode) { |
1872 | if (radeon_crtc->base.enabled && mode) { |
1715 | if (other_mode) |
1873 | if (other_mode) { |
1716 | tmp = 0; /* 1/2 */ |
1874 | tmp = 0; /* 1/2 */ |
- | 1875 | buffer_alloc = 1; |
|
1717 | else |
1876 | } else { |
1718 | tmp = 2; /* whole */ |
1877 | tmp = 2; /* whole */ |
- | 1878 | buffer_alloc = 2; |
|
- | 1879 | } |
|
1719 | } else |
1880 | } else { |
1720 | tmp = 0; |
1881 | tmp = 0; |
- | 1882 | buffer_alloc = 0; |
|
- | 1883 | } |
|
Line 1721... | Line 1884... | ||
1721 | 1884 | ||
1722 | /* second controller of the pair uses second half of the lb */ |
1885 | /* second controller of the pair uses second half of the lb */ |
1723 | if (radeon_crtc->crtc_id % 2) |
1886 | if (radeon_crtc->crtc_id % 2) |
1724 | tmp += 4; |
1887 | tmp += 4; |
Line -... | Line 1888... | ||
- | 1888 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); |
|
- | 1889 | ||
- | 1890 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
|
- | 1891 | WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset, |
|
- | 1892 | DMIF_BUFFERS_ALLOCATED(buffer_alloc)); |
|
- | 1893 | for (i = 0; i < rdev->usec_timeout; i++) { |
|
- | 1894 | if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) & |
|
- | 1895 | DMIF_BUFFERS_ALLOCATED_COMPLETED) |
|
- | 1896 | break; |
|
- | 1897 | udelay(1); |
|
- | 1898 | } |
|
1725 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); |
1899 | } |
1726 | 1900 | ||
1727 | if (radeon_crtc->base.enabled && mode) { |
1901 | if (radeon_crtc->base.enabled && mode) { |
1728 | switch (tmp) { |
1902 | switch (tmp) { |
1729 | case 0: |
1903 | case 0: |
Line 2005... | Line 2179... | ||
2005 | static void evergreen_program_watermarks(struct radeon_device *rdev, |
2179 | static void evergreen_program_watermarks(struct radeon_device *rdev, |
2006 | struct radeon_crtc *radeon_crtc, |
2180 | struct radeon_crtc *radeon_crtc, |
2007 | u32 lb_size, u32 num_heads) |
2181 | u32 lb_size, u32 num_heads) |
2008 | { |
2182 | { |
2009 | struct drm_display_mode *mode = &radeon_crtc->base.mode; |
2183 | struct drm_display_mode *mode = &radeon_crtc->base.mode; |
2010 | struct evergreen_wm_params wm; |
2184 | struct evergreen_wm_params wm_low, wm_high; |
- | 2185 | u32 dram_channels; |
|
2011 | u32 pixel_period; |
2186 | u32 pixel_period; |
2012 | u32 line_time = 0; |
2187 | u32 line_time = 0; |
2013 | u32 latency_watermark_a = 0, latency_watermark_b = 0; |
2188 | u32 latency_watermark_a = 0, latency_watermark_b = 0; |
2014 | u32 priority_a_mark = 0, priority_b_mark = 0; |
2189 | u32 priority_a_mark = 0, priority_b_mark = 0; |
2015 | u32 priority_a_cnt = PRIORITY_OFF; |
2190 | u32 priority_a_cnt = PRIORITY_OFF; |
Line 2021... | Line 2196... | ||
2021 | if (radeon_crtc->base.enabled && num_heads && mode) { |
2196 | if (radeon_crtc->base.enabled && num_heads && mode) { |
2022 | pixel_period = 1000000 / (u32)mode->clock; |
2197 | pixel_period = 1000000 / (u32)mode->clock; |
2023 | line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); |
2198 | line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); |
2024 | priority_a_cnt = 0; |
2199 | priority_a_cnt = 0; |
2025 | priority_b_cnt = 0; |
2200 | priority_b_cnt = 0; |
- | 2201 | dram_channels = evergreen_get_number_of_dram_channels(rdev); |
|
- | 2202 | ||
- | 2203 | /* watermark for high clocks */ |
|
- | 2204 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { |
|
- | 2205 | wm_high.yclk = |
|
- | 2206 | radeon_dpm_get_mclk(rdev, false) * 10; |
|
- | 2207 | wm_high.sclk = |
|
- | 2208 | radeon_dpm_get_sclk(rdev, false) * 10; |
|
- | 2209 | } else { |
|
- | 2210 | wm_high.yclk = rdev->pm.current_mclk * 10; |
|
- | 2211 | wm_high.sclk = rdev->pm.current_sclk * 10; |
|
- | 2212 | } |
|
Line 2026... | Line -... | ||
2026 | - | ||
2027 | wm.yclk = rdev->pm.current_mclk * 10; |
- | |
2028 | wm.sclk = rdev->pm.current_sclk * 10; |
2213 | |
2029 | wm.disp_clk = mode->clock; |
2214 | wm_high.disp_clk = mode->clock; |
2030 | wm.src_width = mode->crtc_hdisplay; |
2215 | wm_high.src_width = mode->crtc_hdisplay; |
2031 | wm.active_time = mode->crtc_hdisplay * pixel_period; |
2216 | wm_high.active_time = mode->crtc_hdisplay * pixel_period; |
2032 | wm.blank_time = line_time - wm.active_time; |
2217 | wm_high.blank_time = line_time - wm_high.active_time; |
2033 | wm.interlaced = false; |
2218 | wm_high.interlaced = false; |
2034 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
2219 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
2035 | wm.interlaced = true; |
2220 | wm_high.interlaced = true; |
2036 | wm.vsc = radeon_crtc->vsc; |
2221 | wm_high.vsc = radeon_crtc->vsc; |
2037 | wm.vtaps = 1; |
2222 | wm_high.vtaps = 1; |
- | 2223 | if (radeon_crtc->rmx_type != RMX_OFF) |
|
- | 2224 | wm_high.vtaps = 2; |
|
- | 2225 | wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */ |
|
- | 2226 | wm_high.lb_size = lb_size; |
|
- | 2227 | wm_high.dram_channels = dram_channels; |
|
- | 2228 | wm_high.num_heads = num_heads; |
|
- | 2229 | ||
- | 2230 | /* watermark for low clocks */ |
|
- | 2231 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { |
|
- | 2232 | wm_low.yclk = |
|
- | 2233 | radeon_dpm_get_mclk(rdev, true) * 10; |
|
- | 2234 | wm_low.sclk = |
|
- | 2235 | radeon_dpm_get_sclk(rdev, true) * 10; |
|
- | 2236 | } else { |
|
- | 2237 | wm_low.yclk = rdev->pm.current_mclk * 10; |
|
- | 2238 | wm_low.sclk = rdev->pm.current_sclk * 10; |
|
- | 2239 | } |
|
- | 2240 | ||
- | 2241 | wm_low.disp_clk = mode->clock; |
|
- | 2242 | wm_low.src_width = mode->crtc_hdisplay; |
|
- | 2243 | wm_low.active_time = mode->crtc_hdisplay * pixel_period; |
|
- | 2244 | wm_low.blank_time = line_time - wm_low.active_time; |
|
- | 2245 | wm_low.interlaced = false; |
|
- | 2246 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
|
- | 2247 | wm_low.interlaced = true; |
|
- | 2248 | wm_low.vsc = radeon_crtc->vsc; |
|
- | 2249 | wm_low.vtaps = 1; |
|
2038 | if (radeon_crtc->rmx_type != RMX_OFF) |
2250 | if (radeon_crtc->rmx_type != RMX_OFF) |
2039 | wm.vtaps = 2; |
2251 | wm_low.vtaps = 2; |
2040 | wm.bytes_per_pixel = 4; /* XXX: get this from fb config */ |
2252 | wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */ |
2041 | wm.lb_size = lb_size; |
2253 | wm_low.lb_size = lb_size; |
2042 | wm.dram_channels = evergreen_get_number_of_dram_channels(rdev); |
2254 | wm_low.dram_channels = dram_channels; |
Line 2043... | Line 2255... | ||
2043 | wm.num_heads = num_heads; |
2255 | wm_low.num_heads = num_heads; |
2044 | 2256 | ||
2045 | /* set for high clocks */ |
2257 | /* set for high clocks */ |
2046 | latency_watermark_a = min(evergreen_latency_watermark(&wm), (u32)65535); |
- | |
2047 | /* set for low clocks */ |
2258 | latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535); |
Line 2048... | Line 2259... | ||
2048 | /* wm.yclk = low clk; wm.sclk = low clk */ |
2259 | /* set for low clocks */ |
2049 | latency_watermark_b = min(evergreen_latency_watermark(&wm), (u32)65535); |
2260 | latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535); |
2050 | 2261 | ||
2051 | /* possibly force display priority to high */ |
2262 | /* possibly force display priority to high */ |
2052 | /* should really do this at mode validation time... */ |
2263 | /* should really do this at mode validation time... */ |
2053 | if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm) || |
2264 | if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) || |
2054 | !evergreen_average_bandwidth_vs_available_bandwidth(&wm) || |
2265 | !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) || |
2055 | !evergreen_check_latency_hiding(&wm) || |
2266 | !evergreen_check_latency_hiding(&wm_high) || |
- | 2267 | (rdev->disp_priority == 2)) { |
|
- | 2268 | DRM_DEBUG_KMS("force priority a to high\n"); |
|
- | 2269 | priority_a_cnt |= PRIORITY_ALWAYS_ON; |
|
- | 2270 | } |
|
- | 2271 | if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) || |
|
- | 2272 | !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) || |
|
2056 | (rdev->disp_priority == 2)) { |
2273 | !evergreen_check_latency_hiding(&wm_low) || |
2057 | DRM_DEBUG_KMS("force priority to high\n"); |
2274 | (rdev->disp_priority == 2)) { |
Line 2058... | Line 2275... | ||
2058 | priority_a_cnt |= PRIORITY_ALWAYS_ON; |
2275 | DRM_DEBUG_KMS("force priority b to high\n"); |
2059 | priority_b_cnt |= PRIORITY_ALWAYS_ON; |
2276 | priority_b_cnt |= PRIORITY_ALWAYS_ON; |
Line 2106... | Line 2323... | ||
2106 | 2323 | ||
2107 | /* write the priority marks */ |
2324 | /* write the priority marks */ |
2108 | WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt); |
2325 | WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt); |
Line -... | Line 2326... | ||
- | 2326 | WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt); |
|
- | 2327 | ||
- | 2328 | /* save values for DPM */ |
|
- | 2329 | radeon_crtc->line_time = line_time; |
|
2109 | WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt); |
2330 | radeon_crtc->wm_high = latency_watermark_a; |
Line 2110... | Line 2331... | ||
2110 | 2331 | radeon_crtc->wm_low = latency_watermark_b; |
|
2111 | } |
2332 | } |
2112 | 2333 | ||
Line 2201... | Line 2422... | ||
2201 | return -EINVAL; |
2422 | return -EINVAL; |
2202 | } |
2423 | } |
2203 | r = radeon_gart_table_vram_pin(rdev); |
2424 | r = radeon_gart_table_vram_pin(rdev); |
2204 | if (r) |
2425 | if (r) |
2205 | return r; |
2426 | return r; |
2206 | radeon_gart_restore(rdev); |
- | |
2207 | /* Setup L2 cache */ |
2427 | /* Setup L2 cache */ |
2208 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | |
2428 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | |
2209 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | |
2429 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | |
2210 | EFFECTIVE_L2_QUEUE_SIZE(7)); |
2430 | EFFECTIVE_L2_QUEUE_SIZE(7)); |
2211 | WREG32(VM_L2_CNTL2, 0); |
2431 | WREG32(VM_L2_CNTL2, 0); |
Line 2419... | Line 2639... | ||
2419 | 2639 | ||
2420 | /* unlock regs and wait for update */ |
2640 | /* unlock regs and wait for update */ |
2421 | for (i = 0; i < rdev->num_crtc; i++) { |
2641 | for (i = 0; i < rdev->num_crtc; i++) { |
2422 | if (save->crtc_enabled[i]) { |
2642 | if (save->crtc_enabled[i]) { |
2423 | tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]); |
2643 | tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]); |
2424 | if ((tmp & 0x3) != 0) { |
2644 | if ((tmp & 0x7) != 3) { |
- | 2645 | tmp &= ~0x7; |
|
2425 | tmp &= ~0x3; |
2646 | tmp |= 0x3; |
2426 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp); |
2647 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp); |
2427 | } |
2648 | } |
2428 | tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]); |
2649 | tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]); |
2429 | if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) { |
2650 | if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) { |
Line 2453... | Line 2674... | ||
2453 | 2674 | ||
2454 | for (i = 0; i < rdev->num_crtc; i++) { |
2675 | for (i = 0; i < rdev->num_crtc; i++) { |
2455 | if (save->crtc_enabled[i]) { |
2676 | if (save->crtc_enabled[i]) { |
2456 | if (ASIC_IS_DCE6(rdev)) { |
2677 | if (ASIC_IS_DCE6(rdev)) { |
2457 | tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); |
2678 | tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); |
2458 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
2679 | tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN; |
2459 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
2680 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
2460 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
2681 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
2461 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
2682 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); |
2462 | } else { |
2683 | } else { |
Line 2646... | Line 2867... | ||
2646 | radeon_ring_write(ring, 0x0); |
2867 | radeon_ring_write(ring, 0x0); |
2647 | radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1); |
2868 | radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1); |
2648 | radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); |
2869 | radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); |
2649 | radeon_ring_write(ring, 0); |
2870 | radeon_ring_write(ring, 0); |
2650 | radeon_ring_write(ring, 0); |
2871 | radeon_ring_write(ring, 0); |
2651 | radeon_ring_unlock_commit(rdev, ring); |
2872 | radeon_ring_unlock_commit(rdev, ring, false); |
Line 2652... | Line 2873... | ||
2652 | 2873 | ||
2653 | cp_me = 0xff; |
2874 | cp_me = 0xff; |
Line 2654... | Line 2875... | ||
2654 | WREG32(CP_ME_CNTL, cp_me); |
2875 | WREG32(CP_ME_CNTL, cp_me); |
Line 2689... | Line 2910... | ||
2689 | radeon_ring_write(ring, 0xc0026900); |
2910 | radeon_ring_write(ring, 0xc0026900); |
2690 | radeon_ring_write(ring, 0x00000316); |
2911 | radeon_ring_write(ring, 0x00000316); |
2691 | radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ |
2912 | radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ |
2692 | radeon_ring_write(ring, 0x00000010); /* */ |
2913 | radeon_ring_write(ring, 0x00000010); /* */ |
Line 2693... | Line 2914... | ||
2693 | 2914 | ||
Line 2694... | Line 2915... | ||
2694 | radeon_ring_unlock_commit(rdev, ring); |
2915 | radeon_ring_unlock_commit(rdev, ring, false); |
2695 | 2916 | ||
Line 2696... | Line 2917... | ||
2696 | return 0; |
2917 | return 0; |
Line 2714... | Line 2935... | ||
2714 | mdelay(15); |
2935 | mdelay(15); |
2715 | WREG32(GRBM_SOFT_RESET, 0); |
2936 | WREG32(GRBM_SOFT_RESET, 0); |
2716 | RREG32(GRBM_SOFT_RESET); |
2937 | RREG32(GRBM_SOFT_RESET); |
Line 2717... | Line 2938... | ||
2717 | 2938 | ||
2718 | /* Set ring buffer size */ |
2939 | /* Set ring buffer size */ |
2719 | rb_bufsz = drm_order(ring->ring_size / 8); |
2940 | rb_bufsz = order_base_2(ring->ring_size / 8); |
2720 | tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; |
2941 | tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; |
2721 | #ifdef __BIG_ENDIAN |
2942 | #ifdef __BIG_ENDIAN |
2722 | tmp |= BUF_SWAP_32BIT; |
2943 | tmp |= BUF_SWAP_32BIT; |
2723 | #endif |
2944 | #endif |
2724 | WREG32(CP_RB_CNTL, tmp); |
2945 | WREG32(CP_RB_CNTL, tmp); |
Line 2751... | Line 2972... | ||
2751 | WREG32(CP_RB_CNTL, tmp); |
2972 | WREG32(CP_RB_CNTL, tmp); |
Line 2752... | Line 2973... | ||
2752 | 2973 | ||
2753 | WREG32(CP_RB_BASE, ring->gpu_addr >> 8); |
2974 | WREG32(CP_RB_BASE, ring->gpu_addr >> 8); |
Line 2754... | Line -... | ||
2754 | WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); |
- | |
2755 | - | ||
2756 | ring->rptr = RREG32(CP_RB_RPTR); |
2975 | WREG32(CP_DEBUG, (1 << 27) | (1 << 28)); |
2757 | 2976 | ||
2758 | evergreen_cp_start(rdev); |
2977 | evergreen_cp_start(rdev); |
2759 | ring->ready = true; |
2978 | ring->ready = true; |
2760 | r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); |
2979 | r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); |
Line 2942... | Line 3161... | ||
2942 | rdev->config.evergreen.max_stack_entries = 512; |
3161 | rdev->config.evergreen.max_stack_entries = 512; |
2943 | rdev->config.evergreen.sx_num_of_sets = 4; |
3162 | rdev->config.evergreen.sx_num_of_sets = 4; |
2944 | rdev->config.evergreen.sx_max_export_size = 256; |
3163 | rdev->config.evergreen.sx_max_export_size = 256; |
2945 | rdev->config.evergreen.sx_max_export_pos_size = 64; |
3164 | rdev->config.evergreen.sx_max_export_pos_size = 64; |
2946 | rdev->config.evergreen.sx_max_export_smx_size = 192; |
3165 | rdev->config.evergreen.sx_max_export_smx_size = 192; |
2947 | rdev->config.evergreen.max_hw_contexts = 8; |
3166 | rdev->config.evergreen.max_hw_contexts = 4; |
2948 | rdev->config.evergreen.sq_num_cf_insts = 2; |
3167 | rdev->config.evergreen.sq_num_cf_insts = 2; |
Line 2949... | Line 3168... | ||
2949 | 3168 | ||
2950 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
3169 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
2951 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
3170 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
Line 3089... | Line 3308... | ||
3089 | 3308 | ||
3090 | if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { |
3309 | if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { |
3091 | u32 efuse_straps_4; |
3310 | u32 efuse_straps_4; |
Line 3092... | Line -... | ||
3092 | u32 efuse_straps_3; |
- | |
3093 | 3311 | u32 efuse_straps_3; |
|
3094 | WREG32(RCU_IND_INDEX, 0x204); |
- | |
3095 | efuse_straps_4 = RREG32(RCU_IND_DATA); |
3312 | |
3096 | WREG32(RCU_IND_INDEX, 0x203); |
3313 | efuse_straps_4 = RREG32_RCU(0x204); |
3097 | efuse_straps_3 = RREG32(RCU_IND_DATA); |
3314 | efuse_straps_3 = RREG32_RCU(0x203); |
3098 | tmp = (((efuse_straps_4 & 0xf) << 4) | |
3315 | tmp = (((efuse_straps_4 & 0xf) << 4) | |
3099 | ((efuse_straps_3 & 0xf0000000) >> 28)); |
3316 | ((efuse_straps_3 & 0xf0000000) >> 28)); |
3100 | } else { |
3317 | } else { |
Line 3118... | Line 3335... | ||
3118 | if ((disabled_rb_mask & tmp) == tmp) { |
3335 | if ((disabled_rb_mask & tmp) == tmp) { |
3119 | for (i = 0; i < rdev->config.evergreen.max_backends; i++) |
3336 | for (i = 0; i < rdev->config.evergreen.max_backends; i++) |
3120 | disabled_rb_mask &= ~(1 << i); |
3337 | disabled_rb_mask &= ~(1 << i); |
3121 | } |
3338 | } |
Line -... | Line 3339... | ||
- | 3339 | ||
- | 3340 | for (i = 0; i < rdev->config.evergreen.num_ses; i++) { |
|
- | 3341 | u32 simd_disable_bitmap; |
|
- | 3342 | ||
- | 3343 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); |
|
- | 3344 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); |
|
- | 3345 | simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; |
|
- | 3346 | simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds; |
|
- | 3347 | tmp <<= 16; |
|
- | 3348 | tmp |= simd_disable_bitmap; |
|
- | 3349 | } |
|
- | 3350 | rdev->config.evergreen.active_simds = hweight32(~tmp); |
|
3122 | 3351 | ||
3123 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
3352 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
Line 3124... | Line 3353... | ||
3124 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
3353 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
3125 | 3354 | ||
Line 3448... | Line 3677... | ||
3448 | } |
3677 | } |
Line 3449... | Line 3678... | ||
3449 | 3678 | ||
3450 | return true; |
3679 | return true; |
Line 3451... | Line 3680... | ||
3451 | } |
3680 | } |
3452 | 3681 | ||
3453 | static u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev) |
3682 | u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev) |
3454 | { |
3683 | { |
Line 3455... | Line 3684... | ||
3455 | u32 reset_mask = 0; |
3684 | u32 reset_mask = 0; |
Line 3631... | Line 3860... | ||
3631 | udelay(50); |
3860 | udelay(50); |
Line 3632... | Line 3861... | ||
3632 | 3861 | ||
3633 | evergreen_print_gpu_status_regs(rdev); |
3862 | evergreen_print_gpu_status_regs(rdev); |
Line -... | Line 3863... | ||
- | 3863 | } |
|
- | 3864 | ||
- | 3865 | void evergreen_gpu_pci_config_reset(struct radeon_device *rdev) |
|
- | 3866 | { |
|
- | 3867 | struct evergreen_mc_save save; |
|
- | 3868 | u32 tmp, i; |
|
- | 3869 | ||
- | 3870 | dev_info(rdev->dev, "GPU pci config reset\n"); |
|
- | 3871 | ||
- | 3872 | /* disable dpm? */ |
|
- | 3873 | ||
- | 3874 | /* Disable CP parsing/prefetching */ |
|
- | 3875 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); |
|
- | 3876 | udelay(50); |
|
- | 3877 | /* Disable DMA */ |
|
- | 3878 | tmp = RREG32(DMA_RB_CNTL); |
|
- | 3879 | tmp &= ~DMA_RB_ENABLE; |
|
- | 3880 | WREG32(DMA_RB_CNTL, tmp); |
|
- | 3881 | /* XXX other engines? */ |
|
- | 3882 | ||
- | 3883 | /* halt the rlc */ |
|
- | 3884 | r600_rlc_stop(rdev); |
|
- | 3885 | ||
- | 3886 | udelay(50); |
|
- | 3887 | ||
- | 3888 | /* set mclk/sclk to bypass */ |
|
- | 3889 | rv770_set_clk_bypass_mode(rdev); |
|
- | 3890 | /* disable BM */ |
|
- | 3891 | pci_clear_master(rdev->pdev); |
|
- | 3892 | /* disable mem access */ |
|
- | 3893 | evergreen_mc_stop(rdev, &save); |
|
- | 3894 | if (evergreen_mc_wait_for_idle(rdev)) { |
|
- | 3895 | dev_warn(rdev->dev, "Wait for MC idle timed out !\n"); |
|
- | 3896 | } |
|
- | 3897 | /* reset */ |
|
- | 3898 | radeon_pci_config_reset(rdev); |
|
- | 3899 | /* wait for asic to come out of reset */ |
|
- | 3900 | for (i = 0; i < rdev->usec_timeout; i++) { |
|
- | 3901 | if (RREG32(CONFIG_MEMSIZE) != 0xffffffff) |
|
- | 3902 | break; |
|
- | 3903 | udelay(1); |
|
- | 3904 | } |
|
3634 | } |
3905 | } |
3635 | 3906 | ||
3636 | int evergreen_asic_reset(struct radeon_device *rdev) |
3907 | int evergreen_asic_reset(struct radeon_device *rdev) |
Line 3637... | Line 3908... | ||
3637 | { |
3908 | { |
Line 3638... | Line 3909... | ||
3638 | u32 reset_mask; |
3909 | u32 reset_mask; |
3639 | 3910 | ||
Line -... | Line 3911... | ||
- | 3911 | reset_mask = evergreen_gpu_check_soft_reset(rdev); |
|
3640 | reset_mask = evergreen_gpu_check_soft_reset(rdev); |
3912 | |
Line 3641... | Line 3913... | ||
3641 | 3913 | if (reset_mask) |
|
Line -... | Line 3914... | ||
- | 3914 | r600_set_bios_scratch_engine_hung(rdev, true); |
|
- | 3915 | ||
- | 3916 | /* try soft reset */ |
|
- | 3917 | evergreen_gpu_soft_reset(rdev, reset_mask); |
|
- | 3918 | ||
- | 3919 | reset_mask = evergreen_gpu_check_soft_reset(rdev); |
|
3642 | if (reset_mask) |
3920 | |
3643 | r600_set_bios_scratch_engine_hung(rdev, true); |
3921 | /* try pci config reset */ |
Line 3644... | Line 3922... | ||
3644 | 3922 | if (reset_mask && radeon_hard_reset) |
|
3645 | evergreen_gpu_soft_reset(rdev, reset_mask); |
3923 | evergreen_gpu_pci_config_reset(rdev); |
Line 3666... | Line 3944... | ||
3666 | u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); |
3944 | u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); |
Line 3667... | Line 3945... | ||
3667 | 3945 | ||
3668 | if (!(reset_mask & (RADEON_RESET_GFX | |
3946 | if (!(reset_mask & (RADEON_RESET_GFX | |
3669 | RADEON_RESET_COMPUTE | |
3947 | RADEON_RESET_COMPUTE | |
3670 | RADEON_RESET_CP))) { |
3948 | RADEON_RESET_CP))) { |
3671 | radeon_ring_lockup_update(ring); |
3949 | radeon_ring_lockup_update(rdev, ring); |
3672 | return false; |
3950 | return false; |
3673 | } |
- | |
3674 | /* force CP activities */ |
- | |
3675 | radeon_ring_force_activity(rdev, ring); |
3951 | } |
3676 | return radeon_ring_test_lockup(rdev, ring); |
3952 | return radeon_ring_test_lockup(rdev, ring); |
Line 3677... | Line 3953... | ||
3677 | } |
3953 | } |
3678 | - | ||
3679 | /** |
- | |
3680 | * evergreen_dma_is_lockup - Check if the DMA engine is locked up |
- | |
3681 | * |
- | |
3682 | * @rdev: radeon_device pointer |
3954 | |
3683 | * @ring: radeon_ring structure holding ring information |
- | |
3684 | * |
- | |
3685 | * Check if the async DMA engine is locked up. |
3955 | /* |
- | 3956 | * RLC |
|
- | 3957 | */ |
|
- | 3958 | #define RLC_SAVE_RESTORE_LIST_END_MARKER 0x00000000 |
|
3686 | * Returns true if the engine appears to be locked up, false if not. |
3959 | #define RLC_CLEAR_STATE_END_MARKER 0x00000001 |
3687 | */ |
3960 | |
3688 | bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) |
3961 | void sumo_rlc_fini(struct radeon_device *rdev) |
Line -... | Line 3962... | ||
- | 3962 | { |
|
3689 | { |
3963 | int r; |
- | 3964 | ||
- | 3965 | /* save restore block */ |
|
- | 3966 | if (rdev->rlc.save_restore_obj) { |
|
3690 | u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); |
3967 | r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); |
- | 3968 | if (unlikely(r != 0)) |
|
- | 3969 | dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r); |
|
- | 3970 | radeon_bo_unpin(rdev->rlc.save_restore_obj); |
|
3691 | 3971 | radeon_bo_unreserve(rdev->rlc.save_restore_obj); |
|
3692 | if (!(reset_mask & RADEON_RESET_DMA)) { |
3972 | |
- | 3973 | radeon_bo_unref(&rdev->rlc.save_restore_obj); |
|
3693 | radeon_ring_lockup_update(ring); |
3974 | rdev->rlc.save_restore_obj = NULL; |
- | 3975 | } |
|
- | 3976 | ||
- | 3977 | /* clear state block */ |
|
- | 3978 | if (rdev->rlc.clear_state_obj) { |
|
- | 3979 | r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); |
|
- | 3980 | if (unlikely(r != 0)) |
|
- | 3981 | dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r); |
|
3694 | return false; |
3982 | radeon_bo_unpin(rdev->rlc.clear_state_obj); |
- | 3983 | radeon_bo_unreserve(rdev->rlc.clear_state_obj); |
|
- | 3984 | ||
- | 3985 | radeon_bo_unref(&rdev->rlc.clear_state_obj); |
|
- | 3986 | rdev->rlc.clear_state_obj = NULL; |
|
- | 3987 | } |
|
- | 3988 | ||
- | 3989 | /* clear state block */ |
|
- | 3990 | if (rdev->rlc.cp_table_obj) { |
|
- | 3991 | r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false); |
|
- | 3992 | if (unlikely(r != 0)) |
|
- | 3993 | dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r); |
|
- | 3994 | radeon_bo_unpin(rdev->rlc.cp_table_obj); |
|
- | 3995 | radeon_bo_unreserve(rdev->rlc.cp_table_obj); |
|
- | 3996 | ||
- | 3997 | radeon_bo_unref(&rdev->rlc.cp_table_obj); |
|
- | 3998 | rdev->rlc.cp_table_obj = NULL; |
|
- | 3999 | } |
|
- | 4000 | } |
|
- | 4001 | ||
- | 4002 | #define CP_ME_TABLE_SIZE 96 |
|
- | 4003 | ||
- | 4004 | int sumo_rlc_init(struct radeon_device *rdev) |
|
- | 4005 | { |
|
- | 4006 | const u32 *src_ptr; |
|
- | 4007 | volatile u32 *dst_ptr; |
|
- | 4008 | u32 dws, data, i, j, k, reg_num; |
|
- | 4009 | u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0; |
|
- | 4010 | u64 reg_list_mc_addr; |
|
- | 4011 | const struct cs_section_def *cs_data; |
|
- | 4012 | int r; |
|
- | 4013 | ||
- | 4014 | src_ptr = rdev->rlc.reg_list; |
|
- | 4015 | dws = rdev->rlc.reg_list_size; |
|
- | 4016 | if (rdev->family >= CHIP_BONAIRE) { |
|
- | 4017 | dws += (5 * 16) + 48 + 48 + 64; |
|
- | 4018 | } |
|
- | 4019 | cs_data = rdev->rlc.cs_data; |
|
- | 4020 | ||
- | 4021 | if (src_ptr) { |
|
- | 4022 | /* save restore block */ |
|
- | 4023 | if (rdev->rlc.save_restore_obj == NULL) { |
|
- | 4024 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, |
|
- | 4025 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
|
- | 4026 | &rdev->rlc.save_restore_obj); |
|
- | 4027 | if (r) { |
|
- | 4028 | dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); |
|
- | 4029 | return r; |
|
- | 4030 | } |
|
- | 4031 | } |
|
- | 4032 | ||
- | 4033 | r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); |
|
- | 4034 | if (unlikely(r != 0)) { |
|
- | 4035 | sumo_rlc_fini(rdev); |
|
- | 4036 | return r; |
|
- | 4037 | } |
|
- | 4038 | r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM, |
|
- | 4039 | &rdev->rlc.save_restore_gpu_addr); |
|
- | 4040 | if (r) { |
|
- | 4041 | radeon_bo_unreserve(rdev->rlc.save_restore_obj); |
|
- | 4042 | dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r); |
|
- | 4043 | sumo_rlc_fini(rdev); |
|
- | 4044 | return r; |
|
- | 4045 | } |
|
- | 4046 | ||
- | 4047 | r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr); |
|
- | 4048 | if (r) { |
|
- | 4049 | dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r); |
|
- | 4050 | sumo_rlc_fini(rdev); |
|
- | 4051 | return r; |
|
- | 4052 | } |
|
- | 4053 | /* write the sr buffer */ |
|
- | 4054 | dst_ptr = rdev->rlc.sr_ptr; |
|
- | 4055 | if (rdev->family >= CHIP_TAHITI) { |
|
- | 4056 | /* SI */ |
|
- | 4057 | for (i = 0; i < rdev->rlc.reg_list_size; i++) |
|
- | 4058 | dst_ptr[i] = cpu_to_le32(src_ptr[i]); |
|
- | 4059 | } else { |
|
- | 4060 | /* ON/LN/TN */ |
|
- | 4061 | /* format: |
|
- | 4062 | * dw0: (reg2 << 16) | reg1 |
|
- | 4063 | * dw1: reg1 save space |
|
- | 4064 | * dw2: reg2 save space |
|
- | 4065 | */ |
|
- | 4066 | for (i = 0; i < dws; i++) { |
|
- | 4067 | data = src_ptr[i] >> 2; |
|
- | 4068 | i++; |
|
- | 4069 | if (i < dws) |
|
- | 4070 | data |= (src_ptr[i] >> 2) << 16; |
|
- | 4071 | j = (((i - 1) * 3) / 2); |
|
- | 4072 | dst_ptr[j] = cpu_to_le32(data); |
|
- | 4073 | } |
|
- | 4074 | j = ((i * 3) / 2); |
|
- | 4075 | dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER); |
|
- | 4076 | } |
|
- | 4077 | radeon_bo_kunmap(rdev->rlc.save_restore_obj); |
|
- | 4078 | radeon_bo_unreserve(rdev->rlc.save_restore_obj); |
|
- | 4079 | } |
|
- | 4080 | ||
- | 4081 | if (cs_data) { |
|
- | 4082 | /* clear state block */ |
|
- | 4083 | if (rdev->family >= CHIP_BONAIRE) { |
|
- | 4084 | rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev); |
|
- | 4085 | } else if (rdev->family >= CHIP_TAHITI) { |
|
- | 4086 | rdev->rlc.clear_state_size = si_get_csb_size(rdev); |
|
- | 4087 | dws = rdev->rlc.clear_state_size + (256 / 4); |
|
- | 4088 | } else { |
|
- | 4089 | reg_list_num = 0; |
|
- | 4090 | dws = 0; |
|
- | 4091 | for (i = 0; cs_data[i].section != NULL; i++) { |
|
- | 4092 | for (j = 0; cs_data[i].section[j].extent != NULL; j++) { |
|
- | 4093 | reg_list_num++; |
|
- | 4094 | dws += cs_data[i].section[j].reg_count; |
|
- | 4095 | } |
|
- | 4096 | } |
|
- | 4097 | reg_list_blk_index = (3 * reg_list_num + 2); |
|
- | 4098 | dws += reg_list_blk_index; |
|
- | 4099 | rdev->rlc.clear_state_size = dws; |
|
- | 4100 | } |
|
- | 4101 | ||
- | 4102 | if (rdev->rlc.clear_state_obj == NULL) { |
|
- | 4103 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, |
|
- | 4104 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
|
- | 4105 | &rdev->rlc.clear_state_obj); |
|
- | 4106 | if (r) { |
|
- | 4107 | dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); |
|
- | 4108 | sumo_rlc_fini(rdev); |
|
- | 4109 | return r; |
|
- | 4110 | } |
|
- | 4111 | } |
|
- | 4112 | r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); |
|
- | 4113 | if (unlikely(r != 0)) { |
|
- | 4114 | sumo_rlc_fini(rdev); |
|
- | 4115 | return r; |
|
- | 4116 | } |
|
- | 4117 | r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM, |
|
- | 4118 | &rdev->rlc.clear_state_gpu_addr); |
|
- | 4119 | if (r) { |
|
- | 4120 | radeon_bo_unreserve(rdev->rlc.clear_state_obj); |
|
- | 4121 | dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r); |
|
- | 4122 | sumo_rlc_fini(rdev); |
|
- | 4123 | return r; |
|
- | 4124 | } |
|
- | 4125 | ||
- | 4126 | r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr); |
|
- | 4127 | if (r) { |
|
- | 4128 | dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r); |
|
- | 4129 | sumo_rlc_fini(rdev); |
|
- | 4130 | return r; |
|
- | 4131 | } |
|
- | 4132 | /* set up the cs buffer */ |
|
- | 4133 | dst_ptr = rdev->rlc.cs_ptr; |
|
- | 4134 | if (rdev->family >= CHIP_BONAIRE) { |
|
- | 4135 | cik_get_csb_buffer(rdev, dst_ptr); |
|
- | 4136 | } else if (rdev->family >= CHIP_TAHITI) { |
|
- | 4137 | reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256; |
|
- | 4138 | dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr)); |
|
- | 4139 | dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr)); |
|
- | 4140 | dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size); |
|
- | 4141 | si_get_csb_buffer(rdev, &dst_ptr[(256/4)]); |
|
- | 4142 | } else { |
|
- | 4143 | reg_list_hdr_blk_index = 0; |
|
- | 4144 | reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4); |
|
- | 4145 | data = upper_32_bits(reg_list_mc_addr); |
|
- | 4146 | dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); |
|
- | 4147 | reg_list_hdr_blk_index++; |
|
- | 4148 | for (i = 0; cs_data[i].section != NULL; i++) { |
|
- | 4149 | for (j = 0; cs_data[i].section[j].extent != NULL; j++) { |
|
- | 4150 | reg_num = cs_data[i].section[j].reg_count; |
|
- | 4151 | data = reg_list_mc_addr & 0xffffffff; |
|
- | 4152 | dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); |
|
- | 4153 | reg_list_hdr_blk_index++; |
|
- | 4154 | ||
- | 4155 | data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff; |
|
- | 4156 | dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); |
|
- | 4157 | reg_list_hdr_blk_index++; |
|
- | 4158 | ||
- | 4159 | data = 0x08000000 | (reg_num * 4); |
|
- | 4160 | dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data); |
|
- | 4161 | reg_list_hdr_blk_index++; |
|
- | 4162 | ||
- | 4163 | for (k = 0; k < reg_num; k++) { |
|
- | 4164 | data = cs_data[i].section[j].extent[k]; |
|
- | 4165 | dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data); |
|
- | 4166 | } |
|
- | 4167 | reg_list_mc_addr += reg_num * 4; |
|
- | 4168 | reg_list_blk_index += reg_num; |
|
- | 4169 | } |
|
- | 4170 | } |
|
- | 4171 | dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER); |
|
- | 4172 | } |
|
- | 4173 | radeon_bo_kunmap(rdev->rlc.clear_state_obj); |
|
- | 4174 | radeon_bo_unreserve(rdev->rlc.clear_state_obj); |
|
- | 4175 | } |
|
- | 4176 | ||
- | 4177 | if (rdev->rlc.cp_table_size) { |
|
- | 4178 | if (rdev->rlc.cp_table_obj == NULL) { |
|
- | 4179 | r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, |
|
- | 4180 | PAGE_SIZE, true, |
|
- | 4181 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
|
- | 4182 | &rdev->rlc.cp_table_obj); |
|
- | 4183 | if (r) { |
|
- | 4184 | dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r); |
|
- | 4185 | sumo_rlc_fini(rdev); |
|
- | 4186 | return r; |
|
- | 4187 | } |
|
- | 4188 | } |
|
- | 4189 | ||
- | 4190 | r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false); |
|
- | 4191 | if (unlikely(r != 0)) { |
|
- | 4192 | dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r); |
|
- | 4193 | sumo_rlc_fini(rdev); |
|
- | 4194 | return r; |
|
- | 4195 | } |
|
- | 4196 | r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM, |
|
- | 4197 | &rdev->rlc.cp_table_gpu_addr); |
|
- | 4198 | if (r) { |
|
- | 4199 | radeon_bo_unreserve(rdev->rlc.cp_table_obj); |
|
- | 4200 | dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r); |
|
- | 4201 | sumo_rlc_fini(rdev); |
|
- | 4202 | return r; |
|
- | 4203 | } |
|
- | 4204 | r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr); |
|
- | 4205 | if (r) { |
|
- | 4206 | dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r); |
|
- | 4207 | sumo_rlc_fini(rdev); |
|
- | 4208 | return r; |
|
- | 4209 | } |
|
- | 4210 | ||
- | 4211 | cik_init_cp_pg_table(rdev); |
|
- | 4212 | ||
- | 4213 | radeon_bo_kunmap(rdev->rlc.cp_table_obj); |
|
- | 4214 | radeon_bo_unreserve(rdev->rlc.cp_table_obj); |
|
- | 4215 | ||
- | 4216 | } |
|
- | 4217 | ||
- | 4218 | return 0; |
|
- | 4219 | } |
|
- | 4220 | ||
- | 4221 | static void evergreen_rlc_start(struct radeon_device *rdev) |
|
- | 4222 | { |
|
- | 4223 | u32 mask = RLC_ENABLE; |
|
- | 4224 | ||
- | 4225 | if (rdev->flags & RADEON_IS_IGP) { |
|
- | 4226 | mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC; |
|
- | 4227 | } |
|
- | 4228 | ||
- | 4229 | WREG32(RLC_CNTL, mask); |
|
- | 4230 | } |
|
- | 4231 | ||
- | 4232 | int evergreen_rlc_resume(struct radeon_device *rdev) |
|
- | 4233 | { |
|
- | 4234 | u32 i; |
|
- | 4235 | const __be32 *fw_data; |
|
- | 4236 | ||
- | 4237 | if (!rdev->rlc_fw) |
|
- | 4238 | return -EINVAL; |
|
- | 4239 | ||
- | 4240 | r600_rlc_stop(rdev); |
|
- | 4241 | ||
- | 4242 | WREG32(RLC_HB_CNTL, 0); |
|
- | 4243 | ||
- | 4244 | if (rdev->flags & RADEON_IS_IGP) { |
|
- | 4245 | if (rdev->family == CHIP_ARUBA) { |
|
- | 4246 | u32 always_on_bitmap = |
|
- | 4247 | 3 | (3 << (16 * rdev->config.cayman.max_shader_engines)); |
|
- | 4248 | /* find out the number of active simds */ |
|
- | 4249 | u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; |
|
- | 4250 | tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se; |
|
- | 4251 | tmp = hweight32(~tmp); |
|
- | 4252 | if (tmp == rdev->config.cayman.max_simds_per_se) { |
|
- | 4253 | WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap); |
|
- | 4254 | WREG32(TN_RLC_LB_PARAMS, 0x00601004); |
|
- | 4255 | WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff); |
|
- | 4256 | WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000); |
|
- | 4257 | WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000); |
|
- | 4258 | } |
|
- | 4259 | } else { |
|
- | 4260 | WREG32(RLC_HB_WPTR_LSB_ADDR, 0); |
|
- | 4261 | WREG32(RLC_HB_WPTR_MSB_ADDR, 0); |
|
- | 4262 | } |
|
- | 4263 | WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); |
|
- | 4264 | WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); |
|
- | 4265 | } else { |
|
- | 4266 | WREG32(RLC_HB_BASE, 0); |
|
- | 4267 | WREG32(RLC_HB_RPTR, 0); |
|
- | 4268 | WREG32(RLC_HB_WPTR, 0); |
|
- | 4269 | WREG32(RLC_HB_WPTR_LSB_ADDR, 0); |
|
- | 4270 | WREG32(RLC_HB_WPTR_MSB_ADDR, 0); |
|
- | 4271 | } |
|
- | 4272 | WREG32(RLC_MC_CNTL, 0); |
|
- | 4273 | WREG32(RLC_UCODE_CNTL, 0); |
|
- | 4274 | ||
- | 4275 | fw_data = (const __be32 *)rdev->rlc_fw->data; |
|
- | 4276 | if (rdev->family >= CHIP_ARUBA) { |
|
- | 4277 | for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) { |
|
- | 4278 | WREG32(RLC_UCODE_ADDR, i); |
|
- | 4279 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
|
- | 4280 | } |
|
- | 4281 | } else if (rdev->family >= CHIP_CAYMAN) { |
|
- | 4282 | for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) { |
|
- | 4283 | WREG32(RLC_UCODE_ADDR, i); |
|
- | 4284 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
|
- | 4285 | } |
|
- | 4286 | } else { |
|
- | 4287 | for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) { |
|
- | 4288 | WREG32(RLC_UCODE_ADDR, i); |
|
- | 4289 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
|
- | 4290 | } |
|
3695 | } |
4291 | } |
- | 4292 | WREG32(RLC_UCODE_ADDR, 0); |
|
- | 4293 | ||
3696 | /* force ring activities */ |
4294 | evergreen_rlc_start(rdev); |
Line 3697... | Line 4295... | ||
3697 | radeon_ring_force_activity(rdev, ring); |
4295 | |
Line 3698... | Line 4296... | ||
3698 | return radeon_ring_test_lockup(rdev, ring); |
4296 | return 0; |
Line 3744... | Line 4342... | ||
3744 | if (rdev->num_crtc >= 6) { |
4342 | if (rdev->num_crtc >= 6) { |
3745 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
4343 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
3746 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
4344 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
3747 | } |
4345 | } |
Line 3748... | Line 4346... | ||
3748 | 4346 | ||
3749 | /* only one DAC on DCE6 */ |
4347 | /* only one DAC on DCE5 */ |
3750 | if (!ASIC_IS_DCE6(rdev)) |
4348 | if (!ASIC_IS_DCE5(rdev)) |
3751 | WREG32(DACA_AUTODETECT_INT_CONTROL, 0); |
4349 | WREG32(DACA_AUTODETECT_INT_CONTROL, 0); |
Line 3752... | Line 4350... | ||
3752 | WREG32(DACB_AUTODETECT_INT_CONTROL, 0); |
4350 | WREG32(DACB_AUTODETECT_INT_CONTROL, 0); |
3753 | 4351 | ||
Line 3771... | Line 4369... | ||
3771 | u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; |
4369 | u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; |
3772 | u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0; |
4370 | u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0; |
3773 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
4371 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
3774 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; |
4372 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; |
3775 | u32 grbm_int_cntl = 0; |
4373 | u32 grbm_int_cntl = 0; |
3776 | u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; |
- | |
3777 | u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0; |
4374 | u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0; |
3778 | u32 dma_cntl, dma_cntl1 = 0; |
4375 | u32 dma_cntl, dma_cntl1 = 0; |
- | 4376 | u32 thermal_int = 0; |
|
Line 3779... | Line 4377... | ||
3779 | 4377 | ||
3780 | if (!rdev->irq.installed) { |
4378 | if (!rdev->irq.installed) { |
3781 | WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); |
4379 | WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); |
3782 | return -EINVAL; |
4380 | return -EINVAL; |
Line 3793... | Line 4391... | ||
3793 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; |
4391 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3794 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; |
4392 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3795 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN; |
4393 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3796 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; |
4394 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3797 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; |
4395 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; |
- | 4396 | if (rdev->family == CHIP_ARUBA) |
|
- | 4397 | thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) & |
|
- | 4398 | ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); |
|
- | 4399 | else |
|
- | 4400 | thermal_int = RREG32(CG_THERMAL_INT) & |
|
- | 4401 | ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); |
|
Line 3798... | Line 4402... | ||
3798 | 4402 | ||
3799 | afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
4403 | afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
3800 | afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
4404 | afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
3801 | afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
4405 | afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
Line 3838... | Line 4442... | ||
3838 | DRM_DEBUG("r600_irq_set: sw int dma1\n"); |
4442 | DRM_DEBUG("r600_irq_set: sw int dma1\n"); |
3839 | dma_cntl1 |= TRAP_ENABLE; |
4443 | dma_cntl1 |= TRAP_ENABLE; |
3840 | } |
4444 | } |
3841 | } |
4445 | } |
Line -... | Line 4446... | ||
- | 4446 | ||
- | 4447 | if (rdev->irq.dpm_thermal) { |
|
- | 4448 | DRM_DEBUG("dpm thermal\n"); |
|
- | 4449 | thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; |
|
- | 4450 | } |
|
3842 | 4451 | ||
3843 | if (rdev->irq.crtc_vblank_int[0] || |
4452 | if (rdev->irq.crtc_vblank_int[0] || |
3844 | atomic_read(&rdev->irq.pflip[0])) { |
4453 | atomic_read(&rdev->irq.pflip[0])) { |
3845 | DRM_DEBUG("evergreen_irq_set: vblank 0\n"); |
4454 | DRM_DEBUG("evergreen_irq_set: vblank 0\n"); |
3846 | crtc1 |= VBLANK_INT_MASK; |
4455 | crtc1 |= VBLANK_INT_MASK; |
Line 3942... | Line 4551... | ||
3942 | if (rdev->num_crtc >= 6) { |
4551 | if (rdev->num_crtc >= 6) { |
3943 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5); |
4552 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5); |
3944 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
4553 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
3945 | } |
4554 | } |
Line 3946... | Line 4555... | ||
3946 | 4555 | ||
- | 4556 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
|
3947 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); |
4557 | GRPH_PFLIP_INT_MASK); |
- | 4558 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, |
|
3948 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); |
4559 | GRPH_PFLIP_INT_MASK); |
3949 | if (rdev->num_crtc >= 4) { |
4560 | if (rdev->num_crtc >= 4) { |
- | 4561 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
|
3950 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); |
4562 | GRPH_PFLIP_INT_MASK); |
- | 4563 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, |
|
3951 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); |
4564 | GRPH_PFLIP_INT_MASK); |
3952 | } |
4565 | } |
3953 | if (rdev->num_crtc >= 6) { |
4566 | if (rdev->num_crtc >= 6) { |
- | 4567 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
|
3954 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); |
4568 | GRPH_PFLIP_INT_MASK); |
- | 4569 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
|
3955 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); |
4570 | GRPH_PFLIP_INT_MASK); |
Line 3956... | Line 4571... | ||
3956 | } |
4571 | } |
3957 | 4572 | ||
3958 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
4573 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
3959 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
4574 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
3960 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
4575 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
3961 | WREG32(DC_HPD4_INT_CONTROL, hpd4); |
4576 | WREG32(DC_HPD4_INT_CONTROL, hpd4); |
- | 4577 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
|
- | 4578 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
|
- | 4579 | if (rdev->family == CHIP_ARUBA) |
|
- | 4580 | WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int); |
|
Line 3962... | Line 4581... | ||
3962 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
4581 | else |
3963 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
4582 | WREG32(CG_THERMAL_INT, thermal_int); |
3964 | 4583 | ||
3965 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1); |
4584 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1); |
Line 4138... | Line 4757... | ||
4138 | wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask); |
4757 | wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask); |
4139 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
4758 | rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask; |
4140 | tmp = RREG32(IH_RB_CNTL); |
4759 | tmp = RREG32(IH_RB_CNTL); |
4141 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
4760 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
4142 | WREG32(IH_RB_CNTL, tmp); |
4761 | WREG32(IH_RB_CNTL, tmp); |
- | 4762 | wptr &= ~RB_OVERFLOW; |
|
4143 | } |
4763 | } |
4144 | return (wptr & rdev->ih.ptr_mask); |
4764 | return (wptr & rdev->ih.ptr_mask); |
4145 | } |
4765 | } |
Line 4146... | Line 4766... | ||
4146 | 4766 | ||
Line 4150... | Line 4770... | ||
4150 | u32 rptr; |
4770 | u32 rptr; |
4151 | u32 src_id, src_data; |
4771 | u32 src_id, src_data; |
4152 | u32 ring_index; |
4772 | u32 ring_index; |
4153 | bool queue_hotplug = false; |
4773 | bool queue_hotplug = false; |
4154 | bool queue_hdmi = false; |
4774 | bool queue_hdmi = false; |
- | 4775 | bool queue_thermal = false; |
|
- | 4776 | u32 status, addr; |
|
Line 4155... | Line 4777... | ||
4155 | 4777 | ||
4156 | if (!rdev->ih.enabled || rdev->shutdown) |
4778 | if (!rdev->ih.enabled || rdev->shutdown) |
Line 4157... | Line 4779... | ||
4157 | return IRQ_NONE; |
4779 | return IRQ_NONE; |
Line 4333... | Line 4955... | ||
4333 | default: |
4955 | default: |
4334 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
4956 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
4335 | break; |
4957 | break; |
4336 | } |
4958 | } |
4337 | break; |
4959 | break; |
- | 4960 | case 8: /* D1 page flip */ |
|
- | 4961 | case 10: /* D2 page flip */ |
|
- | 4962 | case 12: /* D3 page flip */ |
|
- | 4963 | case 14: /* D4 page flip */ |
|
- | 4964 | case 16: /* D5 page flip */ |
|
- | 4965 | case 18: /* D6 page flip */ |
|
- | 4966 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
|
- | 4967 | break; |
|
4338 | case 42: /* HPD hotplug */ |
4968 | case 42: /* HPD hotplug */ |
4339 | switch (src_data) { |
4969 | switch (src_data) { |
4340 | case 0: |
4970 | case 0: |
4341 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { |
4971 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { |
4342 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
4972 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
Line 4436... | Line 5066... | ||
4436 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
5066 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
4437 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
5067 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
4438 | break; |
5068 | break; |
4439 | case 146: |
5069 | case 146: |
4440 | case 147: |
5070 | case 147: |
- | 5071 | addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR); |
|
- | 5072 | status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS); |
|
- | 5073 | /* reset addr and status */ |
|
- | 5074 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); |
|
- | 5075 | if (addr == 0x0 && status == 0x0) |
|
- | 5076 | break; |
|
4441 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); |
5077 | dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); |
4442 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
5078 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", |
4443 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); |
5079 | addr); |
4444 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
5080 | dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", |
4445 | RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); |
- | |
4446 | /* reset addr and status */ |
5081 | status); |
4447 | WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); |
5082 | cayman_vm_decode_fault(rdev, status, addr); |
4448 | break; |
5083 | break; |
4449 | case 176: /* CP_INT in ring buffer */ |
5084 | case 176: /* CP_INT in ring buffer */ |
4450 | case 177: /* CP_INT in IB1 */ |
5085 | case 177: /* CP_INT in IB1 */ |
4451 | case 178: /* CP_INT in IB2 */ |
5086 | case 178: /* CP_INT in IB2 */ |
4452 | DRM_DEBUG("IH: CP int: 0x%08x\n", src_data); |
5087 | DRM_DEBUG("IH: CP int: 0x%08x\n", src_data); |
Line 4471... | Line 5106... | ||
4471 | break; |
5106 | break; |
4472 | case 224: /* DMA trap event */ |
5107 | case 224: /* DMA trap event */ |
4473 | DRM_DEBUG("IH: DMA trap\n"); |
5108 | DRM_DEBUG("IH: DMA trap\n"); |
4474 | radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX); |
5109 | radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX); |
4475 | break; |
5110 | break; |
- | 5111 | case 230: /* thermal low to high */ |
|
- | 5112 | DRM_DEBUG("IH: thermal low to high\n"); |
|
- | 5113 | rdev->pm.dpm.thermal.high_to_low = false; |
|
- | 5114 | queue_thermal = true; |
|
- | 5115 | break; |
|
- | 5116 | case 231: /* thermal high to low */ |
|
- | 5117 | DRM_DEBUG("IH: thermal high to low\n"); |
|
- | 5118 | rdev->pm.dpm.thermal.high_to_low = true; |
|
- | 5119 | queue_thermal = true; |
|
- | 5120 | break; |
|
4476 | case 233: /* GUI IDLE */ |
5121 | case 233: /* GUI IDLE */ |
4477 | DRM_DEBUG("IH: GUI idle\n"); |
5122 | DRM_DEBUG("IH: GUI idle\n"); |
4478 | break; |
5123 | break; |
4479 | case 244: /* DMA trap event */ |
5124 | case 244: /* DMA trap event */ |
4480 | if (rdev->family >= CHIP_CAYMAN) { |
5125 | if (rdev->family >= CHIP_CAYMAN) { |
Line 4501... | Line 5146... | ||
4501 | goto restart_ih; |
5146 | goto restart_ih; |
Line 4502... | Line 5147... | ||
4502 | 5147 | ||
4503 | return IRQ_HANDLED; |
5148 | return IRQ_HANDLED; |
Line 4504... | Line -... | ||
4504 | } |
- | |
4505 | - | ||
4506 | /** |
- | |
4507 | * evergreen_dma_fence_ring_emit - emit a fence on the DMA ring |
- | |
4508 | * |
- | |
4509 | * @rdev: radeon_device pointer |
- | |
4510 | * @fence: radeon fence object |
- | |
4511 | * |
- | |
4512 | * Add a DMA fence packet to the ring to write |
- | |
4513 | * the fence seq number and DMA trap packet to generate |
- | |
4514 | * an interrupt if needed (evergreen-SI). |
- | |
4515 | */ |
- | |
4516 | void evergreen_dma_fence_ring_emit(struct radeon_device *rdev, |
- | |
4517 | struct radeon_fence *fence) |
- | |
4518 | { |
- | |
4519 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
- | |
4520 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; |
- | |
4521 | /* write the fence */ |
- | |
4522 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0)); |
- | |
4523 | radeon_ring_write(ring, addr & 0xfffffffc); |
- | |
4524 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff)); |
- | |
4525 | radeon_ring_write(ring, fence->seq); |
- | |
4526 | /* generate an interrupt */ |
- | |
4527 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0)); |
- | |
4528 | /* flush HDP */ |
- | |
4529 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0)); |
- | |
4530 | radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2)); |
- | |
4531 | radeon_ring_write(ring, 1); |
- | |
4532 | } |
- | |
4533 | - | ||
4534 | /** |
- | |
4535 | * evergreen_dma_ring_ib_execute - schedule an IB on the DMA engine |
- | |
4536 | * |
- | |
4537 | * @rdev: radeon_device pointer |
- | |
4538 | * @ib: IB object to schedule |
- | |
4539 | * |
- | |
4540 | * Schedule an IB in the DMA ring (evergreen). |
- | |
4541 | */ |
- | |
4542 | void evergreen_dma_ring_ib_execute(struct radeon_device *rdev, |
- | |
4543 | struct radeon_ib *ib) |
- | |
4544 | { |
- | |
4545 | struct radeon_ring *ring = &rdev->ring[ib->ring]; |
- | |
4546 | - | ||
4547 | if (rdev->wb.enabled) { |
- | |
4548 | u32 next_rptr = ring->wptr + 4; |
- | |
4549 | while ((next_rptr & 7) != 5) |
- | |
4550 | next_rptr++; |
- | |
4551 | next_rptr += 3; |
- | |
4552 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 1)); |
- | |
4553 | radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); |
- | |
4554 | radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff); |
- | |
4555 | radeon_ring_write(ring, next_rptr); |
- | |
4556 | } |
- | |
4557 | - | ||
4558 | /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring. |
- | |
4559 | * Pad as necessary with NOPs. |
- | |
4560 | */ |
- | |
4561 | while ((ring->wptr & 7) != 5) |
- | |
4562 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0)); |
- | |
4563 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0)); |
- | |
4564 | radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0)); |
- | |
4565 | radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF)); |
- | |
4566 | - | ||
4567 | } |
- | |
4568 | - | ||
4569 | /** |
- | |
4570 | * evergreen_copy_dma - copy pages using the DMA engine |
- | |
4571 | * |
- | |
4572 | * @rdev: radeon_device pointer |
- | |
4573 | * @src_offset: src GPU address |
- | |
4574 | * @dst_offset: dst GPU address |
- | |
4575 | * @num_gpu_pages: number of GPU pages to xfer |
- | |
4576 | * @fence: radeon fence object |
- | |
4577 | * |
- | |
4578 | * Copy GPU paging using the DMA engine (evergreen-cayman). |
- | |
4579 | * Used by the radeon ttm implementation to move pages if |
- | |
4580 | * registered as the asic copy callback. |
- | |
4581 | */ |
- | |
4582 | int evergreen_copy_dma(struct radeon_device *rdev, |
- | |
4583 | uint64_t src_offset, uint64_t dst_offset, |
- | |
4584 | unsigned num_gpu_pages, |
- | |
4585 | struct radeon_fence **fence) |
- | |
4586 | { |
- | |
4587 | struct radeon_semaphore *sem = NULL; |
- | |
4588 | int ring_index = rdev->asic->copy.dma_ring_index; |
- | |
4589 | struct radeon_ring *ring = &rdev->ring[ring_index]; |
- | |
4590 | u32 size_in_dw, cur_size_in_dw; |
- | |
4591 | int i, num_loops; |
- | |
4592 | int r = 0; |
- | |
4593 | - | ||
4594 | r = radeon_semaphore_create(rdev, &sem); |
- | |
4595 | if (r) { |
- | |
4596 | DRM_ERROR("radeon: moving bo (%d).\n", r); |
- | |
4597 | return r; |
- | |
4598 | } |
- | |
4599 | - | ||
4600 | size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4; |
- | |
4601 | num_loops = DIV_ROUND_UP(size_in_dw, 0xfffff); |
- | |
4602 | r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11); |
- | |
4603 | if (r) { |
- | |
4604 | DRM_ERROR("radeon: moving bo (%d).\n", r); |
- | |
4605 | radeon_semaphore_free(rdev, &sem, NULL); |
- | |
4606 | return r; |
- | |
4607 | } |
- | |
4608 | - | ||
4609 | if (radeon_fence_need_sync(*fence, ring->idx)) { |
- | |
4610 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, |
- | |
4611 | ring->idx); |
- | |
4612 | radeon_fence_note_sync(*fence, ring->idx); |
- | |
4613 | } else { |
- | |
4614 | radeon_semaphore_free(rdev, &sem, NULL); |
- | |
4615 | } |
- | |
4616 | - | ||
4617 | for (i = 0; i < num_loops; i++) { |
- | |
4618 | cur_size_in_dw = size_in_dw; |
- | |
4619 | if (cur_size_in_dw > 0xFFFFF) |
- | |
4620 | cur_size_in_dw = 0xFFFFF; |
- | |
4621 | size_in_dw -= cur_size_in_dw; |
- | |
4622 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, cur_size_in_dw)); |
- | |
4623 | radeon_ring_write(ring, dst_offset & 0xfffffffc); |
- | |
4624 | radeon_ring_write(ring, src_offset & 0xfffffffc); |
- | |
4625 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); |
- | |
4626 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff); |
- | |
4627 | src_offset += cur_size_in_dw * 4; |
- | |
4628 | dst_offset += cur_size_in_dw * 4; |
- | |
4629 | } |
- | |
4630 | - | ||
4631 | r = radeon_fence_emit(rdev, fence, ring->idx); |
- | |
4632 | if (r) { |
- | |
4633 | radeon_ring_unlock_undo(rdev, ring); |
- | |
4634 | return r; |
- | |
4635 | } |
- | |
4636 | - | ||
4637 | radeon_ring_unlock_commit(rdev, ring); |
- | |
4638 | radeon_semaphore_free(rdev, &sem, *fence); |
- | |
4639 | - | ||
4640 | return r; |
- | |
4641 | } |
5149 | } |
4642 | 5150 | ||
4643 | static int evergreen_startup(struct radeon_device *rdev) |
5151 | static int evergreen_startup(struct radeon_device *rdev) |
4644 | { |
5152 | { |
Line 4645... | Line 5153... | ||
4645 | struct radeon_ring *ring; |
5153 | struct radeon_ring *ring; |
4646 | int r; |
5154 | int r; |
- | 5155 | ||
- | 5156 | /* enable pcie gen2 link */ |
|
Line 4647... | Line -... | ||
4647 | - | ||
4648 | /* enable pcie gen2 link */ |
5157 | evergreen_pcie_gen2_enable(rdev); |
4649 | evergreen_pcie_gen2_enable(rdev); |
5158 | /* enable aspm */ |
4650 | 5159 | evergreen_program_aspm(rdev); |
|
4651 | if (ASIC_IS_DCE5(rdev)) { |
- | |
4652 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { |
5160 | |
4653 | r = ni_init_microcode(rdev); |
5161 | /* scratch needs to be initialized before MC */ |
- | 5162 | r = r600_vram_scratch_init(rdev); |
|
4654 | if (r) { |
5163 | if (r) |
- | 5164 | return r; |
|
4655 | DRM_ERROR("Failed to load firmware!\n"); |
5165 | |
4656 | return r; |
5166 | evergreen_mc_program(rdev); |
4657 | } |
5167 | |
4658 | } |
5168 | if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) { |
4659 | r = ni_mc_load_microcode(rdev); |
5169 | r = ni_mc_load_microcode(rdev); |
4660 | if (r) { |
- | |
4661 | DRM_ERROR("Failed to load MC firmware!\n"); |
- | |
4662 | return r; |
- | |
4663 | } |
- | |
4664 | } else { |
- | |
4665 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { |
- | |
4666 | r = r600_init_microcode(rdev); |
- | |
4667 | if (r) { |
- | |
4668 | DRM_ERROR("Failed to load firmware!\n"); |
5170 | if (r) { |
Line 4669... | Line -... | ||
4669 | return r; |
- | |
4670 | } |
- | |
4671 | } |
- | |
4672 | } |
- | |
4673 | - | ||
4674 | r = r600_vram_scratch_init(rdev); |
5171 | DRM_ERROR("Failed to load MC firmware!\n"); |
4675 | if (r) |
5172 | return r; |
4676 | return r; |
5173 | } |
4677 | 5174 | } |
|
4678 | evergreen_mc_program(rdev); |
5175 | |
4679 | if (rdev->flags & RADEON_IS_AGP) { |
5176 | if (rdev->flags & RADEON_IS_AGP) { |
4680 | evergreen_agp_enable(rdev); |
5177 | evergreen_agp_enable(rdev); |
4681 | } else { |
5178 | } else { |
Line -... | Line 5179... | ||
- | 5179 | r = evergreen_pcie_gart_enable(rdev); |
|
- | 5180 | if (r) |
|
- | 5181 | return r; |
|
- | 5182 | } |
|
- | 5183 | evergreen_gpu_init(rdev); |
|
- | 5184 | ||
4682 | r = evergreen_pcie_gart_enable(rdev); |
5185 | /* allocate rlc buffers */ |
4683 | if (r) |
5186 | if (rdev->flags & RADEON_IS_IGP) { |
4684 | return r; |
5187 | rdev->rlc.reg_list = sumo_rlc_save_restore_register_list; |
4685 | } |
5188 | rdev->rlc.reg_list_size = |
4686 | evergreen_gpu_init(rdev); |
- | |
- | 5189 | (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list); |
|
4687 | 5190 | rdev->rlc.cs_data = evergreen_cs_data; |
|
Line 4688... | Line 5191... | ||
4688 | r = evergreen_blit_init(rdev); |
5191 | r = sumo_rlc_init(rdev); |
4689 | if (r) { |
5192 | if (r) { |
4690 | // r600_blit_fini(rdev); |
5193 | DRM_ERROR("Failed to init rlc BOs!\n"); |
Line 4715... | Line 5218... | ||
4715 | // R600_RING_TYPE_UVD_INDEX); |
5218 | // R600_RING_TYPE_UVD_INDEX); |
4716 | // if (r) |
5219 | // if (r) |
4717 | // dev_err(rdev->dev, "UVD fences init error (%d).\n", r); |
5220 | // dev_err(rdev->dev, "UVD fences init error (%d).\n", r); |
4718 | // } |
5221 | // } |
Line 4719... | Line 5222... | ||
4719 | 5222 | ||
4720 | // if (r) |
5223 | if (r) |
Line 4721... | Line 5224... | ||
4721 | // rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
5224 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
4722 | 5225 | ||
4723 | /* Enable IRQ */ |
5226 | /* Enable IRQ */ |
4724 | if (!rdev->irq.installed) { |
5227 | if (!rdev->irq.installed) { |
Line 4735... | Line 5238... | ||
4735 | } |
5238 | } |
4736 | evergreen_irq_set(rdev); |
5239 | evergreen_irq_set(rdev); |
Line 4737... | Line 5240... | ||
4737 | 5240 | ||
4738 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
5241 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
4739 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
- | |
4740 | R600_CP_RB_RPTR, R600_CP_RB_WPTR, |
5242 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
4741 | 0, 0xfffff, RADEON_CP_PACKET2); |
5243 | RADEON_CP_PACKET2); |
4742 | if (r) |
5244 | if (r) |
Line 4743... | Line 5245... | ||
4743 | return r; |
5245 | return r; |
4744 | 5246 | ||
4745 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
- | |
4746 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
5247 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
4747 | DMA_RB_RPTR, DMA_RB_WPTR, |
5248 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
4748 | 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0)); |
5249 | DMA_PACKET(DMA_PACKET_NOP, 0, 0)); |
Line 4749... | Line 5250... | ||
4749 | if (r) |
5250 | if (r) |
4750 | return r; |
5251 | return r; |
Line 4757... | Line 5258... | ||
4757 | return r; |
5258 | return r; |
4758 | r = r600_dma_resume(rdev); |
5259 | r = r600_dma_resume(rdev); |
4759 | if (r) |
5260 | if (r) |
4760 | return r; |
5261 | return r; |
Line 4761... | Line -... | ||
4761 | - | ||
4762 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
- | |
4763 | if (ring->ring_size) { |
- | |
4764 | r = radeon_ring_init(rdev, ring, ring->ring_size, |
- | |
4765 | R600_WB_UVD_RPTR_OFFSET, |
- | |
4766 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, |
- | |
4767 | 0, 0xfffff, RADEON_CP_PACKET2); |
- | |
4768 | if (!r) |
- | |
4769 | r = r600_uvd_init(rdev); |
- | |
4770 | - | ||
4771 | if (r) |
- | |
4772 | DRM_ERROR("radeon: error initializing UVD (%d).\n", r); |
- | |
Line 4773... | Line 5262... | ||
4773 | } |
5262 | |
4774 | 5263 | ||
4775 | r = radeon_ib_pool_init(rdev); |
5264 | r = radeon_ib_pool_init(rdev); |
4776 | if (r) { |
5265 | if (r) { |
Line 4781... | Line 5270... | ||
4781 | return 0; |
5270 | return 0; |
4782 | } |
5271 | } |
Line 4783... | Line -... | ||
4783 | - | ||
4784 | - | ||
4785 | - | ||
4786 | #if 0 |
- | |
4787 | - | ||
4788 | int evergreen_copy_blit(struct radeon_device *rdev, |
- | |
4789 | uint64_t src_offset, uint64_t dst_offset, |
- | |
4790 | unsigned num_pages, struct radeon_fence *fence) |
- | |
4791 | { |
- | |
4792 | int r; |
- | |
4793 | - | ||
4794 | mutex_lock(&rdev->r600_blit.mutex); |
- | |
4795 | rdev->r600_blit.vb_ib = NULL; |
- | |
4796 | r = evergreen_blit_prepare_copy(rdev, num_pages * RADEON_GPU_PAGE_SIZE); |
- | |
4797 | if (r) { |
- | |
4798 | if (rdev->r600_blit.vb_ib) |
- | |
4799 | radeon_ib_free(rdev, &rdev->r600_blit.vb_ib); |
- | |
4800 | mutex_unlock(&rdev->r600_blit.mutex); |
- | |
4801 | return r; |
- | |
4802 | } |
- | |
4803 | evergreen_kms_blit_copy(rdev, src_offset, dst_offset, num_pages * RADEON_GPU_PAGE_SIZE); |
- | |
4804 | evergreen_blit_done_copy(rdev, fence); |
- | |
4805 | mutex_unlock(&rdev->r600_blit.mutex); |
- | |
Line 4806... | Line 5272... | ||
4806 | return 0; |
5272 | |
4807 | } |
5273 | |
4808 | #endif |
5274 | |
4809 | 5275 | ||
Line 4869... | Line 5335... | ||
4869 | /* Memory manager */ |
5335 | /* Memory manager */ |
4870 | r = radeon_bo_init(rdev); |
5336 | r = radeon_bo_init(rdev); |
4871 | if (r) |
5337 | if (r) |
4872 | return r; |
5338 | return r; |
Line -... | Line 5339... | ||
- | 5339 | ||
- | 5340 | if (ASIC_IS_DCE5(rdev)) { |
|
- | 5341 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { |
|
- | 5342 | r = ni_init_microcode(rdev); |
|
- | 5343 | if (r) { |
|
- | 5344 | DRM_ERROR("Failed to load firmware!\n"); |
|
- | 5345 | return r; |
|
- | 5346 | } |
|
- | 5347 | } |
|
- | 5348 | } else { |
|
- | 5349 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { |
|
- | 5350 | r = r600_init_microcode(rdev); |
|
- | 5351 | if (r) { |
|
- | 5352 | DRM_ERROR("Failed to load firmware!\n"); |
|
- | 5353 | return r; |
|
- | 5354 | } |
|
- | 5355 | } |
|
- | 5356 | } |
|
- | 5357 | ||
- | 5358 | /* Initialize power management */ |
|
- | 5359 | radeon_pm_init(rdev); |
|
4873 | 5360 | ||
4874 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
5361 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
Line 4875... | Line 5362... | ||
4875 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
5362 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
4876 | 5363 | ||
Line 4973... | Line 5460... | ||
4973 | else |
5460 | else |
4974 | link_width_cntl &= ~LC_UPCONFIGURE_DIS; |
5461 | link_width_cntl &= ~LC_UPCONFIGURE_DIS; |
4975 | WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); |
5462 | WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); |
4976 | } |
5463 | } |
4977 | }>><>><>><>><>><>>>><>>>>=>><>>><>>=><=>><>=>><>><>><>><>><>><>><>><>><>><>>><>><>><>>>>><>><>><>><>><>><>><>>>>>>>>>>>>>>>=>=>= |
5464 | } |
- | 5465 | ||
- | 5466 | void evergreen_program_aspm(struct radeon_device *rdev) |
|
- | 5467 | { |
|
- | 5468 | u32 data, orig; |
|
- | 5469 | u32 pcie_lc_cntl, pcie_lc_cntl_old; |
|
- | 5470 | bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false; |
|
- | 5471 | /* fusion_platform = true |
|
- | 5472 | * if the system is a fusion system |
|
- | 5473 | * (APU or DGPU in a fusion system). |
|
- | 5474 | * todo: check if the system is a fusion platform. |
|
- | 5475 | */ |
|
- | 5476 | bool fusion_platform = false; |
|
- | 5477 | ||
- | 5478 | if (radeon_aspm == 0) |
|
- | 5479 | return; |
|
- | 5480 | ||
- | 5481 | if (!(rdev->flags & RADEON_IS_PCIE)) |
|
- | 5482 | return; |
|
- | 5483 | ||
- | 5484 | switch (rdev->family) { |
|
- | 5485 | case CHIP_CYPRESS: |
|
- | 5486 | case CHIP_HEMLOCK: |
|
- | 5487 | case CHIP_JUNIPER: |
|
- | 5488 | case CHIP_REDWOOD: |
|
- | 5489 | case CHIP_CEDAR: |
|
- | 5490 | case CHIP_SUMO: |
|
- | 5491 | case CHIP_SUMO2: |
|
- | 5492 | case CHIP_PALM: |
|
- | 5493 | case CHIP_ARUBA: |
|
- | 5494 | disable_l0s = true; |
|
- | 5495 | break; |
|
- | 5496 | default: |
|
- | 5497 | disable_l0s = false; |
|
- | 5498 | break; |
|
- | 5499 | } |
|
- | 5500 | ||
- | 5501 | if (rdev->flags & RADEON_IS_IGP) |
|
- | 5502 | fusion_platform = true; /* XXX also dGPUs in a fusion system */ |
|
- | 5503 | ||
- | 5504 | data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING); |
|
- | 5505 | if (fusion_platform) |
|
- | 5506 | data &= ~MULTI_PIF; |
|
- | 5507 | else |
|
- | 5508 | data |= MULTI_PIF; |
|
- | 5509 | if (data != orig) |
|
- | 5510 | WREG32_PIF_PHY0(PB0_PIF_PAIRING, data); |
|
- | 5511 | ||
- | 5512 | data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING); |
|
- | 5513 | if (fusion_platform) |
|
- | 5514 | data &= ~MULTI_PIF; |
|
- | 5515 | else |
|
- | 5516 | data |= MULTI_PIF; |
|
- | 5517 | if (data != orig) |
|
- | 5518 | WREG32_PIF_PHY1(PB1_PIF_PAIRING, data); |
|
- | 5519 | ||
- | 5520 | pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL); |
|
- | 5521 | pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK); |
|
- | 5522 | if (!disable_l0s) { |
|
- | 5523 | if (rdev->family >= CHIP_BARTS) |
|
- | 5524 | pcie_lc_cntl |= LC_L0S_INACTIVITY(7); |
|
- | 5525 | else |
|
- | 5526 | pcie_lc_cntl |= LC_L0S_INACTIVITY(3); |
|
- | 5527 | } |
|
- | 5528 | ||
- | 5529 | if (!disable_l1) { |
|
- | 5530 | if (rdev->family >= CHIP_BARTS) |
|
- | 5531 | pcie_lc_cntl |= LC_L1_INACTIVITY(7); |
|
- | 5532 | else |
|
- | 5533 | pcie_lc_cntl |= LC_L1_INACTIVITY(8); |
|
- | 5534 | ||
- | 5535 | if (!disable_plloff_in_l1) { |
|
- | 5536 | data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0); |
|
- | 5537 | data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); |
|
- | 5538 | data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); |
|
- | 5539 | if (data != orig) |
|
- | 5540 | WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data); |
|
- | 5541 | ||
- | 5542 | data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1); |
|
- | 5543 | data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); |
|
- | 5544 | data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); |
|
- | 5545 | if (data != orig) |
|
- | 5546 | WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data); |
|
- | 5547 | ||
- | 5548 | data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0); |
|
- | 5549 | data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK); |
|
- | 5550 | data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7); |
|
- | 5551 | if (data != orig) |
|
- | 5552 | WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data); |
|
- | 5553 | ||
- | 5554 | data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1); |
|
- | 5555 | data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK); |
|
- | 5556 | data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7); |
|
- | 5557 | if (data != orig) |
|
- | 5558 | WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data); |
|
- | 5559 | ||
- | 5560 | if (rdev->family >= CHIP_BARTS) { |
|
- | 5561 | data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0); |
|
- | 5562 | data &= ~PLL_RAMP_UP_TIME_0_MASK; |
|
- | 5563 | data |= PLL_RAMP_UP_TIME_0(4); |
|
- | 5564 | if (data != orig) |
|
- | 5565 | WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data); |
|
- | 5566 | ||
- | 5567 | data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1); |
|
- | 5568 | data &= ~PLL_RAMP_UP_TIME_1_MASK; |
|
- | 5569 | data |= PLL_RAMP_UP_TIME_1(4); |
|
- | 5570 | if (data != orig) |
|
- | 5571 | WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data); |
|
- | 5572 | ||
- | 5573 | data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0); |
|
- | 5574 | data &= ~PLL_RAMP_UP_TIME_0_MASK; |
|
- | 5575 | data |= PLL_RAMP_UP_TIME_0(4); |
|
- | 5576 | if (data != orig) |
|
- | 5577 | WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data); |
|
- | 5578 | ||
- | 5579 | data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1); |
|
- | 5580 | data &= ~PLL_RAMP_UP_TIME_1_MASK; |
|
- | 5581 | data |= PLL_RAMP_UP_TIME_1(4); |
|
- | 5582 | if (data != orig) |
|
- | 5583 | WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data); |
|
- | 5584 | } |
|
- | 5585 | ||
- | 5586 | data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); |
|
- | 5587 | data &= ~LC_DYN_LANES_PWR_STATE_MASK; |
|
- | 5588 | data |= LC_DYN_LANES_PWR_STATE(3); |
|
- | 5589 | if (data != orig) |
|
- | 5590 | WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data); |
|
- | 5591 | ||
- | 5592 | if (rdev->family >= CHIP_BARTS) { |
|
- | 5593 | data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL); |
|
- | 5594 | data &= ~LS2_EXIT_TIME_MASK; |
|
- | 5595 | data |= LS2_EXIT_TIME(1); |
|
- | 5596 | if (data != orig) |
|
- | 5597 | WREG32_PIF_PHY0(PB0_PIF_CNTL, data); |
|
- | 5598 | ||
- | 5599 | data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL); |
|
- | 5600 | data &= ~LS2_EXIT_TIME_MASK; |
|
- | 5601 | data |= LS2_EXIT_TIME(1); |
|
- | 5602 | if (data != orig) |
|
- | 5603 | WREG32_PIF_PHY1(PB1_PIF_CNTL, data); |
|
- | 5604 | } |
|
- | 5605 | } |
|
- | 5606 | } |
|
- | 5607 | ||
- | 5608 | /* evergreen parts only */ |
|
- | 5609 | if (rdev->family < CHIP_BARTS) |
|
- | 5610 | pcie_lc_cntl |= LC_PMI_TO_L1_DIS; |
|
- | 5611 | ||
- | 5612 | if (pcie_lc_cntl != pcie_lc_cntl_old) |
|
- | 5613 | WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl); |
|
- | 5614 | }>>>>><>><>>><>>>><>>>><>><>>>><>>>>=>=><=>><>>><>>><>>=><=>><>=>><>><>><>><>><>><>><>><>><>><>>><>><>><>>>>><>><>><>><>><>><>><>>>>>>>>>>>>>>>=>=>= |