Merge tag 'drm-misc-next-2020-09-21' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_display.c
index 345ecee..5a9d933 100644 (file)
@@ -67,6 +67,7 @@
 #include "intel_bw.h"
 #include "intel_cdclk.h"
 #include "intel_color.h"
+#include "intel_csr.h"
 #include "intel_display_types.h"
 #include "intel_dp_link_training.h"
 #include "intel_fbc.h"
@@ -7331,6 +7332,10 @@ enum intel_display_power_domain intel_port_to_power_domain(enum port port)
                return POWER_DOMAIN_PORT_DDI_F_LANES;
        case PORT_G:
                return POWER_DOMAIN_PORT_DDI_G_LANES;
+       case PORT_H:
+               return POWER_DOMAIN_PORT_DDI_H_LANES;
+       case PORT_I:
+               return POWER_DOMAIN_PORT_DDI_I_LANES;
        default:
                MISSING_CASE(port);
                return POWER_DOMAIN_PORT_OTHER;
@@ -7356,6 +7361,10 @@ intel_aux_power_domain(struct intel_digital_port *dig_port)
                        return POWER_DOMAIN_AUX_F_TBT;
                case AUX_CH_G:
                        return POWER_DOMAIN_AUX_G_TBT;
+               case AUX_CH_H:
+                       return POWER_DOMAIN_AUX_H_TBT;
+               case AUX_CH_I:
+                       return POWER_DOMAIN_AUX_I_TBT;
                default:
                        MISSING_CASE(dig_port->aux_ch);
                        return POWER_DOMAIN_AUX_C_TBT;
@@ -7387,6 +7396,10 @@ intel_legacy_aux_to_power_domain(enum aux_ch aux_ch)
                return POWER_DOMAIN_AUX_F;
        case AUX_CH_G:
                return POWER_DOMAIN_AUX_G;
+       case AUX_CH_H:
+               return POWER_DOMAIN_AUX_H;
+       case AUX_CH_I:
+               return POWER_DOMAIN_AUX_I;
        default:
                MISSING_CASE(aux_ch);
                return POWER_DOMAIN_AUX_A;
@@ -14630,16 +14643,8 @@ u8 intel_calc_active_pipes(struct intel_atomic_state *state,
 static int intel_modeset_checks(struct intel_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
-       int ret;
 
        state->modeset = true;
-       state->active_pipes = intel_calc_active_pipes(state, dev_priv->active_pipes);
-
-       if (state->active_pipes != dev_priv->active_pipes) {
-               ret = _intel_atomic_lock_global_state(state);
-               if (ret)
-                       return ret;
-       }
 
        if (IS_HASWELL(dev_priv))
                return hsw_mode_set_planes_workaround(state);
@@ -14783,7 +14788,8 @@ static int intel_atomic_check_cdclk(struct intel_atomic_state *state,
                                    bool *need_cdclk_calc)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
-       struct intel_cdclk_state *new_cdclk_state;
+       const struct intel_cdclk_state *old_cdclk_state;
+       const struct intel_cdclk_state *new_cdclk_state;
        struct intel_plane_state *plane_state;
        struct intel_bw_state *new_bw_state;
        struct intel_plane *plane;
@@ -14802,9 +14808,11 @@ static int intel_atomic_check_cdclk(struct intel_atomic_state *state,
                        return ret;
        }
 
+       old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
        new_cdclk_state = intel_atomic_get_new_cdclk_state(state);
 
-       if (new_cdclk_state && new_cdclk_state->force_min_cdclk_changed)
+       if (new_cdclk_state &&
+           old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk)
                *need_cdclk_calc = true;
 
        ret = dev_priv->display.bw_calc_min_cdclk(state);
@@ -15751,14 +15759,6 @@ static void intel_atomic_track_fbs(struct intel_atomic_state *state)
                                        plane->frontbuffer_bit);
 }
 
-static void assert_global_state_locked(struct drm_i915_private *dev_priv)
-{
-       struct intel_crtc *crtc;
-
-       for_each_intel_crtc(&dev_priv->drm, crtc)
-               drm_modeset_lock_assert_held(&crtc->base.mutex);
-}
-
 static int intel_atomic_commit(struct drm_device *dev,
                               struct drm_atomic_state *_state,
                               bool nonblock)
@@ -15834,12 +15834,6 @@ static int intel_atomic_commit(struct drm_device *dev,
        intel_shared_dpll_swap_state(state);
        intel_atomic_track_fbs(state);
 
-       if (state->global_state_changed) {
-               assert_global_state_locked(dev_priv);
-
-               dev_priv->active_pipes = state->active_pipes;
-       }
-
        drm_atomic_state_get(&state->base);
        INIT_WORK(&state->base.commit_work, intel_atomic_commit_work);
 
@@ -16886,7 +16880,7 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 
        intel_pps_init(dev_priv);
 
-       if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
+       if (!HAS_DISPLAY(dev_priv))
                return;
 
        if (IS_ROCKETLAKE(dev_priv)) {
@@ -17872,6 +17866,27 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
 {
        int ret;
 
+       if (i915_inject_probe_failure(i915))
+               return -ENODEV;
+
+       if (HAS_DISPLAY(i915)) {
+               ret = drm_vblank_init(&i915->drm,
+                                     INTEL_NUM_PIPES(i915));
+               if (ret)
+                       return ret;
+       }
+
+       intel_bios_init(i915);
+
+       ret = intel_vga_register(i915);
+       if (ret)
+               goto cleanup_bios;
+
+       /* FIXME: completely on the wrong abstraction layer */
+       intel_power_domains_init_hw(i915, false);
+
+       intel_csr_ucode_init(i915);
+
        i915->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
        i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
                                        WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
@@ -17880,15 +17895,15 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
 
        ret = intel_cdclk_init(i915);
        if (ret)
-               return ret;
+               goto cleanup_vga_client_pw_domain_csr;
 
        ret = intel_dbuf_init(i915);
        if (ret)
-               return ret;
+               goto cleanup_vga_client_pw_domain_csr;
 
        ret = intel_bw_init(i915);
        if (ret)
-               return ret;
+               goto cleanup_vga_client_pw_domain_csr;
 
        init_llist_head(&i915->atomic_helper.free_list);
        INIT_WORK(&i915->atomic_helper.free_work,
@@ -17899,10 +17914,19 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
        intel_fbc_init(i915);
 
        return 0;
+
+cleanup_vga_client_pw_domain_csr:
+       intel_csr_ucode_fini(i915);
+       intel_power_domains_driver_remove(i915);
+       intel_vga_unregister(i915);
+cleanup_bios:
+       intel_bios_driver_remove(i915);
+
+       return ret;
 }
 
-/* part #2: call after irq install */
-int intel_modeset_init(struct drm_i915_private *i915)
+/* part #2: call after irq install, but before gem init */
+int intel_modeset_init_nogem(struct drm_i915_private *i915)
 {
        struct drm_device *dev = &i915->drm;
        enum pipe pipe;
@@ -17919,7 +17943,7 @@ int intel_modeset_init(struct drm_i915_private *i915)
                    INTEL_NUM_PIPES(i915),
                    INTEL_NUM_PIPES(i915) > 1 ? "s" : "");
 
-       if (HAS_DISPLAY(i915) && INTEL_DISPLAY_ENABLED(i915)) {
+       if (HAS_DISPLAY(i915)) {
                for_each_pipe(i915, pipe) {
                        ret = intel_crtc_init(i915, pipe);
                        if (ret) {
@@ -18001,6 +18025,30 @@ int intel_modeset_init(struct drm_i915_private *i915)
        return 0;
 }
 
+/* part #3: call after gem init */
+int intel_modeset_init(struct drm_i915_private *i915)
+{
+       int ret;
+
+       intel_overlay_setup(i915);
+
+       if (!HAS_DISPLAY(i915))
+               return 0;
+
+       ret = intel_fbdev_init(&i915->drm);
+       if (ret)
+               return ret;
+
+       /* Only enable hotplug handling once the fbdev is fully set up. */
+       intel_hpd_init(i915);
+
+       intel_init_ipc(i915);
+
+       intel_psr_set_force_mode_changed(i915->psr.dp);
+
+       return 0;
+}
+
 void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
 {
        struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
@@ -18885,6 +18933,18 @@ void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915)
        intel_fbc_cleanup_cfb(i915);
 }
 
+/* part #3: call after gem init */
+void intel_modeset_driver_remove_nogem(struct drm_i915_private *i915)
+{
+       intel_csr_ucode_fini(i915);
+
+       intel_power_domains_driver_remove(i915);
+
+       intel_vga_unregister(i915);
+
+       intel_bios_driver_remove(i915);
+}
+
 #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
 
 struct intel_display_error_state {
@@ -18945,7 +19005,7 @@ intel_display_capture_error_state(struct drm_i915_private *dev_priv)
 
        BUILD_BUG_ON(ARRAY_SIZE(transcoders) != ARRAY_SIZE(error->transcoder));
 
-       if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
+       if (!HAS_DISPLAY(dev_priv))
                return NULL;
 
        error = kzalloc(sizeof(*error), GFP_ATOMIC);