.. | .. |
---|
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_v8_0.h" |
---|
35 | 39 | |
---|
36 | 40 | #include "dce/dce_8_0_d.h" |
---|
.. | .. |
---|
180 | 184 | int crtc_id, u64 crtc_base, bool async) |
---|
181 | 185 | { |
---|
182 | 186 | struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; |
---|
| 187 | + struct drm_framebuffer *fb = amdgpu_crtc->base.primary->fb; |
---|
183 | 188 | |
---|
184 | 189 | /* flip at hsync for async, default is vsync */ |
---|
185 | 190 | WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, async ? |
---|
186 | 191 | GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK : 0); |
---|
| 192 | + /* update pitch */ |
---|
| 193 | + WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, |
---|
| 194 | + fb->pitches[0] / fb->format->cpp[0]); |
---|
187 | 195 | /* update the primary scanout addresses */ |
---|
188 | 196 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
---|
189 | 197 | upper_32_bits(crtc_base)); |
---|
.. | .. |
---|
265 | 273 | */ |
---|
266 | 274 | static void dce_v8_0_hpd_init(struct amdgpu_device *adev) |
---|
267 | 275 | { |
---|
268 | | - struct drm_device *dev = adev->ddev; |
---|
| 276 | + struct drm_device *dev = adev_to_drm(adev); |
---|
269 | 277 | struct drm_connector *connector; |
---|
| 278 | + struct drm_connector_list_iter iter; |
---|
270 | 279 | u32 tmp; |
---|
271 | 280 | |
---|
272 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
---|
| 281 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 282 | + drm_for_each_connector_iter(connector, &iter) { |
---|
273 | 283 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
---|
274 | 284 | |
---|
275 | 285 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
---|
.. | .. |
---|
295 | 305 | dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); |
---|
296 | 306 | amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); |
---|
297 | 307 | } |
---|
| 308 | + drm_connector_list_iter_end(&iter); |
---|
298 | 309 | } |
---|
299 | 310 | |
---|
300 | 311 | /** |
---|
.. | .. |
---|
307 | 318 | */ |
---|
308 | 319 | static void dce_v8_0_hpd_fini(struct amdgpu_device *adev) |
---|
309 | 320 | { |
---|
310 | | - struct drm_device *dev = adev->ddev; |
---|
| 321 | + struct drm_device *dev = adev_to_drm(adev); |
---|
311 | 322 | struct drm_connector *connector; |
---|
| 323 | + struct drm_connector_list_iter iter; |
---|
312 | 324 | u32 tmp; |
---|
313 | 325 | |
---|
314 | | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
---|
| 326 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 327 | + drm_for_each_connector_iter(connector, &iter) { |
---|
315 | 328 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); |
---|
316 | 329 | |
---|
317 | 330 | if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) |
---|
.. | .. |
---|
323 | 336 | |
---|
324 | 337 | amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); |
---|
325 | 338 | } |
---|
| 339 | + drm_connector_list_iter_end(&iter); |
---|
326 | 340 | } |
---|
327 | 341 | |
---|
328 | 342 | static u32 dce_v8_0_hpd_get_gpio_reg(struct amdgpu_device *adev) |
---|
.. | .. |
---|
430 | 444 | static void dce_v8_0_program_fmt(struct drm_encoder *encoder) |
---|
431 | 445 | { |
---|
432 | 446 | struct drm_device *dev = encoder->dev; |
---|
433 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 447 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
434 | 448 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
435 | 449 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
---|
436 | 450 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
.. | .. |
---|
1132 | 1146 | |
---|
1133 | 1147 | static void dce_v8_0_afmt_audio_select_pin(struct drm_encoder *encoder) |
---|
1134 | 1148 | { |
---|
1135 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1149 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
---|
1136 | 1150 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1137 | 1151 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1138 | 1152 | u32 offset; |
---|
.. | .. |
---|
1149 | 1163 | static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder, |
---|
1150 | 1164 | struct drm_display_mode *mode) |
---|
1151 | 1165 | { |
---|
1152 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1166 | + struct drm_device *dev = encoder->dev; |
---|
| 1167 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1153 | 1168 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1154 | 1169 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1155 | 1170 | struct drm_connector *connector; |
---|
| 1171 | + struct drm_connector_list_iter iter; |
---|
1156 | 1172 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1157 | 1173 | u32 tmp = 0, offset; |
---|
1158 | 1174 | |
---|
.. | .. |
---|
1161 | 1177 | |
---|
1162 | 1178 | offset = dig->afmt->pin->offset; |
---|
1163 | 1179 | |
---|
1164 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1180 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1181 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1165 | 1182 | if (connector->encoder == encoder) { |
---|
1166 | 1183 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1167 | 1184 | break; |
---|
1168 | 1185 | } |
---|
1169 | 1186 | } |
---|
| 1187 | + drm_connector_list_iter_end(&iter); |
---|
1170 | 1188 | |
---|
1171 | 1189 | if (!amdgpu_connector) { |
---|
1172 | 1190 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1206 | 1224 | |
---|
1207 | 1225 | static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder) |
---|
1208 | 1226 | { |
---|
1209 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1227 | + struct drm_device *dev = encoder->dev; |
---|
| 1228 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1210 | 1229 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1211 | 1230 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1212 | 1231 | struct drm_connector *connector; |
---|
| 1232 | + struct drm_connector_list_iter iter; |
---|
1213 | 1233 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1214 | 1234 | u32 offset, tmp; |
---|
1215 | 1235 | u8 *sadb = NULL; |
---|
.. | .. |
---|
1220 | 1240 | |
---|
1221 | 1241 | offset = dig->afmt->pin->offset; |
---|
1222 | 1242 | |
---|
1223 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1243 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1244 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1224 | 1245 | if (connector->encoder == encoder) { |
---|
1225 | 1246 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1226 | 1247 | break; |
---|
1227 | 1248 | } |
---|
1228 | 1249 | } |
---|
| 1250 | + drm_connector_list_iter_end(&iter); |
---|
1229 | 1251 | |
---|
1230 | 1252 | if (!amdgpu_connector) { |
---|
1231 | 1253 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1255 | 1277 | |
---|
1256 | 1278 | static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder) |
---|
1257 | 1279 | { |
---|
1258 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 1280 | + struct drm_device *dev = encoder->dev; |
---|
| 1281 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1259 | 1282 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1260 | 1283 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1261 | 1284 | u32 offset; |
---|
1262 | 1285 | struct drm_connector *connector; |
---|
| 1286 | + struct drm_connector_list_iter iter; |
---|
1263 | 1287 | struct amdgpu_connector *amdgpu_connector = NULL; |
---|
1264 | 1288 | struct cea_sad *sads; |
---|
1265 | 1289 | int i, sad_count; |
---|
.. | .. |
---|
1284 | 1308 | |
---|
1285 | 1309 | offset = dig->afmt->pin->offset; |
---|
1286 | 1310 | |
---|
1287 | | - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
---|
| 1311 | + drm_connector_list_iter_begin(dev, &iter); |
---|
| 1312 | + drm_for_each_connector_iter(connector, &iter) { |
---|
1288 | 1313 | if (connector->encoder == encoder) { |
---|
1289 | 1314 | amdgpu_connector = to_amdgpu_connector(connector); |
---|
1290 | 1315 | break; |
---|
1291 | 1316 | } |
---|
1292 | 1317 | } |
---|
| 1318 | + drm_connector_list_iter_end(&iter); |
---|
1293 | 1319 | |
---|
1294 | 1320 | if (!amdgpu_connector) { |
---|
1295 | 1321 | DRM_ERROR("Couldn't find encoder's connector\n"); |
---|
.. | .. |
---|
1297 | 1323 | } |
---|
1298 | 1324 | |
---|
1299 | 1325 | sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads); |
---|
1300 | | - if (sad_count <= 0) { |
---|
| 1326 | + if (sad_count < 0) |
---|
1301 | 1327 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); |
---|
| 1328 | + if (sad_count <= 0) |
---|
1302 | 1329 | return; |
---|
1303 | | - } |
---|
1304 | 1330 | BUG_ON(!sads); |
---|
1305 | 1331 | |
---|
1306 | 1332 | for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { |
---|
.. | .. |
---|
1420 | 1446 | static void dce_v8_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock) |
---|
1421 | 1447 | { |
---|
1422 | 1448 | struct drm_device *dev = encoder->dev; |
---|
1423 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1449 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1424 | 1450 | struct amdgpu_afmt_acr acr = amdgpu_afmt_acr(clock); |
---|
1425 | 1451 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1426 | 1452 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
.. | .. |
---|
1443 | 1469 | void *buffer, size_t size) |
---|
1444 | 1470 | { |
---|
1445 | 1471 | struct drm_device *dev = encoder->dev; |
---|
1446 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1472 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1447 | 1473 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1448 | 1474 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1449 | 1475 | uint32_t offset = dig->afmt->offset; |
---|
.. | .. |
---|
1463 | 1489 | static void dce_v8_0_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
---|
1464 | 1490 | { |
---|
1465 | 1491 | struct drm_device *dev = encoder->dev; |
---|
1466 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1492 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1467 | 1493 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1468 | 1494 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1469 | 1495 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc); |
---|
.. | .. |
---|
1490 | 1516 | struct drm_display_mode *mode) |
---|
1491 | 1517 | { |
---|
1492 | 1518 | struct drm_device *dev = encoder->dev; |
---|
1493 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1519 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1494 | 1520 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1495 | 1521 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1496 | 1522 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
.. | .. |
---|
1615 | 1641 | dce_v8_0_audio_write_sad_regs(encoder); |
---|
1616 | 1642 | dce_v8_0_audio_write_latency_fields(encoder, mode); |
---|
1617 | 1643 | |
---|
1618 | | - err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); |
---|
| 1644 | + err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
---|
1619 | 1645 | if (err < 0) { |
---|
1620 | 1646 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
---|
1621 | 1647 | return; |
---|
.. | .. |
---|
1652 | 1678 | static void dce_v8_0_afmt_enable(struct drm_encoder *encoder, bool enable) |
---|
1653 | 1679 | { |
---|
1654 | 1680 | struct drm_device *dev = encoder->dev; |
---|
1655 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1681 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1656 | 1682 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
1657 | 1683 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
---|
1658 | 1684 | |
---|
.. | .. |
---|
1725 | 1751 | { |
---|
1726 | 1752 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1727 | 1753 | struct drm_device *dev = crtc->dev; |
---|
1728 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1754 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1729 | 1755 | u32 vga_control; |
---|
1730 | 1756 | |
---|
1731 | 1757 | vga_control = RREG32(vga_control_regs[amdgpu_crtc->crtc_id]) & ~1; |
---|
.. | .. |
---|
1739 | 1765 | { |
---|
1740 | 1766 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1741 | 1767 | struct drm_device *dev = crtc->dev; |
---|
1742 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1768 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1743 | 1769 | |
---|
1744 | 1770 | if (enable) |
---|
1745 | 1771 | WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 1); |
---|
.. | .. |
---|
1753 | 1779 | { |
---|
1754 | 1780 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1755 | 1781 | struct drm_device *dev = crtc->dev; |
---|
1756 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 1782 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1757 | 1783 | struct drm_framebuffer *target_fb; |
---|
1758 | 1784 | struct drm_gem_object *obj; |
---|
1759 | 1785 | struct amdgpu_bo *abo; |
---|
.. | .. |
---|
1864 | 1890 | /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */ |
---|
1865 | 1891 | bypass_lut = true; |
---|
1866 | 1892 | break; |
---|
| 1893 | + case DRM_FORMAT_XBGR8888: |
---|
| 1894 | + case DRM_FORMAT_ABGR8888: |
---|
| 1895 | + fb_format = ((GRPH_DEPTH_32BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) | |
---|
| 1896 | + (GRPH_FORMAT_ARGB8888 << GRPH_CONTROL__GRPH_FORMAT__SHIFT)); |
---|
| 1897 | + fb_swap = ((GRPH_RED_SEL_B << GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR__SHIFT) | |
---|
| 1898 | + (GRPH_BLUE_SEL_R << GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR__SHIFT)); |
---|
| 1899 | +#ifdef __BIG_ENDIAN |
---|
| 1900 | + fb_swap |= (GRPH_ENDIAN_8IN32 << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT); |
---|
| 1901 | +#endif |
---|
| 1902 | + break; |
---|
1867 | 1903 | default: |
---|
1868 | 1904 | DRM_ERROR("Unsupported screen format %s\n", |
---|
1869 | 1905 | drm_get_format_name(target_fb->format->format, &format_name)); |
---|
.. | .. |
---|
1968 | 2004 | struct drm_display_mode *mode) |
---|
1969 | 2005 | { |
---|
1970 | 2006 | struct drm_device *dev = crtc->dev; |
---|
1971 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2007 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1972 | 2008 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1973 | 2009 | |
---|
1974 | 2010 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
---|
.. | .. |
---|
1982 | 2018 | { |
---|
1983 | 2019 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
1984 | 2020 | struct drm_device *dev = crtc->dev; |
---|
1985 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2021 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
1986 | 2022 | u16 *r, *g, *b; |
---|
1987 | 2023 | int i; |
---|
1988 | 2024 | |
---|
.. | .. |
---|
2104 | 2140 | { |
---|
2105 | 2141 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2106 | 2142 | struct drm_device *dev = crtc->dev; |
---|
2107 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2143 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2108 | 2144 | u32 pll_in_use; |
---|
2109 | 2145 | int pll; |
---|
2110 | 2146 | |
---|
.. | .. |
---|
2152 | 2188 | |
---|
2153 | 2189 | static void dce_v8_0_lock_cursor(struct drm_crtc *crtc, bool lock) |
---|
2154 | 2190 | { |
---|
2155 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2191 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2156 | 2192 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2157 | 2193 | uint32_t cur_lock; |
---|
2158 | 2194 | |
---|
.. | .. |
---|
2167 | 2203 | static void dce_v8_0_hide_cursor(struct drm_crtc *crtc) |
---|
2168 | 2204 | { |
---|
2169 | 2205 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2170 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2206 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2171 | 2207 | |
---|
2172 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, |
---|
2173 | | - (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | |
---|
2174 | | - (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); |
---|
| 2208 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, |
---|
| 2209 | + (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | |
---|
| 2210 | + (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); |
---|
2175 | 2211 | } |
---|
2176 | 2212 | |
---|
2177 | 2213 | static void dce_v8_0_show_cursor(struct drm_crtc *crtc) |
---|
2178 | 2214 | { |
---|
2179 | 2215 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2180 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2216 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2181 | 2217 | |
---|
2182 | 2218 | WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, |
---|
2183 | 2219 | upper_32_bits(amdgpu_crtc->cursor_addr)); |
---|
2184 | 2220 | WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, |
---|
2185 | 2221 | lower_32_bits(amdgpu_crtc->cursor_addr)); |
---|
2186 | 2222 | |
---|
2187 | | - WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, |
---|
2188 | | - CUR_CONTROL__CURSOR_EN_MASK | |
---|
2189 | | - (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | |
---|
2190 | | - (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); |
---|
| 2223 | + WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, |
---|
| 2224 | + CUR_CONTROL__CURSOR_EN_MASK | |
---|
| 2225 | + (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | |
---|
| 2226 | + (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); |
---|
2191 | 2227 | } |
---|
2192 | 2228 | |
---|
2193 | 2229 | static int dce_v8_0_cursor_move_locked(struct drm_crtc *crtc, |
---|
2194 | 2230 | int x, int y) |
---|
2195 | 2231 | { |
---|
2196 | 2232 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2197 | | - struct amdgpu_device *adev = crtc->dev->dev_private; |
---|
| 2233 | + struct amdgpu_device *adev = drm_to_adev(crtc->dev); |
---|
2198 | 2234 | int xorigin = 0, yorigin = 0; |
---|
2199 | 2235 | |
---|
2200 | 2236 | amdgpu_crtc->cursor_x = x; |
---|
.. | .. |
---|
2269 | 2305 | aobj = gem_to_amdgpu_bo(obj); |
---|
2270 | 2306 | ret = amdgpu_bo_reserve(aobj, false); |
---|
2271 | 2307 | if (ret != 0) { |
---|
2272 | | - drm_gem_object_put_unlocked(obj); |
---|
| 2308 | + drm_gem_object_put(obj); |
---|
2273 | 2309 | return ret; |
---|
2274 | 2310 | } |
---|
2275 | 2311 | |
---|
.. | .. |
---|
2277 | 2313 | amdgpu_bo_unreserve(aobj); |
---|
2278 | 2314 | if (ret) { |
---|
2279 | 2315 | DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret); |
---|
2280 | | - drm_gem_object_put_unlocked(obj); |
---|
| 2316 | + drm_gem_object_put(obj); |
---|
2281 | 2317 | return ret; |
---|
2282 | 2318 | } |
---|
2283 | 2319 | amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj); |
---|
.. | .. |
---|
2312 | 2348 | amdgpu_bo_unpin(aobj); |
---|
2313 | 2349 | amdgpu_bo_unreserve(aobj); |
---|
2314 | 2350 | } |
---|
2315 | | - drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo); |
---|
| 2351 | + drm_gem_object_put(amdgpu_crtc->cursor_bo); |
---|
2316 | 2352 | } |
---|
2317 | 2353 | |
---|
2318 | 2354 | amdgpu_crtc->cursor_bo = obj; |
---|
.. | .. |
---|
2359 | 2395 | .set_config = amdgpu_display_crtc_set_config, |
---|
2360 | 2396 | .destroy = dce_v8_0_crtc_destroy, |
---|
2361 | 2397 | .page_flip_target = amdgpu_display_crtc_page_flip_target, |
---|
| 2398 | + .get_vblank_counter = amdgpu_get_vblank_counter_kms, |
---|
| 2399 | + .enable_vblank = amdgpu_enable_vblank_kms, |
---|
| 2400 | + .disable_vblank = amdgpu_disable_vblank_kms, |
---|
| 2401 | + .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, |
---|
2362 | 2402 | }; |
---|
2363 | 2403 | |
---|
2364 | 2404 | static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
---|
2365 | 2405 | { |
---|
2366 | 2406 | struct drm_device *dev = crtc->dev; |
---|
2367 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2407 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2368 | 2408 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2369 | 2409 | unsigned type; |
---|
2370 | 2410 | |
---|
.. | .. |
---|
2418 | 2458 | { |
---|
2419 | 2459 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
---|
2420 | 2460 | struct drm_device *dev = crtc->dev; |
---|
2421 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 2461 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
2422 | 2462 | struct amdgpu_atom_ss ss; |
---|
2423 | 2463 | int i; |
---|
2424 | 2464 | |
---|
.. | .. |
---|
2557 | 2597 | .prepare = dce_v8_0_crtc_prepare, |
---|
2558 | 2598 | .commit = dce_v8_0_crtc_commit, |
---|
2559 | 2599 | .disable = dce_v8_0_crtc_disable, |
---|
| 2600 | + .get_scanout_position = amdgpu_crtc_get_scanout_position, |
---|
2560 | 2601 | }; |
---|
2561 | 2602 | |
---|
2562 | 2603 | static int dce_v8_0_crtc_init(struct amdgpu_device *adev, int index) |
---|
.. | .. |
---|
2568 | 2609 | if (amdgpu_crtc == NULL) |
---|
2569 | 2610 | return -ENOMEM; |
---|
2570 | 2611 | |
---|
2571 | | - drm_crtc_init(adev->ddev, &amdgpu_crtc->base, &dce_v8_0_crtc_funcs); |
---|
| 2612 | + drm_crtc_init(adev_to_drm(adev), &amdgpu_crtc->base, &dce_v8_0_crtc_funcs); |
---|
2572 | 2613 | |
---|
2573 | 2614 | drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256); |
---|
2574 | 2615 | amdgpu_crtc->crtc_id = index; |
---|
.. | .. |
---|
2576 | 2617 | |
---|
2577 | 2618 | amdgpu_crtc->max_cursor_width = CIK_CURSOR_WIDTH; |
---|
2578 | 2619 | amdgpu_crtc->max_cursor_height = CIK_CURSOR_HEIGHT; |
---|
2579 | | - adev->ddev->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
---|
2580 | | - adev->ddev->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
---|
| 2620 | + adev_to_drm(adev)->mode_config.cursor_width = amdgpu_crtc->max_cursor_width; |
---|
| 2621 | + adev_to_drm(adev)->mode_config.cursor_height = amdgpu_crtc->max_cursor_height; |
---|
2581 | 2622 | |
---|
2582 | 2623 | amdgpu_crtc->crtc_offset = crtc_offsets[amdgpu_crtc->crtc_id]; |
---|
2583 | 2624 | |
---|
.. | .. |
---|
2632 | 2673 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
2633 | 2674 | |
---|
2634 | 2675 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
---|
2635 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
---|
| 2676 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); |
---|
2636 | 2677 | if (r) |
---|
2637 | 2678 | return r; |
---|
2638 | 2679 | } |
---|
2639 | 2680 | |
---|
2640 | 2681 | for (i = 8; i < 20; i += 2) { |
---|
2641 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
---|
| 2682 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); |
---|
2642 | 2683 | if (r) |
---|
2643 | 2684 | return r; |
---|
2644 | 2685 | } |
---|
2645 | 2686 | |
---|
2646 | 2687 | /* HPD hotplug */ |
---|
2647 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 42, &adev->hpd_irq); |
---|
| 2688 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 42, &adev->hpd_irq); |
---|
2648 | 2689 | if (r) |
---|
2649 | 2690 | return r; |
---|
2650 | 2691 | |
---|
2651 | | - adev->ddev->mode_config.funcs = &amdgpu_mode_funcs; |
---|
| 2692 | + adev_to_drm(adev)->mode_config.funcs = &amdgpu_mode_funcs; |
---|
2652 | 2693 | |
---|
2653 | | - adev->ddev->mode_config.async_page_flip = true; |
---|
| 2694 | + adev_to_drm(adev)->mode_config.async_page_flip = true; |
---|
2654 | 2695 | |
---|
2655 | | - adev->ddev->mode_config.max_width = 16384; |
---|
2656 | | - adev->ddev->mode_config.max_height = 16384; |
---|
| 2696 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
---|
| 2697 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
---|
2657 | 2698 | |
---|
2658 | | - adev->ddev->mode_config.preferred_depth = 24; |
---|
2659 | | - adev->ddev->mode_config.prefer_shadow = 1; |
---|
| 2699 | + adev_to_drm(adev)->mode_config.preferred_depth = 24; |
---|
| 2700 | + adev_to_drm(adev)->mode_config.prefer_shadow = 1; |
---|
2660 | 2701 | |
---|
2661 | | - adev->ddev->mode_config.fb_base = adev->gmc.aper_base; |
---|
| 2702 | + adev_to_drm(adev)->mode_config.fb_base = adev->gmc.aper_base; |
---|
2662 | 2703 | |
---|
2663 | 2704 | r = amdgpu_display_modeset_create_props(adev); |
---|
2664 | 2705 | if (r) |
---|
2665 | 2706 | return r; |
---|
2666 | 2707 | |
---|
2667 | | - adev->ddev->mode_config.max_width = 16384; |
---|
2668 | | - adev->ddev->mode_config.max_height = 16384; |
---|
| 2708 | + adev_to_drm(adev)->mode_config.max_width = 16384; |
---|
| 2709 | + adev_to_drm(adev)->mode_config.max_height = 16384; |
---|
2669 | 2710 | |
---|
2670 | 2711 | /* allocate crtcs */ |
---|
2671 | 2712 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
---|
.. | .. |
---|
2675 | 2716 | } |
---|
2676 | 2717 | |
---|
2677 | 2718 | if (amdgpu_atombios_get_connector_info_from_object_table(adev)) |
---|
2678 | | - amdgpu_display_print_display_setup(adev->ddev); |
---|
| 2719 | + amdgpu_display_print_display_setup(adev_to_drm(adev)); |
---|
2679 | 2720 | else |
---|
2680 | 2721 | return -EINVAL; |
---|
2681 | 2722 | |
---|
.. | .. |
---|
2688 | 2729 | if (r) |
---|
2689 | 2730 | return r; |
---|
2690 | 2731 | |
---|
2691 | | - drm_kms_helper_poll_init(adev->ddev); |
---|
| 2732 | + drm_kms_helper_poll_init(adev_to_drm(adev)); |
---|
2692 | 2733 | |
---|
2693 | 2734 | adev->mode_info.mode_config_initialized = true; |
---|
2694 | 2735 | return 0; |
---|
.. | .. |
---|
2700 | 2741 | |
---|
2701 | 2742 | kfree(adev->mode_info.bios_hardcoded_edid); |
---|
2702 | 2743 | |
---|
2703 | | - drm_kms_helper_poll_fini(adev->ddev); |
---|
| 2744 | + drm_kms_helper_poll_fini(adev_to_drm(adev)); |
---|
2704 | 2745 | |
---|
2705 | 2746 | dce_v8_0_audio_fini(adev); |
---|
2706 | 2747 | |
---|
2707 | 2748 | dce_v8_0_afmt_fini(adev); |
---|
2708 | 2749 | |
---|
2709 | | - drm_mode_config_cleanup(adev->ddev); |
---|
| 2750 | + drm_mode_config_cleanup(adev_to_drm(adev)); |
---|
2710 | 2751 | adev->mode_info.mode_config_initialized = false; |
---|
2711 | 2752 | |
---|
2712 | 2753 | return 0; |
---|
.. | .. |
---|
3016 | 3057 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
---|
3017 | 3058 | |
---|
3018 | 3059 | if (amdgpu_irq_enabled(adev, source, irq_type)) { |
---|
3019 | | - drm_handle_vblank(adev->ddev, crtc); |
---|
| 3060 | + drm_handle_vblank(adev_to_drm(adev), crtc); |
---|
3020 | 3061 | } |
---|
3021 | 3062 | DRM_DEBUG("IH: D%d vblank\n", crtc + 1); |
---|
3022 | 3063 | break; |
---|
.. | .. |
---|
3085 | 3126 | if (amdgpu_crtc == NULL) |
---|
3086 | 3127 | return 0; |
---|
3087 | 3128 | |
---|
3088 | | - spin_lock_irqsave(&adev->ddev->event_lock, flags); |
---|
| 3129 | + spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags); |
---|
3089 | 3130 | works = amdgpu_crtc->pflip_works; |
---|
3090 | 3131 | if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED){ |
---|
3091 | 3132 | DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " |
---|
3092 | 3133 | "AMDGPU_FLIP_SUBMITTED(%d)\n", |
---|
3093 | 3134 | amdgpu_crtc->pflip_status, |
---|
3094 | 3135 | AMDGPU_FLIP_SUBMITTED); |
---|
3095 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
---|
| 3136 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
---|
3096 | 3137 | return 0; |
---|
3097 | 3138 | } |
---|
3098 | 3139 | |
---|
.. | .. |
---|
3104 | 3145 | if (works->event) |
---|
3105 | 3146 | drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event); |
---|
3106 | 3147 | |
---|
3107 | | - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
---|
| 3148 | + spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags); |
---|
3108 | 3149 | |
---|
3109 | 3150 | drm_crtc_vblank_put(&amdgpu_crtc->base); |
---|
3110 | 3151 | schedule_work(&works->unpin_work); |
---|
.. | .. |
---|
3192 | 3233 | |
---|
3193 | 3234 | static void dce_v8_0_encoder_prepare(struct drm_encoder *encoder) |
---|
3194 | 3235 | { |
---|
3195 | | - struct amdgpu_device *adev = encoder->dev->dev_private; |
---|
| 3236 | + struct amdgpu_device *adev = drm_to_adev(encoder->dev); |
---|
3196 | 3237 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
---|
3197 | 3238 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); |
---|
3198 | 3239 | |
---|
.. | .. |
---|
3232 | 3273 | static void dce_v8_0_encoder_commit(struct drm_encoder *encoder) |
---|
3233 | 3274 | { |
---|
3234 | 3275 | struct drm_device *dev = encoder->dev; |
---|
3235 | | - struct amdgpu_device *adev = dev->dev_private; |
---|
| 3276 | + struct amdgpu_device *adev = drm_to_adev(dev); |
---|
3236 | 3277 | |
---|
3237 | 3278 | /* need to call this here as we need the crtc set up */ |
---|
3238 | 3279 | amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_ON); |
---|
.. | .. |
---|
3332 | 3373 | uint32_t supported_device, |
---|
3333 | 3374 | u16 caps) |
---|
3334 | 3375 | { |
---|
3335 | | - struct drm_device *dev = adev->ddev; |
---|
| 3376 | + struct drm_device *dev = adev_to_drm(adev); |
---|
3336 | 3377 | struct drm_encoder *encoder; |
---|
3337 | 3378 | struct amdgpu_encoder *amdgpu_encoder; |
---|
3338 | 3379 | |
---|
.. | .. |
---|
3447 | 3488 | |
---|
3448 | 3489 | static void dce_v8_0_set_display_funcs(struct amdgpu_device *adev) |
---|
3449 | 3490 | { |
---|
3450 | | - if (adev->mode_info.funcs == NULL) |
---|
3451 | | - adev->mode_info.funcs = &dce_v8_0_display_funcs; |
---|
| 3491 | + adev->mode_info.funcs = &dce_v8_0_display_funcs; |
---|
3452 | 3492 | } |
---|
3453 | 3493 | |
---|
3454 | 3494 | static const struct amdgpu_irq_src_funcs dce_v8_0_crtc_irq_funcs = { |
---|