| .. | .. |
|---|
| 20 | 20 | * OTHER DEALINGS IN THE SOFTWARE. |
|---|
| 21 | 21 | * |
|---|
| 22 | 22 | */ |
|---|
| 23 | | -#include <drm/drmP.h> |
|---|
| 23 | + |
|---|
| 24 | +#include <drm/drm_fourcc.h> |
|---|
| 25 | +#include <drm/drm_vblank.h> |
|---|
| 26 | + |
|---|
| 24 | 27 | #include "amdgpu.h" |
|---|
| 25 | 28 | #include "amdgpu_pm.h" |
|---|
| 26 | 29 | #include "amdgpu_i2c.h" |
|---|
| .. | .. |
|---|
| 31 | 34 | #include "atombios_encoders.h" |
|---|
| 32 | 35 | #include "amdgpu_pll.h" |
|---|
| 33 | 36 | #include "amdgpu_connectors.h" |
|---|
| 37 | +#include "amdgpu_display.h" |
|---|
| 34 | 38 | #include "dce_v10_0.h" |
|---|
| 35 | 39 | |
|---|
| 36 | 40 | #include "dce/dce_10_0_d.h" |
|---|
| .. | .. |
|---|
| 232 | 236 | int crtc_id, u64 crtc_base, bool async) |
|---|
| 233 | 237 | { |
|---|
| 234 | 238 | struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; |
|---|
| 239 | + struct drm_framebuffer *fb = amdgpu_crtc->base.primary->fb; |
|---|
| 235 | 240 | u32 tmp; |
|---|
| 236 | 241 | |
|---|
| 237 | 242 | /* flip at hsync for async, default is vsync */ |
|---|
| .. | .. |
|---|
| 239 | 244 | tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL, |
|---|
| 240 | 245 | GRPH_SURFACE_UPDATE_H_RETRACE_EN, async ? 1 : 0); |
|---|
| 241 | 246 | WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
|---|
| 247 | + /* update pitch */ |
|---|
| 248 | + WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, |
|---|
| 249 | + fb->pitches[0] / fb->format->cpp[0]); |
|---|
| 242 | 250 | /* update the primary scanout address */ |
|---|
| 243 | 251 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
|---|
| 244 | 252 | upper_32_bits(crtc_base)); |
|---|
| .. | .. |
|---|
| 320 | 328 | */ |
|---|
| 321 | 329 | static void dce_v10_0_hpd_init(struct amdgpu_device *adev) |
|---|
| 322 | 330 | { |
|---|
| 323 | | - struct drm_device *dev = adev->ddev; |
|---|
| 331 | + struct drm_device *dev = adev_to_drm(adev); |
|---|
| 324 | 332 | struct drm_connector *connector; |
|---|
| 333 | + struct drm_connector_list_iter iter; |
|---|
| 325 | 334 | u32 tmp; |
|---|
| 326 | 335 | |
|---|
| 327 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
|---|
| 336 | + drm_connector_list_iter_begin(dev, &iter); |
|---|
| 337 | + drm_for_each_connector_iter(connector, &iter) { |
|---|
| 328 | 338 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
|---|
| 329 | 339 | |
|---|
| 330 | 340 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
|---|
| .. | .. |
|---|
| 360 | 370 | amdgpu_irq_get(adev, &adev->hpd_irq, |
|---|
| 361 | 371 | amdgpu_connector->hpd.hpd); |
|---|
| 362 | 372 | } |
|---|
| 373 | + drm_connector_list_iter_end(&iter); |
|---|
| 363 | 374 | } |
|---|
| 364 | 375 | |
|---|
| 365 | 376 | /** |
|---|
| .. | .. |
|---|
| 372 | 383 | */ |
|---|
| 373 | 384 | static void dce_v10_0_hpd_fini(struct amdgpu_device *adev) |
|---|
| 374 | 385 | { |
|---|
| 375 | | - struct drm_device *dev = adev->ddev; |
|---|
| 386 | + struct drm_device *dev = adev_to_drm(adev); |
|---|
| 376 | 387 | struct drm_connector *connector; |
|---|
| 388 | + struct drm_connector_list_iter iter; |
|---|
| 377 | 389 | u32 tmp; |
|---|
| 378 | 390 | |
|---|
| 379 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
|---|
| 391 | + drm_connector_list_iter_begin(dev, &iter); |
|---|
| 392 | + drm_for_each_connector_iter(connector, &iter) { |
|---|
| 380 | 393 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
|---|
| 381 | 394 | |
|---|
| 382 | 395 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
|---|
| .. | .. |
|---|
| 389 | 402 | amdgpu_irq_put(adev, &adev->hpd_irq, |
|---|
| 390 | 403 | amdgpu_connector->hpd.hpd); |
|---|
| 391 | 404 | } |
|---|
| 405 | + drm_connector_list_iter_end(&iter); |
|---|
| 392 | 406 | } |
|---|
| 393 | 407 | |
|---|
| 394 | 408 | static u32 dce_v10_0_hpd_get_gpio_reg(struct amdgpu_device *adev) |
|---|
| .. | .. |
|---|
| 490 | 504 | static void dce_v10_0_program_fmt(struct drm_encoder *encoder) |
|---|
| 491 | 505 | { |
|---|
| 492 | 506 | struct drm_device *dev = encoder->dev; |
|---|
| 493 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 507 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 494 | 508 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 495 | 509 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
|---|
| 496 | 510 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
|---|
| .. | .. |
|---|
| 1195 | 1209 | |
|---|
| 1196 | 1210 | static void dce_v10_0_afmt_audio_select_pin(struct drm_encoder *encoder) |
|---|
| 1197 | 1211 | { |
|---|
| 1198 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
|---|
| 1212 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
|---|
| 1199 | 1213 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1200 | 1214 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1201 | 1215 | u32 tmp; |
|---|
| .. | .. |
|---|
| 1211 | 1225 | static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder, |
|---|
| 1212 | 1226 | struct drm_display_mode *mode) |
|---|
| 1213 | 1227 | { |
|---|
| 1214 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
|---|
| 1228 | + struct drm_device *dev = encoder->dev; |
|---|
| 1229 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1215 | 1230 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1216 | 1231 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1217 | 1232 | struct drm_connector *connector; |
|---|
| 1233 | + struct drm_connector_list_iter iter; |
|---|
| 1218 | 1234 | struct amdgpu_connector *amdgpu_connector = NULL; |
|---|
| 1219 | 1235 | u32 tmp; |
|---|
| 1220 | 1236 | int interlace = 0; |
|---|
| .. | .. |
|---|
| 1222 | 1238 | if (!dig || !dig->afmt || !dig->afmt->pin) |
|---|
| 1223 | 1239 | return; |
|---|
| 1224 | 1240 | |
|---|
| 1225 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
|---|
| 1241 | + drm_connector_list_iter_begin(dev, &iter); |
|---|
| 1242 | + drm_for_each_connector_iter(connector, &iter) { |
|---|
| 1226 | 1243 | if (connector->encoder == encoder) { |
|---|
| 1227 | 1244 | amdgpu_connector = to_amdgpu_connector(connector); |
|---|
| 1228 | 1245 | break; |
|---|
| 1229 | 1246 | } |
|---|
| 1230 | 1247 | } |
|---|
| 1248 | + drm_connector_list_iter_end(&iter); |
|---|
| 1231 | 1249 | |
|---|
| 1232 | 1250 | if (!amdgpu_connector) { |
|---|
| 1233 | 1251 | DRM_ERROR("Couldn't find encoder's connector\n"); |
|---|
| .. | .. |
|---|
| 1253 | 1271 | |
|---|
| 1254 | 1272 | static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder) |
|---|
| 1255 | 1273 | { |
|---|
| 1256 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
|---|
| 1274 | + struct drm_device *dev = encoder->dev; |
|---|
| 1275 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1257 | 1276 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1258 | 1277 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1259 | 1278 | struct drm_connector *connector; |
|---|
| 1279 | + struct drm_connector_list_iter iter; |
|---|
| 1260 | 1280 | struct amdgpu_connector *amdgpu_connector = NULL; |
|---|
| 1261 | 1281 | u32 tmp; |
|---|
| 1262 | 1282 | u8 *sadb = NULL; |
|---|
| .. | .. |
|---|
| 1265 | 1285 | if (!dig || !dig->afmt || !dig->afmt->pin) |
|---|
| 1266 | 1286 | return; |
|---|
| 1267 | 1287 | |
|---|
| 1268 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
|---|
| 1288 | + drm_connector_list_iter_begin(dev, &iter); |
|---|
| 1289 | + drm_for_each_connector_iter(connector, &iter) { |
|---|
| 1269 | 1290 | if (connector->encoder == encoder) { |
|---|
| 1270 | 1291 | amdgpu_connector = to_amdgpu_connector(connector); |
|---|
| 1271 | 1292 | break; |
|---|
| 1272 | 1293 | } |
|---|
| 1273 | 1294 | } |
|---|
| 1295 | + drm_connector_list_iter_end(&iter); |
|---|
| 1274 | 1296 | |
|---|
| 1275 | 1297 | if (!amdgpu_connector) { |
|---|
| 1276 | 1298 | DRM_ERROR("Couldn't find encoder's connector\n"); |
|---|
| .. | .. |
|---|
| 1305 | 1327 | |
|---|
| 1306 | 1328 | static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder) |
|---|
| 1307 | 1329 | { |
|---|
| 1308 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
|---|
| 1330 | + struct drm_device *dev = encoder->dev; |
|---|
| 1331 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1309 | 1332 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1310 | 1333 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1311 | 1334 | struct drm_connector *connector; |
|---|
| 1335 | + struct drm_connector_list_iter iter; |
|---|
| 1312 | 1336 | struct amdgpu_connector *amdgpu_connector = NULL; |
|---|
| 1313 | 1337 | struct cea_sad *sads; |
|---|
| 1314 | 1338 | int i, sad_count; |
|---|
| .. | .. |
|---|
| 1331 | 1355 | if (!dig || !dig->afmt || !dig->afmt->pin) |
|---|
| 1332 | 1356 | return; |
|---|
| 1333 | 1357 | |
|---|
| 1334 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
|---|
| 1358 | + drm_connector_list_iter_begin(dev, &iter); |
|---|
| 1359 | + drm_for_each_connector_iter(connector, &iter) { |
|---|
| 1335 | 1360 | if (connector->encoder == encoder) { |
|---|
| 1336 | 1361 | amdgpu_connector = to_amdgpu_connector(connector); |
|---|
| 1337 | 1362 | break; |
|---|
| 1338 | 1363 | } |
|---|
| 1339 | 1364 | } |
|---|
| 1365 | + drm_connector_list_iter_end(&iter); |
|---|
| 1340 | 1366 | |
|---|
| 1341 | 1367 | if (!amdgpu_connector) { |
|---|
| 1342 | 1368 | DRM_ERROR("Couldn't find encoder's connector\n"); |
|---|
| .. | .. |
|---|
| 1344 | 1370 | } |
|---|
| 1345 | 1371 | |
|---|
| 1346 | 1372 | sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads); |
|---|
| 1347 | | - if (sad_count <= 0) { |
|---|
| 1373 | + if (sad_count < 0) |
|---|
| 1348 | 1374 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); |
|---|
| 1375 | + if (sad_count <= 0) |
|---|
| 1349 | 1376 | return; |
|---|
| 1350 | | - } |
|---|
| 1351 | 1377 | BUG_ON(!sads); |
|---|
| 1352 | 1378 | |
|---|
| 1353 | 1379 | for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { |
|---|
| .. | .. |
|---|
| 1457 | 1483 | static void dce_v10_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock) |
|---|
| 1458 | 1484 | { |
|---|
| 1459 | 1485 | struct drm_device *dev = encoder->dev; |
|---|
| 1460 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1486 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1461 | 1487 | struct amdgpu_afmt_acr acr = amdgpu_afmt_acr(clock); |
|---|
| 1462 | 1488 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1463 | 1489 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| .. | .. |
|---|
| 1493 | 1519 | void *buffer, size_t size) |
|---|
| 1494 | 1520 | { |
|---|
| 1495 | 1521 | struct drm_device *dev = encoder->dev; |
|---|
| 1496 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1522 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1497 | 1523 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1498 | 1524 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1499 | 1525 | uint8_t *frame = buffer + 3; |
|---|
| .. | .. |
|---|
| 1512 | 1538 | static void dce_v10_0_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
|---|
| 1513 | 1539 | { |
|---|
| 1514 | 1540 | struct drm_device *dev = encoder->dev; |
|---|
| 1515 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1541 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1516 | 1542 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1517 | 1543 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1518 | 1544 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
|---|
| .. | .. |
|---|
| 1543 | 1569 | struct drm_display_mode *mode) |
|---|
| 1544 | 1570 | { |
|---|
| 1545 | 1571 | struct drm_device *dev = encoder->dev; |
|---|
| 1546 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1572 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1547 | 1573 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1548 | 1574 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1549 | 1575 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
|---|
| .. | .. |
|---|
| 1681 | 1707 | dce_v10_0_audio_write_sad_regs(encoder); |
|---|
| 1682 | 1708 | dce_v10_0_audio_write_latency_fields(encoder, mode); |
|---|
| 1683 | 1709 | |
|---|
| 1684 | | - err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); |
|---|
| 1710 | + err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
|---|
| 1685 | 1711 | if (err < 0) { |
|---|
| 1686 | 1712 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
|---|
| 1687 | 1713 | return; |
|---|
| .. | .. |
|---|
| 1723 | 1749 | static void dce_v10_0_afmt_enable(struct drm_encoder *encoder, bool enable) |
|---|
| 1724 | 1750 | { |
|---|
| 1725 | 1751 | struct drm_device *dev = encoder->dev; |
|---|
| 1726 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1752 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1727 | 1753 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 1728 | 1754 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
|---|
| 1729 | 1755 | |
|---|
| .. | .. |
|---|
| 1796 | 1822 | { |
|---|
| 1797 | 1823 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 1798 | 1824 | struct drm_device *dev = crtc->dev; |
|---|
| 1799 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1825 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1800 | 1826 | u32 vga_control; |
|---|
| 1801 | 1827 | |
|---|
| 1802 | 1828 | vga_control = RREG32(vga_control_regs[amdgpu_crtc->crtc_id]) & ~1; |
|---|
| .. | .. |
|---|
| 1810 | 1836 | { |
|---|
| 1811 | 1837 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 1812 | 1838 | struct drm_device *dev = crtc->dev; |
|---|
| 1813 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1839 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1814 | 1840 | |
|---|
| 1815 | 1841 | if (enable) |
|---|
| 1816 | 1842 | WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 1); |
|---|
| .. | .. |
|---|
| 1824 | 1850 | { |
|---|
| 1825 | 1851 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 1826 | 1852 | struct drm_device *dev = crtc->dev; |
|---|
| 1827 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 1853 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 1828 | 1854 | struct drm_framebuffer *target_fb; |
|---|
| 1829 | 1855 | struct drm_gem_object *obj; |
|---|
| 1830 | 1856 | struct amdgpu_bo *abo; |
|---|
| .. | .. |
|---|
| 1942 | 1968 | /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ |
|---|
| 1943 | 1969 | bypass_lut = true; |
|---|
| 1944 | 1970 | break; |
|---|
| 1971 | + case DRM_FORMAT_XBGR8888: |
|---|
| 1972 | + case DRM_FORMAT_ABGR8888: |
|---|
| 1973 | + fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2); |
|---|
| 1974 | + fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0); |
|---|
| 1975 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_RED_CROSSBAR, 2); |
|---|
| 1976 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_BLUE_CROSSBAR, 2); |
|---|
| 1977 | +#ifdef __BIG_ENDIAN |
|---|
| 1978 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, |
|---|
| 1979 | + ENDIAN_8IN32); |
|---|
| 1980 | +#endif |
|---|
| 1981 | + break; |
|---|
| 1945 | 1982 | default: |
|---|
| 1946 | 1983 | DRM_ERROR("Unsupported screen format %s\n", |
|---|
| 1947 | 1984 | drm_get_format_name(target_fb->format->format, &format_name)); |
|---|
| .. | .. |
|---|
| 2058 | 2095 | struct drm_display_mode *mode) |
|---|
| 2059 | 2096 | { |
|---|
| 2060 | 2097 | struct drm_device *dev = crtc->dev; |
|---|
| 2061 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 2098 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 2062 | 2099 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2063 | 2100 | u32 tmp; |
|---|
| 2064 | 2101 | |
|---|
| .. | .. |
|---|
| 2074 | 2111 | { |
|---|
| 2075 | 2112 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2076 | 2113 | struct drm_device *dev = crtc->dev; |
|---|
| 2077 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 2114 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 2078 | 2115 | u16 *r, *g, *b; |
|---|
| 2079 | 2116 | int i; |
|---|
| 2080 | 2117 | u32 tmp; |
|---|
| .. | .. |
|---|
| 2213 | 2250 | { |
|---|
| 2214 | 2251 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2215 | 2252 | struct drm_device *dev = crtc->dev; |
|---|
| 2216 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 2253 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 2217 | 2254 | u32 pll_in_use; |
|---|
| 2218 | 2255 | int pll; |
|---|
| 2219 | 2256 | |
|---|
| .. | .. |
|---|
| 2248 | 2285 | |
|---|
| 2249 | 2286 | static void dce_v10_0_lock_cursor(struct drm_crtc *crtc, bool lock) |
|---|
| 2250 | 2287 | { |
|---|
| 2251 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
|---|
| 2288 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
|---|
| 2252 | 2289 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2253 | 2290 | uint32_t cur_lock; |
|---|
| 2254 | 2291 | |
|---|
| .. | .. |
|---|
| 2263 | 2300 | static void dce_v10_0_hide_cursor(struct drm_crtc *crtc) |
|---|
| 2264 | 2301 | { |
|---|
| 2265 | 2302 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2266 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
|---|
| 2303 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
|---|
| 2267 | 2304 | u32 tmp; |
|---|
| 2268 | 2305 | |
|---|
| 2269 | | - tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
|---|
| 2306 | + tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
|---|
| 2270 | 2307 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0); |
|---|
| 2271 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
|---|
| 2308 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
|---|
| 2272 | 2309 | } |
|---|
| 2273 | 2310 | |
|---|
| 2274 | 2311 | static void dce_v10_0_show_cursor(struct drm_crtc *crtc) |
|---|
| 2275 | 2312 | { |
|---|
| 2276 | 2313 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2277 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
|---|
| 2314 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
|---|
| 2278 | 2315 | u32 tmp; |
|---|
| 2279 | 2316 | |
|---|
| 2280 | 2317 | WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
|---|
| .. | .. |
|---|
| 2282 | 2319 | WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, |
|---|
| 2283 | 2320 | lower_32_bits(amdgpu_crtc->cursor_addr)); |
|---|
| 2284 | 2321 | |
|---|
| 2285 | | - tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
|---|
| 2322 | + tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
|---|
| 2286 | 2323 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1); |
|---|
| 2287 | 2324 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); |
|---|
| 2288 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
|---|
| 2325 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
|---|
| 2289 | 2326 | } |
|---|
| 2290 | 2327 | |
|---|
| 2291 | 2328 | static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc, |
|---|
| 2292 | 2329 | int x, int y) |
|---|
| 2293 | 2330 | { |
|---|
| 2294 | 2331 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2295 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
|---|
| 2332 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
|---|
| 2296 | 2333 | int xorigin = 0, yorigin = 0; |
|---|
| 2297 | 2334 | |
|---|
| 2298 | 2335 | amdgpu_crtc->cursor_x = x; |
|---|
| .. | .. |
|---|
| 2367 | 2404 | aobj = gem_to_amdgpu_bo(obj); |
|---|
| 2368 | 2405 | ret = amdgpu_bo_reserve(aobj, false); |
|---|
| 2369 | 2406 | if (ret != 0) { |
|---|
| 2370 | | - drm_gem_object_put_unlocked(obj); |
|---|
| 2407 | + drm_gem_object_put(obj); |
|---|
| 2371 | 2408 | return ret; |
|---|
| 2372 | 2409 | } |
|---|
| 2373 | 2410 | |
|---|
| .. | .. |
|---|
| 2375 | 2412 | amdgpu_bo_unreserve(aobj); |
|---|
| 2376 | 2413 | if (ret) { |
|---|
| 2377 | 2414 | DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret); |
|---|
| 2378 | | - drm_gem_object_put_unlocked(obj); |
|---|
| 2415 | + drm_gem_object_put(obj); |
|---|
| 2379 | 2416 | return ret; |
|---|
| 2380 | 2417 | } |
|---|
| 2381 | 2418 | amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj); |
|---|
| .. | .. |
|---|
| 2410 | 2447 | amdgpu_bo_unpin(aobj); |
|---|
| 2411 | 2448 | amdgpu_bo_unreserve(aobj); |
|---|
| 2412 | 2449 | } |
|---|
| 2413 | | - drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo); |
|---|
| 2450 | + drm_gem_object_put(amdgpu_crtc->cursor_bo); |
|---|
| 2414 | 2451 | } |
|---|
| 2415 | 2452 | |
|---|
| 2416 | 2453 | amdgpu_crtc->cursor_bo = obj; |
|---|
| .. | .. |
|---|
| 2457 | 2494 | .set_config = amdgpu_display_crtc_set_config, |
|---|
| 2458 | 2495 | .destroy = dce_v10_0_crtc_destroy, |
|---|
| 2459 | 2496 | .page_flip_target = amdgpu_display_crtc_page_flip_target, |
|---|
| 2497 | + .get_vblank_counter = amdgpu_get_vblank_counter_kms, |
|---|
| 2498 | + .enable_vblank = amdgpu_enable_vblank_kms, |
|---|
| 2499 | + .disable_vblank = amdgpu_disable_vblank_kms, |
|---|
| 2500 | + .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, |
|---|
| 2460 | 2501 | }; |
|---|
| 2461 | 2502 | |
|---|
| 2462 | 2503 | static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
|---|
| 2463 | 2504 | { |
|---|
| 2464 | 2505 | struct drm_device *dev = crtc->dev; |
|---|
| 2465 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 2506 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 2466 | 2507 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2467 | 2508 | unsigned type; |
|---|
| 2468 | 2509 | |
|---|
| .. | .. |
|---|
| 2516 | 2557 | { |
|---|
| 2517 | 2558 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
|---|
| 2518 | 2559 | struct drm_device *dev = crtc->dev; |
|---|
| 2519 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 2560 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 2520 | 2561 | struct amdgpu_atom_ss ss; |
|---|
| 2521 | 2562 | int i; |
|---|
| 2522 | 2563 | |
|---|
| .. | .. |
|---|
| 2648 | 2689 | .prepare = dce_v10_0_crtc_prepare, |
|---|
| 2649 | 2690 | .commit = dce_v10_0_crtc_commit, |
|---|
| 2650 | 2691 | .disable = dce_v10_0_crtc_disable, |
|---|
| 2692 | + .get_scanout_position = amdgpu_crtc_get_scanout_position, |
|---|
| 2651 | 2693 | }; |
|---|
| 2652 | 2694 | |
|---|
| 2653 | 2695 | static int dce_v10_0_crtc_init(struct amdgpu_device *adev, int index) |
|---|
| .. | .. |
|---|
| 2659 | 2701 | if (amdgpu_crtc == NULL) |
|---|
| 2660 | 2702 | return -ENOMEM; |
|---|
| 2661 | 2703 | |
|---|
| 2662 | | - drm_crtc_init(adev->ddev, &amdgpu_crtc->base, &dce_v10_0_crtc_funcs); |
|---|
| 2704 | + drm_crtc_init(adev_to_drm(adev), &amdgpu_crtc->base, &dce_v10_0_crtc_funcs); |
|---|
| 2663 | 2705 | |
|---|
| 2664 | 2706 | drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256); |
|---|
| 2665 | 2707 | amdgpu_crtc->crtc_id = index; |
|---|
| .. | .. |
|---|
| 2667 | 2709 | |
|---|
| 2668 | 2710 | amdgpu_crtc->max_cursor_width = 128; |
|---|
| 2669 | 2711 | amdgpu_crtc->max_cursor_height = 128; |
|---|
| 2670 | | - adev->ddev->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
|---|
| 2671 | | - adev->ddev->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
|---|
| 2712 | + adev_to_drm(adev)->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
|---|
| 2713 | + adev_to_drm(adev)->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
|---|
| 2672 | 2714 | |
|---|
| 2673 | 2715 | switch (amdgpu_crtc->crtc_id) { |
|---|
| 2674 | 2716 | case 0: |
|---|
| .. | .. |
|---|
| 2734 | 2776 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
|---|
| 2735 | 2777 | |
|---|
| 2736 | 2778 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
|---|
| 2737 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
|---|
| 2779 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
|---|
| 2738 | 2780 | if (r) |
|---|
| 2739 | 2781 | return r; |
|---|
| 2740 | 2782 | } |
|---|
| 2741 | 2783 | |
|---|
| 2742 | 2784 | for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP; i < 20; i += 2) { |
|---|
| 2743 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
|---|
| 2785 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
|---|
| 2744 | 2786 | if (r) |
|---|
| 2745 | 2787 | return r; |
|---|
| 2746 | 2788 | } |
|---|
| 2747 | 2789 | |
|---|
| 2748 | 2790 | /* HPD hotplug */ |
|---|
| 2749 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); |
|---|
| 2791 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); |
|---|
| 2750 | 2792 | if (r) |
|---|
| 2751 | 2793 | return r; |
|---|
| 2752 | 2794 | |
|---|
| 2753 | | - adev->ddev->mode_config.funcs = &amdgpu_mode_funcs; |
|---|
| 2795 | + adev_to_drm(adev)->mode_config.funcs = &amdgpu_mode_funcs; |
|---|
| 2754 | 2796 | |
|---|
| 2755 | | - adev->ddev->mode_config.async_page_flip = true; |
|---|
| 2797 | + adev_to_drm(adev)->mode_config.async_page_flip = true; |
|---|
| 2756 | 2798 | |
|---|
| 2757 | | - adev->ddev->mode_config.max_width = 16384; |
|---|
| 2758 | | - adev->ddev->mode_config.max_height = 16384; |
|---|
| 2799 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
|---|
| 2800 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
|---|
| 2759 | 2801 | |
|---|
| 2760 | | - adev->ddev->mode_config.preferred_depth = 24; |
|---|
| 2761 | | - adev->ddev->mode_config.prefer_shadow = 1; |
|---|
| 2802 | + adev_to_drm(adev)->mode_config.preferred_depth = 24; |
|---|
| 2803 | + adev_to_drm(adev)->mode_config.prefer_shadow = 1; |
|---|
| 2762 | 2804 | |
|---|
| 2763 | | - adev->ddev->mode_config.fb_base = adev->gmc.aper_base; |
|---|
| 2805 | + adev_to_drm(adev)->mode_config.fb_base = adev->gmc.aper_base; |
|---|
| 2764 | 2806 | |
|---|
| 2765 | 2807 | r = amdgpu_display_modeset_create_props(adev); |
|---|
| 2766 | 2808 | if (r) |
|---|
| 2767 | 2809 | return r; |
|---|
| 2768 | 2810 | |
|---|
| 2769 | | - adev->ddev->mode_config.max_width = 16384; |
|---|
| 2770 | | - adev->ddev->mode_config.max_height = 16384; |
|---|
| 2811 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
|---|
| 2812 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
|---|
| 2771 | 2813 | |
|---|
| 2772 | 2814 | /* allocate crtcs */ |
|---|
| 2773 | 2815 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
|---|
| .. | .. |
|---|
| 2777 | 2819 | } |
|---|
| 2778 | 2820 | |
|---|
| 2779 | 2821 | if (amdgpu_atombios_get_connector_info_from_object_table(adev)) |
|---|
| 2780 | | - amdgpu_display_print_display_setup(adev->ddev); |
|---|
| 2822 | + amdgpu_display_print_display_setup(adev_to_drm(adev)); |
|---|
| 2781 | 2823 | else |
|---|
| 2782 | 2824 | return -EINVAL; |
|---|
| 2783 | 2825 | |
|---|
| .. | .. |
|---|
| 2790 | 2832 | if (r) |
|---|
| 2791 | 2833 | return r; |
|---|
| 2792 | 2834 | |
|---|
| 2793 | | - drm_kms_helper_poll_init(adev->ddev); |
|---|
| 2835 | + drm_kms_helper_poll_init(adev_to_drm(adev)); |
|---|
| 2794 | 2836 | |
|---|
| 2795 | 2837 | adev->mode_info.mode_config_initialized = true; |
|---|
| 2796 | 2838 | return 0; |
|---|
| .. | .. |
|---|
| 2802 | 2844 | |
|---|
| 2803 | 2845 | kfree(adev->mode_info.bios_hardcoded_edid); |
|---|
| 2804 | 2846 | |
|---|
| 2805 | | - drm_kms_helper_poll_fini(adev->ddev); |
|---|
| 2847 | + drm_kms_helper_poll_fini(adev_to_drm(adev)); |
|---|
| 2806 | 2848 | |
|---|
| 2807 | 2849 | dce_v10_0_audio_fini(adev); |
|---|
| 2808 | 2850 | |
|---|
| 2809 | 2851 | dce_v10_0_afmt_fini(adev); |
|---|
| 2810 | 2852 | |
|---|
| 2811 | | - drm_mode_config_cleanup(adev->ddev); |
|---|
| 2853 | + drm_mode_config_cleanup(adev_to_drm(adev)); |
|---|
| 2812 | 2854 | adev->mode_info.mode_config_initialized = false; |
|---|
| 2813 | 2855 | |
|---|
| 2814 | 2856 | return 0; |
|---|
| .. | .. |
|---|
| 3115 | 3157 | if (amdgpu_crtc == NULL) |
|---|
| 3116 | 3158 | return 0; |
|---|
| 3117 | 3159 | |
|---|
| 3118 | | - spin_lock_irqsave(&adev->ddev->event_lock, flags); |
|---|
| 3160 | + spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags); |
|---|
| 3119 | 3161 | works = amdgpu_crtc->pflip_works; |
|---|
| 3120 | 3162 | if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { |
|---|
| 3121 | 3163 | DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " |
|---|
| 3122 | 3164 | "AMDGPU_FLIP_SUBMITTED(%d)\n", |
|---|
| 3123 | 3165 | amdgpu_crtc->pflip_status, |
|---|
| 3124 | 3166 | AMDGPU_FLIP_SUBMITTED); |
|---|
| 3125 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
|---|
| 3167 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
|---|
| 3126 | 3168 | return 0; |
|---|
| 3127 | 3169 | } |
|---|
| 3128 | 3170 | |
|---|
| .. | .. |
|---|
| 3134 | 3176 | if (works->event) |
|---|
| 3135 | 3177 | drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event); |
|---|
| 3136 | 3178 | |
|---|
| 3137 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
|---|
| 3179 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
|---|
| 3138 | 3180 | |
|---|
| 3139 | 3181 | drm_crtc_vblank_put(&amdgpu_crtc->base); |
|---|
| 3140 | 3182 | schedule_work(&works->unpin_work); |
|---|
| .. | .. |
|---|
| 3203 | 3245 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|---|
| 3204 | 3246 | |
|---|
| 3205 | 3247 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
|---|
| 3206 | | - drm_handle_vblank(adev->ddev, crtc); |
|---|
| 3248 | + drm_handle_vblank(adev_to_drm(adev), crtc); |
|---|
| 3207 | 3249 | } |
|---|
| 3208 | 3250 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); |
|---|
| 3209 | 3251 | |
|---|
| .. | .. |
|---|
| 3303 | 3345 | |
|---|
| 3304 | 3346 | static void dce_v10_0_encoder_prepare(struct drm_encoder *encoder) |
|---|
| 3305 | 3347 | { |
|---|
| 3306 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
|---|
| 3348 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
|---|
| 3307 | 3349 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
|---|
| 3308 | 3350 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
|---|
| 3309 | 3351 | |
|---|
| .. | .. |
|---|
| 3343 | 3385 | static void dce_v10_0_encoder_commit(struct drm_encoder *encoder) |
|---|
| 3344 | 3386 | { |
|---|
| 3345 | 3387 | struct drm_device *dev = encoder->dev; |
|---|
| 3346 | | - struct amdgpu_device *adev = dev->dev_private; |
|---|
| 3388 | + struct amdgpu_device *adev = drm_to_adev(dev); |
|---|
| 3347 | 3389 | |
|---|
| 3348 | 3390 | /* need to call this here as we need the crtc set up */ |
|---|
| 3349 | 3391 | amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_ON); |
|---|
| .. | .. |
|---|
| 3443 | 3485 | uint32_t supported_device, |
|---|
| 3444 | 3486 | u16 caps) |
|---|
| 3445 | 3487 | { |
|---|
| 3446 | | - struct drm_device *dev = adev->ddev; |
|---|
| 3488 | + struct drm_device *dev = adev_to_drm(adev); |
|---|
| 3447 | 3489 | struct drm_encoder *encoder; |
|---|
| 3448 | 3490 | struct amdgpu_encoder *amdgpu_encoder; |
|---|
| 3449 | 3491 | |
|---|
| .. | .. |
|---|
| 3558 | 3600 | |
|---|
| 3559 | 3601 | static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev) |
|---|
| 3560 | 3602 | { |
|---|
| 3561 | | - if (adev->mode_info.funcs == NULL) |
|---|
| 3562 | | - adev->mode_info.funcs = &dce_v10_0_display_funcs; |
|---|
| 3603 | + adev->mode_info.funcs = &dce_v10_0_display_funcs; |
|---|
| 3563 | 3604 | } |
|---|
| 3564 | 3605 | |
|---|
| 3565 | 3606 | static const struct amdgpu_irq_src_funcs dce_v10_0_crtc_irq_funcs = { |
|---|