.. | .. |
---|
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_v11_0.h" |
---|
35 | 39 | |
---|
36 | 40 | #include "dce/dce_11_0_d.h" |
---|
.. | .. |
---|
250 | 254 | int crtc_id, u64 crtc_base, bool async) |
---|
251 | 255 | { |
---|
252 | 256 | struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; |
---|
| 257 | + struct drm_framebuffer *fb = amdgpu_crtc->base.primary->fb; |
---|
253 | 258 | u32 tmp; |
---|
254 | 259 | |
---|
255 | 260 | /* flip immediate for async, default is vsync */ |
---|
.. | .. |
---|
257 | 262 | tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL, |
---|
258 | 263 | GRPH_SURFACE_UPDATE_IMMEDIATE_EN, async ? 1 : 0); |
---|
259 | 264 | WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
---|
| 265 | + /* update pitch */ |
---|
| 266 | + WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, |
---|
| 267 | + fb->pitches[0] / fb->format->cpp[0]); |
---|
260 | 268 | /* update the scanout addresses */ |
---|
261 | 269 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
---|
262 | 270 | upper_32_bits(crtc_base)); |
---|
.. | .. |
---|
338 | 346 | */ |
---|
339 | 347 | static void dce_v11_0_hpd_init(struct amdgpu_device *adev) |
---|
340 | 348 | { |
---|
341 | | - struct drm_device *dev = adev->ddev; |
---|
| 349 | + struct drm_device *dev = adev_to_drm(adev); |
---|
342 | 350 | struct drm_connector *connector; |
---|
| 351 | + struct drm_connector_list_iter iter; |
---|
343 | 352 | u32 tmp; |
---|
344 | 353 | |
---|
345 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
---|
| 354 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 355 | + drm_for_each_connector_iter(connector, &iter) { |
---|
346 | 356 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
---|
347 | 357 | |
---|
348 | 358 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
---|
.. | .. |
---|
377 | 387 | dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); |
---|
378 | 388 | amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); |
---|
379 | 389 | } |
---|
| 390 | + drm_connector_list_iter_end(&iter); |
---|
380 | 391 | } |
---|
381 | 392 | |
---|
382 | 393 | /** |
---|
.. | .. |
---|
389 | 400 | */ |
---|
390 | 401 | static void dce_v11_0_hpd_fini(struct amdgpu_device *adev) |
---|
391 | 402 | { |
---|
392 | | - struct drm_device *dev = adev->ddev; |
---|
| 403 | + struct drm_device *dev = adev_to_drm(adev); |
---|
393 | 404 | struct drm_connector *connector; |
---|
| 405 | + struct drm_connector_list_iter iter; |
---|
394 | 406 | u32 tmp; |
---|
395 | 407 | |
---|
396 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
---|
| 408 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 409 | + drm_for_each_connector_iter(connector, &iter) { |
---|
397 | 410 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
---|
398 | 411 | |
---|
399 | 412 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
---|
.. | .. |
---|
405 | 418 | |
---|
406 | 419 | amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); |
---|
407 | 420 | } |
---|
| 421 | + drm_connector_list_iter_end(&iter); |
---|
408 | 422 | } |
---|
409 | 423 | |
---|
410 | 424 | static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev) |
---|
.. | .. |
---|
516 | 530 | static void dce_v11_0_program_fmt(struct drm_encoder *encoder) |
---|
517 | 531 | { |
---|
518 | 532 | struct drm_device *dev = encoder->dev; |
---|
519 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 533 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
520 | 534 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
521 | 535 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
---|
522 | 536 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
.. | .. |
---|
1221 | 1235 | |
---|
1222 | 1236 | static void dce_v11_0_afmt_audio_select_pin(struct drm_encoder *encoder) |
---|
1223 | 1237 | { |
---|
1224 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1238 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
---|
1225 | 1239 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1226 | 1240 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1227 | 1241 | u32 tmp; |
---|
.. | .. |
---|
1237 | 1251 | static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder, |
---|
1238 | 1252 | struct drm_display_mode *mode) |
---|
1239 | 1253 | { |
---|
1240 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1254 | + struct drm_device *dev = encoder->dev; |
---|
| 1255 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1241 | 1256 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1242 | 1257 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1243 | 1258 | struct drm_connector *connector; |
---|
| 1259 | + struct drm_connector_list_iter iter; |
---|
1244 | 1260 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1245 | 1261 | u32 tmp; |
---|
1246 | 1262 | int interlace = 0; |
---|
.. | .. |
---|
1248 | 1264 | if (!dig || !dig->afmt || !dig->afmt->pin) |
---|
1249 | 1265 | return; |
---|
1250 | 1266 | |
---|
1251 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1267 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1268 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1252 | 1269 | if (connector->encoder == encoder) { |
---|
1253 | 1270 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1254 | 1271 | break; |
---|
1255 | 1272 | } |
---|
1256 | 1273 | } |
---|
| 1274 | + drm_connector_list_iter_end(&iter); |
---|
1257 | 1275 | |
---|
1258 | 1276 | if (!amdgpu_connector) { |
---|
1259 | 1277 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1279 | 1297 | |
---|
1280 | 1298 | static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder) |
---|
1281 | 1299 | { |
---|
1282 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1300 | + struct drm_device *dev = encoder->dev; |
---|
| 1301 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1283 | 1302 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1284 | 1303 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1285 | 1304 | struct drm_connector *connector; |
---|
| 1305 | + struct drm_connector_list_iter iter; |
---|
1286 | 1306 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1287 | 1307 | u32 tmp; |
---|
1288 | 1308 | u8 *sadb = NULL; |
---|
.. | .. |
---|
1291 | 1311 | if (!dig || !dig->afmt || !dig->afmt->pin) |
---|
1292 | 1312 | return; |
---|
1293 | 1313 | |
---|
1294 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1314 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1315 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1295 | 1316 | if (connector->encoder == encoder) { |
---|
1296 | 1317 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1297 | 1318 | break; |
---|
1298 | 1319 | } |
---|
1299 | 1320 | } |
---|
| 1321 | + drm_connector_list_iter_end(&iter); |
---|
1300 | 1322 | |
---|
1301 | 1323 | if (!amdgpu_connector) { |
---|
1302 | 1324 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1331 | 1353 | |
---|
1332 | 1354 | static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder) |
---|
1333 | 1355 | { |
---|
1334 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1356 | + struct drm_device *dev = encoder->dev; |
---|
| 1357 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1335 | 1358 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1336 | 1359 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1337 | 1360 | struct drm_connector *connector; |
---|
| 1361 | + struct drm_connector_list_iter iter; |
---|
1338 | 1362 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1339 | 1363 | struct cea_sad *sads; |
---|
1340 | 1364 | int i, sad_count; |
---|
.. | .. |
---|
1357 | 1381 | if (!dig || !dig->afmt || !dig->afmt->pin) |
---|
1358 | 1382 | return; |
---|
1359 | 1383 | |
---|
1360 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1384 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1385 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1361 | 1386 | if (connector->encoder == encoder) { |
---|
1362 | 1387 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1363 | 1388 | break; |
---|
1364 | 1389 | } |
---|
1365 | 1390 | } |
---|
| 1391 | + drm_connector_list_iter_end(&iter); |
---|
1366 | 1392 | |
---|
1367 | 1393 | if (!amdgpu_connector) { |
---|
1368 | 1394 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1370 | 1396 | } |
---|
1371 | 1397 | |
---|
1372 | 1398 | sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads); |
---|
1373 | | - if (sad_count <= 0) { |
---|
| 1399 | + if (sad_count < 0) |
---|
1374 | 1400 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); |
---|
| 1401 | + if (sad_count <= 0) |
---|
1375 | 1402 | return; |
---|
1376 | | - } |
---|
1377 | 1403 | BUG_ON(!sads); |
---|
1378 | 1404 | |
---|
1379 | 1405 | for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { |
---|
.. | .. |
---|
1499 | 1525 | static void dce_v11_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock) |
---|
1500 | 1526 | { |
---|
1501 | 1527 | struct drm_device *dev = encoder->dev; |
---|
1502 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1528 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1503 | 1529 | struct amdgpu_afmt_acr acr = amdgpu_afmt_acr(clock); |
---|
1504 | 1530 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1505 | 1531 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
.. | .. |
---|
1535 | 1561 | void *buffer, size_t size) |
---|
1536 | 1562 | { |
---|
1537 | 1563 | struct drm_device *dev = encoder->dev; |
---|
1538 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1564 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1539 | 1565 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1540 | 1566 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1541 | 1567 | uint8_t *frame = buffer + 3; |
---|
.. | .. |
---|
1554 | 1580 | static void dce_v11_0_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
---|
1555 | 1581 | { |
---|
1556 | 1582 | struct drm_device *dev = encoder->dev; |
---|
1557 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1583 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1558 | 1584 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1559 | 1585 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1560 | 1586 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
---|
.. | .. |
---|
1585 | 1611 | struct drm_display_mode *mode) |
---|
1586 | 1612 | { |
---|
1587 | 1613 | struct drm_device *dev = encoder->dev; |
---|
1588 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1614 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1589 | 1615 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1590 | 1616 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1591 | 1617 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
.. | .. |
---|
1723 | 1749 | dce_v11_0_audio_write_sad_regs(encoder); |
---|
1724 | 1750 | dce_v11_0_audio_write_latency_fields(encoder, mode); |
---|
1725 | 1751 | |
---|
1726 | | - err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); |
---|
| 1752 | + err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
---|
1727 | 1753 | if (err < 0) { |
---|
1728 | 1754 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
---|
1729 | 1755 | return; |
---|
.. | .. |
---|
1765 | 1791 | static void dce_v11_0_afmt_enable(struct drm_encoder *encoder, bool enable) |
---|
1766 | 1792 | { |
---|
1767 | 1793 | struct drm_device *dev = encoder->dev; |
---|
1768 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1794 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1769 | 1795 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1770 | 1796 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1771 | 1797 | |
---|
.. | .. |
---|
1838 | 1864 | { |
---|
1839 | 1865 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1840 | 1866 | struct drm_device *dev = crtc->dev; |
---|
1841 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1867 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1842 | 1868 | u32 vga_control; |
---|
1843 | 1869 | |
---|
1844 | 1870 | vga_control = RREG32(vga_control_regs[amdgpu_crtc->crtc_id]) & ~1; |
---|
.. | .. |
---|
1852 | 1878 | { |
---|
1853 | 1879 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1854 | 1880 | struct drm_device *dev = crtc->dev; |
---|
1855 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1881 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1856 | 1882 | |
---|
1857 | 1883 | if (enable) |
---|
1858 | 1884 | WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 1); |
---|
.. | .. |
---|
1866 | 1892 | { |
---|
1867 | 1893 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1868 | 1894 | struct drm_device *dev = crtc->dev; |
---|
1869 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1895 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1870 | 1896 | struct drm_framebuffer *target_fb; |
---|
1871 | 1897 | struct drm_gem_object *obj; |
---|
1872 | 1898 | struct amdgpu_bo *abo; |
---|
.. | .. |
---|
1984 | 2010 | /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ |
---|
1985 | 2011 | bypass_lut = true; |
---|
1986 | 2012 | break; |
---|
| 2013 | + case DRM_FORMAT_XBGR8888: |
---|
| 2014 | + case DRM_FORMAT_ABGR8888: |
---|
| 2015 | + fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 2); |
---|
| 2016 | + fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_FORMAT, 0); |
---|
| 2017 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_RED_CROSSBAR, 2); |
---|
| 2018 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_BLUE_CROSSBAR, 2); |
---|
| 2019 | +#ifdef __BIG_ENDIAN |
---|
| 2020 | + fb_swap = REG_SET_FIELD(fb_swap, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, |
---|
| 2021 | + ENDIAN_8IN32); |
---|
| 2022 | +#endif |
---|
| 2023 | + break; |
---|
1987 | 2024 | default: |
---|
1988 | 2025 | DRM_ERROR("Unsupported screen format %s\n", |
---|
1989 | 2026 | drm_get_format_name(target_fb->format->format, &format_name)); |
---|
.. | .. |
---|
2100 | 2137 | struct drm_display_mode *mode) |
---|
2101 | 2138 | { |
---|
2102 | 2139 | struct drm_device *dev = crtc->dev; |
---|
2103 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2140 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2104 | 2141 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2105 | 2142 | u32 tmp; |
---|
2106 | 2143 | |
---|
.. | .. |
---|
2116 | 2153 | { |
---|
2117 | 2154 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2118 | 2155 | struct drm_device *dev = crtc->dev; |
---|
2119 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2156 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2120 | 2157 | u16 *r, *g, *b; |
---|
2121 | 2158 | int i; |
---|
2122 | 2159 | u32 tmp; |
---|
.. | .. |
---|
2246 | 2283 | { |
---|
2247 | 2284 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2248 | 2285 | struct drm_device *dev = crtc->dev; |
---|
2249 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2286 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2250 | 2287 | u32 pll_in_use; |
---|
2251 | 2288 | int pll; |
---|
2252 | 2289 | |
---|
.. | .. |
---|
2305 | 2342 | |
---|
2306 | 2343 | /* XXX need to determine what plls are available on each DCE11 part */ |
---|
2307 | 2344 | pll_in_use = amdgpu_pll_get_use_mask(crtc); |
---|
2308 | | - if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY) { |
---|
| 2345 | + if (adev->flags & AMD_IS_APU) { |
---|
2309 | 2346 | if (!(pll_in_use & (1 << ATOM_PPLL1))) |
---|
2310 | 2347 | return ATOM_PPLL1; |
---|
2311 | 2348 | if (!(pll_in_use & (1 << ATOM_PPLL0))) |
---|
.. | .. |
---|
2327 | 2364 | |
---|
2328 | 2365 | static void dce_v11_0_lock_cursor(struct drm_crtc *crtc, bool lock) |
---|
2329 | 2366 | { |
---|
2330 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2367 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2331 | 2368 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2332 | 2369 | uint32_t cur_lock; |
---|
2333 | 2370 | |
---|
.. | .. |
---|
2342 | 2379 | static void dce_v11_0_hide_cursor(struct drm_crtc *crtc) |
---|
2343 | 2380 | { |
---|
2344 | 2381 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2345 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2382 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2346 | 2383 | u32 tmp; |
---|
2347 | 2384 | |
---|
2348 | | - tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
---|
| 2385 | + tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
---|
2349 | 2386 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0); |
---|
2350 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
---|
| 2387 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
---|
2351 | 2388 | } |
---|
2352 | 2389 | |
---|
2353 | 2390 | static void dce_v11_0_show_cursor(struct drm_crtc *crtc) |
---|
2354 | 2391 | { |
---|
2355 | 2392 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2356 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2393 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2357 | 2394 | u32 tmp; |
---|
2358 | 2395 | |
---|
2359 | 2396 | WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
---|
.. | .. |
---|
2361 | 2398 | WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, |
---|
2362 | 2399 | lower_32_bits(amdgpu_crtc->cursor_addr)); |
---|
2363 | 2400 | |
---|
2364 | | - tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
---|
| 2401 | + tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); |
---|
2365 | 2402 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1); |
---|
2366 | 2403 | tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); |
---|
2367 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
---|
| 2404 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); |
---|
2368 | 2405 | } |
---|
2369 | 2406 | |
---|
2370 | 2407 | static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc, |
---|
2371 | 2408 | int x, int y) |
---|
2372 | 2409 | { |
---|
2373 | 2410 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2374 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2411 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2375 | 2412 | int xorigin = 0, yorigin = 0; |
---|
2376 | 2413 | |
---|
2377 | 2414 | amdgpu_crtc->cursor_x = x; |
---|
.. | .. |
---|
2446 | 2483 | aobj = gem_to_amdgpu_bo(obj); |
---|
2447 | 2484 | ret = amdgpu_bo_reserve(aobj, false); |
---|
2448 | 2485 | if (ret != 0) { |
---|
2449 | | - drm_gem_object_put_unlocked(obj); |
---|
| 2486 | + drm_gem_object_put(obj); |
---|
2450 | 2487 | return ret; |
---|
2451 | 2488 | } |
---|
2452 | 2489 | |
---|
.. | .. |
---|
2454 | 2491 | amdgpu_bo_unreserve(aobj); |
---|
2455 | 2492 | if (ret) { |
---|
2456 | 2493 | DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret); |
---|
2457 | | - drm_gem_object_put_unlocked(obj); |
---|
| 2494 | + drm_gem_object_put(obj); |
---|
2458 | 2495 | return ret; |
---|
2459 | 2496 | } |
---|
2460 | 2497 | amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj); |
---|
.. | .. |
---|
2489 | 2526 | amdgpu_bo_unpin(aobj); |
---|
2490 | 2527 | amdgpu_bo_unreserve(aobj); |
---|
2491 | 2528 | } |
---|
2492 | | - drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo); |
---|
| 2529 | + drm_gem_object_put(amdgpu_crtc->cursor_bo); |
---|
2493 | 2530 | } |
---|
2494 | 2531 | |
---|
2495 | 2532 | amdgpu_crtc->cursor_bo = obj; |
---|
.. | .. |
---|
2536 | 2573 | .set_config = amdgpu_display_crtc_set_config, |
---|
2537 | 2574 | .destroy = dce_v11_0_crtc_destroy, |
---|
2538 | 2575 | .page_flip_target = amdgpu_display_crtc_page_flip_target, |
---|
| 2576 | + .get_vblank_counter = amdgpu_get_vblank_counter_kms, |
---|
| 2577 | + .enable_vblank = amdgpu_enable_vblank_kms, |
---|
| 2578 | + .disable_vblank = amdgpu_disable_vblank_kms, |
---|
| 2579 | + .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, |
---|
2539 | 2580 | }; |
---|
2540 | 2581 | |
---|
2541 | 2582 | static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
---|
2542 | 2583 | { |
---|
2543 | 2584 | struct drm_device *dev = crtc->dev; |
---|
2544 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2585 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2545 | 2586 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2546 | 2587 | unsigned type; |
---|
2547 | 2588 | |
---|
.. | .. |
---|
2595 | 2636 | { |
---|
2596 | 2637 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2597 | 2638 | struct drm_device *dev = crtc->dev; |
---|
2598 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2639 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2599 | 2640 | struct amdgpu_atom_ss ss; |
---|
2600 | 2641 | int i; |
---|
2601 | 2642 | |
---|
.. | .. |
---|
2665 | 2706 | { |
---|
2666 | 2707 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2667 | 2708 | struct drm_device *dev = crtc->dev; |
---|
2668 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2709 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2669 | 2710 | |
---|
2670 | 2711 | if (!amdgpu_crtc->adjusted_clock) |
---|
2671 | 2712 | return -EINVAL; |
---|
.. | .. |
---|
2756 | 2797 | .prepare = dce_v11_0_crtc_prepare, |
---|
2757 | 2798 | .commit = dce_v11_0_crtc_commit, |
---|
2758 | 2799 | .disable = dce_v11_0_crtc_disable, |
---|
| 2800 | + .get_scanout_position = amdgpu_crtc_get_scanout_position, |
---|
2759 | 2801 | }; |
---|
2760 | 2802 | |
---|
2761 | 2803 | static int dce_v11_0_crtc_init(struct amdgpu_device *adev, int index) |
---|
.. | .. |
---|
2767 | 2809 | if (amdgpu_crtc == NULL) |
---|
2768 | 2810 | return -ENOMEM; |
---|
2769 | 2811 | |
---|
2770 | | - drm_crtc_init(adev->ddev, &amdgpu_crtc->base, &dce_v11_0_crtc_funcs); |
---|
| 2812 | + drm_crtc_init(adev_to_drm(adev), &amdgpu_crtc->base, &dce_v11_0_crtc_funcs); |
---|
2771 | 2813 | |
---|
2772 | 2814 | drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256); |
---|
2773 | 2815 | amdgpu_crtc->crtc_id = index; |
---|
.. | .. |
---|
2775 | 2817 | |
---|
2776 | 2818 | amdgpu_crtc->max_cursor_width = 128; |
---|
2777 | 2819 | amdgpu_crtc->max_cursor_height = 128; |
---|
2778 | | - adev->ddev->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
---|
2779 | | - adev->ddev->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
---|
| 2820 | + adev_to_drm(adev)->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
---|
| 2821 | + adev_to_drm(adev)->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
---|
2780 | 2822 | |
---|
2781 | 2823 | switch (amdgpu_crtc->crtc_id) { |
---|
2782 | 2824 | case 0: |
---|
.. | .. |
---|
2855 | 2897 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
2856 | 2898 | |
---|
2857 | 2899 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
---|
2858 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
---|
| 2900 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
---|
2859 | 2901 | if (r) |
---|
2860 | 2902 | return r; |
---|
2861 | 2903 | } |
---|
2862 | 2904 | |
---|
2863 | 2905 | for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP; i < 20; i += 2) { |
---|
2864 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
---|
| 2906 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
---|
2865 | 2907 | if (r) |
---|
2866 | 2908 | return r; |
---|
2867 | 2909 | } |
---|
2868 | 2910 | |
---|
2869 | 2911 | /* HPD hotplug */ |
---|
2870 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); |
---|
| 2912 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); |
---|
2871 | 2913 | if (r) |
---|
2872 | 2914 | return r; |
---|
2873 | 2915 | |
---|
2874 | | - adev->ddev->mode_config.funcs = &amdgpu_mode_funcs; |
---|
| 2916 | + adev_to_drm(adev)->mode_config.funcs = &amdgpu_mode_funcs; |
---|
2875 | 2917 | |
---|
2876 | | - adev->ddev->mode_config.async_page_flip = true; |
---|
| 2918 | + adev_to_drm(adev)->mode_config.async_page_flip = true; |
---|
2877 | 2919 | |
---|
2878 | | - adev->ddev->mode_config.max_width = 16384; |
---|
2879 | | - adev->ddev->mode_config.max_height = 16384; |
---|
| 2920 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
---|
| 2921 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
---|
2880 | 2922 | |
---|
2881 | | - adev->ddev->mode_config.preferred_depth = 24; |
---|
2882 | | - adev->ddev->mode_config.prefer_shadow = 1; |
---|
| 2923 | + adev_to_drm(adev)->mode_config.preferred_depth = 24; |
---|
| 2924 | + adev_to_drm(adev)->mode_config.prefer_shadow = 1; |
---|
2883 | 2925 | |
---|
2884 | | - adev->ddev->mode_config.fb_base = adev->gmc.aper_base; |
---|
| 2926 | + adev_to_drm(adev)->mode_config.fb_base = adev->gmc.aper_base; |
---|
2885 | 2927 | |
---|
2886 | 2928 | r = amdgpu_display_modeset_create_props(adev); |
---|
2887 | 2929 | if (r) |
---|
2888 | 2930 | return r; |
---|
2889 | 2931 | |
---|
2890 | | - adev->ddev->mode_config.max_width = 16384; |
---|
2891 | | - adev->ddev->mode_config.max_height = 16384; |
---|
| 2932 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
---|
| 2933 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
---|
2892 | 2934 | |
---|
2893 | 2935 | |
---|
2894 | 2936 | /* allocate crtcs */ |
---|
.. | .. |
---|
2899 | 2941 | } |
---|
2900 | 2942 | |
---|
2901 | 2943 | if (amdgpu_atombios_get_connector_info_from_object_table(adev)) |
---|
2902 | | - amdgpu_display_print_display_setup(adev->ddev); |
---|
| 2944 | + amdgpu_display_print_display_setup(adev_to_drm(adev)); |
---|
2903 | 2945 | else |
---|
2904 | 2946 | return -EINVAL; |
---|
2905 | 2947 | |
---|
.. | .. |
---|
2912 | 2954 | if (r) |
---|
2913 | 2955 | return r; |
---|
2914 | 2956 | |
---|
2915 | | - drm_kms_helper_poll_init(adev->ddev); |
---|
| 2957 | + drm_kms_helper_poll_init(adev_to_drm(adev)); |
---|
2916 | 2958 | |
---|
2917 | 2959 | adev->mode_info.mode_config_initialized = true; |
---|
2918 | 2960 | return 0; |
---|
.. | .. |
---|
2924 | 2966 | |
---|
2925 | 2967 | kfree(adev->mode_info.bios_hardcoded_edid); |
---|
2926 | 2968 | |
---|
2927 | | - drm_kms_helper_poll_fini(adev->ddev); |
---|
| 2969 | + drm_kms_helper_poll_fini(adev_to_drm(adev)); |
---|
2928 | 2970 | |
---|
2929 | 2971 | dce_v11_0_audio_fini(adev); |
---|
2930 | 2972 | |
---|
2931 | 2973 | dce_v11_0_afmt_fini(adev); |
---|
2932 | 2974 | |
---|
2933 | | - drm_mode_config_cleanup(adev->ddev); |
---|
| 2975 | + drm_mode_config_cleanup(adev_to_drm(adev)); |
---|
2934 | 2976 | adev->mode_info.mode_config_initialized = false; |
---|
2935 | 2977 | |
---|
2936 | 2978 | return 0; |
---|
.. | .. |
---|
3241 | 3283 | if(amdgpu_crtc == NULL) |
---|
3242 | 3284 | return 0; |
---|
3243 | 3285 | |
---|
3244 | | - spin_lock_irqsave(&adev->ddev->event_lock, flags); |
---|
| 3286 | + spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags); |
---|
3245 | 3287 | works = amdgpu_crtc->pflip_works; |
---|
3246 | 3288 | if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED){ |
---|
3247 | 3289 | DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " |
---|
3248 | 3290 | "AMDGPU_FLIP_SUBMITTED(%d)\n", |
---|
3249 | 3291 | amdgpu_crtc->pflip_status, |
---|
3250 | 3292 | AMDGPU_FLIP_SUBMITTED); |
---|
3251 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
---|
| 3293 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
---|
3252 | 3294 | return 0; |
---|
3253 | 3295 | } |
---|
3254 | 3296 | |
---|
.. | .. |
---|
3260 | 3302 | if(works->event) |
---|
3261 | 3303 | drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event); |
---|
3262 | 3304 | |
---|
3263 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
---|
| 3305 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
---|
3264 | 3306 | |
---|
3265 | 3307 | drm_crtc_vblank_put(&amdgpu_crtc->base); |
---|
3266 | 3308 | schedule_work(&works->unpin_work); |
---|
.. | .. |
---|
3330 | 3372 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
---|
3331 | 3373 | |
---|
3332 | 3374 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
---|
3333 | | - drm_handle_vblank(adev->ddev, crtc); |
---|
| 3375 | + drm_handle_vblank(adev_to_drm(adev), crtc); |
---|
3334 | 3376 | } |
---|
3335 | 3377 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); |
---|
3336 | 3378 | |
---|
.. | .. |
---|
3429 | 3471 | |
---|
3430 | 3472 | static void dce_v11_0_encoder_prepare(struct drm_encoder *encoder) |
---|
3431 | 3473 | { |
---|
3432 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 3474 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
---|
3433 | 3475 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
3434 | 3476 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
3435 | 3477 | |
---|
.. | .. |
---|
3469 | 3511 | static void dce_v11_0_encoder_commit(struct drm_encoder *encoder) |
---|
3470 | 3512 | { |
---|
3471 | 3513 | struct drm_device *dev = encoder->dev; |
---|
3472 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 3514 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
3473 | 3515 | |
---|
3474 | 3516 | /* need to call this here as we need the crtc set up */ |
---|
3475 | 3517 | amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_ON); |
---|
.. | .. |
---|
3569 | 3611 | uint32_t supported_device, |
---|
3570 | 3612 | u16 caps) |
---|
3571 | 3613 | { |
---|
3572 | | - struct drm_device *dev = adev->ddev; |
---|
| 3614 | + struct drm_device *dev = adev_to_drm(adev); |
---|
3573 | 3615 | struct drm_encoder *encoder; |
---|
3574 | 3616 | struct amdgpu_encoder *amdgpu_encoder; |
---|
3575 | 3617 | |
---|
.. | .. |
---|
3690 | 3732 | |
---|
3691 | 3733 | static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev) |
---|
3692 | 3734 | { |
---|
3693 | | - if (adev->mode_info.funcs == NULL) |
---|
3694 | | - adev->mode_info.funcs = &dce_v11_0_display_funcs; |
---|
| 3735 | + adev->mode_info.funcs = &dce_v11_0_display_funcs; |
---|
3695 | 3736 | } |
---|
3696 | 3737 | |
---|
3697 | 3738 | static const struct amdgpu_irq_src_funcs dce_v11_0_crtc_irq_funcs = { |
---|