]> Git Repo - J-linux.git/commitdiff
Merge tag 'drm-intel-next-2020-04-30' of git://anongit.freedesktop.org/drm/drm-intel...
authorDave Airlie <[email protected]>
Thu, 14 May 2020 01:33:09 +0000 (11:33 +1000)
committerDave Airlie <[email protected]>
Thu, 14 May 2020 01:33:10 +0000 (11:33 +1000)
Driver Changes:

- Fix GitLab #1698: Performance regression with Linux 5.7-rc1 on
  Iris Plus 655 and 4K screen (Chris)
- Add Wa_14011059788 for Tigerlake (Matt A)
- Add per ctx batchbuffer wa for timestamp for Gen12 (Mika)
- Use indirect ctx bb to load cmd buffer control value
  from context image to avoid corruption (Mika)
- Enable DP Display Audio WA (Uma, Jani)
- Update forcewake firmware ranges for Icelake (Radhakrishna)
- Add missing deinitialization cases of load failure for display (Jose)
- Implement TC cold sequences for Icelake and Tigerlake (Jose)
- Unbreak enable_dpcd_backlight modparam (Lyude)
- Move the late flush_submission in retire to the end (Chris)
- Demote "Reducing compressed framebufer size" message to info (Peter)
- Push MST link retraining to the hotplug work (Ville)
- Hold obj->vma.lock over for_each_ggtt_vma() (Chris)
- Fix timeout handling during TypeC AUX power well enabling for ICL (Imre)
- Fix skl+ non-scaled pfit modes (Ville)
- Prefer soft-rc6 over RPS DOWN_TIMEOUT (Chris)
- Sanitize GT first before poisoning HWSP (Chris)
- Fix up clock RPS frequency readout (Chris)
- Avoid reusing the same logical CCID (Chris)
- Avoid dereferencing a dead context (Chris)
- Always enable busy-stats for execlists (Chris)
- Apply the aggressive downclocking to parking (Chris)
- Restore aggressive post-boost downclocking (Chris)

- Scrub execlists state on resume (Chris)
- Add debugfs attributes for LPSP (Ansuman)
- Improvements to kernel selftests (Chris, Mika)
- Add tiled blits selftest (Zbigniew)
- Fix error handling in __live_lrc_indirect_ctx_bb() (Dan)
- Add pre/post plane updates for SAGV (Stanislav)
- Add ICL PG3 PW ID for EHL (Anshuman)
- Fix Sphinx build duplicate label warning (Jani)
- Error log non-zero audio power refcount after unbind (Jani)
- Remove object_is_locked assertion from unpin_from_display_plane (Chris)
- Use single set of AUX powerwell ops for gen11+ (Matt R)
- Prefer drm_WARN_ON over WARN_ON (Pankaj)
- Poison residual state [HWSP] across resume (Chris, Tvrtko)
- Convert request-before-CS assertion to debug (Chris)
- Carefully order virtual_submission_tasklet (Chris)
- Check carefully for an idle engine in wait-for-idle (Chris)
- Only close vma we open (Chris)
- Trace RPS events (Chris)
- Use the RPM config register to determine clk frequencies (Chris)
- Drop rq->ring->vma peeking from error capture (Chris)
- Check preempt-timeout target before submit_ports (Chris)
- Check HWSP cacheline is valid before acquiring (Chris)
- Use proper fault mask in interrupt postinstall too (Matt R)
- Keep a no-frills swappable copy of the default context state (Chris)

- Add atomic helpers for bandwidth (Stanislav)
- Refactor setting dma info to a common helper from device info (Michael)
- Refactor DDI transcoder code for clairty (Ville)
- Extend PG3 power well ID to ICL (Anshuman)
- Refactor PFIT code for readability and future extensibility (Ville)
- Clarify code split between intel_ddi.c and intel_dp.c (Ville)
- Move out code to return the digital_port of the aux ch (Jose)
- Move rps.enabled/active  and use of RPS interrupts to flags (Chris)
- Remove superfluous inlines and dead code (Jani)
- Re-disable -Wframe-address from top-level Makefile (Nick)
- Static checker and spelling fixes (Colin, Nathan)
- Split long lines (Ville)

Signed-off-by: Dave Airlie <[email protected]>
From: Joonas Lahtinen <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1  2 
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_debugfs.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_pci.c

index 3afcfedb8627ccd2dd49f475f3f89608dcbefd18,6bb87965801eca12c9ea1ee8129e7252f898158a..2a17cf38d3dce2bbdc9023da524e4a80285dab63
@@@ -238,9 -238,9 +238,9 @@@ static void intel_update_czclk(struct d
                dev_priv->czclk_freq);
  }
  
static inline u32 /* units of 100MHz */
- intel_fdi_link_freq(struct drm_i915_private *dev_priv,
-                   const struct intel_crtc_state *pipe_config)
+ /* units of 100MHz */
static u32 intel_fdi_link_freq(struct drm_i915_private *dev_priv,
+                              const struct intel_crtc_state *pipe_config)
  {
        if (HAS_DDI(dev_priv))
                return pipe_config->port_clock; /* SPLL */
@@@ -1973,16 -1973,16 +1973,16 @@@ static bool is_aux_plane(const struct d
  
  static int main_to_ccs_plane(const struct drm_framebuffer *fb, int main_plane)
  {
-       WARN_ON(!is_ccs_modifier(fb->modifier) ||
-               (main_plane && main_plane >= fb->format->num_planes / 2));
+       drm_WARN_ON(fb->dev, !is_ccs_modifier(fb->modifier) ||
+                   (main_plane && main_plane >= fb->format->num_planes / 2));
  
        return fb->format->num_planes / 2 + main_plane;
  }
  
  static int ccs_to_main_plane(const struct drm_framebuffer *fb, int ccs_plane)
  {
-       WARN_ON(!is_ccs_modifier(fb->modifier) ||
-               ccs_plane < fb->format->num_planes / 2);
+       drm_WARN_ON(fb->dev, !is_ccs_modifier(fb->modifier) ||
+                   ccs_plane < fb->format->num_planes / 2);
  
        return ccs_plane - fb->format->num_planes / 2;
  }
@@@ -2992,7 -2992,7 +2992,7 @@@ setup_fb_rotation(int plane, const stru
            fb->modifier != I915_FORMAT_MOD_Yf_TILED)
                return 0;
  
-       if (WARN_ON(plane >= ARRAY_SIZE(rot_info->plane)))
+       if (drm_WARN_ON(fb->dev, plane >= ARRAY_SIZE(rot_info->plane)))
                return 0;
  
        rot_info->plane[plane] = *plane_info;
@@@ -6089,30 -6089,26 +6089,26 @@@ skl_update_scaler(struct intel_crtc_sta
        return 0;
  }
  
- /**
-  * skl_update_scaler_crtc - Stages update to scaler state for a given crtc.
-  *
-  * @state: crtc's scaler state
-  *
-  * Return
-  *     0 - scaler_usage updated successfully
-  *    error - requested scaling cannot be supported or other error condition
-  */
- int skl_update_scaler_crtc(struct intel_crtc_state *state)
+ static int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state)
  {
-       const struct drm_display_mode *adjusted_mode = &state->hw.adjusted_mode;
-       bool need_scaler = false;
+       const struct drm_display_mode *adjusted_mode =
+               &crtc_state->hw.adjusted_mode;
+       int width, height;
  
-       if (state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
-           state->pch_pfit.enabled)
-               need_scaler = true;
+       if (crtc_state->pch_pfit.enabled) {
+               width = drm_rect_width(&crtc_state->pch_pfit.dst);
+               height = drm_rect_height(&crtc_state->pch_pfit.dst);
+       } else {
+               width = adjusted_mode->crtc_hdisplay;
+               height = adjusted_mode->crtc_vdisplay;
+       }
  
-       return skl_update_scaler(state, !state->hw.active, SKL_CRTC_INDEX,
-                                &state->scaler_state.scaler_id,
-                                state->pipe_src_w, state->pipe_src_h,
-                                adjusted_mode->crtc_hdisplay,
-                                adjusted_mode->crtc_vdisplay, NULL, 0,
-                                need_scaler);
+       return skl_update_scaler(crtc_state, !crtc_state->hw.active,
+                                SKL_CRTC_INDEX,
+                                &crtc_state->scaler_state.scaler_id,
+                                crtc_state->pipe_src_w, crtc_state->pipe_src_h,
+                                width, height, NULL, 0,
+                                crtc_state->pch_pfit.enabled);
  }
  
  /**
@@@ -6221,70 -6217,80 +6217,80 @@@ static void skl_pfit_enable(const struc
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       enum pipe pipe = crtc->pipe;
        const struct intel_crtc_scaler_state *scaler_state =
                &crtc_state->scaler_state;
+       struct drm_rect src = {
+               .x2 = crtc_state->pipe_src_w << 16,
+               .y2 = crtc_state->pipe_src_h << 16,
+       };
+       const struct drm_rect *dst = &crtc_state->pch_pfit.dst;
+       u16 uv_rgb_hphase, uv_rgb_vphase;
+       enum pipe pipe = crtc->pipe;
+       int width = drm_rect_width(dst);
+       int height = drm_rect_height(dst);
+       int x = dst->x1;
+       int y = dst->y1;
+       int hscale, vscale;
+       unsigned long irqflags;
+       int id;
  
-       if (crtc_state->pch_pfit.enabled) {
-               u16 uv_rgb_hphase, uv_rgb_vphase;
-               int pfit_w, pfit_h, hscale, vscale;
-               unsigned long irqflags;
-               int id;
-               if (drm_WARN_ON(&dev_priv->drm,
-                               crtc_state->scaler_state.scaler_id < 0))
-                       return;
+       if (!crtc_state->pch_pfit.enabled)
+               return;
  
-               pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
-               pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
+       if (drm_WARN_ON(&dev_priv->drm,
+                       crtc_state->scaler_state.scaler_id < 0))
+               return;
  
-               hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
-               vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
+       hscale = drm_rect_calc_hscale(&src, dst, 0, INT_MAX);
+       vscale = drm_rect_calc_vscale(&src, dst, 0, INT_MAX);
  
-               uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
-               uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
+       uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
+       uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
  
-               id = scaler_state->scaler_id;
+       id = scaler_state->scaler_id;
  
-               spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  
-               intel_de_write_fw(dev_priv, SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
-                                 PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
-               intel_de_write_fw(dev_priv, SKL_PS_VPHASE(pipe, id),
-                                 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
-               intel_de_write_fw(dev_priv, SKL_PS_HPHASE(pipe, id),
-                                 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
-               intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(pipe, id),
-                                 crtc_state->pch_pfit.pos);
-               intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(pipe, id),
-                                 crtc_state->pch_pfit.size);
+       intel_de_write_fw(dev_priv, SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
+                         PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
+       intel_de_write_fw(dev_priv, SKL_PS_VPHASE(pipe, id),
+                         PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
+       intel_de_write_fw(dev_priv, SKL_PS_HPHASE(pipe, id),
+                         PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
+       intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(pipe, id),
+                         x << 16 | y);
+       intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(pipe, id),
+                         width << 16 | height);
  
-               spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-       }
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  }
  
  static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       const struct drm_rect *dst = &crtc_state->pch_pfit.dst;
        enum pipe pipe = crtc->pipe;
+       int width = drm_rect_width(dst);
+       int height = drm_rect_height(dst);
+       int x = dst->x1;
+       int y = dst->y1;
  
-       if (crtc_state->pch_pfit.enabled) {
-               /* Force use of hard-coded filter coefficients
-                * as some pre-programmed values are broken,
-                * e.g. x201.
-                */
-               if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
-                       intel_de_write(dev_priv, PF_CTL(pipe),
-                                      PF_ENABLE | PF_FILTER_MED_3x3 | PF_PIPE_SEL_IVB(pipe));
-               else
-                       intel_de_write(dev_priv, PF_CTL(pipe),
-                                      PF_ENABLE | PF_FILTER_MED_3x3);
-               intel_de_write(dev_priv, PF_WIN_POS(pipe),
-                              crtc_state->pch_pfit.pos);
-               intel_de_write(dev_priv, PF_WIN_SZ(pipe),
-                              crtc_state->pch_pfit.size);
-       }
+       if (!crtc_state->pch_pfit.enabled)
+               return;
+       /* Force use of hard-coded filter coefficients
+        * as some pre-programmed values are broken,
+        * e.g. x201.
+        */
+       if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
+               intel_de_write(dev_priv, PF_CTL(pipe), PF_ENABLE |
+                              PF_FILTER_MED_3x3 | PF_PIPE_SEL_IVB(pipe));
+       else
+               intel_de_write(dev_priv, PF_CTL(pipe), PF_ENABLE |
+                              PF_FILTER_MED_3x3);
+       intel_de_write(dev_priv, PF_WIN_POS(pipe), x << 16 | y);
+       intel_de_write(dev_priv, PF_WIN_SZ(pipe), width << 16 | height);
  }
  
  void hsw_enable_ips(const struct intel_crtc_state *crtc_state)
@@@ -6626,7 -6632,7 +6632,7 @@@ intel_connector_primary_encoder(struct 
                return &dp_to_dig_port(connector->mst_port)->base;
  
        encoder = intel_attached_encoder(connector);
-       WARN_ON(!encoder);
+       drm_WARN_ON(connector->base.dev, !encoder);
  
        return encoder;
  }
@@@ -7071,9 -7077,6 +7077,6 @@@ static void hsw_crtc_enable(struct inte
        if (INTEL_GEN(dev_priv) >= 11)
                icl_set_pipe_chicken(crtc);
  
-       if (!transcoder_is_dsi(cpu_transcoder))
-               intel_ddi_enable_transcoder_func(new_crtc_state);
        if (dev_priv->display.initial_watermarks)
                dev_priv->display.initial_watermarks(state, crtc);
  
@@@ -7104,11 -7107,12 +7107,12 @@@ void ilk_pfit_disable(const struct inte
  
        /* To avoid upsetting the power well on haswell only disable the pfit if
         * it's in use. The hw state code will make sure we get this right. */
-       if (old_crtc_state->pch_pfit.enabled) {
-               intel_de_write(dev_priv, PF_CTL(pipe), 0);
-               intel_de_write(dev_priv, PF_WIN_POS(pipe), 0);
-               intel_de_write(dev_priv, PF_WIN_SZ(pipe), 0);
-       }
+       if (!old_crtc_state->pch_pfit.enabled)
+               return;
+       intel_de_write(dev_priv, PF_CTL(pipe), 0);
+       intel_de_write(dev_priv, PF_WIN_POS(pipe), 0);
+       intel_de_write(dev_priv, PF_WIN_SZ(pipe), 0);
  }
  
  static void ilk_crtc_disable(struct intel_atomic_state *state,
@@@ -7296,7 -7300,17 +7300,17 @@@ intel_aux_power_domain(struct intel_dig
                }
        }
  
-       switch (dig_port->aux_ch) {
+       return intel_legacy_aux_to_power_domain(dig_port->aux_ch);
+ }
+ /*
+  * Converts aux_ch to power_domain without caring about TBT ports for that use
+  * intel_aux_power_domain()
+  */
+ enum intel_display_power_domain
+ intel_legacy_aux_to_power_domain(enum aux_ch aux_ch)
+ {
+       switch (aux_ch) {
        case AUX_CH_A:
                return POWER_DOMAIN_AUX_A;
        case AUX_CH_B:
        case AUX_CH_G:
                return POWER_DOMAIN_AUX_G;
        default:
-               MISSING_CASE(dig_port->aux_ch);
+               MISSING_CASE(aux_ch);
                return POWER_DOMAIN_AUX_A;
        }
  }
@@@ -7926,39 -7940,36 +7940,36 @@@ static bool intel_crtc_supports_double_
                (crtc->pipe == PIPE_A || IS_I915G(dev_priv));
  }
  
- static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config)
+ static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *crtc_state)
  {
-       u32 pixel_rate;
-       pixel_rate = pipe_config->hw.adjusted_mode.crtc_clock;
+       u32 pixel_rate = crtc_state->hw.adjusted_mode.crtc_clock;
+       unsigned int pipe_w, pipe_h, pfit_w, pfit_h;
  
        /*
         * We only use IF-ID interlacing. If we ever use
         * PF-ID we'll need to adjust the pixel_rate here.
         */
  
-       if (pipe_config->pch_pfit.enabled) {
-               u64 pipe_w, pipe_h, pfit_w, pfit_h;
-               u32 pfit_size = pipe_config->pch_pfit.size;
+       if (!crtc_state->pch_pfit.enabled)
+               return pixel_rate;
  
-               pipe_w = pipe_config->pipe_src_w;
-               pipe_h = pipe_config->pipe_src_h;
+       pipe_w = crtc_state->pipe_src_w;
+       pipe_h = crtc_state->pipe_src_h;
  
-               pfit_w = (pfit_size >> 16) & 0xFFFF;
-               pfit_h = pfit_size & 0xFFFF;
-               if (pipe_w < pfit_w)
-                       pipe_w = pfit_w;
-               if (pipe_h < pfit_h)
-                       pipe_h = pfit_h;
+       pfit_w = drm_rect_width(&crtc_state->pch_pfit.dst);
+       pfit_h = drm_rect_height(&crtc_state->pch_pfit.dst);
  
-               if (WARN_ON(!pfit_w || !pfit_h))
-                       return pixel_rate;
+       if (pipe_w < pfit_w)
+               pipe_w = pfit_w;
+       if (pipe_h < pfit_h)
+               pipe_h = pfit_h;
  
-               pixel_rate = div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
-                                    pfit_w * pfit_h);
-       }
+       if (drm_WARN_ON(crtc_state->uapi.crtc->dev,
+                       !pfit_w || !pfit_h))
+               return pixel_rate;
  
-       return pixel_rate;
+       return div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
+                      pfit_w * pfit_h);
  }
  
  static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
@@@ -8127,7 -8138,7 +8138,7 @@@ static void intel_panel_sanitize_ssc(st
        }
  }
  
- static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
+ static bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
  {
        if (i915_modparams.panel_use_ssc >= 0)
                return i915_modparams.panel_use_ssc != 0;
@@@ -8875,6 -8886,7 +8886,6 @@@ void intel_mode_from_pipe_config(struc
  
        mode->clock = pipe_config->hw.adjusted_mode.crtc_clock;
  
 -      mode->hsync = drm_mode_hsync(mode);
        mode->vrefresh = drm_mode_vrefresh(mode);
        drm_mode_set_name(mode);
  }
@@@ -9151,9 -9163,9 +9162,9 @@@ static bool i9xx_has_pfit(struct drm_i9
                IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
  }
  
- static void i9xx_get_pfit_config(struct intel_crtc *crtc,
-                                struct intel_crtc_state *pipe_config)
+ static void i9xx_get_pfit_config(struct intel_crtc_state *crtc_state)
  {
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        u32 tmp;
  
                        return;
        }
  
-       pipe_config->gmch_pfit.control = tmp;
-       pipe_config->gmch_pfit.pgm_ratios = intel_de_read(dev_priv,
-                                                         PFIT_PGM_RATIOS);
+       crtc_state->gmch_pfit.control = tmp;
+       crtc_state->gmch_pfit.pgm_ratios =
+               intel_de_read(dev_priv, PFIT_PGM_RATIOS);
  }
  
  static void vlv_crtc_clock_get(struct intel_crtc *crtc,
@@@ -9425,7 -9437,7 +9436,7 @@@ static bool i9xx_get_pipe_config(struc
        intel_get_pipe_timings(crtc, pipe_config);
        intel_get_pipe_src_size(crtc, pipe_config);
  
-       i9xx_get_pfit_config(crtc, pipe_config);
+       i9xx_get_pfit_config(pipe_config);
  
        if (INTEL_GEN(dev_priv) >= 4) {
                /* No way to read it out on pipes B and C */
@@@ -10395,37 -10407,47 +10406,47 @@@ static void ilk_get_fdi_m_n_config(stru
                                     &pipe_config->fdi_m_n, NULL);
  }
  
- static void skl_get_pfit_config(struct intel_crtc *crtc,
-                               struct intel_crtc_state *pipe_config)
+ static void ilk_get_pfit_pos_size(struct intel_crtc_state *crtc_state,
+                                 u32 pos, u32 size)
  {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
-       struct intel_crtc_scaler_state *scaler_state = &pipe_config->scaler_state;
-       u32 ps_ctrl = 0;
+       drm_rect_init(&crtc_state->pch_pfit.dst,
+                     pos >> 16, pos & 0xffff,
+                     size >> 16, size & 0xffff);
+ }
+ static void skl_get_pfit_config(struct intel_crtc_state *crtc_state)
+ {
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
        int id = -1;
        int i;
  
        /* find scaler attached to this pipe */
        for (i = 0; i < crtc->num_scalers; i++) {
-               ps_ctrl = intel_de_read(dev_priv, SKL_PS_CTRL(crtc->pipe, i));
-               if (ps_ctrl & PS_SCALER_EN && !(ps_ctrl & PS_PLANE_SEL_MASK)) {
-                       id = i;
-                       pipe_config->pch_pfit.enabled = true;
-                       pipe_config->pch_pfit.pos = intel_de_read(dev_priv,
-                                                                 SKL_PS_WIN_POS(crtc->pipe, i));
-                       pipe_config->pch_pfit.size = intel_de_read(dev_priv,
-                                                                  SKL_PS_WIN_SZ(crtc->pipe, i));
-                       scaler_state->scalers[i].in_use = true;
-                       break;
-               }
+               u32 ctl, pos, size;
+               ctl = intel_de_read(dev_priv, SKL_PS_CTRL(crtc->pipe, i));
+               if ((ctl & (PS_SCALER_EN | PS_PLANE_SEL_MASK)) != PS_SCALER_EN)
+                       continue;
+               id = i;
+               crtc_state->pch_pfit.enabled = true;
+               pos = intel_de_read(dev_priv, SKL_PS_WIN_POS(crtc->pipe, i));
+               size = intel_de_read(dev_priv, SKL_PS_WIN_SZ(crtc->pipe, i));
+               ilk_get_pfit_pos_size(crtc_state, pos, size);
+               scaler_state->scalers[i].in_use = true;
+               break;
        }
  
        scaler_state->scaler_id = id;
-       if (id >= 0) {
+       if (id >= 0)
                scaler_state->scaler_users |= (1 << SKL_CRTC_INDEX);
-       } else {
+       else
                scaler_state->scaler_users &= ~(1 << SKL_CRTC_INDEX);
-       }
  }
  
  static void
        kfree(intel_fb);
  }
  
- static void ilk_get_pfit_config(struct intel_crtc *crtc,
-                               struct intel_crtc_state *pipe_config)
+ static void ilk_get_pfit_config(struct intel_crtc_state *crtc_state)
  {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
-       u32 tmp;
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       u32 ctl, pos, size;
  
-       tmp = intel_de_read(dev_priv, PF_CTL(crtc->pipe));
-       if (tmp & PF_ENABLE) {
-               pipe_config->pch_pfit.enabled = true;
-               pipe_config->pch_pfit.pos = intel_de_read(dev_priv,
-                                                         PF_WIN_POS(crtc->pipe));
-               pipe_config->pch_pfit.size = intel_de_read(dev_priv,
-                                                          PF_WIN_SZ(crtc->pipe));
-               /* We currently do not free assignements of panel fitters on
-                * ivb/hsw (since we don't use the higher upscaling modes which
-                * differentiates them) so just WARN about this case for now. */
-               if (IS_GEN(dev_priv, 7)) {
-                       drm_WARN_ON(dev, (tmp & PF_PIPE_SEL_MASK_IVB) !=
-                                   PF_PIPE_SEL_IVB(crtc->pipe));
-               }
-       }
+       ctl = intel_de_read(dev_priv, PF_CTL(crtc->pipe));
+       if ((ctl & PF_ENABLE) == 0)
+               return;
+       crtc_state->pch_pfit.enabled = true;
+       pos = intel_de_read(dev_priv, PF_WIN_POS(crtc->pipe));
+       size = intel_de_read(dev_priv, PF_WIN_SZ(crtc->pipe));
+       ilk_get_pfit_pos_size(crtc_state, pos, size);
+       /*
+        * We currently do not free assignements of panel fitters on
+        * ivb/hsw (since we don't use the higher upscaling modes which
+        * differentiates them) so just WARN about this case for now.
+        */
+       drm_WARN_ON(&dev_priv->drm, IS_GEN(dev_priv, 7) &&
+                   (ctl & PF_PIPE_SEL_MASK_IVB) != PF_PIPE_SEL_IVB(crtc->pipe));
  }
  
  static bool ilk_get_pipe_config(struct intel_crtc *crtc,
        intel_get_pipe_timings(crtc, pipe_config);
        intel_get_pipe_src_size(crtc, pipe_config);
  
-       ilk_get_pfit_config(crtc, pipe_config);
+       ilk_get_pfit_config(pipe_config);
  
        ret = true;
  
@@@ -11169,9 -11191,9 +11190,9 @@@ static bool hsw_get_pipe_config(struct 
                power_domain_mask |= BIT_ULL(power_domain);
  
                if (INTEL_GEN(dev_priv) >= 9)
-                       skl_get_pfit_config(crtc, pipe_config);
+                       skl_get_pfit_config(pipe_config);
                else
-                       ilk_get_pfit_config(crtc, pipe_config);
+                       ilk_get_pfit_config(pipe_config);
        }
  
        if (hsw_crtc_supports_ips(crtc)) {
@@@ -12430,8 -12452,10 +12451,10 @@@ static int icl_add_linked_planes(struc
                if (IS_ERR(linked_plane_state))
                        return PTR_ERR(linked_plane_state);
  
-               WARN_ON(linked_plane_state->planar_linked_plane != plane);
-               WARN_ON(linked_plane_state->planar_slave == plane_state->planar_slave);
+               drm_WARN_ON(state->base.dev,
+                           linked_plane_state->planar_linked_plane != plane);
+               drm_WARN_ON(state->base.dev,
+                           linked_plane_state->planar_slave == plane_state->planar_slave);
        }
  
        return 0;
@@@ -12819,7 -12843,7 +12842,7 @@@ static void intel_dump_crtc_timings(str
                    mode->type, mode->flags);
  }
  
- static inline void
+ static void
  intel_dump_m_n_config(const struct intel_crtc_state *pipe_config,
                      const char *id, unsigned int lane_count,
                      const struct intel_link_m_n *m_n)
@@@ -13030,9 -13054,8 +13053,8 @@@ static void intel_dump_pipe_config(cons
                            pipe_config->gmch_pfit.lvds_border_bits);
        else
                drm_dbg_kms(&dev_priv->drm,
-                           "pch pfit: pos: 0x%08x, size: 0x%08x, %s, force thru: %s\n",
-                           pipe_config->pch_pfit.pos,
-                           pipe_config->pch_pfit.size,
+                           "pch pfit: " DRM_RECT_FMT ", %s, force thru: %s\n",
+                           DRM_RECT_ARG(&pipe_config->pch_pfit.dst),
                            enableddisabled(pipe_config->pch_pfit.enabled),
                            yesno(pipe_config->pch_pfit.force_thru));
  
@@@ -13154,7 -13177,8 +13176,8 @@@ static void intel_crtc_copy_hw_to_uapi_
  {
        crtc_state->uapi.enable = crtc_state->hw.enable;
        crtc_state->uapi.active = crtc_state->hw.active;
-       WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
+       drm_WARN_ON(crtc_state->uapi.crtc->dev,
+                   drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
  
        crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
  
@@@ -13773,8 -13797,10 +13796,10 @@@ intel_pipe_config_compare(const struct 
  
                PIPE_CONF_CHECK_BOOL(pch_pfit.enabled);
                if (current_config->pch_pfit.enabled) {
-                       PIPE_CONF_CHECK_X(pch_pfit.pos);
-                       PIPE_CONF_CHECK_X(pch_pfit.size);
+                       PIPE_CONF_CHECK_I(pch_pfit.dst.x1);
+                       PIPE_CONF_CHECK_I(pch_pfit.dst.y1);
+                       PIPE_CONF_CHECK_I(pch_pfit.dst.x2);
+                       PIPE_CONF_CHECK_I(pch_pfit.dst.y2);
                }
  
                PIPE_CONF_CHECK_I(scaler_state.scaler_id);
@@@ -15353,12 -15379,7 +15378,7 @@@ static void intel_atomic_commit_tail(st
  
                intel_set_cdclk_pre_plane_update(state);
  
-               /*
-                * SKL workaround: bspec recommends we disable the SAGV when we
-                * have more then one pipe enabled
-                */
-               if (!intel_can_enable_sagv(state))
-                       intel_disable_sagv(dev_priv);
+               intel_sagv_pre_plane_update(state);
  
                intel_modeset_verify_disabled(dev_priv, state);
        }
        intel_check_cpu_fifo_underruns(dev_priv);
        intel_check_pch_fifo_underruns(dev_priv);
  
-       if (state->modeset)
+       if (state->modeset) {
                intel_verify_planes(state);
  
-       if (state->modeset && intel_can_enable_sagv(state))
-               intel_enable_sagv(dev_priv);
+               intel_sagv_post_plane_update(state);
+       }
  
        drm_atomic_helper_commit_hw_done(&state->base);
  
index bdeea2e026420fc011c42e251dcdedca3c7f4fe1,3d9dc27478b334d024b2cd5b569d1cd4dfaf811a..70525623bcdf094611c977d32851e11dcc507f5e
@@@ -9,6 -9,7 +9,7 @@@
  #include "i915_debugfs.h"
  #include "intel_csr.h"
  #include "intel_display_debugfs.h"
+ #include "intel_display_power.h"
  #include "intel_display_types.h"
  #include "intel_dp.h"
  #include "intel_fbc.h"
@@@ -631,9 -632,15 +632,9 @@@ static void intel_dp_info(struct seq_fi
  }
  
  static void intel_dp_mst_info(struct seq_file *m,
 -                        struct intel_connector *intel_connector)
 +                            struct intel_connector *intel_connector)
  {
 -      struct intel_encoder *intel_encoder = intel_attached_encoder(intel_connector);
 -      struct intel_dp_mst_encoder *intel_mst =
 -              enc_to_mst(intel_encoder);
 -      struct intel_digital_port *intel_dig_port = intel_mst->primary;
 -      struct intel_dp *intel_dp = &intel_dig_port->dp;
 -      bool has_audio = drm_dp_mst_port_has_audio(&intel_dp->mst_mgr,
 -                                      intel_connector->port);
 +      bool has_audio = intel_connector->port->has_audio;
  
        seq_printf(m, "\taudio support: %s\n", yesno(has_audio));
  }
@@@ -1143,6 -1150,51 +1144,51 @@@ static int i915_drrs_status(struct seq_
        return 0;
  }
  
+ #define LPSP_STATUS(COND) (COND ? seq_puts(m, "LPSP: enabled\n") : \
+                               seq_puts(m, "LPSP: disabled\n"))
+ static bool
+ intel_lpsp_power_well_enabled(struct drm_i915_private *i915,
+                             enum i915_power_well_id power_well_id)
+ {
+       intel_wakeref_t wakeref;
+       bool is_enabled;
+       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
+       is_enabled = intel_display_power_well_is_enabled(i915,
+                                                        power_well_id);
+       intel_runtime_pm_put(&i915->runtime_pm, wakeref);
+       return is_enabled;
+ }
+ static int i915_lpsp_status(struct seq_file *m, void *unused)
+ {
+       struct drm_i915_private *i915 = node_to_i915(m->private);
+       switch (INTEL_GEN(i915)) {
+       case 12:
+       case 11:
+               LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, ICL_DISP_PW_3));
+               break;
+       case 10:
+       case 9:
+               LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, SKL_DISP_PW_2));
+               break;
+       default:
+               /*
+                * Apart from HASWELL/BROADWELL other legacy platform doesn't
+                * support lpsp.
+                */
+               if (IS_HASWELL(i915) || IS_BROADWELL(i915))
+                       LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, HSW_DISP_PW_GLOBAL));
+               else
+                       seq_puts(m, "LPSP: not supported\n");
+       }
+       return 0;
+ }
  static int i915_dp_mst_info(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@@ -1910,6 -1962,7 +1956,7 @@@ static const struct drm_info_list intel
        {"i915_dp_mst_info", i915_dp_mst_info, 0},
        {"i915_ddb_info", i915_ddb_info, 0},
        {"i915_drrs_status", i915_drrs_status, 0},
+       {"i915_lpsp_status", i915_lpsp_status, 0},
  };
  
  static const struct {
        {"i915_edp_psr_debug", &i915_edp_psr_debug_fops},
  };
  
 -int intel_display_debugfs_register(struct drm_i915_private *i915)
 +void intel_display_debugfs_register(struct drm_i915_private *i915)
  {
        struct drm_minor *minor = i915->drm.primary;
        int i;
                                    intel_display_debugfs_files[i].fops);
        }
  
 -      return drm_debugfs_create_files(intel_display_debugfs_list,
 -                                      ARRAY_SIZE(intel_display_debugfs_list),
 -                                      minor->debugfs_root, minor);
 +      drm_debugfs_create_files(intel_display_debugfs_list,
 +                               ARRAY_SIZE(intel_display_debugfs_list),
 +                               minor->debugfs_root, minor);
  }
  
  static int i915_panel_show(struct seq_file *m, void *data)
@@@ -1991,6 -2044,48 +2038,48 @@@ static int i915_hdcp_sink_capability_sh
  }
  DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
  
+ #define LPSP_CAPABLE(COND) (COND ? seq_puts(m, "LPSP: capable\n") : \
+                               seq_puts(m, "LPSP: incapable\n"))
+ static int i915_lpsp_capability_show(struct seq_file *m, void *data)
+ {
+       struct drm_connector *connector = m->private;
+       struct intel_encoder *encoder =
+                       intel_attached_encoder(to_intel_connector(connector));
+       struct drm_i915_private *i915 = to_i915(connector->dev);
+       if (connector->status != connector_status_connected)
+               return -ENODEV;
+       switch (INTEL_GEN(i915)) {
+       case 12:
+               /*
+                * Actually TGL can drive LPSP on port till DDI_C
+                * but there is no physical connected DDI_C on TGL sku's,
+                * even driver is not initilizing DDI_C port for gen12.
+                */
+               LPSP_CAPABLE(encoder->port <= PORT_B);
+               break;
+       case 11:
+               LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_eDP);
+               break;
+       case 10:
+       case 9:
+               LPSP_CAPABLE(encoder->port == PORT_A &&
+                            (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_eDP  ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort));
+               break;
+       default:
+               if (IS_HASWELL(i915) || IS_BROADWELL(i915))
+                       LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_eDP);
+       }
+       return 0;
+ }
+ DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
  static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
  {
        struct drm_connector *connector = m->private;
@@@ -2134,5 -2229,16 +2223,16 @@@ int intel_connector_debugfs_add(struct 
                debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root,
                                    connector, &i915_dsc_fec_support_fops);
  
+       /* Legacy panels doesn't lpsp on any platform */
+       if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) ||
+            IS_BROADWELL(dev_priv)) &&
+            (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+            connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+            connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
+            connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
+            connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
+               debugfs_create_file("i915_lpsp_capability", 0444, root,
+                                   connector, &i915_lpsp_capability_fops);
        return 0;
  }
index ba8c08145c88c3b2b7303c1eed9b34b0e0495005,e58e25779bd62bfdcc4fe10c9590d9ef4a6edab5..9488449e4b94900fe229e1e279b9e927cecba7d8
@@@ -438,7 -438,7 +438,7 @@@ struct intel_connector 
           state of connector->polled in case hotplug storm detection changes it */
        u8 polled;
  
 -      void *port; /* store this opaque as its illegal to dereference it */
 +      struct drm_dp_mst_port *port;
  
        struct intel_dp *mst_port;
  
@@@ -974,8 -974,7 +974,7 @@@ struct intel_crtc_state 
  
        /* Panel fitter placement and size for Ironlake+ */
        struct {
-               u32 pos;
-               u32 size;
+               struct drm_rect dst;
                bool enabled;
                bool force_thru;
        } pch_pfit;
@@@ -1368,6 -1367,9 +1367,9 @@@ struct intel_dp 
  
        /* This is called before a link training is starterd */
        void (*prepare_link_retrain)(struct intel_dp *intel_dp);
+       void (*set_link_train)(struct intel_dp *intel_dp, u8 dp_train_pat);
+       void (*set_idle_link_train)(struct intel_dp *intel_dp);
+       void (*set_signal_levels)(struct intel_dp *intel_dp);
  
        /* Displayport compliance testing */
        struct intel_dp_compliance compliance;
index a83f910d8e158c8ad8382f8939d19fc661297d74,74559379384a8152e49007be059783dd9979da7d..4d2384650383658f11999ba05d60a2d800e0dede
@@@ -113,7 -113,9 +113,7 @@@ static int intel_dp_mst_compute_config(
        pipe_config->has_pch_encoder = false;
  
        if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
 -              pipe_config->has_audio =
 -                      drm_dp_mst_port_has_audio(&intel_dp->mst_mgr,
 -                                                connector->port);
 +              pipe_config->has_audio = connector->port->has_audio;
        else
                pipe_config->has_audio =
                        intel_conn_state->force_audio == HDMI_AUDIO_ON;
@@@ -489,7 -491,7 +489,7 @@@ static void intel_mst_pre_enable_dp(str
         * here for the following ones.
         */
        if (INTEL_GEN(dev_priv) < 12 || !first_mst_stream)
-               intel_ddi_enable_pipe_clock(pipe_config);
+               intel_ddi_enable_pipe_clock(encoder, pipe_config);
  
        intel_ddi_set_dp_msa(pipe_config, conn_state);
  
@@@ -508,6 -510,8 +508,8 @@@ static void intel_mst_enable_dp(struct 
  
        drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
  
+       intel_ddi_enable_transcoder_func(encoder, pipe_config);
        intel_enable_pipe(pipe_config);
  
        intel_crtc_vblank_on(pipe_config);
index aa35a59f1c7d873d23827fb8a2969ed7e04ba2ca,23857a7512b70606d805890845390c5198755781..c09e1afb5f797dedc60b59e2ceaf8d008b270666
@@@ -32,6 -32,7 +32,7 @@@
  #include <drm/drm_debugfs.h>
  
  #include "gem/i915_gem_context.h"
+ #include "gt/intel_gt_clock_utils.h"
  #include "gt/intel_gt_pm.h"
  #include "gt/intel_gt_requests.h"
  #include "gt/intel_reset.h"
@@@ -926,21 -927,30 +927,30 @@@ static int i915_frequency_info(struct s
                seq_printf(m, "RPDECLIMIT: 0x%08x\n", rpdeclimit);
                seq_printf(m, "RPNSWREQ: %dMHz\n", reqf);
                seq_printf(m, "CAGF: %dMHz\n", cagf);
-               seq_printf(m, "RP CUR UP EI: %d (%dus)\n",
-                          rpupei, GT_PM_INTERVAL_TO_US(dev_priv, rpupei));
-               seq_printf(m, "RP CUR UP: %d (%dus)\n",
-                          rpcurup, GT_PM_INTERVAL_TO_US(dev_priv, rpcurup));
-               seq_printf(m, "RP PREV UP: %d (%dus)\n",
-                          rpprevup, GT_PM_INTERVAL_TO_US(dev_priv, rpprevup));
+               seq_printf(m, "RP CUR UP EI: %d (%dns)\n",
+                          rpupei,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt, rpupei));
+               seq_printf(m, "RP CUR UP: %d (%dun)\n",
+                          rpcurup,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt, rpcurup));
+               seq_printf(m, "RP PREV UP: %d (%dns)\n",
+                          rpprevup,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt, rpprevup));
                seq_printf(m, "Up threshold: %d%%\n",
                           rps->power.up_threshold);
  
-               seq_printf(m, "RP CUR DOWN EI: %d (%dus)\n",
-                          rpdownei, GT_PM_INTERVAL_TO_US(dev_priv, rpdownei));
-               seq_printf(m, "RP CUR DOWN: %d (%dus)\n",
-                          rpcurdown, GT_PM_INTERVAL_TO_US(dev_priv, rpcurdown));
-               seq_printf(m, "RP PREV DOWN: %d (%dus)\n",
-                          rpprevdown, GT_PM_INTERVAL_TO_US(dev_priv, rpprevdown));
+               seq_printf(m, "RP CUR DOWN EI: %d (%dns)\n",
+                          rpdownei,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt,
+                                                     rpdownei));
+               seq_printf(m, "RP CUR DOWN: %d (%dns)\n",
+                          rpcurdown,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt,
+                                                     rpcurdown));
+               seq_printf(m, "RP PREV DOWN: %d (%dns)\n",
+                          rpprevdown,
+                          intel_gt_pm_interval_to_ns(&dev_priv->gt,
+                                                     rpprevdown));
                seq_printf(m, "Down threshold: %d%%\n",
                           rps->power.down_threshold);
  
@@@ -1189,7 -1199,8 +1199,8 @@@ static int i915_rps_boost_info(struct s
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        struct intel_rps *rps = &dev_priv->gt.rps;
  
-       seq_printf(m, "RPS enabled? %d\n", rps->enabled);
+       seq_printf(m, "RPS enabled? %s\n", yesno(intel_rps_is_enabled(rps)));
+       seq_printf(m, "RPS active? %s\n", yesno(intel_rps_is_active(rps)));
        seq_printf(m, "GPU busy? %s\n", yesno(dev_priv->gt.awake));
        seq_printf(m, "Boosts outstanding? %d\n",
                   atomic_read(&rps->num_waiters));
  
        seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts));
  
-       if (INTEL_GEN(dev_priv) >= 6 && rps->enabled && dev_priv->gt.awake) {
+       if (INTEL_GEN(dev_priv) >= 6 && intel_rps_is_active(rps)) {
                u32 rpup, rpupei;
                u32 rpdown, rpdownei;
  
@@@ -1884,7 -1895,7 +1895,7 @@@ static const struct i915_debugfs_files 
  #endif
  };
  
 -int i915_debugfs_register(struct drm_i915_private *dev_priv)
 +void i915_debugfs_register(struct drm_i915_private *dev_priv)
  {
        struct drm_minor *minor = dev_priv->drm.primary;
        int i;
                                    i915_debugfs_files[i].fops);
        }
  
 -      return drm_debugfs_create_files(i915_debugfs_list,
 -                                      I915_DEBUGFS_ENTRIES,
 -                                      minor->debugfs_root, minor);
 +      drm_debugfs_create_files(i915_debugfs_list,
 +                               I915_DEBUGFS_ENTRIES,
 +                               minor->debugfs_root, minor);
  }
index ff9a5b1b4c6d0f55d135aa00c4cef192bd5feab0,c08b165a9cb42488ba4aec98d4bff7b06b1656bf..34ee12f3f02d465d4ad7703548080fb97ba8b3a2
@@@ -43,7 -43,6 +43,7 @@@
  #include <drm/drm_atomic_helper.h>
  #include <drm/drm_ioctl.h>
  #include <drm/drm_irq.h>
 +#include <drm/drm_managed.h>
  #include <drm/drm_probe_helper.h>
  
  #include "display/intel_acpi.h"
@@@ -228,14 -227,14 +228,14 @@@ static int i915_driver_modeset_probe_no
                ret = drm_vblank_init(&i915->drm,
                                      INTEL_NUM_PIPES(i915));
                if (ret)
-                       goto out;
+                       return ret;
        }
  
        intel_bios_init(i915);
  
        ret = intel_vga_register(i915);
        if (ret)
-               goto out;
+               goto cleanup_bios;
  
        intel_power_domains_init_hw(i915, false);
  
  
        ret = intel_modeset_init_noirq(i915);
        if (ret)
-               goto cleanup_vga_client;
+               goto cleanup_vga_client_pw_domain_csr;
  
        return 0;
  
- cleanup_vga_client:
+ cleanup_vga_client_pw_domain_csr:
+       intel_csr_ucode_fini(i915);
+       intel_power_domains_driver_remove(i915);
        intel_vga_unregister(i915);
- out:
+ cleanup_bios:
+       intel_bios_driver_remove(i915);
        return ret;
  }
  
@@@ -308,13 -310,13 +311,13 @@@ static void i915_driver_modeset_remove(
  /* part #2: call after irq uninstall */
  static void i915_driver_modeset_remove_noirq(struct drm_i915_private *i915)
  {
-       intel_modeset_driver_remove_noirq(i915);
+       intel_csr_ucode_fini(i915);
  
-       intel_bios_driver_remove(i915);
+       intel_power_domains_driver_remove(i915);
  
        intel_vga_unregister(i915);
  
-       intel_csr_ucode_fini(i915);
+       intel_bios_driver_remove(i915);
  }
  
  static void intel_init_dpio(struct drm_i915_private *dev_priv)
@@@ -566,6 -568,62 +569,62 @@@ static void intel_sanitize_options(stru
        intel_gvt_sanitize_options(dev_priv);
  }
  
+ /**
+  * i915_set_dma_info - set all relevant PCI dma info as configured for the
+  * platform
+  * @i915: valid i915 instance
+  *
+  * Set the dma max segment size, device and coherent masks.  The dma mask set
+  * needs to occur before i915_ggtt_probe_hw.
+  *
+  * A couple of platforms have special needs.  Address them as well.
+  *
+  */
+ static int i915_set_dma_info(struct drm_i915_private *i915)
+ {
+       struct pci_dev *pdev = i915->drm.pdev;
+       unsigned int mask_size = INTEL_INFO(i915)->dma_mask_size;
+       int ret;
+       GEM_BUG_ON(!mask_size);
+       /*
+        * We don't have a max segment size, so set it to the max so sg's
+        * debugging layer doesn't complain
+        */
+       dma_set_max_seg_size(&pdev->dev, UINT_MAX);
+       ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(mask_size));
+       if (ret)
+               goto mask_err;
+       /* overlay on gen2 is broken and can't address above 1G */
+       if (IS_GEN(i915, 2))
+               mask_size = 30;
+       /*
+        * 965GM sometimes incorrectly writes to hardware status page (HWS)
+        * using 32bit addressing, overwriting memory if HWS is located
+        * above 4GB.
+        *
+        * The documentation also mentions an issue with undefined
+        * behaviour if any general state is accessed within a page above 4GB,
+        * which also needs to be handled carefully.
+        */
+       if (IS_I965G(i915) || IS_I965GM(i915))
+               mask_size = 32;
+       ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(mask_size));
+       if (ret)
+               goto mask_err;
+       return 0;
+ mask_err:
+       drm_err(&i915->drm, "Can't set DMA mask/consistent mask (%d)\n", ret);
+       return ret;
+ }
  /**
   * i915_driver_hw_probe - setup state requiring device access
   * @dev_priv: device private
@@@ -611,6 -669,10 +670,10 @@@ static int i915_driver_hw_probe(struct 
        /* needs to be done before ggtt probe */
        intel_dram_edram_detect(dev_priv);
  
+       ret = i915_set_dma_info(dev_priv);
+       if (ret)
+               return ret;
        i915_perf_init(dev_priv);
  
        ret = i915_ggtt_probe_hw(dev_priv);
  
        pci_set_master(pdev);
  
-       /*
-        * We don't have a max segment size, so set it to the max so sg's
-        * debugging layer doesn't complain
-        */
-       dma_set_max_seg_size(&pdev->dev, UINT_MAX);
-       /* overlay on gen2 is broken and can't address above 1G */
-       if (IS_GEN(dev_priv, 2)) {
-               ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(30));
-               if (ret) {
-                       drm_err(&dev_priv->drm, "failed to set DMA mask\n");
-                       goto err_mem_regions;
-               }
-       }
-       /* 965GM sometimes incorrectly writes to hardware status page (HWS)
-        * using 32bit addressing, overwriting memory if HWS is located
-        * above 4GB.
-        *
-        * The documentation also mentions an issue with undefined
-        * behaviour if any general state is accessed within a page above 4GB,
-        * which also needs to be handled carefully.
-        */
-       if (IS_I965G(dev_priv) || IS_I965GM(dev_priv)) {
-               ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
-               if (ret) {
-                       drm_err(&dev_priv->drm, "failed to set DMA mask\n");
-                       goto err_mem_regions;
-               }
-       }
        cpu_latency_qos_add_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
  
        intel_gt_init_workarounds(dev_priv);
@@@ -877,11 -905,17 +906,11 @@@ i915_driver_create(struct pci_dev *pdev
                (struct intel_device_info *)ent->driver_data;
        struct intel_device_info *device_info;
        struct drm_i915_private *i915;
 -      int err;
  
 -      i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
 -      if (!i915)
 -              return ERR_PTR(-ENOMEM);
 -
 -      err = drm_dev_init(&i915->drm, &driver, &pdev->dev);
 -      if (err) {
 -              kfree(i915);
 -              return ERR_PTR(err);
 -      }
 +      i915 = devm_drm_dev_alloc(&pdev->dev, &driver,
 +                                struct drm_i915_private, drm);
 +      if (IS_ERR(i915))
 +              return i915;
  
        i915->drm.pdev = pdev;
        pci_set_drvdata(pdev, i915);
        return i915;
  }
  
 -static void i915_driver_destroy(struct drm_i915_private *i915)
 -{
 -      struct pci_dev *pdev = i915->drm.pdev;
 -
 -      drm_dev_fini(&i915->drm);
 -      kfree(i915);
 -
 -      /* And make sure we never chase our dangling pointer from pci_dev */
 -      pci_set_drvdata(pdev, NULL);
 -}
 -
  /**
   * i915_driver_probe - setup chip and create an initial config
   * @pdev: PCI device
@@@ -977,14 -1022,12 +1006,14 @@@ int i915_driver_probe(struct pci_dev *p
  
        i915_welcome_messages(i915);
  
 +      i915->do_release = true;
 +
        return 0;
  
  out_cleanup_irq:
        intel_irq_uninstall(i915);
  out_cleanup_modeset:
-       /* FIXME */
+       i915_driver_modeset_remove_noirq(i915);
  out_cleanup_hw:
        i915_driver_hw_remove(i915);
        intel_memory_regions_driver_release(i915);
@@@ -998,6 -1041,7 +1027,6 @@@ out_pci_disable
        pci_disable_device(pdev);
  out_fini:
        i915_probe_error(i915, "Device initialization failed (%d)\n", ret);
 -      i915_driver_destroy(i915);
        return ret;
  }
  
@@@ -1020,12 -1064,12 +1049,12 @@@ void i915_driver_remove(struct drm_i915
  
        intel_irq_uninstall(i915);
  
-       i915_driver_modeset_remove_noirq(i915);
+       intel_modeset_driver_remove_noirq(i915);
  
        i915_reset_error_state(i915);
        i915_gem_driver_remove(i915);
  
-       intel_power_domains_driver_remove(i915);
+       i915_driver_modeset_remove_noirq(i915);
  
        i915_driver_hw_remove(i915);
  
@@@ -1037,9 -1081,6 +1066,9 @@@ static void i915_driver_release(struct 
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
  
 +      if (!dev_priv->do_release)
 +              return;
 +
        disable_rpm_wakeref_asserts(rpm);
  
        i915_gem_driver_release(dev_priv);
        intel_runtime_pm_driver_release(rpm);
  
        i915_driver_late_release(dev_priv);
 -      i915_driver_destroy(dev_priv);
  }
  
  static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
index b00f0845cbc3594101ce009cfbae52ea0015aa64,7af48641dbc997c7b6008534f8e2db50b45c8a09..6af69555733e94b5b97025aa4718e0d819c56faf
  
  #define DRIVER_NAME           "i915"
  #define DRIVER_DESC           "Intel Graphics"
- #define DRIVER_DATE           "20200417"
- #define DRIVER_TIMESTAMP      1587105300
+ #define DRIVER_DATE           "20200430"
+ #define DRIVER_TIMESTAMP      1588234401
  
  struct drm_i915_gem_object;
  
@@@ -822,9 -822,6 +822,9 @@@ struct i915_selftest_stash 
  struct drm_i915_private {
        struct drm_device drm;
  
 +      /* FIXME: Device release actions should all be moved to drmm_ */
 +      bool do_release;
 +
        const struct intel_device_info __info; /* Use INTEL_INFO() to access. */
        struct intel_runtime_info __runtime; /* Use RUNTIME_INFO() to access. */
        struct intel_driver_caps caps;
index 2741fb3e30cb04e3782196c4662b98da5679ee5d,2fc25ec12c3d9290600c055f22d6c8bf7da268b6..1faf9d6ec0a442e73a0908e224f0cc0d0f9438ce
        .engine_mask = BIT(RCS0), \
        .has_snoop = true, \
        .has_coherent_ggtt = false, \
+       .dma_mask_size = 32, \
        I9XX_PIPE_OFFSETS, \
        I9XX_CURSOR_OFFSETS, \
        I9XX_COLORS, \
        .engine_mask = BIT(RCS0), \
        .has_snoop = true, \
        .has_coherent_ggtt = false, \
+       .dma_mask_size = 32, \
        I845_PIPE_OFFSETS, \
        I845_CURSOR_OFFSETS, \
        I9XX_COLORS, \
@@@ -226,6 -228,7 +228,7 @@@ static const struct intel_device_info i
        .engine_mask = BIT(RCS0), \
        .has_snoop = true, \
        .has_coherent_ggtt = true, \
+       .dma_mask_size = 32, \
        I9XX_PIPE_OFFSETS, \
        I9XX_CURSOR_OFFSETS, \
        I9XX_COLORS, \
@@@ -286,6 -289,7 +289,7 @@@ static const struct intel_device_info g
        PLATFORM(INTEL_G33),
        .display.has_hotplug = 1,
        .display.has_overlay = 1,
+       .dma_mask_size = 36,
  };
  
  static const struct intel_device_info pnv_g_info = {
        PLATFORM(INTEL_PINEVIEW),
        .display.has_hotplug = 1,
        .display.has_overlay = 1,
+       .dma_mask_size = 36,
  };
  
  static const struct intel_device_info pnv_m_info = {
        .is_mobile = 1,
        .display.has_hotplug = 1,
        .display.has_overlay = 1,
+       .dma_mask_size = 36,
  };
  
  #define GEN4_FEATURES \
        .engine_mask = BIT(RCS0), \
        .has_snoop = true, \
        .has_coherent_ggtt = true, \
+       .dma_mask_size = 36, \
        I9XX_PIPE_OFFSETS, \
        I9XX_CURSOR_OFFSETS, \
        I965_COLORS, \
@@@ -365,6 -372,7 +372,7 @@@ static const struct intel_device_info g
        .has_coherent_ggtt = true, \
        /* ilk does support rc6, but we do not implement [power] contexts */ \
        .has_rc6 = 0, \
+       .dma_mask_size = 36, \
        I9XX_PIPE_OFFSETS, \
        I9XX_CURSOR_OFFSETS, \
        ILK_COLORS, \
@@@ -395,6 -403,7 +403,7 @@@ static const struct intel_device_info i
        .has_rc6 = 1, \
        .has_rc6p = 1, \
        .has_rps = true, \
+       .dma_mask_size = 40, \
        .ppgtt_type = INTEL_PPGTT_ALIASING, \
        .ppgtt_size = 31, \
        I9XX_PIPE_OFFSETS, \
@@@ -445,6 -454,7 +454,7 @@@ static const struct intel_device_info s
        .has_rc6 = 1, \
        .has_rc6p = 1, \
        .has_rps = true, \
+       .dma_mask_size = 40, \
        .ppgtt_type = INTEL_PPGTT_ALIASING, \
        .ppgtt_size = 31, \
        IVB_PIPE_OFFSETS, \
@@@ -504,6 -514,7 +514,7 @@@ static const struct intel_device_info v
        .has_rps = true,
        .display.has_gmch = 1,
        .display.has_hotplug = 1,
+       .dma_mask_size = 40,
        .ppgtt_type = INTEL_PPGTT_ALIASING,
        .ppgtt_size = 31,
        .has_snoop = true,
@@@ -554,6 -565,7 +565,7 @@@ static const struct intel_device_info h
        G75_FEATURES, \
        GEN(8), \
        .has_logical_ring_contexts = 1, \
+       .dma_mask_size = 39, \
        .ppgtt_type = INTEL_PPGTT_FULL, \
        .ppgtt_size = 48, \
        .has_64bit_reloc = 1, \
@@@ -602,6 -614,7 +614,7 @@@ static const struct intel_device_info c
        .has_rps = true,
        .has_logical_ring_contexts = 1,
        .display.has_gmch = 1,
+       .dma_mask_size = 39,
        .ppgtt_type = INTEL_PPGTT_ALIASING,
        .ppgtt_size = 32,
        .has_reset_engine = 1,
@@@ -685,6 -698,7 +698,7 @@@ static const struct intel_device_info s
        .has_logical_ring_contexts = 1, \
        .has_logical_ring_preemption = 1, \
        .has_gt_uc = 1, \
+       .dma_mask_size = 39, \
        .ppgtt_type = INTEL_PPGTT_FULL, \
        .ppgtt_size = 48, \
        .has_reset_engine = 1, \
@@@ -941,6 -955,8 +955,6 @@@ static void i915_pci_remove(struct pci_
  
        i915_driver_remove(i915);
        pci_set_drvdata(pdev, NULL);
 -
 -      drm_dev_put(&i915->drm);
  }
  
  /* is device_id present in comma separated list of ids */
This page took 0.15565 seconds and 4 git commands to generate.