]> Git Repo - linux.git/commitdiff
Merge tag 'drm-misc-next-2018-06-21' of git://anongit.freedesktop.org/drm/drm-misc...
authorDave Airlie <[email protected]>
Fri, 22 Jun 2018 02:56:48 +0000 (12:56 +1000)
committerDave Airlie <[email protected]>
Fri, 22 Jun 2018 02:58:08 +0000 (12:58 +1000)
drm-misc-next for 4.19:

UAPI Changes:
- Add writeback connector (Brian Starkey/Liviu Dudau)
- Add "content type" property to HDMI connectors (Stanislav Lisovskiy)

Cross-subsystem Changes:
- some devicetree Docs update
- fix compile breakage on ION due to the dma-buf cleanups (Christian König)

Core Changes:
- Reject over-sized allocation requests early (Chris Wilson)
- gem-fb-helper: Always do implicit sync (Daniel Vetter)
- dma-buf cleanups (Christian König)

Driver Changes:
- Fixes for the otm8009a panel driver (Philippe Cornu)
- Add Innolux TV123WAM panel driver support (Sandeep Panda)
- Move GEM BO to drm_framebuffer in few drivers (Daniel Stone)
- i915 pinning improvements (Chris Wilson)
- Stop consulting plane->fb/crtc in a few drivers (Ville Syrjälä)

Signed-off-by: Dave Airlie <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/20180621105428.GA20795@juma
15 files changed:
1  2 
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/selftests/test-drm_mm.c
drivers/gpu/drm/vc4/vc4_plane.c
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
drivers/gpu/drm/xen/xen_drm_front.c
drivers/staging/android/ion/ion.c
drivers/tee/tee_shm.c

index f9add85157e7355432aab9d0d14728f8906774f9,92eb181b63e92e27c5ddb8a895015b7556c801f1..a1dd49545a5b10430b1f4553a592bd32631e2f42
@@@ -3914,8 -3914,6 +3914,6 @@@ static void amdgpu_dm_do_flip(struct dr
  
        /* Flip */
        spin_lock_irqsave(&crtc->dev->event_lock, flags);
-       /* update crtc fb */
-       crtc->primary->fb = fb;
  
        WARN_ON(acrtc->pflip_status != AMDGPU_FLIP_NONE);
        WARN_ON(!acrtc_state->stream);
@@@ -4627,8 -4625,8 +4625,8 @@@ static int dm_update_crtcs_state(struc
        for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                struct amdgpu_crtc *acrtc = NULL;
                struct amdgpu_dm_connector *aconnector = NULL;
 -              struct drm_connector_state *new_con_state = NULL;
 -              struct dm_connector_state *dm_conn_state = NULL;
 +              struct drm_connector_state *drm_new_conn_state = NULL, *drm_old_conn_state = NULL;
 +              struct dm_connector_state *dm_new_conn_state = NULL, *dm_old_conn_state = NULL;
                struct drm_plane_state *new_plane_state = NULL;
  
                new_stream = NULL;
                /* TODO This hack should go away */
                if (aconnector && enable) {
                        // Make sure fake sink is created in plug-in scenario
 -                      new_con_state = drm_atomic_get_connector_state(state,
 +                      drm_new_conn_state = drm_atomic_get_new_connector_state(state,
 +                                                                  &aconnector->base);
 +                      drm_old_conn_state = drm_atomic_get_old_connector_state(state,
                                                                    &aconnector->base);
  
 -                      if (IS_ERR(new_con_state)) {
 -                              ret = PTR_ERR_OR_ZERO(new_con_state);
 +                      if (IS_ERR(drm_new_conn_state)) {
 +                              ret = PTR_ERR_OR_ZERO(drm_new_conn_state);
                                break;
                        }
  
 -                      dm_conn_state = to_dm_connector_state(new_con_state);
 +                      dm_new_conn_state = to_dm_connector_state(drm_new_conn_state);
 +                      dm_old_conn_state = to_dm_connector_state(drm_old_conn_state);
  
                        new_stream = create_stream_for_sink(aconnector,
                                                             &new_crtc_state->mode,
 -                                                          dm_conn_state);
 +                                                          dm_new_conn_state);
  
                        /*
                         * we can have no stream on ACTION_SET if a display
@@@ -4783,17 -4778,8 +4781,17 @@@ next_crtc
                 */
                BUG_ON(dm_new_crtc_state->stream == NULL);
  
 -              /* Color managment settings */
 -              if (dm_new_crtc_state->base.color_mgmt_changed) {
 +              /* Scaling or underscan settings */
 +              if (is_scaling_state_different(dm_old_conn_state, dm_new_conn_state))
 +                      update_stream_scaling_settings(
 +                              &new_crtc_state->mode, dm_new_conn_state, dm_new_crtc_state->stream);
 +
 +              /*
 +               * Color management settings. We also update color properties
 +               * when a modeset is needed, to ensure it gets reprogrammed.
 +               */
 +              if (dm_new_crtc_state->base.color_mgmt_changed ||
 +                  drm_atomic_crtc_needs_modeset(new_crtc_state)) {
                        ret = amdgpu_dm_set_regamma_lut(dm_new_crtc_state);
                        if (ret)
                                goto fail;
index a5808382bdf0333b2124a4ecf0d85c4346814000,87654b8b279c39b37a83756234eccd5926455970..5dc742b27ca033652880ceaabc1257ae5b633328
@@@ -163,8 -163,9 +163,9 @@@ static const struct edid_quirk 
        /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
        { "ETR", 13896, EDID_QUIRK_FORCE_8BPC },
  
-       /* HTC Vive VR Headset */
+       /* HTC Vive and Vive Pro VR Headsets */
        { "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP },
+       { "HVR", 0xaa02, EDID_QUIRK_NON_DESKTOP },
  
        /* Oculus Rift DK1, DK2, and CV1 VR Headsets */
        { "OVR", 0x0001, EDID_QUIRK_NON_DESKTOP },
@@@ -687,562 -688,562 +688,562 @@@ static const struct minimode extra_mode
  static const struct drm_display_mode edid_cea_modes[] = {
        /* 0 - dummy, VICs start at 1 */
        { },
-       /* 1 - 640x480@60Hz */
+       /* 1 - 640x480@60Hz 4:3 */
        { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
                   752, 800, 0, 480, 490, 492, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 2 - 720x480@60Hz */
+       /* 2 - 720x480@60Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 3 - 720x480@60Hz */
+       /* 3 - 720x480@60Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 4 - 1280x720@60Hz */
+       /* 4 - 1280x720@60Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 5 - 1920x1080i@60Hz */
+       /* 5 - 1920x1080i@60Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 6 - 720(1440)x480i@60Hz */
+       /* 6 - 720(1440)x480i@60Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 7 - 720(1440)x480i@60Hz */
+       /* 7 - 720(1440)x480i@60Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 8 - 720(1440)x240@60Hz */
+       /* 8 - 720(1440)x240@60Hz 4:3 */
        { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 9 - 720(1440)x240@60Hz */
+       /* 9 - 720(1440)x240@60Hz 16:9 */
        { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 10 - 2880x480i@60Hz */
+       /* 10 - 2880x480i@60Hz 4:3 */
        { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 11 - 2880x480i@60Hz */
+       /* 11 - 2880x480i@60Hz 16:9 */
        { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 12 - 2880x240@60Hz */
+       /* 12 - 2880x240@60Hz 4:3 */
        { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 13 - 2880x240@60Hz */
+       /* 13 - 2880x240@60Hz 16:9 */
        { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 14 - 1440x480@60Hz */
+       /* 14 - 1440x480@60Hz 4:3 */
        { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
                   1596, 1716, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 15 - 1440x480@60Hz */
+       /* 15 - 1440x480@60Hz 16:9 */
        { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
                   1596, 1716, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 16 - 1920x1080@60Hz */
+       /* 16 - 1920x1080@60Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 17 - 720x576@50Hz */
+       /* 17 - 720x576@50Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 18 - 720x576@50Hz */
+       /* 18 - 720x576@50Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 19 - 1280x720@50Hz */
+       /* 19 - 1280x720@50Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 20 - 1920x1080i@50Hz */
+       /* 20 - 1920x1080i@50Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 21 - 720(1440)x576i@50Hz */
+       /* 21 - 720(1440)x576i@50Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 22 - 720(1440)x576i@50Hz */
+       /* 22 - 720(1440)x576i@50Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 23 - 720(1440)x288@50Hz */
+       /* 23 - 720(1440)x288@50Hz 4:3 */
        { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 24 - 720(1440)x288@50Hz */
+       /* 24 - 720(1440)x288@50Hz 16:9 */
        { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 25 - 2880x576i@50Hz */
+       /* 25 - 2880x576i@50Hz 4:3 */
        { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 26 - 2880x576i@50Hz */
+       /* 26 - 2880x576i@50Hz 16:9 */
        { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 27 - 2880x288@50Hz */
+       /* 27 - 2880x288@50Hz 4:3 */
        { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 28 - 2880x288@50Hz */
+       /* 28 - 2880x288@50Hz 16:9 */
        { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 29 - 1440x576@50Hz */
+       /* 29 - 1440x576@50Hz 4:3 */
        { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
                   1592, 1728, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 30 - 1440x576@50Hz */
+       /* 30 - 1440x576@50Hz 16:9 */
        { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
                   1592, 1728, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 31 - 1920x1080@50Hz */
+       /* 31 - 1920x1080@50Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 32 - 1920x1080@24Hz */
+       /* 32 - 1920x1080@24Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 33 - 1920x1080@25Hz */
+       /* 33 - 1920x1080@25Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 34 - 1920x1080@30Hz */
+       /* 34 - 1920x1080@30Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 35 - 2880x480@60Hz */
+       /* 35 - 2880x480@60Hz 4:3 */
        { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
                   3192, 3432, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 36 - 2880x480@60Hz */
+       /* 36 - 2880x480@60Hz 16:9 */
        { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
                   3192, 3432, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 37 - 2880x576@50Hz */
+       /* 37 - 2880x576@50Hz 4:3 */
        { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
                   3184, 3456, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 38 - 2880x576@50Hz */
+       /* 38 - 2880x576@50Hz 16:9 */
        { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
                   3184, 3456, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 39 - 1920x1080i@50Hz */
+       /* 39 - 1920x1080i@50Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
                   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 40 - 1920x1080i@100Hz */
+       /* 40 - 1920x1080i@100Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 41 - 1280x720@100Hz */
+       /* 41 - 1280x720@100Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 42 - 720x576@100Hz */
+       /* 42 - 720x576@100Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 43 - 720x576@100Hz */
+       /* 43 - 720x576@100Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 44 - 720(1440)x576i@100Hz */
+       /* 44 - 720(1440)x576i@100Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 45 - 720(1440)x576i@100Hz */
+       /* 45 - 720(1440)x576i@100Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 46 - 1920x1080i@120Hz */
+       /* 46 - 1920x1080i@120Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-                       DRM_MODE_FLAG_INTERLACE),
+                  DRM_MODE_FLAG_INTERLACE),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 47 - 1280x720@120Hz */
+       /* 47 - 1280x720@120Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 48 - 720x480@120Hz */
+       /* 48 - 720x480@120Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 49 - 720x480@120Hz */
+       /* 49 - 720x480@120Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 50 - 720(1440)x480i@120Hz */
+       /* 50 - 720(1440)x480i@120Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 51 - 720(1440)x480i@120Hz */
+       /* 51 - 720(1440)x480i@120Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 52 - 720x576@200Hz */
+       /* 52 - 720x576@200Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 53 - 720x576@200Hz */
+       /* 53 - 720x576@200Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 54 - 720(1440)x576i@200Hz */
+       /* 54 - 720(1440)x576i@200Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 55 - 720(1440)x576i@200Hz */
+       /* 55 - 720(1440)x576i@200Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 56 - 720x480@240Hz */
+       /* 56 - 720x480@240Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 57 - 720x480@240Hz */
+       /* 57 - 720x480@240Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 58 - 720(1440)x480i@240Hz */
+       /* 58 - 720(1440)x480i@240Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 59 - 720(1440)x480i@240Hz */
+       /* 59 - 720(1440)x480i@240Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
-                       DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+                  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
          .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 60 - 1280x720@24Hz */
+       /* 60 - 1280x720@24Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 61 - 1280x720@25Hz */
+       /* 61 - 1280x720@25Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
                   3740, 3960, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 62 - 1280x720@30Hz */
+       /* 62 - 1280x720@30Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 63 - 1920x1080@120Hz */
+       /* 63 - 1920x1080@120Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-        .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 64 - 1920x1080@100Hz */
+         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+       /* 64 - 1920x1080@100Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-        .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 65 - 1280x720@24Hz */
+         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+       /* 65 - 1280x720@24Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 66 - 1280x720@25Hz */
+       /* 66 - 1280x720@25Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
                   3740, 3960, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 67 - 1280x720@30Hz */
+       /* 67 - 1280x720@30Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 68 - 1280x720@50Hz */
+       /* 68 - 1280x720@50Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 69 - 1280x720@60Hz */
+       /* 69 - 1280x720@60Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 70 - 1280x720@100Hz */
+       /* 70 - 1280x720@100Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 71 - 1280x720@120Hz */
+       /* 71 - 1280x720@120Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 72 - 1920x1080@24Hz */
+       /* 72 - 1920x1080@24Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 73 - 1920x1080@25Hz */
+       /* 73 - 1920x1080@25Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 74 - 1920x1080@30Hz */
+       /* 74 - 1920x1080@30Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 75 - 1920x1080@50Hz */
+       /* 75 - 1920x1080@50Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 76 - 1920x1080@60Hz */
+       /* 76 - 1920x1080@60Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 77 - 1920x1080@100Hz */
+       /* 77 - 1920x1080@100Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 78 - 1920x1080@120Hz */
+       /* 78 - 1920x1080@120Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 79 - 1680x720@24Hz */
+       /* 79 - 1680x720@24Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 80 - 1680x720@25Hz */
+       /* 80 - 1680x720@25Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2908,
                   2948, 3168, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 81 - 1680x720@30Hz */
+       /* 81 - 1680x720@30Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2380,
                   2420, 2640, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 82 - 1680x720@50Hz */
+       /* 82 - 1680x720@50Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 82500, 1680, 1940,
                   1980, 2200, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 83 - 1680x720@60Hz */
+       /* 83 - 1680x720@60Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 1940,
                   1980, 2200, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 84 - 1680x720@100Hz */
+       /* 84 - 1680x720@100Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 165000, 1680, 1740,
                   1780, 2000, 0, 720, 725, 730, 825, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 85 - 1680x720@120Hz */
+       /* 85 - 1680x720@120Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 198000, 1680, 1740,
                   1780, 2000, 0, 720, 725, 730, 825, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 86 - 2560x1080@24Hz */
+       /* 86 - 2560x1080@24Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 99000, 2560, 3558,
                   3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 87 - 2560x1080@25Hz */
+       /* 87 - 2560x1080@25Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 90000, 2560, 3008,
                   3052, 3200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 88 - 2560x1080@30Hz */
+       /* 88 - 2560x1080@30Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 118800, 2560, 3328,
                   3372, 3520, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 89 - 2560x1080@50Hz */
+       /* 89 - 2560x1080@50Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 185625, 2560, 3108,
                   3152, 3300, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 90 - 2560x1080@60Hz */
+       /* 90 - 2560x1080@60Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 2808,
                   2852, 3000, 0, 1080, 1084, 1089, 1100, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 91 - 2560x1080@100Hz */
+       /* 91 - 2560x1080@100Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 371250, 2560, 2778,
                   2822, 2970, 0, 1080, 1084, 1089, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 92 - 2560x1080@120Hz */
+       /* 92 - 2560x1080@120Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 495000, 2560, 3108,
                   3152, 3300, 0, 1080, 1084, 1089, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 93 - 3840x2160p@24Hz 16:9 */
+       /* 93 - 3840x2160@24Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 94 - 3840x2160p@25Hz 16:9 */
+       /* 94 - 3840x2160@25Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 95 - 3840x2160p@30Hz 16:9 */
+       /* 95 - 3840x2160@30Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 96 - 3840x2160p@50Hz 16:9 */
+       /* 96 - 3840x2160@50Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 97 - 3840x2160p@60Hz 16:9 */
+       /* 97 - 3840x2160@60Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 98 - 4096x2160p@24Hz 256:135 */
+       /* 98 - 4096x2160@24Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
-       /* 99 - 4096x2160p@25Hz 256:135 */
+       /* 99 - 4096x2160@25Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064,
                   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
-       /* 100 - 4096x2160p@30Hz 256:135 */
+       /* 100 - 4096x2160@30Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184,
                   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
-       /* 101 - 4096x2160p@50Hz 256:135 */
+       /* 101 - 4096x2160@50Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064,
                   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
-       /* 102 - 4096x2160p@60Hz 256:135 */
+       /* 102 - 4096x2160@60Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184,
                   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
-       /* 103 - 3840x2160p@24Hz 64:27 */
+       /* 103 - 3840x2160@24Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 104 - 3840x2160p@25Hz 64:27 */
+       /* 104 - 3840x2160@25Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 105 - 3840x2160p@30Hz 64:27 */
+       /* 105 - 3840x2160@30Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 106 - 3840x2160p@50Hz 64:27 */
+       /* 106 - 3840x2160@50Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-       /* 107 - 3840x2160p@60Hz 64:27 */
+       /* 107 - 3840x2160@60Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
@@@ -1633,8 -1634,7 +1634,8 @@@ struct edid *drm_do_get_edid(struct drm
                edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions;
                edid[0x7e] = valid_extensions;
  
 -              new = kmalloc((valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
 +              new = kmalloc_array(valid_extensions + 1, EDID_LENGTH,
 +                                  GFP_KERNEL);
                if (!new)
                        goto out;
  
@@@ -4873,6 -4873,14 +4874,14 @@@ drm_hdmi_avi_infoframe_from_display_mod
  
        frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
  
+       /*
+        * As some drivers don't support atomic, we can't use connector state.
+        * So just initialize the frame with default values, just the same way
+        * as it's done with other properties here.
+        */
+       frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS;
+       frame->itc = 0;
        /*
         * Populate picture aspect ratio from either
         * user input (if specified) or from the CEA mode list.
index 2b4a40a32b765ab9b44ec1e06c6a1bb272377bc1,fcf3a973925b355e09c3595706dc268683fed245..284ae9574f03a60837b1eefdc3090270925c9ffe
@@@ -42,7 -42,7 +42,7 @@@
  #include "intel_drv.h"
  #include "intel_frontbuffer.h"
  
 -#define I915_GFP_DMA (GFP_KERNEL | __GFP_HIGHMEM)
 +#define I915_GFP_ALLOW_FAIL (GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN)
  
  /**
   * DOC: Global GTT views
@@@ -190,11 -190,19 +190,11 @@@ int intel_sanitize_enable_ppgtt(struct 
        return 1;
  }
  
 -static int ppgtt_bind_vma(struct i915_vma *vma,
 -                        enum i915_cache_level cache_level,
 -                        u32 unused)
 +static int gen6_ppgtt_bind_vma(struct i915_vma *vma,
 +                             enum i915_cache_level cache_level,
 +                             u32 unused)
  {
        u32 pte_flags;
 -      int ret;
 -
 -      if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
 -              ret = vma->vm->allocate_va_range(vma->vm, vma->node.start,
 -                                               vma->size);
 -              if (ret)
 -                      return ret;
 -      }
  
        /* Currently applicable only to VLV */
        pte_flags = 0;
        return 0;
  }
  
 +static int gen8_ppgtt_bind_vma(struct i915_vma *vma,
 +                             enum i915_cache_level cache_level,
 +                             u32 unused)
 +{
 +      int ret;
 +
 +      if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
 +              ret = vma->vm->allocate_va_range(vma->vm,
 +                                               vma->node.start, vma->size);
 +              if (ret)
 +                      return ret;
 +      }
 +
 +      return gen6_ppgtt_bind_vma(vma, cache_level, unused);
 +}
 +
  static void ppgtt_unbind_vma(struct i915_vma *vma)
  {
        vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
@@@ -497,7 -489,7 +497,7 @@@ static int __setup_page_dma(struct i915
                            struct i915_page_dma *p,
                            gfp_t gfp)
  {
 -      p->page = vm_alloc_page(vm, gfp | __GFP_NOWARN | __GFP_NORETRY);
 +      p->page = vm_alloc_page(vm, gfp | I915_GFP_ALLOW_FAIL);
        if (unlikely(!p->page))
                return -ENOMEM;
  
  static int setup_page_dma(struct i915_address_space *vm,
                          struct i915_page_dma *p)
  {
 -      return __setup_page_dma(vm, p, I915_GFP_DMA);
 +      return __setup_page_dma(vm, p, __GFP_HIGHMEM);
  }
  
  static void cleanup_page_dma(struct i915_address_space *vm,
  
  #define setup_px(vm, px) setup_page_dma((vm), px_base(px))
  #define cleanup_px(vm, px) cleanup_page_dma((vm), px_base(px))
 -#define fill_px(ppgtt, px, v) fill_page_dma((vm), px_base(px), (v))
 -#define fill32_px(ppgtt, px, v) fill_page_dma_32((vm), px_base(px), (v))
 +#define fill_px(vm, px, v) fill_page_dma((vm), px_base(px), (v))
 +#define fill32_px(vm, px, v) fill_page_dma_32((vm), px_base(px), (v))
  
  static void fill_page_dma(struct i915_address_space *vm,
                          struct i915_page_dma *p,
@@@ -622,7 -614,7 +622,7 @@@ static struct i915_page_table *alloc_pt
  {
        struct i915_page_table *pt;
  
 -      pt = kmalloc(sizeof(*pt), GFP_KERNEL | __GFP_NOWARN);
 +      pt = kmalloc(sizeof(*pt), I915_GFP_ALLOW_FAIL);
        if (unlikely(!pt))
                return ERR_PTR(-ENOMEM);
  
@@@ -659,7 -651,7 +659,7 @@@ static struct i915_page_directory *allo
  {
        struct i915_page_directory *pd;
  
 -      pd = kzalloc(sizeof(*pd), GFP_KERNEL | __GFP_NOWARN);
 +      pd = kzalloc(sizeof(*pd), I915_GFP_ALLOW_FAIL);
        if (unlikely(!pd))
                return ERR_PTR(-ENOMEM);
  
@@@ -693,7 -685,7 +693,7 @@@ static int __pdp_init(struct i915_addre
        const unsigned int pdpes = i915_pdpes_per_pdp(vm);
  
        pdp->page_directory = kmalloc_array(pdpes, sizeof(*pdp->page_directory),
 -                                          GFP_KERNEL | __GFP_NOWARN);
 +                                          I915_GFP_ALLOW_FAIL);
        if (unlikely(!pdp->page_directory))
                return -ENOMEM;
  
@@@ -773,6 -765,53 +773,6 @@@ static void gen8_initialize_pml4(struc
        memset_p((void **)pml4->pdps, vm->scratch_pdp, GEN8_PML4ES_PER_PML4);
  }
  
 -/* Broadwell Page Directory Pointer Descriptors */
 -static int gen8_write_pdp(struct i915_request *rq,
 -                        unsigned entry,
 -                        dma_addr_t addr)
 -{
 -      struct intel_engine_cs *engine = rq->engine;
 -      u32 *cs;
 -
 -      BUG_ON(entry >= 4);
 -
 -      cs = intel_ring_begin(rq, 6);
 -      if (IS_ERR(cs))
 -              return PTR_ERR(cs);
 -
 -      *cs++ = MI_LOAD_REGISTER_IMM(1);
 -      *cs++ = i915_mmio_reg_offset(GEN8_RING_PDP_UDW(engine, entry));
 -      *cs++ = upper_32_bits(addr);
 -      *cs++ = MI_LOAD_REGISTER_IMM(1);
 -      *cs++ = i915_mmio_reg_offset(GEN8_RING_PDP_LDW(engine, entry));
 -      *cs++ = lower_32_bits(addr);
 -      intel_ring_advance(rq, cs);
 -
 -      return 0;
 -}
 -
 -static int gen8_mm_switch_3lvl(struct i915_hw_ppgtt *ppgtt,
 -                             struct i915_request *rq)
 -{
 -      int i, ret;
 -
 -      for (i = GEN8_3LVL_PDPES - 1; i >= 0; i--) {
 -              const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);
 -
 -              ret = gen8_write_pdp(rq, i, pd_daddr);
 -              if (ret)
 -                      return ret;
 -      }
 -
 -      return 0;
 -}
 -
 -static int gen8_mm_switch_4lvl(struct i915_hw_ppgtt *ppgtt,
 -                             struct i915_request *rq)
 -{
 -      return gen8_write_pdp(rq, 0, px_dma(&ppgtt->pml4));
 -}
 -
  /* PDE TLBs are a pain to invalidate on GEN8+. When we modify
   * the page table structures, we mark them dirty so that
   * context switching/execlist queuing code takes extra steps
   */
  static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
  {
 -      ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.i915)->ring_mask;
 +      ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->vm.i915)->ring_mask;
  }
  
  /* Removes entries from a single page table, releasing it if it's empty.
@@@ -973,7 -1012,7 +973,7 @@@ gen8_ppgtt_insert_pte_entries(struct i9
        gen8_pte_t *vaddr;
        bool ret;
  
 -      GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->base));
 +      GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->vm));
        pd = pdp->page_directory[idx->pdpe];
        vaddr = kmap_atomic_px(pd->page_table[idx->pde]);
        do {
                                        break;
                                }
  
 -                              GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->base));
 +                              GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->vm));
                                pd = pdp->page_directory[idx->pdpe];
                        }
  
@@@ -1190,7 -1229,7 +1190,7 @@@ static int gen8_init_scratch(struct i91
  {
        int ret;
  
 -      ret = setup_scratch_page(vm, I915_GFP_DMA);
 +      ret = setup_scratch_page(vm, __GFP_HIGHMEM);
        if (ret)
                return ret;
  
@@@ -1233,7 -1272,7 +1233,7 @@@ free_scratch_page
  
  static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        struct drm_i915_private *dev_priv = vm->i915;
        enum vgt_g2v_type msg;
        int i;
@@@ -1294,13 -1333,13 +1294,13 @@@ static void gen8_ppgtt_cleanup_4lvl(str
        int i;
  
        for (i = 0; i < GEN8_PML4ES_PER_PML4; i++) {
 -              if (ppgtt->pml4.pdps[i] == ppgtt->base.scratch_pdp)
 +              if (ppgtt->pml4.pdps[i] == ppgtt->vm.scratch_pdp)
                        continue;
  
 -              gen8_ppgtt_cleanup_3lvl(&ppgtt->base, ppgtt->pml4.pdps[i]);
 +              gen8_ppgtt_cleanup_3lvl(&ppgtt->vm, ppgtt->pml4.pdps[i]);
        }
  
 -      cleanup_px(&ppgtt->base, &ppgtt->pml4);
 +      cleanup_px(&ppgtt->vm, &ppgtt->pml4);
  }
  
  static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
        if (use_4lvl(vm))
                gen8_ppgtt_cleanup_4lvl(ppgtt);
        else
 -              gen8_ppgtt_cleanup_3lvl(&ppgtt->base, &ppgtt->pdp);
 +              gen8_ppgtt_cleanup_3lvl(&ppgtt->vm, &ppgtt->pdp);
  
        gen8_free_scratch(vm);
  }
@@@ -1450,7 -1489,7 +1450,7 @@@ static void gen8_dump_pdp(struct i915_h
                          gen8_pte_t scratch_pte,
                          struct seq_file *m)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        struct i915_page_directory *pd;
        u32 pdpe;
  
                u64 pd_start = start;
                u32 pde;
  
 -              if (pdp->page_directory[pdpe] == ppgtt->base.scratch_pd)
 +              if (pdp->page_directory[pdpe] == ppgtt->vm.scratch_pd)
                        continue;
  
                seq_printf(m, "\tPDPE #%d\n", pdpe);
                        u32 pte;
                        gen8_pte_t *pt_vaddr;
  
 -                      if (pd->page_table[pde] == ppgtt->base.scratch_pt)
 +                      if (pd->page_table[pde] == ppgtt->vm.scratch_pt)
                                continue;
  
                        pt_vaddr = kmap_atomic_px(pt);
  
  static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        const gen8_pte_t scratch_pte =
                gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC);
 -      u64 start = 0, length = ppgtt->base.total;
 +      u64 start = 0, length = ppgtt->vm.total;
  
        if (use_4lvl(vm)) {
                u64 pml4e;
                struct i915_page_directory_pointer *pdp;
  
                gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
 -                      if (pml4->pdps[pml4e] == ppgtt->base.scratch_pdp)
 +                      if (pml4->pdps[pml4e] == ppgtt->vm.scratch_pdp)
                                continue;
  
                        seq_printf(m, "    PML4E #%llu\n", pml4e);
  
  static int gen8_preallocate_top_level_pdp(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        struct i915_page_directory_pointer *pdp = &ppgtt->pdp;
        struct i915_page_directory *pd;
 -      u64 start = 0, length = ppgtt->base.total;
 +      u64 start = 0, length = ppgtt->vm.total;
        u64 from = start;
        unsigned int pdpe;
  
@@@ -1564,11 -1603,11 +1564,11 @@@ unwind
   */
  static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        struct drm_i915_private *dev_priv = vm->i915;
        int ret;
  
 -      ppgtt->base.total = USES_FULL_48BIT_PPGTT(dev_priv) ?
 +      ppgtt->vm.total = USES_FULL_48BIT_PPGTT(dev_priv) ?
                1ULL << 48 :
                1ULL << 32;
  
         * And we are not sure about the latter so play safe for now.
         */
        if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
 -              ppgtt->base.pt_kmap_wc = true;
 +              ppgtt->vm.pt_kmap_wc = true;
  
 -      ret = gen8_init_scratch(&ppgtt->base);
 +      ret = gen8_init_scratch(&ppgtt->vm);
        if (ret) {
 -              ppgtt->base.total = 0;
 +              ppgtt->vm.total = 0;
                return ret;
        }
  
        if (use_4lvl(vm)) {
 -              ret = setup_px(&ppgtt->base, &ppgtt->pml4);
 +              ret = setup_px(&ppgtt->vm, &ppgtt->pml4);
                if (ret)
                        goto free_scratch;
  
 -              gen8_initialize_pml4(&ppgtt->base, &ppgtt->pml4);
 +              gen8_initialize_pml4(&ppgtt->vm, &ppgtt->pml4);
  
 -              ppgtt->switch_mm = gen8_mm_switch_4lvl;
 -              ppgtt->base.allocate_va_range = gen8_ppgtt_alloc_4lvl;
 -              ppgtt->base.insert_entries = gen8_ppgtt_insert_4lvl;
 -              ppgtt->base.clear_range = gen8_ppgtt_clear_4lvl;
 +              ppgtt->vm.allocate_va_range = gen8_ppgtt_alloc_4lvl;
 +              ppgtt->vm.insert_entries = gen8_ppgtt_insert_4lvl;
 +              ppgtt->vm.clear_range = gen8_ppgtt_clear_4lvl;
        } else {
 -              ret = __pdp_init(&ppgtt->base, &ppgtt->pdp);
 +              ret = __pdp_init(&ppgtt->vm, &ppgtt->pdp);
                if (ret)
                        goto free_scratch;
  
                        }
                }
  
 -              ppgtt->switch_mm = gen8_mm_switch_3lvl;
 -              ppgtt->base.allocate_va_range = gen8_ppgtt_alloc_3lvl;
 -              ppgtt->base.insert_entries = gen8_ppgtt_insert_3lvl;
 -              ppgtt->base.clear_range = gen8_ppgtt_clear_3lvl;
 +              ppgtt->vm.allocate_va_range = gen8_ppgtt_alloc_3lvl;
 +              ppgtt->vm.insert_entries = gen8_ppgtt_insert_3lvl;
 +              ppgtt->vm.clear_range = gen8_ppgtt_clear_3lvl;
        }
  
        if (intel_vgpu_active(dev_priv))
                gen8_ppgtt_notify_vgt(ppgtt, true);
  
 -      ppgtt->base.cleanup = gen8_ppgtt_cleanup;
 -      ppgtt->base.unbind_vma = ppgtt_unbind_vma;
 -      ppgtt->base.bind_vma = ppgtt_bind_vma;
 -      ppgtt->base.set_pages = ppgtt_set_pages;
 -      ppgtt->base.clear_pages = clear_pages;
 +      ppgtt->vm.cleanup = gen8_ppgtt_cleanup;
 +      ppgtt->vm.bind_vma = gen8_ppgtt_bind_vma;
 +      ppgtt->vm.unbind_vma = ppgtt_unbind_vma;
 +      ppgtt->vm.set_pages = ppgtt_set_pages;
 +      ppgtt->vm.clear_pages = clear_pages;
        ppgtt->debug_dump = gen8_dump_ppgtt;
  
        return 0;
  
  free_scratch:
 -      gen8_free_scratch(&ppgtt->base);
 +      gen8_free_scratch(&ppgtt->vm);
        return ret;
  }
  
  static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 +      struct i915_address_space *vm = &ppgtt->vm;
        struct i915_page_table *unused;
        gen6_pte_t scratch_pte;
        u32 pd_entry, pte, pde;
 -      u32 start = 0, length = ppgtt->base.total;
 +      u32 start = 0, length = ppgtt->vm.total;
  
        scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
                                     I915_CACHE_LLC, 0);
@@@ -1933,7 -1974,7 +1933,7 @@@ static int gen6_init_scratch(struct i91
  {
        int ret;
  
 -      ret = setup_scratch_page(vm, I915_GFP_DMA);
 +      ret = setup_scratch_page(vm, __GFP_HIGHMEM);
        if (ret)
                return ret;
  
@@@ -1972,8 -2013,8 +1972,8 @@@ static void gen6_ppgtt_cleanup(struct i
  
  static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct i915_address_space *vm = &ppgtt->base;
 -      struct drm_i915_private *dev_priv = ppgtt->base.i915;
 +      struct i915_address_space *vm = &ppgtt->vm;
 +      struct drm_i915_private *dev_priv = ppgtt->vm.i915;
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
  
         * allocator works in address space sizes, so it's multiplied by page
         * size. We allocate at the top of the GTT to avoid fragmentation.
         */
 -      BUG_ON(!drm_mm_initialized(&ggtt->base.mm));
 +      BUG_ON(!drm_mm_initialized(&ggtt->vm.mm));
  
        ret = gen6_init_scratch(vm);
        if (ret)
                return ret;
  
 -      ret = i915_gem_gtt_insert(&ggtt->base, &ppgtt->node,
 +      ret = i915_gem_gtt_insert(&ggtt->vm, &ppgtt->node,
                                  GEN6_PD_SIZE, GEN6_PD_ALIGN,
                                  I915_COLOR_UNEVICTABLE,
 -                                0, ggtt->base.total,
 +                                0, ggtt->vm.total,
                                  PIN_HIGH);
        if (ret)
                goto err_out;
@@@ -2023,16 -2064,16 +2023,16 @@@ static void gen6_scratch_va_range(struc
        u32 pde;
  
        gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde)
 -              ppgtt->pd.page_table[pde] = ppgtt->base.scratch_pt;
 +              ppgtt->pd.page_table[pde] = ppgtt->vm.scratch_pt;
  }
  
  static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct drm_i915_private *dev_priv = ppgtt->base.i915;
 +      struct drm_i915_private *dev_priv = ppgtt->vm.i915;
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
  
 -      ppgtt->base.pte_encode = ggtt->base.pte_encode;
 +      ppgtt->vm.pte_encode = ggtt->vm.pte_encode;
        if (intel_vgpu_active(dev_priv) || IS_GEN6(dev_priv))
                ppgtt->switch_mm = gen6_mm_switch;
        else if (IS_HASWELL(dev_priv))
        if (ret)
                return ret;
  
 -      ppgtt->base.total = I915_PDES * GEN6_PTES * PAGE_SIZE;
 +      ppgtt->vm.total = I915_PDES * GEN6_PTES * PAGE_SIZE;
  
 -      gen6_scratch_va_range(ppgtt, 0, ppgtt->base.total);
 -      gen6_write_page_range(ppgtt, 0, ppgtt->base.total);
 +      gen6_scratch_va_range(ppgtt, 0, ppgtt->vm.total);
 +      gen6_write_page_range(ppgtt, 0, ppgtt->vm.total);
  
 -      ret = gen6_alloc_va_range(&ppgtt->base, 0, ppgtt->base.total);
 +      ret = gen6_alloc_va_range(&ppgtt->vm, 0, ppgtt->vm.total);
        if (ret) {
 -              gen6_ppgtt_cleanup(&ppgtt->base);
 +              gen6_ppgtt_cleanup(&ppgtt->vm);
                return ret;
        }
  
 -      ppgtt->base.clear_range = gen6_ppgtt_clear_range;
 -      ppgtt->base.insert_entries = gen6_ppgtt_insert_entries;
 -      ppgtt->base.unbind_vma = ppgtt_unbind_vma;
 -      ppgtt->base.bind_vma = ppgtt_bind_vma;
 -      ppgtt->base.set_pages = ppgtt_set_pages;
 -      ppgtt->base.clear_pages = clear_pages;
 -      ppgtt->base.cleanup = gen6_ppgtt_cleanup;
 +      ppgtt->vm.clear_range = gen6_ppgtt_clear_range;
 +      ppgtt->vm.insert_entries = gen6_ppgtt_insert_entries;
 +      ppgtt->vm.bind_vma = gen6_ppgtt_bind_vma;
 +      ppgtt->vm.unbind_vma = ppgtt_unbind_vma;
 +      ppgtt->vm.set_pages = ppgtt_set_pages;
 +      ppgtt->vm.clear_pages = clear_pages;
 +      ppgtt->vm.cleanup = gen6_ppgtt_cleanup;
        ppgtt->debug_dump = gen6_dump_ppgtt;
  
        DRM_DEBUG_DRIVER("Allocated pde space (%lldM) at GTT entry: %llx\n",
  static int __hw_ppgtt_init(struct i915_hw_ppgtt *ppgtt,
                           struct drm_i915_private *dev_priv)
  {
 -      ppgtt->base.i915 = dev_priv;
 -      ppgtt->base.dma = &dev_priv->drm.pdev->dev;
 +      ppgtt->vm.i915 = dev_priv;
 +      ppgtt->vm.dma = &dev_priv->drm.pdev->dev;
  
        if (INTEL_GEN(dev_priv) < 8)
                return gen6_ppgtt_init(ppgtt);
@@@ -2190,10 -2231,10 +2190,10 @@@ i915_ppgtt_create(struct drm_i915_priva
        }
  
        kref_init(&ppgtt->ref);
 -      i915_address_space_init(&ppgtt->base, dev_priv, name);
 -      ppgtt->base.file = fpriv;
 +      i915_address_space_init(&ppgtt->vm, dev_priv, name);
 +      ppgtt->vm.file = fpriv;
  
 -      trace_i915_ppgtt_create(&ppgtt->base);
 +      trace_i915_ppgtt_create(&ppgtt->vm);
  
        return ppgtt;
  }
@@@ -2227,16 -2268,16 +2227,16 @@@ void i915_ppgtt_release(struct kref *kr
        struct i915_hw_ppgtt *ppgtt =
                container_of(kref, struct i915_hw_ppgtt, ref);
  
 -      trace_i915_ppgtt_release(&ppgtt->base);
 +      trace_i915_ppgtt_release(&ppgtt->vm);
  
 -      ppgtt_destroy_vma(&ppgtt->base);
 +      ppgtt_destroy_vma(&ppgtt->vm);
  
 -      GEM_BUG_ON(!list_empty(&ppgtt->base.active_list));
 -      GEM_BUG_ON(!list_empty(&ppgtt->base.inactive_list));
 -      GEM_BUG_ON(!list_empty(&ppgtt->base.unbound_list));
 +      GEM_BUG_ON(!list_empty(&ppgtt->vm.active_list));
 +      GEM_BUG_ON(!list_empty(&ppgtt->vm.inactive_list));
 +      GEM_BUG_ON(!list_empty(&ppgtt->vm.unbound_list));
  
 -      ppgtt->base.cleanup(&ppgtt->base);
 -      i915_address_space_fini(&ppgtt->base);
 +      ppgtt->vm.cleanup(&ppgtt->vm);
 +      i915_address_space_fini(&ppgtt->vm);
        kfree(ppgtt);
  }
  
@@@ -2332,7 -2373,7 +2332,7 @@@ void i915_gem_suspend_gtt_mappings(stru
  
        i915_check_and_clear_faults(dev_priv);
  
 -      ggtt->base.clear_range(&ggtt->base, 0, ggtt->base.total);
 +      ggtt->vm.clear_range(&ggtt->vm, 0, ggtt->vm.total);
  
        i915_ggtt_invalidate(dev_priv);
  }
@@@ -2675,16 -2716,16 +2675,16 @@@ static int aliasing_gtt_bind_vma(struc
                struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
  
                if (!(vma->flags & I915_VMA_LOCAL_BIND) &&
 -                  appgtt->base.allocate_va_range) {
 -                      ret = appgtt->base.allocate_va_range(&appgtt->base,
 -                                                           vma->node.start,
 -                                                           vma->size);
 +                  appgtt->vm.allocate_va_range) {
 +                      ret = appgtt->vm.allocate_va_range(&appgtt->vm,
 +                                                         vma->node.start,
 +                                                         vma->size);
                        if (ret)
                                return ret;
                }
  
 -              appgtt->base.insert_entries(&appgtt->base, vma, cache_level,
 -                                          pte_flags);
 +              appgtt->vm.insert_entries(&appgtt->vm, vma, cache_level,
 +                                        pte_flags);
        }
  
        if (flags & I915_VMA_GLOBAL_BIND) {
@@@ -2707,7 -2748,7 +2707,7 @@@ static void aliasing_gtt_unbind_vma(str
        }
  
        if (vma->flags & I915_VMA_LOCAL_BIND) {
 -              struct i915_address_space *vm = &i915->mm.aliasing_ppgtt->base;
 +              struct i915_address_space *vm = &i915->mm.aliasing_ppgtt->vm;
  
                vm->clear_range(vm, vma->node.start, vma->size);
        }
@@@ -2774,30 -2815,30 +2774,30 @@@ int i915_gem_init_aliasing_ppgtt(struc
        if (IS_ERR(ppgtt))
                return PTR_ERR(ppgtt);
  
 -      if (WARN_ON(ppgtt->base.total < ggtt->base.total)) {
 +      if (WARN_ON(ppgtt->vm.total < ggtt->vm.total)) {
                err = -ENODEV;
                goto err_ppgtt;
        }
  
 -      if (ppgtt->base.allocate_va_range) {
 +      if (ppgtt->vm.allocate_va_range) {
                /* Note we only pre-allocate as far as the end of the global
                 * GTT. On 48b / 4-level page-tables, the difference is very,
                 * very significant! We have to preallocate as GVT/vgpu does
                 * not like the page directory disappearing.
                 */
 -              err = ppgtt->base.allocate_va_range(&ppgtt->base,
 -                                                  0, ggtt->base.total);
 +              err = ppgtt->vm.allocate_va_range(&ppgtt->vm,
 +                                                0, ggtt->vm.total);
                if (err)
                        goto err_ppgtt;
        }
  
        i915->mm.aliasing_ppgtt = ppgtt;
  
 -      GEM_BUG_ON(ggtt->base.bind_vma != ggtt_bind_vma);
 -      ggtt->base.bind_vma = aliasing_gtt_bind_vma;
 +      GEM_BUG_ON(ggtt->vm.bind_vma != ggtt_bind_vma);
 +      ggtt->vm.bind_vma = aliasing_gtt_bind_vma;
  
 -      GEM_BUG_ON(ggtt->base.unbind_vma != ggtt_unbind_vma);
 -      ggtt->base.unbind_vma = aliasing_gtt_unbind_vma;
 +      GEM_BUG_ON(ggtt->vm.unbind_vma != ggtt_unbind_vma);
 +      ggtt->vm.unbind_vma = aliasing_gtt_unbind_vma;
  
        return 0;
  
@@@ -2817,8 -2858,8 +2817,8 @@@ void i915_gem_fini_aliasing_ppgtt(struc
  
        i915_ppgtt_put(ppgtt);
  
 -      ggtt->base.bind_vma = ggtt_bind_vma;
 -      ggtt->base.unbind_vma = ggtt_unbind_vma;
 +      ggtt->vm.bind_vma = ggtt_bind_vma;
 +      ggtt->vm.unbind_vma = ggtt_unbind_vma;
  }
  
  int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
                return ret;
  
        /* Reserve a mappable slot for our lockless error capture */
 -      ret = drm_mm_insert_node_in_range(&ggtt->base.mm, &ggtt->error_capture,
 +      ret = drm_mm_insert_node_in_range(&ggtt->vm.mm, &ggtt->error_capture,
                                          PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
                                          0, ggtt->mappable_end,
                                          DRM_MM_INSERT_LOW);
                return ret;
  
        /* Clear any non-preallocated blocks */
 -      drm_mm_for_each_hole(entry, &ggtt->base.mm, hole_start, hole_end) {
 +      drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) {
                DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n",
                              hole_start, hole_end);
 -              ggtt->base.clear_range(&ggtt->base, hole_start,
 -                                     hole_end - hole_start);
 +              ggtt->vm.clear_range(&ggtt->vm, hole_start,
 +                                   hole_end - hole_start);
        }
  
        /* And finally clear the reserved guard page */
 -      ggtt->base.clear_range(&ggtt->base,
 -                             ggtt->base.total - PAGE_SIZE, PAGE_SIZE);
 +      ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE);
  
        if (USES_PPGTT(dev_priv) && !USES_FULL_PPGTT(dev_priv)) {
                ret = i915_gem_init_aliasing_ppgtt(dev_priv);
@@@ -2883,11 -2925,11 +2883,11 @@@ void i915_ggtt_cleanup_hw(struct drm_i9
        struct i915_vma *vma, *vn;
        struct pagevec *pvec;
  
 -      ggtt->base.closed = true;
 +      ggtt->vm.closed = true;
  
        mutex_lock(&dev_priv->drm.struct_mutex);
 -      GEM_BUG_ON(!list_empty(&ggtt->base.active_list));
 -      list_for_each_entry_safe(vma, vn, &ggtt->base.inactive_list, vm_link)
 +      GEM_BUG_ON(!list_empty(&ggtt->vm.active_list));
 +      list_for_each_entry_safe(vma, vn, &ggtt->vm.inactive_list, vm_link)
                WARN_ON(i915_vma_unbind(vma));
        mutex_unlock(&dev_priv->drm.struct_mutex);
  
        if (drm_mm_node_allocated(&ggtt->error_capture))
                drm_mm_remove_node(&ggtt->error_capture);
  
 -      if (drm_mm_initialized(&ggtt->base.mm)) {
 +      if (drm_mm_initialized(&ggtt->vm.mm)) {
                intel_vgt_deballoon(dev_priv);
 -              i915_address_space_fini(&ggtt->base);
 +              i915_address_space_fini(&ggtt->vm);
        }
  
 -      ggtt->base.cleanup(&ggtt->base);
 +      ggtt->vm.cleanup(&ggtt->vm);
  
        pvec = &dev_priv->mm.wc_stash;
        if (pvec->nr) {
@@@ -2954,7 -2996,7 +2954,7 @@@ static unsigned int chv_get_total_gtt_s
  
  static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
  {
 -      struct drm_i915_private *dev_priv = ggtt->base.i915;
 +      struct drm_i915_private *dev_priv = ggtt->vm.i915;
        struct pci_dev *pdev = dev_priv->drm.pdev;
        phys_addr_t phys_addr;
        int ret;
                return -ENOMEM;
        }
  
 -      ret = setup_scratch_page(&ggtt->base, GFP_DMA32);
 +      ret = setup_scratch_page(&ggtt->vm, GFP_DMA32);
        if (ret) {
                DRM_ERROR("Scratch setup failed\n");
                /* iounmap will also get called at remove, but meh */
@@@ -3284,7 -3326,7 +3284,7 @@@ static void setup_private_pat(struct dr
  
  static int gen8_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = ggtt->base.i915;
 +      struct drm_i915_private *dev_priv = ggtt->vm.i915;
        struct pci_dev *pdev = dev_priv->drm.pdev;
        unsigned int size;
        u16 snb_gmch_ctl;
        else
                size = gen8_get_total_gtt_size(snb_gmch_ctl);
  
 -      ggtt->base.total = (size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
 -      ggtt->base.cleanup = gen6_gmch_remove;
 -      ggtt->base.bind_vma = ggtt_bind_vma;
 -      ggtt->base.unbind_vma = ggtt_unbind_vma;
 -      ggtt->base.set_pages = ggtt_set_pages;
 -      ggtt->base.clear_pages = clear_pages;
 -      ggtt->base.insert_page = gen8_ggtt_insert_page;
 -      ggtt->base.clear_range = nop_clear_range;
 +      ggtt->vm.total = (size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
 +      ggtt->vm.cleanup = gen6_gmch_remove;
 +      ggtt->vm.bind_vma = ggtt_bind_vma;
 +      ggtt->vm.unbind_vma = ggtt_unbind_vma;
 +      ggtt->vm.set_pages = ggtt_set_pages;
 +      ggtt->vm.clear_pages = clear_pages;
 +      ggtt->vm.insert_page = gen8_ggtt_insert_page;
 +      ggtt->vm.clear_range = nop_clear_range;
        if (!USES_FULL_PPGTT(dev_priv) || intel_scanout_needs_vtd_wa(dev_priv))
 -              ggtt->base.clear_range = gen8_ggtt_clear_range;
 +              ggtt->vm.clear_range = gen8_ggtt_clear_range;
  
 -      ggtt->base.insert_entries = gen8_ggtt_insert_entries;
 +      ggtt->vm.insert_entries = gen8_ggtt_insert_entries;
  
        /* Serialize GTT updates with aperture access on BXT if VT-d is on. */
        if (intel_ggtt_update_needs_vtd_wa(dev_priv)) {
 -              ggtt->base.insert_entries = bxt_vtd_ggtt_insert_entries__BKL;
 -              ggtt->base.insert_page    = bxt_vtd_ggtt_insert_page__BKL;
 -              if (ggtt->base.clear_range != nop_clear_range)
 -                      ggtt->base.clear_range = bxt_vtd_ggtt_clear_range__BKL;
 +              ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL;
 +              ggtt->vm.insert_page    = bxt_vtd_ggtt_insert_page__BKL;
 +              if (ggtt->vm.clear_range != nop_clear_range)
 +                      ggtt->vm.clear_range = bxt_vtd_ggtt_clear_range__BKL;
        }
  
        ggtt->invalidate = gen6_ggtt_invalidate;
  
  static int gen6_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = ggtt->base.i915;
 +      struct drm_i915_private *dev_priv = ggtt->vm.i915;
        struct pci_dev *pdev = dev_priv->drm.pdev;
        unsigned int size;
        u16 snb_gmch_ctl;
        pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
  
        size = gen6_get_total_gtt_size(snb_gmch_ctl);
 -      ggtt->base.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
 +      ggtt->vm.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
  
 -      ggtt->base.clear_range = gen6_ggtt_clear_range;
 -      ggtt->base.insert_page = gen6_ggtt_insert_page;
 -      ggtt->base.insert_entries = gen6_ggtt_insert_entries;
 -      ggtt->base.bind_vma = ggtt_bind_vma;
 -      ggtt->base.unbind_vma = ggtt_unbind_vma;
 -      ggtt->base.set_pages = ggtt_set_pages;
 -      ggtt->base.clear_pages = clear_pages;
 -      ggtt->base.cleanup = gen6_gmch_remove;
 +      ggtt->vm.clear_range = gen6_ggtt_clear_range;
 +      ggtt->vm.insert_page = gen6_ggtt_insert_page;
 +      ggtt->vm.insert_entries = gen6_ggtt_insert_entries;
 +      ggtt->vm.bind_vma = ggtt_bind_vma;
 +      ggtt->vm.unbind_vma = ggtt_unbind_vma;
 +      ggtt->vm.set_pages = ggtt_set_pages;
 +      ggtt->vm.clear_pages = clear_pages;
 +      ggtt->vm.cleanup = gen6_gmch_remove;
  
        ggtt->invalidate = gen6_ggtt_invalidate;
  
        if (HAS_EDRAM(dev_priv))
 -              ggtt->base.pte_encode = iris_pte_encode;
 +              ggtt->vm.pte_encode = iris_pte_encode;
        else if (IS_HASWELL(dev_priv))
 -              ggtt->base.pte_encode = hsw_pte_encode;
 +              ggtt->vm.pte_encode = hsw_pte_encode;
        else if (IS_VALLEYVIEW(dev_priv))
 -              ggtt->base.pte_encode = byt_pte_encode;
 +              ggtt->vm.pte_encode = byt_pte_encode;
        else if (INTEL_GEN(dev_priv) >= 7)
 -              ggtt->base.pte_encode = ivb_pte_encode;
 +              ggtt->vm.pte_encode = ivb_pte_encode;
        else
 -              ggtt->base.pte_encode = snb_pte_encode;
 +              ggtt->vm.pte_encode = snb_pte_encode;
  
        return ggtt_probe_common(ggtt, size);
  }
@@@ -3399,7 -3441,7 +3399,7 @@@ static void i915_gmch_remove(struct i91
  
  static int i915_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = ggtt->base.i915;
 +      struct drm_i915_private *dev_priv = ggtt->vm.i915;
        phys_addr_t gmadr_base;
        int ret;
  
                return -EIO;
        }
  
 -      intel_gtt_get(&ggtt->base.total,
 -                    &gmadr_base,
 -                    &ggtt->mappable_end);
 +      intel_gtt_get(&ggtt->vm.total, &gmadr_base, &ggtt->mappable_end);
  
        ggtt->gmadr =
                (struct resource) DEFINE_RES_MEM(gmadr_base,
                                                 ggtt->mappable_end);
  
        ggtt->do_idle_maps = needs_idle_maps(dev_priv);
 -      ggtt->base.insert_page = i915_ggtt_insert_page;
 -      ggtt->base.insert_entries = i915_ggtt_insert_entries;
 -      ggtt->base.clear_range = i915_ggtt_clear_range;
 -      ggtt->base.bind_vma = ggtt_bind_vma;
 -      ggtt->base.unbind_vma = ggtt_unbind_vma;
 -      ggtt->base.set_pages = ggtt_set_pages;
 -      ggtt->base.clear_pages = clear_pages;
 -      ggtt->base.cleanup = i915_gmch_remove;
 +      ggtt->vm.insert_page = i915_ggtt_insert_page;
 +      ggtt->vm.insert_entries = i915_ggtt_insert_entries;
 +      ggtt->vm.clear_range = i915_ggtt_clear_range;
 +      ggtt->vm.bind_vma = ggtt_bind_vma;
 +      ggtt->vm.unbind_vma = ggtt_unbind_vma;
 +      ggtt->vm.set_pages = ggtt_set_pages;
 +      ggtt->vm.clear_pages = clear_pages;
 +      ggtt->vm.cleanup = i915_gmch_remove;
  
        ggtt->invalidate = gmch_ggtt_invalidate;
  
@@@ -3442,8 -3486,8 +3442,8 @@@ int i915_ggtt_probe_hw(struct drm_i915_
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
  
 -      ggtt->base.i915 = dev_priv;
 -      ggtt->base.dma = &dev_priv->drm.pdev->dev;
 +      ggtt->vm.i915 = dev_priv;
 +      ggtt->vm.dma = &dev_priv->drm.pdev->dev;
  
        if (INTEL_GEN(dev_priv) <= 5)
                ret = i915_gmch_probe(ggtt);
         * restriction!
         */
        if (USES_GUC(dev_priv)) {
 -              ggtt->base.total = min_t(u64, ggtt->base.total, GUC_GGTT_TOP);
 -              ggtt->mappable_end = min_t(u64, ggtt->mappable_end, ggtt->base.total);
 +              ggtt->vm.total = min_t(u64, ggtt->vm.total, GUC_GGTT_TOP);
 +              ggtt->mappable_end =
 +                      min_t(u64, ggtt->mappable_end, ggtt->vm.total);
        }
  
 -      if ((ggtt->base.total - 1) >> 32) {
 +      if ((ggtt->vm.total - 1) >> 32) {
                DRM_ERROR("We never expected a Global GTT with more than 32bits"
                          " of address space! Found %lldM!\n",
 -                        ggtt->base.total >> 20);
 -              ggtt->base.total = 1ULL << 32;
 -              ggtt->mappable_end = min_t(u64, ggtt->mappable_end, ggtt->base.total);
 +                        ggtt->vm.total >> 20);
 +              ggtt->vm.total = 1ULL << 32;
 +              ggtt->mappable_end =
 +                      min_t(u64, ggtt->mappable_end, ggtt->vm.total);
        }
  
 -      if (ggtt->mappable_end > ggtt->base.total) {
 +      if (ggtt->mappable_end > ggtt->vm.total) {
                DRM_ERROR("mappable aperture extends past end of GGTT,"
                          " aperture=%pa, total=%llx\n",
 -                        &ggtt->mappable_end, ggtt->base.total);
 -              ggtt->mappable_end = ggtt->base.total;
 +                        &ggtt->mappable_end, ggtt->vm.total);
 +              ggtt->mappable_end = ggtt->vm.total;
        }
  
        /* GMADR is the PCI mmio aperture into the global GTT. */
 -      DRM_DEBUG_DRIVER("GGTT size = %lluM\n", ggtt->base.total >> 20);
 +      DRM_DEBUG_DRIVER("GGTT size = %lluM\n", ggtt->vm.total >> 20);
        DRM_DEBUG_DRIVER("GMADR size = %lluM\n", (u64)ggtt->mappable_end >> 20);
        DRM_DEBUG_DRIVER("DSM size = %lluM\n",
                         (u64)resource_size(&intel_graphics_stolen_res) >> 20);
@@@ -3509,9 -3551,9 +3509,9 @@@ int i915_ggtt_init_hw(struct drm_i915_p
         * and beyond the end of the GTT if we do not provide a guard.
         */
        mutex_lock(&dev_priv->drm.struct_mutex);
 -      i915_address_space_init(&ggtt->base, dev_priv, "[global]");
 +      i915_address_space_init(&ggtt->vm, dev_priv, "[global]");
        if (!HAS_LLC(dev_priv) && !USES_PPGTT(dev_priv))
 -              ggtt->base.mm.color_adjust = i915_gtt_color_adjust;
 +              ggtt->vm.mm.color_adjust = i915_gtt_color_adjust;
        mutex_unlock(&dev_priv->drm.struct_mutex);
  
        if (!io_mapping_init_wc(&dev_priv->ggtt.iomap,
        return 0;
  
  out_gtt_cleanup:
 -      ggtt->base.cleanup(&ggtt->base);
 +      ggtt->vm.cleanup(&ggtt->vm);
        return ret;
  }
  
@@@ -3568,31 -3610,34 +3568,31 @@@ void i915_ggtt_disable_guc(struct drm_i
  void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
  {
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
 -      struct drm_i915_gem_object *obj, *on;
 +      struct i915_vma *vma, *vn;
  
        i915_check_and_clear_faults(dev_priv);
  
        /* First fill our portion of the GTT with scratch pages */
 -      ggtt->base.clear_range(&ggtt->base, 0, ggtt->base.total);
 +      ggtt->vm.clear_range(&ggtt->vm, 0, ggtt->vm.total);
  
 -      ggtt->base.closed = true; /* skip rewriting PTE on VMA unbind */
 +      ggtt->vm.closed = true; /* skip rewriting PTE on VMA unbind */
  
        /* clflush objects bound into the GGTT and rebind them. */
 -      list_for_each_entry_safe(obj, on, &dev_priv->mm.bound_list, mm.link) {
 -              bool ggtt_bound = false;
 -              struct i915_vma *vma;
 +      GEM_BUG_ON(!list_empty(&ggtt->vm.active_list));
 +      list_for_each_entry_safe(vma, vn, &ggtt->vm.inactive_list, vm_link) {
 +              struct drm_i915_gem_object *obj = vma->obj;
  
 -              for_each_ggtt_vma(vma, obj) {
 -                      if (!i915_vma_unbind(vma))
 -                              continue;
 +              if (!(vma->flags & I915_VMA_GLOBAL_BIND))
 +                      continue;
  
 -                      WARN_ON(i915_vma_bind(vma, obj->cache_level,
 -                                            PIN_UPDATE));
 -                      ggtt_bound = true;
 -              }
 +              if (!i915_vma_unbind(vma))
 +                      continue;
  
 -              if (ggtt_bound)
 -                      WARN_ON(i915_gem_object_set_to_gtt_domain(obj, false));
 +              WARN_ON(i915_vma_bind(vma, obj->cache_level, PIN_UPDATE));
 +              WARN_ON(i915_gem_object_set_to_gtt_domain(obj, false));
        }
  
 -      ggtt->base.closed = false;
 +      ggtt->vm.closed = false;
  
        if (INTEL_GEN(dev_priv) >= 8) {
                struct intel_ppat *ppat = &dev_priv->ppat;
                                ppgtt = dev_priv->mm.aliasing_ppgtt;
                        else
                                ppgtt = i915_vm_to_ppgtt(vm);
 +                      if (!ppgtt)
 +                              continue;
  
 -                      gen6_write_page_range(ppgtt, 0, ppgtt->base.total);
 +                      gen6_write_page_range(ppgtt, 0, ppgtt->vm.total);
                }
        }
  
@@@ -3837,7 -3880,7 +3837,7 @@@ int i915_gem_gtt_reserve(struct i915_ad
        GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
        GEM_BUG_ON(!IS_ALIGNED(offset, I915_GTT_MIN_ALIGNMENT));
        GEM_BUG_ON(range_overflows(offset, size, vm->total));
 -      GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->base);
 +      GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm);
        GEM_BUG_ON(drm_mm_node_allocated(node));
  
        node->size = size;
@@@ -3934,7 -3977,7 +3934,7 @@@ int i915_gem_gtt_insert(struct i915_add
        GEM_BUG_ON(start >= end);
        GEM_BUG_ON(start > 0  && !IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
        GEM_BUG_ON(end < U64_MAX && !IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
 -      GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->base);
 +      GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm);
        GEM_BUG_ON(drm_mm_node_allocated(node));
  
        if (unlikely(range_overflows(start, size, end)))
  
        mode = DRM_MM_INSERT_BEST;
        if (flags & PIN_HIGH)
-               mode = DRM_MM_INSERT_HIGH;
+               mode = DRM_MM_INSERT_HIGHEST;
        if (flags & PIN_MAPPABLE)
                mode = DRM_MM_INSERT_LOW;
  
        if (err != -ENOSPC)
                return err;
  
+       if (mode & DRM_MM_INSERT_ONCE) {
+               err = drm_mm_insert_node_in_range(&vm->mm, node,
+                                                 size, alignment, color,
+                                                 start, end,
+                                                 DRM_MM_INSERT_BEST);
+               if (err != -ENOSPC)
+                       return err;
+       }
        if (flags & PIN_NOEVICT)
                return -ENOSPC;
  
index 17c590b42fd76e58208d6aa77ee2ee78e39643b9,dfd14b09f52ccc798b981036968154228424ad5e..2c16c3a3cdea94660f7ef6082da4b573a2dce28c
@@@ -1022,7 -1022,7 +1022,7 @@@ bool intel_crtc_active(struct intel_crt
         * We can ditch the adjusted_mode.crtc_clock check as soon
         * as Haswell has gained clock readout/fastboot support.
         *
-        * We can ditch the crtc->primary->fb check as soon as we can
+        * We can ditch the crtc->primary->state->fb check as soon as we can
         * properly reconstruct framebuffers.
         *
         * FIXME: The intel_crtc->active here should be switched to
@@@ -1202,7 -1202,7 +1202,7 @@@ void assert_panel_unlocked(struct drm_i
  {
        i915_reg_t pp_reg;
        u32 val;
 -      enum pipe panel_pipe = PIPE_A;
 +      enum pipe panel_pipe = INVALID_PIPE;
        bool locked = true;
  
        if (WARN_ON(HAS_DDI(dev_priv)))
                pp_reg = PP_CONTROL(0);
                port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
  
 -              if (port_sel == PANEL_PORT_SELECT_LVDS &&
 -                  I915_READ(PCH_LVDS) & LVDS_PIPEB_SELECT)
 -                      panel_pipe = PIPE_B;
 -              /* XXX: else fix for eDP */
 +              switch (port_sel) {
 +              case PANEL_PORT_SELECT_LVDS:
 +                      intel_lvds_port_enabled(dev_priv, PCH_LVDS, &panel_pipe);
 +                      break;
 +              case PANEL_PORT_SELECT_DPA:
 +                      intel_dp_port_enabled(dev_priv, DP_A, PORT_A, &panel_pipe);
 +                      break;
 +              case PANEL_PORT_SELECT_DPC:
 +                      intel_dp_port_enabled(dev_priv, PCH_DP_C, PORT_C, &panel_pipe);
 +                      break;
 +              case PANEL_PORT_SELECT_DPD:
 +                      intel_dp_port_enabled(dev_priv, PCH_DP_D, PORT_D, &panel_pipe);
 +                      break;
 +              default:
 +                      MISSING_CASE(port_sel);
 +                      break;
 +              }
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                /* presumably write lock depends on pipe, not port select */
                pp_reg = PP_CONTROL(pipe);
                panel_pipe = pipe;
        } else {
 +              u32 port_sel;
 +
                pp_reg = PP_CONTROL(0);
 -              if (I915_READ(LVDS) & LVDS_PIPEB_SELECT)
 -                      panel_pipe = PIPE_B;
 +              port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
 +
 +              WARN_ON(port_sel != PANEL_PORT_SELECT_LVDS);
 +              intel_lvds_port_enabled(dev_priv, LVDS, &panel_pipe);
        }
  
        val = I915_READ(pp_reg);
@@@ -1284,10 -1267,7 +1284,10 @@@ void assert_pipe(struct drm_i915_privat
  
  static void assert_plane(struct intel_plane *plane, bool state)
  {
 -      bool cur_state = plane->get_hw_state(plane);
 +      enum pipe pipe;
 +      bool cur_state;
 +
 +      cur_state = plane->get_hw_state(plane, &pipe);
  
        I915_STATE_WARN(cur_state != state,
                        "%s assertion failure (expected %s, current %s)\n",
@@@ -1325,64 -1305,125 +1325,64 @@@ void assert_pch_transcoder_disabled(str
             pipe_name(pipe));
  }
  
 -static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
 -                          enum pipe pipe, u32 port_sel, u32 val)
 +static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
 +                                 enum pipe pipe, enum port port,
 +                                 i915_reg_t dp_reg)
  {
 -      if ((val & DP_PORT_EN) == 0)
 -              return false;
 +      enum pipe port_pipe;
 +      bool state;
  
 -      if (HAS_PCH_CPT(dev_priv)) {
 -              u32 trans_dp_ctl = I915_READ(TRANS_DP_CTL(pipe));
 -              if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
 -                      return false;
 -      } else if (IS_CHERRYVIEW(dev_priv)) {
 -              if ((val & DP_PIPE_MASK_CHV) != DP_PIPE_SELECT_CHV(pipe))
 -                      return false;
 -      } else {
 -              if ((val & DP_PIPE_MASK) != (pipe << 30))
 -                      return false;
 -      }
 -      return true;
 -}
 +      state = intel_dp_port_enabled(dev_priv, dp_reg, port, &port_pipe);
  
 -static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
 -                            enum pipe pipe, u32 val)
 -{
 -      if ((val & SDVO_ENABLE) == 0)
 -              return false;
 +      I915_STATE_WARN(state && port_pipe == pipe,
 +                      "PCH DP %c enabled on transcoder %c, should be disabled\n",
 +                      port_name(port), pipe_name(pipe));
  
 -      if (HAS_PCH_CPT(dev_priv)) {
 -              if ((val & SDVO_PIPE_SEL_MASK_CPT) != SDVO_PIPE_SEL_CPT(pipe))
 -                      return false;
 -      } else if (IS_CHERRYVIEW(dev_priv)) {
 -              if ((val & SDVO_PIPE_SEL_MASK_CHV) != SDVO_PIPE_SEL_CHV(pipe))
 -                      return false;
 -      } else {
 -              if ((val & SDVO_PIPE_SEL_MASK) != SDVO_PIPE_SEL(pipe))
 -                      return false;
 -      }
 -      return true;
 +      I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
 +                      "IBX PCH DP %c still using transcoder B\n",
 +                      port_name(port));
  }
  
 -static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv,
 -                            enum pipe pipe, u32 val)
 -{
 -      if ((val & LVDS_PORT_EN) == 0)
 -              return false;
 -
 -      if (HAS_PCH_CPT(dev_priv)) {
 -              if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
 -                      return false;
 -      } else {
 -              if ((val & LVDS_PIPE_MASK) != LVDS_PIPE(pipe))
 -                      return false;
 -      }
 -      return true;
 -}
 -
 -static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
 -                            enum pipe pipe, u32 val)
 -{
 -      if ((val & ADPA_DAC_ENABLE) == 0)
 -              return false;
 -      if (HAS_PCH_CPT(dev_priv)) {
 -              if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
 -                      return false;
 -      } else {
 -              if ((val & ADPA_PIPE_SELECT_MASK) != ADPA_PIPE_SELECT(pipe))
 -                      return false;
 -      }
 -      return true;
 -}
 -
 -static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
 -                                 enum pipe pipe, i915_reg_t reg,
 -                                 u32 port_sel)
 +static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
 +                                   enum pipe pipe, enum port port,
 +                                   i915_reg_t hdmi_reg)
  {
 -      u32 val = I915_READ(reg);
 -      I915_STATE_WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val),
 -           "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
 -           i915_mmio_reg_offset(reg), pipe_name(pipe));
 +      enum pipe port_pipe;
 +      bool state;
  
 -      I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && (val & DP_PORT_EN) == 0
 -           && (val & DP_PIPEB_SELECT),
 -           "IBX PCH dp port still using transcoder B\n");
 -}
 +      state = intel_sdvo_port_enabled(dev_priv, hdmi_reg, &port_pipe);
  
 -static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
 -                                   enum pipe pipe, i915_reg_t reg)
 -{
 -      u32 val = I915_READ(reg);
 -      I915_STATE_WARN(hdmi_pipe_enabled(dev_priv, pipe, val),
 -           "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
 -           i915_mmio_reg_offset(reg), pipe_name(pipe));
 +      I915_STATE_WARN(state && port_pipe == pipe,
 +                      "PCH HDMI %c enabled on transcoder %c, should be disabled\n",
 +                      port_name(port), pipe_name(pipe));
  
 -      I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && (val & SDVO_ENABLE) == 0
 -           && (val & SDVO_PIPE_B_SELECT),
 -           "IBX PCH hdmi port still using transcoder B\n");
 +      I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
 +                      "IBX PCH HDMI %c still using transcoder B\n",
 +                      port_name(port));
  }
  
  static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
                                      enum pipe pipe)
  {
 -      u32 val;
 +      enum pipe port_pipe;
  
 -      assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B);
 -      assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C);
 -      assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D);
 +      assert_pch_dp_disabled(dev_priv, pipe, PORT_B, PCH_DP_B);
 +      assert_pch_dp_disabled(dev_priv, pipe, PORT_C, PCH_DP_C);
 +      assert_pch_dp_disabled(dev_priv, pipe, PORT_D, PCH_DP_D);
  
 -      val = I915_READ(PCH_ADPA);
 -      I915_STATE_WARN(adpa_pipe_enabled(dev_priv, pipe, val),
 -           "PCH VGA enabled on transcoder %c, should be disabled\n",
 -           pipe_name(pipe));
 +      I915_STATE_WARN(intel_crt_port_enabled(dev_priv, PCH_ADPA, &port_pipe) &&
 +                      port_pipe == pipe,
 +                      "PCH VGA enabled on transcoder %c, should be disabled\n",
 +                      pipe_name(pipe));
  
 -      val = I915_READ(PCH_LVDS);
 -      I915_STATE_WARN(lvds_pipe_enabled(dev_priv, pipe, val),
 -           "PCH LVDS enabled on transcoder %c, should be disabled\n",
 -           pipe_name(pipe));
 +      I915_STATE_WARN(intel_lvds_port_enabled(dev_priv, PCH_LVDS, &port_pipe) &&
 +                      port_pipe == pipe,
 +                      "PCH LVDS enabled on transcoder %c, should be disabled\n",
 +                      pipe_name(pipe));
  
 -      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIB);
 -      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIC);
 -      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMID);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PORT_B, PCH_HDMIB);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PORT_C, PCH_HDMIC);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PORT_D, PCH_HDMID);
  }
  
  static void _vlv_enable_pll(struct intel_crtc *crtc,
@@@ -2480,7 -2521,6 +2480,7 @@@ intel_fill_fb_info(struct drm_i915_priv
  {
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
        struct intel_rotation_info *rot_info = &intel_fb->rot_info;
 +      struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        u32 gtt_offset_rotated = 0;
        unsigned int max_size = 0;
        int i, num_planes = fb->format->num_planes;
                 * fb layout agrees with the fence layout. We already check that the
                 * fb stride matches the fence stride elsewhere.
                 */
 -              if (i == 0 && i915_gem_object_is_tiled(intel_fb->obj) &&
 +              if (i == 0 && i915_gem_object_is_tiled(obj) &&
                    (x + width) * cpp > fb->pitches[i]) {
                        DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
                                      i, fb->offsets[i]);
                max_size = max(max_size, offset + size);
        }
  
 -      if (max_size * tile_size > intel_fb->obj->base.size) {
 +      if (max_size * tile_size > obj->base.size) {
                DRM_DEBUG_KMS("fb too big for bo (need %u bytes, have %zu bytes)\n",
 -                            max_size * tile_size, intel_fb->obj->base.size);
 +                            max_size * tile_size, obj->base.size);
                return -EINVAL;
        }
  
@@@ -2882,9 -2922,8 +2882,8 @@@ valid_fb
        if (i915_gem_object_is_tiled(obj))
                dev_priv->preserve_bios_swizzle = true;
  
-       drm_framebuffer_get(fb);
-       primary->fb = primary->state->fb = fb;
-       primary->crtc = primary->state->crtc = &intel_crtc->base;
+       plane_state->fb = fb;
+       plane_state->crtc = &intel_crtc->base;
  
        intel_set_plane_visible(to_intel_crtc_state(crtc_state),
                                to_intel_plane_state(plane_state),
@@@ -3390,33 -3429,24 +3389,33 @@@ static void i9xx_disable_plane(struct i
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  }
  
 -static bool i9xx_plane_get_hw_state(struct intel_plane *plane)
 +static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
 +                                  enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
        enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
 -      enum pipe pipe = plane->pipe;
        bool ret;
 +      u32 val;
  
        /*
         * Not 100% correct for planes that can move between pipes,
         * but that's only the case for gen2-4 which don't have any
         * display power wells.
         */
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret = I915_READ(DSPCNTR(i9xx_plane)) & DISPLAY_PLANE_ENABLE;
 +      val = I915_READ(DSPCNTR(i9xx_plane));
 +
 +      ret = val & DISPLAY_PLANE_ENABLE;
 +
 +      if (INTEL_GEN(dev_priv) >= 5)
 +              *pipe = plane->pipe;
 +      else
 +              *pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
 +                      DISPPLANE_SEL_PIPE_SHIFT;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -4600,33 -4630,20 +4599,33 @@@ static void ivybridge_update_fdi_bc_bif
        }
  }
  
 -/* Return which DP Port should be selected for Transcoder DP control */
 -static enum port
 -intel_trans_dp_port_sel(struct intel_crtc *crtc)
 +/*
 + * Finds the encoder associated with the given CRTC. This can only be
 + * used when we know that the CRTC isn't feeding multiple encoders!
 + */
 +static struct intel_encoder *
 +intel_get_crtc_new_encoder(const struct intel_atomic_state *state,
 +                         const struct intel_crtc_state *crtc_state)
  {
 -      struct drm_device *dev = crtc->base.dev;
 -      struct intel_encoder *encoder;
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      const struct drm_connector_state *connector_state;
 +      const struct drm_connector *connector;
 +      struct intel_encoder *encoder = NULL;
 +      int num_encoders = 0;
 +      int i;
 +
 +      for_each_new_connector_in_state(&state->base, connector, connector_state, i) {
 +              if (connector_state->crtc != &crtc->base)
 +                      continue;
  
 -      for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
 -              if (encoder->type == INTEL_OUTPUT_DP ||
 -                  encoder->type == INTEL_OUTPUT_EDP)
 -                      return encoder->port;
 +              encoder = to_intel_encoder(connector_state->best_encoder);
 +              num_encoders++;
        }
  
 -      return -1;
 +      WARN(num_encoders != 1, "%d encoders for pipe %c\n",
 +           num_encoders, pipe_name(crtc->pipe));
 +
 +      return encoder;
  }
  
  /*
   *   - DP transcoding bits
   *   - transcoder
   */
 -static void ironlake_pch_enable(const struct intel_crtc_state *crtc_state)
 +static void ironlake_pch_enable(const struct intel_atomic_state *state,
 +                              const struct intel_crtc_state *crtc_state)
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
        struct drm_device *dev = crtc->base.dev;
                        &crtc_state->base.adjusted_mode;
                u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
                i915_reg_t reg = TRANS_DP_CTL(pipe);
 +              enum port port;
 +
                temp = I915_READ(reg);
                temp &= ~(TRANS_DP_PORT_SEL_MASK |
                          TRANS_DP_SYNC_MASK |
                if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
                        temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
  
 -              switch (intel_trans_dp_port_sel(crtc)) {
 -              case PORT_B:
 -                      temp |= TRANS_DP_PORT_SEL_B;
 -                      break;
 -              case PORT_C:
 -                      temp |= TRANS_DP_PORT_SEL_C;
 -                      break;
 -              case PORT_D:
 -                      temp |= TRANS_DP_PORT_SEL_D;
 -                      break;
 -              default:
 -                      BUG();
 -              }
 +              port = intel_get_crtc_new_encoder(state, crtc_state)->port;
 +              WARN_ON(port < PORT_B || port > PORT_D);
 +              temp |= TRANS_DP_PORT_SEL(port);
  
                I915_WRITE(reg, temp);
        }
        ironlake_enable_pch_transcoder(dev_priv, pipe);
  }
  
 -static void lpt_pch_enable(const struct intel_crtc_state *crtc_state)
 +static void lpt_pch_enable(const struct intel_atomic_state *state,
 +                         const struct intel_crtc_state *crtc_state)
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@@ -4752,39 -4775,6 +4751,39 @@@ static void cpt_verify_modeset(struct d
        }
  }
  
 +/*
 + * The hardware phase 0.0 refers to the center of the pixel.
 + * We want to start from the top/left edge which is phase
 + * -0.5. That matches how the hardware calculates the scaling
 + * factors (from top-left of the first pixel to bottom-right
 + * of the last pixel, as opposed to the pixel centers).
 + *
 + * For 4:2:0 subsampled chroma planes we obviously have to
 + * adjust that so that the chroma sample position lands in
 + * the right spot.
 + *
 + * Note that for packed YCbCr 4:2:2 formats there is no way to
 + * control chroma siting. The hardware simply replicates the
 + * chroma samples for both of the luma samples, and thus we don't
 + * actually get the expected MPEG2 chroma siting convention :(
 + * The same behaviour is observed on pre-SKL platforms as well.
 + */
 +u16 skl_scaler_calc_phase(int sub, bool chroma_cosited)
 +{
 +      int phase = -0x8000;
 +      u16 trip = 0;
 +
 +      if (chroma_cosited)
 +              phase += (sub - 1) * 0x8000 / sub;
 +
 +      if (phase < 0)
 +              phase = 0x10000 + phase;
 +      else
 +              trip = PS_PHASE_TRIP;
 +
 +      return ((phase >> 2) & PS_PHASE_MASK) | trip;
 +}
 +
  static int
  skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
                  unsigned int scaler_user, int *scaler_id,
@@@ -4984,22 -4974,14 +4983,22 @@@ static void skylake_pfit_enable(struct 
                &crtc->config->scaler_state;
  
        if (crtc->config->pch_pfit.enabled) {
 +              u16 uv_rgb_hphase, uv_rgb_vphase;
                int id;
  
                if (WARN_ON(crtc->config->scaler_state.scaler_id < 0))
                        return;
  
 +              uv_rgb_hphase = skl_scaler_calc_phase(1, false);
 +              uv_rgb_vphase = skl_scaler_calc_phase(1, false);
 +
                id = scaler_state->scaler_id;
                I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
                        PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
 +              I915_WRITE_FW(SKL_PS_VPHASE(pipe, id),
 +                            PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
 +              I915_WRITE_FW(SKL_PS_HPHASE(pipe, id),
 +                            PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
                I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc->config->pch_pfit.pos);
                I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc->config->pch_pfit.size);
        }
@@@ -5518,8 -5500,10 +5517,8 @@@ static void ironlake_crtc_enable(struc
         *
         * Spurious PCH underruns also occur during PCH enabling.
         */
 -      if (intel_crtc->config->has_pch_encoder || IS_GEN5(dev_priv))
 -              intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
 -      if (intel_crtc->config->has_pch_encoder)
 -              intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
 +      intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
 +      intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
  
        if (intel_crtc->config->has_pch_encoder)
                intel_prepare_shared_dpll(intel_crtc);
        intel_enable_pipe(pipe_config);
  
        if (intel_crtc->config->has_pch_encoder)
 -              ironlake_pch_enable(pipe_config);
 +              ironlake_pch_enable(old_intel_state, pipe_config);
  
        assert_vblank_disabled(crtc);
        drm_crtc_vblank_on(crtc);
        if (HAS_PCH_CPT(dev_priv))
                cpt_verify_modeset(dev, intel_crtc->pipe);
  
 -      /* Must wait for vblank to avoid spurious PCH FIFO underruns */
 -      if (intel_crtc->config->has_pch_encoder)
 +      /*
 +       * Must wait for vblank to avoid spurious PCH FIFO underruns.
 +       * And a second vblank wait is needed at least on ILK with
 +       * some interlaced HDMI modes. Let's do the double wait always
 +       * in case there are more corner cases we don't know about.
 +       */
 +      if (intel_crtc->config->has_pch_encoder) {
 +              intel_wait_for_vblank(dev_priv, pipe);
                intel_wait_for_vblank(dev_priv, pipe);
 +      }
        intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
        intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
  }
@@@ -5645,11 -5622,6 +5644,11 @@@ static void haswell_crtc_enable(struct 
        if (INTEL_GEN(dev_priv) >= 11)
                icl_map_plls_to_ports(crtc, pipe_config, old_state);
  
 +      intel_encoders_pre_enable(crtc, pipe_config, old_state);
 +
 +      if (!transcoder_is_dsi(cpu_transcoder))
 +              intel_ddi_enable_pipe_clock(pipe_config);
 +
        if (intel_crtc_has_dp_encoder(intel_crtc->config))
                intel_dp_set_m_n(intel_crtc, M1_N1);
  
  
        intel_crtc->active = true;
  
 -      intel_encoders_pre_enable(crtc, pipe_config, old_state);
 -
 -      if (!transcoder_is_dsi(cpu_transcoder))
 -              intel_ddi_enable_pipe_clock(pipe_config);
 -
        /* Display WA #1180: WaDisableScalarClockGating: glk, cnl */
        psl_clkgate_wa = (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) &&
                         intel_crtc->config->pch_pfit.enabled;
                intel_enable_pipe(pipe_config);
  
        if (intel_crtc->config->has_pch_encoder)
 -              lpt_pch_enable(pipe_config);
 +              lpt_pch_enable(old_intel_state, pipe_config);
  
        if (intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_DP_MST))
                intel_ddi_set_vc_payload_alloc(pipe_config, true);
@@@ -5763,8 -5740,10 +5762,8 @@@ static void ironlake_crtc_disable(struc
         * pipe is already disabled, but FDI RX/TX is still enabled.
         * Happens at least with VGA+HDMI cloning. Suppress them.
         */
 -      if (intel_crtc->config->has_pch_encoder) {
 -              intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
 -              intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
 -      }
 +      intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
 +      intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
  
        intel_encoders_disable(crtc, old_crtc_state, old_state);
  
@@@ -5869,22 -5848,6 +5868,22 @@@ static void i9xx_pfit_enable(struct int
        I915_WRITE(BCLRPAT(crtc->pipe), 0);
  }
  
 +bool intel_port_is_tc(struct drm_i915_private *dev_priv, enum port port)
 +{
 +      if (IS_ICELAKE(dev_priv))
 +              return port >= PORT_C && port <= PORT_F;
 +
 +      return false;
 +}
 +
 +enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port)
 +{
 +      if (!intel_port_is_tc(dev_priv, port))
 +              return PORT_TC_NONE;
 +
 +      return port - PORT_C;
 +}
 +
  enum intel_display_power_domain intel_port_to_power_domain(enum port port)
  {
        switch (port) {
@@@ -7711,18 -7674,16 +7710,18 @@@ i9xx_get_initial_plane_config(struct in
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *plane = to_intel_plane(crtc->base.primary);
        enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
 -      enum pipe pipe = crtc->pipe;
 +      enum pipe pipe;
        u32 val, base, offset;
        int fourcc, pixel_format;
        unsigned int aligned_height;
        struct drm_framebuffer *fb;
        struct intel_framebuffer *intel_fb;
  
 -      if (!plane->get_hw_state(plane))
 +      if (!plane->get_hw_state(plane, &pipe))
                return;
  
 +      WARN_ON(pipe != crtc->pipe);
 +
        intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
        if (!intel_fb) {
                DRM_DEBUG_KMS("failed to alloc fb\n");
@@@ -8743,18 -8704,16 +8742,18 @@@ skylake_get_initial_plane_config(struc
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *plane = to_intel_plane(crtc->base.primary);
        enum plane_id plane_id = plane->id;
 -      enum pipe pipe = crtc->pipe;
 +      enum pipe pipe;
        u32 val, base, offset, stride_mult, tiling, alpha;
        int fourcc, pixel_format;
        unsigned int aligned_height;
        struct drm_framebuffer *fb;
        struct intel_framebuffer *intel_fb;
  
 -      if (!plane->get_hw_state(plane))
 +      if (!plane->get_hw_state(plane, &pipe))
                return;
  
 +      WARN_ON(pipe != crtc->pipe);
 +
        intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
        if (!intel_fb) {
                DRM_DEBUG_KMS("failed to alloc fb\n");
@@@ -9182,12 -9141,9 +9181,12 @@@ void hsw_disable_pc8(struct drm_i915_pr
  static int haswell_crtc_compute_clock(struct intel_crtc *crtc,
                                      struct intel_crtc_state *crtc_state)
  {
 +      struct intel_atomic_state *state =
 +              to_intel_atomic_state(crtc_state->base.state);
 +
        if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI)) {
                struct intel_encoder *encoder =
 -                      intel_ddi_get_crtc_new_encoder(crtc_state);
 +                      intel_get_crtc_new_encoder(state, crtc_state);
  
                if (!intel_get_shared_dpll(crtc, crtc_state, encoder)) {
                        DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
@@@ -9735,8 -9691,7 +9734,8 @@@ static void i845_disable_cursor(struct 
        i845_update_cursor(plane, NULL, NULL);
  }
  
 -static bool i845_cursor_get_hw_state(struct intel_plane *plane)
 +static bool i845_cursor_get_hw_state(struct intel_plane *plane,
 +                                   enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
  
        ret = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE;
  
 +      *pipe = PIPE_A;
 +
        intel_display_power_put(dev_priv, power_domain);
  
        return ret;
@@@ -9761,30 -9714,25 +9760,30 @@@ static u32 i9xx_cursor_ctl(const struc
        struct drm_i915_private *dev_priv =
                to_i915(plane_state->base.plane->dev);
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 -      u32 cntl;
 +      u32 cntl = 0;
  
 -      cntl = MCURSOR_GAMMA_ENABLE;
 +      if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
 +              cntl |= MCURSOR_TRICKLE_FEED_DISABLE;
  
 -      if (HAS_DDI(dev_priv))
 -              cntl |= CURSOR_PIPE_CSC_ENABLE;
 +      if (INTEL_GEN(dev_priv) <= 10) {
 +              cntl |= MCURSOR_GAMMA_ENABLE;
 +
 +              if (HAS_DDI(dev_priv))
 +                      cntl |= MCURSOR_PIPE_CSC_ENABLE;
 +      }
  
        if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
                cntl |= MCURSOR_PIPE_SELECT(crtc->pipe);
  
        switch (plane_state->base.crtc_w) {
        case 64:
 -              cntl |= CURSOR_MODE_64_ARGB_AX;
 +              cntl |= MCURSOR_MODE_64_ARGB_AX;
                break;
        case 128:
 -              cntl |= CURSOR_MODE_128_ARGB_AX;
 +              cntl |= MCURSOR_MODE_128_ARGB_AX;
                break;
        case 256:
 -              cntl |= CURSOR_MODE_256_ARGB_AX;
 +              cntl |= MCURSOR_MODE_256_ARGB_AX;
                break;
        default:
                MISSING_CASE(plane_state->base.crtc_w);
        }
  
        if (plane_state->base.rotation & DRM_MODE_ROTATE_180)
 -              cntl |= CURSOR_ROTATE_180;
 +              cntl |= MCURSOR_ROTATE_180;
  
        return cntl;
  }
@@@ -9954,32 -9902,23 +9953,32 @@@ static void i9xx_disable_cursor(struct 
        i9xx_update_cursor(plane, NULL, NULL);
  }
  
 -static bool i9xx_cursor_get_hw_state(struct intel_plane *plane)
 +static bool i9xx_cursor_get_hw_state(struct intel_plane *plane,
 +                                   enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
 -      enum pipe pipe = plane->pipe;
        bool ret;
 +      u32 val;
  
        /*
         * Not 100% correct for planes that can move between pipes,
         * but that's only the case for gen2-3 which don't have any
         * display power wells.
         */
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
 +      val = I915_READ(CURCNTR(plane->pipe));
 +
 +      ret = val & MCURSOR_MODE;
 +
 +      if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
 +              *pipe = plane->pipe;
 +      else
 +              *pipe = (val & MCURSOR_PIPE_SELECT_MASK) >>
 +                      MCURSOR_PIPE_SELECT_SHIFT;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -13241,8 -13180,17 +13240,17 @@@ void intel_plane_destroy(struct drm_pla
        kfree(to_intel_plane(plane));
  }
  
- static bool i8xx_mod_supported(uint32_t format, uint64_t modifier)
+ static bool i8xx_plane_format_mod_supported(struct drm_plane *_plane,
+                                           u32 format, u64 modifier)
  {
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_C8:
        case DRM_FORMAT_RGB565:
        }
  }
  
- static bool i965_mod_supported(uint32_t format, uint64_t modifier)
+ static bool i965_plane_format_mod_supported(struct drm_plane *_plane,
+                                           u32 format, u64 modifier)
  {
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_C8:
        case DRM_FORMAT_RGB565:
        }
  }
  
- static bool skl_mod_supported(uint32_t format, uint64_t modifier)
+ static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
+                                          u32 format, u64 modifier)
  {
+       struct intel_plane *plane = to_intel_plane(_plane);
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+       case I915_FORMAT_MOD_Y_TILED:
+       case I915_FORMAT_MOD_Yf_TILED:
+               break;
+       case I915_FORMAT_MOD_Y_TILED_CCS:
+       case I915_FORMAT_MOD_Yf_TILED_CCS:
+               if (!plane->has_ccs)
+                       return false;
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_XRGB8888:
        case DRM_FORMAT_XBGR8888:
        }
  }
  
- static bool intel_primary_plane_format_mod_supported(struct drm_plane *plane,
-                                                    uint32_t format,
-                                                    uint64_t modifier)
+ static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
+                                             u32 format, u64 modifier)
  {
-       struct drm_i915_private *dev_priv = to_i915(plane->dev);
-       if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID))
-               return false;
-       if ((modifier >> 56) != DRM_FORMAT_MOD_VENDOR_INTEL &&
-           modifier != DRM_FORMAT_MOD_LINEAR)
-               return false;
-       if (INTEL_GEN(dev_priv) >= 9)
-               return skl_mod_supported(format, modifier);
-       else if (INTEL_GEN(dev_priv) >= 4)
-               return i965_mod_supported(format, modifier);
-       else
-               return i8xx_mod_supported(format, modifier);
+       return modifier == DRM_FORMAT_MOD_LINEAR &&
+               format == DRM_FORMAT_ARGB8888;
  }
  
- static bool intel_cursor_plane_format_mod_supported(struct drm_plane *plane,
-                                                   uint32_t format,
-                                                   uint64_t modifier)
- {
-       if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID))
-               return false;
+ static struct drm_plane_funcs skl_plane_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+       .format_mod_supported = skl_plane_format_mod_supported,
+ };
  
-       return modifier == DRM_FORMAT_MOD_LINEAR && format == DRM_FORMAT_ARGB8888;
- }
+ static struct drm_plane_funcs i965_plane_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+       .format_mod_supported = i965_plane_format_mod_supported,
+ };
  
- static struct drm_plane_funcs intel_plane_funcs = {
+ static struct drm_plane_funcs i8xx_plane_funcs = {
        .update_plane = drm_atomic_helper_update_plane,
        .disable_plane = drm_atomic_helper_disable_plane,
        .destroy = intel_plane_destroy,
        .atomic_set_property = intel_plane_atomic_set_property,
        .atomic_duplicate_state = intel_plane_duplicate_state,
        .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = intel_primary_plane_format_mod_supported,
+       .format_mod_supported = i8xx_plane_format_mod_supported,
  };
  
  static int
@@@ -13468,7 -13441,7 +13501,7 @@@ static const struct drm_plane_funcs int
        .atomic_set_property = intel_plane_atomic_set_property,
        .atomic_duplicate_state = intel_plane_duplicate_state,
        .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = intel_cursor_plane_format_mod_supported,
+       .format_mod_supported = intel_cursor_format_mod_supported,
  };
  
  static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
@@@ -13526,6 -13499,7 +13559,7 @@@ intel_primary_plane_create(struct drm_i
  {
        struct intel_plane *primary = NULL;
        struct intel_plane_state *state = NULL;
+       const struct drm_plane_funcs *plane_funcs;
        const uint32_t *intel_primary_formats;
        unsigned int supported_rotations;
        unsigned int num_formats;
        primary->check_plane = intel_check_primary_plane;
  
        if (INTEL_GEN(dev_priv) >= 9) {
+               primary->has_ccs = skl_plane_has_ccs(dev_priv, pipe,
+                                                    PLANE_PRIMARY);
                if (skl_plane_has_planar(dev_priv, pipe, PLANE_PRIMARY)) {
                        intel_primary_formats = skl_pri_planar_formats;
                        num_formats = ARRAY_SIZE(skl_pri_planar_formats);
                        num_formats = ARRAY_SIZE(skl_primary_formats);
                }
  
-               if (skl_plane_has_ccs(dev_priv, pipe, PLANE_PRIMARY))
+               if (primary->has_ccs)
                        modifiers = skl_format_modifiers_ccs;
                else
                        modifiers = skl_format_modifiers_noccs;
                primary->update_plane = skl_update_plane;
                primary->disable_plane = skl_disable_plane;
                primary->get_hw_state = skl_plane_get_hw_state;
+               plane_funcs = &skl_plane_funcs;
        } else if (INTEL_GEN(dev_priv) >= 4) {
                intel_primary_formats = i965_primary_formats;
                num_formats = ARRAY_SIZE(i965_primary_formats);
                primary->update_plane = i9xx_update_plane;
                primary->disable_plane = i9xx_disable_plane;
                primary->get_hw_state = i9xx_plane_get_hw_state;
+               plane_funcs = &i965_plane_funcs;
        } else {
                intel_primary_formats = i8xx_primary_formats;
                num_formats = ARRAY_SIZE(i8xx_primary_formats);
                primary->update_plane = i9xx_update_plane;
                primary->disable_plane = i9xx_disable_plane;
                primary->get_hw_state = i9xx_plane_get_hw_state;
+               plane_funcs = &i8xx_plane_funcs;
        }
  
        if (INTEL_GEN(dev_priv) >= 9)
                ret = drm_universal_plane_init(&dev_priv->drm, &primary->base,
-                                              0, &intel_plane_funcs,
+                                              0, plane_funcs,
                                               intel_primary_formats, num_formats,
                                               modifiers,
                                               DRM_PLANE_TYPE_PRIMARY,
                                               "plane 1%c", pipe_name(pipe));
        else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
                ret = drm_universal_plane_init(&dev_priv->drm, &primary->base,
-                                              0, &intel_plane_funcs,
+                                              0, plane_funcs,
                                               intel_primary_formats, num_formats,
                                               modifiers,
                                               DRM_PLANE_TYPE_PRIMARY,
                                               "primary %c", pipe_name(pipe));
        else
                ret = drm_universal_plane_init(&dev_priv->drm, &primary->base,
-                                              0, &intel_plane_funcs,
+                                              0, plane_funcs,
                                               intel_primary_formats, num_formats,
                                               modifiers,
                                               DRM_PLANE_TYPE_PRIMARY,
@@@ -14184,15 -14167,14 +14227,15 @@@ static void intel_setup_outputs(struct 
  static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
  {
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 +      struct drm_i915_gem_object *obj = intel_fb_obj(fb);
  
        drm_framebuffer_cleanup(fb);
  
 -      i915_gem_object_lock(intel_fb->obj);
 -      WARN_ON(!intel_fb->obj->framebuffer_references--);
 -      i915_gem_object_unlock(intel_fb->obj);
 +      i915_gem_object_lock(obj);
 +      WARN_ON(!obj->framebuffer_references--);
 +      i915_gem_object_unlock(obj);
  
 -      i915_gem_object_put(intel_fb->obj);
 +      i915_gem_object_put(obj);
  
        kfree(intel_fb);
  }
@@@ -14201,7 -14183,8 +14244,7 @@@ static int intel_user_framebuffer_creat
                                                struct drm_file *file,
                                                unsigned int *handle)
  {
 -      struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 -      struct drm_i915_gem_object *obj = intel_fb->obj;
 +      struct drm_i915_gem_object *obj = intel_fb_obj(fb);
  
        if (obj->userptr.mm) {
                DRM_DEBUG("attempting to use a userptr for a framebuffer, denied\n");
@@@ -14471,9 -14454,9 +14514,9 @@@ static int intel_framebuffer_init(struc
                                      i, fb->pitches[i], stride_alignment);
                        goto err;
                }
 -      }
  
 -      intel_fb->obj = obj;
 +              fb->obj[i] = &obj->base;
 +      }
  
        ret = intel_fill_fb_info(dev_priv, fb);
        if (ret)
@@@ -15155,8 -15138,8 +15198,8 @@@ void i830_disable_pipe(struct drm_i915_
        WARN_ON(I915_READ(DSPCNTR(PLANE_A)) & DISPLAY_PLANE_ENABLE);
        WARN_ON(I915_READ(DSPCNTR(PLANE_B)) & DISPLAY_PLANE_ENABLE);
        WARN_ON(I915_READ(DSPCNTR(PLANE_C)) & DISPLAY_PLANE_ENABLE);
 -      WARN_ON(I915_READ(CURCNTR(PIPE_A)) & CURSOR_MODE);
 -      WARN_ON(I915_READ(CURCNTR(PIPE_B)) & CURSOR_MODE);
 +      WARN_ON(I915_READ(CURCNTR(PIPE_A)) & MCURSOR_MODE);
 +      WARN_ON(I915_READ(CURCNTR(PIPE_B)) & MCURSOR_MODE);
  
        I915_WRITE(PIPECONF(pipe), 0);
        POSTING_READ(PIPECONF(pipe));
  static bool intel_plane_mapping_ok(struct intel_crtc *crtc,
                                   struct intel_plane *plane)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 -      enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
 -      u32 val = I915_READ(DSPCNTR(i9xx_plane));
 +      enum pipe pipe;
  
 -      return (val & DISPLAY_PLANE_ENABLE) == 0 ||
 -              (val & DISPPLANE_SEL_PIPE_MASK) == DISPPLANE_SEL_PIPE(crtc->pipe);
 +      if (!plane->get_hw_state(plane, &pipe))
 +              return true;
 +
 +      return pipe == crtc->pipe;
  }
  
  static void
@@@ -15334,9 -15317,6 +15377,9 @@@ static void intel_sanitize_encoder(stru
                connector->base.dpms = DRM_MODE_DPMS_OFF;
                connector->base.encoder = NULL;
        }
 +
 +      /* notify opregion of the sanitized encoder state */
 +      intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
  }
  
  void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv)
@@@ -15377,10 -15357,7 +15420,10 @@@ static void readout_plane_state(struct 
        for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
                struct intel_plane_state *plane_state =
                        to_intel_plane_state(plane->base.state);
 -              bool visible = plane->get_hw_state(plane);
 +              enum pipe pipe;
 +              bool visible;
 +
 +              visible = plane->get_hw_state(plane, &pipe);
  
                intel_set_plane_visible(crtc_state, plane_state, visible);
        }
index 8641583842be60e964faca17fd065c1b34040ed3,3e850b745390fbecd0a0a78a73dd7aac2f298643..8840108749a5dccc5a878f23f443f155e879cece
@@@ -194,6 -194,7 +194,6 @@@ enum intel_output_type 
  
  struct intel_framebuffer {
        struct drm_framebuffer base;
 -      struct drm_i915_gem_object *obj;
        struct intel_rotation_info rot_info;
  
        /* for each plane in the normal GTT view */
@@@ -952,6 -953,7 +952,7 @@@ struct intel_plane 
        enum pipe pipe;
        bool can_scale;
        bool has_fbc;
+       bool has_ccs;
        int max_downscale;
        uint32_t frontbuffer_bit;
  
                             const struct intel_plane_state *plane_state);
        void (*disable_plane)(struct intel_plane *plane,
                              struct intel_crtc *crtc);
 -      bool (*get_hw_state)(struct intel_plane *plane);
 +      bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe);
        int (*check_plane)(struct intel_plane *plane,
                           struct intel_crtc_state *crtc_state,
                           struct intel_plane_state *state);
@@@ -1003,7 -1005,7 +1004,7 @@@ struct cxsr_latency 
  #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
  #define to_intel_plane(x) container_of(x, struct intel_plane, base)
  #define to_intel_plane_state(x) container_of(x, struct intel_plane_state, base)
 -#define intel_fb_obj(x) (x ? to_intel_framebuffer(x)->obj : NULL)
 +#define intel_fb_obj(x) ((x) ? to_intel_bo((x)->obj[0]) : NULL)
  
  struct intel_hdmi {
        i915_reg_t hdmi_reg;
@@@ -1375,8 -1377,6 +1376,8 @@@ void gen9_enable_guc_interrupts(struct 
  void gen9_disable_guc_interrupts(struct drm_i915_private *dev_priv);
  
  /* intel_crt.c */
 +bool intel_crt_port_enabled(struct drm_i915_private *dev_priv,
 +                          i915_reg_t adpa_reg, enum pipe *pipe);
  void intel_crt_init(struct drm_i915_private *dev_priv);
  void intel_crt_reset(struct drm_encoder *encoder);
  
@@@ -1393,6 -1393,8 +1394,6 @@@ void intel_ddi_disable_transcoder_func(
                                       enum transcoder cpu_transcoder);
  void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state);
  void intel_ddi_disable_pipe_clock(const  struct intel_crtc_state *crtc_state);
 -struct intel_encoder *
 -intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state);
  void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state);
  void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
  bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
@@@ -1406,8 -1408,6 +1407,8 @@@ void intel_ddi_compute_min_voltage_leve
  u32 bxt_signal_levels(struct intel_dp *intel_dp);
  uint32_t ddi_signal_levels(struct intel_dp *intel_dp);
  u8 intel_ddi_dp_voltage_max(struct intel_encoder *encoder);
 +u8 intel_ddi_dp_pre_emphasis_max(struct intel_encoder *encoder,
 +                               u8 voltage_swing);
  int intel_ddi_toggle_hdcp_signalling(struct intel_encoder *intel_encoder,
                                     bool enable);
  void icl_map_plls_to_ports(struct drm_crtc *crtc,
@@@ -1489,9 -1489,6 +1490,9 @@@ void intel_connector_attach_encoder(str
                                    struct intel_encoder *encoder);
  struct drm_display_mode *
  intel_encoder_current_mode(struct intel_encoder *encoder);
 +bool intel_port_is_tc(struct drm_i915_private *dev_priv, enum port port);
 +enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv,
 +                            enum port port);
  
  enum pipe intel_get_pipe_from_connector(struct intel_connector *connector);
  int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
@@@ -1619,7 -1616,6 +1620,7 @@@ void intel_mode_from_pipe_config(struc
  void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
                                  struct intel_crtc_state *crtc_state);
  
 +u16 skl_scaler_calc_phase(int sub, bool chroma_center);
  int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
  int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
                  uint32_t pixel_format);
@@@ -1649,9 -1645,6 +1650,9 @@@ void intel_csr_ucode_suspend(struct drm
  void intel_csr_ucode_resume(struct drm_i915_private *);
  
  /* intel_dp.c */
 +bool intel_dp_port_enabled(struct drm_i915_private *dev_priv,
 +                         i915_reg_t dp_reg, enum port port,
 +                         enum pipe *pipe);
  bool intel_dp_init(struct drm_i915_private *dev_priv, i915_reg_t output_reg,
                   enum port port);
  bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
@@@ -1829,8 -1822,6 +1830,8 @@@ void intel_infoframe_init(struct intel_
  
  
  /* intel_lvds.c */
 +bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv,
 +                           i915_reg_t lvds_reg, enum pipe *pipe);
  void intel_lvds_init(struct drm_i915_private *dev_priv);
  struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev);
  bool intel_is_dual_link_lvds(struct drm_device *dev);
@@@ -1921,6 -1912,8 +1922,6 @@@ void intel_psr_flush(struct drm_i915_pr
                     unsigned frontbuffer_bits,
                     enum fb_op_origin origin);
  void intel_psr_init(struct drm_i915_private *dev_priv);
 -void intel_psr_single_frame_update(struct drm_i915_private *dev_priv,
 -                                 unsigned frontbuffer_bits);
  void intel_psr_compute_config(struct intel_dp *intel_dp,
                              struct intel_crtc_state *crtc_state);
  void intel_psr_irq_control(struct drm_i915_private *dev_priv, bool debug);
@@@ -2066,8 -2059,6 +2067,8 @@@ void intel_init_ipc(struct drm_i915_pri
  void intel_enable_ipc(struct drm_i915_private *dev_priv);
  
  /* intel_sdvo.c */
 +bool intel_sdvo_port_enabled(struct drm_i915_private *dev_priv,
 +                           i915_reg_t sdvo_reg, enum pipe *pipe);
  bool intel_sdvo_init(struct drm_i915_private *dev_priv,
                     i915_reg_t reg, enum port port);
  
@@@ -2086,7 -2077,7 +2087,7 @@@ void skl_update_plane(struct intel_plan
                      const struct intel_crtc_state *crtc_state,
                      const struct intel_plane_state *plane_state);
  void skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc);
 -bool skl_plane_get_hw_state(struct intel_plane *plane);
 +bool skl_plane_get_hw_state(struct intel_plane *plane, enum pipe *pipe);
  bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
                       enum pipe pipe, enum plane_id plane_id);
  bool intel_format_is_yuv(uint32_t format);
index ba5ea61fb7b96f4a00729a1e86178f6295c306cd,ea958ed0777d67415745aa19ad105b34a96c5bd9..0ca4cc877520d82935567b8a7ff37583ed7e59f7
@@@ -461,7 -461,8 +461,8 @@@ static void intel_write_infoframe(struc
  }
  
  static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
-                                        const struct intel_crtc_state *crtc_state)
+                                        const struct intel_crtc_state *crtc_state,
+                                        const struct drm_connector_state *conn_state)
  {
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
        const struct drm_display_mode *adjusted_mode =
                                           intel_hdmi->rgb_quant_range_selectable,
                                           is_hdmi2_sink);
  
+       drm_hdmi_avi_infoframe_content_type(&frame.avi,
+                                           conn_state);
        /* TODO: handle pixel repetition for YCBCR420 outputs */
        intel_write_infoframe(encoder, crtc_state, &frame);
  }
@@@ -586,7 -590,7 +590,7 @@@ static void g4x_set_infoframes(struct d
        I915_WRITE(reg, val);
        POSTING_READ(reg);
  
-       intel_hdmi_set_avi_infoframe(encoder, crtc_state);
+       intel_hdmi_set_avi_infoframe(encoder, crtc_state, conn_state);
        intel_hdmi_set_spd_infoframe(encoder, crtc_state);
        intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
  }
@@@ -727,7 -731,7 +731,7 @@@ static void ibx_set_infoframes(struct d
        I915_WRITE(reg, val);
        POSTING_READ(reg);
  
-       intel_hdmi_set_avi_infoframe(encoder, crtc_state);
+       intel_hdmi_set_avi_infoframe(encoder, crtc_state, conn_state);
        intel_hdmi_set_spd_infoframe(encoder, crtc_state);
        intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
  }
@@@ -770,7 -774,7 +774,7 @@@ static void cpt_set_infoframes(struct d
        I915_WRITE(reg, val);
        POSTING_READ(reg);
  
-       intel_hdmi_set_avi_infoframe(encoder, crtc_state);
+       intel_hdmi_set_avi_infoframe(encoder, crtc_state, conn_state);
        intel_hdmi_set_spd_infoframe(encoder, crtc_state);
        intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
  }
@@@ -823,7 -827,7 +827,7 @@@ static void vlv_set_infoframes(struct d
        I915_WRITE(reg, val);
        POSTING_READ(reg);
  
-       intel_hdmi_set_avi_infoframe(encoder, crtc_state);
+       intel_hdmi_set_avi_infoframe(encoder, crtc_state, conn_state);
        intel_hdmi_set_spd_infoframe(encoder, crtc_state);
        intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
  }
@@@ -856,7 -860,7 +860,7 @@@ static void hsw_set_infoframes(struct d
        I915_WRITE(reg, val);
        POSTING_READ(reg);
  
-       intel_hdmi_set_avi_infoframe(encoder, crtc_state);
+       intel_hdmi_set_avi_infoframe(encoder, crtc_state, conn_state);
        intel_hdmi_set_spd_infoframe(encoder, crtc_state);
        intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
  }
@@@ -1161,16 -1165,33 +1165,16 @@@ static void intel_hdmi_prepare(struct i
  static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
                                    enum pipe *pipe)
  {
 -      struct drm_device *dev = encoder->base.dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 -      u32 tmp;
        bool ret;
  
        if (!intel_display_power_get_if_enabled(dev_priv,
                                                encoder->power_domain))
                return false;
  
 -      ret = false;
 -
 -      tmp = I915_READ(intel_hdmi->hdmi_reg);
 -
 -      if (!(tmp & SDVO_ENABLE))
 -              goto out;
 -
 -      if (HAS_PCH_CPT(dev_priv))
 -              *pipe = PORT_TO_PIPE_CPT(tmp);
 -      else if (IS_CHERRYVIEW(dev_priv))
 -              *pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
 -      else
 -              *pipe = PORT_TO_PIPE(tmp);
 -
 -      ret = true;
 +      ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe);
  
 -out:
        intel_display_power_put(dev_priv, encoder->power_domain);
  
        return ret;
@@@ -1404,8 -1425,8 +1408,8 @@@ static void intel_disable_hdmi(struct i
                intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
                intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
  
 -              temp &= ~SDVO_PIPE_B_SELECT;
 -              temp |= SDVO_ENABLE;
 +              temp &= ~SDVO_PIPE_SEL_MASK;
 +              temp |= SDVO_ENABLE | SDVO_PIPE_SEL(PIPE_A);
                /*
                 * HW workaround, need to write this twice for issue
                 * that may result in first write getting masked.
@@@ -2048,6 -2069,7 +2052,7 @@@ intel_hdmi_add_properties(struct intel_
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
        intel_attach_aspect_ratio_property(connector);
+       drm_connector_attach_content_type_property(connector);
        connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
  }
  
index 6496c1d00dbbac3f96f876d7f531f5188124692c,cd4fb796d97d926f1766a371af8c1a9dd7cf1f1a..65811e2fa7da90aaaba15bbb6b0733018d1cb14c
@@@ -531,22 -531,9 +531,22 @@@ out
        return ret;
  }
  
 -static void reset_ring_common(struct intel_engine_cs *engine,
 -                            struct i915_request *request)
 +static struct i915_request *reset_prepare(struct intel_engine_cs *engine)
  {
 +      intel_engine_stop_cs(engine);
 +
 +      if (engine->irq_seqno_barrier)
 +              engine->irq_seqno_barrier(engine);
 +
 +      return i915_gem_find_active_request(engine);
 +}
 +
 +static void reset_ring(struct intel_engine_cs *engine,
 +                     struct i915_request *request)
 +{
 +      GEM_TRACE("%s seqno=%x\n",
 +                engine->name, request ? request->global_seqno : 0);
 +
        /*
         * RC6 must be prevented until the reset is complete and the engine
         * reinitialised. If it occurs in the middle of this sequence, the
         */
        if (request) {
                struct drm_i915_private *dev_priv = request->i915;
 -              struct intel_context *ce = to_intel_context(request->ctx,
 -                                                          engine);
 +              struct intel_context *ce = request->hw_context;
                struct i915_hw_ppgtt *ppgtt;
  
                if (ce->state) {
                                   CCID_EN);
                }
  
 -              ppgtt = request->ctx->ppgtt ?: engine->i915->mm.aliasing_ppgtt;
 +              ppgtt = request->gem_context->ppgtt ?: engine->i915->mm.aliasing_ppgtt;
                if (ppgtt) {
                        u32 pd_offset = ppgtt->pd.base.ggtt_offset << 10;
  
        }
  }
  
 +static void reset_finish(struct intel_engine_cs *engine)
 +{
 +}
 +
  static int intel_rcs_ctx_init(struct i915_request *rq)
  {
        int ret;
@@@ -1049,6 -1033,8 +1049,8 @@@ int intel_ring_pin(struct intel_ring *r
                flags |= PIN_OFFSET_BIAS | offset_bias;
        if (vma->obj->stolen)
                flags |= PIN_MAPPABLE;
+       else
+               flags |= PIN_HIGH;
  
        if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
                if (flags & PIN_MAPPABLE || map == I915_MAP_WC)
@@@ -1121,7 -1107,7 +1123,7 @@@ intel_ring_create_vma(struct drm_i915_p
        /* mark ring buffers as read-only from GPU side by default */
        obj->gt_ro = 1;
  
 -      vma = i915_vma_instance(obj, &dev_priv->ggtt.base, NULL);
 +      vma = i915_vma_instance(obj, &dev_priv->ggtt.vm, NULL);
        if (IS_ERR(vma))
                goto err;
  
@@@ -1185,22 -1171,10 +1187,22 @@@ intel_ring_free(struct intel_ring *ring
        kfree(ring);
  }
  
 -static int context_pin(struct intel_context *ce)
 +static void intel_ring_context_destroy(struct intel_context *ce)
  {
 -      struct i915_vma *vma = ce->state;
 -      int ret;
 +      GEM_BUG_ON(ce->pin_count);
 +
 +      if (ce->state)
 +              __i915_gem_object_release_unless_active(ce->state->obj);
 +}
 +
 +static int __context_pin(struct intel_context *ce)
 +{
 +      struct i915_vma *vma;
 +      int err;
 +
 +      vma = ce->state;
 +      if (!vma)
 +              return 0;
  
        /*
         * Clear this page out of any CPU caches for coherent swap-in/out.
         * on an active context (which by nature is already on the GPU).
         */
        if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
 -              ret = i915_gem_object_set_to_gtt_domain(vma->obj, true);
 -              if (ret)
 -                      return ret;
 +              err = i915_gem_object_set_to_gtt_domain(vma->obj, true);
 +              if (err)
 +                      return err;
        }
  
 -      return i915_vma_pin(vma, 0, I915_GTT_MIN_ALIGNMENT,
 -                          PIN_GLOBAL | PIN_HIGH);
 +      err = i915_vma_pin(vma, 0, I915_GTT_MIN_ALIGNMENT,
 +                         PIN_GLOBAL | PIN_HIGH);
 +      if (err)
 +              return err;
 +
 +      /*
 +       * And mark is as a globally pinned object to let the shrinker know
 +       * it cannot reclaim the object until we release it.
 +       */
 +      vma->obj->pin_global++;
 +
 +      return 0;
 +}
 +
 +static void __context_unpin(struct intel_context *ce)
 +{
 +      struct i915_vma *vma;
 +
 +      vma = ce->state;
 +      if (!vma)
 +              return;
 +
 +      vma->obj->pin_global--;
 +      i915_vma_unpin(vma);
 +}
 +
 +static void intel_ring_context_unpin(struct intel_context *ce)
 +{
 +      __context_unpin(ce);
 +
 +      i915_gem_context_put(ce->gem_context);
  }
  
  static struct i915_vma *
@@@ -1300,7 -1245,7 +1302,7 @@@ alloc_context_vma(struct intel_engine_c
                i915_gem_object_set_cache_level(obj, I915_CACHE_L3_LLC);
        }
  
 -      vma = i915_vma_instance(obj, &i915->ggtt.base, NULL);
 +      vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
        if (IS_ERR(vma)) {
                err = PTR_ERR(vma);
                goto err_obj;
@@@ -1315,62 -1260,67 +1317,62 @@@ err_obj
        return ERR_PTR(err);
  }
  
 -static struct intel_ring *
 -intel_ring_context_pin(struct intel_engine_cs *engine,
 -                     struct i915_gem_context *ctx)
 +static struct intel_context *
 +__ring_context_pin(struct intel_engine_cs *engine,
 +                 struct i915_gem_context *ctx,
 +                 struct intel_context *ce)
  {
 -      struct intel_context *ce = to_intel_context(ctx, engine);
 -      int ret;
 -
 -      lockdep_assert_held(&ctx->i915->drm.struct_mutex);
 -
 -      if (likely(ce->pin_count++))
 -              goto out;
 -      GEM_BUG_ON(!ce->pin_count); /* no overflow please! */
 +      int err;
  
        if (!ce->state && engine->context_size) {
                struct i915_vma *vma;
  
                vma = alloc_context_vma(engine);
                if (IS_ERR(vma)) {
 -                      ret = PTR_ERR(vma);
 +                      err = PTR_ERR(vma);
                        goto err;
                }
  
                ce->state = vma;
        }
  
 -      if (ce->state) {
 -              ret = context_pin(ce);
 -              if (ret)
 -                      goto err;
 -
 -              ce->state->obj->pin_global++;
 -      }
 +      err = __context_pin(ce);
 +      if (err)
 +              goto err;
  
        i915_gem_context_get(ctx);
  
 -out:
        /* One ringbuffer to rule them all */
 -      return engine->buffer;
 +      GEM_BUG_ON(!engine->buffer);
 +      ce->ring = engine->buffer;
 +
 +      return ce;
  
  err:
        ce->pin_count = 0;
 -      return ERR_PTR(ret);
 +      return ERR_PTR(err);
  }
  
 -static void intel_ring_context_unpin(struct intel_engine_cs *engine,
 -                                   struct i915_gem_context *ctx)
 +static const struct intel_context_ops ring_context_ops = {
 +      .unpin = intel_ring_context_unpin,
 +      .destroy = intel_ring_context_destroy,
 +};
 +
 +static struct intel_context *
 +intel_ring_context_pin(struct intel_engine_cs *engine,
 +                     struct i915_gem_context *ctx)
  {
        struct intel_context *ce = to_intel_context(ctx, engine);
  
        lockdep_assert_held(&ctx->i915->drm.struct_mutex);
 -      GEM_BUG_ON(ce->pin_count == 0);
  
 -      if (--ce->pin_count)
 -              return;
 +      if (likely(ce->pin_count++))
 +              return ce;
 +      GEM_BUG_ON(!ce->pin_count); /* no overflow please! */
  
 -      if (ce->state) {
 -              ce->state->obj->pin_global--;
 -              i915_vma_unpin(ce->state);
 -      }
 +      ce->ops = &ring_context_ops;
  
 -      i915_gem_context_put(ctx);
 +      return __ring_context_pin(engine, ctx, ce);
  }
  
  static int intel_init_ring_buffer(struct intel_engine_cs *engine)
  
        intel_engine_setup_common(engine);
  
 -      err = intel_engine_init_common(engine);
 -      if (err)
 -              goto err;
 -
        timeline = i915_timeline_create(engine->i915, engine->name);
        if (IS_ERR(timeline)) {
                err = PTR_ERR(timeline);
        GEM_BUG_ON(engine->buffer);
        engine->buffer = ring;
  
 +      err = intel_engine_init_common(engine);
 +      if (err)
 +              goto err_unpin;
 +
        return 0;
  
 +err_unpin:
 +      intel_ring_unpin(ring);
  err_ring:
        intel_ring_free(ring);
  err:
@@@ -1495,7 -1443,7 +1497,7 @@@ static inline int mi_set_context(struc
  
        *cs++ = MI_NOOP;
        *cs++ = MI_SET_CONTEXT;
 -      *cs++ = i915_ggtt_offset(to_intel_context(rq->ctx, engine)->state) | flags;
 +      *cs++ = i915_ggtt_offset(rq->hw_context->state) | flags;
        /*
         * w/a: MI_SET_CONTEXT must always be followed by MI_NOOP
         * WaMiSetContext_Hang:snb,ivb,vlv
@@@ -1563,7 -1511,7 +1565,7 @@@ static int remap_l3(struct i915_reques
  static int switch_context(struct i915_request *rq)
  {
        struct intel_engine_cs *engine = rq->engine;
 -      struct i915_gem_context *to_ctx = rq->ctx;
 +      struct i915_gem_context *to_ctx = rq->gem_context;
        struct i915_hw_ppgtt *to_mm =
                to_ctx->ppgtt ?: rq->i915->mm.aliasing_ppgtt;
        struct i915_gem_context *from_ctx = engine->legacy_active_context;
                hw_flags = MI_FORCE_RESTORE;
        }
  
 -      if (to_intel_context(to_ctx, engine)->state &&
 +      if (rq->hw_context->state &&
            (to_ctx != from_ctx || hw_flags & MI_FORCE_RESTORE)) {
                GEM_BUG_ON(engine->id != RCS);
  
@@@ -1634,7 -1582,7 +1636,7 @@@ static int ring_request_alloc(struct i9
  {
        int ret;
  
 -      GEM_BUG_ON(!to_intel_context(request->ctx, request->engine)->pin_count);
 +      GEM_BUG_ON(!request->hw_context->pin_count);
  
        /* Flush enough space to reduce the likelihood of waiting after
         * we start building the request - in which case we will just
@@@ -2060,11 -2008,11 +2062,11 @@@ static void intel_ring_default_vfuncs(s
        intel_ring_init_semaphores(dev_priv, engine);
  
        engine->init_hw = init_ring_common;
 -      engine->reset_hw = reset_ring_common;
 +      engine->reset.prepare = reset_prepare;
 +      engine->reset.reset = reset_ring;
 +      engine->reset.finish = reset_finish;
  
        engine->context_pin = intel_ring_context_pin;
 -      engine->context_unpin = intel_ring_context_unpin;
 -
        engine->request_alloc = ring_request_alloc;
  
        engine->emit_breadcrumb = i9xx_emit_breadcrumb;
index d474065ed2dd364c007d7412e5a1957a0fbaef93,214cc730642cbdd4c6a45958da927262227611ee..1160bc3a1e8e445909baf89ac3e4d326312cb984
@@@ -284,35 -284,13 +284,35 @@@ skl_update_plane(struct intel_plane *pl
        /* program plane scaler */
        if (plane_state->scaler_id >= 0) {
                int scaler_id = plane_state->scaler_id;
 -              const struct intel_scaler *scaler;
 -
 -              scaler = &crtc_state->scaler_state.scalers[scaler_id];
 +              const struct intel_scaler *scaler =
 +                      &crtc_state->scaler_state.scalers[scaler_id];
 +              u16 y_hphase, uv_rgb_hphase;
 +              u16 y_vphase, uv_rgb_vphase;
 +
 +              /* TODO: handle sub-pixel coordinates */
 +              if (fb->format->format == DRM_FORMAT_NV12) {
 +                      y_hphase = skl_scaler_calc_phase(1, false);
 +                      y_vphase = skl_scaler_calc_phase(1, false);
 +
 +                      /* MPEG2 chroma siting convention */
 +                      uv_rgb_hphase = skl_scaler_calc_phase(2, true);
 +                      uv_rgb_vphase = skl_scaler_calc_phase(2, false);
 +              } else {
 +                      /* not used */
 +                      y_hphase = 0;
 +                      y_vphase = 0;
 +
 +                      uv_rgb_hphase = skl_scaler_calc_phase(1, false);
 +                      uv_rgb_vphase = skl_scaler_calc_phase(1, false);
 +              }
  
                I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id),
                              PS_SCALER_EN | PS_PLANE_SEL(plane_id) | scaler->mode);
                I915_WRITE_FW(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
 +              I915_WRITE_FW(SKL_PS_VPHASE(pipe, scaler_id),
 +                            PS_Y_PHASE(y_vphase) | PS_UV_RGB_PHASE(uv_rgb_vphase));
 +              I915_WRITE_FW(SKL_PS_HPHASE(pipe, scaler_id),
 +                            PS_Y_PHASE(y_hphase) | PS_UV_RGB_PHASE(uv_rgb_hphase));
                I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
                I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id),
                              ((crtc_w + 1) << 16)|(crtc_h + 1));
@@@ -349,21 -327,19 +349,21 @@@ skl_disable_plane(struct intel_plane *p
  }
  
  bool
 -skl_plane_get_hw_state(struct intel_plane *plane)
 +skl_plane_get_hw_state(struct intel_plane *plane,
 +                     enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
        enum plane_id plane_id = plane->id;
 -      enum pipe pipe = plane->pipe;
        bool ret;
  
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret = I915_READ(PLANE_CTL(pipe, plane_id)) & PLANE_CTL_ENABLE;
 +      ret = I915_READ(PLANE_CTL(plane->pipe, plane_id)) & PLANE_CTL_ENABLE;
 +
 +      *pipe = plane->pipe;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -612,21 -588,19 +612,21 @@@ vlv_disable_plane(struct intel_plane *p
  }
  
  static bool
 -vlv_plane_get_hw_state(struct intel_plane *plane)
 +vlv_plane_get_hw_state(struct intel_plane *plane,
 +                     enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
        enum plane_id plane_id = plane->id;
 -      enum pipe pipe = plane->pipe;
        bool ret;
  
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret = I915_READ(SPCNTR(pipe, plane_id)) & SP_ENABLE;
 +      ret = I915_READ(SPCNTR(plane->pipe, plane_id)) & SP_ENABLE;
 +
 +      *pipe = plane->pipe;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -780,20 -754,18 +780,20 @@@ ivb_disable_plane(struct intel_plane *p
  }
  
  static bool
 -ivb_plane_get_hw_state(struct intel_plane *plane)
 +ivb_plane_get_hw_state(struct intel_plane *plane,
 +                     enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
 -      enum pipe pipe = plane->pipe;
        bool ret;
  
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret =  I915_READ(SPRCTL(pipe)) & SPRITE_ENABLE;
 +      ret =  I915_READ(SPRCTL(plane->pipe)) & SPRITE_ENABLE;
 +
 +      *pipe = plane->pipe;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -938,20 -910,18 +938,20 @@@ g4x_disable_plane(struct intel_plane *p
  }
  
  static bool
 -g4x_plane_get_hw_state(struct intel_plane *plane)
 +g4x_plane_get_hw_state(struct intel_plane *plane,
 +                     enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
 -      enum pipe pipe = plane->pipe;
        bool ret;
  
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 +      power_domain = POWER_DOMAIN_PIPE(plane->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
  
 -      ret = I915_READ(DVSCNTR(pipe)) & DVS_ENABLE;
 +      ret = I915_READ(DVSCNTR(plane->pipe)) & DVS_ENABLE;
 +
 +      *pipe = plane->pipe;
  
        intel_display_power_put(dev_priv, power_domain);
  
@@@ -1241,8 -1211,17 +1241,17 @@@ static const uint64_t skl_plane_format_
        DRM_FORMAT_MOD_INVALID
  };
  
- static bool g4x_mod_supported(uint32_t format, uint64_t modifier)
+ static bool g4x_sprite_format_mod_supported(struct drm_plane *_plane,
+                                           u32 format, u64 modifier)
  {
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_XRGB8888:
        case DRM_FORMAT_YUYV:
        }
  }
  
- static bool snb_mod_supported(uint32_t format, uint64_t modifier)
+ static bool snb_sprite_format_mod_supported(struct drm_plane *_plane,
+                                           u32 format, u64 modifier)
  {
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_XRGB8888:
        case DRM_FORMAT_XBGR8888:
        }
  }
  
- static bool vlv_mod_supported(uint32_t format, uint64_t modifier)
+ static bool vlv_sprite_format_mod_supported(struct drm_plane *_plane,
+                                           u32 format, u64 modifier)
  {
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_RGB565:
        case DRM_FORMAT_ABGR8888:
        }
  }
  
- static bool skl_mod_supported(uint32_t format, uint64_t modifier)
+ static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
+                                          u32 format, u64 modifier)
  {
+       struct intel_plane *plane = to_intel_plane(_plane);
+       switch (modifier) {
+       case DRM_FORMAT_MOD_LINEAR:
+       case I915_FORMAT_MOD_X_TILED:
+       case I915_FORMAT_MOD_Y_TILED:
+       case I915_FORMAT_MOD_Yf_TILED:
+               break;
+       case I915_FORMAT_MOD_Y_TILED_CCS:
+       case I915_FORMAT_MOD_Yf_TILED_CCS:
+               if (!plane->has_ccs)
+                       return false;
+               break;
+       default:
+               return false;
+       }
        switch (format) {
        case DRM_FORMAT_XRGB8888:
        case DRM_FORMAT_XBGR8888:
        }
  }
  
- static bool intel_sprite_plane_format_mod_supported(struct drm_plane *plane,
-                                                   uint32_t format,
-                                                   uint64_t modifier)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->dev);
-       if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID))
-               return false;
+ static const struct drm_plane_funcs g4x_sprite_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+       .format_mod_supported = g4x_sprite_format_mod_supported,
+ };
  
-       if ((modifier >> 56) != DRM_FORMAT_MOD_VENDOR_INTEL &&
-           modifier != DRM_FORMAT_MOD_LINEAR)
-               return false;
+ static const struct drm_plane_funcs snb_sprite_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+       .format_mod_supported = snb_sprite_format_mod_supported,
+ };
  
-       if (INTEL_GEN(dev_priv) >= 9)
-               return skl_mod_supported(format, modifier);
-       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
-               return vlv_mod_supported(format, modifier);
-       else if (INTEL_GEN(dev_priv) >= 6)
-               return snb_mod_supported(format, modifier);
-       else
-               return g4x_mod_supported(format, modifier);
- }
+ static const struct drm_plane_funcs vlv_sprite_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+       .format_mod_supported = vlv_sprite_format_mod_supported,
+ };
  
- static const struct drm_plane_funcs intel_sprite_plane_funcs = {
+ static const struct drm_plane_funcs skl_plane_funcs = {
        .update_plane = drm_atomic_helper_update_plane,
        .disable_plane = drm_atomic_helper_disable_plane,
        .destroy = intel_plane_destroy,
        .atomic_set_property = intel_plane_atomic_set_property,
        .atomic_duplicate_state = intel_plane_duplicate_state,
        .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = intel_sprite_plane_format_mod_supported,
+       .format_mod_supported = skl_plane_format_mod_supported,
  };
  
  bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
@@@ -1389,6 -1414,7 +1444,7 @@@ intel_sprite_plane_create(struct drm_i9
  {
        struct intel_plane *intel_plane = NULL;
        struct intel_plane_state *state = NULL;
+       const struct drm_plane_funcs *plane_funcs;
        unsigned long possible_crtcs;
        const uint32_t *plane_formats;
        const uint64_t *modifiers;
                intel_plane->can_scale = true;
                state->scaler_id = -1;
  
+               intel_plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe,
+                                                        PLANE_SPRITE0 + plane);
                intel_plane->update_plane = skl_update_plane;
                intel_plane->disable_plane = skl_disable_plane;
                intel_plane->get_hw_state = skl_plane_get_hw_state;
                        num_plane_formats = ARRAY_SIZE(skl_plane_formats);
                }
  
-               if (skl_plane_has_ccs(dev_priv, pipe, PLANE_SPRITE0 + plane))
+               if (intel_plane->has_ccs)
                        modifiers = skl_plane_format_modifiers_ccs;
                else
                        modifiers = skl_plane_format_modifiers_noccs;
+               plane_funcs = &skl_plane_funcs;
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                intel_plane->can_scale = false;
                intel_plane->max_downscale = 1;
                plane_formats = vlv_plane_formats;
                num_plane_formats = ARRAY_SIZE(vlv_plane_formats);
                modifiers = i9xx_plane_format_modifiers;
+               plane_funcs = &vlv_sprite_funcs;
        } else if (INTEL_GEN(dev_priv) >= 7) {
                if (IS_IVYBRIDGE(dev_priv)) {
                        intel_plane->can_scale = true;
                plane_formats = snb_plane_formats;
                num_plane_formats = ARRAY_SIZE(snb_plane_formats);
                modifiers = i9xx_plane_format_modifiers;
+               plane_funcs = &snb_sprite_funcs;
        } else {
                intel_plane->can_scale = true;
                intel_plane->max_downscale = 16;
                if (IS_GEN6(dev_priv)) {
                        plane_formats = snb_plane_formats;
                        num_plane_formats = ARRAY_SIZE(snb_plane_formats);
+                       plane_funcs = &snb_sprite_funcs;
                } else {
                        plane_formats = g4x_plane_formats;
                        num_plane_formats = ARRAY_SIZE(g4x_plane_formats);
+                       plane_funcs = &g4x_sprite_funcs;
                }
        }
  
  
        if (INTEL_GEN(dev_priv) >= 9)
                ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base,
-                                              possible_crtcs, &intel_sprite_plane_funcs,
+                                              possible_crtcs, plane_funcs,
                                               plane_formats, num_plane_formats,
                                               modifiers,
                                               DRM_PLANE_TYPE_OVERLAY,
                                               "plane %d%c", plane + 2, pipe_name(pipe));
        else
                ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base,
-                                              possible_crtcs, &intel_sprite_plane_funcs,
+                                              possible_crtcs, plane_funcs,
                                               plane_formats, num_plane_formats,
                                               modifiers,
                                               DRM_PLANE_TYPE_OVERLAY,
index 933af1c253878acc64e05da0b6f73eee01fcc5c9,f69d8da222b02bf66638f4bbca235319665de4bc..fbed2c90fd51ea4dcb5aab0ee8d6e5c7dadadfd6
@@@ -389,7 -389,7 +389,7 @@@ static int __igt_reserve(unsigned int c
        if (!order)
                goto err;
  
 -      nodes = vzalloc(sizeof(*nodes) * count);
 +      nodes = vzalloc(array_size(count, sizeof(*nodes)));
        if (!nodes)
                goto err_order;
  
@@@ -579,7 -579,7 +579,7 @@@ static int __igt_insert(unsigned int co
        DRM_MM_BUG_ON(!size);
  
        ret = -ENOMEM;
 -      nodes = vmalloc(count * sizeof(*nodes));
 +      nodes = vmalloc(array_size(count, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -889,7 -889,7 +889,7 @@@ static int __igt_insert_range(unsigned 
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(count * sizeof(*nodes));
 +      nodes = vzalloc(array_size(count, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -1046,7 -1046,7 +1046,7 @@@ static int igt_align(void *ignored
         * meets our requirements.
         */
  
 -      nodes = vzalloc(max_count * sizeof(*nodes));
 +      nodes = vzalloc(array_size(max_count, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -1416,7 -1416,7 +1416,7 @@@ static int igt_evict(void *ignored
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(size * sizeof(*nodes));
 +      nodes = vzalloc(array_size(size, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -1526,7 -1526,7 +1526,7 @@@ static int igt_evict_range(void *ignore
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(size * sizeof(*nodes));
 +      nodes = vzalloc(array_size(size, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -1627,11 -1627,11 +1627,11 @@@ static int igt_topdown(void *ignored
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(count * sizeof(*nodes));
 +      nodes = vzalloc(array_size(count, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
 -      bitmap = kzalloc(count / BITS_PER_LONG * sizeof(unsigned long),
 +      bitmap = kcalloc(count / BITS_PER_LONG, sizeof(unsigned long),
                         GFP_KERNEL);
        if (!bitmap)
                goto err_nodes;
@@@ -1741,11 -1741,11 +1741,11 @@@ static int igt_bottomup(void *ignored
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(count * sizeof(*nodes));
 +      nodes = vzalloc(array_size(count, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
 -      bitmap = kzalloc(count / BITS_PER_LONG * sizeof(unsigned long),
 +      bitmap = kcalloc(count / BITS_PER_LONG, sizeof(unsigned long),
                         GFP_KERNEL);
        if (!bitmap)
                goto err_nodes;
        return ret;
  }
  
+ static int __igt_once(unsigned int mode)
+ {
+       struct drm_mm mm;
+       struct drm_mm_node rsvd_lo, rsvd_hi, node;
+       int err;
+       drm_mm_init(&mm, 0, 7);
+       memset(&rsvd_lo, 0, sizeof(rsvd_lo));
+       rsvd_lo.start = 1;
+       rsvd_lo.size = 1;
+       err = drm_mm_reserve_node(&mm, &rsvd_lo);
+       if (err) {
+               pr_err("Could not reserve low node\n");
+               goto err;
+       }
+       memset(&rsvd_hi, 0, sizeof(rsvd_hi));
+       rsvd_hi.start = 5;
+       rsvd_hi.size = 1;
+       err = drm_mm_reserve_node(&mm, &rsvd_hi);
+       if (err) {
+               pr_err("Could not reserve low node\n");
+               goto err_lo;
+       }
+       if (!drm_mm_hole_follows(&rsvd_lo) || !drm_mm_hole_follows(&rsvd_hi)) {
+               pr_err("Expected a hole after lo and high nodes!\n");
+               err = -EINVAL;
+               goto err_hi;
+       }
+       memset(&node, 0, sizeof(node));
+       err = drm_mm_insert_node_generic(&mm, &node,
+                                        2, 0, 0,
+                                        mode | DRM_MM_INSERT_ONCE);
+       if (!err) {
+               pr_err("Unexpectedly inserted the node into the wrong hole: node.start=%llx\n",
+                      node.start);
+               err = -EINVAL;
+               goto err_node;
+       }
+       err = drm_mm_insert_node_generic(&mm, &node, 2, 0, 0, mode);
+       if (err) {
+               pr_err("Could not insert the node into the available hole!\n");
+               err = -EINVAL;
+               goto err_hi;
+       }
+ err_node:
+       drm_mm_remove_node(&node);
+ err_hi:
+       drm_mm_remove_node(&rsvd_hi);
+ err_lo:
+       drm_mm_remove_node(&rsvd_lo);
+ err:
+       drm_mm_takedown(&mm);
+       return err;
+ }
+ static int igt_lowest(void *ignored)
+ {
+       return __igt_once(DRM_MM_INSERT_LOW);
+ }
+ static int igt_highest(void *ignored)
+ {
+       return __igt_once(DRM_MM_INSERT_HIGH);
+ }
  static void separate_adjacent_colors(const struct drm_mm_node *node,
                                     unsigned long color,
                                     u64 *start,
@@@ -2098,7 -2169,7 +2169,7 @@@ static int igt_color_evict(void *ignore
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(total_size * sizeof(*nodes));
 +      nodes = vzalloc(array_size(total_size, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
@@@ -2199,7 -2270,7 +2270,7 @@@ static int igt_color_evict_range(void *
         */
  
        ret = -ENOMEM;
 -      nodes = vzalloc(total_size * sizeof(*nodes));
 +      nodes = vzalloc(array_size(total_size, sizeof(*nodes)));
        if (!nodes)
                goto err;
  
index 1d34619eb3fe3f57402291e7dbd05c4a193c45e1,36ffb630bf47e174e5d2b5078e8143e553ccfe79..8604fd2e7c5aec55d29c1a3ba2ed75e57810e03a
@@@ -209,7 -209,7 +209,7 @@@ static void vc4_dlist_write(struct vc4_
  {
        if (vc4_state->dlist_count == vc4_state->dlist_size) {
                u32 new_size = max(4u, vc4_state->dlist_count * 2);
 -              u32 *new_dlist = kmalloc(new_size * 4, GFP_KERNEL);
 +              u32 *new_dlist = kmalloc_array(new_size, 4, GFP_KERNEL);
  
                if (!new_dlist)
                        return;
@@@ -467,12 -467,14 +467,14 @@@ static int vc4_plane_mode_set(struct dr
        struct drm_framebuffer *fb = state->fb;
        u32 ctl0_offset = vc4_state->dlist_count;
        const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
+       u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
        int num_planes = drm_format_num_planes(format->drm);
        bool mix_plane_alpha;
        bool covers_screen;
        u32 scl0, scl1, pitch0;
        u32 lbm_size, tiling;
        unsigned long irqflags;
+       u32 hvs_format = format->hvs;
        int ret, i;
  
        ret = vc4_plane_setup_clipping_and_scaling(state);
                scl1 = vc4_get_scl_field(state, 0);
        }
  
-       switch (fb->modifier) {
+       switch (base_format_mod) {
        case DRM_FORMAT_MOD_LINEAR:
                tiling = SCALER_CTL0_TILING_LINEAR;
                pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
                break;
        }
  
+       case DRM_FORMAT_MOD_BROADCOM_SAND64:
+       case DRM_FORMAT_MOD_BROADCOM_SAND128:
+       case DRM_FORMAT_MOD_BROADCOM_SAND256: {
+               uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
+               /* Column-based NV12 or RGBA.
+                */
+               if (fb->format->num_planes > 1) {
+                       if (hvs_format != HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE) {
+                               DRM_DEBUG_KMS("SAND format only valid for NV12/21");
+                               return -EINVAL;
+                       }
+                       hvs_format = HVS_PIXEL_FORMAT_H264;
+               } else {
+                       if (base_format_mod == DRM_FORMAT_MOD_BROADCOM_SAND256) {
+                               DRM_DEBUG_KMS("SAND256 format only valid for H.264");
+                               return -EINVAL;
+                       }
+               }
+               switch (base_format_mod) {
+               case DRM_FORMAT_MOD_BROADCOM_SAND64:
+                       tiling = SCALER_CTL0_TILING_64B;
+                       break;
+               case DRM_FORMAT_MOD_BROADCOM_SAND128:
+                       tiling = SCALER_CTL0_TILING_128B;
+                       break;
+               case DRM_FORMAT_MOD_BROADCOM_SAND256:
+                       tiling = SCALER_CTL0_TILING_256B_OR_T;
+                       break;
+               default:
+                       break;
+               }
+               if (param > SCALER_TILE_HEIGHT_MASK) {
+                       DRM_DEBUG_KMS("SAND height too large (%d)\n", param);
+                       return -EINVAL;
+               }
+               pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
+               break;
+       }
        default:
                DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx",
                              (long long)fb->modifier);
        /* Control word */
        vc4_dlist_write(vc4_state,
                        SCALER_CTL0_VALID |
+                       VC4_SET_FIELD(SCALER_CTL0_RGBA_EXPAND_ROUND, SCALER_CTL0_RGBA_EXPAND) |
                        (format->pixel_order << SCALER_CTL0_ORDER_SHIFT) |
-                       (format->hvs << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
+                       (hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
                        VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
                        (vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) |
                        VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
  
        /* Pitch word 1/2 */
        for (i = 1; i < num_planes; i++) {
-               vc4_dlist_write(vc4_state,
-                               VC4_SET_FIELD(fb->pitches[i], SCALER_SRC_PITCH));
+               if (hvs_format != HVS_PIXEL_FORMAT_H264) {
+                       vc4_dlist_write(vc4_state,
+                                       VC4_SET_FIELD(fb->pitches[i],
+                                                     SCALER_SRC_PITCH));
+               } else {
+                       vc4_dlist_write(vc4_state, pitch0);
+               }
        }
  
        /* Colorspace conversion words */
@@@ -810,18 -861,21 +861,21 @@@ static int vc4_prepare_fb(struct drm_pl
        struct dma_fence *fence;
        int ret;
  
-       if ((plane->state->fb == state->fb) || !state->fb)
+       if (!state->fb)
                return 0;
  
        bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base);
  
+       fence = reservation_object_get_excl_rcu(bo->resv);
+       drm_atomic_set_fence_for_plane(state, fence);
+       if (plane->state->fb == state->fb)
+               return 0;
        ret = vc4_bo_inc_usecnt(bo);
        if (ret)
                return ret;
  
-       fence = reservation_object_get_excl_rcu(bo->resv);
-       drm_atomic_set_fence_for_plane(state, fence);
        return 0;
  }
  
@@@ -866,13 -920,32 +920,32 @@@ static bool vc4_format_mod_supported(st
        case DRM_FORMAT_BGR565:
        case DRM_FORMAT_ARGB1555:
        case DRM_FORMAT_XRGB1555:
-               return true;
+               switch (fourcc_mod_broadcom_mod(modifier)) {
+               case DRM_FORMAT_MOD_LINEAR:
+               case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
+               case DRM_FORMAT_MOD_BROADCOM_SAND64:
+               case DRM_FORMAT_MOD_BROADCOM_SAND128:
+                       return true;
+               default:
+                       return false;
+               }
+       case DRM_FORMAT_NV12:
+       case DRM_FORMAT_NV21:
+               switch (fourcc_mod_broadcom_mod(modifier)) {
+               case DRM_FORMAT_MOD_LINEAR:
+               case DRM_FORMAT_MOD_BROADCOM_SAND64:
+               case DRM_FORMAT_MOD_BROADCOM_SAND128:
+               case DRM_FORMAT_MOD_BROADCOM_SAND256:
+                       return true;
+               default:
+                       return false;
+               }
        case DRM_FORMAT_YUV422:
        case DRM_FORMAT_YVU422:
        case DRM_FORMAT_YUV420:
        case DRM_FORMAT_YVU420:
-       case DRM_FORMAT_NV12:
        case DRM_FORMAT_NV16:
+       case DRM_FORMAT_NV61:
        default:
                return (modifier == DRM_FORMAT_MOD_LINEAR);
        }
@@@ -900,6 -973,9 +973,9 @@@ struct drm_plane *vc4_plane_init(struc
        unsigned i;
        static const uint64_t modifiers[] = {
                DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
+               DRM_FORMAT_MOD_BROADCOM_SAND128,
+               DRM_FORMAT_MOD_BROADCOM_SAND64,
+               DRM_FORMAT_MOD_BROADCOM_SAND256,
                DRM_FORMAT_MOD_LINEAR,
                DRM_FORMAT_MOD_INVALID
        };
index 54e300365a5ccd04b2d5d6173fbb379bde860322,aaac8d11e705d0140a7662324a4208c0f9fd0a08..9b7e0aca5f8476597ca139d11f4daf2ae9736ba7
@@@ -439,38 -439,13 +439,13 @@@ static int vmw_fb_compute_depth(struct 
  static int vmwgfx_set_config_internal(struct drm_mode_set *set)
  {
        struct drm_crtc *crtc = set->crtc;
-       struct drm_framebuffer *fb;
-       struct drm_crtc *tmp;
-       struct drm_device *dev = set->crtc->dev;
        struct drm_modeset_acquire_ctx ctx;
        int ret;
  
        drm_modeset_acquire_init(&ctx, 0);
  
  restart:
-       /*
-        * NOTE: ->set_config can also disable other crtcs (if we steal all
-        * connectors from it), hence we need to refcount the fbs across all
-        * crtcs. Atomic modeset will have saner semantics ...
-        */
-       drm_for_each_crtc(tmp, dev)
-               tmp->primary->old_fb = tmp->primary->fb;
-       fb = set->fb;
        ret = crtc->funcs->set_config(set, &ctx);
-       if (ret == 0) {
-               crtc->primary->crtc = crtc;
-               crtc->primary->fb = fb;
-       }
-       drm_for_each_crtc(tmp, dev) {
-               if (tmp->primary->fb)
-                       drm_framebuffer_get(tmp->primary->fb);
-               if (tmp->primary->old_fb)
-                       drm_framebuffer_put(tmp->primary->old_fb);
-               tmp->primary->old_fb = NULL;
-       }
  
        if (ret == -EDEADLK) {
                drm_modeset_backoff(&ctx);
@@@ -866,13 -841,21 +841,13 @@@ int vmw_fb_on(struct vmw_private *vmw_p
        spin_lock_irqsave(&par->dirty.lock, flags);
        par->dirty.active = true;
        spin_unlock_irqrestore(&par->dirty.lock, flags);
 - 
 -      return 0;
 -}
  
 -/**
 - * vmw_fb_refresh - Refresh fb display
 - *
 - * @vmw_priv: Pointer to device private
 - *
 - * Call into kms to show the fbdev display(s).
 - */
 -void vmw_fb_refresh(struct vmw_private *vmw_priv)
 -{
 -      if (!vmw_priv->fb_info)
 -              return;
 +      /*
 +       * Need to reschedule a dirty update, because otherwise that's
 +       * only done in dirty_mark() if the previous coalesced
 +       * dirty region was empty.
 +       */
 +      schedule_delayed_work(&par->local_work, 0);
  
 -      vmw_fb_set_par(vmw_priv->fb_info);
 +      return 0;
  }
index 3d667e903beb7bd76d13d8048a26a1763e835709,bbd3f19b1a0bf2a8457ed3091d455348db096d4f..9798640cbfcd9b18ecd9c71a6248c961c1ed3eeb
@@@ -482,8 -482,6 +482,8 @@@ vmw_sou_primary_plane_prepare_fb(struc
                return ret;
        }
  
 +      vps->dmabuf_size = size;
 +
        /*
         * TTM already thinks the buffer is pinned, but make sure the
         * pin_count is upped.
@@@ -527,8 -525,6 +527,6 @@@ vmw_sou_primary_plane_atomic_update(str
                 */
                if (ret != 0)
                        DRM_ERROR("Failed to update screen.\n");
-               crtc->primary->fb = plane->state->fb;
        } else {
                /*
                 * When disabling a plane, CRTC and FB should always be NULL
index b3786c1a4e80fdedb4bc1da0a4c046184d4ff250,93bf9f092086b28de8ebdfff46de270fcd63d465..6b6d5ab82ec3fadf4b46d4e3c3771f9c8d56e143
@@@ -623,7 -623,7 +623,7 @@@ static int displback_initwait(struct xe
        if (ret < 0)
                return ret;
  
-       DRM_INFO("Have %d conector(s)\n", cfg->num_connectors);
+       DRM_INFO("Have %d connector(s)\n", cfg->num_connectors);
        /* Create event channels for all connectors and publish */
        ret = xen_drm_front_evtchnl_create_all(front_info);
        if (ret < 0)
@@@ -737,8 -737,9 +737,8 @@@ static int xen_drv_probe(struct xenbus_
         * is not correct: to fix this call of_dma_configure() with a NULL
         * node to set default DMA ops.
         */
 -      dev->bus->force_dma = true;
        dev->coherent_dma_mask = DMA_BIT_MASK(32);
 -      ret = of_dma_configure(dev, NULL);
 +      ret = of_dma_configure(dev, NULL, true);
        if (ret < 0) {
                DRM_ERROR("Cannot setup DMA ops, ret %d", ret);
                return ret;
index 9d1109e43ed442e5614568c312ee31e01ca0dd17,3d4d35558937a8ad827f22d09ad4332143c7de3a..99073325b0c00ca8784cbd1ed7849d4cdb09ec8e
@@@ -74,8 -74,6 +74,8 @@@ static struct ion_buffer *ion_buffer_cr
  
        buffer->heap = heap;
        buffer->flags = flags;
 +      buffer->dev = dev;
 +      buffer->size = len;
  
        ret = heap->ops->allocate(heap, buffer, len, flags);
  
                goto err1;
        }
  
 -      buffer->dev = dev;
 -      buffer->size = len;
 -
 -      buffer->dev = dev;
 -      buffer->size = len;
        INIT_LIST_HEAD(&buffer->attachments);
        mutex_init(&buffer->lock);
        mutex_lock(&dev->buffer_lock);
@@@ -111,11 -114,8 +111,11 @@@ err2
  
  void ion_buffer_destroy(struct ion_buffer *buffer)
  {
 -      if (WARN_ON(buffer->kmap_cnt > 0))
 +      if (buffer->kmap_cnt > 0) {
 +              pr_warn_once("%s: buffer still mapped in the kernel\n",
 +                           __func__);
                buffer->heap->ops->unmap_kernel(buffer->heap, buffer);
 +      }
        buffer->heap->ops->free(buffer);
        kfree(buffer);
  }
@@@ -201,7 -201,7 +201,7 @@@ struct ion_dma_buf_attachment 
        struct list_head list;
  };
  
- static int ion_dma_buf_attach(struct dma_buf *dmabuf, struct device *dev,
+ static int ion_dma_buf_attach(struct dma_buf *dmabuf,
                              struct dma_buf_attachment *attachment)
  {
        struct ion_dma_buf_attachment *a;
        }
  
        a->table = table;
-       a->dev = dev;
+       a->dev = attachment->dev;
        INIT_LIST_HEAD(&a->list);
  
        attachment->priv = a;
@@@ -318,7 -318,6 +318,7 @@@ static int ion_dma_buf_begin_cpu_access
        struct ion_buffer *buffer = dmabuf->priv;
        void *vaddr;
        struct ion_dma_buf_attachment *a;
 +      int ret = 0;
  
        /*
         * TODO: Move this elsewhere because we don't always need a vaddr
        if (buffer->heap->ops->map_kernel) {
                mutex_lock(&buffer->lock);
                vaddr = ion_buffer_kmap_get(buffer);
 +              if (IS_ERR(vaddr)) {
 +                      ret = PTR_ERR(vaddr);
 +                      goto unlock;
 +              }
                mutex_unlock(&buffer->lock);
        }
  
                dma_sync_sg_for_cpu(a->dev, a->table->sgl, a->table->nents,
                                    direction);
        }
 -      mutex_unlock(&buffer->lock);
  
 -      return 0;
 +unlock:
 +      mutex_unlock(&buffer->lock);
 +      return ret;
  }
  
  static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
@@@ -375,8 -369,6 +375,6 @@@ static const struct dma_buf_ops dma_buf
        .detach = ion_dma_buf_detatch,
        .begin_cpu_access = ion_dma_buf_begin_cpu_access,
        .end_cpu_access = ion_dma_buf_end_cpu_access,
-       .map_atomic = ion_dma_buf_kmap,
-       .unmap_atomic = ion_dma_buf_kunmap,
        .map = ion_dma_buf_kmap,
        .unmap = ion_dma_buf_kunmap,
  };
diff --combined drivers/tee/tee_shm.c
index 07d3be6f0780db209ac2be07354ac390c31d6be8,df4a1553b78b1ab5123640387ab5eab526bb87a4..0b9ab1d0dd45dd69046f921e6bf846e7af23fe88
@@@ -80,11 -80,6 +80,6 @@@ static void tee_shm_op_release(struct d
        tee_shm_release(shm);
  }
  
- static void *tee_shm_op_map_atomic(struct dma_buf *dmabuf, unsigned long pgnum)
- {
-       return NULL;
- }
  static void *tee_shm_op_map(struct dma_buf *dmabuf, unsigned long pgnum)
  {
        return NULL;
@@@ -107,7 -102,6 +102,6 @@@ static const struct dma_buf_ops tee_shm
        .map_dma_buf = tee_shm_op_map_dma_buf,
        .unmap_dma_buf = tee_shm_op_unmap_dma_buf,
        .release = tee_shm_op_release,
-       .map_atomic = tee_shm_op_map_atomic,
        .map = tee_shm_op_map,
        .mmap = tee_shm_op_mmap,
  };
@@@ -360,10 -354,9 +354,10 @@@ int tee_shm_get_fd(struct tee_shm *shm
        if (!(shm->flags & TEE_SHM_DMA_BUF))
                return -EINVAL;
  
 +      get_dma_buf(shm->dmabuf);
        fd = dma_buf_fd(shm->dmabuf, O_CLOEXEC);
 -      if (fd >= 0)
 -              get_dma_buf(shm->dmabuf);
 +      if (fd < 0)
 +              dma_buf_put(shm->dmabuf);
        return fd;
  }
  
This page took 0.305968 seconds and 4 git commands to generate.