| .. | .. |
|---|
| 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 = { |
|---|