LCOV - code coverage report
Current view: top level - drivers/gpu/drm/i915/display - intel_display.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 7477 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 355 0.0 %
Branches: 0 5834 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright © 2006-2007 Intel Corporation
       3                 :            :  *
       4                 :            :  * Permission is hereby granted, free of charge, to any person obtaining a
       5                 :            :  * copy of this software and associated documentation files (the "Software"),
       6                 :            :  * to deal in the Software without restriction, including without limitation
       7                 :            :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       8                 :            :  * and/or sell copies of the Software, and to permit persons to whom the
       9                 :            :  * Software is furnished to do so, subject to the following conditions:
      10                 :            :  *
      11                 :            :  * The above copyright notice and this permission notice (including the next
      12                 :            :  * paragraph) shall be included in all copies or substantial portions of the
      13                 :            :  * Software.
      14                 :            :  *
      15                 :            :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      16                 :            :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      17                 :            :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      18                 :            :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      19                 :            :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      20                 :            :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      21                 :            :  * DEALINGS IN THE SOFTWARE.
      22                 :            :  *
      23                 :            :  * Authors:
      24                 :            :  *      Eric Anholt <eric@anholt.net>
      25                 :            :  */
      26                 :            : 
      27                 :            : #include <linux/i2c.h>
      28                 :            : #include <linux/input.h>
      29                 :            : #include <linux/intel-iommu.h>
      30                 :            : #include <linux/kernel.h>
      31                 :            : #include <linux/module.h>
      32                 :            : #include <linux/dma-resv.h>
      33                 :            : #include <linux/slab.h>
      34                 :            : 
      35                 :            : #include <drm/drm_atomic.h>
      36                 :            : #include <drm/drm_atomic_helper.h>
      37                 :            : #include <drm/drm_atomic_uapi.h>
      38                 :            : #include <drm/drm_dp_helper.h>
      39                 :            : #include <drm/drm_edid.h>
      40                 :            : #include <drm/drm_fourcc.h>
      41                 :            : #include <drm/drm_plane_helper.h>
      42                 :            : #include <drm/drm_probe_helper.h>
      43                 :            : #include <drm/drm_rect.h>
      44                 :            : #include <drm/i915_drm.h>
      45                 :            : 
      46                 :            : #include "display/intel_crt.h"
      47                 :            : #include "display/intel_ddi.h"
      48                 :            : #include "display/intel_dp.h"
      49                 :            : #include "display/intel_dp_mst.h"
      50                 :            : #include "display/intel_dsi.h"
      51                 :            : #include "display/intel_dvo.h"
      52                 :            : #include "display/intel_gmbus.h"
      53                 :            : #include "display/intel_hdmi.h"
      54                 :            : #include "display/intel_lvds.h"
      55                 :            : #include "display/intel_sdvo.h"
      56                 :            : #include "display/intel_tv.h"
      57                 :            : #include "display/intel_vdsc.h"
      58                 :            : 
      59                 :            : #include "gt/intel_rps.h"
      60                 :            : 
      61                 :            : #include "i915_drv.h"
      62                 :            : #include "i915_trace.h"
      63                 :            : #include "intel_acpi.h"
      64                 :            : #include "intel_atomic.h"
      65                 :            : #include "intel_atomic_plane.h"
      66                 :            : #include "intel_bw.h"
      67                 :            : #include "intel_cdclk.h"
      68                 :            : #include "intel_color.h"
      69                 :            : #include "intel_display_types.h"
      70                 :            : #include "intel_dp_link_training.h"
      71                 :            : #include "intel_fbc.h"
      72                 :            : #include "intel_fbdev.h"
      73                 :            : #include "intel_fifo_underrun.h"
      74                 :            : #include "intel_frontbuffer.h"
      75                 :            : #include "intel_hdcp.h"
      76                 :            : #include "intel_hotplug.h"
      77                 :            : #include "intel_overlay.h"
      78                 :            : #include "intel_pipe_crc.h"
      79                 :            : #include "intel_pm.h"
      80                 :            : #include "intel_psr.h"
      81                 :            : #include "intel_quirks.h"
      82                 :            : #include "intel_sideband.h"
      83                 :            : #include "intel_sprite.h"
      84                 :            : #include "intel_tc.h"
      85                 :            : #include "intel_vga.h"
      86                 :            : 
      87                 :            : /* Primary plane formats for gen <= 3 */
      88                 :            : static const u32 i8xx_primary_formats[] = {
      89                 :            :         DRM_FORMAT_C8,
      90                 :            :         DRM_FORMAT_XRGB1555,
      91                 :            :         DRM_FORMAT_RGB565,
      92                 :            :         DRM_FORMAT_XRGB8888,
      93                 :            : };
      94                 :            : 
      95                 :            : /* Primary plane formats for ivb (no fp16 due to hw issue) */
      96                 :            : static const u32 ivb_primary_formats[] = {
      97                 :            :         DRM_FORMAT_C8,
      98                 :            :         DRM_FORMAT_RGB565,
      99                 :            :         DRM_FORMAT_XRGB8888,
     100                 :            :         DRM_FORMAT_XBGR8888,
     101                 :            :         DRM_FORMAT_XRGB2101010,
     102                 :            :         DRM_FORMAT_XBGR2101010,
     103                 :            : };
     104                 :            : 
     105                 :            : /* Primary plane formats for gen >= 4, except ivb */
     106                 :            : static const u32 i965_primary_formats[] = {
     107                 :            :         DRM_FORMAT_C8,
     108                 :            :         DRM_FORMAT_RGB565,
     109                 :            :         DRM_FORMAT_XRGB8888,
     110                 :            :         DRM_FORMAT_XBGR8888,
     111                 :            :         DRM_FORMAT_XRGB2101010,
     112                 :            :         DRM_FORMAT_XBGR2101010,
     113                 :            :         DRM_FORMAT_XBGR16161616F,
     114                 :            : };
     115                 :            : 
     116                 :            : /* Primary plane formats for vlv/chv */
     117                 :            : static const u32 vlv_primary_formats[] = {
     118                 :            :         DRM_FORMAT_C8,
     119                 :            :         DRM_FORMAT_RGB565,
     120                 :            :         DRM_FORMAT_XRGB8888,
     121                 :            :         DRM_FORMAT_XBGR8888,
     122                 :            :         DRM_FORMAT_ARGB8888,
     123                 :            :         DRM_FORMAT_ABGR8888,
     124                 :            :         DRM_FORMAT_XRGB2101010,
     125                 :            :         DRM_FORMAT_XBGR2101010,
     126                 :            :         DRM_FORMAT_ARGB2101010,
     127                 :            :         DRM_FORMAT_ABGR2101010,
     128                 :            :         DRM_FORMAT_XBGR16161616F,
     129                 :            : };
     130                 :            : 
     131                 :            : static const u64 i9xx_format_modifiers[] = {
     132                 :            :         I915_FORMAT_MOD_X_TILED,
     133                 :            :         DRM_FORMAT_MOD_LINEAR,
     134                 :            :         DRM_FORMAT_MOD_INVALID
     135                 :            : };
     136                 :            : 
     137                 :            : /* Cursor formats */
     138                 :            : static const u32 intel_cursor_formats[] = {
     139                 :            :         DRM_FORMAT_ARGB8888,
     140                 :            : };
     141                 :            : 
     142                 :            : static const u64 cursor_format_modifiers[] = {
     143                 :            :         DRM_FORMAT_MOD_LINEAR,
     144                 :            :         DRM_FORMAT_MOD_INVALID
     145                 :            : };
     146                 :            : 
     147                 :            : static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
     148                 :            :                                 struct intel_crtc_state *pipe_config);
     149                 :            : static void ilk_pch_clock_get(struct intel_crtc *crtc,
     150                 :            :                               struct intel_crtc_state *pipe_config);
     151                 :            : 
     152                 :            : static int intel_framebuffer_init(struct intel_framebuffer *ifb,
     153                 :            :                                   struct drm_i915_gem_object *obj,
     154                 :            :                                   struct drm_mode_fb_cmd2 *mode_cmd);
     155                 :            : static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state);
     156                 :            : static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state);
     157                 :            : static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
     158                 :            :                                          const struct intel_link_m_n *m_n,
     159                 :            :                                          const struct intel_link_m_n *m2_n2);
     160                 :            : static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state);
     161                 :            : static void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state);
     162                 :            : static void hsw_set_pipeconf(const struct intel_crtc_state *crtc_state);
     163                 :            : static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state);
     164                 :            : static void vlv_prepare_pll(struct intel_crtc *crtc,
     165                 :            :                             const struct intel_crtc_state *pipe_config);
     166                 :            : static void chv_prepare_pll(struct intel_crtc *crtc,
     167                 :            :                             const struct intel_crtc_state *pipe_config);
     168                 :            : static void skl_pfit_enable(const struct intel_crtc_state *crtc_state);
     169                 :            : static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state);
     170                 :            : static void intel_modeset_setup_hw_state(struct drm_device *dev,
     171                 :            :                                          struct drm_modeset_acquire_ctx *ctx);
     172                 :            : static struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc);
     173                 :            : 
     174                 :            : struct intel_limit {
     175                 :            :         struct {
     176                 :            :                 int min, max;
     177                 :            :         } dot, vco, n, m, m1, m2, p, p1;
     178                 :            : 
     179                 :            :         struct {
     180                 :            :                 int dot_limit;
     181                 :            :                 int p2_slow, p2_fast;
     182                 :            :         } p2;
     183                 :            : };
     184                 :            : 
     185                 :            : /* returns HPLL frequency in kHz */
     186                 :          0 : int vlv_get_hpll_vco(struct drm_i915_private *dev_priv)
     187                 :            : {
     188                 :          0 :         int hpll_freq, vco_freq[] = { 800, 1600, 2000, 2400 };
     189                 :            : 
     190                 :            :         /* Obtain SKU information */
     191                 :          0 :         hpll_freq = vlv_cck_read(dev_priv, CCK_FUSE_REG) &
     192                 :            :                 CCK_FUSE_HPLL_FREQ_MASK;
     193                 :            : 
     194                 :          0 :         return vco_freq[hpll_freq] * 1000;
     195                 :            : }
     196                 :            : 
     197                 :          0 : int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
     198                 :            :                       const char *name, u32 reg, int ref_freq)
     199                 :            : {
     200                 :          0 :         u32 val;
     201                 :          0 :         int divider;
     202                 :            : 
     203                 :          0 :         val = vlv_cck_read(dev_priv, reg);
     204                 :          0 :         divider = val & CCK_FREQUENCY_VALUES;
     205                 :            : 
     206         [ #  # ]:          0 :         WARN((val & CCK_FREQUENCY_STATUS) !=
     207                 :            :              (divider << CCK_FREQUENCY_STATUS_SHIFT),
     208                 :            :              "%s change in progress\n", name);
     209                 :            : 
     210         [ #  # ]:          0 :         return DIV_ROUND_CLOSEST(ref_freq << 1, divider + 1);
     211                 :            : }
     212                 :            : 
     213                 :          0 : int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
     214                 :            :                            const char *name, u32 reg)
     215                 :            : {
     216                 :          0 :         int hpll;
     217                 :            : 
     218                 :          0 :         vlv_cck_get(dev_priv);
     219                 :            : 
     220         [ #  # ]:          0 :         if (dev_priv->hpll_freq == 0)
     221                 :          0 :                 dev_priv->hpll_freq = vlv_get_hpll_vco(dev_priv);
     222                 :            : 
     223                 :          0 :         hpll = vlv_get_cck_clock(dev_priv, name, reg, dev_priv->hpll_freq);
     224                 :            : 
     225                 :          0 :         vlv_cck_put(dev_priv);
     226                 :            : 
     227                 :          0 :         return hpll;
     228                 :            : }
     229                 :            : 
     230                 :          0 : static void intel_update_czclk(struct drm_i915_private *dev_priv)
     231                 :            : {
     232   [ #  #  #  # ]:          0 :         if (!(IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
     233                 :            :                 return;
     234                 :            : 
     235                 :          0 :         dev_priv->czclk_freq = vlv_get_cck_clock_hpll(dev_priv, "czclk",
     236                 :            :                                                       CCK_CZ_CLOCK_CONTROL);
     237                 :            : 
     238                 :          0 :         DRM_DEBUG_DRIVER("CZ clock rate: %d kHz\n", dev_priv->czclk_freq);
     239                 :            : }
     240                 :            : 
     241                 :            : static inline u32 /* units of 100MHz */
     242                 :          0 : intel_fdi_link_freq(struct drm_i915_private *dev_priv,
     243                 :            :                     const struct intel_crtc_state *pipe_config)
     244                 :            : {
     245                 :          0 :         if (HAS_DDI(dev_priv))
     246                 :          0 :                 return pipe_config->port_clock; /* SPLL */
     247                 :            :         else
     248                 :          0 :                 return dev_priv->fdi_pll_freq;
     249                 :            : }
     250                 :            : 
     251                 :            : static const struct intel_limit intel_limits_i8xx_dac = {
     252                 :            :         .dot = { .min = 25000, .max = 350000 },
     253                 :            :         .vco = { .min = 908000, .max = 1512000 },
     254                 :            :         .n = { .min = 2, .max = 16 },
     255                 :            :         .m = { .min = 96, .max = 140 },
     256                 :            :         .m1 = { .min = 18, .max = 26 },
     257                 :            :         .m2 = { .min = 6, .max = 16 },
     258                 :            :         .p = { .min = 4, .max = 128 },
     259                 :            :         .p1 = { .min = 2, .max = 33 },
     260                 :            :         .p2 = { .dot_limit = 165000,
     261                 :            :                 .p2_slow = 4, .p2_fast = 2 },
     262                 :            : };
     263                 :            : 
     264                 :            : static const struct intel_limit intel_limits_i8xx_dvo = {
     265                 :            :         .dot = { .min = 25000, .max = 350000 },
     266                 :            :         .vco = { .min = 908000, .max = 1512000 },
     267                 :            :         .n = { .min = 2, .max = 16 },
     268                 :            :         .m = { .min = 96, .max = 140 },
     269                 :            :         .m1 = { .min = 18, .max = 26 },
     270                 :            :         .m2 = { .min = 6, .max = 16 },
     271                 :            :         .p = { .min = 4, .max = 128 },
     272                 :            :         .p1 = { .min = 2, .max = 33 },
     273                 :            :         .p2 = { .dot_limit = 165000,
     274                 :            :                 .p2_slow = 4, .p2_fast = 4 },
     275                 :            : };
     276                 :            : 
     277                 :            : static const struct intel_limit intel_limits_i8xx_lvds = {
     278                 :            :         .dot = { .min = 25000, .max = 350000 },
     279                 :            :         .vco = { .min = 908000, .max = 1512000 },
     280                 :            :         .n = { .min = 2, .max = 16 },
     281                 :            :         .m = { .min = 96, .max = 140 },
     282                 :            :         .m1 = { .min = 18, .max = 26 },
     283                 :            :         .m2 = { .min = 6, .max = 16 },
     284                 :            :         .p = { .min = 4, .max = 128 },
     285                 :            :         .p1 = { .min = 1, .max = 6 },
     286                 :            :         .p2 = { .dot_limit = 165000,
     287                 :            :                 .p2_slow = 14, .p2_fast = 7 },
     288                 :            : };
     289                 :            : 
     290                 :            : static const struct intel_limit intel_limits_i9xx_sdvo = {
     291                 :            :         .dot = { .min = 20000, .max = 400000 },
     292                 :            :         .vco = { .min = 1400000, .max = 2800000 },
     293                 :            :         .n = { .min = 1, .max = 6 },
     294                 :            :         .m = { .min = 70, .max = 120 },
     295                 :            :         .m1 = { .min = 8, .max = 18 },
     296                 :            :         .m2 = { .min = 3, .max = 7 },
     297                 :            :         .p = { .min = 5, .max = 80 },
     298                 :            :         .p1 = { .min = 1, .max = 8 },
     299                 :            :         .p2 = { .dot_limit = 200000,
     300                 :            :                 .p2_slow = 10, .p2_fast = 5 },
     301                 :            : };
     302                 :            : 
     303                 :            : static const struct intel_limit intel_limits_i9xx_lvds = {
     304                 :            :         .dot = { .min = 20000, .max = 400000 },
     305                 :            :         .vco = { .min = 1400000, .max = 2800000 },
     306                 :            :         .n = { .min = 1, .max = 6 },
     307                 :            :         .m = { .min = 70, .max = 120 },
     308                 :            :         .m1 = { .min = 8, .max = 18 },
     309                 :            :         .m2 = { .min = 3, .max = 7 },
     310                 :            :         .p = { .min = 7, .max = 98 },
     311                 :            :         .p1 = { .min = 1, .max = 8 },
     312                 :            :         .p2 = { .dot_limit = 112000,
     313                 :            :                 .p2_slow = 14, .p2_fast = 7 },
     314                 :            : };
     315                 :            : 
     316                 :            : 
     317                 :            : static const struct intel_limit intel_limits_g4x_sdvo = {
     318                 :            :         .dot = { .min = 25000, .max = 270000 },
     319                 :            :         .vco = { .min = 1750000, .max = 3500000},
     320                 :            :         .n = { .min = 1, .max = 4 },
     321                 :            :         .m = { .min = 104, .max = 138 },
     322                 :            :         .m1 = { .min = 17, .max = 23 },
     323                 :            :         .m2 = { .min = 5, .max = 11 },
     324                 :            :         .p = { .min = 10, .max = 30 },
     325                 :            :         .p1 = { .min = 1, .max = 3},
     326                 :            :         .p2 = { .dot_limit = 270000,
     327                 :            :                 .p2_slow = 10,
     328                 :            :                 .p2_fast = 10
     329                 :            :         },
     330                 :            : };
     331                 :            : 
     332                 :            : static const struct intel_limit intel_limits_g4x_hdmi = {
     333                 :            :         .dot = { .min = 22000, .max = 400000 },
     334                 :            :         .vco = { .min = 1750000, .max = 3500000},
     335                 :            :         .n = { .min = 1, .max = 4 },
     336                 :            :         .m = { .min = 104, .max = 138 },
     337                 :            :         .m1 = { .min = 16, .max = 23 },
     338                 :            :         .m2 = { .min = 5, .max = 11 },
     339                 :            :         .p = { .min = 5, .max = 80 },
     340                 :            :         .p1 = { .min = 1, .max = 8},
     341                 :            :         .p2 = { .dot_limit = 165000,
     342                 :            :                 .p2_slow = 10, .p2_fast = 5 },
     343                 :            : };
     344                 :            : 
     345                 :            : static const struct intel_limit intel_limits_g4x_single_channel_lvds = {
     346                 :            :         .dot = { .min = 20000, .max = 115000 },
     347                 :            :         .vco = { .min = 1750000, .max = 3500000 },
     348                 :            :         .n = { .min = 1, .max = 3 },
     349                 :            :         .m = { .min = 104, .max = 138 },
     350                 :            :         .m1 = { .min = 17, .max = 23 },
     351                 :            :         .m2 = { .min = 5, .max = 11 },
     352                 :            :         .p = { .min = 28, .max = 112 },
     353                 :            :         .p1 = { .min = 2, .max = 8 },
     354                 :            :         .p2 = { .dot_limit = 0,
     355                 :            :                 .p2_slow = 14, .p2_fast = 14
     356                 :            :         },
     357                 :            : };
     358                 :            : 
     359                 :            : static const struct intel_limit intel_limits_g4x_dual_channel_lvds = {
     360                 :            :         .dot = { .min = 80000, .max = 224000 },
     361                 :            :         .vco = { .min = 1750000, .max = 3500000 },
     362                 :            :         .n = { .min = 1, .max = 3 },
     363                 :            :         .m = { .min = 104, .max = 138 },
     364                 :            :         .m1 = { .min = 17, .max = 23 },
     365                 :            :         .m2 = { .min = 5, .max = 11 },
     366                 :            :         .p = { .min = 14, .max = 42 },
     367                 :            :         .p1 = { .min = 2, .max = 6 },
     368                 :            :         .p2 = { .dot_limit = 0,
     369                 :            :                 .p2_slow = 7, .p2_fast = 7
     370                 :            :         },
     371                 :            : };
     372                 :            : 
     373                 :            : static const struct intel_limit pnv_limits_sdvo = {
     374                 :            :         .dot = { .min = 20000, .max = 400000},
     375                 :            :         .vco = { .min = 1700000, .max = 3500000 },
     376                 :            :         /* Pineview's Ncounter is a ring counter */
     377                 :            :         .n = { .min = 3, .max = 6 },
     378                 :            :         .m = { .min = 2, .max = 256 },
     379                 :            :         /* Pineview only has one combined m divider, which we treat as m2. */
     380                 :            :         .m1 = { .min = 0, .max = 0 },
     381                 :            :         .m2 = { .min = 0, .max = 254 },
     382                 :            :         .p = { .min = 5, .max = 80 },
     383                 :            :         .p1 = { .min = 1, .max = 8 },
     384                 :            :         .p2 = { .dot_limit = 200000,
     385                 :            :                 .p2_slow = 10, .p2_fast = 5 },
     386                 :            : };
     387                 :            : 
     388                 :            : static const struct intel_limit pnv_limits_lvds = {
     389                 :            :         .dot = { .min = 20000, .max = 400000 },
     390                 :            :         .vco = { .min = 1700000, .max = 3500000 },
     391                 :            :         .n = { .min = 3, .max = 6 },
     392                 :            :         .m = { .min = 2, .max = 256 },
     393                 :            :         .m1 = { .min = 0, .max = 0 },
     394                 :            :         .m2 = { .min = 0, .max = 254 },
     395                 :            :         .p = { .min = 7, .max = 112 },
     396                 :            :         .p1 = { .min = 1, .max = 8 },
     397                 :            :         .p2 = { .dot_limit = 112000,
     398                 :            :                 .p2_slow = 14, .p2_fast = 14 },
     399                 :            : };
     400                 :            : 
     401                 :            : /* Ironlake / Sandybridge
     402                 :            :  *
     403                 :            :  * We calculate clock using (register_value + 2) for N/M1/M2, so here
     404                 :            :  * the range value for them is (actual_value - 2).
     405                 :            :  */
     406                 :            : static const struct intel_limit ilk_limits_dac = {
     407                 :            :         .dot = { .min = 25000, .max = 350000 },
     408                 :            :         .vco = { .min = 1760000, .max = 3510000 },
     409                 :            :         .n = { .min = 1, .max = 5 },
     410                 :            :         .m = { .min = 79, .max = 127 },
     411                 :            :         .m1 = { .min = 12, .max = 22 },
     412                 :            :         .m2 = { .min = 5, .max = 9 },
     413                 :            :         .p = { .min = 5, .max = 80 },
     414                 :            :         .p1 = { .min = 1, .max = 8 },
     415                 :            :         .p2 = { .dot_limit = 225000,
     416                 :            :                 .p2_slow = 10, .p2_fast = 5 },
     417                 :            : };
     418                 :            : 
     419                 :            : static const struct intel_limit ilk_limits_single_lvds = {
     420                 :            :         .dot = { .min = 25000, .max = 350000 },
     421                 :            :         .vco = { .min = 1760000, .max = 3510000 },
     422                 :            :         .n = { .min = 1, .max = 3 },
     423                 :            :         .m = { .min = 79, .max = 118 },
     424                 :            :         .m1 = { .min = 12, .max = 22 },
     425                 :            :         .m2 = { .min = 5, .max = 9 },
     426                 :            :         .p = { .min = 28, .max = 112 },
     427                 :            :         .p1 = { .min = 2, .max = 8 },
     428                 :            :         .p2 = { .dot_limit = 225000,
     429                 :            :                 .p2_slow = 14, .p2_fast = 14 },
     430                 :            : };
     431                 :            : 
     432                 :            : static const struct intel_limit ilk_limits_dual_lvds = {
     433                 :            :         .dot = { .min = 25000, .max = 350000 },
     434                 :            :         .vco = { .min = 1760000, .max = 3510000 },
     435                 :            :         .n = { .min = 1, .max = 3 },
     436                 :            :         .m = { .min = 79, .max = 127 },
     437                 :            :         .m1 = { .min = 12, .max = 22 },
     438                 :            :         .m2 = { .min = 5, .max = 9 },
     439                 :            :         .p = { .min = 14, .max = 56 },
     440                 :            :         .p1 = { .min = 2, .max = 8 },
     441                 :            :         .p2 = { .dot_limit = 225000,
     442                 :            :                 .p2_slow = 7, .p2_fast = 7 },
     443                 :            : };
     444                 :            : 
     445                 :            : /* LVDS 100mhz refclk limits. */
     446                 :            : static const struct intel_limit ilk_limits_single_lvds_100m = {
     447                 :            :         .dot = { .min = 25000, .max = 350000 },
     448                 :            :         .vco = { .min = 1760000, .max = 3510000 },
     449                 :            :         .n = { .min = 1, .max = 2 },
     450                 :            :         .m = { .min = 79, .max = 126 },
     451                 :            :         .m1 = { .min = 12, .max = 22 },
     452                 :            :         .m2 = { .min = 5, .max = 9 },
     453                 :            :         .p = { .min = 28, .max = 112 },
     454                 :            :         .p1 = { .min = 2, .max = 8 },
     455                 :            :         .p2 = { .dot_limit = 225000,
     456                 :            :                 .p2_slow = 14, .p2_fast = 14 },
     457                 :            : };
     458                 :            : 
     459                 :            : static const struct intel_limit ilk_limits_dual_lvds_100m = {
     460                 :            :         .dot = { .min = 25000, .max = 350000 },
     461                 :            :         .vco = { .min = 1760000, .max = 3510000 },
     462                 :            :         .n = { .min = 1, .max = 3 },
     463                 :            :         .m = { .min = 79, .max = 126 },
     464                 :            :         .m1 = { .min = 12, .max = 22 },
     465                 :            :         .m2 = { .min = 5, .max = 9 },
     466                 :            :         .p = { .min = 14, .max = 42 },
     467                 :            :         .p1 = { .min = 2, .max = 6 },
     468                 :            :         .p2 = { .dot_limit = 225000,
     469                 :            :                 .p2_slow = 7, .p2_fast = 7 },
     470                 :            : };
     471                 :            : 
     472                 :            : static const struct intel_limit intel_limits_vlv = {
     473                 :            :          /*
     474                 :            :           * These are the data rate limits (measured in fast clocks)
     475                 :            :           * since those are the strictest limits we have. The fast
     476                 :            :           * clock and actual rate limits are more relaxed, so checking
     477                 :            :           * them would make no difference.
     478                 :            :           */
     479                 :            :         .dot = { .min = 25000 * 5, .max = 270000 * 5 },
     480                 :            :         .vco = { .min = 4000000, .max = 6000000 },
     481                 :            :         .n = { .min = 1, .max = 7 },
     482                 :            :         .m1 = { .min = 2, .max = 3 },
     483                 :            :         .m2 = { .min = 11, .max = 156 },
     484                 :            :         .p1 = { .min = 2, .max = 3 },
     485                 :            :         .p2 = { .p2_slow = 2, .p2_fast = 20 }, /* slow=min, fast=max */
     486                 :            : };
     487                 :            : 
     488                 :            : static const struct intel_limit intel_limits_chv = {
     489                 :            :         /*
     490                 :            :          * These are the data rate limits (measured in fast clocks)
     491                 :            :          * since those are the strictest limits we have.  The fast
     492                 :            :          * clock and actual rate limits are more relaxed, so checking
     493                 :            :          * them would make no difference.
     494                 :            :          */
     495                 :            :         .dot = { .min = 25000 * 5, .max = 540000 * 5},
     496                 :            :         .vco = { .min = 4800000, .max = 6480000 },
     497                 :            :         .n = { .min = 1, .max = 1 },
     498                 :            :         .m1 = { .min = 2, .max = 2 },
     499                 :            :         .m2 = { .min = 24 << 22, .max = 175 << 22 },
     500                 :            :         .p1 = { .min = 2, .max = 4 },
     501                 :            :         .p2 = { .p2_slow = 1, .p2_fast = 14 },
     502                 :            : };
     503                 :            : 
     504                 :            : static const struct intel_limit intel_limits_bxt = {
     505                 :            :         /* FIXME: find real dot limits */
     506                 :            :         .dot = { .min = 0, .max = INT_MAX },
     507                 :            :         .vco = { .min = 4800000, .max = 6700000 },
     508                 :            :         .n = { .min = 1, .max = 1 },
     509                 :            :         .m1 = { .min = 2, .max = 2 },
     510                 :            :         /* FIXME: find real m2 limits */
     511                 :            :         .m2 = { .min = 2 << 22, .max = 255 << 22 },
     512                 :            :         .p1 = { .min = 2, .max = 4 },
     513                 :            :         .p2 = { .p2_slow = 1, .p2_fast = 20 },
     514                 :            : };
     515                 :            : 
     516                 :            : /* WA Display #0827: Gen9:all */
     517                 :            : static void
     518                 :          0 : skl_wa_827(struct drm_i915_private *dev_priv, enum pipe pipe, bool enable)
     519                 :            : {
     520         [ #  # ]:          0 :         if (enable)
     521                 :          0 :                 I915_WRITE(CLKGATE_DIS_PSL(pipe),
     522                 :            :                            I915_READ(CLKGATE_DIS_PSL(pipe)) |
     523                 :            :                            DUPS1_GATING_DIS | DUPS2_GATING_DIS);
     524                 :            :         else
     525                 :          0 :                 I915_WRITE(CLKGATE_DIS_PSL(pipe),
     526                 :            :                            I915_READ(CLKGATE_DIS_PSL(pipe)) &
     527                 :            :                            ~(DUPS1_GATING_DIS | DUPS2_GATING_DIS));
     528                 :          0 : }
     529                 :            : 
     530                 :            : /* Wa_2006604312:icl */
     531                 :            : static void
     532                 :          0 : icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
     533                 :            :                        bool enable)
     534                 :            : {
     535         [ #  # ]:          0 :         if (enable)
     536                 :          0 :                 I915_WRITE(CLKGATE_DIS_PSL(pipe),
     537                 :            :                            I915_READ(CLKGATE_DIS_PSL(pipe)) | DPFR_GATING_DIS);
     538                 :            :         else
     539                 :          0 :                 I915_WRITE(CLKGATE_DIS_PSL(pipe),
     540                 :            :                            I915_READ(CLKGATE_DIS_PSL(pipe)) & ~DPFR_GATING_DIS);
     541                 :          0 : }
     542                 :            : 
     543                 :            : static bool
     544                 :          0 : needs_modeset(const struct intel_crtc_state *state)
     545                 :            : {
     546   [ #  #  #  #  :          0 :         return drm_atomic_crtc_needs_modeset(&state->uapi);
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     547                 :            : }
     548                 :            : 
     549                 :            : bool
     550                 :          0 : is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
     551                 :            : {
     552         [ #  # ]:          0 :         return (crtc_state->master_transcoder != INVALID_TRANSCODER ||
     553   [ #  #  #  #  :          0 :                 crtc_state->sync_mode_slaves_mask);
                   #  # ]
     554                 :            : }
     555                 :            : 
     556                 :            : static bool
     557                 :          0 : is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
     558                 :            : {
     559                 :          0 :         return crtc_state->master_transcoder != INVALID_TRANSCODER;
     560                 :            : }
     561                 :            : 
     562                 :            : /*
     563                 :            :  * Platform specific helpers to calculate the port PLL loopback- (clock.m),
     564                 :            :  * and post-divider (clock.p) values, pre- (clock.vco) and post-divided fast
     565                 :            :  * (clock.dot) clock rates. This fast dot clock is fed to the port's IO logic.
     566                 :            :  * The helpers' return value is the rate of the clock that is fed to the
     567                 :            :  * display engine's pipe which can be the above fast dot clock rate or a
     568                 :            :  * divided-down version of it.
     569                 :            :  */
     570                 :            : /* m1 is reserved as 0 in Pineview, n is a ring counter */
     571                 :          0 : static int pnv_calc_dpll_params(int refclk, struct dpll *clock)
     572                 :            : {
     573                 :          0 :         clock->m = clock->m2 + 2;
     574                 :          0 :         clock->p = clock->p1 * clock->p2;
     575   [ #  #  #  #  :          0 :         if (WARN_ON(clock->n == 0 || clock->p == 0))
             #  #  #  # ]
     576                 :            :                 return 0;
     577         [ #  # ]:          0 :         clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n);
     578         [ #  # ]:          0 :         clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
     579                 :            : 
     580                 :          0 :         return clock->dot;
     581                 :            : }
     582                 :            : 
     583                 :          0 : static u32 i9xx_dpll_compute_m(struct dpll *dpll)
     584                 :            : {
     585                 :          0 :         return 5 * (dpll->m1 + 2) + (dpll->m2 + 2);
     586                 :            : }
     587                 :            : 
     588                 :          0 : static int i9xx_calc_dpll_params(int refclk, struct dpll *clock)
     589                 :            : {
     590                 :          0 :         clock->m = i9xx_dpll_compute_m(clock);
     591                 :          0 :         clock->p = clock->p1 * clock->p2;
     592   [ #  #  #  #  :          0 :         if (WARN_ON(clock->n + 2 == 0 || clock->p == 0))
             #  #  #  # ]
     593                 :            :                 return 0;
     594         [ #  # ]:          0 :         clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n + 2);
     595         [ #  # ]:          0 :         clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
     596                 :            : 
     597                 :          0 :         return clock->dot;
     598                 :            : }
     599                 :            : 
     600                 :          0 : static int vlv_calc_dpll_params(int refclk, struct dpll *clock)
     601                 :            : {
     602                 :          0 :         clock->m = clock->m1 * clock->m2;
     603                 :          0 :         clock->p = clock->p1 * clock->p2;
     604   [ #  #  #  #  :          0 :         if (WARN_ON(clock->n == 0 || clock->p == 0))
             #  #  #  # ]
     605                 :            :                 return 0;
     606         [ #  # ]:          0 :         clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n);
     607         [ #  # ]:          0 :         clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
     608                 :            : 
     609                 :          0 :         return clock->dot / 5;
     610                 :            : }
     611                 :            : 
     612                 :          0 : int chv_calc_dpll_params(int refclk, struct dpll *clock)
     613                 :            : {
     614                 :          0 :         clock->m = clock->m1 * clock->m2;
     615                 :          0 :         clock->p = clock->p1 * clock->p2;
     616   [ #  #  #  #  :          0 :         if (WARN_ON(clock->n == 0 || clock->p == 0))
             #  #  #  # ]
     617                 :            :                 return 0;
     618         [ #  # ]:          0 :         clock->vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, clock->m),
     619                 :            :                                            clock->n << 22);
     620         [ #  # ]:          0 :         clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
     621                 :            : 
     622                 :          0 :         return clock->dot / 5;
     623                 :            : }
     624                 :            : 
     625                 :            : #define INTELPllInvalid(s)   do { /* DRM_DEBUG(s); */ return false; } while (0)
     626                 :            : 
     627                 :            : /*
     628                 :            :  * Returns whether the given set of divisors are valid for a given refclk with
     629                 :            :  * the given connectors.
     630                 :            :  */
     631                 :          0 : static bool intel_PLL_is_valid(struct drm_i915_private *dev_priv,
     632                 :            :                                const struct intel_limit *limit,
     633                 :            :                                const struct dpll *clock)
     634                 :            : {
     635   [ #  #  #  # ]:          0 :         if (clock->n   < limit->n.min   || limit->n.max   < clock->n)
     636                 :          0 :                 INTELPllInvalid("n out of range\n");
     637   [ #  #  #  # ]:          0 :         if (clock->p1  < limit->p1.min  || limit->p1.max  < clock->p1)
     638                 :          0 :                 INTELPllInvalid("p1 out of range\n");
     639   [ #  #  #  # ]:          0 :         if (clock->m2  < limit->m2.min  || limit->m2.max  < clock->m2)
     640                 :          0 :                 INTELPllInvalid("m2 out of range\n");
     641   [ #  #  #  # ]:          0 :         if (clock->m1  < limit->m1.min  || limit->m1.max  < clock->m1)
     642                 :          0 :                 INTELPllInvalid("m1 out of range\n");
     643                 :            : 
     644   [ #  #  #  #  :          0 :         if (!IS_PINEVIEW(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
                   #  # ]
     645   [ #  #  #  # ]:          0 :             !IS_CHERRYVIEW(dev_priv) && !IS_GEN9_LP(dev_priv))
     646         [ #  # ]:          0 :                 if (clock->m1 <= clock->m2)
     647                 :          0 :                         INTELPllInvalid("m1 <= m2\n");
     648                 :            : 
     649   [ #  #  #  # ]:          0 :         if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
     650   [ #  #  #  # ]:          0 :             !IS_GEN9_LP(dev_priv)) {
     651   [ #  #  #  # ]:          0 :                 if (clock->p < limit->p.min || limit->p.max < clock->p)
     652                 :          0 :                         INTELPllInvalid("p out of range\n");
     653   [ #  #  #  # ]:          0 :                 if (clock->m < limit->m.min || limit->m.max < clock->m)
     654                 :          0 :                         INTELPllInvalid("m out of range\n");
     655                 :            :         }
     656                 :            : 
     657   [ #  #  #  # ]:          0 :         if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
     658                 :          0 :                 INTELPllInvalid("vco out of range\n");
     659                 :            :         /* XXX: We may need to be checking "Dot clock" depending on the multiplier,
     660                 :            :          * connector, etc., rather than just a single range.
     661                 :            :          */
     662   [ #  #  #  # ]:          0 :         if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
     663                 :          0 :                 INTELPllInvalid("dot out of range\n");
     664                 :            : 
     665                 :            :         return true;
     666                 :            : }
     667                 :            : 
     668                 :            : static int
     669                 :          0 : i9xx_select_p2_div(const struct intel_limit *limit,
     670                 :            :                    const struct intel_crtc_state *crtc_state,
     671                 :            :                    int target)
     672                 :            : {
     673         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
     674                 :            : 
     675         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
     676                 :            :                 /*
     677                 :            :                  * For LVDS just rely on its current settings for dual-channel.
     678                 :            :                  * We haven't figured out how to reliably set up different
     679                 :            :                  * single/dual channel state, if we even can.
     680                 :            :                  */
     681         [ #  # ]:          0 :                 if (intel_is_dual_link_lvds(dev_priv))
     682                 :          0 :                         return limit->p2.p2_fast;
     683                 :            :                 else
     684                 :          0 :                         return limit->p2.p2_slow;
     685                 :            :         } else {
     686         [ #  # ]:          0 :                 if (target < limit->p2.dot_limit)
     687                 :          0 :                         return limit->p2.p2_slow;
     688                 :            :                 else
     689                 :          0 :                         return limit->p2.p2_fast;
     690                 :            :         }
     691                 :            : }
     692                 :            : 
     693                 :            : /*
     694                 :            :  * Returns a set of divisors for the desired target clock with the given
     695                 :            :  * refclk, or FALSE.  The returned values represent the clock equation:
     696                 :            :  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
     697                 :            :  *
     698                 :            :  * Target and reference clocks are specified in kHz.
     699                 :            :  *
     700                 :            :  * If match_clock is provided, then best_clock P divider must match the P
     701                 :            :  * divider from @match_clock used for LVDS downclocking.
     702                 :            :  */
     703                 :            : static bool
     704                 :          0 : i9xx_find_best_dpll(const struct intel_limit *limit,
     705                 :            :                     struct intel_crtc_state *crtc_state,
     706                 :            :                     int target, int refclk, struct dpll *match_clock,
     707                 :            :                     struct dpll *best_clock)
     708                 :            : {
     709                 :          0 :         struct drm_device *dev = crtc_state->uapi.crtc->dev;
     710                 :          0 :         struct dpll clock;
     711                 :          0 :         int err = target;
     712                 :            : 
     713                 :          0 :         memset(best_clock, 0, sizeof(*best_clock));
     714                 :            : 
     715                 :          0 :         clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
     716                 :            : 
     717         [ #  # ]:          0 :         for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
     718                 :          0 :              clock.m1++) {
     719                 :          0 :                 for (clock.m2 = limit->m2.min;
     720         [ #  # ]:          0 :                      clock.m2 <= limit->m2.max; clock.m2++) {
     721         [ #  # ]:          0 :                         if (clock.m2 >= clock.m1)
     722                 :            :                                 break;
     723                 :          0 :                         for (clock.n = limit->n.min;
     724         [ #  # ]:          0 :                              clock.n <= limit->n.max; clock.n++) {
     725                 :          0 :                                 for (clock.p1 = limit->p1.min;
     726         [ #  # ]:          0 :                                         clock.p1 <= limit->p1.max; clock.p1++) {
     727                 :          0 :                                         int this_err;
     728                 :            : 
     729                 :          0 :                                         i9xx_calc_dpll_params(refclk, &clock);
     730         [ #  # ]:          0 :                                         if (!intel_PLL_is_valid(to_i915(dev),
     731                 :            :                                                                 limit,
     732                 :            :                                                                 &clock))
     733                 :          0 :                                                 continue;
     734         [ #  # ]:          0 :                                         if (match_clock &&
     735         [ #  # ]:          0 :                                             clock.p != match_clock->p)
     736                 :          0 :                                                 continue;
     737                 :            : 
     738                 :          0 :                                         this_err = abs(clock.dot - target);
     739         [ #  # ]:          0 :                                         if (this_err < err) {
     740                 :          0 :                                                 *best_clock = clock;
     741                 :          0 :                                                 err = this_err;
     742                 :            :                                         }
     743                 :            :                                 }
     744                 :            :                         }
     745                 :            :                 }
     746                 :            :         }
     747                 :            : 
     748                 :          0 :         return (err != target);
     749                 :            : }
     750                 :            : 
     751                 :            : /*
     752                 :            :  * Returns a set of divisors for the desired target clock with the given
     753                 :            :  * refclk, or FALSE.  The returned values represent the clock equation:
     754                 :            :  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
     755                 :            :  *
     756                 :            :  * Target and reference clocks are specified in kHz.
     757                 :            :  *
     758                 :            :  * If match_clock is provided, then best_clock P divider must match the P
     759                 :            :  * divider from @match_clock used for LVDS downclocking.
     760                 :            :  */
     761                 :            : static bool
     762                 :          0 : pnv_find_best_dpll(const struct intel_limit *limit,
     763                 :            :                    struct intel_crtc_state *crtc_state,
     764                 :            :                    int target, int refclk, struct dpll *match_clock,
     765                 :            :                    struct dpll *best_clock)
     766                 :            : {
     767                 :          0 :         struct drm_device *dev = crtc_state->uapi.crtc->dev;
     768                 :          0 :         struct dpll clock;
     769                 :          0 :         int err = target;
     770                 :            : 
     771                 :          0 :         memset(best_clock, 0, sizeof(*best_clock));
     772                 :            : 
     773                 :          0 :         clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
     774                 :            : 
     775         [ #  # ]:          0 :         for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
     776                 :          0 :              clock.m1++) {
     777                 :          0 :                 for (clock.m2 = limit->m2.min;
     778         [ #  # ]:          0 :                      clock.m2 <= limit->m2.max; clock.m2++) {
     779                 :          0 :                         for (clock.n = limit->n.min;
     780         [ #  # ]:          0 :                              clock.n <= limit->n.max; clock.n++) {
     781                 :          0 :                                 for (clock.p1 = limit->p1.min;
     782         [ #  # ]:          0 :                                         clock.p1 <= limit->p1.max; clock.p1++) {
     783                 :          0 :                                         int this_err;
     784                 :            : 
     785                 :          0 :                                         pnv_calc_dpll_params(refclk, &clock);
     786         [ #  # ]:          0 :                                         if (!intel_PLL_is_valid(to_i915(dev),
     787                 :            :                                                                 limit,
     788                 :            :                                                                 &clock))
     789                 :          0 :                                                 continue;
     790         [ #  # ]:          0 :                                         if (match_clock &&
     791         [ #  # ]:          0 :                                             clock.p != match_clock->p)
     792                 :          0 :                                                 continue;
     793                 :            : 
     794                 :          0 :                                         this_err = abs(clock.dot - target);
     795         [ #  # ]:          0 :                                         if (this_err < err) {
     796                 :          0 :                                                 *best_clock = clock;
     797                 :          0 :                                                 err = this_err;
     798                 :            :                                         }
     799                 :            :                                 }
     800                 :            :                         }
     801                 :            :                 }
     802                 :            :         }
     803                 :            : 
     804                 :          0 :         return (err != target);
     805                 :            : }
     806                 :            : 
     807                 :            : /*
     808                 :            :  * Returns a set of divisors for the desired target clock with the given
     809                 :            :  * refclk, or FALSE.  The returned values represent the clock equation:
     810                 :            :  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
     811                 :            :  *
     812                 :            :  * Target and reference clocks are specified in kHz.
     813                 :            :  *
     814                 :            :  * If match_clock is provided, then best_clock P divider must match the P
     815                 :            :  * divider from @match_clock used for LVDS downclocking.
     816                 :            :  */
     817                 :            : static bool
     818                 :            : g4x_find_best_dpll(const struct intel_limit *limit,
     819                 :            :                    struct intel_crtc_state *crtc_state,
     820                 :            :                    int target, int refclk, struct dpll *match_clock,
     821                 :            :                    struct dpll *best_clock)
     822                 :            : {
     823                 :            :         struct drm_device *dev = crtc_state->uapi.crtc->dev;
     824                 :            :         struct dpll clock;
     825                 :            :         int max_n;
     826                 :            :         bool found = false;
     827                 :            :         /* approximately equals target * 0.00585 */
     828                 :            :         int err_most = (target >> 8) + (target >> 9);
     829                 :            : 
     830                 :            :         memset(best_clock, 0, sizeof(*best_clock));
     831                 :            : 
     832                 :            :         clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
     833                 :            : 
     834                 :            :         max_n = limit->n.max;
     835                 :            :         /* based on hardware requirement, prefer smaller n to precision */
     836                 :            :         for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
     837                 :            :                 /* based on hardware requirement, prefere larger m1,m2 */
     838                 :            :                 for (clock.m1 = limit->m1.max;
     839                 :            :                      clock.m1 >= limit->m1.min; clock.m1--) {
     840                 :            :                         for (clock.m2 = limit->m2.max;
     841                 :            :                              clock.m2 >= limit->m2.min; clock.m2--) {
     842                 :            :                                 for (clock.p1 = limit->p1.max;
     843                 :            :                                      clock.p1 >= limit->p1.min; clock.p1--) {
     844                 :            :                                         int this_err;
     845                 :            : 
     846                 :            :                                         i9xx_calc_dpll_params(refclk, &clock);
     847                 :            :                                         if (!intel_PLL_is_valid(to_i915(dev),
     848                 :            :                                                                 limit,
     849                 :            :                                                                 &clock))
     850                 :            :                                                 continue;
     851                 :            : 
     852                 :            :                                         this_err = abs(clock.dot - target);
     853                 :            :                                         if (this_err < err_most) {
     854                 :            :                                                 *best_clock = clock;
     855                 :            :                                                 err_most = this_err;
     856                 :            :                                                 max_n = clock.n;
     857                 :            :                                                 found = true;
     858                 :            :                                         }
     859                 :            :                                 }
     860                 :            :                         }
     861                 :            :                 }
     862                 :            :         }
     863                 :            :         return found;
     864                 :            : }
     865                 :            : 
     866                 :            : /*
     867                 :            :  * Check if the calculated PLL configuration is more optimal compared to the
     868                 :            :  * best configuration and error found so far. Return the calculated error.
     869                 :            :  */
     870                 :            : static bool vlv_PLL_is_optimal(struct drm_device *dev, int target_freq,
     871                 :            :                                const struct dpll *calculated_clock,
     872                 :            :                                const struct dpll *best_clock,
     873                 :            :                                unsigned int best_error_ppm,
     874                 :            :                                unsigned int *error_ppm)
     875                 :            : {
     876                 :            :         /*
     877                 :            :          * For CHV ignore the error and consider only the P value.
     878                 :            :          * Prefer a bigger P value based on HW requirements.
     879                 :            :          */
     880                 :            :         if (IS_CHERRYVIEW(to_i915(dev))) {
     881                 :            :                 *error_ppm = 0;
     882                 :            : 
     883                 :            :                 return calculated_clock->p > best_clock->p;
     884                 :            :         }
     885                 :            : 
     886                 :            :         if (WARN_ON_ONCE(!target_freq))
     887                 :            :                 return false;
     888                 :            : 
     889                 :            :         *error_ppm = div_u64(1000000ULL *
     890                 :            :                                 abs(target_freq - calculated_clock->dot),
     891                 :            :                              target_freq);
     892                 :            :         /*
     893                 :            :          * Prefer a better P value over a better (smaller) error if the error
     894                 :            :          * is small. Ensure this preference for future configurations too by
     895                 :            :          * setting the error to 0.
     896                 :            :          */
     897                 :            :         if (*error_ppm < 100 && calculated_clock->p > best_clock->p) {
     898                 :            :                 *error_ppm = 0;
     899                 :            : 
     900                 :            :                 return true;
     901                 :            :         }
     902                 :            : 
     903                 :            :         return *error_ppm + 10 < best_error_ppm;
     904                 :            : }
     905                 :            : 
     906                 :            : /*
     907                 :            :  * Returns a set of divisors for the desired target clock with the given
     908                 :            :  * refclk, or FALSE.  The returned values represent the clock equation:
     909                 :            :  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
     910                 :            :  */
     911                 :            : static bool
     912                 :            : vlv_find_best_dpll(const struct intel_limit *limit,
     913                 :            :                    struct intel_crtc_state *crtc_state,
     914                 :            :                    int target, int refclk, struct dpll *match_clock,
     915                 :            :                    struct dpll *best_clock)
     916                 :            : {
     917                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
     918                 :            :         struct drm_device *dev = crtc->base.dev;
     919                 :            :         struct dpll clock;
     920                 :            :         unsigned int bestppm = 1000000;
     921                 :            :         /* min update 19.2 MHz */
     922                 :            :         int max_n = min(limit->n.max, refclk / 19200);
     923                 :            :         bool found = false;
     924                 :            : 
     925                 :            :         target *= 5; /* fast clock */
     926                 :            : 
     927                 :            :         memset(best_clock, 0, sizeof(*best_clock));
     928                 :            : 
     929                 :            :         /* based on hardware requirement, prefer smaller n to precision */
     930                 :            :         for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
     931                 :            :                 for (clock.p1 = limit->p1.max; clock.p1 >= limit->p1.min; clock.p1--) {
     932                 :            :                         for (clock.p2 = limit->p2.p2_fast; clock.p2 >= limit->p2.p2_slow;
     933                 :            :                              clock.p2 -= clock.p2 > 10 ? 2 : 1) {
     934                 :            :                                 clock.p = clock.p1 * clock.p2;
     935                 :            :                                 /* based on hardware requirement, prefer bigger m1,m2 values */
     936                 :            :                                 for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; clock.m1++) {
     937                 :            :                                         unsigned int ppm;
     938                 :            : 
     939                 :            :                                         clock.m2 = DIV_ROUND_CLOSEST(target * clock.p * clock.n,
     940                 :            :                                                                      refclk * clock.m1);
     941                 :            : 
     942                 :            :                                         vlv_calc_dpll_params(refclk, &clock);
     943                 :            : 
     944                 :            :                                         if (!intel_PLL_is_valid(to_i915(dev),
     945                 :            :                                                                 limit,
     946                 :            :                                                                 &clock))
     947                 :            :                                                 continue;
     948                 :            : 
     949                 :            :                                         if (!vlv_PLL_is_optimal(dev, target,
     950                 :            :                                                                 &clock,
     951                 :            :                                                                 best_clock,
     952                 :            :                                                                 bestppm, &ppm))
     953                 :            :                                                 continue;
     954                 :            : 
     955                 :            :                                         *best_clock = clock;
     956                 :            :                                         bestppm = ppm;
     957                 :            :                                         found = true;
     958                 :            :                                 }
     959                 :            :                         }
     960                 :            :                 }
     961                 :            :         }
     962                 :            : 
     963                 :            :         return found;
     964                 :            : }
     965                 :            : 
     966                 :            : /*
     967                 :            :  * Returns a set of divisors for the desired target clock with the given
     968                 :            :  * refclk, or FALSE.  The returned values represent the clock equation:
     969                 :            :  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
     970                 :            :  */
     971                 :            : static bool
     972                 :            : chv_find_best_dpll(const struct intel_limit *limit,
     973                 :            :                    struct intel_crtc_state *crtc_state,
     974                 :            :                    int target, int refclk, struct dpll *match_clock,
     975                 :            :                    struct dpll *best_clock)
     976                 :            : {
     977                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
     978                 :            :         struct drm_device *dev = crtc->base.dev;
     979                 :            :         unsigned int best_error_ppm;
     980                 :            :         struct dpll clock;
     981                 :            :         u64 m2;
     982                 :            :         int found = false;
     983                 :            : 
     984                 :            :         memset(best_clock, 0, sizeof(*best_clock));
     985                 :            :         best_error_ppm = 1000000;
     986                 :            : 
     987                 :            :         /*
     988                 :            :          * Based on hardware doc, the n always set to 1, and m1 always
     989                 :            :          * set to 2.  If requires to support 200Mhz refclk, we need to
     990                 :            :          * revisit this because n may not 1 anymore.
     991                 :            :          */
     992                 :            :         clock.n = 1, clock.m1 = 2;
     993                 :            :         target *= 5;    /* fast clock */
     994                 :            : 
     995                 :            :         for (clock.p1 = limit->p1.max; clock.p1 >= limit->p1.min; clock.p1--) {
     996                 :            :                 for (clock.p2 = limit->p2.p2_fast;
     997                 :            :                                 clock.p2 >= limit->p2.p2_slow;
     998                 :            :                                 clock.p2 -= clock.p2 > 10 ? 2 : 1) {
     999                 :            :                         unsigned int error_ppm;
    1000                 :            : 
    1001                 :            :                         clock.p = clock.p1 * clock.p2;
    1002                 :            : 
    1003                 :            :                         m2 = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(target, clock.p * clock.n) << 22,
    1004                 :            :                                                    refclk * clock.m1);
    1005                 :            : 
    1006                 :            :                         if (m2 > INT_MAX/clock.m1)
    1007                 :            :                                 continue;
    1008                 :            : 
    1009                 :            :                         clock.m2 = m2;
    1010                 :            : 
    1011                 :            :                         chv_calc_dpll_params(refclk, &clock);
    1012                 :            : 
    1013                 :            :                         if (!intel_PLL_is_valid(to_i915(dev), limit, &clock))
    1014                 :            :                                 continue;
    1015                 :            : 
    1016                 :            :                         if (!vlv_PLL_is_optimal(dev, target, &clock, best_clock,
    1017                 :            :                                                 best_error_ppm, &error_ppm))
    1018                 :            :                                 continue;
    1019                 :            : 
    1020                 :            :                         *best_clock = clock;
    1021                 :            :                         best_error_ppm = error_ppm;
    1022                 :            :                         found = true;
    1023                 :            :                 }
    1024                 :            :         }
    1025                 :            : 
    1026                 :            :         return found;
    1027                 :            : }
    1028                 :            : 
    1029                 :          0 : bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state,
    1030                 :            :                         struct dpll *best_clock)
    1031                 :            : {
    1032                 :          0 :         int refclk = 100000;
    1033                 :          0 :         const struct intel_limit *limit = &intel_limits_bxt;
    1034                 :            : 
    1035                 :          0 :         return chv_find_best_dpll(limit, crtc_state,
    1036                 :            :                                   crtc_state->port_clock, refclk,
    1037                 :            :                                   NULL, best_clock);
    1038                 :            : }
    1039                 :            : 
    1040                 :          0 : static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
    1041                 :            :                                     enum pipe pipe)
    1042                 :            : {
    1043                 :          0 :         i915_reg_t reg = PIPEDSL(pipe);
    1044                 :          0 :         u32 line1, line2;
    1045                 :          0 :         u32 line_mask;
    1046                 :            : 
    1047         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 2))
    1048                 :            :                 line_mask = DSL_LINEMASK_GEN2;
    1049                 :            :         else
    1050                 :          0 :                 line_mask = DSL_LINEMASK_GEN3;
    1051                 :            : 
    1052                 :          0 :         line1 = I915_READ(reg) & line_mask;
    1053                 :          0 :         msleep(5);
    1054                 :          0 :         line2 = I915_READ(reg) & line_mask;
    1055                 :            : 
    1056                 :          0 :         return line1 != line2;
    1057                 :            : }
    1058                 :            : 
    1059                 :          0 : static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
    1060                 :            : {
    1061                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1062                 :          0 :         enum pipe pipe = crtc->pipe;
    1063                 :            : 
    1064                 :            :         /* Wait for the display line to settle/start moving */
    1065   [ #  #  #  #  :          0 :         if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
             #  #  #  # ]
    1066         [ #  # ]:          0 :                 DRM_ERROR("pipe %c scanline %s wait timed out\n",
    1067                 :            :                           pipe_name(pipe), onoff(state));
    1068                 :          0 : }
    1069                 :            : 
    1070                 :          0 : static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc)
    1071                 :            : {
    1072                 :          0 :         wait_for_pipe_scanline_moving(crtc, false);
    1073                 :            : }
    1074                 :            : 
    1075                 :          0 : static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
    1076                 :            : {
    1077                 :          0 :         wait_for_pipe_scanline_moving(crtc, true);
    1078                 :          0 : }
    1079                 :            : 
    1080                 :            : static void
    1081                 :            : intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state)
    1082                 :            : {
    1083                 :            :         struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
    1084                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1085                 :            : 
    1086                 :            :         if (INTEL_GEN(dev_priv) >= 4) {
    1087                 :            :                 enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
    1088                 :            :                 i915_reg_t reg = PIPECONF(cpu_transcoder);
    1089                 :            : 
    1090                 :            :                 /* Wait for the Pipe State to go off */
    1091                 :            :                 if (intel_de_wait_for_clear(dev_priv, reg,
    1092                 :            :                                             I965_PIPECONF_ACTIVE, 100))
    1093                 :            :                         WARN(1, "pipe_off wait timed out\n");
    1094                 :            :         } else {
    1095                 :            :                 intel_wait_for_pipe_scanline_stopped(crtc);
    1096                 :            :         }
    1097                 :            : }
    1098                 :            : 
    1099                 :            : /* Only for pre-ILK configs */
    1100                 :          0 : void assert_pll(struct drm_i915_private *dev_priv,
    1101                 :            :                 enum pipe pipe, bool state)
    1102                 :            : {
    1103                 :          0 :         u32 val;
    1104                 :          0 :         bool cur_state;
    1105                 :            : 
    1106                 :          0 :         val = I915_READ(DPLL(pipe));
    1107                 :          0 :         cur_state = !!(val & DPLL_VCO_ENABLE);
    1108   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1109                 :            :              "PLL state assertion failure (expected %s, current %s)\n",
    1110                 :            :                         onoff(state), onoff(cur_state));
    1111                 :          0 : }
    1112                 :            : 
    1113                 :            : /* XXX: the dsi pll is shared between MIPI DSI ports */
    1114                 :          0 : void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
    1115                 :            : {
    1116                 :          0 :         u32 val;
    1117                 :          0 :         bool cur_state;
    1118                 :            : 
    1119                 :          0 :         vlv_cck_get(dev_priv);
    1120                 :          0 :         val = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL);
    1121                 :          0 :         vlv_cck_put(dev_priv);
    1122                 :            : 
    1123                 :          0 :         cur_state = val & DSI_PLL_VCO_EN;
    1124   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1125                 :            :              "DSI PLL state assertion failure (expected %s, current %s)\n",
    1126                 :            :                         onoff(state), onoff(cur_state));
    1127                 :          0 : }
    1128                 :            : 
    1129                 :          0 : static void assert_fdi_tx(struct drm_i915_private *dev_priv,
    1130                 :            :                           enum pipe pipe, bool state)
    1131                 :            : {
    1132                 :          0 :         bool cur_state;
    1133                 :            : 
    1134         [ #  # ]:          0 :         if (HAS_DDI(dev_priv)) {
    1135                 :            :                 /*
    1136                 :            :                  * DDI does not have a specific FDI_TX register.
    1137                 :            :                  *
    1138                 :            :                  * FDI is never fed from EDP transcoder
    1139                 :            :                  * so pipe->transcoder cast is fine here.
    1140                 :            :                  */
    1141                 :          0 :                 enum transcoder cpu_transcoder = (enum transcoder)pipe;
    1142                 :          0 :                 u32 val = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
    1143                 :          0 :                 cur_state = !!(val & TRANS_DDI_FUNC_ENABLE);
    1144                 :            :         } else {
    1145                 :          0 :                 u32 val = I915_READ(FDI_TX_CTL(pipe));
    1146                 :          0 :                 cur_state = !!(val & FDI_TX_ENABLE);
    1147                 :            :         }
    1148   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1149                 :            :              "FDI TX state assertion failure (expected %s, current %s)\n",
    1150                 :            :                         onoff(state), onoff(cur_state));
    1151                 :          0 : }
    1152                 :            : #define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true)
    1153                 :            : #define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false)
    1154                 :            : 
    1155                 :          0 : static void assert_fdi_rx(struct drm_i915_private *dev_priv,
    1156                 :            :                           enum pipe pipe, bool state)
    1157                 :            : {
    1158                 :          0 :         u32 val;
    1159                 :          0 :         bool cur_state;
    1160                 :            : 
    1161                 :          0 :         val = I915_READ(FDI_RX_CTL(pipe));
    1162                 :          0 :         cur_state = !!(val & FDI_RX_ENABLE);
    1163   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1164                 :            :              "FDI RX state assertion failure (expected %s, current %s)\n",
    1165                 :            :                         onoff(state), onoff(cur_state));
    1166                 :          0 : }
    1167                 :            : #define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true)
    1168                 :            : #define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false)
    1169                 :            : 
    1170                 :          0 : static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
    1171                 :            :                                       enum pipe pipe)
    1172                 :            : {
    1173                 :          0 :         u32 val;
    1174                 :            : 
    1175                 :            :         /* ILK FDI PLL is always enabled */
    1176         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 5))
    1177                 :            :                 return;
    1178                 :            : 
    1179                 :            :         /* On Haswell, DDI ports are responsible for the FDI PLL setup */
    1180         [ #  # ]:          0 :         if (HAS_DDI(dev_priv))
    1181                 :            :                 return;
    1182                 :            : 
    1183                 :          0 :         val = I915_READ(FDI_TX_CTL(pipe));
    1184   [ #  #  #  #  :          0 :         I915_STATE_WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n");
                   #  # ]
    1185                 :            : }
    1186                 :            : 
    1187                 :          0 : void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
    1188                 :            :                        enum pipe pipe, bool state)
    1189                 :            : {
    1190                 :          0 :         u32 val;
    1191                 :          0 :         bool cur_state;
    1192                 :            : 
    1193                 :          0 :         val = I915_READ(FDI_RX_CTL(pipe));
    1194                 :          0 :         cur_state = !!(val & FDI_RX_PLL_ENABLE);
    1195   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1196                 :            :              "FDI RX PLL assertion failure (expected %s, current %s)\n",
    1197                 :            :                         onoff(state), onoff(cur_state));
    1198                 :          0 : }
    1199                 :            : 
    1200                 :          0 : void assert_panel_unlocked(struct drm_i915_private *dev_priv, enum pipe pipe)
    1201                 :            : {
    1202                 :          0 :         i915_reg_t pp_reg;
    1203                 :          0 :         u32 val;
    1204                 :          0 :         enum pipe panel_pipe = INVALID_PIPE;
    1205                 :          0 :         bool locked = true;
    1206                 :            : 
    1207   [ #  #  #  # ]:          0 :         if (WARN_ON(HAS_DDI(dev_priv)))
    1208                 :          0 :                 return;
    1209                 :            : 
    1210         [ #  # ]:          0 :         if (HAS_PCH_SPLIT(dev_priv)) {
    1211                 :          0 :                 u32 port_sel;
    1212                 :            : 
    1213                 :          0 :                 pp_reg = PP_CONTROL(0);
    1214                 :          0 :                 port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
    1215                 :            : 
    1216   [ #  #  #  #  :          0 :                 switch (port_sel) {
                      # ]
    1217                 :          0 :                 case PANEL_PORT_SELECT_LVDS:
    1218                 :          0 :                         intel_lvds_port_enabled(dev_priv, PCH_LVDS, &panel_pipe);
    1219                 :          0 :                         break;
    1220                 :          0 :                 case PANEL_PORT_SELECT_DPA:
    1221                 :          0 :                         intel_dp_port_enabled(dev_priv, DP_A, PORT_A, &panel_pipe);
    1222                 :          0 :                         break;
    1223                 :          0 :                 case PANEL_PORT_SELECT_DPC:
    1224                 :          0 :                         intel_dp_port_enabled(dev_priv, PCH_DP_C, PORT_C, &panel_pipe);
    1225                 :          0 :                         break;
    1226                 :          0 :                 case PANEL_PORT_SELECT_DPD:
    1227                 :          0 :                         intel_dp_port_enabled(dev_priv, PCH_DP_D, PORT_D, &panel_pipe);
    1228                 :          0 :                         break;
    1229                 :            :                 default:
    1230                 :          0 :                         MISSING_CASE(port_sel);
    1231                 :          0 :                         break;
    1232                 :            :                 }
    1233   [ #  #  #  # ]:          0 :         } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
    1234                 :            :                 /* presumably write lock depends on pipe, not port select */
    1235                 :          0 :                 pp_reg = PP_CONTROL(pipe);
    1236                 :          0 :                 panel_pipe = pipe;
    1237                 :            :         } else {
    1238                 :          0 :                 u32 port_sel;
    1239                 :            : 
    1240                 :          0 :                 pp_reg = PP_CONTROL(0);
    1241                 :          0 :                 port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
    1242                 :            : 
    1243         [ #  # ]:          0 :                 WARN_ON(port_sel != PANEL_PORT_SELECT_LVDS);
    1244                 :          0 :                 intel_lvds_port_enabled(dev_priv, LVDS, &panel_pipe);
    1245                 :            :         }
    1246                 :            : 
    1247                 :          0 :         val = I915_READ(pp_reg);
    1248         [ #  # ]:          0 :         if (!(val & PANEL_POWER_ON) ||
    1249         [ #  # ]:          0 :             ((val & PANEL_UNLOCK_MASK) == PANEL_UNLOCK_REGS))
    1250                 :          0 :                 locked = false;
    1251                 :            : 
    1252   [ #  #  #  #  :          0 :         I915_STATE_WARN(panel_pipe == pipe && locked,
          #  #  #  #  #  
                      # ]
    1253                 :            :              "panel assertion failure, pipe %c regs locked\n",
    1254                 :            :              pipe_name(pipe));
    1255                 :            : }
    1256                 :            : 
    1257                 :          0 : void assert_pipe(struct drm_i915_private *dev_priv,
    1258                 :            :                  enum transcoder cpu_transcoder, bool state)
    1259                 :            : {
    1260                 :          0 :         bool cur_state;
    1261                 :          0 :         enum intel_display_power_domain power_domain;
    1262                 :          0 :         intel_wakeref_t wakeref;
    1263                 :            : 
    1264                 :            :         /* we keep both pipes enabled on 830 */
    1265         [ #  # ]:          0 :         if (IS_I830(dev_priv))
    1266                 :          0 :                 state = true;
    1267                 :            : 
    1268         [ #  # ]:          0 :         power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
    1269                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
    1270         [ #  # ]:          0 :         if (wakeref) {
    1271                 :          0 :                 u32 val = I915_READ(PIPECONF(cpu_transcoder));
    1272                 :          0 :                 cur_state = !!(val & PIPECONF_ENABLE);
    1273                 :            : 
    1274                 :          0 :                 intel_display_power_put(dev_priv, power_domain, wakeref);
    1275                 :            :         } else {
    1276                 :            :                 cur_state = false;
    1277                 :            :         }
    1278                 :            : 
    1279   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1280                 :            :                         "transcoder %s assertion failure (expected %s, current %s)\n",
    1281                 :            :                         transcoder_name(cpu_transcoder),
    1282                 :            :                         onoff(state), onoff(cur_state));
    1283                 :          0 : }
    1284                 :            : 
    1285                 :          0 : static void assert_plane(struct intel_plane *plane, bool state)
    1286                 :            : {
    1287                 :          0 :         enum pipe pipe;
    1288                 :          0 :         bool cur_state;
    1289                 :            : 
    1290                 :          0 :         cur_state = plane->get_hw_state(plane, &pipe);
    1291                 :            : 
    1292   [ #  #  #  #  :          0 :         I915_STATE_WARN(cur_state != state,
          #  #  #  #  #  
                      # ]
    1293                 :            :                         "%s assertion failure (expected %s, current %s)\n",
    1294                 :            :                         plane->base.name, onoff(state), onoff(cur_state));
    1295                 :          0 : }
    1296                 :            : 
    1297                 :            : #define assert_plane_enabled(p) assert_plane(p, true)
    1298                 :            : #define assert_plane_disabled(p) assert_plane(p, false)
    1299                 :            : 
    1300                 :            : static void assert_planes_disabled(struct intel_crtc *crtc)
    1301                 :            : {
    1302                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1303                 :            :         struct intel_plane *plane;
    1304                 :            : 
    1305                 :            :         for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane)
    1306                 :            :                 assert_plane_disabled(plane);
    1307                 :            : }
    1308                 :            : 
    1309                 :          0 : static void assert_vblank_disabled(struct drm_crtc *crtc)
    1310                 :            : {
    1311   [ #  #  #  #  :          0 :         if (I915_STATE_WARN_ON(drm_crtc_vblank_get(crtc) == 0))
             #  #  #  # ]
    1312                 :          0 :                 drm_crtc_vblank_put(crtc);
    1313                 :          0 : }
    1314                 :            : 
    1315                 :          0 : void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
    1316                 :            :                                     enum pipe pipe)
    1317                 :            : {
    1318                 :          0 :         u32 val;
    1319                 :          0 :         bool enabled;
    1320                 :            : 
    1321                 :          0 :         val = I915_READ(PCH_TRANSCONF(pipe));
    1322                 :          0 :         enabled = !!(val & TRANS_ENABLE);
    1323   [ #  #  #  #  :          0 :         I915_STATE_WARN(enabled,
                   #  # ]
    1324                 :            :              "transcoder assertion failed, should be off on pipe %c but is still active\n",
    1325                 :            :              pipe_name(pipe));
    1326                 :          0 : }
    1327                 :            : 
    1328                 :          0 : static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
    1329                 :            :                                    enum pipe pipe, enum port port,
    1330                 :            :                                    i915_reg_t dp_reg)
    1331                 :            : {
    1332                 :          0 :         enum pipe port_pipe;
    1333                 :          0 :         bool state;
    1334                 :            : 
    1335                 :          0 :         state = intel_dp_port_enabled(dev_priv, dp_reg, port, &port_pipe);
    1336                 :            : 
    1337   [ #  #  #  #  :          0 :         I915_STATE_WARN(state && port_pipe == pipe,
          #  #  #  #  #  
                      # ]
    1338                 :            :                         "PCH DP %c enabled on transcoder %c, should be disabled\n",
    1339                 :            :                         port_name(port), pipe_name(pipe));
    1340                 :            : 
    1341   [ #  #  #  #  :          0 :         I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
          #  #  #  #  #  
                #  #  # ]
    1342                 :            :                         "IBX PCH DP %c still using transcoder B\n",
    1343                 :            :                         port_name(port));
    1344                 :          0 : }
    1345                 :            : 
    1346                 :          0 : static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
    1347                 :            :                                      enum pipe pipe, enum port port,
    1348                 :            :                                      i915_reg_t hdmi_reg)
    1349                 :            : {
    1350                 :          0 :         enum pipe port_pipe;
    1351                 :          0 :         bool state;
    1352                 :            : 
    1353                 :          0 :         state = intel_sdvo_port_enabled(dev_priv, hdmi_reg, &port_pipe);
    1354                 :            : 
    1355   [ #  #  #  #  :          0 :         I915_STATE_WARN(state && port_pipe == pipe,
          #  #  #  #  #  
                      # ]
    1356                 :            :                         "PCH HDMI %c enabled on transcoder %c, should be disabled\n",
    1357                 :            :                         port_name(port), pipe_name(pipe));
    1358                 :            : 
    1359   [ #  #  #  #  :          0 :         I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
          #  #  #  #  #  
                #  #  # ]
    1360                 :            :                         "IBX PCH HDMI %c still using transcoder B\n",
    1361                 :            :                         port_name(port));
    1362                 :          0 : }
    1363                 :            : 
    1364                 :          0 : static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
    1365                 :            :                                       enum pipe pipe)
    1366                 :            : {
    1367                 :          0 :         enum pipe port_pipe;
    1368                 :            : 
    1369                 :          0 :         assert_pch_dp_disabled(dev_priv, pipe, PORT_B, PCH_DP_B);
    1370                 :          0 :         assert_pch_dp_disabled(dev_priv, pipe, PORT_C, PCH_DP_C);
    1371                 :          0 :         assert_pch_dp_disabled(dev_priv, pipe, PORT_D, PCH_DP_D);
    1372                 :            : 
    1373   [ #  #  #  #  :          0 :         I915_STATE_WARN(intel_crt_port_enabled(dev_priv, PCH_ADPA, &port_pipe) &&
          #  #  #  #  #  
                      # ]
    1374                 :            :                         port_pipe == pipe,
    1375                 :            :                         "PCH VGA enabled on transcoder %c, should be disabled\n",
    1376                 :            :                         pipe_name(pipe));
    1377                 :            : 
    1378   [ #  #  #  #  :          0 :         I915_STATE_WARN(intel_lvds_port_enabled(dev_priv, PCH_LVDS, &port_pipe) &&
          #  #  #  #  #  
                      # ]
    1379                 :            :                         port_pipe == pipe,
    1380                 :            :                         "PCH LVDS enabled on transcoder %c, should be disabled\n",
    1381                 :            :                         pipe_name(pipe));
    1382                 :            : 
    1383                 :            :         /* PCH SDVOB multiplex with HDMIB */
    1384                 :          0 :         assert_pch_hdmi_disabled(dev_priv, pipe, PORT_B, PCH_HDMIB);
    1385                 :          0 :         assert_pch_hdmi_disabled(dev_priv, pipe, PORT_C, PCH_HDMIC);
    1386                 :          0 :         assert_pch_hdmi_disabled(dev_priv, pipe, PORT_D, PCH_HDMID);
    1387                 :          0 : }
    1388                 :            : 
    1389                 :            : static void _vlv_enable_pll(struct intel_crtc *crtc,
    1390                 :            :                             const struct intel_crtc_state *pipe_config)
    1391                 :            : {
    1392                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1393                 :            :         enum pipe pipe = crtc->pipe;
    1394                 :            : 
    1395                 :            :         I915_WRITE(DPLL(pipe), pipe_config->dpll_hw_state.dpll);
    1396                 :            :         POSTING_READ(DPLL(pipe));
    1397                 :            :         udelay(150);
    1398                 :            : 
    1399                 :            :         if (intel_de_wait_for_set(dev_priv, DPLL(pipe), DPLL_LOCK_VLV, 1))
    1400                 :            :                 DRM_ERROR("DPLL %d failed to lock\n", pipe);
    1401                 :            : }
    1402                 :            : 
    1403                 :          0 : static void vlv_enable_pll(struct intel_crtc *crtc,
    1404                 :            :                            const struct intel_crtc_state *pipe_config)
    1405                 :            : {
    1406                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1407                 :          0 :         enum pipe pipe = crtc->pipe;
    1408                 :            : 
    1409                 :          0 :         assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
    1410                 :            : 
    1411                 :            :         /* PLL is protected by panel, make sure we can write it */
    1412                 :          0 :         assert_panel_unlocked(dev_priv, pipe);
    1413                 :            : 
    1414         [ #  # ]:          0 :         if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
    1415                 :          0 :                 _vlv_enable_pll(crtc, pipe_config);
    1416                 :            : 
    1417                 :          0 :         I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
    1418                 :          0 :         POSTING_READ(DPLL_MD(pipe));
    1419                 :          0 : }
    1420                 :            : 
    1421                 :            : 
    1422                 :            : static void _chv_enable_pll(struct intel_crtc *crtc,
    1423                 :            :                             const struct intel_crtc_state *pipe_config)
    1424                 :            : {
    1425                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1426                 :            :         enum pipe pipe = crtc->pipe;
    1427                 :            :         enum dpio_channel port = vlv_pipe_to_channel(pipe);
    1428                 :            :         u32 tmp;
    1429                 :            : 
    1430                 :            :         vlv_dpio_get(dev_priv);
    1431                 :            : 
    1432                 :            :         /* Enable back the 10bit clock to display controller */
    1433                 :            :         tmp = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port));
    1434                 :            :         tmp |= DPIO_DCLKP_EN;
    1435                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), tmp);
    1436                 :            : 
    1437                 :            :         vlv_dpio_put(dev_priv);
    1438                 :            : 
    1439                 :            :         /*
    1440                 :            :          * Need to wait > 100ns between dclkp clock enable bit and PLL enable.
    1441                 :            :          */
    1442                 :            :         udelay(1);
    1443                 :            : 
    1444                 :            :         /* Enable PLL */
    1445                 :            :         I915_WRITE(DPLL(pipe), pipe_config->dpll_hw_state.dpll);
    1446                 :            : 
    1447                 :            :         /* Check PLL is locked */
    1448                 :            :         if (intel_de_wait_for_set(dev_priv, DPLL(pipe), DPLL_LOCK_VLV, 1))
    1449                 :            :                 DRM_ERROR("PLL %d failed to lock\n", pipe);
    1450                 :            : }
    1451                 :            : 
    1452                 :          0 : static void chv_enable_pll(struct intel_crtc *crtc,
    1453                 :            :                            const struct intel_crtc_state *pipe_config)
    1454                 :            : {
    1455                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1456                 :          0 :         enum pipe pipe = crtc->pipe;
    1457                 :            : 
    1458                 :          0 :         assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
    1459                 :            : 
    1460                 :            :         /* PLL is protected by panel, make sure we can write it */
    1461                 :          0 :         assert_panel_unlocked(dev_priv, pipe);
    1462                 :            : 
    1463         [ #  # ]:          0 :         if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
    1464                 :          0 :                 _chv_enable_pll(crtc, pipe_config);
    1465                 :            : 
    1466         [ #  # ]:          0 :         if (pipe != PIPE_A) {
    1467                 :            :                 /*
    1468                 :            :                  * WaPixelRepeatModeFixForC0:chv
    1469                 :            :                  *
    1470                 :            :                  * DPLLCMD is AWOL. Use chicken bits to propagate
    1471                 :            :                  * the value from DPLLBMD to either pipe B or C.
    1472                 :            :                  */
    1473                 :          0 :                 I915_WRITE(CBR4_VLV, CBR_DPLLBMD_PIPE(pipe));
    1474                 :          0 :                 I915_WRITE(DPLL_MD(PIPE_B), pipe_config->dpll_hw_state.dpll_md);
    1475                 :          0 :                 I915_WRITE(CBR4_VLV, 0);
    1476                 :          0 :                 dev_priv->chv_dpll_md[pipe] = pipe_config->dpll_hw_state.dpll_md;
    1477                 :            : 
    1478                 :            :                 /*
    1479                 :            :                  * DPLLB VGA mode also seems to cause problems.
    1480                 :            :                  * We should always have it disabled.
    1481                 :            :                  */
    1482         [ #  # ]:          0 :                 WARN_ON((I915_READ(DPLL(PIPE_B)) & DPLL_VGA_MODE_DIS) == 0);
    1483                 :            :         } else {
    1484                 :          0 :                 I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
    1485                 :          0 :                 POSTING_READ(DPLL_MD(pipe));
    1486                 :            :         }
    1487                 :          0 : }
    1488                 :            : 
    1489                 :            : static bool i9xx_has_pps(struct drm_i915_private *dev_priv)
    1490                 :            : {
    1491                 :            :         if (IS_I830(dev_priv))
    1492                 :            :                 return false;
    1493                 :            : 
    1494                 :            :         return IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
    1495                 :            : }
    1496                 :            : 
    1497                 :            : static void i9xx_enable_pll(struct intel_crtc *crtc,
    1498                 :            :                             const struct intel_crtc_state *crtc_state)
    1499                 :            : {
    1500                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1501                 :            :         i915_reg_t reg = DPLL(crtc->pipe);
    1502                 :            :         u32 dpll = crtc_state->dpll_hw_state.dpll;
    1503                 :            :         int i;
    1504                 :            : 
    1505                 :            :         assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
    1506                 :            : 
    1507                 :            :         /* PLL is protected by panel, make sure we can write it */
    1508                 :            :         if (i9xx_has_pps(dev_priv))
    1509                 :            :                 assert_panel_unlocked(dev_priv, crtc->pipe);
    1510                 :            : 
    1511                 :            :         /*
    1512                 :            :          * Apparently we need to have VGA mode enabled prior to changing
    1513                 :            :          * the P1/P2 dividers. Otherwise the DPLL will keep using the old
    1514                 :            :          * dividers, even though the register value does change.
    1515                 :            :          */
    1516                 :            :         I915_WRITE(reg, dpll & ~DPLL_VGA_MODE_DIS);
    1517                 :            :         I915_WRITE(reg, dpll);
    1518                 :            : 
    1519                 :            :         /* Wait for the clocks to stabilize. */
    1520                 :            :         POSTING_READ(reg);
    1521                 :            :         udelay(150);
    1522                 :            : 
    1523                 :            :         if (INTEL_GEN(dev_priv) >= 4) {
    1524                 :            :                 I915_WRITE(DPLL_MD(crtc->pipe),
    1525                 :            :                            crtc_state->dpll_hw_state.dpll_md);
    1526                 :            :         } else {
    1527                 :            :                 /* The pixel multiplier can only be updated once the
    1528                 :            :                  * DPLL is enabled and the clocks are stable.
    1529                 :            :                  *
    1530                 :            :                  * So write it again.
    1531                 :            :                  */
    1532                 :            :                 I915_WRITE(reg, dpll);
    1533                 :            :         }
    1534                 :            : 
    1535                 :            :         /* We do this three times for luck */
    1536                 :            :         for (i = 0; i < 3; i++) {
    1537                 :            :                 I915_WRITE(reg, dpll);
    1538                 :            :                 POSTING_READ(reg);
    1539                 :            :                 udelay(150); /* wait for warmup */
    1540                 :            :         }
    1541                 :            : }
    1542                 :            : 
    1543                 :            : static void i9xx_disable_pll(const struct intel_crtc_state *crtc_state)
    1544                 :            : {
    1545                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    1546                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1547                 :            :         enum pipe pipe = crtc->pipe;
    1548                 :            : 
    1549                 :            :         /* Don't disable pipe or pipe PLLs if needed */
    1550                 :            :         if (IS_I830(dev_priv))
    1551                 :            :                 return;
    1552                 :            : 
    1553                 :            :         /* Make sure the pipe isn't still relying on us */
    1554                 :            :         assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
    1555                 :            : 
    1556                 :            :         I915_WRITE(DPLL(pipe), DPLL_VGA_MODE_DIS);
    1557                 :            :         POSTING_READ(DPLL(pipe));
    1558                 :            : }
    1559                 :            : 
    1560                 :          0 : static void vlv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
    1561                 :            : {
    1562                 :          0 :         u32 val;
    1563                 :            : 
    1564                 :            :         /* Make sure the pipe isn't still relying on us */
    1565                 :          0 :         assert_pipe_disabled(dev_priv, (enum transcoder)pipe);
    1566                 :            : 
    1567                 :          0 :         val = DPLL_INTEGRATED_REF_CLK_VLV |
    1568                 :            :                 DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
    1569         [ #  # ]:          0 :         if (pipe != PIPE_A)
    1570                 :          0 :                 val |= DPLL_INTEGRATED_CRI_CLK_VLV;
    1571                 :            : 
    1572                 :          0 :         I915_WRITE(DPLL(pipe), val);
    1573                 :          0 :         POSTING_READ(DPLL(pipe));
    1574                 :          0 : }
    1575                 :            : 
    1576                 :          0 : static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
    1577                 :            : {
    1578      [ #  #  # ]:          0 :         enum dpio_channel port = vlv_pipe_to_channel(pipe);
    1579                 :          0 :         u32 val;
    1580                 :            : 
    1581                 :            :         /* Make sure the pipe isn't still relying on us */
    1582                 :          0 :         assert_pipe_disabled(dev_priv, (enum transcoder)pipe);
    1583                 :            : 
    1584                 :          0 :         val = DPLL_SSC_REF_CLK_CHV |
    1585                 :            :                 DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
    1586         [ #  # ]:          0 :         if (pipe != PIPE_A)
    1587                 :          0 :                 val |= DPLL_INTEGRATED_CRI_CLK_VLV;
    1588                 :            : 
    1589                 :          0 :         I915_WRITE(DPLL(pipe), val);
    1590                 :          0 :         POSTING_READ(DPLL(pipe));
    1591                 :            : 
    1592                 :          0 :         vlv_dpio_get(dev_priv);
    1593                 :            : 
    1594                 :            :         /* Disable 10bit clock to display controller */
    1595                 :          0 :         val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port));
    1596                 :          0 :         val &= ~DPIO_DCLKP_EN;
    1597                 :          0 :         vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), val);
    1598                 :            : 
    1599                 :          0 :         vlv_dpio_put(dev_priv);
    1600                 :          0 : }
    1601                 :            : 
    1602                 :          0 : void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
    1603                 :            :                          struct intel_digital_port *dport,
    1604                 :            :                          unsigned int expected_mask)
    1605                 :            : {
    1606                 :          0 :         u32 port_mask;
    1607                 :          0 :         i915_reg_t dpll_reg;
    1608                 :            : 
    1609   [ #  #  #  # ]:          0 :         switch (dport->base.port) {
    1610                 :          0 :         case PORT_B:
    1611                 :          0 :                 port_mask = DPLL_PORTB_READY_MASK;
    1612                 :          0 :                 dpll_reg = DPLL(0);
    1613                 :          0 :                 break;
    1614                 :          0 :         case PORT_C:
    1615                 :          0 :                 port_mask = DPLL_PORTC_READY_MASK;
    1616                 :          0 :                 dpll_reg = DPLL(0);
    1617                 :          0 :                 expected_mask <<= 4;
    1618                 :          0 :                 break;
    1619                 :            :         case PORT_D:
    1620                 :            :                 port_mask = DPLL_PORTD_READY_MASK;
    1621                 :            :                 dpll_reg = DPIO_PHY_STATUS;
    1622                 :            :                 break;
    1623                 :          0 :         default:
    1624                 :          0 :                 BUG();
    1625                 :            :         }
    1626                 :            : 
    1627         [ #  # ]:          0 :         if (intel_de_wait_for_register(dev_priv, dpll_reg,
    1628                 :            :                                        port_mask, expected_mask, 1000))
    1629                 :          0 :                 WARN(1, "timed out waiting for [ENCODER:%d:%s] port ready: got 0x%x, expected 0x%x\n",
    1630                 :            :                      dport->base.base.base.id, dport->base.base.name,
    1631                 :            :                      I915_READ(dpll_reg) & port_mask, expected_mask);
    1632                 :          0 : }
    1633                 :            : 
    1634                 :          0 : static void ilk_enable_pch_transcoder(const struct intel_crtc_state *crtc_state)
    1635                 :            : {
    1636                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    1637                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1638                 :          0 :         enum pipe pipe = crtc->pipe;
    1639                 :          0 :         i915_reg_t reg;
    1640                 :          0 :         u32 val, pipeconf_val;
    1641                 :            : 
    1642                 :            :         /* Make sure PCH DPLL is enabled */
    1643                 :          0 :         assert_shared_dpll_enabled(dev_priv, crtc_state->shared_dpll);
    1644                 :            : 
    1645                 :            :         /* FDI must be feeding us bits for PCH ports */
    1646                 :          0 :         assert_fdi_tx_enabled(dev_priv, pipe);
    1647                 :          0 :         assert_fdi_rx_enabled(dev_priv, pipe);
    1648                 :            : 
    1649         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv)) {
    1650                 :          0 :                 reg = TRANS_CHICKEN2(pipe);
    1651                 :          0 :                 val = I915_READ(reg);
    1652                 :            :                 /*
    1653                 :            :                  * Workaround: Set the timing override bit
    1654                 :            :                  * before enabling the pch transcoder.
    1655                 :            :                  */
    1656                 :          0 :                 val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
    1657                 :            :                 /* Configure frame start delay to match the CPU */
    1658                 :          0 :                 val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
    1659                 :          0 :                 val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
    1660                 :          0 :                 I915_WRITE(reg, val);
    1661                 :            :         }
    1662                 :            : 
    1663                 :          0 :         reg = PCH_TRANSCONF(pipe);
    1664                 :          0 :         val = I915_READ(reg);
    1665                 :          0 :         pipeconf_val = I915_READ(PIPECONF(pipe));
    1666                 :            : 
    1667         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv)) {
    1668                 :            :                 /* Configure frame start delay to match the CPU */
    1669                 :          0 :                 val &= ~TRANS_FRAME_START_DELAY_MASK;
    1670                 :          0 :                 val |= TRANS_FRAME_START_DELAY(0);
    1671                 :            : 
    1672                 :            :                 /*
    1673                 :            :                  * Make the BPC in transcoder be consistent with
    1674                 :            :                  * that in pipeconf reg. For HDMI we must use 8bpc
    1675                 :            :                  * here for both 8bpc and 12bpc.
    1676                 :            :                  */
    1677                 :          0 :                 val &= ~PIPECONF_BPC_MASK;
    1678         [ #  # ]:          0 :                 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
    1679                 :            :                         val |= PIPECONF_8BPC;
    1680                 :            :                 else
    1681                 :          0 :                         val |= pipeconf_val & PIPECONF_BPC_MASK;
    1682                 :            :         }
    1683                 :            : 
    1684                 :          0 :         val &= ~TRANS_INTERLACE_MASK;
    1685         [ #  # ]:          0 :         if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK) {
    1686   [ #  #  #  # ]:          0 :                 if (HAS_PCH_IBX(dev_priv) &&
    1687         [ #  # ]:          0 :                     intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
    1688                 :          0 :                         val |= TRANS_LEGACY_INTERLACED_ILK;
    1689                 :            :                 else
    1690                 :          0 :                         val |= TRANS_INTERLACED;
    1691                 :            :         } else {
    1692                 :            :                 val |= TRANS_PROGRESSIVE;
    1693                 :            :         }
    1694                 :            : 
    1695                 :          0 :         I915_WRITE(reg, val | TRANS_ENABLE);
    1696         [ #  # ]:          0 :         if (intel_de_wait_for_set(dev_priv, reg, TRANS_STATE_ENABLE, 100))
    1697                 :          0 :                 DRM_ERROR("failed to enable transcoder %c\n", pipe_name(pipe));
    1698                 :          0 : }
    1699                 :            : 
    1700                 :          0 : static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
    1701                 :            :                                       enum transcoder cpu_transcoder)
    1702                 :            : {
    1703                 :          0 :         u32 val, pipeconf_val;
    1704                 :            : 
    1705                 :            :         /* FDI must be feeding us bits for PCH ports */
    1706                 :          0 :         assert_fdi_tx_enabled(dev_priv, (enum pipe) cpu_transcoder);
    1707                 :          0 :         assert_fdi_rx_enabled(dev_priv, PIPE_A);
    1708                 :            : 
    1709                 :          0 :         val = I915_READ(TRANS_CHICKEN2(PIPE_A));
    1710                 :            :         /* Workaround: set timing override bit. */
    1711                 :          0 :         val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
    1712                 :            :         /* Configure frame start delay to match the CPU */
    1713                 :          0 :         val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
    1714                 :          0 :         val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
    1715                 :          0 :         I915_WRITE(TRANS_CHICKEN2(PIPE_A), val);
    1716                 :            : 
    1717                 :          0 :         val = TRANS_ENABLE;
    1718                 :          0 :         pipeconf_val = I915_READ(PIPECONF(cpu_transcoder));
    1719                 :            : 
    1720         [ #  # ]:          0 :         if ((pipeconf_val & PIPECONF_INTERLACE_MASK_HSW) ==
    1721                 :            :             PIPECONF_INTERLACED_ILK)
    1722                 :            :                 val |= TRANS_INTERLACED;
    1723                 :            :         else
    1724                 :          0 :                 val |= TRANS_PROGRESSIVE;
    1725                 :            : 
    1726                 :          0 :         I915_WRITE(LPT_TRANSCONF, val);
    1727         [ #  # ]:          0 :         if (intel_de_wait_for_set(dev_priv, LPT_TRANSCONF,
    1728                 :            :                                   TRANS_STATE_ENABLE, 100))
    1729                 :          0 :                 DRM_ERROR("Failed to enable PCH transcoder\n");
    1730                 :          0 : }
    1731                 :            : 
    1732                 :          0 : static void ilk_disable_pch_transcoder(struct drm_i915_private *dev_priv,
    1733                 :            :                                        enum pipe pipe)
    1734                 :            : {
    1735                 :          0 :         i915_reg_t reg;
    1736                 :          0 :         u32 val;
    1737                 :            : 
    1738                 :            :         /* FDI relies on the transcoder */
    1739                 :          0 :         assert_fdi_tx_disabled(dev_priv, pipe);
    1740                 :          0 :         assert_fdi_rx_disabled(dev_priv, pipe);
    1741                 :            : 
    1742                 :            :         /* Ports must be off as well */
    1743                 :          0 :         assert_pch_ports_disabled(dev_priv, pipe);
    1744                 :            : 
    1745                 :          0 :         reg = PCH_TRANSCONF(pipe);
    1746                 :          0 :         val = I915_READ(reg);
    1747                 :          0 :         val &= ~TRANS_ENABLE;
    1748                 :          0 :         I915_WRITE(reg, val);
    1749                 :            :         /* wait for PCH transcoder off, transcoder state */
    1750         [ #  # ]:          0 :         if (intel_de_wait_for_clear(dev_priv, reg, TRANS_STATE_ENABLE, 50))
    1751                 :          0 :                 DRM_ERROR("failed to disable transcoder %c\n", pipe_name(pipe));
    1752                 :            : 
    1753         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv)) {
    1754                 :            :                 /* Workaround: Clear the timing override chicken bit again. */
    1755                 :          0 :                 reg = TRANS_CHICKEN2(pipe);
    1756                 :          0 :                 val = I915_READ(reg);
    1757                 :          0 :                 val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
    1758                 :          0 :                 I915_WRITE(reg, val);
    1759                 :            :         }
    1760                 :          0 : }
    1761                 :            : 
    1762                 :          0 : void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv)
    1763                 :            : {
    1764                 :          0 :         u32 val;
    1765                 :            : 
    1766                 :          0 :         val = I915_READ(LPT_TRANSCONF);
    1767                 :          0 :         val &= ~TRANS_ENABLE;
    1768                 :          0 :         I915_WRITE(LPT_TRANSCONF, val);
    1769                 :            :         /* wait for PCH transcoder off, transcoder state */
    1770         [ #  # ]:          0 :         if (intel_de_wait_for_clear(dev_priv, LPT_TRANSCONF,
    1771                 :            :                                     TRANS_STATE_ENABLE, 50))
    1772                 :          0 :                 DRM_ERROR("Failed to disable PCH transcoder\n");
    1773                 :            : 
    1774                 :            :         /* Workaround: clear timing override bit. */
    1775                 :          0 :         val = I915_READ(TRANS_CHICKEN2(PIPE_A));
    1776                 :          0 :         val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
    1777                 :          0 :         I915_WRITE(TRANS_CHICKEN2(PIPE_A), val);
    1778                 :          0 : }
    1779                 :            : 
    1780                 :          0 : enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc)
    1781                 :            : {
    1782         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1783                 :            : 
    1784   [ #  #  #  #  :          0 :         if (HAS_PCH_LPT(dev_priv))
             #  #  #  # ]
    1785                 :            :                 return PIPE_A;
    1786                 :            :         else
    1787                 :          0 :                 return crtc->pipe;
    1788                 :            : }
    1789                 :            : 
    1790                 :            : static u32 intel_crtc_max_vblank_count(const struct intel_crtc_state *crtc_state)
    1791                 :            : {
    1792                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    1793                 :            : 
    1794                 :            :         /*
    1795                 :            :          * On i965gm the hardware frame counter reads
    1796                 :            :          * zero when the TV encoder is enabled :(
    1797                 :            :          */
    1798                 :            :         if (IS_I965GM(dev_priv) &&
    1799                 :            :             (crtc_state->output_types & BIT(INTEL_OUTPUT_TVOUT)))
    1800                 :            :                 return 0;
    1801                 :            : 
    1802                 :            :         if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
    1803                 :            :                 return 0xffffffff; /* full 32 bit counter */
    1804                 :            :         else if (INTEL_GEN(dev_priv) >= 3)
    1805                 :            :                 return 0xffffff; /* only 24 bits of frame count */
    1806                 :            :         else
    1807                 :            :                 return 0; /* Gen2 doesn't have a hardware frame counter */
    1808                 :            : }
    1809                 :            : 
    1810                 :          0 : static void intel_crtc_vblank_on(const struct intel_crtc_state *crtc_state)
    1811                 :            : {
    1812                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    1813                 :            : 
    1814                 :          0 :         assert_vblank_disabled(&crtc->base);
    1815                 :          0 :         drm_crtc_set_max_vblank_count(&crtc->base,
    1816                 :            :                                       intel_crtc_max_vblank_count(crtc_state));
    1817                 :          0 :         drm_crtc_vblank_on(&crtc->base);
    1818                 :          0 : }
    1819                 :            : 
    1820                 :          0 : void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state)
    1821                 :            : {
    1822                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    1823                 :            : 
    1824                 :          0 :         drm_crtc_vblank_off(&crtc->base);
    1825                 :          0 :         assert_vblank_disabled(&crtc->base);
    1826                 :          0 : }
    1827                 :            : 
    1828                 :          0 : static void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state)
    1829                 :            : {
    1830                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
    1831                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1832                 :          0 :         enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
    1833                 :          0 :         enum pipe pipe = crtc->pipe;
    1834                 :          0 :         i915_reg_t reg;
    1835                 :          0 :         u32 val;
    1836                 :            : 
    1837                 :          0 :         DRM_DEBUG_KMS("enabling pipe %c\n", pipe_name(pipe));
    1838                 :            : 
    1839                 :          0 :         assert_planes_disabled(crtc);
    1840                 :            : 
    1841                 :            :         /*
    1842                 :            :          * A pipe without a PLL won't actually be able to drive bits from
    1843                 :            :          * a plane.  On ILK+ the pipe PLLs are integrated, so we don't
    1844                 :            :          * need the check.
    1845                 :            :          */
    1846         [ #  # ]:          0 :         if (HAS_GMCH(dev_priv)) {
    1847         [ #  # ]:          0 :                 if (intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI))
    1848                 :          0 :                         assert_dsi_pll_enabled(dev_priv);
    1849                 :            :                 else
    1850                 :          0 :                         assert_pll_enabled(dev_priv, pipe);
    1851                 :            :         } else {
    1852         [ #  # ]:          0 :                 if (new_crtc_state->has_pch_encoder) {
    1853                 :            :                         /* if driving the PCH, we need FDI enabled */
    1854         [ #  # ]:          0 :                         assert_fdi_rx_pll_enabled(dev_priv,
    1855                 :            :                                                   intel_crtc_pch_transcoder(crtc));
    1856                 :          0 :                         assert_fdi_tx_pll_enabled(dev_priv,
    1857                 :            :                                                   (enum pipe) cpu_transcoder);
    1858                 :            :                 }
    1859                 :            :                 /* FIXME: assert CPU port conditions for SNB+ */
    1860                 :            :         }
    1861                 :            : 
    1862                 :          0 :         trace_intel_pipe_enable(crtc);
    1863                 :            : 
    1864                 :          0 :         reg = PIPECONF(cpu_transcoder);
    1865                 :          0 :         val = I915_READ(reg);
    1866         [ #  # ]:          0 :         if (val & PIPECONF_ENABLE) {
    1867                 :            :                 /* we keep both pipes enabled on 830 */
    1868         [ #  # ]:          0 :                 WARN_ON(!IS_I830(dev_priv));
    1869                 :          0 :                 return;
    1870                 :            :         }
    1871                 :            : 
    1872                 :          0 :         I915_WRITE(reg, val | PIPECONF_ENABLE);
    1873                 :          0 :         POSTING_READ(reg);
    1874                 :            : 
    1875                 :            :         /*
    1876                 :            :          * Until the pipe starts PIPEDSL reads will return a stale value,
    1877                 :            :          * which causes an apparent vblank timestamp jump when PIPEDSL
    1878                 :            :          * resets to its proper value. That also messes up the frame count
    1879                 :            :          * when it's derived from the timestamps. So let's wait for the
    1880                 :            :          * pipe to start properly before we call drm_crtc_vblank_on()
    1881                 :            :          */
    1882         [ #  # ]:          0 :         if (intel_crtc_max_vblank_count(new_crtc_state) == 0)
    1883                 :          0 :                 intel_wait_for_pipe_scanline_moving(crtc);
    1884                 :            : }
    1885                 :            : 
    1886                 :          0 : void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state)
    1887                 :            : {
    1888                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
    1889                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    1890                 :          0 :         enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
    1891                 :          0 :         enum pipe pipe = crtc->pipe;
    1892                 :          0 :         i915_reg_t reg;
    1893                 :          0 :         u32 val;
    1894                 :            : 
    1895                 :          0 :         DRM_DEBUG_KMS("disabling pipe %c\n", pipe_name(pipe));
    1896                 :            : 
    1897                 :            :         /*
    1898                 :            :          * Make sure planes won't keep trying to pump pixels to us,
    1899                 :            :          * or we might hang the display.
    1900                 :            :          */
    1901                 :          0 :         assert_planes_disabled(crtc);
    1902                 :            : 
    1903                 :          0 :         trace_intel_pipe_disable(crtc);
    1904                 :            : 
    1905                 :          0 :         reg = PIPECONF(cpu_transcoder);
    1906                 :          0 :         val = I915_READ(reg);
    1907         [ #  # ]:          0 :         if ((val & PIPECONF_ENABLE) == 0)
    1908                 :            :                 return;
    1909                 :            : 
    1910                 :            :         /*
    1911                 :            :          * Double wide has implications for planes
    1912                 :            :          * so best keep it disabled when not needed.
    1913                 :            :          */
    1914         [ #  # ]:          0 :         if (old_crtc_state->double_wide)
    1915                 :          0 :                 val &= ~PIPECONF_DOUBLE_WIDE;
    1916                 :            : 
    1917                 :            :         /* Don't disable pipe or pipe PLLs if needed */
    1918         [ #  # ]:          0 :         if (!IS_I830(dev_priv))
    1919                 :          0 :                 val &= ~PIPECONF_ENABLE;
    1920                 :            : 
    1921                 :          0 :         I915_WRITE(reg, val);
    1922         [ #  # ]:          0 :         if ((val & PIPECONF_ENABLE) == 0)
    1923                 :          0 :                 intel_wait_for_pipe_off(old_crtc_state);
    1924                 :            : }
    1925                 :            : 
    1926                 :          0 : static unsigned int intel_tile_size(const struct drm_i915_private *dev_priv)
    1927                 :            : {
    1928         [ #  # ]:          0 :         return IS_GEN(dev_priv, 2) ? 2048 : 4096;
    1929                 :            : }
    1930                 :            : 
    1931                 :          0 : static bool is_ccs_plane(const struct drm_framebuffer *fb, int plane)
    1932                 :            : {
    1933                 :          0 :         if (!is_ccs_modifier(fb->modifier))
    1934                 :            :                 return false;
    1935                 :            : 
    1936                 :          0 :         return plane >= fb->format->num_planes / 2;
    1937                 :            : }
    1938                 :            : 
    1939                 :          0 : static bool is_gen12_ccs_modifier(u64 modifier)
    1940                 :            : {
    1941                 :          0 :         return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ||
    1942                 :            :                modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
    1943                 :            : 
    1944                 :            : }
    1945                 :            : 
    1946                 :          0 : static bool is_gen12_ccs_plane(const struct drm_framebuffer *fb, int plane)
    1947                 :            : {
    1948   [ #  #  #  #  :          0 :         return is_gen12_ccs_modifier(fb->modifier) && is_ccs_plane(fb, plane);
          #  #  #  #  #  
                      # ]
    1949                 :            : }
    1950                 :            : 
    1951                 :          0 : static bool is_aux_plane(const struct drm_framebuffer *fb, int plane)
    1952                 :            : {
    1953                 :          0 :         if (is_ccs_modifier(fb->modifier))
    1954                 :          0 :                 return is_ccs_plane(fb, plane);
    1955                 :            : 
    1956                 :          0 :         return plane == 1;
    1957                 :            : }
    1958                 :            : 
    1959                 :            : static int main_to_ccs_plane(const struct drm_framebuffer *fb, int main_plane)
    1960                 :            : {
    1961                 :            :         WARN_ON(!is_ccs_modifier(fb->modifier) ||
    1962                 :            :                 (main_plane && main_plane >= fb->format->num_planes / 2));
    1963                 :            : 
    1964                 :            :         return fb->format->num_planes / 2 + main_plane;
    1965                 :            : }
    1966                 :            : 
    1967                 :            : static int ccs_to_main_plane(const struct drm_framebuffer *fb, int ccs_plane)
    1968                 :            : {
    1969                 :            :         WARN_ON(!is_ccs_modifier(fb->modifier) ||
    1970                 :            :                 ccs_plane < fb->format->num_planes / 2);
    1971                 :            : 
    1972                 :            :         return ccs_plane - fb->format->num_planes / 2;
    1973                 :            : }
    1974                 :            : 
    1975                 :            : /* Return either the main plane's CCS or - if not a CCS FB - UV plane */
    1976                 :          0 : int intel_main_to_aux_plane(const struct drm_framebuffer *fb, int main_plane)
    1977                 :            : {
    1978                 :          0 :         if (is_ccs_modifier(fb->modifier))
    1979                 :          0 :                 return main_to_ccs_plane(fb, main_plane);
    1980                 :            : 
    1981                 :            :         return 1;
    1982                 :            : }
    1983                 :            : 
    1984                 :            : bool
    1985                 :          0 : intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info,
    1986                 :            :                                     uint64_t modifier)
    1987                 :            : {
    1988   [ #  #  #  #  :          0 :         return info->is_yuv &&
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1989                 :          0 :                info->num_planes == (is_ccs_modifier(modifier) ? 4 : 2);
    1990                 :            : }
    1991                 :            : 
    1992                 :          0 : static bool is_semiplanar_uv_plane(const struct drm_framebuffer *fb,
    1993                 :            :                                    int color_plane)
    1994                 :            : {
    1995   [ #  #  #  #  :          0 :         return intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) &&
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1996                 :            :                color_plane == 1;
    1997                 :            : }
    1998                 :            : 
    1999                 :            : static unsigned int
    2000                 :          0 : intel_tile_width_bytes(const struct drm_framebuffer *fb, int color_plane)
    2001                 :            : {
    2002   [ #  #  #  #  :          0 :         struct drm_i915_private *dev_priv = to_i915(fb->dev);
             #  #  #  # ]
    2003                 :          0 :         unsigned int cpp = fb->format->cpp[color_plane];
    2004                 :            : 
    2005   [ #  #  #  #  :          0 :         switch (fb->modifier) {
             #  #  #  # ]
    2006                 :          0 :         case DRM_FORMAT_MOD_LINEAR:
    2007         [ #  # ]:          0 :                 return intel_tile_size(dev_priv);
    2008                 :          0 :         case I915_FORMAT_MOD_X_TILED:
    2009         [ #  # ]:          0 :                 if (IS_GEN(dev_priv, 2))
    2010                 :            :                         return 128;
    2011                 :            :                 else
    2012                 :          0 :                         return 512;
    2013                 :          0 :         case I915_FORMAT_MOD_Y_TILED_CCS:
    2014         [ #  # ]:          0 :                 if (is_ccs_plane(fb, color_plane))
    2015                 :            :                         return 128;
    2016                 :            :                 /* fall through */
    2017                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    2018                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    2019         [ #  # ]:          0 :                 if (is_ccs_plane(fb, color_plane))
    2020                 :            :                         return 64;
    2021                 :            :                 /* fall through */
    2022                 :            :         case I915_FORMAT_MOD_Y_TILED:
    2023   [ #  #  #  #  :          0 :                 if (IS_GEN(dev_priv, 2) || HAS_128_BYTE_Y_TILING(dev_priv))
                   #  # ]
    2024                 :          0 :                         return 128;
    2025                 :            :                 else
    2026                 :            :                         return 512;
    2027                 :          0 :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    2028         [ #  # ]:          0 :                 if (is_ccs_plane(fb, color_plane))
    2029                 :            :                         return 128;
    2030                 :            :                 /* fall through */
    2031                 :            :         case I915_FORMAT_MOD_Yf_TILED:
    2032   [ #  #  #  # ]:          0 :                 switch (cpp) {
    2033                 :            :                 case 1:
    2034                 :            :                         return 64;
    2035                 :          0 :                 case 2:
    2036                 :            :                 case 4:
    2037                 :          0 :                         return 128;
    2038                 :          0 :                 case 8:
    2039                 :            :                 case 16:
    2040                 :          0 :                         return 256;
    2041                 :            :                 default:
    2042                 :          0 :                         MISSING_CASE(cpp);
    2043                 :          0 :                         return cpp;
    2044                 :            :                 }
    2045                 :          0 :                 break;
    2046                 :            :         default:
    2047                 :          0 :                 MISSING_CASE(fb->modifier);
    2048                 :          0 :                 return cpp;
    2049                 :            :         }
    2050                 :            : }
    2051                 :            : 
    2052                 :            : static unsigned int
    2053                 :          0 : intel_tile_height(const struct drm_framebuffer *fb, int color_plane)
    2054                 :            : {
    2055   [ #  #  #  # ]:          0 :         if (is_gen12_ccs_plane(fb, color_plane))
    2056                 :            :                 return 1;
    2057                 :            : 
    2058         [ #  # ]:          0 :         return intel_tile_size(to_i915(fb->dev)) /
    2059                 :          0 :                 intel_tile_width_bytes(fb, color_plane);
    2060                 :            : }
    2061                 :            : 
    2062                 :            : /* Return the tile dimensions in pixel units */
    2063                 :          0 : static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane,
    2064                 :            :                             unsigned int *tile_width,
    2065                 :            :                             unsigned int *tile_height)
    2066                 :            : {
    2067                 :          0 :         unsigned int tile_width_bytes = intel_tile_width_bytes(fb, color_plane);
    2068                 :          0 :         unsigned int cpp = fb->format->cpp[color_plane];
    2069                 :            : 
    2070                 :          0 :         *tile_width = tile_width_bytes / cpp;
    2071                 :          0 :         *tile_height = intel_tile_height(fb, color_plane);
    2072                 :          0 : }
    2073                 :            : 
    2074                 :          0 : static unsigned int intel_tile_row_size(const struct drm_framebuffer *fb,
    2075                 :            :                                         int color_plane)
    2076                 :            : {
    2077                 :          0 :         unsigned int tile_width, tile_height;
    2078                 :            : 
    2079                 :          0 :         intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
    2080                 :            : 
    2081                 :          0 :         return fb->pitches[color_plane] * tile_height;
    2082                 :            : }
    2083                 :            : 
    2084                 :            : unsigned int
    2085                 :          0 : intel_fb_align_height(const struct drm_framebuffer *fb,
    2086                 :            :                       int color_plane, unsigned int height)
    2087                 :            : {
    2088                 :          0 :         unsigned int tile_height = intel_tile_height(fb, color_plane);
    2089                 :            : 
    2090                 :          0 :         return ALIGN(height, tile_height);
    2091                 :            : }
    2092                 :            : 
    2093                 :          0 : unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info)
    2094                 :            : {
    2095                 :          0 :         unsigned int size = 0;
    2096                 :          0 :         int i;
    2097                 :            : 
    2098         [ #  # ]:          0 :         for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++)
    2099                 :          0 :                 size += rot_info->plane[i].width * rot_info->plane[i].height;
    2100                 :            : 
    2101                 :          0 :         return size;
    2102                 :            : }
    2103                 :            : 
    2104                 :          0 : unsigned int intel_remapped_info_size(const struct intel_remapped_info *rem_info)
    2105                 :            : {
    2106                 :          0 :         unsigned int size = 0;
    2107                 :          0 :         int i;
    2108                 :            : 
    2109         [ #  # ]:          0 :         for (i = 0 ; i < ARRAY_SIZE(rem_info->plane); i++)
    2110                 :          0 :                 size += rem_info->plane[i].width * rem_info->plane[i].height;
    2111                 :            : 
    2112                 :          0 :         return size;
    2113                 :            : }
    2114                 :            : 
    2115                 :            : static void
    2116                 :          0 : intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
    2117                 :            :                         const struct drm_framebuffer *fb,
    2118                 :            :                         unsigned int rotation)
    2119                 :            : {
    2120                 :          0 :         view->type = I915_GGTT_VIEW_NORMAL;
    2121                 :          0 :         if (drm_rotation_90_or_270(rotation)) {
    2122                 :          0 :                 view->type = I915_GGTT_VIEW_ROTATED;
    2123                 :          0 :                 view->rotated = to_intel_framebuffer(fb)->rot_info;
    2124                 :            :         }
    2125                 :            : }
    2126                 :            : 
    2127                 :          0 : static unsigned int intel_cursor_alignment(const struct drm_i915_private *dev_priv)
    2128                 :            : {
    2129                 :          0 :         if (IS_I830(dev_priv))
    2130                 :            :                 return 16 * 1024;
    2131   [ #  #  #  # ]:          0 :         else if (IS_I85X(dev_priv))
    2132                 :            :                 return 256;
    2133   [ #  #  #  #  :          0 :         else if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
             #  #  #  # ]
    2134                 :          0 :                 return 32;
    2135                 :            :         else
    2136                 :            :                 return 4 * 1024;
    2137                 :            : }
    2138                 :            : 
    2139                 :          0 : static unsigned int intel_linear_alignment(const struct drm_i915_private *dev_priv)
    2140                 :            : {
    2141                 :          0 :         if (INTEL_GEN(dev_priv) >= 9)
    2142                 :            :                 return 256 * 1024;
    2143   [ #  #  #  #  :          0 :         else if (IS_I965G(dev_priv) || IS_I965GM(dev_priv) ||
                   #  # ]
    2144         [ #  # ]:          0 :                  IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
    2145                 :            :                 return 128 * 1024;
    2146         [ #  # ]:          0 :         else if (INTEL_GEN(dev_priv) >= 4)
    2147                 :            :                 return 4 * 1024;
    2148                 :            :         else
    2149                 :          0 :                 return 0;
    2150                 :            : }
    2151                 :            : 
    2152                 :          0 : static unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
    2153                 :            :                                          int color_plane)
    2154                 :            : {
    2155         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(fb->dev);
    2156                 :            : 
    2157                 :            :         /* AUX_DIST needs only 4K alignment */
    2158   [ #  #  #  #  :          0 :         if ((INTEL_GEN(dev_priv) < 12 && is_aux_plane(fb, color_plane)) ||
                   #  # ]
    2159                 :          0 :             is_ccs_plane(fb, color_plane))
    2160                 :            :                 return 4096;
    2161                 :            : 
    2162   [ #  #  #  #  :          0 :         switch (fb->modifier) {
                #  #  # ]
    2163                 :            :         case DRM_FORMAT_MOD_LINEAR:
    2164         [ #  # ]:          0 :                 return intel_linear_alignment(dev_priv);
    2165                 :          0 :         case I915_FORMAT_MOD_X_TILED:
    2166         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 9)
    2167                 :          0 :                         return 256 * 1024;
    2168                 :            :                 return 0;
    2169                 :          0 :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    2170   [ #  #  #  # ]:          0 :                 if (is_semiplanar_uv_plane(fb, color_plane))
    2171                 :          0 :                         return intel_tile_row_size(fb, color_plane);
    2172                 :            :                 /* Fall-through */
    2173                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    2174                 :            :                 return 16 * 1024;
    2175                 :          0 :         case I915_FORMAT_MOD_Y_TILED_CCS:
    2176                 :            :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    2177                 :            :         case I915_FORMAT_MOD_Y_TILED:
    2178   [ #  #  #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 12 &&
    2179                 :            :                     is_semiplanar_uv_plane(fb, color_plane))
    2180                 :          0 :                         return intel_tile_row_size(fb, color_plane);
    2181                 :            :                 /* Fall-through */
    2182                 :            :         case I915_FORMAT_MOD_Yf_TILED:
    2183                 :            :                 return 1 * 1024 * 1024;
    2184                 :            :         default:
    2185                 :          0 :                 MISSING_CASE(fb->modifier);
    2186                 :          0 :                 return 0;
    2187                 :            :         }
    2188                 :            : }
    2189                 :            : 
    2190                 :          0 : static bool intel_plane_uses_fence(const struct intel_plane_state *plane_state)
    2191                 :            : {
    2192                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    2193                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    2194                 :            : 
    2195   [ #  #  #  # ]:          0 :         return INTEL_GEN(dev_priv) < 4 ||
    2196   [ #  #  #  # ]:          0 :                 (plane->has_fbc &&
    2197   [ #  #  #  # ]:          0 :                  plane_state->view.type == I915_GGTT_VIEW_NORMAL);
    2198                 :            : }
    2199                 :            : 
    2200                 :            : struct i915_vma *
    2201                 :          0 : intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
    2202                 :            :                            const struct i915_ggtt_view *view,
    2203                 :            :                            bool uses_fence,
    2204                 :            :                            unsigned long *out_flags)
    2205                 :            : {
    2206                 :          0 :         struct drm_device *dev = fb->dev;
    2207         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    2208         [ #  # ]:          0 :         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
    2209                 :          0 :         intel_wakeref_t wakeref;
    2210                 :          0 :         struct i915_vma *vma;
    2211                 :          0 :         unsigned int pinctl;
    2212                 :          0 :         u32 alignment;
    2213                 :            : 
    2214   [ #  #  #  # ]:          0 :         if (WARN_ON(!i915_gem_object_is_framebuffer(obj)))
    2215                 :            :                 return ERR_PTR(-EINVAL);
    2216                 :            : 
    2217                 :          0 :         alignment = intel_surf_alignment(fb, 0);
    2218   [ #  #  #  #  :          0 :         if (WARN_ON(alignment && !is_power_of_2(alignment)))
          #  #  #  #  #  
                      # ]
    2219                 :            :                 return ERR_PTR(-EINVAL);
    2220                 :            : 
    2221                 :            :         /* Note that the w/a also requires 64 PTE of padding following the
    2222                 :            :          * bo. We currently fill all unused PTE with the shadow page and so
    2223                 :            :          * we should always have valid PTE following the scanout preventing
    2224                 :            :          * the VT-d warning.
    2225                 :            :          */
    2226   [ #  #  #  # ]:          0 :         if (intel_scanout_needs_vtd_wa(dev_priv) && alignment < 256 * 1024)
    2227                 :            :                 alignment = 256 * 1024;
    2228                 :            : 
    2229                 :            :         /*
    2230                 :            :          * Global gtt pte registers are special registers which actually forward
    2231                 :            :          * writes to a chunk of system memory. Which means that there is no risk
    2232                 :            :          * that the register values disappear as soon as we call
    2233                 :            :          * intel_runtime_pm_put(), so it is correct to wrap only the
    2234                 :            :          * pin/unpin/fence and not more.
    2235                 :            :          */
    2236                 :          0 :         wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
    2237                 :            : 
    2238                 :          0 :         atomic_inc(&dev_priv->gpu_error.pending_fb_pin);
    2239                 :            : 
    2240                 :            :         /*
    2241                 :            :          * Valleyview is definitely limited to scanning out the first
    2242                 :            :          * 512MiB. Lets presume this behaviour was inherited from the
    2243                 :            :          * g4x display engine and that all earlier gen are similarly
    2244                 :            :          * limited. Testing suggests that it is a little more
    2245                 :            :          * complicated than this. For example, Cherryview appears quite
    2246                 :            :          * happy to scanout from anywhere within its global aperture.
    2247                 :            :          */
    2248                 :          0 :         pinctl = 0;
    2249         [ #  # ]:          0 :         if (HAS_GMCH(dev_priv))
    2250                 :          0 :                 pinctl |= PIN_MAPPABLE;
    2251                 :            : 
    2252                 :          0 :         vma = i915_gem_object_pin_to_display_plane(obj,
    2253                 :            :                                                    alignment, view, pinctl);
    2254         [ #  # ]:          0 :         if (IS_ERR(vma))
    2255                 :          0 :                 goto err;
    2256                 :            : 
    2257   [ #  #  #  # ]:          0 :         if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
    2258                 :          0 :                 int ret;
    2259                 :            : 
    2260                 :            :                 /*
    2261                 :            :                  * Install a fence for tiled scan-out. Pre-i965 always needs a
    2262                 :            :                  * fence, whereas 965+ only requires a fence if using
    2263                 :            :                  * framebuffer compression.  For simplicity, we always, when
    2264                 :            :                  * possible, install a fence as the cost is not that onerous.
    2265                 :            :                  *
    2266                 :            :                  * If we fail to fence the tiled scanout, then either the
    2267                 :            :                  * modeset will reject the change (which is highly unlikely as
    2268                 :            :                  * the affected systems, all but one, do not have unmappable
    2269                 :            :                  * space) or we will not be able to enable full powersaving
    2270                 :            :                  * techniques (also likely not to apply due to various limits
    2271                 :            :                  * FBC and the like impose on the size of the buffer, which
    2272                 :            :                  * presumably we violated anyway with this unmappable buffer).
    2273                 :            :                  * Anyway, it is presumably better to stumble onwards with
    2274                 :            :                  * something and try to run the system in a "less than optimal"
    2275                 :            :                  * mode that matches the user configuration.
    2276                 :            :                  */
    2277                 :          0 :                 ret = i915_vma_pin_fence(vma);
    2278   [ #  #  #  # ]:          0 :                 if (ret != 0 && INTEL_GEN(dev_priv) < 4) {
    2279                 :          0 :                         i915_gem_object_unpin_from_display_plane(vma);
    2280                 :          0 :                         vma = ERR_PTR(ret);
    2281                 :          0 :                         goto err;
    2282                 :            :                 }
    2283                 :            : 
    2284   [ #  #  #  # ]:          0 :                 if (ret == 0 && vma->fence)
    2285                 :          0 :                         *out_flags |= PLANE_HAS_FENCE;
    2286                 :            :         }
    2287                 :            : 
    2288                 :          0 :         i915_vma_get(vma);
    2289                 :          0 : err:
    2290                 :          0 :         atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
    2291                 :          0 :         intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
    2292                 :          0 :         return vma;
    2293                 :            : }
    2294                 :            : 
    2295                 :          0 : void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
    2296                 :            : {
    2297                 :          0 :         i915_gem_object_lock(vma->obj);
    2298         [ #  # ]:          0 :         if (flags & PLANE_HAS_FENCE)
    2299         [ #  # ]:          0 :                 i915_vma_unpin_fence(vma);
    2300                 :          0 :         i915_gem_object_unpin_from_display_plane(vma);
    2301                 :          0 :         i915_gem_object_unlock(vma->obj);
    2302                 :            : 
    2303                 :          0 :         i915_vma_put(vma);
    2304                 :          0 : }
    2305                 :            : 
    2306                 :          0 : static int intel_fb_pitch(const struct drm_framebuffer *fb, int color_plane,
    2307                 :            :                           unsigned int rotation)
    2308                 :            : {
    2309                 :          0 :         if (drm_rotation_90_or_270(rotation))
    2310                 :          0 :                 return to_intel_framebuffer(fb)->rotated[color_plane].pitch;
    2311                 :            :         else
    2312                 :          0 :                 return fb->pitches[color_plane];
    2313                 :            : }
    2314                 :            : 
    2315                 :            : /*
    2316                 :            :  * Convert the x/y offsets into a linear offset.
    2317                 :            :  * Only valid with 0/180 degree rotation, which is fine since linear
    2318                 :            :  * offset is only used with linear buffers on pre-hsw and tiled buffers
    2319                 :            :  * with gen2/3, and 90/270 degree rotations isn't supported on any of them.
    2320                 :            :  */
    2321                 :          0 : u32 intel_fb_xy_to_linear(int x, int y,
    2322                 :            :                           const struct intel_plane_state *state,
    2323                 :            :                           int color_plane)
    2324                 :            : {
    2325                 :          0 :         const struct drm_framebuffer *fb = state->hw.fb;
    2326                 :          0 :         unsigned int cpp = fb->format->cpp[color_plane];
    2327                 :          0 :         unsigned int pitch = state->color_plane[color_plane].stride;
    2328                 :            : 
    2329                 :          0 :         return y * pitch + x * cpp;
    2330                 :            : }
    2331                 :            : 
    2332                 :            : /*
    2333                 :            :  * Add the x/y offsets derived from fb->offsets[] to the user
    2334                 :            :  * specified plane src x/y offsets. The resulting x/y offsets
    2335                 :            :  * specify the start of scanout from the beginning of the gtt mapping.
    2336                 :            :  */
    2337                 :          0 : void intel_add_fb_offsets(int *x, int *y,
    2338                 :            :                           const struct intel_plane_state *state,
    2339                 :            :                           int color_plane)
    2340                 :            : 
    2341                 :            : {
    2342                 :          0 :         *x += state->color_plane[color_plane].x;
    2343                 :          0 :         *y += state->color_plane[color_plane].y;
    2344                 :          0 : }
    2345                 :            : 
    2346                 :          0 : static u32 intel_adjust_tile_offset(int *x, int *y,
    2347                 :            :                                     unsigned int tile_width,
    2348                 :            :                                     unsigned int tile_height,
    2349                 :            :                                     unsigned int tile_size,
    2350                 :            :                                     unsigned int pitch_tiles,
    2351                 :            :                                     u32 old_offset,
    2352                 :            :                                     u32 new_offset)
    2353                 :            : {
    2354                 :          0 :         unsigned int pitch_pixels = pitch_tiles * tile_width;
    2355                 :          0 :         unsigned int tiles;
    2356                 :            : 
    2357         [ #  # ]:          0 :         WARN_ON(old_offset & (tile_size - 1));
    2358         [ #  # ]:          0 :         WARN_ON(new_offset & (tile_size - 1));
    2359         [ #  # ]:          0 :         WARN_ON(new_offset > old_offset);
    2360                 :            : 
    2361                 :          0 :         tiles = (old_offset - new_offset) / tile_size;
    2362                 :            : 
    2363                 :          0 :         *y += tiles / pitch_tiles * tile_height;
    2364                 :          0 :         *x += tiles % pitch_tiles * tile_width;
    2365                 :            : 
    2366                 :            :         /* minimize x in case it got needlessly big */
    2367                 :          0 :         *y += *x / pitch_pixels * tile_height;
    2368                 :          0 :         *x %= pitch_pixels;
    2369                 :            : 
    2370                 :          0 :         return new_offset;
    2371                 :            : }
    2372                 :            : 
    2373                 :          0 : static bool is_surface_linear(const struct drm_framebuffer *fb, int color_plane)
    2374                 :            : {
    2375   [ #  #  #  #  :          0 :         return fb->modifier == DRM_FORMAT_MOD_LINEAR ||
          #  #  #  #  #  
                      # ]
    2376                 :            :                is_gen12_ccs_plane(fb, color_plane);
    2377                 :            : }
    2378                 :            : 
    2379                 :          0 : static u32 intel_adjust_aligned_offset(int *x, int *y,
    2380                 :            :                                        const struct drm_framebuffer *fb,
    2381                 :            :                                        int color_plane,
    2382                 :            :                                        unsigned int rotation,
    2383                 :            :                                        unsigned int pitch,
    2384                 :            :                                        u32 old_offset, u32 new_offset)
    2385                 :            : {
    2386         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(fb->dev);
    2387                 :          0 :         unsigned int cpp = fb->format->cpp[color_plane];
    2388                 :            : 
    2389         [ #  # ]:          0 :         WARN_ON(new_offset > old_offset);
    2390                 :            : 
    2391   [ #  #  #  # ]:          0 :         if (!is_surface_linear(fb, color_plane)) {
    2392                 :          0 :                 unsigned int tile_size, tile_width, tile_height;
    2393                 :          0 :                 unsigned int pitch_tiles;
    2394                 :            : 
    2395         [ #  # ]:          0 :                 tile_size = intel_tile_size(dev_priv);
    2396                 :          0 :                 intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
    2397                 :            : 
    2398         [ #  # ]:          0 :                 if (drm_rotation_90_or_270(rotation)) {
    2399                 :          0 :                         pitch_tiles = pitch / tile_height;
    2400                 :          0 :                         swap(tile_width, tile_height);
    2401                 :            :                 } else {
    2402                 :          0 :                         pitch_tiles = pitch / (tile_width * cpp);
    2403                 :            :                 }
    2404                 :            : 
    2405                 :          0 :                 intel_adjust_tile_offset(x, y, tile_width, tile_height,
    2406                 :            :                                          tile_size, pitch_tiles,
    2407                 :            :                                          old_offset, new_offset);
    2408                 :            :         } else {
    2409                 :          0 :                 old_offset += *y * pitch + *x * cpp;
    2410                 :            : 
    2411                 :          0 :                 *y = (old_offset - new_offset) / pitch;
    2412                 :          0 :                 *x = ((old_offset - new_offset) - *y * pitch) / cpp;
    2413                 :            :         }
    2414                 :            : 
    2415                 :          0 :         return new_offset;
    2416                 :            : }
    2417                 :            : 
    2418                 :            : /*
    2419                 :            :  * Adjust the tile offset by moving the difference into
    2420                 :            :  * the x/y offsets.
    2421                 :            :  */
    2422                 :          0 : static u32 intel_plane_adjust_aligned_offset(int *x, int *y,
    2423                 :            :                                              const struct intel_plane_state *state,
    2424                 :            :                                              int color_plane,
    2425                 :            :                                              u32 old_offset, u32 new_offset)
    2426                 :            : {
    2427                 :          0 :         return intel_adjust_aligned_offset(x, y, state->hw.fb, color_plane,
    2428                 :            :                                            state->hw.rotation,
    2429                 :            :                                            state->color_plane[color_plane].stride,
    2430                 :            :                                            old_offset, new_offset);
    2431                 :            : }
    2432                 :            : 
    2433                 :            : /*
    2434                 :            :  * Computes the aligned offset to the base tile and adjusts
    2435                 :            :  * x, y. bytes per pixel is assumed to be a power-of-two.
    2436                 :            :  *
    2437                 :            :  * In the 90/270 rotated case, x and y are assumed
    2438                 :            :  * to be already rotated to match the rotated GTT view, and
    2439                 :            :  * pitch is the tile_height aligned framebuffer height.
    2440                 :            :  *
    2441                 :            :  * This function is used when computing the derived information
    2442                 :            :  * under intel_framebuffer, so using any of that information
    2443                 :            :  * here is not allowed. Anything under drm_framebuffer can be
    2444                 :            :  * used. This is why the user has to pass in the pitch since it
    2445                 :            :  * is specified in the rotated orientation.
    2446                 :            :  */
    2447                 :          0 : static u32 intel_compute_aligned_offset(struct drm_i915_private *dev_priv,
    2448                 :            :                                         int *x, int *y,
    2449                 :            :                                         const struct drm_framebuffer *fb,
    2450                 :            :                                         int color_plane,
    2451                 :            :                                         unsigned int pitch,
    2452                 :            :                                         unsigned int rotation,
    2453                 :            :                                         u32 alignment)
    2454                 :            : {
    2455                 :          0 :         unsigned int cpp = fb->format->cpp[color_plane];
    2456                 :          0 :         u32 offset, offset_aligned;
    2457                 :            : 
    2458   [ #  #  #  # ]:          0 :         if (!is_surface_linear(fb, color_plane)) {
    2459                 :          0 :                 unsigned int tile_size, tile_width, tile_height;
    2460                 :          0 :                 unsigned int tile_rows, tiles, pitch_tiles;
    2461                 :            : 
    2462         [ #  # ]:          0 :                 tile_size = intel_tile_size(dev_priv);
    2463                 :          0 :                 intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
    2464                 :            : 
    2465         [ #  # ]:          0 :                 if (drm_rotation_90_or_270(rotation)) {
    2466                 :          0 :                         pitch_tiles = pitch / tile_height;
    2467                 :          0 :                         swap(tile_width, tile_height);
    2468                 :            :                 } else {
    2469                 :          0 :                         pitch_tiles = pitch / (tile_width * cpp);
    2470                 :            :                 }
    2471                 :            : 
    2472                 :          0 :                 tile_rows = *y / tile_height;
    2473                 :          0 :                 *y %= tile_height;
    2474                 :            : 
    2475                 :          0 :                 tiles = *x / tile_width;
    2476                 :          0 :                 *x %= tile_width;
    2477                 :            : 
    2478                 :          0 :                 offset = (tile_rows * pitch_tiles + tiles) * tile_size;
    2479                 :            : 
    2480                 :          0 :                 offset_aligned = offset;
    2481         [ #  # ]:          0 :                 if (alignment)
    2482                 :          0 :                         offset_aligned = rounddown(offset_aligned, alignment);
    2483                 :            : 
    2484                 :          0 :                 intel_adjust_tile_offset(x, y, tile_width, tile_height,
    2485                 :            :                                          tile_size, pitch_tiles,
    2486                 :            :                                          offset, offset_aligned);
    2487                 :            :         } else {
    2488                 :          0 :                 offset = *y * pitch + *x * cpp;
    2489                 :          0 :                 offset_aligned = offset;
    2490         [ #  # ]:          0 :                 if (alignment) {
    2491                 :          0 :                         offset_aligned = rounddown(offset_aligned, alignment);
    2492                 :          0 :                         *y = (offset % alignment) / pitch;
    2493                 :          0 :                         *x = ((offset % alignment) - *y * pitch) / cpp;
    2494                 :            :                 } else {
    2495                 :          0 :                         *y = *x = 0;
    2496                 :            :                 }
    2497                 :            :         }
    2498                 :            : 
    2499                 :          0 :         return offset_aligned;
    2500                 :            : }
    2501                 :            : 
    2502                 :          0 : static u32 intel_plane_compute_aligned_offset(int *x, int *y,
    2503                 :            :                                               const struct intel_plane_state *state,
    2504                 :            :                                               int color_plane)
    2505                 :            : {
    2506                 :          0 :         struct intel_plane *intel_plane = to_intel_plane(state->uapi.plane);
    2507         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
    2508                 :          0 :         const struct drm_framebuffer *fb = state->hw.fb;
    2509                 :          0 :         unsigned int rotation = state->hw.rotation;
    2510                 :          0 :         int pitch = state->color_plane[color_plane].stride;
    2511                 :          0 :         u32 alignment;
    2512                 :            : 
    2513         [ #  # ]:          0 :         if (intel_plane->id == PLANE_CURSOR)
    2514         [ #  # ]:          0 :                 alignment = intel_cursor_alignment(dev_priv);
    2515                 :            :         else
    2516                 :          0 :                 alignment = intel_surf_alignment(fb, color_plane);
    2517                 :            : 
    2518                 :          0 :         return intel_compute_aligned_offset(dev_priv, x, y, fb, color_plane,
    2519                 :            :                                             pitch, rotation, alignment);
    2520                 :            : }
    2521                 :            : 
    2522                 :            : /* Convert the fb->offset[] into x/y offsets */
    2523                 :          0 : static int intel_fb_offset_to_xy(int *x, int *y,
    2524                 :            :                                  const struct drm_framebuffer *fb,
    2525                 :            :                                  int color_plane)
    2526                 :            : {
    2527         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(fb->dev);
    2528                 :          0 :         unsigned int height;
    2529                 :          0 :         u32 alignment;
    2530                 :            : 
    2531   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 12 &&
    2532         [ #  # ]:          0 :             is_semiplanar_uv_plane(fb, color_plane))
    2533                 :          0 :                 alignment = intel_tile_row_size(fb, color_plane);
    2534         [ #  # ]:          0 :         else if (fb->modifier != DRM_FORMAT_MOD_LINEAR)
    2535         [ #  # ]:          0 :                 alignment = intel_tile_size(dev_priv);
    2536                 :            :         else
    2537                 :            :                 alignment = 0;
    2538                 :            : 
    2539   [ #  #  #  # ]:          0 :         if (alignment != 0 && fb->offsets[color_plane] % alignment) {
    2540                 :          0 :                 DRM_DEBUG_KMS("Misaligned offset 0x%08x for color plane %d\n",
    2541                 :            :                               fb->offsets[color_plane], color_plane);
    2542                 :          0 :                 return -EINVAL;
    2543                 :            :         }
    2544                 :            : 
    2545                 :          0 :         height = drm_framebuffer_plane_height(fb->height, fb, color_plane);
    2546                 :          0 :         height = ALIGN(height, intel_tile_height(fb, color_plane));
    2547                 :            : 
    2548                 :            :         /* Catch potential overflows early */
    2549         [ #  # ]:          0 :         if (add_overflows_t(u32, mul_u32_u32(height, fb->pitches[color_plane]),
    2550                 :            :                             fb->offsets[color_plane])) {
    2551                 :          0 :                 DRM_DEBUG_KMS("Bad offset 0x%08x or pitch %d for color plane %d\n",
    2552                 :            :                               fb->offsets[color_plane], fb->pitches[color_plane],
    2553                 :            :                               color_plane);
    2554                 :          0 :                 return -ERANGE;
    2555                 :            :         }
    2556                 :            : 
    2557                 :          0 :         *x = 0;
    2558                 :          0 :         *y = 0;
    2559                 :            : 
    2560                 :          0 :         intel_adjust_aligned_offset(x, y,
    2561                 :            :                                     fb, color_plane, DRM_MODE_ROTATE_0,
    2562                 :            :                                     fb->pitches[color_plane],
    2563                 :            :                                     fb->offsets[color_plane], 0);
    2564                 :            : 
    2565                 :          0 :         return 0;
    2566                 :            : }
    2567                 :            : 
    2568                 :          0 : static unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
    2569                 :            : {
    2570                 :          0 :         switch (fb_modifier) {
    2571                 :            :         case I915_FORMAT_MOD_X_TILED:
    2572                 :            :                 return I915_TILING_X;
    2573                 :          0 :         case I915_FORMAT_MOD_Y_TILED:
    2574                 :            :         case I915_FORMAT_MOD_Y_TILED_CCS:
    2575                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    2576                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    2577                 :          0 :                 return I915_TILING_Y;
    2578                 :          0 :         default:
    2579                 :          0 :                 return I915_TILING_NONE;
    2580                 :            :         }
    2581                 :            : }
    2582                 :            : 
    2583                 :            : /*
    2584                 :            :  * From the Sky Lake PRM:
    2585                 :            :  * "The Color Control Surface (CCS) contains the compression status of
    2586                 :            :  *  the cache-line pairs. The compression state of the cache-line pair
    2587                 :            :  *  is specified by 2 bits in the CCS. Each CCS cache-line represents
    2588                 :            :  *  an area on the main surface of 16 x16 sets of 128 byte Y-tiled
    2589                 :            :  *  cache-line-pairs. CCS is always Y tiled."
    2590                 :            :  *
    2591                 :            :  * Since cache line pairs refers to horizontally adjacent cache lines,
    2592                 :            :  * each cache line in the CCS corresponds to an area of 32x16 cache
    2593                 :            :  * lines on the main surface. Since each pixel is 4 bytes, this gives
    2594                 :            :  * us a ratio of one byte in the CCS for each 8x16 pixels in the
    2595                 :            :  * main surface.
    2596                 :            :  */
    2597                 :            : static const struct drm_format_info skl_ccs_formats[] = {
    2598                 :            :         { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
    2599                 :            :           .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
    2600                 :            :         { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
    2601                 :            :           .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
    2602                 :            :         { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
    2603                 :            :           .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
    2604                 :            :         { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
    2605                 :            :           .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
    2606                 :            : };
    2607                 :            : 
    2608                 :            : /*
    2609                 :            :  * Gen-12 compression uses 4 bits of CCS data for each cache line pair in the
    2610                 :            :  * main surface. And each 64B CCS cache line represents an area of 4x1 Y-tiles
    2611                 :            :  * in the main surface. With 4 byte pixels and each Y-tile having dimensions of
    2612                 :            :  * 32x32 pixels, the ratio turns out to 1B in the CCS for every 2x32 pixels in
    2613                 :            :  * the main surface.
    2614                 :            :  */
    2615                 :            : static const struct drm_format_info gen12_ccs_formats[] = {
    2616                 :            :         { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
    2617                 :            :           .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2618                 :            :           .hsub = 1, .vsub = 1, },
    2619                 :            :         { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
    2620                 :            :           .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2621                 :            :           .hsub = 1, .vsub = 1, },
    2622                 :            :         { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
    2623                 :            :           .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2624                 :            :           .hsub = 1, .vsub = 1, .has_alpha = true },
    2625                 :            :         { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
    2626                 :            :           .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2627                 :            :           .hsub = 1, .vsub = 1, .has_alpha = true },
    2628                 :            :         { .format = DRM_FORMAT_YUYV, .num_planes = 2,
    2629                 :            :           .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2630                 :            :           .hsub = 2, .vsub = 1, .is_yuv = true },
    2631                 :            :         { .format = DRM_FORMAT_YVYU, .num_planes = 2,
    2632                 :            :           .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2633                 :            :           .hsub = 2, .vsub = 1, .is_yuv = true },
    2634                 :            :         { .format = DRM_FORMAT_UYVY, .num_planes = 2,
    2635                 :            :           .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2636                 :            :           .hsub = 2, .vsub = 1, .is_yuv = true },
    2637                 :            :         { .format = DRM_FORMAT_VYUY, .num_planes = 2,
    2638                 :            :           .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
    2639                 :            :           .hsub = 2, .vsub = 1, .is_yuv = true },
    2640                 :            :         { .format = DRM_FORMAT_NV12, .num_planes = 4,
    2641                 :            :           .char_per_block = { 1, 2, 1, 1 }, .block_w = { 1, 1, 4, 4 }, .block_h = { 1, 1, 1, 1 },
    2642                 :            :           .hsub = 2, .vsub = 2, .is_yuv = true },
    2643                 :            :         { .format = DRM_FORMAT_P010, .num_planes = 4,
    2644                 :            :           .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
    2645                 :            :           .hsub = 2, .vsub = 2, .is_yuv = true },
    2646                 :            :         { .format = DRM_FORMAT_P012, .num_planes = 4,
    2647                 :            :           .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
    2648                 :            :           .hsub = 2, .vsub = 2, .is_yuv = true },
    2649                 :            :         { .format = DRM_FORMAT_P016, .num_planes = 4,
    2650                 :            :           .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
    2651                 :            :           .hsub = 2, .vsub = 2, .is_yuv = true },
    2652                 :            : };
    2653                 :            : 
    2654                 :            : static const struct drm_format_info *
    2655                 :          0 : lookup_format_info(const struct drm_format_info formats[],
    2656                 :            :                    int num_formats, u32 format)
    2657                 :            : {
    2658                 :          0 :         int i;
    2659                 :            : 
    2660   [ #  #  #  # ]:          0 :         for (i = 0; i < num_formats; i++) {
    2661   [ #  #  #  # ]:          0 :                 if (formats[i].format == format)
    2662                 :            :                         return &formats[i];
    2663                 :            :         }
    2664                 :            : 
    2665                 :            :         return NULL;
    2666                 :            : }
    2667                 :            : 
    2668                 :            : static const struct drm_format_info *
    2669                 :          0 : intel_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
    2670                 :            : {
    2671      [ #  #  # ]:          0 :         switch (cmd->modifier[0]) {
    2672                 :          0 :         case I915_FORMAT_MOD_Y_TILED_CCS:
    2673                 :            :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    2674                 :          0 :                 return lookup_format_info(skl_ccs_formats,
    2675                 :            :                                           ARRAY_SIZE(skl_ccs_formats),
    2676                 :            :                                           cmd->pixel_format);
    2677                 :          0 :         case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    2678                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    2679                 :          0 :                 return lookup_format_info(gen12_ccs_formats,
    2680                 :            :                                           ARRAY_SIZE(gen12_ccs_formats),
    2681                 :            :                                           cmd->pixel_format);
    2682                 :            :         default:
    2683                 :            :                 return NULL;
    2684                 :            :         }
    2685                 :            : }
    2686                 :            : 
    2687                 :          0 : bool is_ccs_modifier(u64 modifier)
    2688                 :            : {
    2689   [ #  #  #  #  :          0 :         return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ||
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    2690                 :          0 :                modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS ||
    2691   [ #  #  #  #  :          0 :                modifier == I915_FORMAT_MOD_Y_TILED_CCS ||
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    2692                 :            :                modifier == I915_FORMAT_MOD_Yf_TILED_CCS;
    2693                 :            : }
    2694                 :            : 
    2695                 :          0 : static int gen12_ccs_aux_stride(struct drm_framebuffer *fb, int ccs_plane)
    2696                 :            : {
    2697                 :          0 :         return DIV_ROUND_UP(fb->pitches[ccs_to_main_plane(fb, ccs_plane)],
    2698                 :          0 :                             512) * 64;
    2699                 :            : }
    2700                 :            : 
    2701                 :          0 : u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv,
    2702                 :            :                               u32 pixel_format, u64 modifier)
    2703                 :            : {
    2704                 :          0 :         struct intel_crtc *crtc;
    2705                 :          0 :         struct intel_plane *plane;
    2706                 :            : 
    2707                 :            :         /*
    2708                 :            :          * We assume the primary plane for pipe A has
    2709                 :            :          * the highest stride limits of them all.
    2710                 :            :          */
    2711         [ #  # ]:          0 :         crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_A);
    2712   [ #  #  #  # ]:          0 :         if (!crtc)
    2713                 :            :                 return 0;
    2714                 :            : 
    2715                 :          0 :         plane = to_intel_plane(crtc->base.primary);
    2716                 :            : 
    2717                 :          0 :         return plane->max_stride(plane, pixel_format, modifier,
    2718                 :            :                                  DRM_MODE_ROTATE_0);
    2719                 :            : }
    2720                 :            : 
    2721                 :            : static
    2722                 :            : u32 intel_fb_max_stride(struct drm_i915_private *dev_priv,
    2723                 :            :                         u32 pixel_format, u64 modifier)
    2724                 :            : {
    2725                 :            :         /*
    2726                 :            :          * Arbitrary limit for gen4+ chosen to match the
    2727                 :            :          * render engine max stride.
    2728                 :            :          *
    2729                 :            :          * The new CCS hash mode makes remapping impossible
    2730                 :            :          */
    2731                 :            :         if (!is_ccs_modifier(modifier)) {
    2732                 :            :                 if (INTEL_GEN(dev_priv) >= 7)
    2733                 :            :                         return 256*1024;
    2734                 :            :                 else if (INTEL_GEN(dev_priv) >= 4)
    2735                 :            :                         return 128*1024;
    2736                 :            :         }
    2737                 :            : 
    2738                 :            :         return intel_plane_fb_max_stride(dev_priv, pixel_format, modifier);
    2739                 :            : }
    2740                 :            : 
    2741                 :            : static u32
    2742                 :          0 : intel_fb_stride_alignment(const struct drm_framebuffer *fb, int color_plane)
    2743                 :            : {
    2744         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(fb->dev);
    2745                 :          0 :         u32 tile_width;
    2746                 :            : 
    2747   [ #  #  #  # ]:          0 :         if (is_surface_linear(fb, color_plane)) {
    2748                 :          0 :                 u32 max_stride = intel_plane_fb_max_stride(dev_priv,
    2749         [ #  # ]:          0 :                                                            fb->format->format,
    2750                 :            :                                                            fb->modifier);
    2751                 :            : 
    2752                 :            :                 /*
    2753                 :            :                  * To make remapping with linear generally feasible
    2754                 :            :                  * we need the stride to be page aligned.
    2755                 :            :                  */
    2756   [ #  #  #  # ]:          0 :                 if (fb->pitches[color_plane] > max_stride &&
    2757         [ #  # ]:          0 :                     !is_ccs_modifier(fb->modifier))
    2758         [ #  # ]:          0 :                         return intel_tile_size(dev_priv);
    2759                 :            :                 else
    2760                 :            :                         return 64;
    2761                 :            :         }
    2762                 :            : 
    2763                 :          0 :         tile_width = intel_tile_width_bytes(fb, color_plane);
    2764   [ #  #  #  # ]:          0 :         if (is_ccs_modifier(fb->modifier)) {
    2765                 :            :                 /*
    2766                 :            :                  * Display WA #0531: skl,bxt,kbl,glk
    2767                 :            :                  *
    2768                 :            :                  * Render decompression and plane width > 3840
    2769                 :            :                  * combined with horizontal panning requires the
    2770                 :            :                  * plane stride to be a multiple of 4. We'll just
    2771                 :            :                  * require the entire fb to accommodate that to avoid
    2772                 :            :                  * potential runtime errors at plane configuration time.
    2773                 :            :                  */
    2774   [ #  #  #  #  :          0 :                 if (IS_GEN(dev_priv, 9) && color_plane == 0 && fb->width > 3840)
                   #  # ]
    2775                 :          0 :                         tile_width *= 4;
    2776                 :            :                 /*
    2777                 :            :                  * The main surface pitch must be padded to a multiple of four
    2778                 :            :                  * tile widths.
    2779                 :            :                  */
    2780         [ #  # ]:          0 :                 else if (INTEL_GEN(dev_priv) >= 12)
    2781                 :          0 :                         tile_width *= 4;
    2782                 :            :         }
    2783                 :            :         return tile_width;
    2784                 :            : }
    2785                 :            : 
    2786                 :          0 : bool intel_plane_can_remap(const struct intel_plane_state *plane_state)
    2787                 :            : {
    2788                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    2789         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    2790                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    2791                 :          0 :         int i;
    2792                 :            : 
    2793                 :            :         /* We don't want to deal with remapping with cursors */
    2794         [ #  # ]:          0 :         if (plane->id == PLANE_CURSOR)
    2795                 :            :                 return false;
    2796                 :            : 
    2797                 :            :         /*
    2798                 :            :          * The display engine limits already match/exceed the
    2799                 :            :          * render engine limits, so not much point in remapping.
    2800                 :            :          * Would also need to deal with the fence POT alignment
    2801                 :            :          * and gen2 2KiB GTT tile size.
    2802                 :            :          */
    2803         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4)
    2804                 :            :                 return false;
    2805                 :            : 
    2806                 :            :         /*
    2807                 :            :          * The new CCS hash mode isn't compatible with remapping as
    2808                 :            :          * the virtual address of the pages affects the compressed data.
    2809                 :            :          */
    2810   [ #  #  #  # ]:          0 :         if (is_ccs_modifier(fb->modifier))
    2811                 :            :                 return false;
    2812                 :            : 
    2813                 :            :         /* Linear needs a page aligned stride for remapping */
    2814         [ #  # ]:          0 :         if (fb->modifier == DRM_FORMAT_MOD_LINEAR) {
    2815                 :            :                 unsigned int alignment = intel_tile_size(dev_priv) - 1;
    2816                 :            : 
    2817         [ #  # ]:          0 :                 for (i = 0; i < fb->format->num_planes; i++) {
    2818         [ #  # ]:          0 :                         if (fb->pitches[i] & alignment)
    2819                 :            :                                 return false;
    2820                 :            :                 }
    2821                 :            :         }
    2822                 :            : 
    2823                 :            :         return true;
    2824                 :            : }
    2825                 :            : 
    2826                 :          0 : static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
    2827                 :            : {
    2828                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    2829                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    2830                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    2831                 :          0 :         u32 stride, max_stride;
    2832                 :            : 
    2833                 :            :         /*
    2834                 :            :          * No remapping for invisible planes since we don't have
    2835                 :            :          * an actual source viewport to remap.
    2836                 :            :          */
    2837         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
    2838                 :            :                 return false;
    2839                 :            : 
    2840         [ #  # ]:          0 :         if (!intel_plane_can_remap(plane_state))
    2841                 :            :                 return false;
    2842                 :            : 
    2843                 :            :         /*
    2844                 :            :          * FIXME: aux plane limits on gen9+ are
    2845                 :            :          * unclear in Bspec, for now no checking.
    2846                 :            :          */
    2847         [ #  # ]:          0 :         stride = intel_fb_pitch(fb, 0, rotation);
    2848                 :          0 :         max_stride = plane->max_stride(plane, fb->format->format,
    2849                 :            :                                        fb->modifier, rotation);
    2850                 :            : 
    2851                 :          0 :         return stride > max_stride;
    2852                 :            : }
    2853                 :            : 
    2854                 :            : static void
    2855                 :          0 : intel_fb_plane_get_subsampling(int *hsub, int *vsub,
    2856                 :            :                                const struct drm_framebuffer *fb,
    2857                 :            :                                int color_plane)
    2858                 :            : {
    2859                 :          0 :         int main_plane;
    2860                 :            : 
    2861         [ #  # ]:          0 :         if (color_plane == 0) {
    2862                 :          0 :                 *hsub = 1;
    2863                 :          0 :                 *vsub = 1;
    2864                 :            : 
    2865                 :          0 :                 return;
    2866                 :            :         }
    2867                 :            : 
    2868                 :            :         /*
    2869                 :            :          * TODO: Deduct the subsampling from the char block for all CCS
    2870                 :            :          * formats and planes.
    2871                 :            :          */
    2872   [ #  #  #  # ]:          0 :         if (!is_gen12_ccs_plane(fb, color_plane)) {
    2873                 :          0 :                 *hsub = fb->format->hsub;
    2874                 :          0 :                 *vsub = fb->format->vsub;
    2875                 :            : 
    2876                 :          0 :                 return;
    2877                 :            :         }
    2878                 :            : 
    2879                 :          0 :         main_plane = ccs_to_main_plane(fb, color_plane);
    2880                 :          0 :         *hsub = drm_format_info_block_width(fb->format, color_plane) /
    2881                 :          0 :                 drm_format_info_block_width(fb->format, main_plane);
    2882                 :            : 
    2883                 :            :         /*
    2884                 :            :          * The min stride check in the core framebuffer_check() function
    2885                 :            :          * assumes that format->hsub applies to every plane except for the
    2886                 :            :          * first plane. That's incorrect for the CCS AUX plane of the first
    2887                 :            :          * plane, but for the above check to pass we must define the block
    2888                 :            :          * width with that subsampling applied to it. Adjust the width here
    2889                 :            :          * accordingly, so we can calculate the actual subsampling factor.
    2890                 :            :          */
    2891         [ #  # ]:          0 :         if (main_plane == 0)
    2892                 :          0 :                 *hsub *= fb->format->hsub;
    2893                 :            : 
    2894                 :          0 :         *vsub = 32;
    2895                 :            : }
    2896                 :            : static int
    2897                 :          0 : intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
    2898                 :            : {
    2899                 :          0 :         struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
    2900                 :          0 :         int main_plane;
    2901                 :          0 :         int hsub, vsub;
    2902                 :          0 :         int tile_width, tile_height;
    2903                 :          0 :         int ccs_x, ccs_y;
    2904                 :          0 :         int main_x, main_y;
    2905                 :            : 
    2906   [ #  #  #  # ]:          0 :         if (!is_ccs_plane(fb, ccs_plane))
    2907                 :            :                 return 0;
    2908                 :            : 
    2909                 :          0 :         intel_tile_dims(fb, ccs_plane, &tile_width, &tile_height);
    2910                 :          0 :         intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
    2911                 :            : 
    2912                 :          0 :         tile_width *= hsub;
    2913                 :          0 :         tile_height *= vsub;
    2914                 :            : 
    2915                 :          0 :         ccs_x = (x * hsub) % tile_width;
    2916                 :          0 :         ccs_y = (y * vsub) % tile_height;
    2917                 :            : 
    2918                 :          0 :         main_plane = ccs_to_main_plane(fb, ccs_plane);
    2919                 :          0 :         main_x = intel_fb->normal[main_plane].x % tile_width;
    2920                 :          0 :         main_y = intel_fb->normal[main_plane].y % tile_height;
    2921                 :            : 
    2922                 :            :         /*
    2923                 :            :          * CCS doesn't have its own x/y offset register, so the intra CCS tile
    2924                 :            :          * x/y offsets must match between CCS and the main surface.
    2925                 :            :          */
    2926         [ #  # ]:          0 :         if (main_x != ccs_x || main_y != ccs_y) {
    2927                 :          0 :                 DRM_DEBUG_KMS("Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
    2928                 :            :                               main_x, main_y,
    2929                 :            :                               ccs_x, ccs_y,
    2930                 :            :                               intel_fb->normal[main_plane].x,
    2931                 :            :                               intel_fb->normal[main_plane].y,
    2932                 :            :                               x, y);
    2933                 :          0 :                 return -EINVAL;
    2934                 :            :         }
    2935                 :            : 
    2936                 :            :         return 0;
    2937                 :            : }
    2938                 :            : 
    2939                 :            : static void
    2940                 :          0 : intel_fb_plane_dims(int *w, int *h, struct drm_framebuffer *fb, int color_plane)
    2941                 :            : {
    2942         [ #  # ]:          0 :         int main_plane = is_ccs_plane(fb, color_plane) ?
    2943         [ #  # ]:          0 :                          ccs_to_main_plane(fb, color_plane) : 0;
    2944                 :          0 :         int main_hsub, main_vsub;
    2945                 :          0 :         int hsub, vsub;
    2946                 :            : 
    2947                 :          0 :         intel_fb_plane_get_subsampling(&main_hsub, &main_vsub, fb, main_plane);
    2948                 :          0 :         intel_fb_plane_get_subsampling(&hsub, &vsub, fb, color_plane);
    2949                 :          0 :         *w = fb->width / main_hsub / hsub;
    2950                 :          0 :         *h = fb->height / main_vsub / vsub;
    2951                 :          0 : }
    2952                 :            : 
    2953                 :            : /*
    2954                 :            :  * Setup the rotated view for an FB plane and return the size the GTT mapping
    2955                 :            :  * requires for this view.
    2956                 :            :  */
    2957                 :            : static u32
    2958                 :          0 : setup_fb_rotation(int plane, const struct intel_remapped_plane_info *plane_info,
    2959                 :            :                   u32 gtt_offset_rotated, int x, int y,
    2960                 :            :                   unsigned int width, unsigned int height,
    2961                 :            :                   unsigned int tile_size,
    2962                 :            :                   unsigned int tile_width, unsigned int tile_height,
    2963                 :            :                   struct drm_framebuffer *fb)
    2964                 :            : {
    2965                 :          0 :         struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
    2966                 :          0 :         struct intel_rotation_info *rot_info = &intel_fb->rot_info;
    2967                 :          0 :         unsigned int pitch_tiles;
    2968                 :          0 :         struct drm_rect r;
    2969                 :            : 
    2970                 :            :         /* Y or Yf modifiers required for 90/270 rotation */
    2971         [ #  # ]:          0 :         if (fb->modifier != I915_FORMAT_MOD_Y_TILED &&
    2972                 :            :             fb->modifier != I915_FORMAT_MOD_Yf_TILED)
    2973                 :            :                 return 0;
    2974                 :            : 
    2975   [ #  #  #  # ]:          0 :         if (WARN_ON(plane >= ARRAY_SIZE(rot_info->plane)))
    2976                 :            :                 return 0;
    2977                 :            : 
    2978                 :          0 :         rot_info->plane[plane] = *plane_info;
    2979                 :            : 
    2980                 :          0 :         intel_fb->rotated[plane].pitch = plane_info->height * tile_height;
    2981                 :            : 
    2982                 :            :         /* rotate the x/y offsets to match the GTT view */
    2983                 :          0 :         drm_rect_init(&r, x, y, width, height);
    2984                 :          0 :         drm_rect_rotate(&r,
    2985                 :          0 :                         plane_info->width * tile_width,
    2986                 :          0 :                         plane_info->height * tile_height,
    2987                 :            :                         DRM_MODE_ROTATE_270);
    2988                 :          0 :         x = r.x1;
    2989                 :          0 :         y = r.y1;
    2990                 :            : 
    2991                 :            :         /* rotate the tile dimensions to match the GTT view */
    2992                 :          0 :         pitch_tiles = intel_fb->rotated[plane].pitch / tile_height;
    2993                 :          0 :         swap(tile_width, tile_height);
    2994                 :            : 
    2995                 :            :         /*
    2996                 :            :          * We only keep the x/y offsets, so push all of the
    2997                 :            :          * gtt offset into the x/y offsets.
    2998                 :            :          */
    2999                 :          0 :         intel_adjust_tile_offset(&x, &y,
    3000                 :            :                                  tile_width, tile_height,
    3001                 :            :                                  tile_size, pitch_tiles,
    3002                 :            :                                  gtt_offset_rotated * tile_size, 0);
    3003                 :            : 
    3004                 :            :         /*
    3005                 :            :          * First pixel of the framebuffer from
    3006                 :            :          * the start of the rotated gtt mapping.
    3007                 :            :          */
    3008                 :          0 :         intel_fb->rotated[plane].x = x;
    3009                 :          0 :         intel_fb->rotated[plane].y = y;
    3010                 :            : 
    3011                 :          0 :         return plane_info->width * plane_info->height;
    3012                 :            : }
    3013                 :            : 
    3014                 :            : static int
    3015                 :          0 : intel_fill_fb_info(struct drm_i915_private *dev_priv,
    3016                 :            :                    struct drm_framebuffer *fb)
    3017                 :            : {
    3018                 :          0 :         struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
    3019         [ #  # ]:          0 :         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
    3020                 :          0 :         u32 gtt_offset_rotated = 0;
    3021                 :          0 :         unsigned int max_size = 0;
    3022                 :          0 :         int i, num_planes = fb->format->num_planes;
    3023         [ #  # ]:          0 :         unsigned int tile_size = intel_tile_size(dev_priv);
    3024                 :            : 
    3025         [ #  # ]:          0 :         for (i = 0; i < num_planes; i++) {
    3026                 :          0 :                 unsigned int width, height;
    3027                 :          0 :                 unsigned int cpp, size;
    3028                 :          0 :                 u32 offset;
    3029                 :          0 :                 int x, y;
    3030                 :          0 :                 int ret;
    3031                 :            : 
    3032                 :          0 :                 cpp = fb->format->cpp[i];
    3033                 :          0 :                 intel_fb_plane_dims(&width, &height, fb, i);
    3034                 :            : 
    3035                 :          0 :                 ret = intel_fb_offset_to_xy(&x, &y, fb, i);
    3036         [ #  # ]:          0 :                 if (ret) {
    3037                 :          0 :                         DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
    3038                 :            :                                       i, fb->offsets[i]);
    3039                 :          0 :                         return ret;
    3040                 :            :                 }
    3041                 :            : 
    3042                 :          0 :                 ret = intel_fb_check_ccs_xy(fb, i, x, y);
    3043         [ #  # ]:          0 :                 if (ret)
    3044                 :          0 :                         return ret;
    3045                 :            : 
    3046                 :            :                 /*
    3047                 :            :                  * The fence (if used) is aligned to the start of the object
    3048                 :            :                  * so having the framebuffer wrap around across the edge of the
    3049                 :            :                  * fenced region doesn't really work. We have no API to configure
    3050                 :            :                  * the fence start offset within the object (nor could we probably
    3051                 :            :                  * on gen2/3). So it's just easier if we just require that the
    3052                 :            :                  * fb layout agrees with the fence layout. We already check that the
    3053                 :            :                  * fb stride matches the fence stride elsewhere.
    3054                 :            :                  */
    3055   [ #  #  #  # ]:          0 :                 if (i == 0 && i915_gem_object_is_tiled(obj) &&
    3056         [ #  # ]:          0 :                     (x + width) * cpp > fb->pitches[i]) {
    3057                 :          0 :                         DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
    3058                 :            :                                       i, fb->offsets[i]);
    3059                 :          0 :                         return -EINVAL;
    3060                 :            :                 }
    3061                 :            : 
    3062                 :            :                 /*
    3063                 :            :                  * First pixel of the framebuffer from
    3064                 :            :                  * the start of the normal gtt mapping.
    3065                 :            :                  */
    3066                 :          0 :                 intel_fb->normal[i].x = x;
    3067                 :          0 :                 intel_fb->normal[i].y = y;
    3068                 :            : 
    3069                 :          0 :                 offset = intel_compute_aligned_offset(dev_priv, &x, &y, fb, i,
    3070                 :            :                                                       fb->pitches[i],
    3071                 :            :                                                       DRM_MODE_ROTATE_0,
    3072                 :            :                                                       tile_size);
    3073                 :          0 :                 offset /= tile_size;
    3074                 :            : 
    3075   [ #  #  #  # ]:          0 :                 if (!is_surface_linear(fb, i)) {
    3076                 :          0 :                         struct intel_remapped_plane_info plane_info;
    3077                 :          0 :                         unsigned int tile_width, tile_height;
    3078                 :            : 
    3079                 :          0 :                         intel_tile_dims(fb, i, &tile_width, &tile_height);
    3080                 :            : 
    3081                 :          0 :                         plane_info.offset = offset;
    3082                 :          0 :                         plane_info.stride = DIV_ROUND_UP(fb->pitches[i],
    3083                 :            :                                                          tile_width * cpp);
    3084                 :          0 :                         plane_info.width = DIV_ROUND_UP(x + width, tile_width);
    3085                 :          0 :                         plane_info.height = DIV_ROUND_UP(y + height,
    3086                 :            :                                                          tile_height);
    3087                 :            : 
    3088                 :            :                         /* how many tiles does this plane need */
    3089                 :          0 :                         size = plane_info.stride * plane_info.height;
    3090                 :            :                         /*
    3091                 :            :                          * If the plane isn't horizontally tile aligned,
    3092                 :            :                          * we need one more tile.
    3093                 :            :                          */
    3094         [ #  # ]:          0 :                         if (x != 0)
    3095                 :          0 :                                 size++;
    3096                 :            : 
    3097                 :          0 :                         gtt_offset_rotated +=
    3098                 :          0 :                                 setup_fb_rotation(i, &plane_info,
    3099                 :            :                                                   gtt_offset_rotated,
    3100                 :            :                                                   x, y, width, height,
    3101                 :            :                                                   tile_size,
    3102                 :            :                                                   tile_width, tile_height,
    3103                 :            :                                                   fb);
    3104                 :            :                 } else {
    3105                 :          0 :                         size = DIV_ROUND_UP((y + height) * fb->pitches[i] +
    3106                 :            :                                             x * cpp, tile_size);
    3107                 :            :                 }
    3108                 :            : 
    3109                 :            :                 /* how many tiles in total needed in the bo */
    3110                 :          0 :                 max_size = max(max_size, offset + size);
    3111                 :            :         }
    3112                 :            : 
    3113         [ #  # ]:          0 :         if (mul_u32_u32(max_size, tile_size) > obj->base.size) {
    3114                 :          0 :                 DRM_DEBUG_KMS("fb too big for bo (need %llu bytes, have %zu bytes)\n",
    3115                 :            :                               mul_u32_u32(max_size, tile_size), obj->base.size);
    3116                 :          0 :                 return -EINVAL;
    3117                 :            :         }
    3118                 :            : 
    3119                 :            :         return 0;
    3120                 :            : }
    3121                 :            : 
    3122                 :            : static void
    3123                 :          0 : intel_plane_remap_gtt(struct intel_plane_state *plane_state)
    3124                 :            : {
    3125                 :          0 :         struct drm_i915_private *dev_priv =
    3126         [ #  # ]:          0 :                 to_i915(plane_state->uapi.plane->dev);
    3127                 :          0 :         struct drm_framebuffer *fb = plane_state->hw.fb;
    3128                 :          0 :         struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
    3129                 :          0 :         struct intel_rotation_info *info = &plane_state->view.rotated;
    3130                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    3131                 :          0 :         int i, num_planes = fb->format->num_planes;
    3132         [ #  # ]:          0 :         unsigned int tile_size = intel_tile_size(dev_priv);
    3133                 :          0 :         unsigned int src_x, src_y;
    3134                 :          0 :         unsigned int src_w, src_h;
    3135                 :          0 :         u32 gtt_offset = 0;
    3136                 :            : 
    3137                 :          0 :         memset(&plane_state->view, 0, sizeof(plane_state->view));
    3138         [ #  # ]:          0 :         plane_state->view.type = drm_rotation_90_or_270(rotation) ?
    3139         [ #  # ]:          0 :                 I915_GGTT_VIEW_ROTATED : I915_GGTT_VIEW_REMAPPED;
    3140                 :            : 
    3141                 :          0 :         src_x = plane_state->uapi.src.x1 >> 16;
    3142                 :          0 :         src_y = plane_state->uapi.src.y1 >> 16;
    3143         [ #  # ]:          0 :         src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
    3144         [ #  # ]:          0 :         src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
    3145                 :            : 
    3146   [ #  #  #  # ]:          0 :         WARN_ON(is_ccs_modifier(fb->modifier));
    3147                 :            : 
    3148                 :            :         /* Make src coordinates relative to the viewport */
    3149                 :          0 :         drm_rect_translate(&plane_state->uapi.src,
    3150         [ #  # ]:          0 :                            -(src_x << 16), -(src_y << 16));
    3151                 :            : 
    3152                 :            :         /* Rotate src coordinates to match rotated GTT view */
    3153         [ #  # ]:          0 :         if (drm_rotation_90_or_270(rotation))
    3154                 :          0 :                 drm_rect_rotate(&plane_state->uapi.src,
    3155                 :          0 :                                 src_w << 16, src_h << 16,
    3156                 :            :                                 DRM_MODE_ROTATE_270);
    3157                 :            : 
    3158         [ #  # ]:          0 :         for (i = 0; i < num_planes; i++) {
    3159         [ #  # ]:          0 :                 unsigned int hsub = i ? fb->format->hsub : 1;
    3160         [ #  # ]:          0 :                 unsigned int vsub = i ? fb->format->vsub : 1;
    3161                 :          0 :                 unsigned int cpp = fb->format->cpp[i];
    3162                 :          0 :                 unsigned int tile_width, tile_height;
    3163                 :          0 :                 unsigned int width, height;
    3164                 :          0 :                 unsigned int pitch_tiles;
    3165                 :          0 :                 unsigned int x, y;
    3166                 :          0 :                 u32 offset;
    3167                 :            : 
    3168                 :          0 :                 intel_tile_dims(fb, i, &tile_width, &tile_height);
    3169                 :            : 
    3170                 :          0 :                 x = src_x / hsub;
    3171                 :          0 :                 y = src_y / vsub;
    3172                 :          0 :                 width = src_w / hsub;
    3173                 :          0 :                 height = src_h / vsub;
    3174                 :            : 
    3175                 :            :                 /*
    3176                 :            :                  * First pixel of the src viewport from the
    3177                 :            :                  * start of the normal gtt mapping.
    3178                 :            :                  */
    3179                 :          0 :                 x += intel_fb->normal[i].x;
    3180                 :          0 :                 y += intel_fb->normal[i].y;
    3181                 :            : 
    3182                 :          0 :                 offset = intel_compute_aligned_offset(dev_priv, &x, &y,
    3183                 :            :                                                       fb, i, fb->pitches[i],
    3184                 :            :                                                       DRM_MODE_ROTATE_0, tile_size);
    3185                 :          0 :                 offset /= tile_size;
    3186                 :            : 
    3187         [ #  # ]:          0 :                 WARN_ON(i >= ARRAY_SIZE(info->plane));
    3188                 :          0 :                 info->plane[i].offset = offset;
    3189                 :          0 :                 info->plane[i].stride = DIV_ROUND_UP(fb->pitches[i],
    3190                 :            :                                                      tile_width * cpp);
    3191                 :          0 :                 info->plane[i].width = DIV_ROUND_UP(x + width, tile_width);
    3192                 :          0 :                 info->plane[i].height = DIV_ROUND_UP(y + height, tile_height);
    3193                 :            : 
    3194         [ #  # ]:          0 :                 if (drm_rotation_90_or_270(rotation)) {
    3195                 :          0 :                         struct drm_rect r;
    3196                 :            : 
    3197                 :            :                         /* rotate the x/y offsets to match the GTT view */
    3198                 :          0 :                         drm_rect_init(&r, x, y, width, height);
    3199                 :          0 :                         drm_rect_rotate(&r,
    3200                 :          0 :                                         info->plane[i].width * tile_width,
    3201                 :          0 :                                         info->plane[i].height * tile_height,
    3202                 :            :                                         DRM_MODE_ROTATE_270);
    3203                 :          0 :                         x = r.x1;
    3204                 :          0 :                         y = r.y1;
    3205                 :            : 
    3206                 :          0 :                         pitch_tiles = info->plane[i].height;
    3207                 :          0 :                         plane_state->color_plane[i].stride = pitch_tiles * tile_height;
    3208                 :            : 
    3209                 :            :                         /* rotate the tile dimensions to match the GTT view */
    3210                 :          0 :                         swap(tile_width, tile_height);
    3211                 :            :                 } else {
    3212                 :          0 :                         pitch_tiles = info->plane[i].width;
    3213                 :          0 :                         plane_state->color_plane[i].stride = pitch_tiles * tile_width * cpp;
    3214                 :            :                 }
    3215                 :            : 
    3216                 :            :                 /*
    3217                 :            :                  * We only keep the x/y offsets, so push all of the
    3218                 :            :                  * gtt offset into the x/y offsets.
    3219                 :            :                  */
    3220                 :          0 :                 intel_adjust_tile_offset(&x, &y,
    3221                 :            :                                          tile_width, tile_height,
    3222                 :            :                                          tile_size, pitch_tiles,
    3223                 :            :                                          gtt_offset * tile_size, 0);
    3224                 :            : 
    3225                 :          0 :                 gtt_offset += info->plane[i].width * info->plane[i].height;
    3226                 :            : 
    3227                 :          0 :                 plane_state->color_plane[i].offset = 0;
    3228                 :          0 :                 plane_state->color_plane[i].x = x;
    3229                 :          0 :                 plane_state->color_plane[i].y = y;
    3230                 :            :         }
    3231                 :          0 : }
    3232                 :            : 
    3233                 :            : static int
    3234                 :          0 : intel_plane_compute_gtt(struct intel_plane_state *plane_state)
    3235                 :            : {
    3236                 :          0 :         const struct intel_framebuffer *fb =
    3237                 :          0 :                 to_intel_framebuffer(plane_state->hw.fb);
    3238                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    3239                 :          0 :         int i, num_planes;
    3240                 :            : 
    3241         [ #  # ]:          0 :         if (!fb)
    3242                 :            :                 return 0;
    3243                 :            : 
    3244                 :          0 :         num_planes = fb->base.format->num_planes;
    3245                 :            : 
    3246         [ #  # ]:          0 :         if (intel_plane_needs_remap(plane_state)) {
    3247                 :          0 :                 intel_plane_remap_gtt(plane_state);
    3248                 :            : 
    3249                 :            :                 /*
    3250                 :            :                  * Sometimes even remapping can't overcome
    3251                 :            :                  * the stride limitations :( Can happen with
    3252                 :            :                  * big plane sizes and suitably misaligned
    3253                 :            :                  * offsets.
    3254                 :            :                  */
    3255                 :          0 :                 return intel_plane_check_stride(plane_state);
    3256                 :            :         }
    3257                 :            : 
    3258         [ #  # ]:          0 :         intel_fill_fb_ggtt_view(&plane_state->view, &fb->base, rotation);
    3259                 :            : 
    3260         [ #  # ]:          0 :         for (i = 0; i < num_planes; i++) {
    3261         [ #  # ]:          0 :                 plane_state->color_plane[i].stride = intel_fb_pitch(&fb->base, i, rotation);
    3262                 :          0 :                 plane_state->color_plane[i].offset = 0;
    3263                 :            : 
    3264         [ #  # ]:          0 :                 if (drm_rotation_90_or_270(rotation)) {
    3265                 :          0 :                         plane_state->color_plane[i].x = fb->rotated[i].x;
    3266                 :          0 :                         plane_state->color_plane[i].y = fb->rotated[i].y;
    3267                 :            :                 } else {
    3268                 :          0 :                         plane_state->color_plane[i].x = fb->normal[i].x;
    3269                 :          0 :                         plane_state->color_plane[i].y = fb->normal[i].y;
    3270                 :            :                 }
    3271                 :            :         }
    3272                 :            : 
    3273                 :            :         /* Rotate src coordinates to match rotated GTT view */
    3274         [ #  # ]:          0 :         if (drm_rotation_90_or_270(rotation))
    3275                 :          0 :                 drm_rect_rotate(&plane_state->uapi.src,
    3276                 :          0 :                                 fb->base.width << 16, fb->base.height << 16,
    3277                 :            :                                 DRM_MODE_ROTATE_270);
    3278                 :            : 
    3279                 :          0 :         return intel_plane_check_stride(plane_state);
    3280                 :            : }
    3281                 :            : 
    3282                 :          0 : static int i9xx_format_to_fourcc(int format)
    3283                 :            : {
    3284   [ #  #  #  #  :          0 :         switch (format) {
          #  #  #  #  #  
             #  #  #  # ]
    3285                 :            :         case DISPPLANE_8BPP:
    3286                 :            :                 return DRM_FORMAT_C8;
    3287                 :          0 :         case DISPPLANE_BGRA555:
    3288                 :          0 :                 return DRM_FORMAT_ARGB1555;
    3289                 :          0 :         case DISPPLANE_BGRX555:
    3290                 :          0 :                 return DRM_FORMAT_XRGB1555;
    3291                 :          0 :         case DISPPLANE_BGRX565:
    3292                 :          0 :                 return DRM_FORMAT_RGB565;
    3293                 :          0 :         default:
    3294                 :            :         case DISPPLANE_BGRX888:
    3295                 :          0 :                 return DRM_FORMAT_XRGB8888;
    3296                 :          0 :         case DISPPLANE_RGBX888:
    3297                 :          0 :                 return DRM_FORMAT_XBGR8888;
    3298                 :          0 :         case DISPPLANE_BGRA888:
    3299                 :          0 :                 return DRM_FORMAT_ARGB8888;
    3300                 :          0 :         case DISPPLANE_RGBA888:
    3301                 :          0 :                 return DRM_FORMAT_ABGR8888;
    3302                 :          0 :         case DISPPLANE_BGRX101010:
    3303                 :          0 :                 return DRM_FORMAT_XRGB2101010;
    3304                 :          0 :         case DISPPLANE_RGBX101010:
    3305                 :          0 :                 return DRM_FORMAT_XBGR2101010;
    3306                 :          0 :         case DISPPLANE_BGRA101010:
    3307                 :          0 :                 return DRM_FORMAT_ARGB2101010;
    3308                 :          0 :         case DISPPLANE_RGBA101010:
    3309                 :          0 :                 return DRM_FORMAT_ABGR2101010;
    3310                 :          0 :         case DISPPLANE_RGBX161616:
    3311                 :          0 :                 return DRM_FORMAT_XBGR16161616F;
    3312                 :            :         }
    3313                 :            : }
    3314                 :            : 
    3315                 :          0 : int skl_format_to_fourcc(int format, bool rgb_order, bool alpha)
    3316                 :            : {
    3317   [ #  #  #  #  :          0 :         switch (format) {
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    3318                 :            :         case PLANE_CTL_FORMAT_RGB_565:
    3319                 :            :                 return DRM_FORMAT_RGB565;
    3320                 :          0 :         case PLANE_CTL_FORMAT_NV12:
    3321                 :          0 :                 return DRM_FORMAT_NV12;
    3322                 :          0 :         case PLANE_CTL_FORMAT_P010:
    3323                 :          0 :                 return DRM_FORMAT_P010;
    3324                 :          0 :         case PLANE_CTL_FORMAT_P012:
    3325                 :          0 :                 return DRM_FORMAT_P012;
    3326                 :          0 :         case PLANE_CTL_FORMAT_P016:
    3327                 :          0 :                 return DRM_FORMAT_P016;
    3328                 :          0 :         case PLANE_CTL_FORMAT_Y210:
    3329                 :          0 :                 return DRM_FORMAT_Y210;
    3330                 :          0 :         case PLANE_CTL_FORMAT_Y212:
    3331                 :          0 :                 return DRM_FORMAT_Y212;
    3332                 :          0 :         case PLANE_CTL_FORMAT_Y216:
    3333                 :          0 :                 return DRM_FORMAT_Y216;
    3334                 :          0 :         case PLANE_CTL_FORMAT_Y410:
    3335                 :          0 :                 return DRM_FORMAT_XVYU2101010;
    3336                 :          0 :         case PLANE_CTL_FORMAT_Y412:
    3337                 :          0 :                 return DRM_FORMAT_XVYU12_16161616;
    3338                 :          0 :         case PLANE_CTL_FORMAT_Y416:
    3339                 :          0 :                 return DRM_FORMAT_XVYU16161616;
    3340                 :          0 :         default:
    3341                 :            :         case PLANE_CTL_FORMAT_XRGB_8888:
    3342         [ #  # ]:          0 :                 if (rgb_order) {
    3343         [ #  # ]:          0 :                         if (alpha)
    3344                 :            :                                 return DRM_FORMAT_ABGR8888;
    3345                 :            :                         else
    3346                 :          0 :                                 return DRM_FORMAT_XBGR8888;
    3347                 :            :                 } else {
    3348         [ #  # ]:          0 :                         if (alpha)
    3349                 :            :                                 return DRM_FORMAT_ARGB8888;
    3350                 :            :                         else
    3351                 :          0 :                                 return DRM_FORMAT_XRGB8888;
    3352                 :            :                 }
    3353                 :          0 :         case PLANE_CTL_FORMAT_XRGB_2101010:
    3354         [ #  # ]:          0 :                 if (rgb_order) {
    3355         [ #  # ]:          0 :                         if (alpha)
    3356                 :            :                                 return DRM_FORMAT_ABGR2101010;
    3357                 :            :                         else
    3358                 :          0 :                                 return DRM_FORMAT_XBGR2101010;
    3359                 :            :                 } else {
    3360         [ #  # ]:          0 :                         if (alpha)
    3361                 :            :                                 return DRM_FORMAT_ARGB2101010;
    3362                 :            :                         else
    3363                 :          0 :                                 return DRM_FORMAT_XRGB2101010;
    3364                 :            :                 }
    3365                 :          0 :         case PLANE_CTL_FORMAT_XRGB_16161616F:
    3366         [ #  # ]:          0 :                 if (rgb_order) {
    3367         [ #  # ]:          0 :                         if (alpha)
    3368                 :            :                                 return DRM_FORMAT_ABGR16161616F;
    3369                 :            :                         else
    3370                 :          0 :                                 return DRM_FORMAT_XBGR16161616F;
    3371                 :            :                 } else {
    3372         [ #  # ]:          0 :                         if (alpha)
    3373                 :            :                                 return DRM_FORMAT_ARGB16161616F;
    3374                 :            :                         else
    3375                 :          0 :                                 return DRM_FORMAT_XRGB16161616F;
    3376                 :            :                 }
    3377                 :            :         }
    3378                 :            : }
    3379                 :            : 
    3380                 :            : static bool
    3381                 :            : intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
    3382                 :            :                               struct intel_initial_plane_config *plane_config)
    3383                 :            : {
    3384                 :            :         struct drm_device *dev = crtc->base.dev;
    3385                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    3386                 :            :         struct drm_mode_fb_cmd2 mode_cmd = { 0 };
    3387                 :            :         struct drm_framebuffer *fb = &plane_config->fb->base;
    3388                 :            :         u32 base_aligned = round_down(plane_config->base, PAGE_SIZE);
    3389                 :            :         u32 size_aligned = round_up(plane_config->base + plane_config->size,
    3390                 :            :                                     PAGE_SIZE);
    3391                 :            :         struct drm_i915_gem_object *obj;
    3392                 :            :         bool ret = false;
    3393                 :            : 
    3394                 :            :         size_aligned -= base_aligned;
    3395                 :            : 
    3396                 :            :         if (plane_config->size == 0)
    3397                 :            :                 return false;
    3398                 :            : 
    3399                 :            :         /* If the FB is too big, just don't use it since fbdev is not very
    3400                 :            :          * important and we should probably use that space with FBC or other
    3401                 :            :          * features. */
    3402                 :            :         if (size_aligned * 2 > dev_priv->stolen_usable_size)
    3403                 :            :                 return false;
    3404                 :            : 
    3405                 :            :         switch (fb->modifier) {
    3406                 :            :         case DRM_FORMAT_MOD_LINEAR:
    3407                 :            :         case I915_FORMAT_MOD_X_TILED:
    3408                 :            :         case I915_FORMAT_MOD_Y_TILED:
    3409                 :            :                 break;
    3410                 :            :         default:
    3411                 :            :                 DRM_DEBUG_DRIVER("Unsupported modifier for initial FB: 0x%llx\n",
    3412                 :            :                                  fb->modifier);
    3413                 :            :                 return false;
    3414                 :            :         }
    3415                 :            : 
    3416                 :            :         obj = i915_gem_object_create_stolen_for_preallocated(dev_priv,
    3417                 :            :                                                              base_aligned,
    3418                 :            :                                                              base_aligned,
    3419                 :            :                                                              size_aligned);
    3420                 :            :         if (IS_ERR(obj))
    3421                 :            :                 return false;
    3422                 :            : 
    3423                 :            :         switch (plane_config->tiling) {
    3424                 :            :         case I915_TILING_NONE:
    3425                 :            :                 break;
    3426                 :            :         case I915_TILING_X:
    3427                 :            :         case I915_TILING_Y:
    3428                 :            :                 obj->tiling_and_stride = fb->pitches[0] | plane_config->tiling;
    3429                 :            :                 break;
    3430                 :            :         default:
    3431                 :            :                 MISSING_CASE(plane_config->tiling);
    3432                 :            :                 goto out;
    3433                 :            :         }
    3434                 :            : 
    3435                 :            :         mode_cmd.pixel_format = fb->format->format;
    3436                 :            :         mode_cmd.width = fb->width;
    3437                 :            :         mode_cmd.height = fb->height;
    3438                 :            :         mode_cmd.pitches[0] = fb->pitches[0];
    3439                 :            :         mode_cmd.modifier[0] = fb->modifier;
    3440                 :            :         mode_cmd.flags = DRM_MODE_FB_MODIFIERS;
    3441                 :            : 
    3442                 :            :         if (intel_framebuffer_init(to_intel_framebuffer(fb), obj, &mode_cmd)) {
    3443                 :            :                 DRM_DEBUG_KMS("intel fb init failed\n");
    3444                 :            :                 goto out;
    3445                 :            :         }
    3446                 :            : 
    3447                 :            : 
    3448                 :            :         DRM_DEBUG_KMS("initial plane fb obj %p\n", obj);
    3449                 :            :         ret = true;
    3450                 :            : out:
    3451                 :            :         i915_gem_object_put(obj);
    3452                 :            :         return ret;
    3453                 :            : }
    3454                 :            : 
    3455                 :            : static void
    3456                 :          0 : intel_set_plane_visible(struct intel_crtc_state *crtc_state,
    3457                 :            :                         struct intel_plane_state *plane_state,
    3458                 :            :                         bool visible)
    3459                 :            : {
    3460                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    3461                 :            : 
    3462                 :          0 :         plane_state->uapi.visible = visible;
    3463                 :            : 
    3464                 :          0 :         if (visible)
    3465                 :          0 :                 crtc_state->uapi.plane_mask |= drm_plane_mask(&plane->base);
    3466                 :            :         else
    3467                 :          0 :                 crtc_state->uapi.plane_mask &= ~drm_plane_mask(&plane->base);
    3468                 :            : }
    3469                 :            : 
    3470                 :          0 : static void fixup_active_planes(struct intel_crtc_state *crtc_state)
    3471                 :            : {
    3472                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    3473                 :          0 :         struct drm_plane *plane;
    3474                 :            : 
    3475                 :            :         /*
    3476                 :            :          * Active_planes aliases if multiple "primary" or cursor planes
    3477                 :            :          * have been used on the same (or wrong) pipe. plane_mask uses
    3478                 :            :          * unique ids, hence we can use that to reconstruct active_planes.
    3479                 :            :          */
    3480                 :          0 :         crtc_state->active_planes = 0;
    3481                 :            : 
    3482   [ #  #  #  # ]:          0 :         drm_for_each_plane_mask(plane, &dev_priv->drm,
    3483                 :            :                                 crtc_state->uapi.plane_mask)
    3484                 :          0 :                 crtc_state->active_planes |= BIT(to_intel_plane(plane)->id);
    3485                 :          0 : }
    3486                 :            : 
    3487                 :          0 : static void intel_plane_disable_noatomic(struct intel_crtc *crtc,
    3488                 :            :                                          struct intel_plane *plane)
    3489                 :            : {
    3490                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    3491                 :          0 :         struct intel_crtc_state *crtc_state =
    3492                 :          0 :                 to_intel_crtc_state(crtc->base.state);
    3493                 :          0 :         struct intel_plane_state *plane_state =
    3494                 :          0 :                 to_intel_plane_state(plane->base.state);
    3495                 :            : 
    3496                 :          0 :         DRM_DEBUG_KMS("Disabling [PLANE:%d:%s] on [CRTC:%d:%s]\n",
    3497                 :            :                       plane->base.base.id, plane->base.name,
    3498                 :            :                       crtc->base.base.id, crtc->base.name);
    3499                 :            : 
    3500                 :          0 :         intel_set_plane_visible(crtc_state, plane_state, false);
    3501                 :          0 :         fixup_active_planes(crtc_state);
    3502                 :          0 :         crtc_state->data_rate[plane->id] = 0;
    3503                 :          0 :         crtc_state->min_cdclk[plane->id] = 0;
    3504                 :            : 
    3505         [ #  # ]:          0 :         if (plane->id == PLANE_PRIMARY)
    3506                 :          0 :                 hsw_disable_ips(crtc_state);
    3507                 :            : 
    3508                 :            :         /*
    3509                 :            :          * Vblank time updates from the shadow to live plane control register
    3510                 :            :          * are blocked if the memory self-refresh mode is active at that
    3511                 :            :          * moment. So to make sure the plane gets truly disabled, disable
    3512                 :            :          * first the self-refresh mode. The self-refresh enable bit in turn
    3513                 :            :          * will be checked/applied by the HW only at the next frame start
    3514                 :            :          * event which is after the vblank start event, so we need to have a
    3515                 :            :          * wait-for-vblank between disabling the plane and the pipe.
    3516                 :            :          */
    3517   [ #  #  #  # ]:          0 :         if (HAS_GMCH(dev_priv) &&
    3518                 :          0 :             intel_set_memory_cxsr(dev_priv, false))
    3519                 :          0 :                 intel_wait_for_vblank(dev_priv, crtc->pipe);
    3520                 :            : 
    3521                 :            :         /*
    3522                 :            :          * Gen2 reports pipe underruns whenever all planes are disabled.
    3523                 :            :          * So disable underrun reporting before all the planes get disabled.
    3524                 :            :          */
    3525   [ #  #  #  # ]:          0 :         if (IS_GEN(dev_priv, 2) && !crtc_state->active_planes)
    3526                 :          0 :                 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
    3527                 :            : 
    3528                 :          0 :         intel_disable_plane(plane, crtc_state);
    3529                 :          0 : }
    3530                 :            : 
    3531                 :            : static struct intel_frontbuffer *
    3532                 :          0 : to_intel_frontbuffer(struct drm_framebuffer *fb)
    3533                 :            : {
    3534                 :          0 :         return fb ? to_intel_framebuffer(fb)->frontbuffer : NULL;
    3535                 :            : }
    3536                 :            : 
    3537                 :            : static void
    3538                 :          0 : intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
    3539                 :            :                              struct intel_initial_plane_config *plane_config)
    3540                 :            : {
    3541                 :          0 :         struct drm_device *dev = intel_crtc->base.dev;
    3542         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    3543                 :          0 :         struct drm_crtc *c;
    3544                 :          0 :         struct drm_plane *primary = intel_crtc->base.primary;
    3545                 :          0 :         struct drm_plane_state *plane_state = primary->state;
    3546                 :          0 :         struct intel_plane *intel_plane = to_intel_plane(primary);
    3547                 :          0 :         struct intel_plane_state *intel_state =
    3548                 :          0 :                 to_intel_plane_state(plane_state);
    3549                 :          0 :         struct drm_framebuffer *fb;
    3550                 :            : 
    3551         [ #  # ]:          0 :         if (!plane_config->fb)
    3552                 :            :                 return;
    3553                 :            : 
    3554         [ #  # ]:          0 :         if (intel_alloc_initial_plane_obj(intel_crtc, plane_config)) {
    3555                 :          0 :                 fb = &plane_config->fb->base;
    3556                 :          0 :                 goto valid_fb;
    3557                 :            :         }
    3558                 :            : 
    3559                 :          0 :         kfree(plane_config->fb);
    3560                 :            : 
    3561                 :            :         /*
    3562                 :            :          * Failed to alloc the obj, check to see if we should share
    3563                 :            :          * an fb with another CRTC instead
    3564                 :            :          */
    3565         [ #  # ]:          0 :         for_each_crtc(dev, c) {
    3566                 :          0 :                 struct intel_plane_state *state;
    3567                 :            : 
    3568         [ #  # ]:          0 :                 if (c == &intel_crtc->base)
    3569                 :          0 :                         continue;
    3570                 :            : 
    3571         [ #  # ]:          0 :                 if (!to_intel_crtc(c)->active)
    3572                 :          0 :                         continue;
    3573                 :            : 
    3574                 :          0 :                 state = to_intel_plane_state(c->primary->state);
    3575         [ #  # ]:          0 :                 if (!state->vma)
    3576                 :          0 :                         continue;
    3577                 :            : 
    3578         [ #  # ]:          0 :                 if (intel_plane_ggtt_offset(state) == plane_config->base) {
    3579                 :          0 :                         fb = state->hw.fb;
    3580                 :          0 :                         drm_framebuffer_get(fb);
    3581                 :          0 :                         goto valid_fb;
    3582                 :            :                 }
    3583                 :            :         }
    3584                 :            : 
    3585                 :            :         /*
    3586                 :            :          * We've failed to reconstruct the BIOS FB.  Current display state
    3587                 :            :          * indicates that the primary plane is visible, but has a NULL FB,
    3588                 :            :          * which will lead to problems later if we don't fix it up.  The
    3589                 :            :          * simplest solution is to just disable the primary plane now and
    3590                 :            :          * pretend the BIOS never had it enabled.
    3591                 :            :          */
    3592                 :          0 :         intel_plane_disable_noatomic(intel_crtc, intel_plane);
    3593                 :            : 
    3594                 :          0 :         return;
    3595                 :            : 
    3596                 :          0 : valid_fb:
    3597                 :          0 :         intel_state->hw.rotation = plane_config->rotation;
    3598         [ #  # ]:          0 :         intel_fill_fb_ggtt_view(&intel_state->view, fb,
    3599                 :            :                                 intel_state->hw.rotation);
    3600         [ #  # ]:          0 :         intel_state->color_plane[0].stride =
    3601                 :          0 :                 intel_fb_pitch(fb, 0, intel_state->hw.rotation);
    3602                 :            : 
    3603                 :          0 :         intel_state->vma =
    3604                 :          0 :                 intel_pin_and_fence_fb_obj(fb,
    3605                 :            :                                            &intel_state->view,
    3606         [ #  # ]:          0 :                                            intel_plane_uses_fence(intel_state),
    3607                 :            :                                            &intel_state->flags);
    3608         [ #  # ]:          0 :         if (IS_ERR(intel_state->vma)) {
    3609                 :          0 :                 DRM_ERROR("failed to pin boot fb on pipe %d: %li\n",
    3610                 :            :                           intel_crtc->pipe, PTR_ERR(intel_state->vma));
    3611                 :            : 
    3612                 :          0 :                 intel_state->vma = NULL;
    3613                 :          0 :                 drm_framebuffer_put(fb);
    3614                 :          0 :                 return;
    3615                 :            :         }
    3616                 :            : 
    3617         [ #  # ]:          0 :         intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB);
    3618                 :            : 
    3619                 :          0 :         plane_state->src_x = 0;
    3620                 :          0 :         plane_state->src_y = 0;
    3621                 :          0 :         plane_state->src_w = fb->width << 16;
    3622                 :          0 :         plane_state->src_h = fb->height << 16;
    3623                 :            : 
    3624                 :          0 :         plane_state->crtc_x = 0;
    3625                 :          0 :         plane_state->crtc_y = 0;
    3626                 :          0 :         plane_state->crtc_w = fb->width;
    3627                 :          0 :         plane_state->crtc_h = fb->height;
    3628                 :            : 
    3629         [ #  # ]:          0 :         intel_state->uapi.src = drm_plane_state_src(plane_state);
    3630         [ #  # ]:          0 :         intel_state->uapi.dst = drm_plane_state_dest(plane_state);
    3631                 :            : 
    3632         [ #  # ]:          0 :         if (plane_config->tiling)
    3633                 :          0 :                 dev_priv->preserve_bios_swizzle = true;
    3634                 :            : 
    3635                 :          0 :         plane_state->fb = fb;
    3636                 :          0 :         plane_state->crtc = &intel_crtc->base;
    3637                 :          0 :         intel_plane_copy_uapi_to_hw_state(intel_state, intel_state);
    3638                 :            : 
    3639         [ #  # ]:          0 :         atomic_or(to_intel_plane(primary)->frontbuffer_bit,
    3640                 :            :                   &to_intel_frontbuffer(fb)->bits);
    3641                 :            : }
    3642                 :            : 
    3643                 :            : static int skl_max_plane_width(const struct drm_framebuffer *fb,
    3644                 :            :                                int color_plane,
    3645                 :            :                                unsigned int rotation)
    3646                 :            : {
    3647                 :            :         int cpp = fb->format->cpp[color_plane];
    3648                 :            : 
    3649                 :            :         switch (fb->modifier) {
    3650                 :            :         case DRM_FORMAT_MOD_LINEAR:
    3651                 :            :         case I915_FORMAT_MOD_X_TILED:
    3652                 :            :                 /*
    3653                 :            :                  * Validated limit is 4k, but has 5k should
    3654                 :            :                  * work apart from the following features:
    3655                 :            :                  * - Ytile (already limited to 4k)
    3656                 :            :                  * - FP16 (already limited to 4k)
    3657                 :            :                  * - render compression (already limited to 4k)
    3658                 :            :                  * - KVMR sprite and cursor (don't care)
    3659                 :            :                  * - horizontal panning (TODO verify this)
    3660                 :            :                  * - pipe and plane scaling (TODO verify this)
    3661                 :            :                  */
    3662                 :            :                 if (cpp == 8)
    3663                 :            :                         return 4096;
    3664                 :            :                 else
    3665                 :            :                         return 5120;
    3666                 :            :         case I915_FORMAT_MOD_Y_TILED_CCS:
    3667                 :            :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    3668                 :            :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    3669                 :            :                 /* FIXME AUX plane? */
    3670                 :            :         case I915_FORMAT_MOD_Y_TILED:
    3671                 :            :         case I915_FORMAT_MOD_Yf_TILED:
    3672                 :            :                 if (cpp == 8)
    3673                 :            :                         return 2048;
    3674                 :            :                 else
    3675                 :            :                         return 4096;
    3676                 :            :         default:
    3677                 :            :                 MISSING_CASE(fb->modifier);
    3678                 :            :                 return 2048;
    3679                 :            :         }
    3680                 :            : }
    3681                 :            : 
    3682                 :            : static int glk_max_plane_width(const struct drm_framebuffer *fb,
    3683                 :            :                                int color_plane,
    3684                 :            :                                unsigned int rotation)
    3685                 :            : {
    3686                 :            :         int cpp = fb->format->cpp[color_plane];
    3687                 :            : 
    3688                 :            :         switch (fb->modifier) {
    3689                 :            :         case DRM_FORMAT_MOD_LINEAR:
    3690                 :            :         case I915_FORMAT_MOD_X_TILED:
    3691                 :            :                 if (cpp == 8)
    3692                 :            :                         return 4096;
    3693                 :            :                 else
    3694                 :            :                         return 5120;
    3695                 :            :         case I915_FORMAT_MOD_Y_TILED_CCS:
    3696                 :            :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    3697                 :            :                 /* FIXME AUX plane? */
    3698                 :            :         case I915_FORMAT_MOD_Y_TILED:
    3699                 :            :         case I915_FORMAT_MOD_Yf_TILED:
    3700                 :            :                 if (cpp == 8)
    3701                 :            :                         return 2048;
    3702                 :            :                 else
    3703                 :            :                         return 5120;
    3704                 :            :         default:
    3705                 :            :                 MISSING_CASE(fb->modifier);
    3706                 :            :                 return 2048;
    3707                 :            :         }
    3708                 :            : }
    3709                 :            : 
    3710                 :            : static int icl_max_plane_width(const struct drm_framebuffer *fb,
    3711                 :            :                                int color_plane,
    3712                 :            :                                unsigned int rotation)
    3713                 :            : {
    3714                 :            :         return 5120;
    3715                 :            : }
    3716                 :            : 
    3717                 :          0 : static int skl_max_plane_height(void)
    3718                 :            : {
    3719                 :          0 :         return 4096;
    3720                 :            : }
    3721                 :            : 
    3722                 :            : static int icl_max_plane_height(void)
    3723                 :            : {
    3724                 :            :         return 4320;
    3725                 :            : }
    3726                 :            : 
    3727                 :            : static bool
    3728                 :          0 : skl_check_main_ccs_coordinates(struct intel_plane_state *plane_state,
    3729                 :            :                                int main_x, int main_y, u32 main_offset,
    3730                 :            :                                int ccs_plane)
    3731                 :            : {
    3732                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    3733                 :          0 :         int aux_x = plane_state->color_plane[ccs_plane].x;
    3734                 :          0 :         int aux_y = plane_state->color_plane[ccs_plane].y;
    3735                 :          0 :         u32 aux_offset = plane_state->color_plane[ccs_plane].offset;
    3736                 :          0 :         u32 alignment = intel_surf_alignment(fb, ccs_plane);
    3737                 :          0 :         int hsub;
    3738                 :          0 :         int vsub;
    3739                 :            : 
    3740                 :          0 :         intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
    3741         [ #  # ]:          0 :         while (aux_offset >= main_offset && aux_y <= main_y) {
    3742                 :          0 :                 int x, y;
    3743                 :            : 
    3744         [ #  # ]:          0 :                 if (aux_x == main_x && aux_y == main_y)
    3745                 :            :                         break;
    3746                 :            : 
    3747         [ #  # ]:          0 :                 if (aux_offset == 0)
    3748                 :            :                         break;
    3749                 :            : 
    3750                 :          0 :                 x = aux_x / hsub;
    3751                 :          0 :                 y = aux_y / vsub;
    3752                 :          0 :                 aux_offset = intel_plane_adjust_aligned_offset(&x, &y,
    3753                 :            :                                                                plane_state,
    3754                 :            :                                                                ccs_plane,
    3755                 :            :                                                                aux_offset,
    3756                 :            :                                                                aux_offset -
    3757                 :            :                                                                 alignment);
    3758                 :          0 :                 aux_x = x * hsub + aux_x % hsub;
    3759                 :          0 :                 aux_y = y * vsub + aux_y % vsub;
    3760                 :            :         }
    3761                 :            : 
    3762         [ #  # ]:          0 :         if (aux_x != main_x || aux_y != main_y)
    3763                 :            :                 return false;
    3764                 :            : 
    3765                 :          0 :         plane_state->color_plane[ccs_plane].offset = aux_offset;
    3766                 :          0 :         plane_state->color_plane[ccs_plane].x = aux_x;
    3767                 :          0 :         plane_state->color_plane[ccs_plane].y = aux_y;
    3768                 :            : 
    3769                 :          0 :         return true;
    3770                 :            : }
    3771                 :            : 
    3772                 :          0 : static int skl_check_main_surface(struct intel_plane_state *plane_state)
    3773                 :            : {
    3774                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane_state->uapi.plane->dev);
    3775                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    3776                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    3777                 :          0 :         int x = plane_state->uapi.src.x1 >> 16;
    3778                 :          0 :         int y = plane_state->uapi.src.y1 >> 16;
    3779                 :          0 :         int w = drm_rect_width(&plane_state->uapi.src) >> 16;
    3780                 :          0 :         int h = drm_rect_height(&plane_state->uapi.src) >> 16;
    3781                 :          0 :         int max_width;
    3782                 :          0 :         int max_height;
    3783                 :          0 :         u32 alignment;
    3784                 :          0 :         u32 offset;
    3785                 :          0 :         int aux_plane = intel_main_to_aux_plane(fb, 0);
    3786                 :          0 :         u32 aux_offset = plane_state->color_plane[aux_plane].offset;
    3787                 :            : 
    3788         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    3789                 :            :                 max_width = icl_max_plane_width(fb, 0, rotation);
    3790   [ #  #  #  # ]:          0 :         else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
    3791                 :          0 :                 max_width = glk_max_plane_width(fb, 0, rotation);
    3792                 :            :         else
    3793                 :          0 :                 max_width = skl_max_plane_width(fb, 0, rotation);
    3794                 :            : 
    3795         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    3796                 :            :                 max_height = icl_max_plane_height();
    3797                 :            :         else
    3798                 :          0 :                 max_height = skl_max_plane_height();
    3799                 :            : 
    3800         [ #  # ]:          0 :         if (w > max_width || h > max_height) {
    3801                 :          0 :                 DRM_DEBUG_KMS("requested Y/RGB source size %dx%d too big (limit %dx%d)\n",
    3802                 :            :                               w, h, max_width, max_height);
    3803                 :          0 :                 return -EINVAL;
    3804                 :            :         }
    3805                 :            : 
    3806                 :          0 :         intel_add_fb_offsets(&x, &y, plane_state, 0);
    3807                 :          0 :         offset = intel_plane_compute_aligned_offset(&x, &y, plane_state, 0);
    3808                 :          0 :         alignment = intel_surf_alignment(fb, 0);
    3809   [ #  #  #  #  :          0 :         if (WARN_ON(alignment && !is_power_of_2(alignment)))
          #  #  #  #  #  
                      # ]
    3810                 :            :                 return -EINVAL;
    3811                 :            : 
    3812                 :            :         /*
    3813                 :            :          * AUX surface offset is specified as the distance from the
    3814                 :            :          * main surface offset, and it must be non-negative. Make
    3815                 :            :          * sure that is what we will get.
    3816                 :            :          */
    3817         [ #  # ]:          0 :         if (offset > aux_offset)
    3818                 :          0 :                 offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
    3819                 :          0 :                                                            offset, aux_offset & ~(alignment - 1));
    3820                 :            : 
    3821                 :            :         /*
    3822                 :            :          * When using an X-tiled surface, the plane blows up
    3823                 :            :          * if the x offset + width exceed the stride.
    3824                 :            :          *
    3825                 :            :          * TODO: linear and Y-tiled seem fine, Yf untested,
    3826                 :            :          */
    3827         [ #  # ]:          0 :         if (fb->modifier == I915_FORMAT_MOD_X_TILED) {
    3828                 :          0 :                 int cpp = fb->format->cpp[0];
    3829                 :            : 
    3830         [ #  # ]:          0 :                 while ((x + w) * cpp > plane_state->color_plane[0].stride) {
    3831         [ #  # ]:          0 :                         if (offset == 0) {
    3832                 :          0 :                                 DRM_DEBUG_KMS("Unable to find suitable display surface offset due to X-tiling\n");
    3833                 :          0 :                                 return -EINVAL;
    3834                 :            :                         }
    3835                 :            : 
    3836                 :          0 :                         offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
    3837                 :            :                                                                    offset, offset - alignment);
    3838                 :            :                 }
    3839                 :            :         }
    3840                 :            : 
    3841                 :            :         /*
    3842                 :            :          * CCS AUX surface doesn't have its own x/y offsets, we must make sure
    3843                 :            :          * they match with the main surface x/y offsets.
    3844                 :            :          */
    3845   [ #  #  #  # ]:          0 :         if (is_ccs_modifier(fb->modifier)) {
    3846         [ #  # ]:          0 :                 while (!skl_check_main_ccs_coordinates(plane_state, x, y,
    3847                 :            :                                                        offset, aux_plane)) {
    3848         [ #  # ]:          0 :                         if (offset == 0)
    3849                 :            :                                 break;
    3850                 :            : 
    3851                 :          0 :                         offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
    3852                 :            :                                                                    offset, offset - alignment);
    3853                 :            :                 }
    3854                 :            : 
    3855         [ #  # ]:          0 :                 if (x != plane_state->color_plane[aux_plane].x ||
    3856         [ #  # ]:          0 :                     y != plane_state->color_plane[aux_plane].y) {
    3857                 :          0 :                         DRM_DEBUG_KMS("Unable to find suitable display surface offset due to CCS\n");
    3858                 :          0 :                         return -EINVAL;
    3859                 :            :                 }
    3860                 :            :         }
    3861                 :            : 
    3862                 :          0 :         plane_state->color_plane[0].offset = offset;
    3863                 :          0 :         plane_state->color_plane[0].x = x;
    3864                 :          0 :         plane_state->color_plane[0].y = y;
    3865                 :            : 
    3866                 :            :         /*
    3867                 :            :          * Put the final coordinates back so that the src
    3868                 :            :          * coordinate checks will see the right values.
    3869                 :            :          */
    3870                 :          0 :         drm_rect_translate_to(&plane_state->uapi.src,
    3871                 :            :                               x << 16, y << 16);
    3872                 :            : 
    3873                 :          0 :         return 0;
    3874                 :            : }
    3875                 :            : 
    3876                 :          0 : static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
    3877                 :            : {
    3878                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    3879                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    3880                 :          0 :         int uv_plane = 1;
    3881                 :          0 :         int max_width = skl_max_plane_width(fb, uv_plane, rotation);
    3882                 :          0 :         int max_height = 4096;
    3883                 :          0 :         int x = plane_state->uapi.src.x1 >> 17;
    3884                 :          0 :         int y = plane_state->uapi.src.y1 >> 17;
    3885                 :          0 :         int w = drm_rect_width(&plane_state->uapi.src) >> 17;
    3886                 :          0 :         int h = drm_rect_height(&plane_state->uapi.src) >> 17;
    3887                 :          0 :         u32 offset;
    3888                 :            : 
    3889                 :          0 :         intel_add_fb_offsets(&x, &y, plane_state, uv_plane);
    3890                 :          0 :         offset = intel_plane_compute_aligned_offset(&x, &y,
    3891                 :            :                                                     plane_state, uv_plane);
    3892                 :            : 
    3893                 :            :         /* FIXME not quite sure how/if these apply to the chroma plane */
    3894         [ #  # ]:          0 :         if (w > max_width || h > max_height) {
    3895                 :          0 :                 DRM_DEBUG_KMS("CbCr source size %dx%d too big (limit %dx%d)\n",
    3896                 :            :                               w, h, max_width, max_height);
    3897                 :          0 :                 return -EINVAL;
    3898                 :            :         }
    3899                 :            : 
    3900   [ #  #  #  # ]:          0 :         if (is_ccs_modifier(fb->modifier)) {
    3901                 :          0 :                 int ccs_plane = main_to_ccs_plane(fb, uv_plane);
    3902                 :          0 :                 int aux_offset = plane_state->color_plane[ccs_plane].offset;
    3903                 :          0 :                 int alignment = intel_surf_alignment(fb, uv_plane);
    3904                 :            : 
    3905         [ #  # ]:          0 :                 if (offset > aux_offset)
    3906                 :          0 :                         offset = intel_plane_adjust_aligned_offset(&x, &y,
    3907                 :            :                                                                    plane_state,
    3908                 :            :                                                                    uv_plane,
    3909                 :            :                                                                    offset,
    3910                 :          0 :                                                                    aux_offset & ~(alignment - 1));
    3911                 :            : 
    3912         [ #  # ]:          0 :                 while (!skl_check_main_ccs_coordinates(plane_state, x, y,
    3913                 :            :                                                        offset, ccs_plane)) {
    3914         [ #  # ]:          0 :                         if (offset == 0)
    3915                 :            :                                 break;
    3916                 :            : 
    3917                 :          0 :                         offset = intel_plane_adjust_aligned_offset(&x, &y,
    3918                 :            :                                                                    plane_state,
    3919                 :            :                                                                    uv_plane,
    3920                 :            :                                                                    offset, offset - alignment);
    3921                 :            :                 }
    3922                 :            : 
    3923         [ #  # ]:          0 :                 if (x != plane_state->color_plane[ccs_plane].x ||
    3924         [ #  # ]:          0 :                     y != plane_state->color_plane[ccs_plane].y) {
    3925                 :          0 :                         DRM_DEBUG_KMS("Unable to find suitable display surface offset due to CCS\n");
    3926                 :          0 :                         return -EINVAL;
    3927                 :            :                 }
    3928                 :            :         }
    3929                 :            : 
    3930                 :          0 :         plane_state->color_plane[uv_plane].offset = offset;
    3931                 :          0 :         plane_state->color_plane[uv_plane].x = x;
    3932                 :          0 :         plane_state->color_plane[uv_plane].y = y;
    3933                 :            : 
    3934                 :          0 :         return 0;
    3935                 :            : }
    3936                 :            : 
    3937                 :          0 : static int skl_check_ccs_aux_surface(struct intel_plane_state *plane_state)
    3938                 :            : {
    3939                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    3940                 :          0 :         int src_x = plane_state->uapi.src.x1 >> 16;
    3941                 :          0 :         int src_y = plane_state->uapi.src.y1 >> 16;
    3942                 :          0 :         u32 offset;
    3943                 :          0 :         int ccs_plane;
    3944                 :            : 
    3945         [ #  # ]:          0 :         for (ccs_plane = 0; ccs_plane < fb->format->num_planes; ccs_plane++) {
    3946                 :          0 :                 int main_hsub, main_vsub;
    3947                 :          0 :                 int hsub, vsub;
    3948                 :          0 :                 int x, y;
    3949                 :            : 
    3950   [ #  #  #  # ]:          0 :                 if (!is_ccs_plane(fb, ccs_plane))
    3951                 :          0 :                         continue;
    3952                 :            : 
    3953                 :          0 :                 intel_fb_plane_get_subsampling(&main_hsub, &main_vsub, fb,
    3954                 :            :                                                ccs_to_main_plane(fb, ccs_plane));
    3955                 :          0 :                 intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
    3956                 :            : 
    3957                 :          0 :                 hsub *= main_hsub;
    3958                 :          0 :                 vsub *= main_vsub;
    3959                 :          0 :                 x = src_x / hsub;
    3960                 :          0 :                 y = src_y / vsub;
    3961                 :            : 
    3962                 :          0 :                 intel_add_fb_offsets(&x, &y, plane_state, ccs_plane);
    3963                 :            : 
    3964                 :          0 :                 offset = intel_plane_compute_aligned_offset(&x, &y,
    3965                 :            :                                                             plane_state,
    3966                 :            :                                                             ccs_plane);
    3967                 :            : 
    3968                 :          0 :                 plane_state->color_plane[ccs_plane].offset = offset;
    3969                 :          0 :                 plane_state->color_plane[ccs_plane].x = (x * hsub +
    3970                 :          0 :                                                          src_x % hsub) /
    3971                 :            :                                                         main_hsub;
    3972                 :          0 :                 plane_state->color_plane[ccs_plane].y = (y * vsub +
    3973                 :          0 :                                                          src_y % vsub) /
    3974                 :            :                                                         main_vsub;
    3975                 :            :         }
    3976                 :            : 
    3977                 :          0 :         return 0;
    3978                 :            : }
    3979                 :            : 
    3980                 :          0 : int skl_check_plane_surface(struct intel_plane_state *plane_state)
    3981                 :            : {
    3982                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    3983                 :          0 :         int ret;
    3984                 :          0 :         bool needs_aux = false;
    3985                 :            : 
    3986                 :          0 :         ret = intel_plane_compute_gtt(plane_state);
    3987         [ #  # ]:          0 :         if (ret)
    3988                 :            :                 return ret;
    3989                 :            : 
    3990         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
    3991                 :            :                 return 0;
    3992                 :            : 
    3993                 :            :         /*
    3994                 :            :          * Handle the AUX surface first since the main surface setup depends on
    3995                 :            :          * it.
    3996                 :            :          */
    3997   [ #  #  #  # ]:          0 :         if (is_ccs_modifier(fb->modifier)) {
    3998                 :          0 :                 needs_aux = true;
    3999                 :          0 :                 ret = skl_check_ccs_aux_surface(plane_state);
    4000         [ #  # ]:          0 :                 if (ret)
    4001                 :            :                         return ret;
    4002                 :            :         }
    4003                 :            : 
    4004   [ #  #  #  # ]:          0 :         if (intel_format_info_is_yuv_semiplanar(fb->format,
    4005                 :            :                                                 fb->modifier)) {
    4006                 :          0 :                 needs_aux = true;
    4007                 :          0 :                 ret = skl_check_nv12_aux_surface(plane_state);
    4008         [ #  # ]:          0 :                 if (ret)
    4009                 :            :                         return ret;
    4010                 :            :         }
    4011                 :            : 
    4012         [ #  # ]:          0 :         if (!needs_aux) {
    4013                 :            :                 int i;
    4014                 :            : 
    4015         [ #  # ]:          0 :                 for (i = 1; i < fb->format->num_planes; i++) {
    4016                 :          0 :                         plane_state->color_plane[i].offset = ~0xfff;
    4017                 :          0 :                         plane_state->color_plane[i].x = 0;
    4018                 :          0 :                         plane_state->color_plane[i].y = 0;
    4019                 :            :                 }
    4020                 :            :         }
    4021                 :            : 
    4022                 :          0 :         ret = skl_check_main_surface(plane_state);
    4023         [ #  # ]:          0 :         if (ret)
    4024                 :          0 :                 return ret;
    4025                 :            : 
    4026                 :            :         return 0;
    4027                 :            : }
    4028                 :            : 
    4029                 :          0 : static void i9xx_plane_ratio(const struct intel_crtc_state *crtc_state,
    4030                 :            :                              const struct intel_plane_state *plane_state,
    4031                 :            :                              unsigned int *num, unsigned int *den)
    4032                 :            : {
    4033                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4034                 :          0 :         unsigned int cpp = fb->format->cpp[0];
    4035                 :            : 
    4036                 :            :         /*
    4037                 :            :          * g4x bspec says 64bpp pixel rate can't exceed 80%
    4038                 :            :          * of cdclk when the sprite plane is enabled on the
    4039                 :            :          * same pipe. ilk/snb bspec says 64bpp pixel rate is
    4040                 :            :          * never allowed to exceed 80% of cdclk. Let's just go
    4041                 :            :          * with the ilk/snb limit always.
    4042                 :            :          */
    4043                 :          0 :         if (cpp == 8) {
    4044                 :            :                 *num = 10;
    4045                 :            :                 *den = 8;
    4046                 :            :         } else {
    4047                 :          0 :                 *num = 1;
    4048                 :          0 :                 *den = 1;
    4049                 :            :         }
    4050                 :            : }
    4051                 :            : 
    4052                 :          0 : static int i9xx_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
    4053                 :            :                                 const struct intel_plane_state *plane_state)
    4054                 :            : {
    4055                 :          0 :         unsigned int pixel_rate;
    4056                 :          0 :         unsigned int num, den;
    4057                 :            : 
    4058                 :            :         /*
    4059                 :            :          * Note that crtc_state->pixel_rate accounts for both
    4060                 :            :          * horizontal and vertical panel fitter downscaling factors.
    4061                 :            :          * Pre-HSW bspec tells us to only consider the horizontal
    4062                 :            :          * downscaling factor here. We ignore that and just consider
    4063                 :            :          * both for simplicity.
    4064                 :            :          */
    4065                 :          0 :         pixel_rate = crtc_state->pixel_rate;
    4066                 :            : 
    4067         [ #  # ]:          0 :         i9xx_plane_ratio(crtc_state, plane_state, &num, &den);
    4068                 :            : 
    4069                 :            :         /* two pixels per clock with double wide pipe */
    4070         [ #  # ]:          0 :         if (crtc_state->double_wide)
    4071                 :          0 :                 den *= 2;
    4072                 :            : 
    4073                 :          0 :         return DIV_ROUND_UP(pixel_rate * num, den);
    4074                 :            : }
    4075                 :            : 
    4076                 :            : unsigned int
    4077                 :          0 : i9xx_plane_max_stride(struct intel_plane *plane,
    4078                 :            :                       u32 pixel_format, u64 modifier,
    4079                 :            :                       unsigned int rotation)
    4080                 :            : {
    4081         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    4082                 :            : 
    4083         [ #  # ]:          0 :         if (!HAS_GMCH(dev_priv)) {
    4084                 :            :                 return 32*1024;
    4085         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 4) {
    4086         [ #  # ]:          0 :                 if (modifier == I915_FORMAT_MOD_X_TILED)
    4087                 :            :                         return 16*1024;
    4088                 :            :                 else
    4089                 :          0 :                         return 32*1024;
    4090         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 3) {
    4091         [ #  # ]:          0 :                 if (modifier == I915_FORMAT_MOD_X_TILED)
    4092                 :            :                         return 8*1024;
    4093                 :            :                 else
    4094                 :          0 :                         return 16*1024;
    4095                 :            :         } else {
    4096         [ #  # ]:          0 :                 if (plane->i9xx_plane == PLANE_C)
    4097                 :            :                         return 4*1024;
    4098                 :            :                 else
    4099                 :          0 :                         return 8*1024;
    4100                 :            :         }
    4101                 :            : }
    4102                 :            : 
    4103                 :          0 : static u32 i9xx_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
    4104                 :            : {
    4105                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    4106                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    4107                 :          0 :         u32 dspcntr = 0;
    4108                 :            : 
    4109                 :          0 :         if (crtc_state->gamma_enable)
    4110                 :          0 :                 dspcntr |= DISPPLANE_GAMMA_ENABLE;
    4111                 :            : 
    4112   [ #  #  #  # ]:          0 :         if (crtc_state->csc_enable)
    4113                 :          0 :                 dspcntr |= DISPPLANE_PIPE_CSC_ENABLE;
    4114                 :            : 
    4115   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 5)
    4116                 :          0 :                 dspcntr |= DISPPLANE_SEL_PIPE(crtc->pipe);
    4117                 :            : 
    4118                 :          0 :         return dspcntr;
    4119                 :            : }
    4120                 :            : 
    4121                 :            : static u32 i9xx_plane_ctl(const struct intel_crtc_state *crtc_state,
    4122                 :            :                           const struct intel_plane_state *plane_state)
    4123                 :            : {
    4124                 :            :         struct drm_i915_private *dev_priv =
    4125                 :            :                 to_i915(plane_state->uapi.plane->dev);
    4126                 :            :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4127                 :            :         unsigned int rotation = plane_state->hw.rotation;
    4128                 :            :         u32 dspcntr;
    4129                 :            : 
    4130                 :            :         dspcntr = DISPLAY_PLANE_ENABLE;
    4131                 :            : 
    4132                 :            :         if (IS_G4X(dev_priv) || IS_GEN(dev_priv, 5) ||
    4133                 :            :             IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
    4134                 :            :                 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
    4135                 :            : 
    4136                 :            :         switch (fb->format->format) {
    4137                 :            :         case DRM_FORMAT_C8:
    4138                 :            :                 dspcntr |= DISPPLANE_8BPP;
    4139                 :            :                 break;
    4140                 :            :         case DRM_FORMAT_XRGB1555:
    4141                 :            :                 dspcntr |= DISPPLANE_BGRX555;
    4142                 :            :                 break;
    4143                 :            :         case DRM_FORMAT_ARGB1555:
    4144                 :            :                 dspcntr |= DISPPLANE_BGRA555;
    4145                 :            :                 break;
    4146                 :            :         case DRM_FORMAT_RGB565:
    4147                 :            :                 dspcntr |= DISPPLANE_BGRX565;
    4148                 :            :                 break;
    4149                 :            :         case DRM_FORMAT_XRGB8888:
    4150                 :            :                 dspcntr |= DISPPLANE_BGRX888;
    4151                 :            :                 break;
    4152                 :            :         case DRM_FORMAT_XBGR8888:
    4153                 :            :                 dspcntr |= DISPPLANE_RGBX888;
    4154                 :            :                 break;
    4155                 :            :         case DRM_FORMAT_ARGB8888:
    4156                 :            :                 dspcntr |= DISPPLANE_BGRA888;
    4157                 :            :                 break;
    4158                 :            :         case DRM_FORMAT_ABGR8888:
    4159                 :            :                 dspcntr |= DISPPLANE_RGBA888;
    4160                 :            :                 break;
    4161                 :            :         case DRM_FORMAT_XRGB2101010:
    4162                 :            :                 dspcntr |= DISPPLANE_BGRX101010;
    4163                 :            :                 break;
    4164                 :            :         case DRM_FORMAT_XBGR2101010:
    4165                 :            :                 dspcntr |= DISPPLANE_RGBX101010;
    4166                 :            :                 break;
    4167                 :            :         case DRM_FORMAT_ARGB2101010:
    4168                 :            :                 dspcntr |= DISPPLANE_BGRA101010;
    4169                 :            :                 break;
    4170                 :            :         case DRM_FORMAT_ABGR2101010:
    4171                 :            :                 dspcntr |= DISPPLANE_RGBA101010;
    4172                 :            :                 break;
    4173                 :            :         case DRM_FORMAT_XBGR16161616F:
    4174                 :            :                 dspcntr |= DISPPLANE_RGBX161616;
    4175                 :            :                 break;
    4176                 :            :         default:
    4177                 :            :                 MISSING_CASE(fb->format->format);
    4178                 :            :                 return 0;
    4179                 :            :         }
    4180                 :            : 
    4181                 :            :         if (INTEL_GEN(dev_priv) >= 4 &&
    4182                 :            :             fb->modifier == I915_FORMAT_MOD_X_TILED)
    4183                 :            :                 dspcntr |= DISPPLANE_TILED;
    4184                 :            : 
    4185                 :            :         if (rotation & DRM_MODE_ROTATE_180)
    4186                 :            :                 dspcntr |= DISPPLANE_ROTATE_180;
    4187                 :            : 
    4188                 :            :         if (rotation & DRM_MODE_REFLECT_X)
    4189                 :            :                 dspcntr |= DISPPLANE_MIRROR;
    4190                 :            : 
    4191                 :            :         return dspcntr;
    4192                 :            : }
    4193                 :            : 
    4194                 :          0 : int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
    4195                 :            : {
    4196                 :          0 :         struct drm_i915_private *dev_priv =
    4197                 :          0 :                 to_i915(plane_state->uapi.plane->dev);
    4198                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4199                 :          0 :         int src_x, src_y, src_w;
    4200                 :          0 :         u32 offset;
    4201                 :          0 :         int ret;
    4202                 :            : 
    4203                 :          0 :         ret = intel_plane_compute_gtt(plane_state);
    4204         [ #  # ]:          0 :         if (ret)
    4205                 :            :                 return ret;
    4206                 :            : 
    4207         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
    4208                 :            :                 return 0;
    4209                 :            : 
    4210         [ #  # ]:          0 :         src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
    4211                 :          0 :         src_x = plane_state->uapi.src.x1 >> 16;
    4212                 :          0 :         src_y = plane_state->uapi.src.y1 >> 16;
    4213                 :            : 
    4214                 :            :         /* Undocumented hardware limit on i965/g4x/vlv/chv */
    4215   [ #  #  #  #  :          0 :         if (HAS_GMCH(dev_priv) && fb->format->cpp[0] == 8 && src_w > 2048)
                   #  # ]
    4216                 :            :                 return -EINVAL;
    4217                 :            : 
    4218                 :          0 :         intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
    4219                 :            : 
    4220         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
    4221                 :          0 :                 offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
    4222                 :            :                                                             plane_state, 0);
    4223                 :            :         else
    4224                 :            :                 offset = 0;
    4225                 :            : 
    4226                 :            :         /*
    4227                 :            :          * Put the final coordinates back so that the src
    4228                 :            :          * coordinate checks will see the right values.
    4229                 :            :          */
    4230         [ #  # ]:          0 :         drm_rect_translate_to(&plane_state->uapi.src,
    4231                 :            :                               src_x << 16, src_y << 16);
    4232                 :            : 
    4233                 :            :         /* HSW/BDW do this automagically in hardware */
    4234   [ #  #  #  # ]:          0 :         if (!IS_HASWELL(dev_priv) && !IS_BROADWELL(dev_priv)) {
    4235                 :          0 :                 unsigned int rotation = plane_state->hw.rotation;
    4236         [ #  # ]:          0 :                 int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
    4237         [ #  # ]:          0 :                 int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
    4238                 :            : 
    4239         [ #  # ]:          0 :                 if (rotation & DRM_MODE_ROTATE_180) {
    4240                 :          0 :                         src_x += src_w - 1;
    4241                 :          0 :                         src_y += src_h - 1;
    4242         [ #  # ]:          0 :                 } else if (rotation & DRM_MODE_REFLECT_X) {
    4243                 :          0 :                         src_x += src_w - 1;
    4244                 :            :                 }
    4245                 :            :         }
    4246                 :            : 
    4247                 :          0 :         plane_state->color_plane[0].offset = offset;
    4248                 :          0 :         plane_state->color_plane[0].x = src_x;
    4249                 :          0 :         plane_state->color_plane[0].y = src_y;
    4250                 :            : 
    4251                 :          0 :         return 0;
    4252                 :            : }
    4253                 :            : 
    4254                 :          0 : static bool i9xx_plane_has_windowing(struct intel_plane *plane)
    4255                 :            : {
    4256                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    4257                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    4258                 :            : 
    4259         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv))
    4260                 :          0 :                 return i9xx_plane == PLANE_B;
    4261   [ #  #  #  #  :          0 :         else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
                   #  # ]
    4262                 :            :                 return false;
    4263         [ #  # ]:          0 :         else if (IS_GEN(dev_priv, 4))
    4264                 :          0 :                 return i9xx_plane == PLANE_C;
    4265                 :            :         else
    4266                 :          0 :                 return i9xx_plane == PLANE_B ||
    4267                 :            :                         i9xx_plane == PLANE_C;
    4268                 :            : }
    4269                 :            : 
    4270                 :            : static int
    4271                 :          0 : i9xx_plane_check(struct intel_crtc_state *crtc_state,
    4272                 :            :                  struct intel_plane_state *plane_state)
    4273                 :            : {
    4274                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    4275                 :          0 :         int ret;
    4276                 :            : 
    4277                 :          0 :         ret = chv_plane_check_rotation(plane_state);
    4278         [ #  # ]:          0 :         if (ret)
    4279                 :            :                 return ret;
    4280                 :            : 
    4281                 :          0 :         ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
    4282                 :          0 :                                                   &crtc_state->uapi,
    4283                 :            :                                                   DRM_PLANE_HELPER_NO_SCALING,
    4284                 :            :                                                   DRM_PLANE_HELPER_NO_SCALING,
    4285         [ #  # ]:          0 :                                                   i9xx_plane_has_windowing(plane),
    4286                 :            :                                                   true);
    4287         [ #  # ]:          0 :         if (ret)
    4288                 :            :                 return ret;
    4289                 :            : 
    4290                 :          0 :         ret = i9xx_check_plane_surface(plane_state);
    4291         [ #  # ]:          0 :         if (ret)
    4292                 :            :                 return ret;
    4293                 :            : 
    4294         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
    4295                 :            :                 return 0;
    4296                 :            : 
    4297                 :          0 :         ret = intel_plane_check_src_coordinates(plane_state);
    4298         [ #  # ]:          0 :         if (ret)
    4299                 :            :                 return ret;
    4300                 :            : 
    4301                 :          0 :         plane_state->ctl = i9xx_plane_ctl(crtc_state, plane_state);
    4302                 :            : 
    4303                 :          0 :         return 0;
    4304                 :            : }
    4305                 :            : 
    4306                 :          0 : static void i9xx_update_plane(struct intel_plane *plane,
    4307                 :            :                               const struct intel_crtc_state *crtc_state,
    4308                 :            :                               const struct intel_plane_state *plane_state)
    4309                 :            : {
    4310         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    4311                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    4312                 :          0 :         u32 linear_offset;
    4313                 :          0 :         int x = plane_state->color_plane[0].x;
    4314                 :          0 :         int y = plane_state->color_plane[0].y;
    4315                 :          0 :         int crtc_x = plane_state->uapi.dst.x1;
    4316                 :          0 :         int crtc_y = plane_state->uapi.dst.y1;
    4317         [ #  # ]:          0 :         int crtc_w = drm_rect_width(&plane_state->uapi.dst);
    4318         [ #  # ]:          0 :         int crtc_h = drm_rect_height(&plane_state->uapi.dst);
    4319                 :          0 :         unsigned long irqflags;
    4320                 :          0 :         u32 dspaddr_offset;
    4321                 :          0 :         u32 dspcntr;
    4322                 :            : 
    4323         [ #  # ]:          0 :         dspcntr = plane_state->ctl | i9xx_plane_ctl_crtc(crtc_state);
    4324                 :            : 
    4325                 :          0 :         linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
    4326                 :            : 
    4327         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
    4328                 :          0 :                 dspaddr_offset = plane_state->color_plane[0].offset;
    4329                 :            :         else
    4330                 :            :                 dspaddr_offset = linear_offset;
    4331                 :            : 
    4332                 :          0 :         spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
    4333                 :            : 
    4334                 :          0 :         I915_WRITE_FW(DSPSTRIDE(i9xx_plane), plane_state->color_plane[0].stride);
    4335                 :            : 
    4336         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4) {
    4337                 :            :                 /*
    4338                 :            :                  * PLANE_A doesn't actually have a full window
    4339                 :            :                  * generator but let's assume we still need to
    4340                 :            :                  * program whatever is there.
    4341                 :            :                  */
    4342                 :          0 :                 I915_WRITE_FW(DSPPOS(i9xx_plane), (crtc_y << 16) | crtc_x);
    4343                 :          0 :                 I915_WRITE_FW(DSPSIZE(i9xx_plane),
    4344                 :            :                               ((crtc_h - 1) << 16) | (crtc_w - 1));
    4345   [ #  #  #  # ]:          0 :         } else if (IS_CHERRYVIEW(dev_priv) && i9xx_plane == PLANE_B) {
    4346                 :          0 :                 I915_WRITE_FW(PRIMPOS(i9xx_plane), (crtc_y << 16) | crtc_x);
    4347                 :          0 :                 I915_WRITE_FW(PRIMSIZE(i9xx_plane),
    4348                 :            :                               ((crtc_h - 1) << 16) | (crtc_w - 1));
    4349                 :          0 :                 I915_WRITE_FW(PRIMCNSTALPHA(i9xx_plane), 0);
    4350                 :            :         }
    4351                 :            : 
    4352   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
    4353                 :          0 :                 I915_WRITE_FW(DSPOFFSET(i9xx_plane), (y << 16) | x);
    4354         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 4) {
    4355                 :          0 :                 I915_WRITE_FW(DSPLINOFF(i9xx_plane), linear_offset);
    4356                 :          0 :                 I915_WRITE_FW(DSPTILEOFF(i9xx_plane), (y << 16) | x);
    4357                 :            :         }
    4358                 :            : 
    4359                 :            :         /*
    4360                 :            :          * The control register self-arms if the plane was previously
    4361                 :            :          * disabled. Try to make the plane enable atomic by writing
    4362                 :            :          * the control register just before the surface register.
    4363                 :            :          */
    4364                 :          0 :         I915_WRITE_FW(DSPCNTR(i9xx_plane), dspcntr);
    4365         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
    4366                 :          0 :                 I915_WRITE_FW(DSPSURF(i9xx_plane),
    4367                 :            :                               intel_plane_ggtt_offset(plane_state) +
    4368                 :            :                               dspaddr_offset);
    4369                 :            :         else
    4370                 :          0 :                 I915_WRITE_FW(DSPADDR(i9xx_plane),
    4371                 :            :                               intel_plane_ggtt_offset(plane_state) +
    4372                 :            :                               dspaddr_offset);
    4373                 :            : 
    4374                 :          0 :         spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
    4375                 :          0 : }
    4376                 :            : 
    4377                 :          0 : static void i9xx_disable_plane(struct intel_plane *plane,
    4378                 :            :                                const struct intel_crtc_state *crtc_state)
    4379                 :            : {
    4380         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    4381                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    4382                 :          0 :         unsigned long irqflags;
    4383                 :          0 :         u32 dspcntr;
    4384                 :            : 
    4385                 :            :         /*
    4386                 :            :          * DSPCNTR pipe gamma enable on g4x+ and pipe csc
    4387                 :            :          * enable on ilk+ affect the pipe bottom color as
    4388                 :            :          * well, so we must configure them even if the plane
    4389                 :            :          * is disabled.
    4390                 :            :          *
    4391                 :            :          * On pre-g4x there is no way to gamma correct the
    4392                 :            :          * pipe bottom color but we'll keep on doing this
    4393                 :            :          * anyway so that the crtc state readout works correctly.
    4394                 :            :          */
    4395         [ #  # ]:          0 :         dspcntr = i9xx_plane_ctl_crtc(crtc_state);
    4396                 :            : 
    4397                 :          0 :         spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
    4398                 :            : 
    4399                 :          0 :         I915_WRITE_FW(DSPCNTR(i9xx_plane), dspcntr);
    4400         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
    4401                 :          0 :                 I915_WRITE_FW(DSPSURF(i9xx_plane), 0);
    4402                 :            :         else
    4403                 :          0 :                 I915_WRITE_FW(DSPADDR(i9xx_plane), 0);
    4404                 :            : 
    4405                 :          0 :         spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
    4406                 :          0 : }
    4407                 :            : 
    4408                 :          0 : static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
    4409                 :            :                                     enum pipe *pipe)
    4410                 :            : {
    4411                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
    4412                 :          0 :         enum intel_display_power_domain power_domain;
    4413                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    4414                 :          0 :         intel_wakeref_t wakeref;
    4415                 :          0 :         bool ret;
    4416                 :          0 :         u32 val;
    4417                 :            : 
    4418                 :            :         /*
    4419                 :            :          * Not 100% correct for planes that can move between pipes,
    4420                 :            :          * but that's only the case for gen2-4 which don't have any
    4421                 :            :          * display power wells.
    4422                 :            :          */
    4423                 :          0 :         power_domain = POWER_DOMAIN_PIPE(plane->pipe);
    4424                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
    4425         [ #  # ]:          0 :         if (!wakeref)
    4426                 :            :                 return false;
    4427                 :            : 
    4428                 :          0 :         val = I915_READ(DSPCNTR(i9xx_plane));
    4429                 :            : 
    4430                 :          0 :         ret = val & DISPLAY_PLANE_ENABLE;
    4431                 :            : 
    4432         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 5)
    4433                 :          0 :                 *pipe = plane->pipe;
    4434                 :            :         else
    4435                 :          0 :                 *pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
    4436                 :            :                         DISPPLANE_SEL_PIPE_SHIFT;
    4437                 :            : 
    4438                 :          0 :         intel_display_power_put(dev_priv, power_domain, wakeref);
    4439                 :            : 
    4440                 :          0 :         return ret;
    4441                 :            : }
    4442                 :            : 
    4443                 :            : static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
    4444                 :            : {
    4445                 :            :         struct drm_device *dev = intel_crtc->base.dev;
    4446                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    4447                 :            : 
    4448                 :            :         I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, id), 0);
    4449                 :            :         I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, id), 0);
    4450                 :            :         I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, id), 0);
    4451                 :            : }
    4452                 :            : 
    4453                 :            : /*
    4454                 :            :  * This function detaches (aka. unbinds) unused scalers in hardware
    4455                 :            :  */
    4456                 :          0 : static void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
    4457                 :            : {
    4458                 :          0 :         struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
    4459                 :          0 :         const struct intel_crtc_scaler_state *scaler_state =
    4460                 :            :                 &crtc_state->scaler_state;
    4461                 :          0 :         int i;
    4462                 :            : 
    4463                 :            :         /* loop through and disable scalers that aren't in use */
    4464         [ #  # ]:          0 :         for (i = 0; i < intel_crtc->num_scalers; i++) {
    4465         [ #  # ]:          0 :                 if (!scaler_state->scalers[i].in_use)
    4466                 :          0 :                         skl_detach_scaler(intel_crtc, i);
    4467                 :            :         }
    4468                 :          0 : }
    4469                 :            : 
    4470                 :          0 : static unsigned int skl_plane_stride_mult(const struct drm_framebuffer *fb,
    4471                 :            :                                           int color_plane, unsigned int rotation)
    4472                 :            : {
    4473                 :            :         /*
    4474                 :            :          * The stride is either expressed as a multiple of 64 bytes chunks for
    4475                 :            :          * linear buffers or in number of tiles for tiled buffers.
    4476                 :            :          */
    4477   [ #  #  #  # ]:          0 :         if (is_surface_linear(fb, color_plane))
    4478                 :            :                 return 64;
    4479         [ #  # ]:          0 :         else if (drm_rotation_90_or_270(rotation))
    4480                 :          0 :                 return intel_tile_height(fb, color_plane);
    4481                 :            :         else
    4482                 :          0 :                 return intel_tile_width_bytes(fb, color_plane);
    4483                 :            : }
    4484                 :            : 
    4485                 :          0 : u32 skl_plane_stride(const struct intel_plane_state *plane_state,
    4486                 :            :                      int color_plane)
    4487                 :            : {
    4488                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4489                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    4490                 :          0 :         u32 stride = plane_state->color_plane[color_plane].stride;
    4491                 :            : 
    4492         [ #  # ]:          0 :         if (color_plane >= fb->format->num_planes)
    4493                 :            :                 return 0;
    4494                 :            : 
    4495                 :          0 :         return stride / skl_plane_stride_mult(fb, color_plane, rotation);
    4496                 :            : }
    4497                 :            : 
    4498                 :          0 : static u32 skl_plane_ctl_format(u32 pixel_format)
    4499                 :            : {
    4500   [ #  #  #  #  :          0 :         switch (pixel_format) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4501                 :            :         case DRM_FORMAT_C8:
    4502                 :            :                 return PLANE_CTL_FORMAT_INDEXED;
    4503                 :          0 :         case DRM_FORMAT_RGB565:
    4504                 :          0 :                 return PLANE_CTL_FORMAT_RGB_565;
    4505                 :          0 :         case DRM_FORMAT_XBGR8888:
    4506                 :            :         case DRM_FORMAT_ABGR8888:
    4507                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX;
    4508                 :          0 :         case DRM_FORMAT_XRGB8888:
    4509                 :            :         case DRM_FORMAT_ARGB8888:
    4510                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_8888;
    4511                 :          0 :         case DRM_FORMAT_XBGR2101010:
    4512                 :            :         case DRM_FORMAT_ABGR2101010:
    4513                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_2101010 | PLANE_CTL_ORDER_RGBX;
    4514                 :          0 :         case DRM_FORMAT_XRGB2101010:
    4515                 :            :         case DRM_FORMAT_ARGB2101010:
    4516                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_2101010;
    4517                 :          0 :         case DRM_FORMAT_XBGR16161616F:
    4518                 :            :         case DRM_FORMAT_ABGR16161616F:
    4519                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_16161616F | PLANE_CTL_ORDER_RGBX;
    4520                 :          0 :         case DRM_FORMAT_XRGB16161616F:
    4521                 :            :         case DRM_FORMAT_ARGB16161616F:
    4522                 :          0 :                 return PLANE_CTL_FORMAT_XRGB_16161616F;
    4523                 :          0 :         case DRM_FORMAT_YUYV:
    4524                 :          0 :                 return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YUYV;
    4525                 :          0 :         case DRM_FORMAT_YVYU:
    4526                 :          0 :                 return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YVYU;
    4527                 :          0 :         case DRM_FORMAT_UYVY:
    4528                 :          0 :                 return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_UYVY;
    4529                 :          0 :         case DRM_FORMAT_VYUY:
    4530                 :          0 :                 return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_VYUY;
    4531                 :          0 :         case DRM_FORMAT_NV12:
    4532                 :          0 :                 return PLANE_CTL_FORMAT_NV12;
    4533                 :          0 :         case DRM_FORMAT_P010:
    4534                 :          0 :                 return PLANE_CTL_FORMAT_P010;
    4535                 :          0 :         case DRM_FORMAT_P012:
    4536                 :          0 :                 return PLANE_CTL_FORMAT_P012;
    4537                 :          0 :         case DRM_FORMAT_P016:
    4538                 :          0 :                 return PLANE_CTL_FORMAT_P016;
    4539                 :          0 :         case DRM_FORMAT_Y210:
    4540                 :          0 :                 return PLANE_CTL_FORMAT_Y210;
    4541                 :          0 :         case DRM_FORMAT_Y212:
    4542                 :          0 :                 return PLANE_CTL_FORMAT_Y212;
    4543                 :          0 :         case DRM_FORMAT_Y216:
    4544                 :          0 :                 return PLANE_CTL_FORMAT_Y216;
    4545                 :          0 :         case DRM_FORMAT_XVYU2101010:
    4546                 :          0 :                 return PLANE_CTL_FORMAT_Y410;
    4547                 :          0 :         case DRM_FORMAT_XVYU12_16161616:
    4548                 :          0 :                 return PLANE_CTL_FORMAT_Y412;
    4549                 :          0 :         case DRM_FORMAT_XVYU16161616:
    4550                 :          0 :                 return PLANE_CTL_FORMAT_Y416;
    4551                 :            :         default:
    4552                 :          0 :                 MISSING_CASE(pixel_format);
    4553                 :            :         }
    4554                 :            : 
    4555                 :          0 :         return 0;
    4556                 :            : }
    4557                 :            : 
    4558                 :            : static u32 skl_plane_ctl_alpha(const struct intel_plane_state *plane_state)
    4559                 :            : {
    4560                 :            :         if (!plane_state->hw.fb->format->has_alpha)
    4561                 :            :                 return PLANE_CTL_ALPHA_DISABLE;
    4562                 :            : 
    4563                 :            :         switch (plane_state->hw.pixel_blend_mode) {
    4564                 :            :         case DRM_MODE_BLEND_PIXEL_NONE:
    4565                 :            :                 return PLANE_CTL_ALPHA_DISABLE;
    4566                 :            :         case DRM_MODE_BLEND_PREMULTI:
    4567                 :            :                 return PLANE_CTL_ALPHA_SW_PREMULTIPLY;
    4568                 :            :         case DRM_MODE_BLEND_COVERAGE:
    4569                 :            :                 return PLANE_CTL_ALPHA_HW_PREMULTIPLY;
    4570                 :            :         default:
    4571                 :            :                 MISSING_CASE(plane_state->hw.pixel_blend_mode);
    4572                 :            :                 return PLANE_CTL_ALPHA_DISABLE;
    4573                 :            :         }
    4574                 :            : }
    4575                 :            : 
    4576                 :            : static u32 glk_plane_color_ctl_alpha(const struct intel_plane_state *plane_state)
    4577                 :            : {
    4578                 :            :         if (!plane_state->hw.fb->format->has_alpha)
    4579                 :            :                 return PLANE_COLOR_ALPHA_DISABLE;
    4580                 :            : 
    4581                 :            :         switch (plane_state->hw.pixel_blend_mode) {
    4582                 :            :         case DRM_MODE_BLEND_PIXEL_NONE:
    4583                 :            :                 return PLANE_COLOR_ALPHA_DISABLE;
    4584                 :            :         case DRM_MODE_BLEND_PREMULTI:
    4585                 :            :                 return PLANE_COLOR_ALPHA_SW_PREMULTIPLY;
    4586                 :            :         case DRM_MODE_BLEND_COVERAGE:
    4587                 :            :                 return PLANE_COLOR_ALPHA_HW_PREMULTIPLY;
    4588                 :            :         default:
    4589                 :            :                 MISSING_CASE(plane_state->hw.pixel_blend_mode);
    4590                 :            :                 return PLANE_COLOR_ALPHA_DISABLE;
    4591                 :            :         }
    4592                 :            : }
    4593                 :            : 
    4594                 :          0 : static u32 skl_plane_ctl_tiling(u64 fb_modifier)
    4595                 :            : {
    4596   [ #  #  #  #  :          0 :         switch (fb_modifier) {
             #  #  #  #  
                      # ]
    4597                 :            :         case DRM_FORMAT_MOD_LINEAR:
    4598                 :            :                 break;
    4599                 :            :         case I915_FORMAT_MOD_X_TILED:
    4600                 :            :                 return PLANE_CTL_TILED_X;
    4601                 :          0 :         case I915_FORMAT_MOD_Y_TILED:
    4602                 :          0 :                 return PLANE_CTL_TILED_Y;
    4603                 :          0 :         case I915_FORMAT_MOD_Y_TILED_CCS:
    4604                 :          0 :                 return PLANE_CTL_TILED_Y | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
    4605                 :          0 :         case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    4606                 :          0 :                 return PLANE_CTL_TILED_Y |
    4607                 :            :                        PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
    4608                 :            :                        PLANE_CTL_CLEAR_COLOR_DISABLE;
    4609                 :          0 :         case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
    4610                 :          0 :                 return PLANE_CTL_TILED_Y | PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE;
    4611                 :          0 :         case I915_FORMAT_MOD_Yf_TILED:
    4612                 :          0 :                 return PLANE_CTL_TILED_YF;
    4613                 :          0 :         case I915_FORMAT_MOD_Yf_TILED_CCS:
    4614                 :          0 :                 return PLANE_CTL_TILED_YF | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
    4615                 :            :         default:
    4616                 :          0 :                 MISSING_CASE(fb_modifier);
    4617                 :            :         }
    4618                 :            : 
    4619                 :            :         return 0;
    4620                 :            : }
    4621                 :            : 
    4622                 :          0 : static u32 skl_plane_ctl_rotate(unsigned int rotate)
    4623                 :            : {
    4624   [ #  #  #  #  :          0 :         switch (rotate) {
                      # ]
    4625                 :            :         case DRM_MODE_ROTATE_0:
    4626                 :            :                 break;
    4627                 :            :         /*
    4628                 :            :          * DRM_MODE_ROTATE_ is counter clockwise to stay compatible with Xrandr
    4629                 :            :          * while i915 HW rotation is clockwise, thats why this swapping.
    4630                 :            :          */
    4631                 :            :         case DRM_MODE_ROTATE_90:
    4632                 :            :                 return PLANE_CTL_ROTATE_270;
    4633                 :          0 :         case DRM_MODE_ROTATE_180:
    4634                 :          0 :                 return PLANE_CTL_ROTATE_180;
    4635                 :          0 :         case DRM_MODE_ROTATE_270:
    4636                 :          0 :                 return PLANE_CTL_ROTATE_90;
    4637                 :            :         default:
    4638                 :          0 :                 MISSING_CASE(rotate);
    4639                 :            :         }
    4640                 :            : 
    4641                 :            :         return 0;
    4642                 :            : }
    4643                 :            : 
    4644                 :          0 : static u32 cnl_plane_ctl_flip(unsigned int reflect)
    4645                 :            : {
    4646      [ #  #  # ]:          0 :         switch (reflect) {
    4647                 :            :         case 0:
    4648                 :            :                 break;
    4649                 :            :         case DRM_MODE_REFLECT_X:
    4650                 :            :                 return PLANE_CTL_FLIP_HORIZONTAL;
    4651                 :            :         case DRM_MODE_REFLECT_Y:
    4652                 :            :         default:
    4653                 :          0 :                 MISSING_CASE(reflect);
    4654                 :            :         }
    4655                 :            : 
    4656                 :            :         return 0;
    4657                 :            : }
    4658                 :            : 
    4659                 :          0 : u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
    4660                 :            : {
    4661         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    4662                 :          0 :         u32 plane_ctl = 0;
    4663                 :            : 
    4664   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
    4665                 :          0 :                 return plane_ctl;
    4666                 :            : 
    4667         [ #  # ]:          0 :         if (crtc_state->gamma_enable)
    4668                 :          0 :                 plane_ctl |= PLANE_CTL_PIPE_GAMMA_ENABLE;
    4669                 :            : 
    4670         [ #  # ]:          0 :         if (crtc_state->csc_enable)
    4671                 :          0 :                 plane_ctl |= PLANE_CTL_PIPE_CSC_ENABLE;
    4672                 :            : 
    4673                 :            :         return plane_ctl;
    4674                 :            : }
    4675                 :            : 
    4676                 :          0 : u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
    4677                 :            :                   const struct intel_plane_state *plane_state)
    4678                 :            : {
    4679                 :          0 :         struct drm_i915_private *dev_priv =
    4680         [ #  # ]:          0 :                 to_i915(plane_state->uapi.plane->dev);
    4681                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4682                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
    4683                 :          0 :         const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
    4684                 :          0 :         u32 plane_ctl;
    4685                 :            : 
    4686                 :          0 :         plane_ctl = PLANE_CTL_ENABLE;
    4687                 :            : 
    4688   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) {
    4689                 :          0 :                 plane_ctl |= skl_plane_ctl_alpha(plane_state);
    4690                 :          0 :                 plane_ctl |= PLANE_CTL_PLANE_GAMMA_DISABLE;
    4691                 :            : 
    4692         [ #  # ]:          0 :                 if (plane_state->hw.color_encoding == DRM_COLOR_YCBCR_BT709)
    4693                 :          0 :                         plane_ctl |= PLANE_CTL_YUV_TO_RGB_CSC_FORMAT_BT709;
    4694                 :            : 
    4695         [ #  # ]:          0 :                 if (plane_state->hw.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
    4696                 :          0 :                         plane_ctl |= PLANE_CTL_YUV_RANGE_CORRECTION_DISABLE;
    4697                 :            :         }
    4698                 :            : 
    4699                 :          0 :         plane_ctl |= skl_plane_ctl_format(fb->format->format);
    4700                 :          0 :         plane_ctl |= skl_plane_ctl_tiling(fb->modifier);
    4701                 :          0 :         plane_ctl |= skl_plane_ctl_rotate(rotation & DRM_MODE_ROTATE_MASK);
    4702                 :            : 
    4703         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 10)
    4704                 :          0 :                 plane_ctl |= cnl_plane_ctl_flip(rotation &
    4705                 :            :                                                 DRM_MODE_REFLECT_MASK);
    4706                 :            : 
    4707         [ #  # ]:          0 :         if (key->flags & I915_SET_COLORKEY_DESTINATION)
    4708                 :          0 :                 plane_ctl |= PLANE_CTL_KEY_ENABLE_DESTINATION;
    4709         [ #  # ]:          0 :         else if (key->flags & I915_SET_COLORKEY_SOURCE)
    4710                 :          0 :                 plane_ctl |= PLANE_CTL_KEY_ENABLE_SOURCE;
    4711                 :            : 
    4712                 :          0 :         return plane_ctl;
    4713                 :            : }
    4714                 :            : 
    4715                 :          0 : u32 glk_plane_color_ctl_crtc(const struct intel_crtc_state *crtc_state)
    4716                 :            : {
    4717         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    4718                 :          0 :         u32 plane_color_ctl = 0;
    4719                 :            : 
    4720         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    4721                 :            :                 return plane_color_ctl;
    4722                 :            : 
    4723         [ #  # ]:          0 :         if (crtc_state->gamma_enable)
    4724                 :          0 :                 plane_color_ctl |= PLANE_COLOR_PIPE_GAMMA_ENABLE;
    4725                 :            : 
    4726         [ #  # ]:          0 :         if (crtc_state->csc_enable)
    4727                 :          0 :                 plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
    4728                 :            : 
    4729                 :            :         return plane_color_ctl;
    4730                 :            : }
    4731                 :            : 
    4732                 :          0 : u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
    4733                 :            :                         const struct intel_plane_state *plane_state)
    4734                 :            : {
    4735                 :          0 :         struct drm_i915_private *dev_priv =
    4736                 :          0 :                 to_i915(plane_state->uapi.plane->dev);
    4737                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
    4738                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
    4739                 :          0 :         u32 plane_color_ctl = 0;
    4740                 :            : 
    4741                 :          0 :         plane_color_ctl |= PLANE_COLOR_PLANE_GAMMA_DISABLE;
    4742                 :          0 :         plane_color_ctl |= glk_plane_color_ctl_alpha(plane_state);
    4743                 :            : 
    4744   [ #  #  #  # ]:          0 :         if (fb->format->is_yuv && !icl_is_hdr_plane(dev_priv, plane->id)) {
    4745         [ #  # ]:          0 :                 if (plane_state->hw.color_encoding == DRM_COLOR_YCBCR_BT709)
    4746                 :          0 :                         plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
    4747                 :            :                 else
    4748                 :          0 :                         plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV601_TO_RGB709;
    4749                 :            : 
    4750         [ #  # ]:          0 :                 if (plane_state->hw.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
    4751                 :          0 :                         plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
    4752         [ #  # ]:          0 :         } else if (fb->format->is_yuv) {
    4753                 :          0 :                 plane_color_ctl |= PLANE_COLOR_INPUT_CSC_ENABLE;
    4754                 :            :         }
    4755                 :            : 
    4756                 :          0 :         return plane_color_ctl;
    4757                 :            : }
    4758                 :            : 
    4759                 :            : static int
    4760                 :          0 : __intel_display_resume(struct drm_device *dev,
    4761                 :            :                        struct drm_atomic_state *state,
    4762                 :            :                        struct drm_modeset_acquire_ctx *ctx)
    4763                 :            : {
    4764                 :          0 :         struct drm_crtc_state *crtc_state;
    4765                 :          0 :         struct drm_crtc *crtc;
    4766                 :          0 :         int i, ret;
    4767                 :            : 
    4768                 :          0 :         intel_modeset_setup_hw_state(dev, ctx);
    4769                 :          0 :         intel_vga_redisable(to_i915(dev));
    4770                 :            : 
    4771         [ #  # ]:          0 :         if (!state)
    4772                 :            :                 return 0;
    4773                 :            : 
    4774                 :            :         /*
    4775                 :            :          * We've duplicated the state, pointers to the old state are invalid.
    4776                 :            :          *
    4777                 :            :          * Don't attempt to use the old state until we commit the duplicated state.
    4778                 :            :          */
    4779   [ #  #  #  # ]:          0 :         for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
    4780                 :            :                 /*
    4781                 :            :                  * Force recalculation even if we restore
    4782                 :            :                  * current state. With fast modeset this may not result
    4783                 :            :                  * in a modeset when the state is compatible.
    4784                 :            :                  */
    4785                 :          0 :                 crtc_state->mode_changed = true;
    4786                 :            :         }
    4787                 :            : 
    4788                 :            :         /* ignore any reset values/BIOS leftovers in the WM registers */
    4789         [ #  # ]:          0 :         if (!HAS_GMCH(to_i915(dev)))
    4790                 :          0 :                 to_intel_atomic_state(state)->skip_intermediate_wm = true;
    4791                 :            : 
    4792                 :          0 :         ret = drm_atomic_helper_commit_duplicated_state(state, ctx);
    4793                 :            : 
    4794         [ #  # ]:          0 :         WARN_ON(ret == -EDEADLK);
    4795                 :            :         return ret;
    4796                 :            : }
    4797                 :            : 
    4798                 :          0 : static bool gpu_reset_clobbers_display(struct drm_i915_private *dev_priv)
    4799                 :            : {
    4800   [ #  #  #  #  :          0 :         return (INTEL_INFO(dev_priv)->gpu_reset_clobbers_display &&
                   #  # ]
    4801                 :          0 :                 intel_has_gpu_reset(&dev_priv->gt));
    4802                 :            : }
    4803                 :            : 
    4804                 :          0 : void intel_prepare_reset(struct drm_i915_private *dev_priv)
    4805                 :            : {
    4806                 :          0 :         struct drm_device *dev = &dev_priv->drm;
    4807                 :          0 :         struct drm_modeset_acquire_ctx *ctx = &dev_priv->reset_ctx;
    4808                 :          0 :         struct drm_atomic_state *state;
    4809                 :          0 :         int ret;
    4810                 :            : 
    4811                 :            :         /* reset doesn't touch the display */
    4812   [ #  #  #  # ]:          0 :         if (!i915_modparams.force_reset_modeset_test &&
    4813                 :            :             !gpu_reset_clobbers_display(dev_priv))
    4814                 :            :                 return;
    4815                 :            : 
    4816                 :            :         /* We have a modeset vs reset deadlock, defensively unbreak it. */
    4817                 :          0 :         set_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags);
    4818                 :          0 :         smp_mb__after_atomic();
    4819                 :          0 :         wake_up_bit(&dev_priv->gt.reset.flags, I915_RESET_MODESET);
    4820                 :            : 
    4821         [ #  # ]:          0 :         if (atomic_read(&dev_priv->gpu_error.pending_fb_pin)) {
    4822                 :          0 :                 DRM_DEBUG_KMS("Modeset potentially stuck, unbreaking through wedging\n");
    4823                 :          0 :                 intel_gt_set_wedged(&dev_priv->gt);
    4824                 :            :         }
    4825                 :            : 
    4826                 :            :         /*
    4827                 :            :          * Need mode_config.mutex so that we don't
    4828                 :            :          * trample ongoing ->detect() and whatnot.
    4829                 :            :          */
    4830                 :          0 :         mutex_lock(&dev->mode_config.mutex);
    4831                 :          0 :         drm_modeset_acquire_init(ctx, 0);
    4832                 :          0 :         while (1) {
    4833                 :          0 :                 ret = drm_modeset_lock_all_ctx(dev, ctx);
    4834         [ #  # ]:          0 :                 if (ret != -EDEADLK)
    4835                 :            :                         break;
    4836                 :            : 
    4837                 :          0 :                 drm_modeset_backoff(ctx);
    4838                 :            :         }
    4839                 :            :         /*
    4840                 :            :          * Disabling the crtcs gracefully seems nicer. Also the
    4841                 :            :          * g33 docs say we should at least disable all the planes.
    4842                 :            :          */
    4843                 :          0 :         state = drm_atomic_helper_duplicate_state(dev, ctx);
    4844         [ #  # ]:          0 :         if (IS_ERR(state)) {
    4845                 :          0 :                 ret = PTR_ERR(state);
    4846                 :          0 :                 DRM_ERROR("Duplicating state failed with %i\n", ret);
    4847                 :          0 :                 return;
    4848                 :            :         }
    4849                 :            : 
    4850                 :          0 :         ret = drm_atomic_helper_disable_all(dev, ctx);
    4851         [ #  # ]:          0 :         if (ret) {
    4852                 :          0 :                 DRM_ERROR("Suspending crtc's failed with %i\n", ret);
    4853                 :          0 :                 drm_atomic_state_put(state);
    4854                 :          0 :                 return;
    4855                 :            :         }
    4856                 :            : 
    4857                 :          0 :         dev_priv->modeset_restore_state = state;
    4858                 :          0 :         state->acquire_ctx = ctx;
    4859                 :            : }
    4860                 :            : 
    4861                 :          0 : void intel_finish_reset(struct drm_i915_private *dev_priv)
    4862                 :            : {
    4863                 :          0 :         struct drm_device *dev = &dev_priv->drm;
    4864                 :          0 :         struct drm_modeset_acquire_ctx *ctx = &dev_priv->reset_ctx;
    4865                 :          0 :         struct drm_atomic_state *state;
    4866                 :          0 :         int ret;
    4867                 :            : 
    4868                 :            :         /* reset doesn't touch the display */
    4869         [ #  # ]:          0 :         if (!test_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags))
    4870                 :            :                 return;
    4871                 :            : 
    4872                 :          0 :         state = fetch_and_zero(&dev_priv->modeset_restore_state);
    4873         [ #  # ]:          0 :         if (!state)
    4874                 :          0 :                 goto unlock;
    4875                 :            : 
    4876                 :            :         /* reset doesn't touch the display */
    4877   [ #  #  #  # ]:          0 :         if (!gpu_reset_clobbers_display(dev_priv)) {
    4878                 :            :                 /* for testing only restore the display */
    4879                 :          0 :                 ret = __intel_display_resume(dev, state, ctx);
    4880         [ #  # ]:          0 :                 if (ret)
    4881                 :          0 :                         DRM_ERROR("Restoring old state failed with %i\n", ret);
    4882                 :            :         } else {
    4883                 :            :                 /*
    4884                 :            :                  * The display has been reset as well,
    4885                 :            :                  * so need a full re-initialization.
    4886                 :            :                  */
    4887                 :          0 :                 intel_pps_unlock_regs_wa(dev_priv);
    4888                 :          0 :                 intel_modeset_init_hw(dev_priv);
    4889                 :          0 :                 intel_init_clock_gating(dev_priv);
    4890                 :            : 
    4891                 :          0 :                 spin_lock_irq(&dev_priv->irq_lock);
    4892         [ #  # ]:          0 :                 if (dev_priv->display.hpd_irq_setup)
    4893                 :          0 :                         dev_priv->display.hpd_irq_setup(dev_priv);
    4894                 :          0 :                 spin_unlock_irq(&dev_priv->irq_lock);
    4895                 :            : 
    4896                 :          0 :                 ret = __intel_display_resume(dev, state, ctx);
    4897         [ #  # ]:          0 :                 if (ret)
    4898                 :          0 :                         DRM_ERROR("Restoring old state failed with %i\n", ret);
    4899                 :            : 
    4900                 :          0 :                 intel_hpd_init(dev_priv);
    4901                 :            :         }
    4902                 :            : 
    4903                 :          0 :         drm_atomic_state_put(state);
    4904                 :          0 : unlock:
    4905                 :          0 :         drm_modeset_drop_locks(ctx);
    4906                 :          0 :         drm_modeset_acquire_fini(ctx);
    4907                 :          0 :         mutex_unlock(&dev->mode_config.mutex);
    4908                 :            : 
    4909                 :          0 :         clear_bit_unlock(I915_RESET_MODESET, &dev_priv->gt.reset.flags);
    4910                 :            : }
    4911                 :            : 
    4912                 :            : static void icl_set_pipe_chicken(struct intel_crtc *crtc)
    4913                 :            : {
    4914                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    4915                 :            :         enum pipe pipe = crtc->pipe;
    4916                 :            :         u32 tmp;
    4917                 :            : 
    4918                 :            :         tmp = I915_READ(PIPE_CHICKEN(pipe));
    4919                 :            : 
    4920                 :            :         /*
    4921                 :            :          * Display WA #1153: icl
    4922                 :            :          * enable hardware to bypass the alpha math
    4923                 :            :          * and rounding for per-pixel values 00 and 0xff
    4924                 :            :          */
    4925                 :            :         tmp |= PER_PIXEL_ALPHA_BYPASS_EN;
    4926                 :            :         /*
    4927                 :            :          * Display WA # 1605353570: icl
    4928                 :            :          * Set the pixel rounding bit to 1 for allowing
    4929                 :            :          * passthrough of Frame buffer pixels unmodified
    4930                 :            :          * across pipe
    4931                 :            :          */
    4932                 :            :         tmp |= PIXEL_ROUNDING_TRUNC_FB_PASSTHRU;
    4933                 :            :         I915_WRITE(PIPE_CHICKEN(pipe), tmp);
    4934                 :            : }
    4935                 :            : 
    4936                 :          0 : static void icl_enable_trans_port_sync(const struct intel_crtc_state *crtc_state)
    4937                 :            : {
    4938                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    4939         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    4940                 :          0 :         u32 trans_ddi_func_ctl2_val;
    4941                 :          0 :         u8 master_select;
    4942                 :            : 
    4943                 :            :         /*
    4944                 :            :          * Configure the master select and enable Transcoder Port Sync for
    4945                 :            :          * Slave CRTCs transcoder.
    4946                 :            :          */
    4947         [ #  # ]:          0 :         if (crtc_state->master_transcoder == INVALID_TRANSCODER)
    4948                 :            :                 return;
    4949                 :            : 
    4950         [ #  # ]:          0 :         if (crtc_state->master_transcoder == TRANSCODER_EDP)
    4951                 :            :                 master_select = 0;
    4952                 :            :         else
    4953                 :          0 :                 master_select = crtc_state->master_transcoder + 1;
    4954                 :            : 
    4955                 :            :         /* Set the master select bits for Tranascoder Port Sync */
    4956                 :          0 :         trans_ddi_func_ctl2_val = (PORT_SYNC_MODE_MASTER_SELECT(master_select) &
    4957                 :            :                                    PORT_SYNC_MODE_MASTER_SELECT_MASK) <<
    4958                 :            :                 PORT_SYNC_MODE_MASTER_SELECT_SHIFT;
    4959                 :            :         /* Enable Transcoder Port Sync */
    4960                 :          0 :         trans_ddi_func_ctl2_val |= PORT_SYNC_MODE_ENABLE;
    4961                 :            : 
    4962                 :          0 :         I915_WRITE(TRANS_DDI_FUNC_CTL2(crtc_state->cpu_transcoder),
    4963                 :            :                    trans_ddi_func_ctl2_val);
    4964                 :            : }
    4965                 :            : 
    4966                 :            : static void intel_fdi_normal_train(struct intel_crtc *crtc)
    4967                 :            : {
    4968                 :            :         struct drm_device *dev = crtc->base.dev;
    4969                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    4970                 :            :         enum pipe pipe = crtc->pipe;
    4971                 :            :         i915_reg_t reg;
    4972                 :            :         u32 temp;
    4973                 :            : 
    4974                 :            :         /* enable normal train */
    4975                 :            :         reg = FDI_TX_CTL(pipe);
    4976                 :            :         temp = I915_READ(reg);
    4977                 :            :         if (IS_IVYBRIDGE(dev_priv)) {
    4978                 :            :                 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
    4979                 :            :                 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
    4980                 :            :         } else {
    4981                 :            :                 temp &= ~FDI_LINK_TRAIN_NONE;
    4982                 :            :                 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
    4983                 :            :         }
    4984                 :            :         I915_WRITE(reg, temp);
    4985                 :            : 
    4986                 :            :         reg = FDI_RX_CTL(pipe);
    4987                 :            :         temp = I915_READ(reg);
    4988                 :            :         if (HAS_PCH_CPT(dev_priv)) {
    4989                 :            :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    4990                 :            :                 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
    4991                 :            :         } else {
    4992                 :            :                 temp &= ~FDI_LINK_TRAIN_NONE;
    4993                 :            :                 temp |= FDI_LINK_TRAIN_NONE;
    4994                 :            :         }
    4995                 :            :         I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
    4996                 :            : 
    4997                 :            :         /* wait one idle pattern time */
    4998                 :            :         POSTING_READ(reg);
    4999                 :            :         udelay(1000);
    5000                 :            : 
    5001                 :            :         /* IVB wants error correction enabled */
    5002                 :            :         if (IS_IVYBRIDGE(dev_priv))
    5003                 :            :                 I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE |
    5004                 :            :                            FDI_FE_ERRC_ENABLE);
    5005                 :            : }
    5006                 :            : 
    5007                 :            : /* The FDI link training functions for ILK/Ibexpeak. */
    5008                 :          0 : static void ilk_fdi_link_train(struct intel_crtc *crtc,
    5009                 :            :                                const struct intel_crtc_state *crtc_state)
    5010                 :            : {
    5011                 :          0 :         struct drm_device *dev = crtc->base.dev;
    5012                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    5013                 :          0 :         enum pipe pipe = crtc->pipe;
    5014                 :          0 :         i915_reg_t reg;
    5015                 :          0 :         u32 temp, tries;
    5016                 :            : 
    5017                 :            :         /* FDI needs bits from pipe first */
    5018                 :          0 :         assert_pipe_enabled(dev_priv, crtc_state->cpu_transcoder);
    5019                 :            : 
    5020                 :            :         /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
    5021                 :            :            for train result */
    5022                 :          0 :         reg = FDI_RX_IMR(pipe);
    5023                 :          0 :         temp = I915_READ(reg);
    5024                 :          0 :         temp &= ~FDI_RX_SYMBOL_LOCK;
    5025                 :          0 :         temp &= ~FDI_RX_BIT_LOCK;
    5026                 :          0 :         I915_WRITE(reg, temp);
    5027                 :          0 :         I915_READ(reg);
    5028                 :          0 :         udelay(150);
    5029                 :            : 
    5030                 :            :         /* enable CPU FDI TX and PCH FDI RX */
    5031                 :          0 :         reg = FDI_TX_CTL(pipe);
    5032                 :          0 :         temp = I915_READ(reg);
    5033                 :          0 :         temp &= ~FDI_DP_PORT_WIDTH_MASK;
    5034                 :          0 :         temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
    5035                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5036                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_1;
    5037                 :          0 :         I915_WRITE(reg, temp | FDI_TX_ENABLE);
    5038                 :            : 
    5039                 :          0 :         reg = FDI_RX_CTL(pipe);
    5040                 :          0 :         temp = I915_READ(reg);
    5041                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5042                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_1;
    5043                 :          0 :         I915_WRITE(reg, temp | FDI_RX_ENABLE);
    5044                 :            : 
    5045                 :          0 :         POSTING_READ(reg);
    5046                 :          0 :         udelay(150);
    5047                 :            : 
    5048                 :            :         /* Ironlake workaround, enable clock pointer after FDI enable*/
    5049                 :          0 :         I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
    5050                 :          0 :         I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR |
    5051                 :            :                    FDI_RX_PHASE_SYNC_POINTER_EN);
    5052                 :            : 
    5053                 :          0 :         reg = FDI_RX_IIR(pipe);
    5054         [ #  # ]:          0 :         for (tries = 0; tries < 5; tries++) {
    5055                 :          0 :                 temp = I915_READ(reg);
    5056                 :          0 :                 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5057                 :            : 
    5058         [ #  # ]:          0 :                 if ((temp & FDI_RX_BIT_LOCK)) {
    5059                 :          0 :                         DRM_DEBUG_KMS("FDI train 1 done.\n");
    5060                 :          0 :                         I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
    5061                 :          0 :                         break;
    5062                 :            :                 }
    5063                 :            :         }
    5064         [ #  # ]:          0 :         if (tries == 5)
    5065                 :          0 :                 DRM_ERROR("FDI train 1 fail!\n");
    5066                 :            : 
    5067                 :            :         /* Train 2 */
    5068                 :          0 :         reg = FDI_TX_CTL(pipe);
    5069                 :          0 :         temp = I915_READ(reg);
    5070                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5071                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_2;
    5072                 :          0 :         I915_WRITE(reg, temp);
    5073                 :            : 
    5074                 :          0 :         reg = FDI_RX_CTL(pipe);
    5075                 :          0 :         temp = I915_READ(reg);
    5076                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5077                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_2;
    5078                 :          0 :         I915_WRITE(reg, temp);
    5079                 :            : 
    5080                 :          0 :         POSTING_READ(reg);
    5081                 :          0 :         udelay(150);
    5082                 :            : 
    5083                 :          0 :         reg = FDI_RX_IIR(pipe);
    5084         [ #  # ]:          0 :         for (tries = 0; tries < 5; tries++) {
    5085                 :          0 :                 temp = I915_READ(reg);
    5086                 :          0 :                 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5087                 :            : 
    5088         [ #  # ]:          0 :                 if (temp & FDI_RX_SYMBOL_LOCK) {
    5089                 :          0 :                         I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
    5090                 :          0 :                         DRM_DEBUG_KMS("FDI train 2 done.\n");
    5091                 :          0 :                         break;
    5092                 :            :                 }
    5093                 :            :         }
    5094         [ #  # ]:          0 :         if (tries == 5)
    5095                 :          0 :                 DRM_ERROR("FDI train 2 fail!\n");
    5096                 :            : 
    5097                 :          0 :         DRM_DEBUG_KMS("FDI train done\n");
    5098                 :            : 
    5099                 :          0 : }
    5100                 :            : 
    5101                 :            : static const int snb_b_fdi_train_param[] = {
    5102                 :            :         FDI_LINK_TRAIN_400MV_0DB_SNB_B,
    5103                 :            :         FDI_LINK_TRAIN_400MV_6DB_SNB_B,
    5104                 :            :         FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
    5105                 :            :         FDI_LINK_TRAIN_800MV_0DB_SNB_B,
    5106                 :            : };
    5107                 :            : 
    5108                 :            : /* The FDI link training functions for SNB/Cougarpoint. */
    5109                 :          0 : static void gen6_fdi_link_train(struct intel_crtc *crtc,
    5110                 :            :                                 const struct intel_crtc_state *crtc_state)
    5111                 :            : {
    5112                 :          0 :         struct drm_device *dev = crtc->base.dev;
    5113                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    5114                 :          0 :         enum pipe pipe = crtc->pipe;
    5115                 :          0 :         i915_reg_t reg;
    5116                 :          0 :         u32 temp, i, retry;
    5117                 :            : 
    5118                 :            :         /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
    5119                 :            :            for train result */
    5120                 :          0 :         reg = FDI_RX_IMR(pipe);
    5121                 :          0 :         temp = I915_READ(reg);
    5122                 :          0 :         temp &= ~FDI_RX_SYMBOL_LOCK;
    5123                 :          0 :         temp &= ~FDI_RX_BIT_LOCK;
    5124                 :          0 :         I915_WRITE(reg, temp);
    5125                 :            : 
    5126                 :          0 :         POSTING_READ(reg);
    5127                 :          0 :         udelay(150);
    5128                 :            : 
    5129                 :            :         /* enable CPU FDI TX and PCH FDI RX */
    5130                 :          0 :         reg = FDI_TX_CTL(pipe);
    5131                 :          0 :         temp = I915_READ(reg);
    5132                 :          0 :         temp &= ~FDI_DP_PORT_WIDTH_MASK;
    5133                 :          0 :         temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
    5134                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5135                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_1;
    5136                 :          0 :         temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
    5137                 :            :         /* SNB-B */
    5138                 :          0 :         temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
    5139                 :          0 :         I915_WRITE(reg, temp | FDI_TX_ENABLE);
    5140                 :            : 
    5141                 :          0 :         I915_WRITE(FDI_RX_MISC(pipe),
    5142                 :            :                    FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
    5143                 :            : 
    5144                 :          0 :         reg = FDI_RX_CTL(pipe);
    5145                 :          0 :         temp = I915_READ(reg);
    5146         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv)) {
    5147                 :          0 :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    5148                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
    5149                 :            :         } else {
    5150                 :          0 :                 temp &= ~FDI_LINK_TRAIN_NONE;
    5151                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_1;
    5152                 :            :         }
    5153                 :          0 :         I915_WRITE(reg, temp | FDI_RX_ENABLE);
    5154                 :            : 
    5155                 :          0 :         POSTING_READ(reg);
    5156                 :          0 :         udelay(150);
    5157                 :            : 
    5158         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
    5159                 :          0 :                 reg = FDI_TX_CTL(pipe);
    5160                 :          0 :                 temp = I915_READ(reg);
    5161                 :          0 :                 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
    5162                 :          0 :                 temp |= snb_b_fdi_train_param[i];
    5163                 :          0 :                 I915_WRITE(reg, temp);
    5164                 :            : 
    5165                 :          0 :                 POSTING_READ(reg);
    5166                 :          0 :                 udelay(500);
    5167                 :            : 
    5168         [ #  # ]:          0 :                 for (retry = 0; retry < 5; retry++) {
    5169                 :          0 :                         reg = FDI_RX_IIR(pipe);
    5170                 :          0 :                         temp = I915_READ(reg);
    5171                 :          0 :                         DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5172         [ #  # ]:          0 :                         if (temp & FDI_RX_BIT_LOCK) {
    5173                 :          0 :                                 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
    5174                 :          0 :                                 DRM_DEBUG_KMS("FDI train 1 done.\n");
    5175                 :          0 :                                 break;
    5176                 :            :                         }
    5177                 :          0 :                         udelay(50);
    5178                 :            :                 }
    5179         [ #  # ]:          0 :                 if (retry < 5)
    5180                 :            :                         break;
    5181                 :            :         }
    5182         [ #  # ]:          0 :         if (i == 4)
    5183                 :          0 :                 DRM_ERROR("FDI train 1 fail!\n");
    5184                 :            : 
    5185                 :            :         /* Train 2 */
    5186                 :          0 :         reg = FDI_TX_CTL(pipe);
    5187                 :          0 :         temp = I915_READ(reg);
    5188                 :          0 :         temp &= ~FDI_LINK_TRAIN_NONE;
    5189                 :          0 :         temp |= FDI_LINK_TRAIN_PATTERN_2;
    5190         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 6)) {
    5191                 :          0 :                 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
    5192                 :            :                 /* SNB-B */
    5193                 :          0 :                 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
    5194                 :            :         }
    5195                 :          0 :         I915_WRITE(reg, temp);
    5196                 :            : 
    5197                 :          0 :         reg = FDI_RX_CTL(pipe);
    5198                 :          0 :         temp = I915_READ(reg);
    5199         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv)) {
    5200                 :          0 :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    5201                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
    5202                 :            :         } else {
    5203                 :          0 :                 temp &= ~FDI_LINK_TRAIN_NONE;
    5204                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_2;
    5205                 :            :         }
    5206                 :          0 :         I915_WRITE(reg, temp);
    5207                 :            : 
    5208                 :          0 :         POSTING_READ(reg);
    5209                 :          0 :         udelay(150);
    5210                 :            : 
    5211         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
    5212                 :          0 :                 reg = FDI_TX_CTL(pipe);
    5213                 :          0 :                 temp = I915_READ(reg);
    5214                 :          0 :                 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
    5215                 :          0 :                 temp |= snb_b_fdi_train_param[i];
    5216                 :          0 :                 I915_WRITE(reg, temp);
    5217                 :            : 
    5218                 :          0 :                 POSTING_READ(reg);
    5219                 :          0 :                 udelay(500);
    5220                 :            : 
    5221         [ #  # ]:          0 :                 for (retry = 0; retry < 5; retry++) {
    5222                 :          0 :                         reg = FDI_RX_IIR(pipe);
    5223                 :          0 :                         temp = I915_READ(reg);
    5224                 :          0 :                         DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5225         [ #  # ]:          0 :                         if (temp & FDI_RX_SYMBOL_LOCK) {
    5226                 :          0 :                                 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
    5227                 :          0 :                                 DRM_DEBUG_KMS("FDI train 2 done.\n");
    5228                 :          0 :                                 break;
    5229                 :            :                         }
    5230                 :          0 :                         udelay(50);
    5231                 :            :                 }
    5232         [ #  # ]:          0 :                 if (retry < 5)
    5233                 :            :                         break;
    5234                 :            :         }
    5235         [ #  # ]:          0 :         if (i == 4)
    5236                 :          0 :                 DRM_ERROR("FDI train 2 fail!\n");
    5237                 :            : 
    5238                 :          0 :         DRM_DEBUG_KMS("FDI train done.\n");
    5239                 :          0 : }
    5240                 :            : 
    5241                 :            : /* Manual link training for Ivy Bridge A0 parts */
    5242                 :          0 : static void ivb_manual_fdi_link_train(struct intel_crtc *crtc,
    5243                 :            :                                       const struct intel_crtc_state *crtc_state)
    5244                 :            : {
    5245                 :          0 :         struct drm_device *dev = crtc->base.dev;
    5246                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    5247                 :          0 :         enum pipe pipe = crtc->pipe;
    5248                 :          0 :         i915_reg_t reg;
    5249                 :          0 :         u32 temp, i, j;
    5250                 :            : 
    5251                 :            :         /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
    5252                 :            :            for train result */
    5253                 :          0 :         reg = FDI_RX_IMR(pipe);
    5254                 :          0 :         temp = I915_READ(reg);
    5255                 :          0 :         temp &= ~FDI_RX_SYMBOL_LOCK;
    5256                 :          0 :         temp &= ~FDI_RX_BIT_LOCK;
    5257                 :          0 :         I915_WRITE(reg, temp);
    5258                 :            : 
    5259                 :          0 :         POSTING_READ(reg);
    5260                 :          0 :         udelay(150);
    5261                 :            : 
    5262                 :          0 :         DRM_DEBUG_KMS("FDI_RX_IIR before link train 0x%x\n",
    5263                 :            :                       I915_READ(FDI_RX_IIR(pipe)));
    5264                 :            : 
    5265                 :            :         /* Try each vswing and preemphasis setting twice before moving on */
    5266         [ #  # ]:          0 :         for (j = 0; j < ARRAY_SIZE(snb_b_fdi_train_param) * 2; j++) {
    5267                 :            :                 /* disable first in case we need to retry */
    5268                 :          0 :                 reg = FDI_TX_CTL(pipe);
    5269                 :          0 :                 temp = I915_READ(reg);
    5270                 :          0 :                 temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
    5271                 :          0 :                 temp &= ~FDI_TX_ENABLE;
    5272                 :          0 :                 I915_WRITE(reg, temp);
    5273                 :            : 
    5274                 :          0 :                 reg = FDI_RX_CTL(pipe);
    5275                 :          0 :                 temp = I915_READ(reg);
    5276                 :          0 :                 temp &= ~FDI_LINK_TRAIN_AUTO;
    5277                 :          0 :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    5278                 :          0 :                 temp &= ~FDI_RX_ENABLE;
    5279                 :          0 :                 I915_WRITE(reg, temp);
    5280                 :            : 
    5281                 :            :                 /* enable CPU FDI TX and PCH FDI RX */
    5282                 :          0 :                 reg = FDI_TX_CTL(pipe);
    5283                 :          0 :                 temp = I915_READ(reg);
    5284                 :          0 :                 temp &= ~FDI_DP_PORT_WIDTH_MASK;
    5285                 :          0 :                 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
    5286                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
    5287                 :          0 :                 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
    5288                 :          0 :                 temp |= snb_b_fdi_train_param[j/2];
    5289                 :          0 :                 temp |= FDI_COMPOSITE_SYNC;
    5290                 :          0 :                 I915_WRITE(reg, temp | FDI_TX_ENABLE);
    5291                 :            : 
    5292                 :          0 :                 I915_WRITE(FDI_RX_MISC(pipe),
    5293                 :            :                            FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
    5294                 :            : 
    5295                 :          0 :                 reg = FDI_RX_CTL(pipe);
    5296                 :          0 :                 temp = I915_READ(reg);
    5297                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
    5298                 :          0 :                 temp |= FDI_COMPOSITE_SYNC;
    5299                 :          0 :                 I915_WRITE(reg, temp | FDI_RX_ENABLE);
    5300                 :            : 
    5301                 :          0 :                 POSTING_READ(reg);
    5302                 :          0 :                 udelay(1); /* should be 0.5us */
    5303                 :            : 
    5304         [ #  # ]:          0 :                 for (i = 0; i < 4; i++) {
    5305                 :          0 :                         reg = FDI_RX_IIR(pipe);
    5306                 :          0 :                         temp = I915_READ(reg);
    5307                 :          0 :                         DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5308                 :            : 
    5309         [ #  # ]:          0 :                         if (temp & FDI_RX_BIT_LOCK ||
    5310         [ #  # ]:          0 :                             (I915_READ(reg) & FDI_RX_BIT_LOCK)) {
    5311                 :          0 :                                 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
    5312                 :          0 :                                 DRM_DEBUG_KMS("FDI train 1 done, level %i.\n",
    5313                 :            :                                               i);
    5314                 :          0 :                                 break;
    5315                 :            :                         }
    5316                 :          0 :                         udelay(1); /* should be 0.5us */
    5317                 :            :                 }
    5318         [ #  # ]:          0 :                 if (i == 4) {
    5319                 :          0 :                         DRM_DEBUG_KMS("FDI train 1 fail on vswing %d\n", j / 2);
    5320                 :          0 :                         continue;
    5321                 :            :                 }
    5322                 :            : 
    5323                 :            :                 /* Train 2 */
    5324                 :          0 :                 reg = FDI_TX_CTL(pipe);
    5325                 :          0 :                 temp = I915_READ(reg);
    5326                 :          0 :                 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
    5327                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
    5328                 :          0 :                 I915_WRITE(reg, temp);
    5329                 :            : 
    5330                 :          0 :                 reg = FDI_RX_CTL(pipe);
    5331                 :          0 :                 temp = I915_READ(reg);
    5332                 :          0 :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    5333                 :          0 :                 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
    5334                 :          0 :                 I915_WRITE(reg, temp);
    5335                 :            : 
    5336                 :          0 :                 POSTING_READ(reg);
    5337                 :          0 :                 udelay(2); /* should be 1.5us */
    5338                 :            : 
    5339         [ #  # ]:          0 :                 for (i = 0; i < 4; i++) {
    5340                 :          0 :                         reg = FDI_RX_IIR(pipe);
    5341                 :          0 :                         temp = I915_READ(reg);
    5342                 :          0 :                         DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
    5343                 :            : 
    5344         [ #  # ]:          0 :                         if (temp & FDI_RX_SYMBOL_LOCK ||
    5345         [ #  # ]:          0 :                             (I915_READ(reg) & FDI_RX_SYMBOL_LOCK)) {
    5346                 :          0 :                                 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
    5347                 :          0 :                                 DRM_DEBUG_KMS("FDI train 2 done, level %i.\n",
    5348                 :            :                                               i);
    5349                 :          0 :                                 goto train_done;
    5350                 :            :                         }
    5351                 :          0 :                         udelay(2); /* should be 1.5us */
    5352                 :            :                 }
    5353                 :          0 :                 if (i == 4)
    5354                 :          0 :                         DRM_DEBUG_KMS("FDI train 2 fail on vswing %d\n", j / 2);
    5355                 :            :         }
    5356                 :            : 
    5357                 :          0 : train_done:
    5358                 :          0 :         DRM_DEBUG_KMS("FDI train done.\n");
    5359                 :          0 : }
    5360                 :            : 
    5361                 :            : static void ilk_fdi_pll_enable(const struct intel_crtc_state *crtc_state)
    5362                 :            : {
    5363                 :            :         struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5364                 :            :         struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
    5365                 :            :         enum pipe pipe = intel_crtc->pipe;
    5366                 :            :         i915_reg_t reg;
    5367                 :            :         u32 temp;
    5368                 :            : 
    5369                 :            :         /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
    5370                 :            :         reg = FDI_RX_CTL(pipe);
    5371                 :            :         temp = I915_READ(reg);
    5372                 :            :         temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16));
    5373                 :            :         temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
    5374                 :            :         temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
    5375                 :            :         I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
    5376                 :            : 
    5377                 :            :         POSTING_READ(reg);
    5378                 :            :         udelay(200);
    5379                 :            : 
    5380                 :            :         /* Switch from Rawclk to PCDclk */
    5381                 :            :         temp = I915_READ(reg);
    5382                 :            :         I915_WRITE(reg, temp | FDI_PCDCLK);
    5383                 :            : 
    5384                 :            :         POSTING_READ(reg);
    5385                 :            :         udelay(200);
    5386                 :            : 
    5387                 :            :         /* Enable CPU FDI TX PLL, always on for Ironlake */
    5388                 :            :         reg = FDI_TX_CTL(pipe);
    5389                 :            :         temp = I915_READ(reg);
    5390                 :            :         if ((temp & FDI_TX_PLL_ENABLE) == 0) {
    5391                 :            :                 I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE);
    5392                 :            : 
    5393                 :            :                 POSTING_READ(reg);
    5394                 :            :                 udelay(100);
    5395                 :            :         }
    5396                 :            : }
    5397                 :            : 
    5398                 :            : static void ilk_fdi_pll_disable(struct intel_crtc *intel_crtc)
    5399                 :            : {
    5400                 :            :         struct drm_device *dev = intel_crtc->base.dev;
    5401                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    5402                 :            :         enum pipe pipe = intel_crtc->pipe;
    5403                 :            :         i915_reg_t reg;
    5404                 :            :         u32 temp;
    5405                 :            : 
    5406                 :            :         /* Switch from PCDclk to Rawclk */
    5407                 :            :         reg = FDI_RX_CTL(pipe);
    5408                 :            :         temp = I915_READ(reg);
    5409                 :            :         I915_WRITE(reg, temp & ~FDI_PCDCLK);
    5410                 :            : 
    5411                 :            :         /* Disable CPU FDI TX PLL */
    5412                 :            :         reg = FDI_TX_CTL(pipe);
    5413                 :            :         temp = I915_READ(reg);
    5414                 :            :         I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE);
    5415                 :            : 
    5416                 :            :         POSTING_READ(reg);
    5417                 :            :         udelay(100);
    5418                 :            : 
    5419                 :            :         reg = FDI_RX_CTL(pipe);
    5420                 :            :         temp = I915_READ(reg);
    5421                 :            :         I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE);
    5422                 :            : 
    5423                 :            :         /* Wait for the clocks to turn off. */
    5424                 :            :         POSTING_READ(reg);
    5425                 :            :         udelay(100);
    5426                 :            : }
    5427                 :            : 
    5428                 :            : static void ilk_fdi_disable(struct intel_crtc *crtc)
    5429                 :            : {
    5430                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    5431                 :            :         enum pipe pipe = crtc->pipe;
    5432                 :            :         i915_reg_t reg;
    5433                 :            :         u32 temp;
    5434                 :            : 
    5435                 :            :         /* disable CPU FDI tx and PCH FDI rx */
    5436                 :            :         reg = FDI_TX_CTL(pipe);
    5437                 :            :         temp = I915_READ(reg);
    5438                 :            :         I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
    5439                 :            :         POSTING_READ(reg);
    5440                 :            : 
    5441                 :            :         reg = FDI_RX_CTL(pipe);
    5442                 :            :         temp = I915_READ(reg);
    5443                 :            :         temp &= ~(0x7 << 16);
    5444                 :            :         temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
    5445                 :            :         I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
    5446                 :            : 
    5447                 :            :         POSTING_READ(reg);
    5448                 :            :         udelay(100);
    5449                 :            : 
    5450                 :            :         /* Ironlake workaround, disable clock pointer after downing FDI */
    5451                 :            :         if (HAS_PCH_IBX(dev_priv))
    5452                 :            :                 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
    5453                 :            : 
    5454                 :            :         /* still set train pattern 1 */
    5455                 :            :         reg = FDI_TX_CTL(pipe);
    5456                 :            :         temp = I915_READ(reg);
    5457                 :            :         temp &= ~FDI_LINK_TRAIN_NONE;
    5458                 :            :         temp |= FDI_LINK_TRAIN_PATTERN_1;
    5459                 :            :         I915_WRITE(reg, temp);
    5460                 :            : 
    5461                 :            :         reg = FDI_RX_CTL(pipe);
    5462                 :            :         temp = I915_READ(reg);
    5463                 :            :         if (HAS_PCH_CPT(dev_priv)) {
    5464                 :            :                 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
    5465                 :            :                 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
    5466                 :            :         } else {
    5467                 :            :                 temp &= ~FDI_LINK_TRAIN_NONE;
    5468                 :            :                 temp |= FDI_LINK_TRAIN_PATTERN_1;
    5469                 :            :         }
    5470                 :            :         /* BPC in FDI rx is consistent with that in PIPECONF */
    5471                 :            :         temp &= ~(0x07 << 16);
    5472                 :            :         temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
    5473                 :            :         I915_WRITE(reg, temp);
    5474                 :            : 
    5475                 :            :         POSTING_READ(reg);
    5476                 :            :         udelay(100);
    5477                 :            : }
    5478                 :            : 
    5479                 :          0 : bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv)
    5480                 :            : {
    5481                 :          0 :         struct drm_crtc *crtc;
    5482                 :          0 :         bool cleanup_done;
    5483                 :            : 
    5484         [ #  # ]:          0 :         drm_for_each_crtc(crtc, &dev_priv->drm) {
    5485                 :          0 :                 struct drm_crtc_commit *commit;
    5486                 :          0 :                 spin_lock(&crtc->commit_lock);
    5487         [ #  # ]:          0 :                 commit = list_first_entry_or_null(&crtc->commit_list,
    5488                 :            :                                                   struct drm_crtc_commit, commit_entry);
    5489                 :          0 :                 cleanup_done = commit ?
    5490   [ #  #  #  # ]:          0 :                         try_wait_for_completion(&commit->cleanup_done) : true;
    5491                 :          0 :                 spin_unlock(&crtc->commit_lock);
    5492                 :            : 
    5493         [ #  # ]:          0 :                 if (cleanup_done)
    5494                 :          0 :                         continue;
    5495                 :            : 
    5496                 :          0 :                 drm_crtc_wait_one_vblank(crtc);
    5497                 :            : 
    5498                 :          0 :                 return true;
    5499                 :            :         }
    5500                 :            : 
    5501                 :            :         return false;
    5502                 :            : }
    5503                 :            : 
    5504                 :          0 : void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
    5505                 :            : {
    5506                 :          0 :         u32 temp;
    5507                 :            : 
    5508                 :          0 :         I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_GATE);
    5509                 :            : 
    5510                 :          0 :         mutex_lock(&dev_priv->sb_lock);
    5511                 :            : 
    5512                 :          0 :         temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
    5513                 :          0 :         temp |= SBI_SSCCTL_DISABLE;
    5514                 :          0 :         intel_sbi_write(dev_priv, SBI_SSCCTL6, temp, SBI_ICLK);
    5515                 :            : 
    5516                 :          0 :         mutex_unlock(&dev_priv->sb_lock);
    5517                 :          0 : }
    5518                 :            : 
    5519                 :            : /* Program iCLKIP clock to the desired frequency */
    5520                 :            : static void lpt_program_iclkip(const struct intel_crtc_state *crtc_state)
    5521                 :            : {
    5522                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5523                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    5524                 :            :         int clock = crtc_state->hw.adjusted_mode.crtc_clock;
    5525                 :            :         u32 divsel, phaseinc, auxdiv, phasedir = 0;
    5526                 :            :         u32 temp;
    5527                 :            : 
    5528                 :            :         lpt_disable_iclkip(dev_priv);
    5529                 :            : 
    5530                 :            :         /* The iCLK virtual clock root frequency is in MHz,
    5531                 :            :          * but the adjusted_mode->crtc_clock in in KHz. To get the
    5532                 :            :          * divisors, it is necessary to divide one by another, so we
    5533                 :            :          * convert the virtual clock precision to KHz here for higher
    5534                 :            :          * precision.
    5535                 :            :          */
    5536                 :            :         for (auxdiv = 0; auxdiv < 2; auxdiv++) {
    5537                 :            :                 u32 iclk_virtual_root_freq = 172800 * 1000;
    5538                 :            :                 u32 iclk_pi_range = 64;
    5539                 :            :                 u32 desired_divisor;
    5540                 :            : 
    5541                 :            :                 desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
    5542                 :            :                                                     clock << auxdiv);
    5543                 :            :                 divsel = (desired_divisor / iclk_pi_range) - 2;
    5544                 :            :                 phaseinc = desired_divisor % iclk_pi_range;
    5545                 :            : 
    5546                 :            :                 /*
    5547                 :            :                  * Near 20MHz is a corner case which is
    5548                 :            :                  * out of range for the 7-bit divisor
    5549                 :            :                  */
    5550                 :            :                 if (divsel <= 0x7f)
    5551                 :            :                         break;
    5552                 :            :         }
    5553                 :            : 
    5554                 :            :         /* This should not happen with any sane values */
    5555                 :            :         WARN_ON(SBI_SSCDIVINTPHASE_DIVSEL(divsel) &
    5556                 :            :                 ~SBI_SSCDIVINTPHASE_DIVSEL_MASK);
    5557                 :            :         WARN_ON(SBI_SSCDIVINTPHASE_DIR(phasedir) &
    5558                 :            :                 ~SBI_SSCDIVINTPHASE_INCVAL_MASK);
    5559                 :            : 
    5560                 :            :         DRM_DEBUG_KMS("iCLKIP clock: found settings for %dKHz refresh rate: auxdiv=%x, divsel=%x, phasedir=%x, phaseinc=%x\n",
    5561                 :            :                         clock,
    5562                 :            :                         auxdiv,
    5563                 :            :                         divsel,
    5564                 :            :                         phasedir,
    5565                 :            :                         phaseinc);
    5566                 :            : 
    5567                 :            :         mutex_lock(&dev_priv->sb_lock);
    5568                 :            : 
    5569                 :            :         /* Program SSCDIVINTPHASE6 */
    5570                 :            :         temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
    5571                 :            :         temp &= ~SBI_SSCDIVINTPHASE_DIVSEL_MASK;
    5572                 :            :         temp |= SBI_SSCDIVINTPHASE_DIVSEL(divsel);
    5573                 :            :         temp &= ~SBI_SSCDIVINTPHASE_INCVAL_MASK;
    5574                 :            :         temp |= SBI_SSCDIVINTPHASE_INCVAL(phaseinc);
    5575                 :            :         temp |= SBI_SSCDIVINTPHASE_DIR(phasedir);
    5576                 :            :         temp |= SBI_SSCDIVINTPHASE_PROPAGATE;
    5577                 :            :         intel_sbi_write(dev_priv, SBI_SSCDIVINTPHASE6, temp, SBI_ICLK);
    5578                 :            : 
    5579                 :            :         /* Program SSCAUXDIV */
    5580                 :            :         temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
    5581                 :            :         temp &= ~SBI_SSCAUXDIV_FINALDIV2SEL(1);
    5582                 :            :         temp |= SBI_SSCAUXDIV_FINALDIV2SEL(auxdiv);
    5583                 :            :         intel_sbi_write(dev_priv, SBI_SSCAUXDIV6, temp, SBI_ICLK);
    5584                 :            : 
    5585                 :            :         /* Enable modulator and associated divider */
    5586                 :            :         temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
    5587                 :            :         temp &= ~SBI_SSCCTL_DISABLE;
    5588                 :            :         intel_sbi_write(dev_priv, SBI_SSCCTL6, temp, SBI_ICLK);
    5589                 :            : 
    5590                 :            :         mutex_unlock(&dev_priv->sb_lock);
    5591                 :            : 
    5592                 :            :         /* Wait for initialization time */
    5593                 :            :         udelay(24);
    5594                 :            : 
    5595                 :            :         I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE);
    5596                 :            : }
    5597                 :            : 
    5598                 :          0 : int lpt_get_iclkip(struct drm_i915_private *dev_priv)
    5599                 :            : {
    5600                 :          0 :         u32 divsel, phaseinc, auxdiv;
    5601                 :          0 :         u32 iclk_virtual_root_freq = 172800 * 1000;
    5602                 :          0 :         u32 iclk_pi_range = 64;
    5603                 :          0 :         u32 desired_divisor;
    5604                 :          0 :         u32 temp;
    5605                 :            : 
    5606         [ #  # ]:          0 :         if ((I915_READ(PIXCLK_GATE) & PIXCLK_GATE_UNGATE) == 0)
    5607                 :            :                 return 0;
    5608                 :            : 
    5609                 :          0 :         mutex_lock(&dev_priv->sb_lock);
    5610                 :            : 
    5611                 :          0 :         temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
    5612         [ #  # ]:          0 :         if (temp & SBI_SSCCTL_DISABLE) {
    5613                 :          0 :                 mutex_unlock(&dev_priv->sb_lock);
    5614                 :          0 :                 return 0;
    5615                 :            :         }
    5616                 :            : 
    5617                 :          0 :         temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
    5618                 :          0 :         divsel = (temp & SBI_SSCDIVINTPHASE_DIVSEL_MASK) >>
    5619                 :            :                 SBI_SSCDIVINTPHASE_DIVSEL_SHIFT;
    5620                 :          0 :         phaseinc = (temp & SBI_SSCDIVINTPHASE_INCVAL_MASK) >>
    5621                 :            :                 SBI_SSCDIVINTPHASE_INCVAL_SHIFT;
    5622                 :            : 
    5623                 :          0 :         temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
    5624                 :          0 :         auxdiv = (temp & SBI_SSCAUXDIV_FINALDIV2SEL_MASK) >>
    5625                 :            :                 SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT;
    5626                 :            : 
    5627                 :          0 :         mutex_unlock(&dev_priv->sb_lock);
    5628                 :            : 
    5629                 :          0 :         desired_divisor = (divsel + 2) * iclk_pi_range + phaseinc;
    5630                 :            : 
    5631                 :          0 :         return DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
    5632                 :            :                                  desired_divisor << auxdiv);
    5633                 :            : }
    5634                 :            : 
    5635                 :            : static void ilk_pch_transcoder_set_timings(const struct intel_crtc_state *crtc_state,
    5636                 :            :                                            enum pipe pch_transcoder)
    5637                 :            : {
    5638                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5639                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    5640                 :            :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    5641                 :            : 
    5642                 :            :         I915_WRITE(PCH_TRANS_HTOTAL(pch_transcoder),
    5643                 :            :                    I915_READ(HTOTAL(cpu_transcoder)));
    5644                 :            :         I915_WRITE(PCH_TRANS_HBLANK(pch_transcoder),
    5645                 :            :                    I915_READ(HBLANK(cpu_transcoder)));
    5646                 :            :         I915_WRITE(PCH_TRANS_HSYNC(pch_transcoder),
    5647                 :            :                    I915_READ(HSYNC(cpu_transcoder)));
    5648                 :            : 
    5649                 :            :         I915_WRITE(PCH_TRANS_VTOTAL(pch_transcoder),
    5650                 :            :                    I915_READ(VTOTAL(cpu_transcoder)));
    5651                 :            :         I915_WRITE(PCH_TRANS_VBLANK(pch_transcoder),
    5652                 :            :                    I915_READ(VBLANK(cpu_transcoder)));
    5653                 :            :         I915_WRITE(PCH_TRANS_VSYNC(pch_transcoder),
    5654                 :            :                    I915_READ(VSYNC(cpu_transcoder)));
    5655                 :            :         I915_WRITE(PCH_TRANS_VSYNCSHIFT(pch_transcoder),
    5656                 :            :                    I915_READ(VSYNCSHIFT(cpu_transcoder)));
    5657                 :            : }
    5658                 :            : 
    5659                 :          0 : static void cpt_set_fdi_bc_bifurcation(struct drm_i915_private *dev_priv, bool enable)
    5660                 :            : {
    5661                 :          0 :         u32 temp;
    5662                 :            : 
    5663                 :          0 :         temp = I915_READ(SOUTH_CHICKEN1);
    5664         [ #  # ]:          0 :         if (!!(temp & FDI_BC_BIFURCATION_SELECT) == enable)
    5665                 :            :                 return;
    5666                 :            : 
    5667         [ #  # ]:          0 :         WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
    5668         [ #  # ]:          0 :         WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
    5669                 :            : 
    5670                 :          0 :         temp &= ~FDI_BC_BIFURCATION_SELECT;
    5671         [ #  # ]:          0 :         if (enable)
    5672                 :          0 :                 temp |= FDI_BC_BIFURCATION_SELECT;
    5673                 :            : 
    5674         [ #  # ]:          0 :         DRM_DEBUG_KMS("%sabling fdi C rx\n", enable ? "en" : "dis");
    5675                 :          0 :         I915_WRITE(SOUTH_CHICKEN1, temp);
    5676                 :          0 :         POSTING_READ(SOUTH_CHICKEN1);
    5677                 :            : }
    5678                 :            : 
    5679                 :            : static void ivb_update_fdi_bc_bifurcation(const struct intel_crtc_state *crtc_state)
    5680                 :            : {
    5681                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5682                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    5683                 :            : 
    5684                 :            :         switch (crtc->pipe) {
    5685                 :            :         case PIPE_A:
    5686                 :            :                 break;
    5687                 :            :         case PIPE_B:
    5688                 :            :                 if (crtc_state->fdi_lanes > 2)
    5689                 :            :                         cpt_set_fdi_bc_bifurcation(dev_priv, false);
    5690                 :            :                 else
    5691                 :            :                         cpt_set_fdi_bc_bifurcation(dev_priv, true);
    5692                 :            : 
    5693                 :            :                 break;
    5694                 :            :         case PIPE_C:
    5695                 :            :                 cpt_set_fdi_bc_bifurcation(dev_priv, true);
    5696                 :            : 
    5697                 :            :                 break;
    5698                 :            :         default:
    5699                 :            :                 BUG();
    5700                 :            :         }
    5701                 :            : }
    5702                 :            : 
    5703                 :            : /*
    5704                 :            :  * Finds the encoder associated with the given CRTC. This can only be
    5705                 :            :  * used when we know that the CRTC isn't feeding multiple encoders!
    5706                 :            :  */
    5707                 :            : static struct intel_encoder *
    5708                 :            : intel_get_crtc_new_encoder(const struct intel_atomic_state *state,
    5709                 :            :                            const struct intel_crtc_state *crtc_state)
    5710                 :            : {
    5711                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5712                 :            :         const struct drm_connector_state *connector_state;
    5713                 :            :         const struct drm_connector *connector;
    5714                 :            :         struct intel_encoder *encoder = NULL;
    5715                 :            :         int num_encoders = 0;
    5716                 :            :         int i;
    5717                 :            : 
    5718                 :            :         for_each_new_connector_in_state(&state->base, connector, connector_state, i) {
    5719                 :            :                 if (connector_state->crtc != &crtc->base)
    5720                 :            :                         continue;
    5721                 :            : 
    5722                 :            :                 encoder = to_intel_encoder(connector_state->best_encoder);
    5723                 :            :                 num_encoders++;
    5724                 :            :         }
    5725                 :            : 
    5726                 :            :         WARN(num_encoders != 1, "%d encoders for pipe %c\n",
    5727                 :            :              num_encoders, pipe_name(crtc->pipe));
    5728                 :            : 
    5729                 :            :         return encoder;
    5730                 :            : }
    5731                 :            : 
    5732                 :            : /*
    5733                 :            :  * Enable PCH resources required for PCH ports:
    5734                 :            :  *   - PCH PLLs
    5735                 :            :  *   - FDI training & RX/TX
    5736                 :            :  *   - update transcoder timings
    5737                 :            :  *   - DP transcoding bits
    5738                 :            :  *   - transcoder
    5739                 :            :  */
    5740                 :          0 : static void ilk_pch_enable(const struct intel_atomic_state *state,
    5741                 :            :                            const struct intel_crtc_state *crtc_state)
    5742                 :            : {
    5743                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5744                 :          0 :         struct drm_device *dev = crtc->base.dev;
    5745                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    5746                 :          0 :         enum pipe pipe = crtc->pipe;
    5747                 :          0 :         u32 temp;
    5748                 :            : 
    5749                 :          0 :         assert_pch_transcoder_disabled(dev_priv, pipe);
    5750                 :            : 
    5751         [ #  # ]:          0 :         if (IS_IVYBRIDGE(dev_priv))
    5752                 :          0 :                 ivb_update_fdi_bc_bifurcation(crtc_state);
    5753                 :            : 
    5754                 :            :         /* Write the TU size bits before fdi link training, so that error
    5755                 :            :          * detection works. */
    5756                 :          0 :         I915_WRITE(FDI_RX_TUSIZE1(pipe),
    5757                 :            :                    I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
    5758                 :            : 
    5759                 :            :         /* For PCH output, training FDI link */
    5760                 :          0 :         dev_priv->display.fdi_link_train(crtc, crtc_state);
    5761                 :            : 
    5762                 :            :         /* We need to program the right clock selection before writing the pixel
    5763                 :            :          * mutliplier into the DPLL. */
    5764         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv)) {
    5765                 :          0 :                 u32 sel;
    5766                 :            : 
    5767                 :          0 :                 temp = I915_READ(PCH_DPLL_SEL);
    5768                 :          0 :                 temp |= TRANS_DPLL_ENABLE(pipe);
    5769                 :          0 :                 sel = TRANS_DPLLB_SEL(pipe);
    5770         [ #  # ]:          0 :                 if (crtc_state->shared_dpll ==
    5771                 :          0 :                     intel_get_shared_dpll_by_id(dev_priv, DPLL_ID_PCH_PLL_B))
    5772                 :          0 :                         temp |= sel;
    5773                 :            :                 else
    5774                 :          0 :                         temp &= ~sel;
    5775                 :          0 :                 I915_WRITE(PCH_DPLL_SEL, temp);
    5776                 :            :         }
    5777                 :            : 
    5778                 :            :         /* XXX: pch pll's can be enabled any time before we enable the PCH
    5779                 :            :          * transcoder, and we actually should do this to not upset any PCH
    5780                 :            :          * transcoder that already use the clock when we share it.
    5781                 :            :          *
    5782                 :            :          * Note that enable_shared_dpll tries to do the right thing, but
    5783                 :            :          * get_shared_dpll unconditionally resets the pll - we need that to have
    5784                 :            :          * the right LVDS enable sequence. */
    5785                 :          0 :         intel_enable_shared_dpll(crtc_state);
    5786                 :            : 
    5787                 :            :         /* set transcoder timing, panel must allow it */
    5788                 :          0 :         assert_panel_unlocked(dev_priv, pipe);
    5789                 :          0 :         ilk_pch_transcoder_set_timings(crtc_state, pipe);
    5790                 :            : 
    5791                 :          0 :         intel_fdi_normal_train(crtc);
    5792                 :            : 
    5793                 :            :         /* For PCH DP, enable TRANS_DP_CTL */
    5794   [ #  #  #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv) &&
    5795         [ #  # ]:          0 :             intel_crtc_has_dp_encoder(crtc_state)) {
    5796                 :          0 :                 const struct drm_display_mode *adjusted_mode =
    5797                 :            :                         &crtc_state->hw.adjusted_mode;
    5798                 :          0 :                 u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
    5799                 :          0 :                 i915_reg_t reg = TRANS_DP_CTL(pipe);
    5800                 :          0 :                 enum port port;
    5801                 :            : 
    5802                 :          0 :                 temp = I915_READ(reg);
    5803                 :          0 :                 temp &= ~(TRANS_DP_PORT_SEL_MASK |
    5804                 :            :                           TRANS_DP_SYNC_MASK |
    5805                 :            :                           TRANS_DP_BPC_MASK);
    5806                 :          0 :                 temp |= TRANS_DP_OUTPUT_ENABLE;
    5807                 :          0 :                 temp |= bpc << 9; /* same format but at 11:9 */
    5808                 :            : 
    5809         [ #  # ]:          0 :                 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
    5810                 :          0 :                         temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
    5811         [ #  # ]:          0 :                 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
    5812                 :          0 :                         temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
    5813                 :            : 
    5814                 :          0 :                 port = intel_get_crtc_new_encoder(state, crtc_state)->port;
    5815         [ #  # ]:          0 :                 WARN_ON(port < PORT_B || port > PORT_D);
    5816                 :          0 :                 temp |= TRANS_DP_PORT_SEL(port);
    5817                 :            : 
    5818                 :          0 :                 I915_WRITE(reg, temp);
    5819                 :            :         }
    5820                 :            : 
    5821                 :          0 :         ilk_enable_pch_transcoder(crtc_state);
    5822                 :          0 : }
    5823                 :            : 
    5824                 :            : static void lpt_pch_enable(const struct intel_atomic_state *state,
    5825                 :            :                            const struct intel_crtc_state *crtc_state)
    5826                 :            : {
    5827                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    5828                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    5829                 :            :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    5830                 :            : 
    5831                 :            :         assert_pch_transcoder_disabled(dev_priv, PIPE_A);
    5832                 :            : 
    5833                 :            :         lpt_program_iclkip(crtc_state);
    5834                 :            : 
    5835                 :            :         /* Set transcoder timing. */
    5836                 :            :         ilk_pch_transcoder_set_timings(crtc_state, PIPE_A);
    5837                 :            : 
    5838                 :            :         lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
    5839                 :            : }
    5840                 :            : 
    5841                 :          0 : static void cpt_verify_modeset(struct drm_i915_private *dev_priv,
    5842                 :            :                                enum pipe pipe)
    5843                 :            : {
    5844                 :          0 :         i915_reg_t dslreg = PIPEDSL(pipe);
    5845                 :          0 :         u32 temp;
    5846                 :            : 
    5847                 :          0 :         temp = I915_READ(dslreg);
    5848                 :          0 :         udelay(500);
    5849   [ #  #  #  #  :          0 :         if (wait_for(I915_READ(dslreg) != temp, 5)) {
             #  #  #  # ]
    5850   [ #  #  #  #  :          0 :                 if (wait_for(I915_READ(dslreg) != temp, 5))
             #  #  #  # ]
    5851                 :          0 :                         DRM_ERROR("mode set failed: pipe %c stuck\n", pipe_name(pipe));
    5852                 :            :         }
    5853                 :          0 : }
    5854                 :            : 
    5855                 :            : /*
    5856                 :            :  * The hardware phase 0.0 refers to the center of the pixel.
    5857                 :            :  * We want to start from the top/left edge which is phase
    5858                 :            :  * -0.5. That matches how the hardware calculates the scaling
    5859                 :            :  * factors (from top-left of the first pixel to bottom-right
    5860                 :            :  * of the last pixel, as opposed to the pixel centers).
    5861                 :            :  *
    5862                 :            :  * For 4:2:0 subsampled chroma planes we obviously have to
    5863                 :            :  * adjust that so that the chroma sample position lands in
    5864                 :            :  * the right spot.
    5865                 :            :  *
    5866                 :            :  * Note that for packed YCbCr 4:2:2 formats there is no way to
    5867                 :            :  * control chroma siting. The hardware simply replicates the
    5868                 :            :  * chroma samples for both of the luma samples, and thus we don't
    5869                 :            :  * actually get the expected MPEG2 chroma siting convention :(
    5870                 :            :  * The same behaviour is observed on pre-SKL platforms as well.
    5871                 :            :  *
    5872                 :            :  * Theory behind the formula (note that we ignore sub-pixel
    5873                 :            :  * source coordinates):
    5874                 :            :  * s = source sample position
    5875                 :            :  * d = destination sample position
    5876                 :            :  *
    5877                 :            :  * Downscaling 4:1:
    5878                 :            :  * -0.5
    5879                 :            :  * | 0.0
    5880                 :            :  * | |     1.5 (initial phase)
    5881                 :            :  * | |     |
    5882                 :            :  * v v     v
    5883                 :            :  * | s | s | s | s |
    5884                 :            :  * |       d       |
    5885                 :            :  *
    5886                 :            :  * Upscaling 1:4:
    5887                 :            :  * -0.5
    5888                 :            :  * | -0.375 (initial phase)
    5889                 :            :  * | |     0.0
    5890                 :            :  * | |     |
    5891                 :            :  * v v     v
    5892                 :            :  * |       s       |
    5893                 :            :  * | d | d | d | d |
    5894                 :            :  */
    5895                 :          0 : u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_cosited)
    5896                 :            : {
    5897                 :          0 :         int phase = -0x8000;
    5898                 :          0 :         u16 trip = 0;
    5899                 :            : 
    5900         [ #  # ]:          0 :         if (chroma_cosited)
    5901                 :          0 :                 phase += (sub - 1) * 0x8000 / sub;
    5902                 :            : 
    5903                 :          0 :         phase += scale / (2 * sub);
    5904                 :            : 
    5905                 :            :         /*
    5906                 :            :          * Hardware initial phase limited to [-0.5:1.5].
    5907                 :            :          * Since the max hardware scale factor is 3.0, we
    5908                 :            :          * should never actually excdeed 1.0 here.
    5909                 :            :          */
    5910         [ #  # ]:          0 :         WARN_ON(phase < -0x8000 || phase > 0x18000);
    5911                 :            : 
    5912         [ #  # ]:          0 :         if (phase < 0)
    5913                 :          0 :                 phase = 0x10000 + phase;
    5914                 :            :         else
    5915                 :            :                 trip = PS_PHASE_TRIP;
    5916                 :            : 
    5917                 :          0 :         return ((phase >> 2) & PS_PHASE_MASK) | trip;
    5918                 :            : }
    5919                 :            : 
    5920                 :            : #define SKL_MIN_SRC_W 8
    5921                 :            : #define SKL_MAX_SRC_W 4096
    5922                 :            : #define SKL_MIN_SRC_H 8
    5923                 :            : #define SKL_MAX_SRC_H 4096
    5924                 :            : #define SKL_MIN_DST_W 8
    5925                 :            : #define SKL_MAX_DST_W 4096
    5926                 :            : #define SKL_MIN_DST_H 8
    5927                 :            : #define SKL_MAX_DST_H 4096
    5928                 :            : #define ICL_MAX_SRC_W 5120
    5929                 :            : #define ICL_MAX_SRC_H 4096
    5930                 :            : #define ICL_MAX_DST_W 5120
    5931                 :            : #define ICL_MAX_DST_H 4096
    5932                 :            : #define SKL_MIN_YUV_420_SRC_W 16
    5933                 :            : #define SKL_MIN_YUV_420_SRC_H 16
    5934                 :            : 
    5935                 :            : static int
    5936                 :          0 : skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
    5937                 :            :                   unsigned int scaler_user, int *scaler_id,
    5938                 :            :                   int src_w, int src_h, int dst_w, int dst_h,
    5939                 :            :                   const struct drm_format_info *format,
    5940                 :            :                   u64 modifier, bool need_scaler)
    5941                 :            : {
    5942                 :          0 :         struct intel_crtc_scaler_state *scaler_state =
    5943                 :            :                 &crtc_state->scaler_state;
    5944                 :          0 :         struct intel_crtc *intel_crtc =
    5945                 :          0 :                 to_intel_crtc(crtc_state->uapi.crtc);
    5946         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
    5947                 :          0 :         const struct drm_display_mode *adjusted_mode =
    5948                 :            :                 &crtc_state->hw.adjusted_mode;
    5949                 :            : 
    5950                 :            :         /*
    5951                 :            :          * Src coordinates are already rotated by 270 degrees for
    5952                 :            :          * the 90/270 degree plane rotation cases (to match the
    5953                 :            :          * GTT mapping), hence no need to account for rotation here.
    5954                 :            :          */
    5955         [ #  # ]:          0 :         if (src_w != dst_w || src_h != dst_h)
    5956                 :          0 :                 need_scaler = true;
    5957                 :            : 
    5958                 :            :         /*
    5959                 :            :          * Scaling/fitting not supported in IF-ID mode in GEN9+
    5960                 :            :          * TODO: Interlace fetch mode doesn't support YUV420 planar formats.
    5961                 :            :          * Once NV12 is enabled, handle it here while allocating scaler
    5962                 :            :          * for NV12.
    5963                 :            :          */
    5964   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) >= 9 && crtc_state->hw.enable &&
                   #  # ]
    5965         [ #  # ]:          0 :             need_scaler && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
    5966                 :          0 :                 DRM_DEBUG_KMS("Pipe/Plane scaling not supported with IF-ID mode\n");
    5967                 :          0 :                 return -EINVAL;
    5968                 :            :         }
    5969                 :            : 
    5970                 :            :         /*
    5971                 :            :          * if plane is being disabled or scaler is no more required or force detach
    5972                 :            :          *  - free scaler binded to this plane/crtc
    5973                 :            :          *  - in order to do this, update crtc->scaler_usage
    5974                 :            :          *
    5975                 :            :          * Here scaler state in crtc_state is set free so that
    5976                 :            :          * scaler can be assigned to other user. Actual register
    5977                 :            :          * update to free the scaler is done in plane/panel-fit programming.
    5978                 :            :          * For this purpose crtc/plane_state->scaler_id isn't reset here.
    5979                 :            :          */
    5980         [ #  # ]:          0 :         if (force_detach || !need_scaler) {
    5981         [ #  # ]:          0 :                 if (*scaler_id >= 0) {
    5982                 :          0 :                         scaler_state->scaler_users &= ~(1 << scaler_user);
    5983                 :          0 :                         scaler_state->scalers[*scaler_id].in_use = 0;
    5984                 :            : 
    5985                 :          0 :                         DRM_DEBUG_KMS("scaler_user index %u.%u: "
    5986                 :            :                                 "Staged freeing scaler id %d scaler_users = 0x%x\n",
    5987                 :            :                                 intel_crtc->pipe, scaler_user, *scaler_id,
    5988                 :            :                                 scaler_state->scaler_users);
    5989                 :          0 :                         *scaler_id = -1;
    5990                 :            :                 }
    5991                 :          0 :                 return 0;
    5992                 :            :         }
    5993                 :            : 
    5994   [ #  #  #  # ]:          0 :         if (format && intel_format_info_is_yuv_semiplanar(format, modifier) &&
    5995         [ #  # ]:          0 :             (src_h < SKL_MIN_YUV_420_SRC_H || src_w < SKL_MIN_YUV_420_SRC_W)) {
    5996                 :          0 :                 DRM_DEBUG_KMS("Planar YUV: src dimensions not met\n");
    5997                 :          0 :                 return -EINVAL;
    5998                 :            :         }
    5999                 :            : 
    6000                 :            :         /* range checks */
    6001         [ #  # ]:          0 :         if (src_w < SKL_MIN_SRC_W || src_h < SKL_MIN_SRC_H ||
    6002   [ #  #  #  # ]:          0 :             dst_w < SKL_MIN_DST_W || dst_h < SKL_MIN_DST_H ||
    6003                 :          0 :             (INTEL_GEN(dev_priv) >= 11 &&
    6004         [ #  # ]:          0 :              (src_w > ICL_MAX_SRC_W || src_h > ICL_MAX_SRC_H ||
    6005   [ #  #  #  # ]:          0 :               dst_w > ICL_MAX_DST_W || dst_h > ICL_MAX_DST_H)) ||
    6006                 :          0 :             (INTEL_GEN(dev_priv) < 11 &&
    6007         [ #  # ]:          0 :              (src_w > SKL_MAX_SRC_W || src_h > SKL_MAX_SRC_H ||
    6008         [ #  # ]:          0 :               dst_w > SKL_MAX_DST_W || dst_h > SKL_MAX_DST_H)))   {
    6009                 :          0 :                 DRM_DEBUG_KMS("scaler_user index %u.%u: src %ux%u dst %ux%u "
    6010                 :            :                         "size is out of scaler range\n",
    6011                 :            :                         intel_crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h);
    6012                 :          0 :                 return -EINVAL;
    6013                 :            :         }
    6014                 :            : 
    6015                 :            :         /* mark this plane as a scaler user in crtc_state */
    6016                 :          0 :         scaler_state->scaler_users |= (1 << scaler_user);
    6017                 :          0 :         DRM_DEBUG_KMS("scaler_user index %u.%u: "
    6018                 :            :                 "staged scaling request for %ux%u->%ux%u scaler_users = 0x%x\n",
    6019                 :            :                 intel_crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h,
    6020                 :            :                 scaler_state->scaler_users);
    6021                 :            : 
    6022                 :          0 :         return 0;
    6023                 :            : }
    6024                 :            : 
    6025                 :            : /**
    6026                 :            :  * skl_update_scaler_crtc - Stages update to scaler state for a given crtc.
    6027                 :            :  *
    6028                 :            :  * @state: crtc's scaler state
    6029                 :            :  *
    6030                 :            :  * Return
    6031                 :            :  *     0 - scaler_usage updated successfully
    6032                 :            :  *    error - requested scaling cannot be supported or other error condition
    6033                 :            :  */
    6034                 :          0 : int skl_update_scaler_crtc(struct intel_crtc_state *state)
    6035                 :            : {
    6036                 :          0 :         const struct drm_display_mode *adjusted_mode = &state->hw.adjusted_mode;
    6037                 :          0 :         bool need_scaler = false;
    6038                 :            : 
    6039         [ #  # ]:          0 :         if (state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
    6040                 :          0 :                 need_scaler = true;
    6041                 :            : 
    6042                 :          0 :         return skl_update_scaler(state, !state->hw.active, SKL_CRTC_INDEX,
    6043                 :            :                                  &state->scaler_state.scaler_id,
    6044                 :            :                                  state->pipe_src_w, state->pipe_src_h,
    6045                 :            :                                  adjusted_mode->crtc_hdisplay,
    6046                 :            :                                  adjusted_mode->crtc_vdisplay, NULL, 0,
    6047                 :          0 :                                  need_scaler);
    6048                 :            : }
    6049                 :            : 
    6050                 :            : /**
    6051                 :            :  * skl_update_scaler_plane - Stages update to scaler state for a given plane.
    6052                 :            :  * @crtc_state: crtc's scaler state
    6053                 :            :  * @plane_state: atomic plane state to update
    6054                 :            :  *
    6055                 :            :  * Return
    6056                 :            :  *     0 - scaler_usage updated successfully
    6057                 :            :  *    error - requested scaling cannot be supported or other error condition
    6058                 :            :  */
    6059                 :          0 : static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
    6060                 :            :                                    struct intel_plane_state *plane_state)
    6061                 :            : {
    6062                 :          0 :         struct intel_plane *intel_plane =
    6063                 :          0 :                 to_intel_plane(plane_state->uapi.plane);
    6064         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
    6065                 :          0 :         struct drm_framebuffer *fb = plane_state->hw.fb;
    6066                 :          0 :         int ret;
    6067   [ #  #  #  # ]:          0 :         bool force_detach = !fb || !plane_state->uapi.visible;
    6068                 :          0 :         bool need_scaler = false;
    6069                 :            : 
    6070                 :            :         /* Pre-gen11 and SDR planes always need a scaler for planar formats. */
    6071   [ #  #  #  # ]:          0 :         if (!icl_is_hdr_plane(dev_priv, intel_plane->id) &&
    6072   [ #  #  #  # ]:          0 :             fb && intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier))
    6073                 :          0 :                 need_scaler = true;
    6074                 :            : 
    6075   [ #  #  #  # ]:          0 :         ret = skl_update_scaler(crtc_state, force_detach,
    6076                 :            :                                 drm_plane_index(&intel_plane->base),
    6077                 :            :                                 &plane_state->scaler_id,
    6078                 :          0 :                                 drm_rect_width(&plane_state->uapi.src) >> 16,
    6079                 :          0 :                                 drm_rect_height(&plane_state->uapi.src) >> 16,
    6080                 :            :                                 drm_rect_width(&plane_state->uapi.dst),
    6081                 :            :                                 drm_rect_height(&plane_state->uapi.dst),
    6082                 :            :                                 fb ? fb->format : NULL,
    6083                 :            :                                 fb ? fb->modifier : 0,
    6084                 :            :                                 need_scaler);
    6085                 :            : 
    6086   [ #  #  #  # ]:          0 :         if (ret || plane_state->scaler_id < 0)
    6087                 :            :                 return ret;
    6088                 :            : 
    6089                 :            :         /* check colorkey */
    6090         [ #  # ]:          0 :         if (plane_state->ckey.flags) {
    6091                 :          0 :                 DRM_DEBUG_KMS("[PLANE:%d:%s] scaling with color key not allowed",
    6092                 :            :                               intel_plane->base.base.id,
    6093                 :            :                               intel_plane->base.name);
    6094                 :          0 :                 return -EINVAL;
    6095                 :            :         }
    6096                 :            : 
    6097                 :            :         /* Check src format */
    6098      [ #  #  # ]:          0 :         switch (fb->format->format) {
    6099                 :            :         case DRM_FORMAT_RGB565:
    6100                 :            :         case DRM_FORMAT_XBGR8888:
    6101                 :            :         case DRM_FORMAT_XRGB8888:
    6102                 :            :         case DRM_FORMAT_ABGR8888:
    6103                 :            :         case DRM_FORMAT_ARGB8888:
    6104                 :            :         case DRM_FORMAT_XRGB2101010:
    6105                 :            :         case DRM_FORMAT_XBGR2101010:
    6106                 :            :         case DRM_FORMAT_ARGB2101010:
    6107                 :            :         case DRM_FORMAT_ABGR2101010:
    6108                 :            :         case DRM_FORMAT_YUYV:
    6109                 :            :         case DRM_FORMAT_YVYU:
    6110                 :            :         case DRM_FORMAT_UYVY:
    6111                 :            :         case DRM_FORMAT_VYUY:
    6112                 :            :         case DRM_FORMAT_NV12:
    6113                 :            :         case DRM_FORMAT_P010:
    6114                 :            :         case DRM_FORMAT_P012:
    6115                 :            :         case DRM_FORMAT_P016:
    6116                 :            :         case DRM_FORMAT_Y210:
    6117                 :            :         case DRM_FORMAT_Y212:
    6118                 :            :         case DRM_FORMAT_Y216:
    6119                 :            :         case DRM_FORMAT_XVYU2101010:
    6120                 :            :         case DRM_FORMAT_XVYU12_16161616:
    6121                 :            :         case DRM_FORMAT_XVYU16161616:
    6122                 :            :                 break;
    6123                 :          0 :         case DRM_FORMAT_XBGR16161616F:
    6124                 :            :         case DRM_FORMAT_ABGR16161616F:
    6125                 :            :         case DRM_FORMAT_XRGB16161616F:
    6126                 :            :         case DRM_FORMAT_ARGB16161616F:
    6127         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 11)
    6128                 :            :                         break;
    6129                 :            :                 /* fall through */
    6130                 :            :         default:
    6131                 :          0 :                 DRM_DEBUG_KMS("[PLANE:%d:%s] FB:%d unsupported scaling format 0x%x\n",
    6132                 :            :                               intel_plane->base.base.id, intel_plane->base.name,
    6133                 :            :                               fb->base.id, fb->format->format);
    6134                 :          0 :                 return -EINVAL;
    6135                 :            :         }
    6136                 :            : 
    6137                 :          0 :         return 0;
    6138                 :            : }
    6139                 :            : 
    6140                 :          0 : void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state)
    6141                 :            : {
    6142                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
    6143                 :          0 :         int i;
    6144                 :            : 
    6145         [ #  # ]:          0 :         for (i = 0; i < crtc->num_scalers; i++)
    6146                 :          0 :                 skl_detach_scaler(crtc, i);
    6147                 :          0 : }
    6148                 :            : 
    6149                 :          0 : static void skl_pfit_enable(const struct intel_crtc_state *crtc_state)
    6150                 :            : {
    6151                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6152         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6153                 :          0 :         enum pipe pipe = crtc->pipe;
    6154                 :          0 :         const struct intel_crtc_scaler_state *scaler_state =
    6155                 :            :                 &crtc_state->scaler_state;
    6156                 :            : 
    6157         [ #  # ]:          0 :         if (crtc_state->pch_pfit.enabled) {
    6158                 :          0 :                 u16 uv_rgb_hphase, uv_rgb_vphase;
    6159                 :          0 :                 int pfit_w, pfit_h, hscale, vscale;
    6160                 :          0 :                 int id;
    6161                 :            : 
    6162   [ #  #  #  # ]:          0 :                 if (WARN_ON(crtc_state->scaler_state.scaler_id < 0))
    6163                 :            :                         return;
    6164                 :            : 
    6165                 :          0 :                 pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
    6166                 :          0 :                 pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
    6167                 :            : 
    6168                 :          0 :                 hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
    6169                 :          0 :                 vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
    6170                 :            : 
    6171                 :          0 :                 uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
    6172                 :          0 :                 uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
    6173                 :            : 
    6174                 :          0 :                 id = scaler_state->scaler_id;
    6175                 :          0 :                 I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
    6176                 :            :                         PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
    6177                 :          0 :                 I915_WRITE_FW(SKL_PS_VPHASE(pipe, id),
    6178                 :            :                               PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
    6179                 :          0 :                 I915_WRITE_FW(SKL_PS_HPHASE(pipe, id),
    6180                 :            :                               PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
    6181                 :          0 :                 I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc_state->pch_pfit.pos);
    6182                 :          0 :                 I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc_state->pch_pfit.size);
    6183                 :            :         }
    6184                 :            : }
    6185                 :            : 
    6186                 :          0 : static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
    6187                 :            : {
    6188                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6189         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6190                 :          0 :         enum pipe pipe = crtc->pipe;
    6191                 :            : 
    6192         [ #  # ]:          0 :         if (crtc_state->pch_pfit.enabled) {
    6193                 :            :                 /* Force use of hard-coded filter coefficients
    6194                 :            :                  * as some pre-programmed values are broken,
    6195                 :            :                  * e.g. x201.
    6196                 :            :                  */
    6197   [ #  #  #  # ]:          0 :                 if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
    6198                 :          0 :                         I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 |
    6199                 :            :                                                  PF_PIPE_SEL_IVB(pipe));
    6200                 :            :                 else
    6201                 :          0 :                         I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
    6202                 :          0 :                 I915_WRITE(PF_WIN_POS(pipe), crtc_state->pch_pfit.pos);
    6203                 :          0 :                 I915_WRITE(PF_WIN_SZ(pipe), crtc_state->pch_pfit.size);
    6204                 :            :         }
    6205                 :          0 : }
    6206                 :            : 
    6207                 :          0 : void hsw_enable_ips(const struct intel_crtc_state *crtc_state)
    6208                 :            : {
    6209                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6210                 :          0 :         struct drm_device *dev = crtc->base.dev;
    6211         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    6212                 :            : 
    6213         [ #  # ]:          0 :         if (!crtc_state->ips_enabled)
    6214                 :            :                 return;
    6215                 :            : 
    6216                 :            :         /*
    6217                 :            :          * We can only enable IPS after we enable a plane and wait for a vblank
    6218                 :            :          * This function is called from post_plane_update, which is run after
    6219                 :            :          * a vblank wait.
    6220                 :            :          */
    6221         [ #  # ]:          0 :         WARN_ON(!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)));
    6222                 :            : 
    6223         [ #  # ]:          0 :         if (IS_BROADWELL(dev_priv)) {
    6224         [ #  # ]:          0 :                 WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL,
    6225                 :            :                                                 IPS_ENABLE | IPS_PCODE_CONTROL));
    6226                 :            :                 /* Quoting Art Runyan: "its not safe to expect any particular
    6227                 :            :                  * value in IPS_CTL bit 31 after enabling IPS through the
    6228                 :            :                  * mailbox." Moreover, the mailbox may return a bogus state,
    6229                 :            :                  * so we need to just enable it and continue on.
    6230                 :            :                  */
    6231                 :            :         } else {
    6232                 :          0 :                 I915_WRITE(IPS_CTL, IPS_ENABLE);
    6233                 :            :                 /* The bit only becomes 1 in the next vblank, so this wait here
    6234                 :            :                  * is essentially intel_wait_for_vblank. If we don't have this
    6235                 :            :                  * and don't wait for vblanks until the end of crtc_enable, then
    6236                 :            :                  * the HW state readout code will complain that the expected
    6237                 :            :                  * IPS_CTL value is not the one we read. */
    6238         [ #  # ]:          0 :                 if (intel_de_wait_for_set(dev_priv, IPS_CTL, IPS_ENABLE, 50))
    6239                 :          0 :                         DRM_ERROR("Timed out waiting for IPS enable\n");
    6240                 :            :         }
    6241                 :            : }
    6242                 :            : 
    6243                 :          0 : void hsw_disable_ips(const struct intel_crtc_state *crtc_state)
    6244                 :            : {
    6245                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6246                 :          0 :         struct drm_device *dev = crtc->base.dev;
    6247         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    6248                 :            : 
    6249         [ #  # ]:          0 :         if (!crtc_state->ips_enabled)
    6250                 :            :                 return;
    6251                 :            : 
    6252         [ #  # ]:          0 :         if (IS_BROADWELL(dev_priv)) {
    6253         [ #  # ]:          0 :                 WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));
    6254                 :            :                 /*
    6255                 :            :                  * Wait for PCODE to finish disabling IPS. The BSpec specified
    6256                 :            :                  * 42ms timeout value leads to occasional timeouts so use 100ms
    6257                 :            :                  * instead.
    6258                 :            :                  */
    6259         [ #  # ]:          0 :                 if (intel_de_wait_for_clear(dev_priv, IPS_CTL, IPS_ENABLE, 100))
    6260                 :          0 :                         DRM_ERROR("Timed out waiting for IPS disable\n");
    6261                 :            :         } else {
    6262                 :          0 :                 I915_WRITE(IPS_CTL, 0);
    6263                 :          0 :                 POSTING_READ(IPS_CTL);
    6264                 :            :         }
    6265                 :            : 
    6266                 :            :         /* We need to wait for a vblank before we can disable the plane. */
    6267                 :          0 :         intel_wait_for_vblank(dev_priv, crtc->pipe);
    6268                 :            : }
    6269                 :            : 
    6270                 :          0 : static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc)
    6271                 :            : {
    6272                 :          0 :         if (intel_crtc->overlay)
    6273                 :          0 :                 (void) intel_overlay_switch_off(intel_crtc->overlay);
    6274                 :            : 
    6275                 :            :         /* Let userspace switch the overlay on again. In most cases userspace
    6276                 :            :          * has to recompute where to put it anyway.
    6277                 :            :          */
    6278                 :            : }
    6279                 :            : 
    6280                 :            : static bool hsw_pre_update_disable_ips(const struct intel_crtc_state *old_crtc_state,
    6281                 :            :                                        const struct intel_crtc_state *new_crtc_state)
    6282                 :            : {
    6283                 :            :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
    6284                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6285                 :            : 
    6286                 :            :         if (!old_crtc_state->ips_enabled)
    6287                 :            :                 return false;
    6288                 :            : 
    6289                 :            :         if (needs_modeset(new_crtc_state))
    6290                 :            :                 return true;
    6291                 :            : 
    6292                 :            :         /*
    6293                 :            :          * Workaround : Do not read or write the pipe palette/gamma data while
    6294                 :            :          * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
    6295                 :            :          *
    6296                 :            :          * Disable IPS before we program the LUT.
    6297                 :            :          */
    6298                 :            :         if (IS_HASWELL(dev_priv) &&
    6299                 :            :             (new_crtc_state->uapi.color_mgmt_changed ||
    6300                 :            :              new_crtc_state->update_pipe) &&
    6301                 :            :             new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
    6302                 :            :                 return true;
    6303                 :            : 
    6304                 :            :         return !new_crtc_state->ips_enabled;
    6305                 :            : }
    6306                 :            : 
    6307                 :            : static bool hsw_post_update_enable_ips(const struct intel_crtc_state *old_crtc_state,
    6308                 :            :                                        const struct intel_crtc_state *new_crtc_state)
    6309                 :            : {
    6310                 :            :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
    6311                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6312                 :            : 
    6313                 :            :         if (!new_crtc_state->ips_enabled)
    6314                 :            :                 return false;
    6315                 :            : 
    6316                 :            :         if (needs_modeset(new_crtc_state))
    6317                 :            :                 return true;
    6318                 :            : 
    6319                 :            :         /*
    6320                 :            :          * Workaround : Do not read or write the pipe palette/gamma data while
    6321                 :            :          * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
    6322                 :            :          *
    6323                 :            :          * Re-enable IPS after the LUT has been programmed.
    6324                 :            :          */
    6325                 :            :         if (IS_HASWELL(dev_priv) &&
    6326                 :            :             (new_crtc_state->uapi.color_mgmt_changed ||
    6327                 :            :              new_crtc_state->update_pipe) &&
    6328                 :            :             new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
    6329                 :            :                 return true;
    6330                 :            : 
    6331                 :            :         /*
    6332                 :            :          * We can't read out IPS on broadwell, assume the worst and
    6333                 :            :          * forcibly enable IPS on the first fastset.
    6334                 :            :          */
    6335                 :            :         if (new_crtc_state->update_pipe &&
    6336                 :            :             old_crtc_state->hw.adjusted_mode.private_flags & I915_MODE_FLAG_INHERITED)
    6337                 :            :                 return true;
    6338                 :            : 
    6339                 :            :         return !old_crtc_state->ips_enabled;
    6340                 :            : }
    6341                 :            : 
    6342                 :          0 : static bool needs_nv12_wa(const struct intel_crtc_state *crtc_state)
    6343                 :            : {
    6344                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    6345                 :            : 
    6346   [ #  #  #  #  :          0 :         if (!crtc_state->nv12_planes)
             #  #  #  # ]
    6347                 :            :                 return false;
    6348                 :            : 
    6349                 :            :         /* WA Display #0827: Gen9:all */
    6350   [ #  #  #  #  :          0 :         if (IS_GEN(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    6351                 :          0 :                 return true;
    6352                 :            : 
    6353                 :            :         return false;
    6354                 :            : }
    6355                 :            : 
    6356                 :          0 : static bool needs_scalerclk_wa(const struct intel_crtc_state *crtc_state)
    6357                 :            : {
    6358                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    6359                 :            : 
    6360                 :            :         /* Wa_2006604312:icl */
    6361   [ #  #  #  #  :          0 :         if (crtc_state->scaler_state.scaler_users > 0 && IS_ICELAKE(dev_priv))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    6362                 :          0 :                 return true;
    6363                 :            : 
    6364                 :            :         return false;
    6365                 :            : }
    6366                 :            : 
    6367                 :          0 : static bool planes_enabling(const struct intel_crtc_state *old_crtc_state,
    6368                 :            :                             const struct intel_crtc_state *new_crtc_state)
    6369                 :            : {
    6370         [ #  # ]:          0 :         return (!old_crtc_state->active_planes || needs_modeset(new_crtc_state)) &&
    6371         [ #  # ]:          0 :                 new_crtc_state->active_planes;
    6372                 :            : }
    6373                 :            : 
    6374                 :          0 : static bool planes_disabling(const struct intel_crtc_state *old_crtc_state,
    6375                 :            :                              const struct intel_crtc_state *new_crtc_state)
    6376                 :            : {
    6377                 :          0 :         return old_crtc_state->active_planes &&
    6378   [ #  #  #  # ]:          0 :                 (!new_crtc_state->active_planes || needs_modeset(new_crtc_state));
    6379                 :            : }
    6380                 :            : 
    6381                 :          0 : static void intel_post_plane_update(struct intel_atomic_state *state,
    6382                 :            :                                     struct intel_crtc *crtc)
    6383                 :            : {
    6384                 :          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
    6385                 :          0 :         struct intel_plane *primary = to_intel_plane(crtc->base.primary);
    6386                 :          0 :         const struct intel_crtc_state *old_crtc_state =
    6387                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    6388                 :          0 :         const struct intel_crtc_state *new_crtc_state =
    6389                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6390                 :          0 :         const struct intel_plane_state *new_primary_state =
    6391                 :            :                 intel_atomic_get_new_plane_state(state, primary);
    6392                 :          0 :         enum pipe pipe = crtc->pipe;
    6393                 :            : 
    6394                 :          0 :         intel_frontbuffer_flip(dev_priv, new_crtc_state->fb_bits);
    6395                 :            : 
    6396   [ #  #  #  # ]:          0 :         if (new_crtc_state->update_wm_post && new_crtc_state->hw.active)
    6397                 :          0 :                 intel_update_watermarks(crtc);
    6398                 :            : 
    6399         [ #  # ]:          0 :         if (hsw_post_update_enable_ips(old_crtc_state, new_crtc_state))
    6400                 :          0 :                 hsw_enable_ips(new_crtc_state);
    6401                 :            : 
    6402         [ #  # ]:          0 :         if (new_primary_state)
    6403                 :          0 :                 intel_fbc_post_update(crtc);
    6404                 :            : 
    6405         [ #  # ]:          0 :         if (needs_nv12_wa(old_crtc_state) &&
    6406         [ #  # ]:          0 :             !needs_nv12_wa(new_crtc_state))
    6407                 :          0 :                 skl_wa_827(dev_priv, pipe, false);
    6408                 :            : 
    6409         [ #  # ]:          0 :         if (needs_scalerclk_wa(old_crtc_state) &&
    6410         [ #  # ]:          0 :             !needs_scalerclk_wa(new_crtc_state))
    6411                 :          0 :                 icl_wa_scalerclkgating(dev_priv, pipe, false);
    6412                 :          0 : }
    6413                 :            : 
    6414                 :          0 : static void intel_pre_plane_update(struct intel_atomic_state *state,
    6415                 :            :                                    struct intel_crtc *crtc)
    6416                 :            : {
    6417         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
    6418                 :          0 :         struct intel_plane *primary = to_intel_plane(crtc->base.primary);
    6419         [ #  # ]:          0 :         const struct intel_crtc_state *old_crtc_state =
    6420                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    6421         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    6422                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6423         [ #  # ]:          0 :         const struct intel_plane_state *new_primary_state =
    6424                 :            :                 intel_atomic_get_new_plane_state(state, primary);
    6425                 :          0 :         enum pipe pipe = crtc->pipe;
    6426                 :            : 
    6427         [ #  # ]:          0 :         if (hsw_pre_update_disable_ips(old_crtc_state, new_crtc_state))
    6428                 :          0 :                 hsw_disable_ips(old_crtc_state);
    6429                 :            : 
    6430   [ #  #  #  # ]:          0 :         if (new_primary_state &&
    6431                 :          0 :             intel_fbc_pre_update(crtc, new_crtc_state, new_primary_state))
    6432                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    6433                 :            : 
    6434                 :            :         /* Display WA 827 */
    6435         [ #  # ]:          0 :         if (!needs_nv12_wa(old_crtc_state) &&
    6436         [ #  # ]:          0 :             needs_nv12_wa(new_crtc_state))
    6437                 :          0 :                 skl_wa_827(dev_priv, pipe, true);
    6438                 :            : 
    6439                 :            :         /* Wa_2006604312:icl */
    6440         [ #  # ]:          0 :         if (!needs_scalerclk_wa(old_crtc_state) &&
    6441         [ #  # ]:          0 :             needs_scalerclk_wa(new_crtc_state))
    6442                 :          0 :                 icl_wa_scalerclkgating(dev_priv, pipe, true);
    6443                 :            : 
    6444                 :            :         /*
    6445                 :            :          * Vblank time updates from the shadow to live plane control register
    6446                 :            :          * are blocked if the memory self-refresh mode is active at that
    6447                 :            :          * moment. So to make sure the plane gets truly disabled, disable
    6448                 :            :          * first the self-refresh mode. The self-refresh enable bit in turn
    6449                 :            :          * will be checked/applied by the HW only at the next frame start
    6450                 :            :          * event which is after the vblank start event, so we need to have a
    6451                 :            :          * wait-for-vblank between disabling the plane and the pipe.
    6452                 :            :          */
    6453   [ #  #  #  # ]:          0 :         if (HAS_GMCH(dev_priv) && old_crtc_state->hw.active &&
    6454   [ #  #  #  # ]:          0 :             new_crtc_state->disable_cxsr && intel_set_memory_cxsr(dev_priv, false))
    6455                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    6456                 :            : 
    6457                 :            :         /*
    6458                 :            :          * IVB workaround: must disable low power watermarks for at least
    6459                 :            :          * one frame before enabling scaling.  LP watermarks can be re-enabled
    6460                 :            :          * when scaling is disabled.
    6461                 :            :          *
    6462                 :            :          * WaCxSRDisabledForSpriteScaling:ivb
    6463                 :            :          */
    6464         [ #  # ]:          0 :         if (old_crtc_state->hw.active &&
    6465   [ #  #  #  # ]:          0 :             new_crtc_state->disable_lp_wm && ilk_disable_lp_wm(dev_priv))
    6466                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    6467                 :            : 
    6468                 :            :         /*
    6469                 :            :          * If we're doing a modeset we don't need to do any
    6470                 :            :          * pre-vblank watermark programming here.
    6471                 :            :          */
    6472         [ #  # ]:          0 :         if (!needs_modeset(new_crtc_state)) {
    6473                 :            :                 /*
    6474                 :            :                  * For platforms that support atomic watermarks, program the
    6475                 :            :                  * 'intermediate' watermarks immediately.  On pre-gen9 platforms, these
    6476                 :            :                  * will be the intermediate values that are safe for both pre- and
    6477                 :            :                  * post- vblank; when vblank happens, the 'active' values will be set
    6478                 :            :                  * to the final 'target' values and we'll do this again to get the
    6479                 :            :                  * optimal watermarks.  For gen9+ platforms, the values we program here
    6480                 :            :                  * will be the final target values which will get automatically latched
    6481                 :            :                  * at vblank time; no further programming will be necessary.
    6482                 :            :                  *
    6483                 :            :                  * If a platform hasn't been transitioned to atomic watermarks yet,
    6484                 :            :                  * we'll continue to update watermarks the old way, if flags tell
    6485                 :            :                  * us to.
    6486                 :            :                  */
    6487         [ #  # ]:          0 :                 if (dev_priv->display.initial_watermarks)
    6488                 :          0 :                         dev_priv->display.initial_watermarks(state, crtc);
    6489         [ #  # ]:          0 :                 else if (new_crtc_state->update_wm_pre)
    6490                 :          0 :                         intel_update_watermarks(crtc);
    6491                 :            :         }
    6492                 :            : 
    6493                 :            :         /*
    6494                 :            :          * Gen2 reports pipe underruns whenever all planes are disabled.
    6495                 :            :          * So disable underrun reporting before all the planes get disabled.
    6496                 :            :          *
    6497                 :            :          * We do this after .initial_watermarks() so that we have a
    6498                 :            :          * chance of catching underruns with the intermediate watermarks
    6499                 :            :          * vs. the old plane configuration.
    6500                 :            :          */
    6501   [ #  #  #  #  :          0 :         if (IS_GEN(dev_priv, 2) && planes_disabling(old_crtc_state, new_crtc_state))
                   #  # ]
    6502                 :          0 :                 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
    6503                 :          0 : }
    6504                 :            : 
    6505                 :          0 : static void intel_crtc_disable_planes(struct intel_atomic_state *state,
    6506                 :            :                                       struct intel_crtc *crtc)
    6507                 :            : {
    6508         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6509         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    6510                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6511                 :          0 :         unsigned int update_mask = new_crtc_state->update_planes;
    6512                 :          0 :         const struct intel_plane_state *old_plane_state;
    6513                 :          0 :         struct intel_plane *plane;
    6514                 :          0 :         unsigned fb_bits = 0;
    6515                 :          0 :         int i;
    6516                 :            : 
    6517         [ #  # ]:          0 :         intel_crtc_dpms_overlay_disable(crtc);
    6518                 :            : 
    6519   [ #  #  #  # ]:          0 :         for_each_old_intel_plane_in_state(state, plane, old_plane_state, i) {
    6520         [ #  # ]:          0 :                 if (crtc->pipe != plane->pipe ||
    6521         [ #  # ]:          0 :                     !(update_mask & BIT(plane->id)))
    6522                 :          0 :                         continue;
    6523                 :            : 
    6524                 :          0 :                 intel_disable_plane(plane, new_crtc_state);
    6525                 :            : 
    6526         [ #  # ]:          0 :                 if (old_plane_state->uapi.visible)
    6527                 :          0 :                         fb_bits |= plane->frontbuffer_bit;
    6528                 :            :         }
    6529                 :            : 
    6530                 :          0 :         intel_frontbuffer_flip(dev_priv, fb_bits);
    6531                 :          0 : }
    6532                 :            : 
    6533                 :            : /*
    6534                 :            :  * intel_connector_primary_encoder - get the primary encoder for a connector
    6535                 :            :  * @connector: connector for which to return the encoder
    6536                 :            :  *
    6537                 :            :  * Returns the primary encoder for a connector. There is a 1:1 mapping from
    6538                 :            :  * all connectors to their encoder, except for DP-MST connectors which have
    6539                 :            :  * both a virtual and a primary encoder. These DP-MST primary encoders can be
    6540                 :            :  * pointed to by as many DP-MST connectors as there are pipes.
    6541                 :            :  */
    6542                 :            : static struct intel_encoder *
    6543                 :          0 : intel_connector_primary_encoder(struct intel_connector *connector)
    6544                 :            : {
    6545                 :          0 :         struct intel_encoder *encoder;
    6546                 :            : 
    6547         [ #  # ]:          0 :         if (connector->mst_port)
    6548                 :          0 :                 return &dp_to_dig_port(connector->mst_port)->base;
    6549                 :            : 
    6550         [ #  # ]:          0 :         encoder = intel_attached_encoder(connector);
    6551         [ #  # ]:          0 :         WARN_ON(!encoder);
    6552                 :            : 
    6553                 :            :         return encoder;
    6554                 :            : }
    6555                 :            : 
    6556                 :          0 : static void intel_encoders_update_prepare(struct intel_atomic_state *state)
    6557                 :            : {
    6558                 :          0 :         struct drm_connector_state *new_conn_state;
    6559                 :          0 :         struct drm_connector *connector;
    6560                 :          0 :         int i;
    6561                 :            : 
    6562   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, connector, new_conn_state,
    6563                 :            :                                         i) {
    6564                 :          0 :                 struct intel_connector *intel_connector;
    6565                 :          0 :                 struct intel_encoder *encoder;
    6566                 :          0 :                 struct intel_crtc *crtc;
    6567                 :            : 
    6568         [ #  # ]:          0 :                 if (!intel_connector_needs_modeset(state, connector))
    6569                 :          0 :                         continue;
    6570                 :            : 
    6571                 :          0 :                 intel_connector = to_intel_connector(connector);
    6572                 :          0 :                 encoder = intel_connector_primary_encoder(intel_connector);
    6573         [ #  # ]:          0 :                 if (!encoder->update_prepare)
    6574                 :          0 :                         continue;
    6575                 :            : 
    6576                 :          0 :                 crtc = new_conn_state->crtc ?
    6577         [ #  # ]:          0 :                         to_intel_crtc(new_conn_state->crtc) : NULL;
    6578                 :          0 :                 encoder->update_prepare(state, encoder, crtc);
    6579                 :            :         }
    6580                 :          0 : }
    6581                 :            : 
    6582                 :          0 : static void intel_encoders_update_complete(struct intel_atomic_state *state)
    6583                 :            : {
    6584                 :          0 :         struct drm_connector_state *new_conn_state;
    6585                 :          0 :         struct drm_connector *connector;
    6586                 :          0 :         int i;
    6587                 :            : 
    6588   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, connector, new_conn_state,
    6589                 :            :                                         i) {
    6590                 :          0 :                 struct intel_connector *intel_connector;
    6591                 :          0 :                 struct intel_encoder *encoder;
    6592                 :          0 :                 struct intel_crtc *crtc;
    6593                 :            : 
    6594         [ #  # ]:          0 :                 if (!intel_connector_needs_modeset(state, connector))
    6595                 :          0 :                         continue;
    6596                 :            : 
    6597                 :          0 :                 intel_connector = to_intel_connector(connector);
    6598                 :          0 :                 encoder = intel_connector_primary_encoder(intel_connector);
    6599         [ #  # ]:          0 :                 if (!encoder->update_complete)
    6600                 :          0 :                         continue;
    6601                 :            : 
    6602                 :          0 :                 crtc = new_conn_state->crtc ?
    6603         [ #  # ]:          0 :                         to_intel_crtc(new_conn_state->crtc) : NULL;
    6604                 :          0 :                 encoder->update_complete(state, encoder, crtc);
    6605                 :            :         }
    6606                 :          0 : }
    6607                 :            : 
    6608                 :          0 : static void intel_encoders_pre_pll_enable(struct intel_atomic_state *state,
    6609                 :            :                                           struct intel_crtc *crtc)
    6610                 :            : {
    6611                 :          0 :         const struct intel_crtc_state *crtc_state =
    6612                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6613                 :          0 :         const struct drm_connector_state *conn_state;
    6614                 :          0 :         struct drm_connector *conn;
    6615                 :          0 :         int i;
    6616                 :            : 
    6617   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
    6618                 :          0 :                 struct intel_encoder *encoder =
    6619                 :          0 :                         to_intel_encoder(conn_state->best_encoder);
    6620                 :            : 
    6621         [ #  # ]:          0 :                 if (conn_state->crtc != &crtc->base)
    6622                 :          0 :                         continue;
    6623                 :            : 
    6624         [ #  # ]:          0 :                 if (encoder->pre_pll_enable)
    6625                 :          0 :                         encoder->pre_pll_enable(encoder, crtc_state, conn_state);
    6626                 :            :         }
    6627                 :          0 : }
    6628                 :            : 
    6629                 :          0 : static void intel_encoders_pre_enable(struct intel_atomic_state *state,
    6630                 :            :                                       struct intel_crtc *crtc)
    6631                 :            : {
    6632                 :          0 :         const struct intel_crtc_state *crtc_state =
    6633                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6634                 :          0 :         const struct drm_connector_state *conn_state;
    6635                 :          0 :         struct drm_connector *conn;
    6636                 :          0 :         int i;
    6637                 :            : 
    6638   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
    6639                 :          0 :                 struct intel_encoder *encoder =
    6640                 :          0 :                         to_intel_encoder(conn_state->best_encoder);
    6641                 :            : 
    6642         [ #  # ]:          0 :                 if (conn_state->crtc != &crtc->base)
    6643                 :          0 :                         continue;
    6644                 :            : 
    6645         [ #  # ]:          0 :                 if (encoder->pre_enable)
    6646                 :          0 :                         encoder->pre_enable(encoder, crtc_state, conn_state);
    6647                 :            :         }
    6648                 :          0 : }
    6649                 :            : 
    6650                 :          0 : static void intel_encoders_enable(struct intel_atomic_state *state,
    6651                 :            :                                   struct intel_crtc *crtc)
    6652                 :            : {
    6653                 :          0 :         const struct intel_crtc_state *crtc_state =
    6654                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6655                 :          0 :         const struct drm_connector_state *conn_state;
    6656                 :          0 :         struct drm_connector *conn;
    6657                 :          0 :         int i;
    6658                 :            : 
    6659   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
    6660                 :          0 :                 struct intel_encoder *encoder =
    6661                 :          0 :                         to_intel_encoder(conn_state->best_encoder);
    6662                 :            : 
    6663         [ #  # ]:          0 :                 if (conn_state->crtc != &crtc->base)
    6664                 :          0 :                         continue;
    6665                 :            : 
    6666         [ #  # ]:          0 :                 if (encoder->enable)
    6667                 :          0 :                         encoder->enable(encoder, crtc_state, conn_state);
    6668                 :          0 :                 intel_opregion_notify_encoder(encoder, true);
    6669                 :            :         }
    6670                 :          0 : }
    6671                 :            : 
    6672                 :          0 : static void intel_encoders_disable(struct intel_atomic_state *state,
    6673                 :            :                                    struct intel_crtc *crtc)
    6674                 :            : {
    6675                 :          0 :         const struct intel_crtc_state *old_crtc_state =
    6676                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    6677                 :          0 :         const struct drm_connector_state *old_conn_state;
    6678                 :          0 :         struct drm_connector *conn;
    6679                 :          0 :         int i;
    6680                 :            : 
    6681   [ #  #  #  # ]:          0 :         for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
    6682                 :          0 :                 struct intel_encoder *encoder =
    6683                 :          0 :                         to_intel_encoder(old_conn_state->best_encoder);
    6684                 :            : 
    6685         [ #  # ]:          0 :                 if (old_conn_state->crtc != &crtc->base)
    6686                 :          0 :                         continue;
    6687                 :            : 
    6688                 :          0 :                 intel_opregion_notify_encoder(encoder, false);
    6689         [ #  # ]:          0 :                 if (encoder->disable)
    6690                 :          0 :                         encoder->disable(encoder, old_crtc_state, old_conn_state);
    6691                 :            :         }
    6692                 :          0 : }
    6693                 :            : 
    6694                 :          0 : static void intel_encoders_post_disable(struct intel_atomic_state *state,
    6695                 :            :                                         struct intel_crtc *crtc)
    6696                 :            : {
    6697                 :          0 :         const struct intel_crtc_state *old_crtc_state =
    6698                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    6699                 :          0 :         const struct drm_connector_state *old_conn_state;
    6700                 :          0 :         struct drm_connector *conn;
    6701                 :          0 :         int i;
    6702                 :            : 
    6703   [ #  #  #  # ]:          0 :         for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
    6704                 :          0 :                 struct intel_encoder *encoder =
    6705                 :          0 :                         to_intel_encoder(old_conn_state->best_encoder);
    6706                 :            : 
    6707         [ #  # ]:          0 :                 if (old_conn_state->crtc != &crtc->base)
    6708                 :          0 :                         continue;
    6709                 :            : 
    6710         [ #  # ]:          0 :                 if (encoder->post_disable)
    6711                 :          0 :                         encoder->post_disable(encoder, old_crtc_state, old_conn_state);
    6712                 :            :         }
    6713                 :          0 : }
    6714                 :            : 
    6715                 :          0 : static void intel_encoders_post_pll_disable(struct intel_atomic_state *state,
    6716                 :            :                                             struct intel_crtc *crtc)
    6717                 :            : {
    6718                 :          0 :         const struct intel_crtc_state *old_crtc_state =
    6719                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    6720                 :          0 :         const struct drm_connector_state *old_conn_state;
    6721                 :          0 :         struct drm_connector *conn;
    6722                 :          0 :         int i;
    6723                 :            : 
    6724   [ #  #  #  # ]:          0 :         for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
    6725                 :          0 :                 struct intel_encoder *encoder =
    6726                 :          0 :                         to_intel_encoder(old_conn_state->best_encoder);
    6727                 :            : 
    6728         [ #  # ]:          0 :                 if (old_conn_state->crtc != &crtc->base)
    6729                 :          0 :                         continue;
    6730                 :            : 
    6731         [ #  # ]:          0 :                 if (encoder->post_pll_disable)
    6732                 :          0 :                         encoder->post_pll_disable(encoder, old_crtc_state, old_conn_state);
    6733                 :            :         }
    6734                 :          0 : }
    6735                 :            : 
    6736                 :          0 : static void intel_encoders_update_pipe(struct intel_atomic_state *state,
    6737                 :            :                                        struct intel_crtc *crtc)
    6738                 :            : {
    6739                 :          0 :         const struct intel_crtc_state *crtc_state =
    6740                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6741                 :          0 :         const struct drm_connector_state *conn_state;
    6742                 :          0 :         struct drm_connector *conn;
    6743                 :          0 :         int i;
    6744                 :            : 
    6745   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
    6746                 :          0 :                 struct intel_encoder *encoder =
    6747                 :          0 :                         to_intel_encoder(conn_state->best_encoder);
    6748                 :            : 
    6749         [ #  # ]:          0 :                 if (conn_state->crtc != &crtc->base)
    6750                 :          0 :                         continue;
    6751                 :            : 
    6752         [ #  # ]:          0 :                 if (encoder->update_pipe)
    6753                 :          0 :                         encoder->update_pipe(encoder, crtc_state, conn_state);
    6754                 :            :         }
    6755                 :          0 : }
    6756                 :            : 
    6757                 :          0 : static void intel_disable_primary_plane(const struct intel_crtc_state *crtc_state)
    6758                 :            : {
    6759                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6760                 :          0 :         struct intel_plane *plane = to_intel_plane(crtc->base.primary);
    6761                 :            : 
    6762                 :          0 :         plane->disable_plane(plane, crtc_state);
    6763                 :          0 : }
    6764                 :            : 
    6765                 :          0 : static void ilk_crtc_enable(struct intel_atomic_state *state,
    6766                 :            :                             struct intel_crtc *crtc)
    6767                 :            : {
    6768         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    6769                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6770         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6771                 :          0 :         enum pipe pipe = crtc->pipe;
    6772                 :            : 
    6773   [ #  #  #  # ]:          0 :         if (WARN_ON(crtc->active))
    6774                 :            :                 return;
    6775                 :            : 
    6776                 :            :         /*
    6777                 :            :          * Sometimes spurious CPU pipe underruns happen during FDI
    6778                 :            :          * training, at least with VGA+HDMI cloning. Suppress them.
    6779                 :            :          *
    6780                 :            :          * On ILK we get an occasional spurious CPU pipe underruns
    6781                 :            :          * between eDP port A enable and vdd enable. Also PCH port
    6782                 :            :          * enable seems to result in the occasional CPU pipe underrun.
    6783                 :            :          *
    6784                 :            :          * Spurious PCH underruns also occur during PCH enabling.
    6785                 :            :          */
    6786                 :          0 :         intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
    6787                 :          0 :         intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
    6788                 :            : 
    6789         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder)
    6790                 :          0 :                 intel_prepare_shared_dpll(new_crtc_state);
    6791                 :            : 
    6792         [ #  # ]:          0 :         if (intel_crtc_has_dp_encoder(new_crtc_state))
    6793                 :          0 :                 intel_dp_set_m_n(new_crtc_state, M1_N1);
    6794                 :            : 
    6795                 :          0 :         intel_set_pipe_timings(new_crtc_state);
    6796                 :          0 :         intel_set_pipe_src_size(new_crtc_state);
    6797                 :            : 
    6798         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder)
    6799                 :          0 :                 intel_cpu_transcoder_set_m_n(new_crtc_state,
    6800                 :            :                                              &new_crtc_state->fdi_m_n, NULL);
    6801                 :            : 
    6802                 :          0 :         ilk_set_pipeconf(new_crtc_state);
    6803                 :            : 
    6804                 :          0 :         crtc->active = true;
    6805                 :            : 
    6806                 :          0 :         intel_encoders_pre_enable(state, crtc);
    6807                 :            : 
    6808         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder) {
    6809                 :            :                 /* Note: FDI PLL enabling _must_ be done before we enable the
    6810                 :            :                  * cpu pipes, hence this is separate from all the other fdi/pch
    6811                 :            :                  * enabling. */
    6812                 :          0 :                 ilk_fdi_pll_enable(new_crtc_state);
    6813                 :            :         } else {
    6814                 :          0 :                 assert_fdi_tx_disabled(dev_priv, pipe);
    6815                 :          0 :                 assert_fdi_rx_disabled(dev_priv, pipe);
    6816                 :            :         }
    6817                 :            : 
    6818                 :          0 :         ilk_pfit_enable(new_crtc_state);
    6819                 :            : 
    6820                 :            :         /*
    6821                 :            :          * On ILK+ LUT must be loaded before the pipe is running but with
    6822                 :            :          * clocks enabled
    6823                 :            :          */
    6824                 :          0 :         intel_color_load_luts(new_crtc_state);
    6825                 :          0 :         intel_color_commit(new_crtc_state);
    6826                 :            :         /* update DSPCNTR to configure gamma for pipe bottom color */
    6827                 :          0 :         intel_disable_primary_plane(new_crtc_state);
    6828                 :            : 
    6829         [ #  # ]:          0 :         if (dev_priv->display.initial_watermarks)
    6830                 :          0 :                 dev_priv->display.initial_watermarks(state, crtc);
    6831                 :          0 :         intel_enable_pipe(new_crtc_state);
    6832                 :            : 
    6833         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder)
    6834                 :          0 :                 ilk_pch_enable(state, new_crtc_state);
    6835                 :            : 
    6836                 :          0 :         intel_crtc_vblank_on(new_crtc_state);
    6837                 :            : 
    6838                 :          0 :         intel_encoders_enable(state, crtc);
    6839                 :            : 
    6840         [ #  # ]:          0 :         if (HAS_PCH_CPT(dev_priv))
    6841                 :          0 :                 cpt_verify_modeset(dev_priv, pipe);
    6842                 :            : 
    6843                 :            :         /*
    6844                 :            :          * Must wait for vblank to avoid spurious PCH FIFO underruns.
    6845                 :            :          * And a second vblank wait is needed at least on ILK with
    6846                 :            :          * some interlaced HDMI modes. Let's do the double wait always
    6847                 :            :          * in case there are more corner cases we don't know about.
    6848                 :            :          */
    6849         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder) {
    6850                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    6851                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    6852                 :            :         }
    6853                 :          0 :         intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
    6854                 :          0 :         intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
    6855                 :            : }
    6856                 :            : 
    6857                 :            : /* IPS only exists on ULT machines and is tied to pipe A. */
    6858                 :          0 : static bool hsw_crtc_supports_ips(struct intel_crtc *crtc)
    6859                 :            : {
    6860   [ #  #  #  #  :          0 :         return HAS_IPS(to_i915(crtc->base.dev)) && crtc->pipe == PIPE_A;
             #  #  #  # ]
    6861                 :            : }
    6862                 :            : 
    6863                 :          0 : static void glk_pipe_scaler_clock_gating_wa(struct drm_i915_private *dev_priv,
    6864                 :            :                                             enum pipe pipe, bool apply)
    6865                 :            : {
    6866                 :          0 :         u32 val = I915_READ(CLKGATE_DIS_PSL(pipe));
    6867                 :          0 :         u32 mask = DPF_GATING_DIS | DPF_RAM_GATING_DIS | DPFR_GATING_DIS;
    6868                 :            : 
    6869         [ #  # ]:          0 :         if (apply)
    6870                 :          0 :                 val |= mask;
    6871                 :            :         else
    6872                 :          0 :                 val &= ~mask;
    6873                 :            : 
    6874                 :          0 :         I915_WRITE(CLKGATE_DIS_PSL(pipe), val);
    6875                 :          0 : }
    6876                 :            : 
    6877                 :          0 : static void icl_pipe_mbus_enable(struct intel_crtc *crtc)
    6878                 :            : {
    6879                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6880                 :          0 :         enum pipe pipe = crtc->pipe;
    6881                 :          0 :         u32 val;
    6882                 :            : 
    6883                 :          0 :         val = MBUS_DBOX_A_CREDIT(2);
    6884                 :            : 
    6885         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 12) {
    6886                 :            :                 val |= MBUS_DBOX_BW_CREDIT(2);
    6887                 :            :                 val |= MBUS_DBOX_B_CREDIT(12);
    6888                 :            :         } else {
    6889                 :          0 :                 val |= MBUS_DBOX_BW_CREDIT(1);
    6890                 :          0 :                 val |= MBUS_DBOX_B_CREDIT(8);
    6891                 :            :         }
    6892                 :            : 
    6893                 :          0 :         I915_WRITE(PIPE_MBUS_DBOX_CTL(pipe), val);
    6894                 :          0 : }
    6895                 :            : 
    6896                 :            : static void hsw_set_frame_start_delay(const struct intel_crtc_state *crtc_state)
    6897                 :            : {
    6898                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    6899                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6900                 :            :         i915_reg_t reg = CHICKEN_TRANS(crtc_state->cpu_transcoder);
    6901                 :            :         u32 val;
    6902                 :            : 
    6903                 :            :         val = I915_READ(reg);
    6904                 :            :         val &= ~HSW_FRAME_START_DELAY_MASK;
    6905                 :            :         val |= HSW_FRAME_START_DELAY(0);
    6906                 :            :         I915_WRITE(reg, val);
    6907                 :            : }
    6908                 :            : 
    6909                 :          0 : static void hsw_crtc_enable(struct intel_atomic_state *state,
    6910                 :            :                             struct intel_crtc *crtc)
    6911                 :            : {
    6912         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    6913                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    6914         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    6915                 :          0 :         enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
    6916                 :          0 :         enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
    6917                 :          0 :         bool psl_clkgate_wa;
    6918                 :            : 
    6919   [ #  #  #  # ]:          0 :         if (WARN_ON(crtc->active))
    6920                 :            :                 return;
    6921                 :            : 
    6922                 :          0 :         intel_encoders_pre_pll_enable(state, crtc);
    6923                 :            : 
    6924         [ #  # ]:          0 :         if (new_crtc_state->shared_dpll)
    6925                 :          0 :                 intel_enable_shared_dpll(new_crtc_state);
    6926                 :            : 
    6927                 :          0 :         intel_encoders_pre_enable(state, crtc);
    6928                 :            : 
    6929         [ #  # ]:          0 :         if (intel_crtc_has_dp_encoder(new_crtc_state))
    6930                 :          0 :                 intel_dp_set_m_n(new_crtc_state, M1_N1);
    6931                 :            : 
    6932         [ #  # ]:          0 :         if (!transcoder_is_dsi(cpu_transcoder))
    6933                 :          0 :                 intel_set_pipe_timings(new_crtc_state);
    6934                 :            : 
    6935         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    6936                 :          0 :                 icl_enable_trans_port_sync(new_crtc_state);
    6937                 :            : 
    6938                 :          0 :         intel_set_pipe_src_size(new_crtc_state);
    6939                 :            : 
    6940   [ #  #  #  # ]:          0 :         if (cpu_transcoder != TRANSCODER_EDP &&
    6941                 :            :             !transcoder_is_dsi(cpu_transcoder))
    6942                 :          0 :                 I915_WRITE(PIPE_MULT(cpu_transcoder),
    6943                 :            :                            new_crtc_state->pixel_multiplier - 1);
    6944                 :            : 
    6945         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder)
    6946                 :          0 :                 intel_cpu_transcoder_set_m_n(new_crtc_state,
    6947                 :            :                                              &new_crtc_state->fdi_m_n, NULL);
    6948                 :            : 
    6949         [ #  # ]:          0 :         if (!transcoder_is_dsi(cpu_transcoder)) {
    6950                 :          0 :                 hsw_set_frame_start_delay(new_crtc_state);
    6951                 :          0 :                 hsw_set_pipeconf(new_crtc_state);
    6952                 :            :         }
    6953                 :            : 
    6954   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
    6955                 :          0 :                 bdw_set_pipemisc(new_crtc_state);
    6956                 :            : 
    6957                 :          0 :         crtc->active = true;
    6958                 :            : 
    6959                 :            :         /* Display WA #1180: WaDisableScalarClockGating: glk, cnl */
    6960   [ #  #  #  # ]:          0 :         psl_clkgate_wa = (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) &&
    6961         [ #  # ]:          0 :                 new_crtc_state->pch_pfit.enabled;
    6962         [ #  # ]:          0 :         if (psl_clkgate_wa)
    6963                 :          0 :                 glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
    6964                 :            : 
    6965         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
    6966                 :          0 :                 skl_pfit_enable(new_crtc_state);
    6967                 :            :         else
    6968                 :          0 :                 ilk_pfit_enable(new_crtc_state);
    6969                 :            : 
    6970                 :            :         /*
    6971                 :            :          * On ILK+ LUT must be loaded before the pipe is running but with
    6972                 :            :          * clocks enabled
    6973                 :            :          */
    6974                 :          0 :         intel_color_load_luts(new_crtc_state);
    6975                 :          0 :         intel_color_commit(new_crtc_state);
    6976                 :            :         /* update DSPCNTR to configure gamma/csc for pipe bottom color */
    6977         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9)
    6978                 :          0 :                 intel_disable_primary_plane(new_crtc_state);
    6979                 :            : 
    6980         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    6981                 :          0 :                 icl_set_pipe_chicken(crtc);
    6982                 :            : 
    6983         [ #  # ]:          0 :         if (!transcoder_is_dsi(cpu_transcoder))
    6984                 :          0 :                 intel_ddi_enable_transcoder_func(new_crtc_state);
    6985                 :            : 
    6986         [ #  # ]:          0 :         if (dev_priv->display.initial_watermarks)
    6987                 :          0 :                 dev_priv->display.initial_watermarks(state, crtc);
    6988                 :            : 
    6989         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    6990         [ #  # ]:          0 :                 icl_pipe_mbus_enable(crtc);
    6991                 :            : 
    6992                 :            :         /* XXX: Do the pipe assertions at the right place for BXT DSI. */
    6993         [ #  # ]:          0 :         if (!transcoder_is_dsi(cpu_transcoder))
    6994                 :          0 :                 intel_enable_pipe(new_crtc_state);
    6995                 :            : 
    6996         [ #  # ]:          0 :         if (new_crtc_state->has_pch_encoder)
    6997                 :          0 :                 lpt_pch_enable(state, new_crtc_state);
    6998                 :            : 
    6999                 :          0 :         intel_crtc_vblank_on(new_crtc_state);
    7000                 :            : 
    7001                 :          0 :         intel_encoders_enable(state, crtc);
    7002                 :            : 
    7003         [ #  # ]:          0 :         if (psl_clkgate_wa) {
    7004                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    7005                 :          0 :                 glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
    7006                 :            :         }
    7007                 :            : 
    7008                 :            :         /* If we change the relative order between pipe/planes enabling, we need
    7009                 :            :          * to change the workaround. */
    7010                 :          0 :         hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
    7011   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
    7012                 :          0 :                 intel_wait_for_vblank(dev_priv, hsw_workaround_pipe);
    7013                 :          0 :                 intel_wait_for_vblank(dev_priv, hsw_workaround_pipe);
    7014                 :            :         }
    7015                 :            : }
    7016                 :            : 
    7017                 :          0 : void ilk_pfit_disable(const struct intel_crtc_state *old_crtc_state)
    7018                 :            : {
    7019                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
    7020         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7021                 :          0 :         enum pipe pipe = crtc->pipe;
    7022                 :            : 
    7023                 :            :         /* To avoid upsetting the power well on haswell only disable the pfit if
    7024                 :            :          * it's in use. The hw state code will make sure we get this right. */
    7025         [ #  # ]:          0 :         if (old_crtc_state->pch_pfit.enabled) {
    7026                 :          0 :                 I915_WRITE(PF_CTL(pipe), 0);
    7027                 :          0 :                 I915_WRITE(PF_WIN_POS(pipe), 0);
    7028                 :          0 :                 I915_WRITE(PF_WIN_SZ(pipe), 0);
    7029                 :            :         }
    7030                 :          0 : }
    7031                 :            : 
    7032                 :          0 : static void ilk_crtc_disable(struct intel_atomic_state *state,
    7033                 :            :                              struct intel_crtc *crtc)
    7034                 :            : {
    7035                 :          0 :         const struct intel_crtc_state *old_crtc_state =
    7036                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    7037                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7038                 :          0 :         enum pipe pipe = crtc->pipe;
    7039                 :            : 
    7040                 :            :         /*
    7041                 :            :          * Sometimes spurious CPU pipe underruns happen when the
    7042                 :            :          * pipe is already disabled, but FDI RX/TX is still enabled.
    7043                 :            :          * Happens at least with VGA+HDMI cloning. Suppress them.
    7044                 :            :          */
    7045                 :          0 :         intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
    7046                 :          0 :         intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
    7047                 :            : 
    7048                 :          0 :         intel_encoders_disable(state, crtc);
    7049                 :            : 
    7050                 :          0 :         intel_crtc_vblank_off(old_crtc_state);
    7051                 :            : 
    7052                 :          0 :         intel_disable_pipe(old_crtc_state);
    7053                 :            : 
    7054                 :          0 :         ilk_pfit_disable(old_crtc_state);
    7055                 :            : 
    7056         [ #  # ]:          0 :         if (old_crtc_state->has_pch_encoder)
    7057                 :          0 :                 ilk_fdi_disable(crtc);
    7058                 :            : 
    7059                 :          0 :         intel_encoders_post_disable(state, crtc);
    7060                 :            : 
    7061         [ #  # ]:          0 :         if (old_crtc_state->has_pch_encoder) {
    7062                 :          0 :                 ilk_disable_pch_transcoder(dev_priv, pipe);
    7063                 :            : 
    7064         [ #  # ]:          0 :                 if (HAS_PCH_CPT(dev_priv)) {
    7065                 :          0 :                         i915_reg_t reg;
    7066                 :          0 :                         u32 temp;
    7067                 :            : 
    7068                 :            :                         /* disable TRANS_DP_CTL */
    7069                 :          0 :                         reg = TRANS_DP_CTL(pipe);
    7070                 :          0 :                         temp = I915_READ(reg);
    7071                 :          0 :                         temp &= ~(TRANS_DP_OUTPUT_ENABLE |
    7072                 :            :                                   TRANS_DP_PORT_SEL_MASK);
    7073                 :          0 :                         temp |= TRANS_DP_PORT_SEL_NONE;
    7074                 :          0 :                         I915_WRITE(reg, temp);
    7075                 :            : 
    7076                 :            :                         /* disable DPLL_SEL */
    7077                 :          0 :                         temp = I915_READ(PCH_DPLL_SEL);
    7078                 :          0 :                         temp &= ~(TRANS_DPLL_ENABLE(pipe) | TRANS_DPLLB_SEL(pipe));
    7079                 :          0 :                         I915_WRITE(PCH_DPLL_SEL, temp);
    7080                 :            :                 }
    7081                 :            : 
    7082                 :          0 :                 ilk_fdi_pll_disable(crtc);
    7083                 :            :         }
    7084                 :            : 
    7085                 :          0 :         intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
    7086                 :          0 :         intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
    7087                 :          0 : }
    7088                 :            : 
    7089                 :          0 : static void hsw_crtc_disable(struct intel_atomic_state *state,
    7090                 :            :                              struct intel_crtc *crtc)
    7091                 :            : {
    7092                 :            :         /*
    7093                 :            :          * FIXME collapse everything to one hook.
    7094                 :            :          * Need care with mst->ddi interactions.
    7095                 :            :          */
    7096                 :          0 :         intel_encoders_disable(state, crtc);
    7097                 :          0 :         intel_encoders_post_disable(state, crtc);
    7098                 :          0 : }
    7099                 :            : 
    7100                 :          0 : static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
    7101                 :            : {
    7102                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    7103         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7104                 :            : 
    7105         [ #  # ]:          0 :         if (!crtc_state->gmch_pfit.control)
    7106                 :            :                 return;
    7107                 :            : 
    7108                 :            :         /*
    7109                 :            :          * The panel fitter should only be adjusted whilst the pipe is disabled,
    7110                 :            :          * according to register description and PRM.
    7111                 :            :          */
    7112         [ #  # ]:          0 :         WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE);
    7113                 :          0 :         assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
    7114                 :            : 
    7115                 :          0 :         I915_WRITE(PFIT_PGM_RATIOS, crtc_state->gmch_pfit.pgm_ratios);
    7116                 :          0 :         I915_WRITE(PFIT_CONTROL, crtc_state->gmch_pfit.control);
    7117                 :            : 
    7118                 :            :         /* Border color in case we don't scale up to the full screen. Black by
    7119                 :            :          * default, change to something else for debugging. */
    7120                 :          0 :         I915_WRITE(BCLRPAT(crtc->pipe), 0);
    7121                 :            : }
    7122                 :            : 
    7123                 :          0 : bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)
    7124                 :            : {
    7125         [ #  # ]:          0 :         if (phy == PHY_NONE)
    7126                 :            :                 return false;
    7127                 :            : 
    7128   [ #  #  #  # ]:          0 :         if (IS_ELKHARTLAKE(dev_priv))
    7129                 :          0 :                 return phy <= PHY_C;
    7130                 :            : 
    7131   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
    7132                 :          0 :                 return phy <= PHY_B;
    7133                 :            : 
    7134                 :            :         return false;
    7135                 :            : }
    7136                 :            : 
    7137                 :          0 : bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
    7138                 :            : {
    7139   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) >= 12)
                   #  # ]
    7140                 :          0 :                 return phy >= PHY_D && phy <= PHY_I;
    7141                 :            : 
    7142   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) >= 11 && !IS_ELKHARTLAKE(dev_priv))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    7143                 :          0 :                 return phy >= PHY_C && phy <= PHY_F;
    7144                 :            : 
    7145                 :            :         return false;
    7146                 :            : }
    7147                 :            : 
    7148                 :          0 : enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)
    7149                 :            : {
    7150   [ #  #  #  #  :          0 :         if (IS_ELKHARTLAKE(i915) && port == PORT_D)
          #  #  #  #  #  
                #  #  # ]
    7151                 :          0 :                 return PHY_A;
    7152                 :            : 
    7153                 :            :         return (enum phy)port;
    7154                 :            : }
    7155                 :            : 
    7156                 :          0 : enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port)
    7157                 :            : {
    7158   [ #  #  #  # ]:          0 :         if (!intel_phy_is_tc(dev_priv, intel_port_to_phy(dev_priv, port)))
    7159                 :            :                 return PORT_TC_NONE;
    7160                 :            : 
    7161         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 12)
    7162                 :          0 :                 return port - PORT_D;
    7163                 :            : 
    7164                 :          0 :         return port - PORT_C;
    7165                 :            : }
    7166                 :            : 
    7167                 :          0 : enum intel_display_power_domain intel_port_to_power_domain(enum port port)
    7168                 :            : {
    7169         [ #  # ]:          0 :         switch (port) {
    7170                 :            :         case PORT_A:
    7171                 :            :                 return POWER_DOMAIN_PORT_DDI_A_LANES;
    7172                 :            :         case PORT_B:
    7173                 :            :                 return POWER_DOMAIN_PORT_DDI_B_LANES;
    7174                 :            :         case PORT_C:
    7175                 :            :                 return POWER_DOMAIN_PORT_DDI_C_LANES;
    7176                 :            :         case PORT_D:
    7177                 :            :                 return POWER_DOMAIN_PORT_DDI_D_LANES;
    7178                 :            :         case PORT_E:
    7179                 :            :                 return POWER_DOMAIN_PORT_DDI_E_LANES;
    7180                 :            :         case PORT_F:
    7181                 :            :                 return POWER_DOMAIN_PORT_DDI_F_LANES;
    7182                 :            :         case PORT_G:
    7183                 :            :                 return POWER_DOMAIN_PORT_DDI_G_LANES;
    7184                 :            :         default:
    7185                 :          0 :                 MISSING_CASE(port);
    7186                 :          0 :                 return POWER_DOMAIN_PORT_OTHER;
    7187                 :            :         }
    7188                 :            : }
    7189                 :            : 
    7190                 :            : enum intel_display_power_domain
    7191                 :          0 : intel_aux_power_domain(struct intel_digital_port *dig_port)
    7192                 :            : {
    7193         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
    7194         [ #  # ]:          0 :         enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port);
    7195                 :            : 
    7196   [ #  #  #  # ]:          0 :         if (intel_phy_is_tc(dev_priv, phy) &&
    7197         [ #  # ]:          0 :             dig_port->tc_mode == TC_PORT_TBT_ALT) {
    7198         [ #  # ]:          0 :                 switch (dig_port->aux_ch) {
    7199                 :            :                 case AUX_CH_C:
    7200                 :            :                         return POWER_DOMAIN_AUX_C_TBT;
    7201                 :            :                 case AUX_CH_D:
    7202                 :            :                         return POWER_DOMAIN_AUX_D_TBT;
    7203                 :            :                 case AUX_CH_E:
    7204                 :            :                         return POWER_DOMAIN_AUX_E_TBT;
    7205                 :            :                 case AUX_CH_F:
    7206                 :            :                         return POWER_DOMAIN_AUX_F_TBT;
    7207                 :            :                 case AUX_CH_G:
    7208                 :            :                         return POWER_DOMAIN_AUX_G_TBT;
    7209                 :            :                 default:
    7210                 :          0 :                         MISSING_CASE(dig_port->aux_ch);
    7211                 :          0 :                         return POWER_DOMAIN_AUX_C_TBT;
    7212                 :            :                 }
    7213                 :            :         }
    7214                 :            : 
    7215         [ #  # ]:          0 :         switch (dig_port->aux_ch) {
    7216                 :            :         case AUX_CH_A:
    7217                 :            :                 return POWER_DOMAIN_AUX_A;
    7218                 :            :         case AUX_CH_B:
    7219                 :            :                 return POWER_DOMAIN_AUX_B;
    7220                 :            :         case AUX_CH_C:
    7221                 :            :                 return POWER_DOMAIN_AUX_C;
    7222                 :            :         case AUX_CH_D:
    7223                 :            :                 return POWER_DOMAIN_AUX_D;
    7224                 :            :         case AUX_CH_E:
    7225                 :            :                 return POWER_DOMAIN_AUX_E;
    7226                 :            :         case AUX_CH_F:
    7227                 :            :                 return POWER_DOMAIN_AUX_F;
    7228                 :            :         case AUX_CH_G:
    7229                 :            :                 return POWER_DOMAIN_AUX_G;
    7230                 :            :         default:
    7231                 :          0 :                 MISSING_CASE(dig_port->aux_ch);
    7232                 :          0 :                 return POWER_DOMAIN_AUX_A;
    7233                 :            :         }
    7234                 :            : }
    7235                 :            : 
    7236                 :          0 : static u64 get_crtc_power_domains(struct intel_crtc_state *crtc_state)
    7237                 :            : {
    7238                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    7239         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7240                 :          0 :         struct drm_encoder *encoder;
    7241                 :          0 :         enum pipe pipe = crtc->pipe;
    7242                 :          0 :         u64 mask;
    7243                 :          0 :         enum transcoder transcoder = crtc_state->cpu_transcoder;
    7244                 :            : 
    7245         [ #  # ]:          0 :         if (!crtc_state->hw.active)
    7246                 :            :                 return 0;
    7247                 :            : 
    7248                 :          0 :         mask = BIT_ULL(POWER_DOMAIN_PIPE(pipe));
    7249         [ #  # ]:          0 :         mask |= BIT_ULL(POWER_DOMAIN_TRANSCODER(transcoder));
    7250         [ #  # ]:          0 :         if (crtc_state->pch_pfit.enabled ||
    7251                 :            :             crtc_state->pch_pfit.force_thru)
    7252                 :          0 :                 mask |= BIT_ULL(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
    7253                 :            : 
    7254   [ #  #  #  # ]:          0 :         drm_for_each_encoder_mask(encoder, &dev_priv->drm,
    7255                 :            :                                   crtc_state->uapi.encoder_mask) {
    7256                 :          0 :                 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
    7257                 :            : 
    7258                 :          0 :                 mask |= BIT_ULL(intel_encoder->power_domain);
    7259                 :            :         }
    7260                 :            : 
    7261   [ #  #  #  # ]:          0 :         if (HAS_DDI(dev_priv) && crtc_state->has_audio)
    7262                 :          0 :                 mask |= BIT_ULL(POWER_DOMAIN_AUDIO);
    7263                 :            : 
    7264         [ #  # ]:          0 :         if (crtc_state->shared_dpll)
    7265                 :          0 :                 mask |= BIT_ULL(POWER_DOMAIN_DISPLAY_CORE);
    7266                 :            : 
    7267                 :            :         return mask;
    7268                 :            : }
    7269                 :            : 
    7270                 :            : static u64
    7271                 :          0 : modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state)
    7272                 :            : {
    7273                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    7274                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7275                 :          0 :         enum intel_display_power_domain domain;
    7276                 :          0 :         u64 domains, new_domains, old_domains;
    7277                 :            : 
    7278                 :          0 :         old_domains = crtc->enabled_power_domains;
    7279                 :          0 :         crtc->enabled_power_domains = new_domains =
    7280                 :          0 :                 get_crtc_power_domains(crtc_state);
    7281                 :            : 
    7282                 :          0 :         domains = new_domains & ~old_domains;
    7283                 :            : 
    7284   [ #  #  #  # ]:          0 :         for_each_power_domain(domain, domains)
    7285                 :          0 :                 intel_display_power_get(dev_priv, domain);
    7286                 :            : 
    7287                 :          0 :         return old_domains & ~new_domains;
    7288                 :            : }
    7289                 :            : 
    7290                 :            : static void modeset_put_power_domains(struct drm_i915_private *dev_priv,
    7291                 :            :                                       u64 domains)
    7292                 :            : {
    7293                 :            :         enum intel_display_power_domain domain;
    7294                 :            : 
    7295   [ #  #  #  #  :          0 :         for_each_power_domain(domain, domains)
             #  #  #  # ]
    7296                 :          0 :                 intel_display_power_put_unchecked(dev_priv, domain);
    7297                 :            : }
    7298                 :            : 
    7299                 :          0 : static void valleyview_crtc_enable(struct intel_atomic_state *state,
    7300                 :            :                                    struct intel_crtc *crtc)
    7301                 :            : {
    7302         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    7303                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    7304         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7305                 :          0 :         enum pipe pipe = crtc->pipe;
    7306                 :            : 
    7307   [ #  #  #  # ]:          0 :         if (WARN_ON(crtc->active))
    7308                 :            :                 return;
    7309                 :            : 
    7310         [ #  # ]:          0 :         if (intel_crtc_has_dp_encoder(new_crtc_state))
    7311                 :          0 :                 intel_dp_set_m_n(new_crtc_state, M1_N1);
    7312                 :            : 
    7313                 :          0 :         intel_set_pipe_timings(new_crtc_state);
    7314                 :          0 :         intel_set_pipe_src_size(new_crtc_state);
    7315                 :            : 
    7316   [ #  #  #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
    7317                 :          0 :                 I915_WRITE(CHV_BLEND(pipe), CHV_BLEND_LEGACY);
    7318                 :          0 :                 I915_WRITE(CHV_CANVAS(pipe), 0);
    7319                 :            :         }
    7320                 :            : 
    7321                 :          0 :         i9xx_set_pipeconf(new_crtc_state);
    7322                 :            : 
    7323                 :          0 :         crtc->active = true;
    7324                 :            : 
    7325                 :          0 :         intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
    7326                 :            : 
    7327                 :          0 :         intel_encoders_pre_pll_enable(state, crtc);
    7328                 :            : 
    7329         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv)) {
    7330                 :          0 :                 chv_prepare_pll(crtc, new_crtc_state);
    7331                 :          0 :                 chv_enable_pll(crtc, new_crtc_state);
    7332                 :            :         } else {
    7333                 :          0 :                 vlv_prepare_pll(crtc, new_crtc_state);
    7334                 :          0 :                 vlv_enable_pll(crtc, new_crtc_state);
    7335                 :            :         }
    7336                 :            : 
    7337                 :          0 :         intel_encoders_pre_enable(state, crtc);
    7338                 :            : 
    7339                 :          0 :         i9xx_pfit_enable(new_crtc_state);
    7340                 :            : 
    7341                 :          0 :         intel_color_load_luts(new_crtc_state);
    7342                 :          0 :         intel_color_commit(new_crtc_state);
    7343                 :            :         /* update DSPCNTR to configure gamma for pipe bottom color */
    7344                 :          0 :         intel_disable_primary_plane(new_crtc_state);
    7345                 :            : 
    7346                 :          0 :         dev_priv->display.initial_watermarks(state, crtc);
    7347                 :          0 :         intel_enable_pipe(new_crtc_state);
    7348                 :            : 
    7349                 :          0 :         intel_crtc_vblank_on(new_crtc_state);
    7350                 :            : 
    7351                 :          0 :         intel_encoders_enable(state, crtc);
    7352                 :            : }
    7353                 :            : 
    7354                 :          0 : static void i9xx_set_pll_dividers(const struct intel_crtc_state *crtc_state)
    7355                 :            : {
    7356                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    7357                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7358                 :            : 
    7359                 :          0 :         I915_WRITE(FP0(crtc->pipe), crtc_state->dpll_hw_state.fp0);
    7360                 :          0 :         I915_WRITE(FP1(crtc->pipe), crtc_state->dpll_hw_state.fp1);
    7361                 :          0 : }
    7362                 :            : 
    7363                 :          0 : static void i9xx_crtc_enable(struct intel_atomic_state *state,
    7364                 :            :                              struct intel_crtc *crtc)
    7365                 :            : {
    7366         [ #  # ]:          0 :         const struct intel_crtc_state *new_crtc_state =
    7367                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
    7368         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7369                 :          0 :         enum pipe pipe = crtc->pipe;
    7370                 :            : 
    7371   [ #  #  #  # ]:          0 :         if (WARN_ON(crtc->active))
    7372                 :            :                 return;
    7373                 :            : 
    7374                 :          0 :         i9xx_set_pll_dividers(new_crtc_state);
    7375                 :            : 
    7376         [ #  # ]:          0 :         if (intel_crtc_has_dp_encoder(new_crtc_state))
    7377                 :          0 :                 intel_dp_set_m_n(new_crtc_state, M1_N1);
    7378                 :            : 
    7379                 :          0 :         intel_set_pipe_timings(new_crtc_state);
    7380                 :          0 :         intel_set_pipe_src_size(new_crtc_state);
    7381                 :            : 
    7382                 :          0 :         i9xx_set_pipeconf(new_crtc_state);
    7383                 :            : 
    7384                 :          0 :         crtc->active = true;
    7385                 :            : 
    7386         [ #  # ]:          0 :         if (!IS_GEN(dev_priv, 2))
    7387                 :          0 :                 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
    7388                 :            : 
    7389                 :          0 :         intel_encoders_pre_enable(state, crtc);
    7390                 :            : 
    7391                 :          0 :         i9xx_enable_pll(crtc, new_crtc_state);
    7392                 :            : 
    7393                 :          0 :         i9xx_pfit_enable(new_crtc_state);
    7394                 :            : 
    7395                 :          0 :         intel_color_load_luts(new_crtc_state);
    7396                 :          0 :         intel_color_commit(new_crtc_state);
    7397                 :            :         /* update DSPCNTR to configure gamma for pipe bottom color */
    7398                 :          0 :         intel_disable_primary_plane(new_crtc_state);
    7399                 :            : 
    7400         [ #  # ]:          0 :         if (dev_priv->display.initial_watermarks)
    7401                 :          0 :                 dev_priv->display.initial_watermarks(state, crtc);
    7402                 :            :         else
    7403                 :          0 :                 intel_update_watermarks(crtc);
    7404                 :          0 :         intel_enable_pipe(new_crtc_state);
    7405                 :            : 
    7406                 :          0 :         intel_crtc_vblank_on(new_crtc_state);
    7407                 :            : 
    7408                 :          0 :         intel_encoders_enable(state, crtc);
    7409                 :            : }
    7410                 :            : 
    7411                 :          0 : static void i9xx_pfit_disable(const struct intel_crtc_state *old_crtc_state)
    7412                 :            : {
    7413                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
    7414         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7415                 :            : 
    7416         [ #  # ]:          0 :         if (!old_crtc_state->gmch_pfit.control)
    7417                 :            :                 return;
    7418                 :            : 
    7419                 :          0 :         assert_pipe_disabled(dev_priv, old_crtc_state->cpu_transcoder);
    7420                 :            : 
    7421                 :          0 :         DRM_DEBUG_KMS("disabling pfit, current: 0x%08x\n",
    7422                 :            :                       I915_READ(PFIT_CONTROL));
    7423                 :          0 :         I915_WRITE(PFIT_CONTROL, 0);
    7424                 :            : }
    7425                 :            : 
    7426                 :          0 : static void i9xx_crtc_disable(struct intel_atomic_state *state,
    7427                 :            :                               struct intel_crtc *crtc)
    7428                 :            : {
    7429         [ #  # ]:          0 :         struct intel_crtc_state *old_crtc_state =
    7430                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
    7431         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7432                 :          0 :         enum pipe pipe = crtc->pipe;
    7433                 :            : 
    7434                 :            :         /*
    7435                 :            :          * On gen2 planes are double buffered but the pipe isn't, so we must
    7436                 :            :          * wait for planes to fully turn off before disabling the pipe.
    7437                 :            :          */
    7438         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 2))
    7439                 :          0 :                 intel_wait_for_vblank(dev_priv, pipe);
    7440                 :            : 
    7441                 :          0 :         intel_encoders_disable(state, crtc);
    7442                 :            : 
    7443                 :          0 :         intel_crtc_vblank_off(old_crtc_state);
    7444                 :            : 
    7445                 :          0 :         intel_disable_pipe(old_crtc_state);
    7446                 :            : 
    7447                 :          0 :         i9xx_pfit_disable(old_crtc_state);
    7448                 :            : 
    7449                 :          0 :         intel_encoders_post_disable(state, crtc);
    7450                 :            : 
    7451         [ #  # ]:          0 :         if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DSI)) {
    7452         [ #  # ]:          0 :                 if (IS_CHERRYVIEW(dev_priv))
    7453                 :          0 :                         chv_disable_pll(dev_priv, pipe);
    7454         [ #  # ]:          0 :                 else if (IS_VALLEYVIEW(dev_priv))
    7455                 :          0 :                         vlv_disable_pll(dev_priv, pipe);
    7456                 :            :                 else
    7457                 :          0 :                         i9xx_disable_pll(old_crtc_state);
    7458                 :            :         }
    7459                 :            : 
    7460                 :          0 :         intel_encoders_post_pll_disable(state, crtc);
    7461                 :            : 
    7462         [ #  # ]:          0 :         if (!IS_GEN(dev_priv, 2))
    7463                 :          0 :                 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
    7464                 :            : 
    7465         [ #  # ]:          0 :         if (!dev_priv->display.initial_watermarks)
    7466                 :          0 :                 intel_update_watermarks(crtc);
    7467                 :            : 
    7468                 :            :         /* clock the pipe down to 640x480@60 to potentially save power */
    7469         [ #  # ]:          0 :         if (IS_I830(dev_priv))
    7470                 :          0 :                 i830_enable_pipe(dev_priv, pipe);
    7471                 :          0 : }
    7472                 :            : 
    7473                 :          0 : static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
    7474                 :            :                                         struct drm_modeset_acquire_ctx *ctx)
    7475                 :            : {
    7476                 :          0 :         struct intel_encoder *encoder;
    7477         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7478                 :          0 :         struct intel_bw_state *bw_state =
    7479                 :          0 :                 to_intel_bw_state(dev_priv->bw_obj.state);
    7480                 :          0 :         struct intel_crtc_state *crtc_state =
    7481                 :          0 :                 to_intel_crtc_state(crtc->base.state);
    7482                 :          0 :         enum intel_display_power_domain domain;
    7483                 :          0 :         struct intel_plane *plane;
    7484                 :          0 :         struct drm_atomic_state *state;
    7485                 :          0 :         struct intel_crtc_state *temp_crtc_state;
    7486                 :          0 :         enum pipe pipe = crtc->pipe;
    7487                 :          0 :         u64 domains;
    7488                 :          0 :         int ret;
    7489                 :            : 
    7490         [ #  # ]:          0 :         if (!crtc_state->hw.active)
    7491                 :            :                 return;
    7492                 :            : 
    7493   [ #  #  #  # ]:          0 :         for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
    7494                 :          0 :                 const struct intel_plane_state *plane_state =
    7495                 :          0 :                         to_intel_plane_state(plane->base.state);
    7496                 :            : 
    7497         [ #  # ]:          0 :                 if (plane_state->uapi.visible)
    7498                 :          0 :                         intel_plane_disable_noatomic(crtc, plane);
    7499                 :            :         }
    7500                 :            : 
    7501                 :          0 :         state = drm_atomic_state_alloc(&dev_priv->drm);
    7502         [ #  # ]:          0 :         if (!state) {
    7503                 :          0 :                 DRM_DEBUG_KMS("failed to disable [CRTC:%d:%s], out of memory",
    7504                 :            :                               crtc->base.base.id, crtc->base.name);
    7505                 :          0 :                 return;
    7506                 :            :         }
    7507                 :            : 
    7508                 :          0 :         state->acquire_ctx = ctx;
    7509                 :            : 
    7510                 :            :         /* Everything's already locked, -EDEADLK can't happen. */
    7511                 :          0 :         temp_crtc_state = intel_atomic_get_crtc_state(state, crtc);
    7512                 :          0 :         ret = drm_atomic_add_affected_connectors(state, &crtc->base);
    7513                 :            : 
    7514   [ #  #  #  #  :          0 :         WARN_ON(IS_ERR(temp_crtc_state) || ret);
                   #  # ]
    7515                 :            : 
    7516                 :          0 :         dev_priv->display.crtc_disable(to_intel_atomic_state(state), crtc);
    7517                 :            : 
    7518                 :          0 :         drm_atomic_state_put(state);
    7519                 :            : 
    7520                 :          0 :         DRM_DEBUG_KMS("[CRTC:%d:%s] hw state adjusted, was enabled, now disabled\n",
    7521                 :            :                       crtc->base.base.id, crtc->base.name);
    7522                 :            : 
    7523                 :          0 :         crtc->active = false;
    7524                 :          0 :         crtc->base.enabled = false;
    7525                 :            : 
    7526         [ #  # ]:          0 :         WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, NULL) < 0);
    7527                 :          0 :         crtc_state->uapi.active = false;
    7528                 :          0 :         crtc_state->uapi.connector_mask = 0;
    7529                 :          0 :         crtc_state->uapi.encoder_mask = 0;
    7530                 :          0 :         intel_crtc_free_hw_state(crtc_state);
    7531                 :          0 :         memset(&crtc_state->hw, 0, sizeof(crtc_state->hw));
    7532                 :            : 
    7533   [ #  #  #  # ]:          0 :         for_each_encoder_on_crtc(&dev_priv->drm, &crtc->base, encoder)
    7534                 :          0 :                 encoder->base.crtc = NULL;
    7535                 :            : 
    7536                 :          0 :         intel_fbc_disable(crtc);
    7537                 :          0 :         intel_update_watermarks(crtc);
    7538                 :          0 :         intel_disable_shared_dpll(crtc_state);
    7539                 :            : 
    7540                 :          0 :         domains = crtc->enabled_power_domains;
    7541   [ #  #  #  # ]:          0 :         for_each_power_domain(domain, domains)
    7542                 :          0 :                 intel_display_power_put_unchecked(dev_priv, domain);
    7543                 :          0 :         crtc->enabled_power_domains = 0;
    7544                 :            : 
    7545                 :          0 :         dev_priv->active_pipes &= ~BIT(pipe);
    7546                 :          0 :         dev_priv->min_cdclk[pipe] = 0;
    7547                 :          0 :         dev_priv->min_voltage_level[pipe] = 0;
    7548                 :            : 
    7549                 :          0 :         bw_state->data_rate[pipe] = 0;
    7550                 :          0 :         bw_state->num_active_planes[pipe] = 0;
    7551                 :            : }
    7552                 :            : 
    7553                 :            : /*
    7554                 :            :  * turn all crtc's off, but do not adjust state
    7555                 :            :  * This has to be paired with a call to intel_modeset_setup_hw_state.
    7556                 :            :  */
    7557                 :          0 : int intel_display_suspend(struct drm_device *dev)
    7558                 :            : {
    7559                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    7560                 :          0 :         struct drm_atomic_state *state;
    7561                 :          0 :         int ret;
    7562                 :            : 
    7563                 :          0 :         state = drm_atomic_helper_suspend(dev);
    7564         [ #  # ]:          0 :         ret = PTR_ERR_OR_ZERO(state);
    7565         [ #  # ]:          0 :         if (ret)
    7566                 :          0 :                 DRM_ERROR("Suspending crtc's failed with %i\n", ret);
    7567                 :            :         else
    7568                 :          0 :                 dev_priv->modeset_restore_state = state;
    7569                 :          0 :         return ret;
    7570                 :            : }
    7571                 :            : 
    7572                 :          0 : void intel_encoder_destroy(struct drm_encoder *encoder)
    7573                 :            : {
    7574                 :          0 :         struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
    7575                 :            : 
    7576                 :          0 :         drm_encoder_cleanup(encoder);
    7577                 :          0 :         kfree(intel_encoder);
    7578                 :          0 : }
    7579                 :            : 
    7580                 :            : /* Cross check the actual hw state with our own modeset state tracking (and it's
    7581                 :            :  * internal consistency). */
    7582                 :          0 : static void intel_connector_verify_state(struct intel_crtc_state *crtc_state,
    7583                 :            :                                          struct drm_connector_state *conn_state)
    7584                 :            : {
    7585                 :          0 :         struct intel_connector *connector = to_intel_connector(conn_state->connector);
    7586                 :            : 
    7587                 :          0 :         DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
    7588                 :            :                       connector->base.base.id,
    7589                 :            :                       connector->base.name);
    7590                 :            : 
    7591         [ #  # ]:          0 :         if (connector->get_hw_state(connector)) {
    7592                 :          0 :                 struct intel_encoder *encoder = connector->encoder;
    7593                 :            : 
    7594   [ #  #  #  #  :          0 :                 I915_STATE_WARN(!crtc_state,
                   #  # ]
    7595                 :            :                          "connector enabled without attached crtc\n");
    7596                 :            : 
    7597         [ #  # ]:          0 :                 if (!crtc_state)
    7598                 :            :                         return;
    7599                 :            : 
    7600   [ #  #  #  #  :          0 :                 I915_STATE_WARN(!crtc_state->hw.active,
                   #  # ]
    7601                 :            :                                 "connector is active, but attached crtc isn't\n");
    7602                 :            : 
    7603   [ #  #  #  # ]:          0 :                 if (!encoder || encoder->type == INTEL_OUTPUT_DP_MST)
    7604                 :            :                         return;
    7605                 :            : 
    7606   [ #  #  #  #  :          0 :                 I915_STATE_WARN(conn_state->best_encoder != &encoder->base,
                   #  # ]
    7607                 :            :                         "atomic encoder doesn't match attached encoder\n");
    7608                 :            : 
    7609   [ #  #  #  #  :          0 :                 I915_STATE_WARN(conn_state->crtc != encoder->base.crtc,
                   #  # ]
    7610                 :            :                         "attached encoder crtc differs from connector crtc\n");
    7611                 :            :         } else {
    7612   [ #  #  #  #  :          0 :                 I915_STATE_WARN(crtc_state && crtc_state->hw.active,
          #  #  #  #  #  
                      # ]
    7613                 :            :                                 "attached crtc is active, but connector isn't\n");
    7614   [ #  #  #  #  :          0 :                 I915_STATE_WARN(!crtc_state && conn_state->best_encoder,
          #  #  #  #  #  
                      # ]
    7615                 :            :                         "best encoder set without crtc!\n");
    7616                 :            :         }
    7617                 :            : }
    7618                 :            : 
    7619                 :            : static int pipe_required_fdi_lanes(struct intel_crtc_state *crtc_state)
    7620                 :            : {
    7621                 :            :         if (crtc_state->hw.enable && crtc_state->has_pch_encoder)
    7622                 :            :                 return crtc_state->fdi_lanes;
    7623                 :            : 
    7624                 :            :         return 0;
    7625                 :            : }
    7626                 :            : 
    7627                 :            : static int ilk_check_fdi_lanes(struct drm_device *dev, enum pipe pipe,
    7628                 :            :                                struct intel_crtc_state *pipe_config)
    7629                 :            : {
    7630                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    7631                 :            :         struct drm_atomic_state *state = pipe_config->uapi.state;
    7632                 :            :         struct intel_crtc *other_crtc;
    7633                 :            :         struct intel_crtc_state *other_crtc_state;
    7634                 :            : 
    7635                 :            :         DRM_DEBUG_KMS("checking fdi config on pipe %c, lanes %i\n",
    7636                 :            :                       pipe_name(pipe), pipe_config->fdi_lanes);
    7637                 :            :         if (pipe_config->fdi_lanes > 4) {
    7638                 :            :                 DRM_DEBUG_KMS("invalid fdi lane config on pipe %c: %i lanes\n",
    7639                 :            :                               pipe_name(pipe), pipe_config->fdi_lanes);
    7640                 :            :                 return -EINVAL;
    7641                 :            :         }
    7642                 :            : 
    7643                 :            :         if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
    7644                 :            :                 if (pipe_config->fdi_lanes > 2) {
    7645                 :            :                         DRM_DEBUG_KMS("only 2 lanes on haswell, required: %i lanes\n",
    7646                 :            :                                       pipe_config->fdi_lanes);
    7647                 :            :                         return -EINVAL;
    7648                 :            :                 } else {
    7649                 :            :                         return 0;
    7650                 :            :                 }
    7651                 :            :         }
    7652                 :            : 
    7653                 :            :         if (INTEL_NUM_PIPES(dev_priv) == 2)
    7654                 :            :                 return 0;
    7655                 :            : 
    7656                 :            :         /* Ivybridge 3 pipe is really complicated */
    7657                 :            :         switch (pipe) {
    7658                 :            :         case PIPE_A:
    7659                 :            :                 return 0;
    7660                 :            :         case PIPE_B:
    7661                 :            :                 if (pipe_config->fdi_lanes <= 2)
    7662                 :            :                         return 0;
    7663                 :            : 
    7664                 :            :                 other_crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_C);
    7665                 :            :                 other_crtc_state =
    7666                 :            :                         intel_atomic_get_crtc_state(state, other_crtc);
    7667                 :            :                 if (IS_ERR(other_crtc_state))
    7668                 :            :                         return PTR_ERR(other_crtc_state);
    7669                 :            : 
    7670                 :            :                 if (pipe_required_fdi_lanes(other_crtc_state) > 0) {
    7671                 :            :                         DRM_DEBUG_KMS("invalid shared fdi lane config on pipe %c: %i lanes\n",
    7672                 :            :                                       pipe_name(pipe), pipe_config->fdi_lanes);
    7673                 :            :                         return -EINVAL;
    7674                 :            :                 }
    7675                 :            :                 return 0;
    7676                 :            :         case PIPE_C:
    7677                 :            :                 if (pipe_config->fdi_lanes > 2) {
    7678                 :            :                         DRM_DEBUG_KMS("only 2 lanes on pipe %c: required %i lanes\n",
    7679                 :            :                                       pipe_name(pipe), pipe_config->fdi_lanes);
    7680                 :            :                         return -EINVAL;
    7681                 :            :                 }
    7682                 :            : 
    7683                 :            :                 other_crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_B);
    7684                 :            :                 other_crtc_state =
    7685                 :            :                         intel_atomic_get_crtc_state(state, other_crtc);
    7686                 :            :                 if (IS_ERR(other_crtc_state))
    7687                 :            :                         return PTR_ERR(other_crtc_state);
    7688                 :            : 
    7689                 :            :                 if (pipe_required_fdi_lanes(other_crtc_state) > 2) {
    7690                 :            :                         DRM_DEBUG_KMS("fdi link B uses too many lanes to enable link C\n");
    7691                 :            :                         return -EINVAL;
    7692                 :            :                 }
    7693                 :            :                 return 0;
    7694                 :            :         default:
    7695                 :            :                 BUG();
    7696                 :            :         }
    7697                 :            : }
    7698                 :            : 
    7699                 :            : #define RETRY 1
    7700                 :            : static int ilk_fdi_compute_config(struct intel_crtc *intel_crtc,
    7701                 :            :                                   struct intel_crtc_state *pipe_config)
    7702                 :            : {
    7703                 :            :         struct drm_device *dev = intel_crtc->base.dev;
    7704                 :            :         const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
    7705                 :            :         int lane, link_bw, fdi_dotclock, ret;
    7706                 :            :         bool needs_recompute = false;
    7707                 :            : 
    7708                 :            : retry:
    7709                 :            :         /* FDI is a binary signal running at ~2.7GHz, encoding
    7710                 :            :          * each output octet as 10 bits. The actual frequency
    7711                 :            :          * is stored as a divider into a 100MHz clock, and the
    7712                 :            :          * mode pixel clock is stored in units of 1KHz.
    7713                 :            :          * Hence the bw of each lane in terms of the mode signal
    7714                 :            :          * is:
    7715                 :            :          */
    7716                 :            :         link_bw = intel_fdi_link_freq(to_i915(dev), pipe_config);
    7717                 :            : 
    7718                 :            :         fdi_dotclock = adjusted_mode->crtc_clock;
    7719                 :            : 
    7720                 :            :         lane = ilk_get_lanes_required(fdi_dotclock, link_bw,
    7721                 :            :                                       pipe_config->pipe_bpp);
    7722                 :            : 
    7723                 :            :         pipe_config->fdi_lanes = lane;
    7724                 :            : 
    7725                 :            :         intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock,
    7726                 :            :                                link_bw, &pipe_config->fdi_m_n, false, false);
    7727                 :            : 
    7728                 :            :         ret = ilk_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config);
    7729                 :            :         if (ret == -EDEADLK)
    7730                 :            :                 return ret;
    7731                 :            : 
    7732                 :            :         if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
    7733                 :            :                 pipe_config->pipe_bpp -= 2*3;
    7734                 :            :                 DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe bpp to %i\n",
    7735                 :            :                               pipe_config->pipe_bpp);
    7736                 :            :                 needs_recompute = true;
    7737                 :            :                 pipe_config->bw_constrained = true;
    7738                 :            : 
    7739                 :            :                 goto retry;
    7740                 :            :         }
    7741                 :            : 
    7742                 :            :         if (needs_recompute)
    7743                 :            :                 return RETRY;
    7744                 :            : 
    7745                 :            :         return ret;
    7746                 :            : }
    7747                 :            : 
    7748                 :          0 : bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state)
    7749                 :            : {
    7750                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    7751         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7752                 :            : 
    7753                 :            :         /* IPS only exists on ULT machines and is tied to pipe A. */
    7754   [ #  #  #  # ]:          0 :         if (!hsw_crtc_supports_ips(crtc))
    7755                 :            :                 return false;
    7756                 :            : 
    7757         [ #  # ]:          0 :         if (!i915_modparams.enable_ips)
    7758                 :            :                 return false;
    7759                 :            : 
    7760         [ #  # ]:          0 :         if (crtc_state->pipe_bpp > 24)
    7761                 :            :                 return false;
    7762                 :            : 
    7763                 :            :         /*
    7764                 :            :          * We compare against max which means we must take
    7765                 :            :          * the increased cdclk requirement into account when
    7766                 :            :          * calculating the new cdclk.
    7767                 :            :          *
    7768                 :            :          * Should measure whether using a lower cdclk w/o IPS
    7769                 :            :          */
    7770         [ #  # ]:          0 :         if (IS_BROADWELL(dev_priv) &&
    7771         [ #  # ]:          0 :             crtc_state->pixel_rate > dev_priv->max_cdclk_freq * 95 / 100)
    7772                 :          0 :                 return false;
    7773                 :            : 
    7774                 :            :         return true;
    7775                 :            : }
    7776                 :            : 
    7777                 :          0 : static bool hsw_compute_ips_config(struct intel_crtc_state *crtc_state)
    7778                 :            : {
    7779                 :          0 :         struct drm_i915_private *dev_priv =
    7780         [ #  # ]:          0 :                 to_i915(crtc_state->uapi.crtc->dev);
    7781                 :          0 :         struct intel_atomic_state *intel_state =
    7782                 :          0 :                 to_intel_atomic_state(crtc_state->uapi.state);
    7783                 :            : 
    7784         [ #  # ]:          0 :         if (!hsw_crtc_state_ips_capable(crtc_state))
    7785                 :            :                 return false;
    7786                 :            : 
    7787                 :            :         /*
    7788                 :            :          * When IPS gets enabled, the pipe CRC changes. Since IPS gets
    7789                 :            :          * enabled and disabled dynamically based on package C states,
    7790                 :            :          * user space can't make reliable use of the CRCs, so let's just
    7791                 :            :          * completely disable it.
    7792                 :            :          */
    7793         [ #  # ]:          0 :         if (crtc_state->crc_enabled)
    7794                 :            :                 return false;
    7795                 :            : 
    7796                 :            :         /* IPS should be fine as long as at least one plane is enabled. */
    7797         [ #  # ]:          0 :         if (!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)))
    7798                 :            :                 return false;
    7799                 :            : 
    7800                 :            :         /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
    7801         [ #  # ]:          0 :         if (IS_BROADWELL(dev_priv) &&
    7802         [ #  # ]:          0 :             crtc_state->pixel_rate > intel_state->cdclk.logical.cdclk * 95 / 100)
    7803                 :          0 :                 return false;
    7804                 :            : 
    7805                 :            :         return true;
    7806                 :            : }
    7807                 :            : 
    7808                 :          0 : static bool intel_crtc_supports_double_wide(const struct intel_crtc *crtc)
    7809                 :            : {
    7810                 :          0 :         const struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7811                 :            : 
    7812                 :            :         /* GDG double wide on either pipe, otherwise pipe A only */
    7813                 :          0 :         return INTEL_GEN(dev_priv) < 4 &&
    7814   [ #  #  #  # ]:          0 :                 (crtc->pipe == PIPE_A || IS_I915G(dev_priv));
    7815                 :            : }
    7816                 :            : 
    7817                 :          0 : static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config)
    7818                 :            : {
    7819                 :          0 :         u32 pixel_rate;
    7820                 :            : 
    7821                 :          0 :         pixel_rate = pipe_config->hw.adjusted_mode.crtc_clock;
    7822                 :            : 
    7823                 :            :         /*
    7824                 :            :          * We only use IF-ID interlacing. If we ever use
    7825                 :            :          * PF-ID we'll need to adjust the pixel_rate here.
    7826                 :            :          */
    7827                 :            : 
    7828         [ #  # ]:          0 :         if (pipe_config->pch_pfit.enabled) {
    7829                 :          0 :                 u64 pipe_w, pipe_h, pfit_w, pfit_h;
    7830                 :          0 :                 u32 pfit_size = pipe_config->pch_pfit.size;
    7831                 :            : 
    7832                 :          0 :                 pipe_w = pipe_config->pipe_src_w;
    7833                 :          0 :                 pipe_h = pipe_config->pipe_src_h;
    7834                 :            : 
    7835                 :          0 :                 pfit_w = (pfit_size >> 16) & 0xFFFF;
    7836                 :          0 :                 pfit_h = pfit_size & 0xFFFF;
    7837                 :          0 :                 if (pipe_w < pfit_w)
    7838                 :            :                         pipe_w = pfit_w;
    7839                 :          0 :                 if (pipe_h < pfit_h)
    7840                 :            :                         pipe_h = pfit_h;
    7841                 :            : 
    7842   [ #  #  #  # ]:          0 :                 if (WARN_ON(!pfit_w || !pfit_h))
    7843                 :            :                         return pixel_rate;
    7844                 :            : 
    7845                 :          0 :                 pixel_rate = div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
    7846                 :            :                                      pfit_w * pfit_h);
    7847                 :            :         }
    7848                 :            : 
    7849                 :            :         return pixel_rate;
    7850                 :            : }
    7851                 :            : 
    7852                 :          0 : static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
    7853                 :            : {
    7854                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    7855                 :            : 
    7856   [ #  #  #  #  :          0 :         if (HAS_GMCH(dev_priv))
                   #  # ]
    7857                 :            :                 /* FIXME calculate proper pipe pixel rate for GMCH pfit */
    7858                 :          0 :                 crtc_state->pixel_rate =
    7859                 :          0 :                         crtc_state->hw.adjusted_mode.crtc_clock;
    7860                 :            :         else
    7861                 :          0 :                 crtc_state->pixel_rate =
    7862                 :          0 :                         ilk_pipe_pixel_rate(crtc_state);
    7863                 :            : }
    7864                 :            : 
    7865                 :          0 : static int intel_crtc_compute_config(struct intel_crtc *crtc,
    7866                 :            :                                      struct intel_crtc_state *pipe_config)
    7867                 :            : {
    7868         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    7869                 :          0 :         const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
    7870                 :          0 :         int clock_limit = dev_priv->max_dotclk_freq;
    7871                 :            : 
    7872         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4) {
    7873                 :          0 :                 clock_limit = dev_priv->max_cdclk_freq * 9 / 10;
    7874                 :            : 
    7875                 :            :                 /*
    7876                 :            :                  * Enable double wide mode when the dot clock
    7877                 :            :                  * is > 90% of the (display) core speed.
    7878                 :            :                  */
    7879   [ #  #  #  # ]:          0 :                 if (intel_crtc_supports_double_wide(crtc) &&
    7880         [ #  # ]:          0 :                     adjusted_mode->crtc_clock > clock_limit) {
    7881                 :          0 :                         clock_limit = dev_priv->max_dotclk_freq;
    7882                 :          0 :                         pipe_config->double_wide = true;
    7883                 :            :                 }
    7884                 :            :         }
    7885                 :            : 
    7886         [ #  # ]:          0 :         if (adjusted_mode->crtc_clock > clock_limit) {
    7887         [ #  # ]:          0 :                 DRM_DEBUG_KMS("requested pixel clock (%d kHz) too high (max: %d kHz, double wide: %s)\n",
    7888                 :            :                               adjusted_mode->crtc_clock, clock_limit,
    7889                 :            :                               yesno(pipe_config->double_wide));
    7890                 :          0 :                 return -EINVAL;
    7891                 :            :         }
    7892                 :            : 
    7893         [ #  # ]:          0 :         if ((pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
    7894                 :          0 :              pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) &&
    7895         [ #  # ]:          0 :              pipe_config->hw.ctm) {
    7896                 :            :                 /*
    7897                 :            :                  * There is only one pipe CSC unit per pipe, and we need that
    7898                 :            :                  * for output conversion from RGB->YCBCR. So if CTM is already
    7899                 :            :                  * applied we can't support YCBCR420 output.
    7900                 :            :                  */
    7901                 :          0 :                 DRM_DEBUG_KMS("YCBCR420 and CTM together are not possible\n");
    7902                 :          0 :                 return -EINVAL;
    7903                 :            :         }
    7904                 :            : 
    7905                 :            :         /*
    7906                 :            :          * Pipe horizontal size must be even in:
    7907                 :            :          * - DVO ganged mode
    7908                 :            :          * - LVDS dual channel mode
    7909                 :            :          * - Double wide pipe
    7910                 :            :          */
    7911         [ #  # ]:          0 :         if (pipe_config->pipe_src_w & 1) {
    7912         [ #  # ]:          0 :                 if (pipe_config->double_wide) {
    7913                 :          0 :                         DRM_DEBUG_KMS("Odd pipe source width not supported with double wide pipe\n");
    7914                 :          0 :                         return -EINVAL;
    7915                 :            :                 }
    7916                 :            : 
    7917   [ #  #  #  # ]:          0 :                 if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_LVDS) &&
    7918                 :          0 :                     intel_is_dual_link_lvds(dev_priv)) {
    7919                 :          0 :                         DRM_DEBUG_KMS("Odd pipe source width not supported with dual link LVDS\n");
    7920                 :          0 :                         return -EINVAL;
    7921                 :            :                 }
    7922                 :            :         }
    7923                 :            : 
    7924                 :            :         /* Cantiga+ cannot handle modes with a hsync front porch of 0.
    7925                 :            :          * WaPruneModeWithIncorrectHsyncOffset:ctg,elk,ilk,snb,ivb,vlv,hsw.
    7926                 :            :          */
    7927   [ #  #  #  #  :          0 :         if ((INTEL_GEN(dev_priv) > 4 || IS_G4X(dev_priv)) &&
                   #  # ]
    7928         [ #  # ]:          0 :                 adjusted_mode->crtc_hsync_start == adjusted_mode->crtc_hdisplay)
    7929                 :            :                 return -EINVAL;
    7930                 :            : 
    7931         [ #  # ]:          0 :         intel_crtc_compute_pixel_rate(pipe_config);
    7932                 :            : 
    7933         [ #  # ]:          0 :         if (pipe_config->has_pch_encoder)
    7934                 :          0 :                 return ilk_fdi_compute_config(crtc, pipe_config);
    7935                 :            : 
    7936                 :            :         return 0;
    7937                 :            : }
    7938                 :            : 
    7939                 :            : static void
    7940                 :          0 : intel_reduce_m_n_ratio(u32 *num, u32 *den)
    7941                 :            : {
    7942         [ #  # ]:          0 :         while (*num > DATA_LINK_M_N_MASK ||
    7943         [ #  # ]:          0 :                *den > DATA_LINK_M_N_MASK) {
    7944                 :          0 :                 *num >>= 1;
    7945                 :          0 :                 *den >>= 1;
    7946                 :            :         }
    7947                 :            : }
    7948                 :            : 
    7949                 :          0 : static void compute_m_n(unsigned int m, unsigned int n,
    7950                 :            :                         u32 *ret_m, u32 *ret_n,
    7951                 :            :                         bool constant_n)
    7952                 :            : {
    7953                 :            :         /*
    7954                 :            :          * Several DP dongles in particular seem to be fussy about
    7955                 :            :          * too large link M/N values. Give N value as 0x8000 that
    7956                 :            :          * should be acceptable by specific devices. 0x8000 is the
    7957                 :            :          * specified fixed N value for asynchronous clock mode,
    7958                 :            :          * which the devices expect also in synchronous clock mode.
    7959                 :            :          */
    7960         [ #  # ]:          0 :         if (constant_n)
    7961                 :          0 :                 *ret_n = 0x8000;
    7962                 :            :         else
    7963   [ #  #  #  #  :          0 :                 *ret_n = min_t(unsigned int, roundup_pow_of_two(n), DATA_LINK_N_MAX);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    7964                 :            : 
    7965                 :          0 :         *ret_m = div_u64(mul_u32_u32(m, *ret_n), n);
    7966                 :          0 :         intel_reduce_m_n_ratio(ret_m, ret_n);
    7967                 :          0 : }
    7968                 :            : 
    7969                 :            : void
    7970                 :          0 : intel_link_compute_m_n(u16 bits_per_pixel, int nlanes,
    7971                 :            :                        int pixel_clock, int link_clock,
    7972                 :            :                        struct intel_link_m_n *m_n,
    7973                 :            :                        bool constant_n, bool fec_enable)
    7974                 :            : {
    7975                 :          0 :         u32 data_clock = bits_per_pixel * pixel_clock;
    7976                 :            : 
    7977         [ #  # ]:          0 :         if (fec_enable)
    7978                 :          0 :                 data_clock = intel_dp_mode_to_fec_clock(data_clock);
    7979                 :            : 
    7980                 :          0 :         m_n->tu = 64;
    7981                 :          0 :         compute_m_n(data_clock,
    7982                 :          0 :                     link_clock * nlanes * 8,
    7983                 :            :                     &m_n->gmch_m, &m_n->gmch_n,
    7984                 :            :                     constant_n);
    7985                 :            : 
    7986                 :          0 :         compute_m_n(pixel_clock, link_clock,
    7987                 :            :                     &m_n->link_m, &m_n->link_n,
    7988                 :            :                     constant_n);
    7989                 :          0 : }
    7990                 :            : 
    7991                 :          0 : static void intel_panel_sanitize_ssc(struct drm_i915_private *dev_priv)
    7992                 :            : {
    7993                 :            :         /*
    7994                 :            :          * There may be no VBT; and if the BIOS enabled SSC we can
    7995                 :            :          * just keep using it to avoid unnecessary flicker.  Whereas if the
    7996                 :            :          * BIOS isn't using it, don't assume it will work even if the VBT
    7997                 :            :          * indicates as much.
    7998                 :            :          */
    7999         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)) {
    8000                 :          0 :                 bool bios_lvds_use_ssc = I915_READ(PCH_DREF_CONTROL) &
    8001                 :            :                         DREF_SSC1_ENABLE;
    8002                 :            : 
    8003         [ #  # ]:          0 :                 if (dev_priv->vbt.lvds_use_ssc != bios_lvds_use_ssc) {
    8004         [ #  # ]:          0 :                         DRM_DEBUG_KMS("SSC %s by BIOS, overriding VBT which says %s\n",
    8005                 :            :                                       enableddisabled(bios_lvds_use_ssc),
    8006                 :            :                                       enableddisabled(dev_priv->vbt.lvds_use_ssc));
    8007                 :          0 :                         dev_priv->vbt.lvds_use_ssc = bios_lvds_use_ssc;
    8008                 :            :                 }
    8009                 :            :         }
    8010                 :          0 : }
    8011                 :            : 
    8012                 :          0 : static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
    8013                 :            : {
    8014                 :          0 :         if (i915_modparams.panel_use_ssc >= 0)
    8015                 :          0 :                 return i915_modparams.panel_use_ssc != 0;
    8016                 :          0 :         return dev_priv->vbt.lvds_use_ssc
    8017   [ #  #  #  #  :          0 :                 && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    8018                 :            : }
    8019                 :            : 
    8020                 :            : static u32 pnv_dpll_compute_fp(struct dpll *dpll)
    8021                 :            : {
    8022                 :            :         return (1 << dpll->n) << 16 | dpll->m2;
    8023                 :            : }
    8024                 :            : 
    8025                 :          0 : static u32 i9xx_dpll_compute_fp(struct dpll *dpll)
    8026                 :            : {
    8027                 :          0 :         return dpll->n << 16 | dpll->m1 << 8 | dpll->m2;
    8028                 :            : }
    8029                 :            : 
    8030                 :            : static void i9xx_update_pll_dividers(struct intel_crtc *crtc,
    8031                 :            :                                      struct intel_crtc_state *crtc_state,
    8032                 :            :                                      struct dpll *reduced_clock)
    8033                 :            : {
    8034                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8035                 :            :         u32 fp, fp2 = 0;
    8036                 :            : 
    8037                 :            :         if (IS_PINEVIEW(dev_priv)) {
    8038                 :            :                 fp = pnv_dpll_compute_fp(&crtc_state->dpll);
    8039                 :            :                 if (reduced_clock)
    8040                 :            :                         fp2 = pnv_dpll_compute_fp(reduced_clock);
    8041                 :            :         } else {
    8042                 :            :                 fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
    8043                 :            :                 if (reduced_clock)
    8044                 :            :                         fp2 = i9xx_dpll_compute_fp(reduced_clock);
    8045                 :            :         }
    8046                 :            : 
    8047                 :            :         crtc_state->dpll_hw_state.fp0 = fp;
    8048                 :            : 
    8049                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
    8050                 :            :             reduced_clock) {
    8051                 :            :                 crtc_state->dpll_hw_state.fp1 = fp2;
    8052                 :            :         } else {
    8053                 :            :                 crtc_state->dpll_hw_state.fp1 = fp;
    8054                 :            :         }
    8055                 :            : }
    8056                 :            : 
    8057                 :          0 : static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv, enum pipe
    8058                 :            :                 pipe)
    8059                 :            : {
    8060                 :          0 :         u32 reg_val;
    8061                 :            : 
    8062                 :            :         /*
    8063                 :            :          * PLLB opamp always calibrates to max value of 0x3f, force enable it
    8064                 :            :          * and set it to a reasonable value instead.
    8065                 :            :          */
    8066                 :          0 :         reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
    8067                 :          0 :         reg_val &= 0xffffff00;
    8068                 :          0 :         reg_val |= 0x00000030;
    8069                 :          0 :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
    8070                 :            : 
    8071                 :          0 :         reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
    8072                 :          0 :         reg_val &= 0x00ffffff;
    8073                 :          0 :         reg_val |= 0x8c000000;
    8074                 :          0 :         vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
    8075                 :            : 
    8076                 :          0 :         reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
    8077                 :          0 :         reg_val &= 0xffffff00;
    8078                 :          0 :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
    8079                 :            : 
    8080                 :          0 :         reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
    8081                 :          0 :         reg_val &= 0x00ffffff;
    8082                 :          0 :         reg_val |= 0xb0000000;
    8083                 :          0 :         vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
    8084                 :          0 : }
    8085                 :            : 
    8086                 :            : static void intel_pch_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
    8087                 :            :                                          const struct intel_link_m_n *m_n)
    8088                 :            : {
    8089                 :            :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    8090                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8091                 :            :         enum pipe pipe = crtc->pipe;
    8092                 :            : 
    8093                 :            :         I915_WRITE(PCH_TRANS_DATA_M1(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
    8094                 :            :         I915_WRITE(PCH_TRANS_DATA_N1(pipe), m_n->gmch_n);
    8095                 :            :         I915_WRITE(PCH_TRANS_LINK_M1(pipe), m_n->link_m);
    8096                 :            :         I915_WRITE(PCH_TRANS_LINK_N1(pipe), m_n->link_n);
    8097                 :            : }
    8098                 :            : 
    8099                 :          0 : static bool transcoder_has_m2_n2(struct drm_i915_private *dev_priv,
    8100                 :            :                                  enum transcoder transcoder)
    8101                 :            : {
    8102         [ #  # ]:          0 :         if (IS_HASWELL(dev_priv))
    8103                 :          0 :                 return transcoder == TRANSCODER_EDP;
    8104                 :            : 
    8105                 :            :         /*
    8106                 :            :          * Strictly speaking some registers are available before
    8107                 :            :          * gen7, but we only support DRRS on gen7+
    8108                 :            :          */
    8109   [ #  #  #  # ]:          0 :         return IS_GEN(dev_priv, 7) || IS_CHERRYVIEW(dev_priv);
    8110                 :            : }
    8111                 :            : 
    8112                 :          0 : static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
    8113                 :            :                                          const struct intel_link_m_n *m_n,
    8114                 :            :                                          const struct intel_link_m_n *m2_n2)
    8115                 :            : {
    8116                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    8117         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8118                 :          0 :         enum pipe pipe = crtc->pipe;
    8119                 :          0 :         enum transcoder transcoder = crtc_state->cpu_transcoder;
    8120                 :            : 
    8121         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 5) {
    8122                 :          0 :                 I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
    8123                 :          0 :                 I915_WRITE(PIPE_DATA_N1(transcoder), m_n->gmch_n);
    8124                 :          0 :                 I915_WRITE(PIPE_LINK_M1(transcoder), m_n->link_m);
    8125                 :          0 :                 I915_WRITE(PIPE_LINK_N1(transcoder), m_n->link_n);
    8126                 :            :                 /*
    8127                 :            :                  *  M2_N2 registers are set only if DRRS is supported
    8128                 :            :                  * (to make sure the registers are not unnecessarily accessed).
    8129                 :            :                  */
    8130   [ #  #  #  #  :          0 :                 if (m2_n2 && crtc_state->has_drrs &&
                   #  # ]
    8131                 :            :                     transcoder_has_m2_n2(dev_priv, transcoder)) {
    8132                 :          0 :                         I915_WRITE(PIPE_DATA_M2(transcoder),
    8133                 :            :                                         TU_SIZE(m2_n2->tu) | m2_n2->gmch_m);
    8134                 :          0 :                         I915_WRITE(PIPE_DATA_N2(transcoder), m2_n2->gmch_n);
    8135                 :          0 :                         I915_WRITE(PIPE_LINK_M2(transcoder), m2_n2->link_m);
    8136                 :          0 :                         I915_WRITE(PIPE_LINK_N2(transcoder), m2_n2->link_n);
    8137                 :            :                 }
    8138                 :            :         } else {
    8139                 :          0 :                 I915_WRITE(PIPE_DATA_M_G4X(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
    8140                 :          0 :                 I915_WRITE(PIPE_DATA_N_G4X(pipe), m_n->gmch_n);
    8141                 :          0 :                 I915_WRITE(PIPE_LINK_M_G4X(pipe), m_n->link_m);
    8142                 :          0 :                 I915_WRITE(PIPE_LINK_N_G4X(pipe), m_n->link_n);
    8143                 :            :         }
    8144                 :          0 : }
    8145                 :            : 
    8146                 :          0 : void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, enum link_m_n_set m_n)
    8147                 :            : {
    8148                 :          0 :         const struct intel_link_m_n *dp_m_n, *dp_m2_n2 = NULL;
    8149                 :            : 
    8150         [ #  # ]:          0 :         if (m_n == M1_N1) {
    8151                 :          0 :                 dp_m_n = &crtc_state->dp_m_n;
    8152                 :          0 :                 dp_m2_n2 = &crtc_state->dp_m2_n2;
    8153         [ #  # ]:          0 :         } else if (m_n == M2_N2) {
    8154                 :            : 
    8155                 :            :                 /*
    8156                 :            :                  * M2_N2 registers are not supported. Hence m2_n2 divider value
    8157                 :            :                  * needs to be programmed into M1_N1.
    8158                 :            :                  */
    8159                 :          0 :                 dp_m_n = &crtc_state->dp_m2_n2;
    8160                 :            :         } else {
    8161                 :          0 :                 DRM_ERROR("Unsupported divider value\n");
    8162                 :          0 :                 return;
    8163                 :            :         }
    8164                 :            : 
    8165         [ #  # ]:          0 :         if (crtc_state->has_pch_encoder)
    8166                 :          0 :                 intel_pch_transcoder_set_m_n(crtc_state, &crtc_state->dp_m_n);
    8167                 :            :         else
    8168                 :          0 :                 intel_cpu_transcoder_set_m_n(crtc_state, dp_m_n, dp_m2_n2);
    8169                 :            : }
    8170                 :            : 
    8171                 :          0 : static void vlv_compute_dpll(struct intel_crtc *crtc,
    8172                 :            :                              struct intel_crtc_state *pipe_config)
    8173                 :            : {
    8174                 :          0 :         pipe_config->dpll_hw_state.dpll = DPLL_INTEGRATED_REF_CLK_VLV |
    8175                 :            :                 DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
    8176                 :          0 :         if (crtc->pipe != PIPE_A)
    8177                 :          0 :                 pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
    8178                 :            : 
    8179                 :            :         /* DPLL not used with DSI, but still need the rest set up */
    8180   [ #  #  #  # ]:          0 :         if (!intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DSI))
    8181                 :          0 :                 pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE |
    8182                 :            :                         DPLL_EXT_BUFFER_ENABLE_VLV;
    8183                 :            : 
    8184                 :          0 :         pipe_config->dpll_hw_state.dpll_md =
    8185                 :          0 :                 (pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
    8186                 :            : }
    8187                 :            : 
    8188                 :          0 : static void chv_compute_dpll(struct intel_crtc *crtc,
    8189                 :            :                              struct intel_crtc_state *pipe_config)
    8190                 :            : {
    8191                 :          0 :         pipe_config->dpll_hw_state.dpll = DPLL_SSC_REF_CLK_CHV |
    8192                 :            :                 DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
    8193                 :          0 :         if (crtc->pipe != PIPE_A)
    8194                 :          0 :                 pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
    8195                 :            : 
    8196                 :            :         /* DPLL not used with DSI, but still need the rest set up */
    8197   [ #  #  #  # ]:          0 :         if (!intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DSI))
    8198                 :          0 :                 pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE;
    8199                 :            : 
    8200                 :          0 :         pipe_config->dpll_hw_state.dpll_md =
    8201                 :          0 :                 (pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
    8202                 :            : }
    8203                 :            : 
    8204                 :            : static void vlv_prepare_pll(struct intel_crtc *crtc,
    8205                 :            :                             const struct intel_crtc_state *pipe_config)
    8206                 :            : {
    8207                 :            :         struct drm_device *dev = crtc->base.dev;
    8208                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    8209                 :            :         enum pipe pipe = crtc->pipe;
    8210                 :            :         u32 mdiv;
    8211                 :            :         u32 bestn, bestm1, bestm2, bestp1, bestp2;
    8212                 :            :         u32 coreclk, reg_val;
    8213                 :            : 
    8214                 :            :         /* Enable Refclk */
    8215                 :            :         I915_WRITE(DPLL(pipe),
    8216                 :            :                    pipe_config->dpll_hw_state.dpll &
    8217                 :            :                    ~(DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV));
    8218                 :            : 
    8219                 :            :         /* No need to actually set up the DPLL with DSI */
    8220                 :            :         if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
    8221                 :            :                 return;
    8222                 :            : 
    8223                 :            :         vlv_dpio_get(dev_priv);
    8224                 :            : 
    8225                 :            :         bestn = pipe_config->dpll.n;
    8226                 :            :         bestm1 = pipe_config->dpll.m1;
    8227                 :            :         bestm2 = pipe_config->dpll.m2;
    8228                 :            :         bestp1 = pipe_config->dpll.p1;
    8229                 :            :         bestp2 = pipe_config->dpll.p2;
    8230                 :            : 
    8231                 :            :         /* See eDP HDMI DPIO driver vbios notes doc */
    8232                 :            : 
    8233                 :            :         /* PLL B needs special handling */
    8234                 :            :         if (pipe == PIPE_B)
    8235                 :            :                 vlv_pllb_recal_opamp(dev_priv, pipe);
    8236                 :            : 
    8237                 :            :         /* Set up Tx target for periodic Rcomp update */
    8238                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9_BCAST, 0x0100000f);
    8239                 :            : 
    8240                 :            :         /* Disable target IRef on PLL */
    8241                 :            :         reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW8(pipe));
    8242                 :            :         reg_val &= 0x00ffffff;
    8243                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW8(pipe), reg_val);
    8244                 :            : 
    8245                 :            :         /* Disable fast lock */
    8246                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_CMN_DW0, 0x610);
    8247                 :            : 
    8248                 :            :         /* Set idtafcrecal before PLL is enabled */
    8249                 :            :         mdiv = ((bestm1 << DPIO_M1DIV_SHIFT) | (bestm2 & DPIO_M2DIV_MASK));
    8250                 :            :         mdiv |= ((bestp1 << DPIO_P1_SHIFT) | (bestp2 << DPIO_P2_SHIFT));
    8251                 :            :         mdiv |= ((bestn << DPIO_N_SHIFT));
    8252                 :            :         mdiv |= (1 << DPIO_K_SHIFT);
    8253                 :            : 
    8254                 :            :         /*
    8255                 :            :          * Post divider depends on pixel clock rate, DAC vs digital (and LVDS,
    8256                 :            :          * but we don't support that).
    8257                 :            :          * Note: don't use the DAC post divider as it seems unstable.
    8258                 :            :          */
    8259                 :            :         mdiv |= (DPIO_POST_DIV_HDMIDP << DPIO_POST_DIV_SHIFT);
    8260                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
    8261                 :            : 
    8262                 :            :         mdiv |= DPIO_ENABLE_CALIBRATION;
    8263                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
    8264                 :            : 
    8265                 :            :         /* Set HBR and RBR LPF coefficients */
    8266                 :            :         if (pipe_config->port_clock == 162000 ||
    8267                 :            :             intel_crtc_has_type(pipe_config, INTEL_OUTPUT_ANALOG) ||
    8268                 :            :             intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI))
    8269                 :            :                 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
    8270                 :            :                                  0x009f0003);
    8271                 :            :         else
    8272                 :            :                 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
    8273                 :            :                                  0x00d0000f);
    8274                 :            : 
    8275                 :            :         if (intel_crtc_has_dp_encoder(pipe_config)) {
    8276                 :            :                 /* Use SSC source */
    8277                 :            :                 if (pipe == PIPE_A)
    8278                 :            :                         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
    8279                 :            :                                          0x0df40000);
    8280                 :            :                 else
    8281                 :            :                         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
    8282                 :            :                                          0x0df70000);
    8283                 :            :         } else { /* HDMI or VGA */
    8284                 :            :                 /* Use bend source */
    8285                 :            :                 if (pipe == PIPE_A)
    8286                 :            :                         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
    8287                 :            :                                          0x0df70000);
    8288                 :            :                 else
    8289                 :            :                         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
    8290                 :            :                                          0x0df40000);
    8291                 :            :         }
    8292                 :            : 
    8293                 :            :         coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe));
    8294                 :            :         coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
    8295                 :            :         if (intel_crtc_has_dp_encoder(pipe_config))
    8296                 :            :                 coreclk |= 0x01000000;
    8297                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk);
    8298                 :            : 
    8299                 :            :         vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW11(pipe), 0x87871000);
    8300                 :            : 
    8301                 :            :         vlv_dpio_put(dev_priv);
    8302                 :            : }
    8303                 :            : 
    8304                 :            : static void chv_prepare_pll(struct intel_crtc *crtc,
    8305                 :            :                             const struct intel_crtc_state *pipe_config)
    8306                 :            : {
    8307                 :            :         struct drm_device *dev = crtc->base.dev;
    8308                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    8309                 :            :         enum pipe pipe = crtc->pipe;
    8310                 :            :         enum dpio_channel port = vlv_pipe_to_channel(pipe);
    8311                 :            :         u32 loopfilter, tribuf_calcntr;
    8312                 :            :         u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac;
    8313                 :            :         u32 dpio_val;
    8314                 :            :         int vco;
    8315                 :            : 
    8316                 :            :         /* Enable Refclk and SSC */
    8317                 :            :         I915_WRITE(DPLL(pipe),
    8318                 :            :                    pipe_config->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE);
    8319                 :            : 
    8320                 :            :         /* No need to actually set up the DPLL with DSI */
    8321                 :            :         if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
    8322                 :            :                 return;
    8323                 :            : 
    8324                 :            :         bestn = pipe_config->dpll.n;
    8325                 :            :         bestm2_frac = pipe_config->dpll.m2 & 0x3fffff;
    8326                 :            :         bestm1 = pipe_config->dpll.m1;
    8327                 :            :         bestm2 = pipe_config->dpll.m2 >> 22;
    8328                 :            :         bestp1 = pipe_config->dpll.p1;
    8329                 :            :         bestp2 = pipe_config->dpll.p2;
    8330                 :            :         vco = pipe_config->dpll.vco;
    8331                 :            :         dpio_val = 0;
    8332                 :            :         loopfilter = 0;
    8333                 :            : 
    8334                 :            :         vlv_dpio_get(dev_priv);
    8335                 :            : 
    8336                 :            :         /* p1 and p2 divider */
    8337                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW13(port),
    8338                 :            :                         5 << DPIO_CHV_S1_DIV_SHIFT |
    8339                 :            :                         bestp1 << DPIO_CHV_P1_DIV_SHIFT |
    8340                 :            :                         bestp2 << DPIO_CHV_P2_DIV_SHIFT |
    8341                 :            :                         1 << DPIO_CHV_K_DIV_SHIFT);
    8342                 :            : 
    8343                 :            :         /* Feedback post-divider - m2 */
    8344                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW0(port), bestm2);
    8345                 :            : 
    8346                 :            :         /* Feedback refclk divider - n and m1 */
    8347                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW1(port),
    8348                 :            :                         DPIO_CHV_M1_DIV_BY_2 |
    8349                 :            :                         1 << DPIO_CHV_N_DIV_SHIFT);
    8350                 :            : 
    8351                 :            :         /* M2 fraction division */
    8352                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW2(port), bestm2_frac);
    8353                 :            : 
    8354                 :            :         /* M2 fraction division enable */
    8355                 :            :         dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
    8356                 :            :         dpio_val &= ~(DPIO_CHV_FEEDFWD_GAIN_MASK | DPIO_CHV_FRAC_DIV_EN);
    8357                 :            :         dpio_val |= (2 << DPIO_CHV_FEEDFWD_GAIN_SHIFT);
    8358                 :            :         if (bestm2_frac)
    8359                 :            :                 dpio_val |= DPIO_CHV_FRAC_DIV_EN;
    8360                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW3(port), dpio_val);
    8361                 :            : 
    8362                 :            :         /* Program digital lock detect threshold */
    8363                 :            :         dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW9(port));
    8364                 :            :         dpio_val &= ~(DPIO_CHV_INT_LOCK_THRESHOLD_MASK |
    8365                 :            :                                         DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE);
    8366                 :            :         dpio_val |= (0x5 << DPIO_CHV_INT_LOCK_THRESHOLD_SHIFT);
    8367                 :            :         if (!bestm2_frac)
    8368                 :            :                 dpio_val |= DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE;
    8369                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW9(port), dpio_val);
    8370                 :            : 
    8371                 :            :         /* Loop filter */
    8372                 :            :         if (vco == 5400000) {
    8373                 :            :                 loopfilter |= (0x3 << DPIO_CHV_PROP_COEFF_SHIFT);
    8374                 :            :                 loopfilter |= (0x8 << DPIO_CHV_INT_COEFF_SHIFT);
    8375                 :            :                 loopfilter |= (0x1 << DPIO_CHV_GAIN_CTRL_SHIFT);
    8376                 :            :                 tribuf_calcntr = 0x9;
    8377                 :            :         } else if (vco <= 6200000) {
    8378                 :            :                 loopfilter |= (0x5 << DPIO_CHV_PROP_COEFF_SHIFT);
    8379                 :            :                 loopfilter |= (0xB << DPIO_CHV_INT_COEFF_SHIFT);
    8380                 :            :                 loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
    8381                 :            :                 tribuf_calcntr = 0x9;
    8382                 :            :         } else if (vco <= 6480000) {
    8383                 :            :                 loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
    8384                 :            :                 loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
    8385                 :            :                 loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
    8386                 :            :                 tribuf_calcntr = 0x8;
    8387                 :            :         } else {
    8388                 :            :                 /* Not supported. Apply the same limits as in the max case */
    8389                 :            :                 loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
    8390                 :            :                 loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
    8391                 :            :                 loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
    8392                 :            :                 tribuf_calcntr = 0;
    8393                 :            :         }
    8394                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW6(port), loopfilter);
    8395                 :            : 
    8396                 :            :         dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW8(port));
    8397                 :            :         dpio_val &= ~DPIO_CHV_TDC_TARGET_CNT_MASK;
    8398                 :            :         dpio_val |= (tribuf_calcntr << DPIO_CHV_TDC_TARGET_CNT_SHIFT);
    8399                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW8(port), dpio_val);
    8400                 :            : 
    8401                 :            :         /* AFC Recal */
    8402                 :            :         vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port),
    8403                 :            :                         vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)) |
    8404                 :            :                         DPIO_AFC_RECAL);
    8405                 :            : 
    8406                 :            :         vlv_dpio_put(dev_priv);
    8407                 :            : }
    8408                 :            : 
    8409                 :            : /**
    8410                 :            :  * vlv_force_pll_on - forcibly enable just the PLL
    8411                 :            :  * @dev_priv: i915 private structure
    8412                 :            :  * @pipe: pipe PLL to enable
    8413                 :            :  * @dpll: PLL configuration
    8414                 :            :  *
    8415                 :            :  * Enable the PLL for @pipe using the supplied @dpll config. To be used
    8416                 :            :  * in cases where we need the PLL enabled even when @pipe is not going to
    8417                 :            :  * be enabled.
    8418                 :            :  */
    8419                 :          0 : int vlv_force_pll_on(struct drm_i915_private *dev_priv, enum pipe pipe,
    8420                 :            :                      const struct dpll *dpll)
    8421                 :            : {
    8422                 :          0 :         struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
    8423                 :          0 :         struct intel_crtc_state *pipe_config;
    8424                 :            : 
    8425                 :          0 :         pipe_config = intel_crtc_state_alloc(crtc);
    8426         [ #  # ]:          0 :         if (!pipe_config)
    8427                 :            :                 return -ENOMEM;
    8428                 :            : 
    8429                 :          0 :         pipe_config->cpu_transcoder = (enum transcoder)pipe;
    8430                 :          0 :         pipe_config->pixel_multiplier = 1;
    8431                 :          0 :         pipe_config->dpll = *dpll;
    8432                 :            : 
    8433         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv)) {
    8434         [ #  # ]:          0 :                 chv_compute_dpll(crtc, pipe_config);
    8435                 :          0 :                 chv_prepare_pll(crtc, pipe_config);
    8436                 :          0 :                 chv_enable_pll(crtc, pipe_config);
    8437                 :            :         } else {
    8438         [ #  # ]:          0 :                 vlv_compute_dpll(crtc, pipe_config);
    8439                 :          0 :                 vlv_prepare_pll(crtc, pipe_config);
    8440                 :          0 :                 vlv_enable_pll(crtc, pipe_config);
    8441                 :            :         }
    8442                 :            : 
    8443                 :          0 :         kfree(pipe_config);
    8444                 :            : 
    8445                 :          0 :         return 0;
    8446                 :            : }
    8447                 :            : 
    8448                 :            : /**
    8449                 :            :  * vlv_force_pll_off - forcibly disable just the PLL
    8450                 :            :  * @dev_priv: i915 private structure
    8451                 :            :  * @pipe: pipe PLL to disable
    8452                 :            :  *
    8453                 :            :  * Disable the PLL for @pipe. To be used in cases where we need
    8454                 :            :  * the PLL enabled even when @pipe is not going to be enabled.
    8455                 :            :  */
    8456                 :          0 : void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe)
    8457                 :            : {
    8458         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv))
    8459                 :          0 :                 chv_disable_pll(dev_priv, pipe);
    8460                 :            :         else
    8461                 :          0 :                 vlv_disable_pll(dev_priv, pipe);
    8462                 :          0 : }
    8463                 :            : 
    8464                 :            : static void i9xx_compute_dpll(struct intel_crtc *crtc,
    8465                 :            :                               struct intel_crtc_state *crtc_state,
    8466                 :            :                               struct dpll *reduced_clock)
    8467                 :            : {
    8468                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8469                 :            :         u32 dpll;
    8470                 :            :         struct dpll *clock = &crtc_state->dpll;
    8471                 :            : 
    8472                 :            :         i9xx_update_pll_dividers(crtc, crtc_state, reduced_clock);
    8473                 :            : 
    8474                 :            :         dpll = DPLL_VGA_MODE_DIS;
    8475                 :            : 
    8476                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
    8477                 :            :                 dpll |= DPLLB_MODE_LVDS;
    8478                 :            :         else
    8479                 :            :                 dpll |= DPLLB_MODE_DAC_SERIAL;
    8480                 :            : 
    8481                 :            :         if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
    8482                 :            :             IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
    8483                 :            :                 dpll |= (crtc_state->pixel_multiplier - 1)
    8484                 :            :                         << SDVO_MULTIPLIER_SHIFT_HIRES;
    8485                 :            :         }
    8486                 :            : 
    8487                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO) ||
    8488                 :            :             intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
    8489                 :            :                 dpll |= DPLL_SDVO_HIGH_SPEED;
    8490                 :            : 
    8491                 :            :         if (intel_crtc_has_dp_encoder(crtc_state))
    8492                 :            :                 dpll |= DPLL_SDVO_HIGH_SPEED;
    8493                 :            : 
    8494                 :            :         /* compute bitmask from p1 value */
    8495                 :            :         if (IS_PINEVIEW(dev_priv))
    8496                 :            :                 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW;
    8497                 :            :         else {
    8498                 :            :                 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
    8499                 :            :                 if (IS_G4X(dev_priv) && reduced_clock)
    8500                 :            :                         dpll |= (1 << (reduced_clock->p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
    8501                 :            :         }
    8502                 :            :         switch (clock->p2) {
    8503                 :            :         case 5:
    8504                 :            :                 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
    8505                 :            :                 break;
    8506                 :            :         case 7:
    8507                 :            :                 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
    8508                 :            :                 break;
    8509                 :            :         case 10:
    8510                 :            :                 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
    8511                 :            :                 break;
    8512                 :            :         case 14:
    8513                 :            :                 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
    8514                 :            :                 break;
    8515                 :            :         }
    8516                 :            :         if (INTEL_GEN(dev_priv) >= 4)
    8517                 :            :                 dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT);
    8518                 :            : 
    8519                 :            :         if (crtc_state->sdvo_tv_clock)
    8520                 :            :                 dpll |= PLL_REF_INPUT_TVCLKINBC;
    8521                 :            :         else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
    8522                 :            :                  intel_panel_use_ssc(dev_priv))
    8523                 :            :                 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
    8524                 :            :         else
    8525                 :            :                 dpll |= PLL_REF_INPUT_DREFCLK;
    8526                 :            : 
    8527                 :            :         dpll |= DPLL_VCO_ENABLE;
    8528                 :            :         crtc_state->dpll_hw_state.dpll = dpll;
    8529                 :            : 
    8530                 :            :         if (INTEL_GEN(dev_priv) >= 4) {
    8531                 :            :                 u32 dpll_md = (crtc_state->pixel_multiplier - 1)
    8532                 :            :                         << DPLL_MD_UDI_MULTIPLIER_SHIFT;
    8533                 :            :                 crtc_state->dpll_hw_state.dpll_md = dpll_md;
    8534                 :            :         }
    8535                 :            : }
    8536                 :            : 
    8537                 :            : static void i8xx_compute_dpll(struct intel_crtc *crtc,
    8538                 :            :                               struct intel_crtc_state *crtc_state,
    8539                 :            :                               struct dpll *reduced_clock)
    8540                 :            : {
    8541                 :            :         struct drm_device *dev = crtc->base.dev;
    8542                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    8543                 :            :         u32 dpll;
    8544                 :            :         struct dpll *clock = &crtc_state->dpll;
    8545                 :            : 
    8546                 :            :         i9xx_update_pll_dividers(crtc, crtc_state, reduced_clock);
    8547                 :            : 
    8548                 :            :         dpll = DPLL_VGA_MODE_DIS;
    8549                 :            : 
    8550                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    8551                 :            :                 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
    8552                 :            :         } else {
    8553                 :            :                 if (clock->p1 == 2)
    8554                 :            :                         dpll |= PLL_P1_DIVIDE_BY_TWO;
    8555                 :            :                 else
    8556                 :            :                         dpll |= (clock->p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT;
    8557                 :            :                 if (clock->p2 == 4)
    8558                 :            :                         dpll |= PLL_P2_DIVIDE_BY_4;
    8559                 :            :         }
    8560                 :            : 
    8561                 :            :         /*
    8562                 :            :          * Bspec:
    8563                 :            :          * "[Almador Errata}: For the correct operation of the muxed DVO pins
    8564                 :            :          *  (GDEVSELB/I2Cdata, GIRDBY/I2CClk) and (GFRAMEB/DVI_Data,
    8565                 :            :          *  GTRDYB/DVI_Clk): Bit 31 (DPLL VCO Enable) and Bit 30 (2X Clock
    8566                 :            :          *  Enable) must be set to “1” in both the DPLL A Control Register
    8567                 :            :          *  (06014h-06017h) and DPLL B Control Register (06018h-0601Bh)."
    8568                 :            :          *
    8569                 :            :          * For simplicity We simply keep both bits always enabled in
    8570                 :            :          * both DPLLS. The spec says we should disable the DVO 2X clock
    8571                 :            :          * when not needed, but this seems to work fine in practice.
    8572                 :            :          */
    8573                 :            :         if (IS_I830(dev_priv) ||
    8574                 :            :             intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO))
    8575                 :            :                 dpll |= DPLL_DVO_2X_MODE;
    8576                 :            : 
    8577                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
    8578                 :            :             intel_panel_use_ssc(dev_priv))
    8579                 :            :                 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
    8580                 :            :         else
    8581                 :            :                 dpll |= PLL_REF_INPUT_DREFCLK;
    8582                 :            : 
    8583                 :            :         dpll |= DPLL_VCO_ENABLE;
    8584                 :            :         crtc_state->dpll_hw_state.dpll = dpll;
    8585                 :            : }
    8586                 :            : 
    8587                 :          0 : static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state)
    8588                 :            : {
    8589                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    8590         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8591                 :          0 :         enum pipe pipe = crtc->pipe;
    8592                 :          0 :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    8593                 :          0 :         const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
    8594                 :          0 :         u32 crtc_vtotal, crtc_vblank_end;
    8595                 :          0 :         int vsyncshift = 0;
    8596                 :            : 
    8597                 :            :         /* We need to be careful not to changed the adjusted mode, for otherwise
    8598                 :            :          * the hw state checker will get angry at the mismatch. */
    8599                 :          0 :         crtc_vtotal = adjusted_mode->crtc_vtotal;
    8600                 :          0 :         crtc_vblank_end = adjusted_mode->crtc_vblank_end;
    8601                 :            : 
    8602         [ #  # ]:          0 :         if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
    8603                 :            :                 /* the chip adds 2 halflines automatically */
    8604                 :          0 :                 crtc_vtotal -= 1;
    8605                 :          0 :                 crtc_vblank_end -= 1;
    8606                 :            : 
    8607         [ #  # ]:          0 :                 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
    8608                 :          0 :                         vsyncshift = (adjusted_mode->crtc_htotal - 1) / 2;
    8609                 :            :                 else
    8610                 :          0 :                         vsyncshift = adjusted_mode->crtc_hsync_start -
    8611                 :          0 :                                 adjusted_mode->crtc_htotal / 2;
    8612         [ #  # ]:          0 :                 if (vsyncshift < 0)
    8613                 :          0 :                         vsyncshift += adjusted_mode->crtc_htotal;
    8614                 :            :         }
    8615                 :            : 
    8616         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) > 3)
    8617                 :          0 :                 I915_WRITE(VSYNCSHIFT(cpu_transcoder), vsyncshift);
    8618                 :            : 
    8619                 :          0 :         I915_WRITE(HTOTAL(cpu_transcoder),
    8620                 :            :                    (adjusted_mode->crtc_hdisplay - 1) |
    8621                 :            :                    ((adjusted_mode->crtc_htotal - 1) << 16));
    8622                 :          0 :         I915_WRITE(HBLANK(cpu_transcoder),
    8623                 :            :                    (adjusted_mode->crtc_hblank_start - 1) |
    8624                 :            :                    ((adjusted_mode->crtc_hblank_end - 1) << 16));
    8625                 :          0 :         I915_WRITE(HSYNC(cpu_transcoder),
    8626                 :            :                    (adjusted_mode->crtc_hsync_start - 1) |
    8627                 :            :                    ((adjusted_mode->crtc_hsync_end - 1) << 16));
    8628                 :            : 
    8629                 :          0 :         I915_WRITE(VTOTAL(cpu_transcoder),
    8630                 :            :                    (adjusted_mode->crtc_vdisplay - 1) |
    8631                 :            :                    ((crtc_vtotal - 1) << 16));
    8632                 :          0 :         I915_WRITE(VBLANK(cpu_transcoder),
    8633                 :            :                    (adjusted_mode->crtc_vblank_start - 1) |
    8634                 :            :                    ((crtc_vblank_end - 1) << 16));
    8635                 :          0 :         I915_WRITE(VSYNC(cpu_transcoder),
    8636                 :            :                    (adjusted_mode->crtc_vsync_start - 1) |
    8637                 :            :                    ((adjusted_mode->crtc_vsync_end - 1) << 16));
    8638                 :            : 
    8639                 :            :         /* Workaround: when the EDP input selection is B, the VTOTAL_B must be
    8640                 :            :          * programmed with the VTOTAL_EDP value. Same for VTOTAL_C. This is
    8641                 :            :          * documented on the DDI_FUNC_CTL register description, EDP Input Select
    8642                 :            :          * bits. */
    8643   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) && cpu_transcoder == TRANSCODER_EDP &&
    8644         [ #  # ]:          0 :             (pipe == PIPE_B || pipe == PIPE_C))
    8645                 :          0 :                 I915_WRITE(VTOTAL(pipe), I915_READ(VTOTAL(cpu_transcoder)));
    8646                 :            : 
    8647                 :          0 : }
    8648                 :            : 
    8649                 :          0 : static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state)
    8650                 :            : {
    8651                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    8652                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8653                 :          0 :         enum pipe pipe = crtc->pipe;
    8654                 :            : 
    8655                 :            :         /* pipesrc controls the size that is scaled from, which should
    8656                 :            :          * always be the user's requested size.
    8657                 :            :          */
    8658                 :          0 :         I915_WRITE(PIPESRC(pipe),
    8659                 :            :                    ((crtc_state->pipe_src_w - 1) << 16) |
    8660                 :            :                    (crtc_state->pipe_src_h - 1));
    8661                 :          0 : }
    8662                 :            : 
    8663                 :            : static bool intel_pipe_is_interlaced(const struct intel_crtc_state *crtc_state)
    8664                 :            : {
    8665                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    8666                 :            :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    8667                 :            : 
    8668                 :            :         if (IS_GEN(dev_priv, 2))
    8669                 :            :                 return false;
    8670                 :            : 
    8671                 :            :         if (INTEL_GEN(dev_priv) >= 9 ||
    8672                 :            :             IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
    8673                 :            :                 return I915_READ(PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK_HSW;
    8674                 :            :         else
    8675                 :            :                 return I915_READ(PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK;
    8676                 :            : }
    8677                 :            : 
    8678                 :            : static void intel_get_pipe_timings(struct intel_crtc *crtc,
    8679                 :            :                                    struct intel_crtc_state *pipe_config)
    8680                 :            : {
    8681                 :            :         struct drm_device *dev = crtc->base.dev;
    8682                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    8683                 :            :         enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
    8684                 :            :         u32 tmp;
    8685                 :            : 
    8686                 :            :         tmp = I915_READ(HTOTAL(cpu_transcoder));
    8687                 :            :         pipe_config->hw.adjusted_mode.crtc_hdisplay = (tmp & 0xffff) + 1;
    8688                 :            :         pipe_config->hw.adjusted_mode.crtc_htotal = ((tmp >> 16) & 0xffff) + 1;
    8689                 :            : 
    8690                 :            :         if (!transcoder_is_dsi(cpu_transcoder)) {
    8691                 :            :                 tmp = I915_READ(HBLANK(cpu_transcoder));
    8692                 :            :                 pipe_config->hw.adjusted_mode.crtc_hblank_start =
    8693                 :            :                                                         (tmp & 0xffff) + 1;
    8694                 :            :                 pipe_config->hw.adjusted_mode.crtc_hblank_end =
    8695                 :            :                                                 ((tmp >> 16) & 0xffff) + 1;
    8696                 :            :         }
    8697                 :            :         tmp = I915_READ(HSYNC(cpu_transcoder));
    8698                 :            :         pipe_config->hw.adjusted_mode.crtc_hsync_start = (tmp & 0xffff) + 1;
    8699                 :            :         pipe_config->hw.adjusted_mode.crtc_hsync_end = ((tmp >> 16) & 0xffff) + 1;
    8700                 :            : 
    8701                 :            :         tmp = I915_READ(VTOTAL(cpu_transcoder));
    8702                 :            :         pipe_config->hw.adjusted_mode.crtc_vdisplay = (tmp & 0xffff) + 1;
    8703                 :            :         pipe_config->hw.adjusted_mode.crtc_vtotal = ((tmp >> 16) & 0xffff) + 1;
    8704                 :            : 
    8705                 :            :         if (!transcoder_is_dsi(cpu_transcoder)) {
    8706                 :            :                 tmp = I915_READ(VBLANK(cpu_transcoder));
    8707                 :            :                 pipe_config->hw.adjusted_mode.crtc_vblank_start =
    8708                 :            :                                                         (tmp & 0xffff) + 1;
    8709                 :            :                 pipe_config->hw.adjusted_mode.crtc_vblank_end =
    8710                 :            :                                                 ((tmp >> 16) & 0xffff) + 1;
    8711                 :            :         }
    8712                 :            :         tmp = I915_READ(VSYNC(cpu_transcoder));
    8713                 :            :         pipe_config->hw.adjusted_mode.crtc_vsync_start = (tmp & 0xffff) + 1;
    8714                 :            :         pipe_config->hw.adjusted_mode.crtc_vsync_end = ((tmp >> 16) & 0xffff) + 1;
    8715                 :            : 
    8716                 :            :         if (intel_pipe_is_interlaced(pipe_config)) {
    8717                 :            :                 pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_INTERLACE;
    8718                 :            :                 pipe_config->hw.adjusted_mode.crtc_vtotal += 1;
    8719                 :            :                 pipe_config->hw.adjusted_mode.crtc_vblank_end += 1;
    8720                 :            :         }
    8721                 :            : }
    8722                 :            : 
    8723                 :            : static void intel_get_pipe_src_size(struct intel_crtc *crtc,
    8724                 :            :                                     struct intel_crtc_state *pipe_config)
    8725                 :            : {
    8726                 :            :         struct drm_device *dev = crtc->base.dev;
    8727                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    8728                 :            :         u32 tmp;
    8729                 :            : 
    8730                 :            :         tmp = I915_READ(PIPESRC(crtc->pipe));
    8731                 :            :         pipe_config->pipe_src_h = (tmp & 0xffff) + 1;
    8732                 :            :         pipe_config->pipe_src_w = ((tmp >> 16) & 0xffff) + 1;
    8733                 :            : 
    8734                 :            :         pipe_config->hw.mode.vdisplay = pipe_config->pipe_src_h;
    8735                 :            :         pipe_config->hw.mode.hdisplay = pipe_config->pipe_src_w;
    8736                 :            : }
    8737                 :            : 
    8738                 :          0 : void intel_mode_from_pipe_config(struct drm_display_mode *mode,
    8739                 :            :                                  struct intel_crtc_state *pipe_config)
    8740                 :            : {
    8741                 :          0 :         mode->hdisplay = pipe_config->hw.adjusted_mode.crtc_hdisplay;
    8742                 :          0 :         mode->htotal = pipe_config->hw.adjusted_mode.crtc_htotal;
    8743                 :          0 :         mode->hsync_start = pipe_config->hw.adjusted_mode.crtc_hsync_start;
    8744                 :          0 :         mode->hsync_end = pipe_config->hw.adjusted_mode.crtc_hsync_end;
    8745                 :            : 
    8746                 :          0 :         mode->vdisplay = pipe_config->hw.adjusted_mode.crtc_vdisplay;
    8747                 :          0 :         mode->vtotal = pipe_config->hw.adjusted_mode.crtc_vtotal;
    8748                 :          0 :         mode->vsync_start = pipe_config->hw.adjusted_mode.crtc_vsync_start;
    8749                 :          0 :         mode->vsync_end = pipe_config->hw.adjusted_mode.crtc_vsync_end;
    8750                 :            : 
    8751                 :          0 :         mode->flags = pipe_config->hw.adjusted_mode.flags;
    8752                 :          0 :         mode->type = DRM_MODE_TYPE_DRIVER;
    8753                 :            : 
    8754                 :          0 :         mode->clock = pipe_config->hw.adjusted_mode.crtc_clock;
    8755                 :            : 
    8756                 :          0 :         mode->hsync = drm_mode_hsync(mode);
    8757                 :          0 :         mode->vrefresh = drm_mode_vrefresh(mode);
    8758                 :          0 :         drm_mode_set_name(mode);
    8759                 :          0 : }
    8760                 :            : 
    8761                 :          0 : static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)
    8762                 :            : {
    8763                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    8764         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8765                 :          0 :         u32 pipeconf;
    8766                 :            : 
    8767                 :          0 :         pipeconf = 0;
    8768                 :            : 
    8769                 :            :         /* we keep both pipes enabled on 830 */
    8770         [ #  # ]:          0 :         if (IS_I830(dev_priv))
    8771                 :          0 :                 pipeconf |= I915_READ(PIPECONF(crtc->pipe)) & PIPECONF_ENABLE;
    8772                 :            : 
    8773         [ #  # ]:          0 :         if (crtc_state->double_wide)
    8774                 :          0 :                 pipeconf |= PIPECONF_DOUBLE_WIDE;
    8775                 :            : 
    8776                 :            :         /* only g4x and later have fancy bpc/dither controls */
    8777   [ #  #  #  #  :          0 :         if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
             #  #  #  # ]
    8778                 :            :             IS_CHERRYVIEW(dev_priv)) {
    8779                 :            :                 /* Bspec claims that we can't use dithering for 30bpp pipes. */
    8780   [ #  #  #  # ]:          0 :                 if (crtc_state->dither && crtc_state->pipe_bpp != 30)
    8781                 :          0 :                         pipeconf |= PIPECONF_DITHER_EN |
    8782                 :            :                                     PIPECONF_DITHER_TYPE_SP;
    8783                 :            : 
    8784   [ #  #  #  # ]:          0 :                 switch (crtc_state->pipe_bpp) {
    8785                 :          0 :                 case 18:
    8786                 :          0 :                         pipeconf |= PIPECONF_6BPC;
    8787                 :          0 :                         break;
    8788                 :            :                 case 24:
    8789                 :            :                         pipeconf |= PIPECONF_8BPC;
    8790                 :            :                         break;
    8791                 :          0 :                 case 30:
    8792                 :          0 :                         pipeconf |= PIPECONF_10BPC;
    8793                 :          0 :                         break;
    8794                 :          0 :                 default:
    8795                 :            :                         /* Case prevented by intel_choose_pipe_bpp_dither. */
    8796                 :          0 :                         BUG();
    8797                 :            :                 }
    8798                 :          0 :         }
    8799                 :            : 
    8800         [ #  # ]:          0 :         if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
    8801   [ #  #  #  # ]:          0 :                 if (INTEL_GEN(dev_priv) < 4 ||
    8802         [ #  # ]:          0 :                     intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
    8803                 :          0 :                         pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
    8804                 :            :                 else
    8805                 :          0 :                         pipeconf |= PIPECONF_INTERLACE_W_SYNC_SHIFT;
    8806                 :            :         } else {
    8807                 :            :                 pipeconf |= PIPECONF_PROGRESSIVE;
    8808                 :            :         }
    8809                 :            : 
    8810   [ #  #  #  # ]:          0 :         if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
    8811         [ #  # ]:          0 :              crtc_state->limited_color_range)
    8812                 :          0 :                 pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
    8813                 :            : 
    8814                 :          0 :         pipeconf |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
    8815                 :            : 
    8816                 :          0 :         pipeconf |= PIPECONF_FRAME_START_DELAY(0);
    8817                 :            : 
    8818                 :          0 :         I915_WRITE(PIPECONF(crtc->pipe), pipeconf);
    8819                 :          0 :         POSTING_READ(PIPECONF(crtc->pipe));
    8820                 :          0 : }
    8821                 :            : 
    8822                 :          0 : static int i8xx_crtc_compute_clock(struct intel_crtc *crtc,
    8823                 :            :                                    struct intel_crtc_state *crtc_state)
    8824                 :            : {
    8825                 :          0 :         struct drm_device *dev = crtc->base.dev;
    8826         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    8827                 :          0 :         const struct intel_limit *limit;
    8828                 :          0 :         int refclk = 48000;
    8829                 :            : 
    8830                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8831                 :            :                sizeof(crtc_state->dpll_hw_state));
    8832                 :            : 
    8833         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    8834   [ #  #  #  # ]:          0 :                 if (intel_panel_use_ssc(dev_priv)) {
    8835                 :          0 :                         refclk = dev_priv->vbt.lvds_ssc_freq;
    8836                 :          0 :                         DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
    8837                 :            :                 }
    8838                 :            : 
    8839                 :            :                 limit = &intel_limits_i8xx_lvds;
    8840         [ #  # ]:          0 :         } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO)) {
    8841                 :            :                 limit = &intel_limits_i8xx_dvo;
    8842                 :            :         } else {
    8843                 :          0 :                 limit = &intel_limits_i8xx_dac;
    8844                 :            :         }
    8845                 :            : 
    8846   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8847                 :          0 :             !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    8848                 :            :                                  refclk, NULL, &crtc_state->dpll)) {
    8849                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    8850                 :          0 :                 return -EINVAL;
    8851                 :            :         }
    8852                 :            : 
    8853                 :          0 :         i8xx_compute_dpll(crtc, crtc_state, NULL);
    8854                 :            : 
    8855                 :          0 :         return 0;
    8856                 :            : }
    8857                 :            : 
    8858                 :          0 : static int g4x_crtc_compute_clock(struct intel_crtc *crtc,
    8859                 :            :                                   struct intel_crtc_state *crtc_state)
    8860                 :            : {
    8861         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    8862                 :          0 :         const struct intel_limit *limit;
    8863                 :          0 :         int refclk = 96000;
    8864                 :            : 
    8865                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8866                 :            :                sizeof(crtc_state->dpll_hw_state));
    8867                 :            : 
    8868         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    8869   [ #  #  #  # ]:          0 :                 if (intel_panel_use_ssc(dev_priv)) {
    8870                 :          0 :                         refclk = dev_priv->vbt.lvds_ssc_freq;
    8871                 :          0 :                         DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
    8872                 :            :                 }
    8873                 :            : 
    8874         [ #  # ]:          0 :                 if (intel_is_dual_link_lvds(dev_priv))
    8875                 :            :                         limit = &intel_limits_g4x_dual_channel_lvds;
    8876                 :            :                 else
    8877                 :          0 :                         limit = &intel_limits_g4x_single_channel_lvds;
    8878   [ #  #  #  # ]:          0 :         } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) ||
    8879                 :            :                    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
    8880                 :            :                 limit = &intel_limits_g4x_hdmi;
    8881         [ #  # ]:          0 :         } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO)) {
    8882                 :            :                 limit = &intel_limits_g4x_sdvo;
    8883                 :            :         } else {
    8884                 :            :                 /* The option is for other outputs */
    8885                 :          0 :                 limit = &intel_limits_i9xx_sdvo;
    8886                 :            :         }
    8887                 :            : 
    8888   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8889                 :          0 :             !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    8890                 :            :                                 refclk, NULL, &crtc_state->dpll)) {
    8891                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    8892                 :          0 :                 return -EINVAL;
    8893                 :            :         }
    8894                 :            : 
    8895                 :          0 :         i9xx_compute_dpll(crtc, crtc_state, NULL);
    8896                 :            : 
    8897                 :          0 :         return 0;
    8898                 :            : }
    8899                 :            : 
    8900                 :          0 : static int pnv_crtc_compute_clock(struct intel_crtc *crtc,
    8901                 :            :                                   struct intel_crtc_state *crtc_state)
    8902                 :            : {
    8903                 :          0 :         struct drm_device *dev = crtc->base.dev;
    8904         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    8905                 :          0 :         const struct intel_limit *limit;
    8906                 :          0 :         int refclk = 96000;
    8907                 :            : 
    8908                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8909                 :            :                sizeof(crtc_state->dpll_hw_state));
    8910                 :            : 
    8911         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    8912   [ #  #  #  # ]:          0 :                 if (intel_panel_use_ssc(dev_priv)) {
    8913                 :          0 :                         refclk = dev_priv->vbt.lvds_ssc_freq;
    8914                 :          0 :                         DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
    8915                 :            :                 }
    8916                 :            : 
    8917                 :            :                 limit = &pnv_limits_lvds;
    8918                 :            :         } else {
    8919                 :            :                 limit = &pnv_limits_sdvo;
    8920                 :            :         }
    8921                 :            : 
    8922   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8923                 :          0 :             !pnv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    8924                 :            :                                 refclk, NULL, &crtc_state->dpll)) {
    8925                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    8926                 :          0 :                 return -EINVAL;
    8927                 :            :         }
    8928                 :            : 
    8929                 :          0 :         i9xx_compute_dpll(crtc, crtc_state, NULL);
    8930                 :            : 
    8931                 :          0 :         return 0;
    8932                 :            : }
    8933                 :            : 
    8934                 :          0 : static int i9xx_crtc_compute_clock(struct intel_crtc *crtc,
    8935                 :            :                                    struct intel_crtc_state *crtc_state)
    8936                 :            : {
    8937                 :          0 :         struct drm_device *dev = crtc->base.dev;
    8938         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    8939                 :          0 :         const struct intel_limit *limit;
    8940                 :          0 :         int refclk = 96000;
    8941                 :            : 
    8942                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8943                 :            :                sizeof(crtc_state->dpll_hw_state));
    8944                 :            : 
    8945         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    8946   [ #  #  #  # ]:          0 :                 if (intel_panel_use_ssc(dev_priv)) {
    8947                 :          0 :                         refclk = dev_priv->vbt.lvds_ssc_freq;
    8948                 :          0 :                         DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
    8949                 :            :                 }
    8950                 :            : 
    8951                 :            :                 limit = &intel_limits_i9xx_lvds;
    8952                 :            :         } else {
    8953                 :            :                 limit = &intel_limits_i9xx_sdvo;
    8954                 :            :         }
    8955                 :            : 
    8956   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8957                 :          0 :             !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    8958                 :            :                                  refclk, NULL, &crtc_state->dpll)) {
    8959                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    8960                 :          0 :                 return -EINVAL;
    8961                 :            :         }
    8962                 :            : 
    8963                 :          0 :         i9xx_compute_dpll(crtc, crtc_state, NULL);
    8964                 :            : 
    8965                 :          0 :         return 0;
    8966                 :            : }
    8967                 :            : 
    8968                 :          0 : static int chv_crtc_compute_clock(struct intel_crtc *crtc,
    8969                 :            :                                   struct intel_crtc_state *crtc_state)
    8970                 :            : {
    8971                 :          0 :         int refclk = 100000;
    8972                 :          0 :         const struct intel_limit *limit = &intel_limits_chv;
    8973                 :            : 
    8974                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8975                 :            :                sizeof(crtc_state->dpll_hw_state));
    8976                 :            : 
    8977   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8978                 :          0 :             !chv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    8979                 :            :                                 refclk, NULL, &crtc_state->dpll)) {
    8980                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    8981                 :          0 :                 return -EINVAL;
    8982                 :            :         }
    8983                 :            : 
    8984         [ #  # ]:          0 :         chv_compute_dpll(crtc, crtc_state);
    8985                 :            : 
    8986                 :          0 :         return 0;
    8987                 :            : }
    8988                 :            : 
    8989                 :          0 : static int vlv_crtc_compute_clock(struct intel_crtc *crtc,
    8990                 :            :                                   struct intel_crtc_state *crtc_state)
    8991                 :            : {
    8992                 :          0 :         int refclk = 100000;
    8993                 :          0 :         const struct intel_limit *limit = &intel_limits_vlv;
    8994                 :            : 
    8995                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
    8996                 :            :                sizeof(crtc_state->dpll_hw_state));
    8997                 :            : 
    8998   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
    8999                 :          0 :             !vlv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
    9000                 :            :                                 refclk, NULL, &crtc_state->dpll)) {
    9001                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
    9002                 :          0 :                 return -EINVAL;
    9003                 :            :         }
    9004                 :            : 
    9005         [ #  # ]:          0 :         vlv_compute_dpll(crtc, crtc_state);
    9006                 :            : 
    9007                 :          0 :         return 0;
    9008                 :            : }
    9009                 :            : 
    9010                 :            : static bool i9xx_has_pfit(struct drm_i915_private *dev_priv)
    9011                 :            : {
    9012                 :            :         if (IS_I830(dev_priv))
    9013                 :            :                 return false;
    9014                 :            : 
    9015                 :            :         return INTEL_GEN(dev_priv) >= 4 ||
    9016                 :            :                 IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
    9017                 :            : }
    9018                 :            : 
    9019                 :            : static void i9xx_get_pfit_config(struct intel_crtc *crtc,
    9020                 :            :                                  struct intel_crtc_state *pipe_config)
    9021                 :            : {
    9022                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9023                 :            :         u32 tmp;
    9024                 :            : 
    9025                 :            :         if (!i9xx_has_pfit(dev_priv))
    9026                 :            :                 return;
    9027                 :            : 
    9028                 :            :         tmp = I915_READ(PFIT_CONTROL);
    9029                 :            :         if (!(tmp & PFIT_ENABLE))
    9030                 :            :                 return;
    9031                 :            : 
    9032                 :            :         /* Check whether the pfit is attached to our pipe. */
    9033                 :            :         if (INTEL_GEN(dev_priv) < 4) {
    9034                 :            :                 if (crtc->pipe != PIPE_B)
    9035                 :            :                         return;
    9036                 :            :         } else {
    9037                 :            :                 if ((tmp & PFIT_PIPE_MASK) != (crtc->pipe << PFIT_PIPE_SHIFT))
    9038                 :            :                         return;
    9039                 :            :         }
    9040                 :            : 
    9041                 :            :         pipe_config->gmch_pfit.control = tmp;
    9042                 :            :         pipe_config->gmch_pfit.pgm_ratios = I915_READ(PFIT_PGM_RATIOS);
    9043                 :            : }
    9044                 :            : 
    9045                 :            : static void vlv_crtc_clock_get(struct intel_crtc *crtc,
    9046                 :            :                                struct intel_crtc_state *pipe_config)
    9047                 :            : {
    9048                 :            :         struct drm_device *dev = crtc->base.dev;
    9049                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    9050                 :            :         enum pipe pipe = crtc->pipe;
    9051                 :            :         struct dpll clock;
    9052                 :            :         u32 mdiv;
    9053                 :            :         int refclk = 100000;
    9054                 :            : 
    9055                 :            :         /* In case of DSI, DPLL will not be used */
    9056                 :            :         if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
    9057                 :            :                 return;
    9058                 :            : 
    9059                 :            :         vlv_dpio_get(dev_priv);
    9060                 :            :         mdiv = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW3(pipe));
    9061                 :            :         vlv_dpio_put(dev_priv);
    9062                 :            : 
    9063                 :            :         clock.m1 = (mdiv >> DPIO_M1DIV_SHIFT) & 7;
    9064                 :            :         clock.m2 = mdiv & DPIO_M2DIV_MASK;
    9065                 :            :         clock.n = (mdiv >> DPIO_N_SHIFT) & 0xf;
    9066                 :            :         clock.p1 = (mdiv >> DPIO_P1_SHIFT) & 7;
    9067                 :            :         clock.p2 = (mdiv >> DPIO_P2_SHIFT) & 0x1f;
    9068                 :            : 
    9069                 :            :         pipe_config->port_clock = vlv_calc_dpll_params(refclk, &clock);
    9070                 :            : }
    9071                 :            : 
    9072                 :            : static void
    9073                 :          0 : i9xx_get_initial_plane_config(struct intel_crtc *crtc,
    9074                 :            :                               struct intel_initial_plane_config *plane_config)
    9075                 :            : {
    9076                 :          0 :         struct drm_device *dev = crtc->base.dev;
    9077                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
    9078                 :          0 :         struct intel_plane *plane = to_intel_plane(crtc->base.primary);
    9079                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    9080                 :          0 :         enum pipe pipe;
    9081                 :          0 :         u32 val, base, offset;
    9082                 :          0 :         int fourcc, pixel_format;
    9083                 :          0 :         unsigned int aligned_height;
    9084                 :          0 :         struct drm_framebuffer *fb;
    9085                 :          0 :         struct intel_framebuffer *intel_fb;
    9086                 :            : 
    9087         [ #  # ]:          0 :         if (!plane->get_hw_state(plane, &pipe))
    9088                 :          0 :                 return;
    9089                 :            : 
    9090         [ #  # ]:          0 :         WARN_ON(pipe != crtc->pipe);
    9091                 :            : 
    9092                 :          0 :         intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
    9093         [ #  # ]:          0 :         if (!intel_fb) {
    9094                 :          0 :                 DRM_DEBUG_KMS("failed to alloc fb\n");
    9095                 :          0 :                 return;
    9096                 :            :         }
    9097                 :            : 
    9098                 :          0 :         fb = &intel_fb->base;
    9099                 :            : 
    9100                 :          0 :         fb->dev = dev;
    9101                 :            : 
    9102                 :          0 :         val = I915_READ(DSPCNTR(i9xx_plane));
    9103                 :            : 
    9104         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4) {
    9105         [ #  # ]:          0 :                 if (val & DISPPLANE_TILED) {
    9106                 :          0 :                         plane_config->tiling = I915_TILING_X;
    9107                 :          0 :                         fb->modifier = I915_FORMAT_MOD_X_TILED;
    9108                 :            :                 }
    9109                 :            : 
    9110         [ #  # ]:          0 :                 if (val & DISPPLANE_ROTATE_180)
    9111                 :          0 :                         plane_config->rotation = DRM_MODE_ROTATE_180;
    9112                 :            :         }
    9113                 :            : 
    9114   [ #  #  #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B &&
    9115         [ #  # ]:          0 :             val & DISPPLANE_MIRROR)
    9116                 :          0 :                 plane_config->rotation |= DRM_MODE_REFLECT_X;
    9117                 :            : 
    9118                 :          0 :         pixel_format = val & DISPPLANE_PIXFORMAT_MASK;
    9119                 :          0 :         fourcc = i9xx_format_to_fourcc(pixel_format);
    9120                 :          0 :         fb->format = drm_format_info(fourcc);
    9121                 :            : 
    9122   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
    9123                 :          0 :                 offset = I915_READ(DSPOFFSET(i9xx_plane));
    9124                 :          0 :                 base = I915_READ(DSPSURF(i9xx_plane)) & 0xfffff000;
    9125         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 4) {
    9126         [ #  # ]:          0 :                 if (plane_config->tiling)
    9127                 :          0 :                         offset = I915_READ(DSPTILEOFF(i9xx_plane));
    9128                 :            :                 else
    9129                 :          0 :                         offset = I915_READ(DSPLINOFF(i9xx_plane));
    9130                 :          0 :                 base = I915_READ(DSPSURF(i9xx_plane)) & 0xfffff000;
    9131                 :            :         } else {
    9132                 :          0 :                 base = I915_READ(DSPADDR(i9xx_plane));
    9133                 :            :         }
    9134                 :          0 :         plane_config->base = base;
    9135                 :            : 
    9136                 :          0 :         val = I915_READ(PIPESRC(pipe));
    9137                 :          0 :         fb->width = ((val >> 16) & 0xfff) + 1;
    9138                 :          0 :         fb->height = ((val >> 0) & 0xfff) + 1;
    9139                 :            : 
    9140                 :          0 :         val = I915_READ(DSPSTRIDE(i9xx_plane));
    9141                 :          0 :         fb->pitches[0] = val & 0xffffffc0;
    9142                 :            : 
    9143                 :          0 :         aligned_height = intel_fb_align_height(fb, 0, fb->height);
    9144                 :            : 
    9145                 :          0 :         plane_config->size = fb->pitches[0] * aligned_height;
    9146                 :            : 
    9147                 :          0 :         DRM_DEBUG_KMS("%s/%s with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
    9148                 :            :                       crtc->base.name, plane->base.name, fb->width, fb->height,
    9149                 :            :                       fb->format->cpp[0] * 8, base, fb->pitches[0],
    9150                 :            :                       plane_config->size);
    9151                 :            : 
    9152                 :          0 :         plane_config->fb = intel_fb;
    9153                 :            : }
    9154                 :            : 
    9155                 :            : static void chv_crtc_clock_get(struct intel_crtc *crtc,
    9156                 :            :                                struct intel_crtc_state *pipe_config)
    9157                 :            : {
    9158                 :            :         struct drm_device *dev = crtc->base.dev;
    9159                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
    9160                 :            :         enum pipe pipe = crtc->pipe;
    9161                 :            :         enum dpio_channel port = vlv_pipe_to_channel(pipe);
    9162                 :            :         struct dpll clock;
    9163                 :            :         u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2, pll_dw3;
    9164                 :            :         int refclk = 100000;
    9165                 :            : 
    9166                 :            :         /* In case of DSI, DPLL will not be used */
    9167                 :            :         if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
    9168                 :            :                 return;
    9169                 :            : 
    9170                 :            :         vlv_dpio_get(dev_priv);
    9171                 :            :         cmn_dw13 = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW13(port));
    9172                 :            :         pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port));
    9173                 :            :         pll_dw1 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW1(port));
    9174                 :            :         pll_dw2 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW2(port));
    9175                 :            :         pll_dw3 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
    9176                 :            :         vlv_dpio_put(dev_priv);
    9177                 :            : 
    9178                 :            :         clock.m1 = (pll_dw1 & 0x7) == DPIO_CHV_M1_DIV_BY_2 ? 2 : 0;
    9179                 :            :         clock.m2 = (pll_dw0 & 0xff) << 22;
    9180                 :            :         if (pll_dw3 & DPIO_CHV_FRAC_DIV_EN)
    9181                 :            :                 clock.m2 |= pll_dw2 & 0x3fffff;
    9182                 :            :         clock.n = (pll_dw1 >> DPIO_CHV_N_DIV_SHIFT) & 0xf;
    9183                 :            :         clock.p1 = (cmn_dw13 >> DPIO_CHV_P1_DIV_SHIFT) & 0x7;
    9184                 :            :         clock.p2 = (cmn_dw13 >> DPIO_CHV_P2_DIV_SHIFT) & 0x1f;
    9185                 :            : 
    9186                 :            :         pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock);
    9187                 :            : }
    9188                 :            : 
    9189                 :            : static enum intel_output_format
    9190                 :            : bdw_get_pipemisc_output_format(struct intel_crtc *crtc)
    9191                 :            : {
    9192                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9193                 :            :         u32 tmp;
    9194                 :            : 
    9195                 :            :         tmp = I915_READ(PIPEMISC(crtc->pipe));
    9196                 :            : 
    9197                 :            :         if (tmp & PIPEMISC_YUV420_ENABLE) {
    9198                 :            :                 /* We support 4:2:0 in full blend mode only */
    9199                 :            :                 WARN_ON((tmp & PIPEMISC_YUV420_MODE_FULL_BLEND) == 0);
    9200                 :            : 
    9201                 :            :                 return INTEL_OUTPUT_FORMAT_YCBCR420;
    9202                 :            :         } else if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) {
    9203                 :            :                 return INTEL_OUTPUT_FORMAT_YCBCR444;
    9204                 :            :         } else {
    9205                 :            :                 return INTEL_OUTPUT_FORMAT_RGB;
    9206                 :            :         }
    9207                 :            : }
    9208                 :            : 
    9209                 :          0 : static void i9xx_get_pipe_color_config(struct intel_crtc_state *crtc_state)
    9210                 :            : {
    9211                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    9212                 :          0 :         struct intel_plane *plane = to_intel_plane(crtc->base.primary);
    9213                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9214                 :          0 :         enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
    9215                 :          0 :         u32 tmp;
    9216                 :            : 
    9217                 :          0 :         tmp = I915_READ(DSPCNTR(i9xx_plane));
    9218                 :            : 
    9219         [ #  # ]:          0 :         if (tmp & DISPPLANE_GAMMA_ENABLE)
    9220                 :          0 :                 crtc_state->gamma_enable = true;
    9221                 :            : 
    9222         [ #  # ]:          0 :         if (!HAS_GMCH(dev_priv) &&
    9223         [ #  # ]:          0 :             tmp & DISPPLANE_PIPE_CSC_ENABLE)
    9224                 :          0 :                 crtc_state->csc_enable = true;
    9225                 :          0 : }
    9226                 :            : 
    9227                 :          0 : static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
    9228                 :            :                                  struct intel_crtc_state *pipe_config)
    9229                 :            : {
    9230                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9231                 :          0 :         enum intel_display_power_domain power_domain;
    9232                 :          0 :         intel_wakeref_t wakeref;
    9233                 :          0 :         u32 tmp;
    9234                 :          0 :         bool ret;
    9235                 :            : 
    9236                 :          0 :         power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
    9237                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
    9238         [ #  # ]:          0 :         if (!wakeref)
    9239                 :            :                 return false;
    9240                 :            : 
    9241                 :          0 :         pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
    9242                 :          0 :         pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
    9243                 :          0 :         pipe_config->shared_dpll = NULL;
    9244                 :          0 :         pipe_config->master_transcoder = INVALID_TRANSCODER;
    9245                 :            : 
    9246                 :          0 :         ret = false;
    9247                 :            : 
    9248                 :          0 :         tmp = I915_READ(PIPECONF(crtc->pipe));
    9249         [ #  # ]:          0 :         if (!(tmp & PIPECONF_ENABLE))
    9250                 :          0 :                 goto out;
    9251                 :            : 
    9252   [ #  #  #  #  :          0 :         if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
             #  #  #  # ]
    9253                 :            :             IS_CHERRYVIEW(dev_priv)) {
    9254   [ #  #  #  # ]:          0 :                 switch (tmp & PIPECONF_BPC_MASK) {
    9255                 :          0 :                 case PIPECONF_6BPC:
    9256                 :          0 :                         pipe_config->pipe_bpp = 18;
    9257                 :          0 :                         break;
    9258                 :          0 :                 case PIPECONF_8BPC:
    9259                 :          0 :                         pipe_config->pipe_bpp = 24;
    9260                 :          0 :                         break;
    9261                 :          0 :                 case PIPECONF_10BPC:
    9262                 :          0 :                         pipe_config->pipe_bpp = 30;
    9263                 :          0 :                         break;
    9264                 :            :                 default:
    9265                 :            :                         break;
    9266                 :            :                 }
    9267                 :          0 :         }
    9268                 :            : 
    9269   [ #  #  #  # ]:          0 :         if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
    9270         [ #  # ]:          0 :             (tmp & PIPECONF_COLOR_RANGE_SELECT))
    9271                 :          0 :                 pipe_config->limited_color_range = true;
    9272                 :            : 
    9273                 :          0 :         pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_I9XX) >>
    9274                 :            :                 PIPECONF_GAMMA_MODE_SHIFT;
    9275                 :            : 
    9276         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv))
    9277                 :          0 :                 pipe_config->cgm_mode = I915_READ(CGM_PIPE_MODE(crtc->pipe));
    9278                 :            : 
    9279                 :          0 :         i9xx_get_pipe_color_config(pipe_config);
    9280                 :          0 :         intel_color_get_config(pipe_config);
    9281                 :            : 
    9282         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4)
    9283                 :          0 :                 pipe_config->double_wide = tmp & PIPECONF_DOUBLE_WIDE;
    9284                 :            : 
    9285                 :          0 :         intel_get_pipe_timings(crtc, pipe_config);
    9286                 :          0 :         intel_get_pipe_src_size(crtc, pipe_config);
    9287                 :            : 
    9288                 :          0 :         i9xx_get_pfit_config(crtc, pipe_config);
    9289                 :            : 
    9290         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4) {
    9291                 :            :                 /* No way to read it out on pipes B and C */
    9292   [ #  #  #  # ]:          0 :                 if (IS_CHERRYVIEW(dev_priv) && crtc->pipe != PIPE_A)
    9293                 :          0 :                         tmp = dev_priv->chv_dpll_md[crtc->pipe];
    9294                 :            :                 else
    9295                 :          0 :                         tmp = I915_READ(DPLL_MD(crtc->pipe));
    9296                 :          0 :                 pipe_config->pixel_multiplier =
    9297                 :            :                         ((tmp & DPLL_MD_UDI_MULTIPLIER_MASK)
    9298                 :          0 :                          >> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
    9299                 :          0 :                 pipe_config->dpll_hw_state.dpll_md = tmp;
    9300   [ #  #  #  #  :          0 :         } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
                   #  # ]
    9301         [ #  # ]:          0 :                    IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
    9302                 :          0 :                 tmp = I915_READ(DPLL(crtc->pipe));
    9303                 :          0 :                 pipe_config->pixel_multiplier =
    9304                 :            :                         ((tmp & SDVO_MULTIPLIER_MASK)
    9305                 :          0 :                          >> SDVO_MULTIPLIER_SHIFT_HIRES) + 1;
    9306                 :            :         } else {
    9307                 :            :                 /* Note that on i915G/GM the pixel multiplier is in the sdvo
    9308                 :            :                  * port and will be fixed up in the encoder->get_config
    9309                 :            :                  * function. */
    9310                 :          0 :                 pipe_config->pixel_multiplier = 1;
    9311                 :            :         }
    9312                 :          0 :         pipe_config->dpll_hw_state.dpll = I915_READ(DPLL(crtc->pipe));
    9313   [ #  #  #  # ]:          0 :         if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
    9314                 :          0 :                 pipe_config->dpll_hw_state.fp0 = I915_READ(FP0(crtc->pipe));
    9315                 :          0 :                 pipe_config->dpll_hw_state.fp1 = I915_READ(FP1(crtc->pipe));
    9316                 :            :         } else {
    9317                 :            :                 /* Mask out read-only status bits. */
    9318                 :          0 :                 pipe_config->dpll_hw_state.dpll &= ~(DPLL_LOCK_VLV |
    9319                 :            :                                                      DPLL_PORTC_READY_MASK |
    9320                 :            :                                                      DPLL_PORTB_READY_MASK);
    9321                 :            :         }
    9322                 :            : 
    9323         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv))
    9324                 :          0 :                 chv_crtc_clock_get(crtc, pipe_config);
    9325         [ #  # ]:          0 :         else if (IS_VALLEYVIEW(dev_priv))
    9326                 :          0 :                 vlv_crtc_clock_get(crtc, pipe_config);
    9327                 :            :         else
    9328                 :          0 :                 i9xx_crtc_clock_get(crtc, pipe_config);
    9329                 :            : 
    9330                 :            :         /*
    9331                 :            :          * Normally the dotclock is filled in by the encoder .get_config()
    9332                 :            :          * but in case the pipe is enabled w/o any ports we need a sane
    9333                 :            :          * default.
    9334                 :            :          */
    9335                 :          0 :         pipe_config->hw.adjusted_mode.crtc_clock =
    9336                 :          0 :                 pipe_config->port_clock / pipe_config->pixel_multiplier;
    9337                 :            : 
    9338                 :          0 :         ret = true;
    9339                 :            : 
    9340                 :          0 : out:
    9341                 :          0 :         intel_display_power_put(dev_priv, power_domain, wakeref);
    9342                 :            : 
    9343                 :          0 :         return ret;
    9344                 :            : }
    9345                 :            : 
    9346                 :          0 : static void ilk_init_pch_refclk(struct drm_i915_private *dev_priv)
    9347                 :            : {
    9348                 :          0 :         struct intel_encoder *encoder;
    9349                 :          0 :         int i;
    9350                 :          0 :         u32 val, final;
    9351                 :          0 :         bool has_lvds = false;
    9352                 :          0 :         bool has_cpu_edp = false;
    9353                 :          0 :         bool has_panel = false;
    9354                 :          0 :         bool has_ck505 = false;
    9355                 :          0 :         bool can_ssc = false;
    9356                 :          0 :         bool using_ssc_source = false;
    9357                 :            : 
    9358                 :            :         /* We need to take the global config into account */
    9359         [ #  # ]:          0 :         for_each_intel_encoder(&dev_priv->drm, encoder) {
    9360      [ #  #  # ]:          0 :                 switch (encoder->type) {
    9361                 :          0 :                 case INTEL_OUTPUT_LVDS:
    9362                 :          0 :                         has_panel = true;
    9363                 :          0 :                         has_lvds = true;
    9364                 :          0 :                         break;
    9365                 :          0 :                 case INTEL_OUTPUT_EDP:
    9366                 :          0 :                         has_panel = true;
    9367         [ #  # ]:          0 :                         if (encoder->port == PORT_A)
    9368                 :          0 :                                 has_cpu_edp = true;
    9369                 :            :                         break;
    9370                 :            :                 default:
    9371                 :            :                         break;
    9372                 :            :                 }
    9373                 :            :         }
    9374                 :            : 
    9375         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv)) {
    9376                 :          0 :                 has_ck505 = dev_priv->vbt.display_clock_mode;
    9377                 :          0 :                 can_ssc = has_ck505;
    9378                 :            :         } else {
    9379                 :            :                 has_ck505 = false;
    9380                 :            :                 can_ssc = true;
    9381                 :            :         }
    9382                 :            : 
    9383                 :            :         /* Check if any DPLLs are using the SSC source */
    9384         [ #  # ]:          0 :         for (i = 0; i < dev_priv->num_shared_dpll; i++) {
    9385         [ #  # ]:          0 :                 u32 temp = I915_READ(PCH_DPLL(i));
    9386                 :            : 
    9387         [ #  # ]:          0 :                 if (!(temp & DPLL_VCO_ENABLE))
    9388                 :          0 :                         continue;
    9389                 :            : 
    9390         [ #  # ]:          0 :                 if ((temp & PLL_REF_INPUT_MASK) ==
    9391                 :            :                     PLLB_REF_INPUT_SPREADSPECTRUMIN) {
    9392                 :            :                         using_ssc_source = true;
    9393                 :            :                         break;
    9394                 :            :                 }
    9395                 :            :         }
    9396                 :            : 
    9397                 :          0 :         DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source %d\n",
    9398                 :            :                       has_panel, has_lvds, has_ck505, using_ssc_source);
    9399                 :            : 
    9400                 :            :         /* Ironlake: try to setup display ref clock before DPLL
    9401                 :            :          * enabling. This is only under driver's control after
    9402                 :            :          * PCH B stepping, previous chipset stepping should be
    9403                 :            :          * ignoring this setting.
    9404                 :            :          */
    9405                 :          0 :         val = I915_READ(PCH_DREF_CONTROL);
    9406                 :            : 
    9407                 :            :         /* As we must carefully and slowly disable/enable each source in turn,
    9408                 :            :          * compute the final state we want first and check if we need to
    9409                 :            :          * make any changes at all.
    9410                 :            :          */
    9411                 :          0 :         final = val;
    9412                 :          0 :         final &= ~DREF_NONSPREAD_SOURCE_MASK;
    9413         [ #  # ]:          0 :         if (has_ck505)
    9414                 :          0 :                 final |= DREF_NONSPREAD_CK505_ENABLE;
    9415                 :            :         else
    9416                 :          0 :                 final |= DREF_NONSPREAD_SOURCE_ENABLE;
    9417                 :            : 
    9418                 :          0 :         final &= ~DREF_SSC_SOURCE_MASK;
    9419                 :          0 :         final &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
    9420                 :          0 :         final &= ~DREF_SSC1_ENABLE;
    9421                 :            : 
    9422         [ #  # ]:          0 :         if (has_panel) {
    9423                 :          0 :                 final |= DREF_SSC_SOURCE_ENABLE;
    9424                 :            : 
    9425   [ #  #  #  #  :          0 :                 if (intel_panel_use_ssc(dev_priv) && can_ssc)
                   #  # ]
    9426                 :          0 :                         final |= DREF_SSC1_ENABLE;
    9427                 :            : 
    9428         [ #  # ]:          0 :                 if (has_cpu_edp) {
    9429   [ #  #  #  #  :          0 :                         if (intel_panel_use_ssc(dev_priv) && can_ssc)
                   #  # ]
    9430                 :          0 :                                 final |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
    9431                 :            :                         else
    9432                 :          0 :                                 final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
    9433                 :            :                 } else
    9434                 :            :                         final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
    9435         [ #  # ]:          0 :         } else if (using_ssc_source) {
    9436                 :          0 :                 final |= DREF_SSC_SOURCE_ENABLE;
    9437                 :          0 :                 final |= DREF_SSC1_ENABLE;
    9438                 :            :         }
    9439                 :            : 
    9440         [ #  # ]:          0 :         if (final == val)
    9441                 :            :                 return;
    9442                 :            : 
    9443                 :            :         /* Always enable nonspread source */
    9444                 :          0 :         val &= ~DREF_NONSPREAD_SOURCE_MASK;
    9445                 :            : 
    9446                 :          0 :         if (has_ck505)
    9447                 :            :                 val |= DREF_NONSPREAD_CK505_ENABLE;
    9448                 :            :         else
    9449                 :          0 :                 val |= DREF_NONSPREAD_SOURCE_ENABLE;
    9450                 :            : 
    9451         [ #  # ]:          0 :         if (has_panel) {
    9452                 :          0 :                 val &= ~DREF_SSC_SOURCE_MASK;
    9453                 :          0 :                 val |= DREF_SSC_SOURCE_ENABLE;
    9454                 :            : 
    9455                 :            :                 /* SSC must be turned on before enabling the CPU output  */
    9456   [ #  #  #  #  :          0 :                 if (intel_panel_use_ssc(dev_priv) && can_ssc) {
                   #  # ]
    9457                 :          0 :                         DRM_DEBUG_KMS("Using SSC on panel\n");
    9458                 :          0 :                         val |= DREF_SSC1_ENABLE;
    9459                 :            :                 } else
    9460                 :          0 :                         val &= ~DREF_SSC1_ENABLE;
    9461                 :            : 
    9462                 :            :                 /* Get SSC going before enabling the outputs */
    9463                 :          0 :                 I915_WRITE(PCH_DREF_CONTROL, val);
    9464                 :          0 :                 POSTING_READ(PCH_DREF_CONTROL);
    9465                 :          0 :                 udelay(200);
    9466                 :            : 
    9467                 :          0 :                 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
    9468                 :            : 
    9469                 :            :                 /* Enable CPU source on CPU attached eDP */
    9470         [ #  # ]:          0 :                 if (has_cpu_edp) {
    9471   [ #  #  #  #  :          0 :                         if (intel_panel_use_ssc(dev_priv) && can_ssc) {
                   #  # ]
    9472                 :          0 :                                 DRM_DEBUG_KMS("Using SSC on eDP\n");
    9473                 :          0 :                                 val |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
    9474                 :            :                         } else
    9475                 :          0 :                                 val |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
    9476                 :            :                 } else
    9477                 :            :                         val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
    9478                 :            : 
    9479                 :          0 :                 I915_WRITE(PCH_DREF_CONTROL, val);
    9480                 :          0 :                 POSTING_READ(PCH_DREF_CONTROL);
    9481                 :          0 :                 udelay(200);
    9482                 :            :         } else {
    9483                 :          0 :                 DRM_DEBUG_KMS("Disabling CPU source output\n");
    9484                 :            : 
    9485                 :          0 :                 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
    9486                 :            : 
    9487                 :            :                 /* Turn off CPU output */
    9488                 :          0 :                 val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
    9489                 :            : 
    9490                 :          0 :                 I915_WRITE(PCH_DREF_CONTROL, val);
    9491                 :          0 :                 POSTING_READ(PCH_DREF_CONTROL);
    9492                 :          0 :                 udelay(200);
    9493                 :            : 
    9494         [ #  # ]:          0 :                 if (!using_ssc_source) {
    9495                 :          0 :                         DRM_DEBUG_KMS("Disabling SSC source\n");
    9496                 :            : 
    9497                 :            :                         /* Turn off the SSC source */
    9498                 :          0 :                         val &= ~DREF_SSC_SOURCE_MASK;
    9499                 :          0 :                         val |= DREF_SSC_SOURCE_DISABLE;
    9500                 :            : 
    9501                 :            :                         /* Turn off SSC1 */
    9502                 :          0 :                         val &= ~DREF_SSC1_ENABLE;
    9503                 :            : 
    9504                 :          0 :                         I915_WRITE(PCH_DREF_CONTROL, val);
    9505                 :          0 :                         POSTING_READ(PCH_DREF_CONTROL);
    9506                 :          0 :                         udelay(200);
    9507                 :            :                 }
    9508                 :            :         }
    9509                 :            : 
    9510         [ #  # ]:          0 :         BUG_ON(val != final);
    9511                 :            : }
    9512                 :            : 
    9513                 :          0 : static void lpt_reset_fdi_mphy(struct drm_i915_private *dev_priv)
    9514                 :            : {
    9515                 :          0 :         u32 tmp;
    9516                 :            : 
    9517                 :          0 :         tmp = I915_READ(SOUTH_CHICKEN2);
    9518                 :          0 :         tmp |= FDI_MPHY_IOSFSB_RESET_CTL;
    9519                 :          0 :         I915_WRITE(SOUTH_CHICKEN2, tmp);
    9520                 :            : 
    9521   [ #  #  #  #  :          0 :         if (wait_for_us(I915_READ(SOUTH_CHICKEN2) &
                   #  # ]
    9522                 :            :                         FDI_MPHY_IOSFSB_RESET_STATUS, 100))
    9523                 :          0 :                 DRM_ERROR("FDI mPHY reset assert timeout\n");
    9524                 :            : 
    9525                 :          0 :         tmp = I915_READ(SOUTH_CHICKEN2);
    9526                 :          0 :         tmp &= ~FDI_MPHY_IOSFSB_RESET_CTL;
    9527                 :          0 :         I915_WRITE(SOUTH_CHICKEN2, tmp);
    9528                 :            : 
    9529   [ #  #  #  #  :          0 :         if (wait_for_us((I915_READ(SOUTH_CHICKEN2) &
                   #  # ]
    9530                 :            :                          FDI_MPHY_IOSFSB_RESET_STATUS) == 0, 100))
    9531                 :          0 :                 DRM_ERROR("FDI mPHY reset de-assert timeout\n");
    9532                 :          0 : }
    9533                 :            : 
    9534                 :            : /* WaMPhyProgramming:hsw */
    9535                 :          0 : static void lpt_program_fdi_mphy(struct drm_i915_private *dev_priv)
    9536                 :            : {
    9537                 :          0 :         u32 tmp;
    9538                 :            : 
    9539                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x8008, SBI_MPHY);
    9540                 :          0 :         tmp &= ~(0xFF << 24);
    9541                 :          0 :         tmp |= (0x12 << 24);
    9542                 :          0 :         intel_sbi_write(dev_priv, 0x8008, tmp, SBI_MPHY);
    9543                 :            : 
    9544                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2008, SBI_MPHY);
    9545                 :          0 :         tmp |= (1 << 11);
    9546                 :          0 :         intel_sbi_write(dev_priv, 0x2008, tmp, SBI_MPHY);
    9547                 :            : 
    9548                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2108, SBI_MPHY);
    9549                 :          0 :         tmp |= (1 << 11);
    9550                 :          0 :         intel_sbi_write(dev_priv, 0x2108, tmp, SBI_MPHY);
    9551                 :            : 
    9552                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x206C, SBI_MPHY);
    9553                 :          0 :         tmp |= (1 << 24) | (1 << 21) | (1 << 18);
    9554                 :          0 :         intel_sbi_write(dev_priv, 0x206C, tmp, SBI_MPHY);
    9555                 :            : 
    9556                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x216C, SBI_MPHY);
    9557                 :          0 :         tmp |= (1 << 24) | (1 << 21) | (1 << 18);
    9558                 :          0 :         intel_sbi_write(dev_priv, 0x216C, tmp, SBI_MPHY);
    9559                 :            : 
    9560                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2080, SBI_MPHY);
    9561                 :          0 :         tmp &= ~(7 << 13);
    9562                 :          0 :         tmp |= (5 << 13);
    9563                 :          0 :         intel_sbi_write(dev_priv, 0x2080, tmp, SBI_MPHY);
    9564                 :            : 
    9565                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2180, SBI_MPHY);
    9566                 :          0 :         tmp &= ~(7 << 13);
    9567                 :          0 :         tmp |= (5 << 13);
    9568                 :          0 :         intel_sbi_write(dev_priv, 0x2180, tmp, SBI_MPHY);
    9569                 :            : 
    9570                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x208C, SBI_MPHY);
    9571                 :          0 :         tmp &= ~0xFF;
    9572                 :          0 :         tmp |= 0x1C;
    9573                 :          0 :         intel_sbi_write(dev_priv, 0x208C, tmp, SBI_MPHY);
    9574                 :            : 
    9575                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x218C, SBI_MPHY);
    9576                 :          0 :         tmp &= ~0xFF;
    9577                 :          0 :         tmp |= 0x1C;
    9578                 :          0 :         intel_sbi_write(dev_priv, 0x218C, tmp, SBI_MPHY);
    9579                 :            : 
    9580                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2098, SBI_MPHY);
    9581                 :          0 :         tmp &= ~(0xFF << 16);
    9582                 :          0 :         tmp |= (0x1C << 16);
    9583                 :          0 :         intel_sbi_write(dev_priv, 0x2098, tmp, SBI_MPHY);
    9584                 :            : 
    9585                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x2198, SBI_MPHY);
    9586                 :          0 :         tmp &= ~(0xFF << 16);
    9587                 :          0 :         tmp |= (0x1C << 16);
    9588                 :          0 :         intel_sbi_write(dev_priv, 0x2198, tmp, SBI_MPHY);
    9589                 :            : 
    9590                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x20C4, SBI_MPHY);
    9591                 :          0 :         tmp |= (1 << 27);
    9592                 :          0 :         intel_sbi_write(dev_priv, 0x20C4, tmp, SBI_MPHY);
    9593                 :            : 
    9594                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x21C4, SBI_MPHY);
    9595                 :          0 :         tmp |= (1 << 27);
    9596                 :          0 :         intel_sbi_write(dev_priv, 0x21C4, tmp, SBI_MPHY);
    9597                 :            : 
    9598                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x20EC, SBI_MPHY);
    9599                 :          0 :         tmp &= ~(0xF << 28);
    9600                 :          0 :         tmp |= (4 << 28);
    9601                 :          0 :         intel_sbi_write(dev_priv, 0x20EC, tmp, SBI_MPHY);
    9602                 :            : 
    9603                 :          0 :         tmp = intel_sbi_read(dev_priv, 0x21EC, SBI_MPHY);
    9604                 :          0 :         tmp &= ~(0xF << 28);
    9605                 :          0 :         tmp |= (4 << 28);
    9606                 :          0 :         intel_sbi_write(dev_priv, 0x21EC, tmp, SBI_MPHY);
    9607                 :          0 : }
    9608                 :            : 
    9609                 :            : /* Implements 3 different sequences from BSpec chapter "Display iCLK
    9610                 :            :  * Programming" based on the parameters passed:
    9611                 :            :  * - Sequence to enable CLKOUT_DP
    9612                 :            :  * - Sequence to enable CLKOUT_DP without spread
    9613                 :            :  * - Sequence to enable CLKOUT_DP for FDI usage and configure PCH FDI I/O
    9614                 :            :  */
    9615                 :          0 : static void lpt_enable_clkout_dp(struct drm_i915_private *dev_priv,
    9616                 :            :                                  bool with_spread, bool with_fdi)
    9617                 :            : {
    9618                 :          0 :         u32 reg, tmp;
    9619                 :            : 
    9620   [ #  #  #  # ]:          0 :         if (WARN(with_fdi && !with_spread, "FDI requires downspread\n"))
    9621                 :          0 :                 with_spread = true;
    9622   [ #  #  #  #  :          0 :         if (WARN(HAS_PCH_LPT_LP(dev_priv) &&
             #  #  #  # ]
    9623                 :            :             with_fdi, "LP PCH doesn't have FDI\n"))
    9624                 :          0 :                 with_fdi = false;
    9625                 :            : 
    9626                 :          0 :         mutex_lock(&dev_priv->sb_lock);
    9627                 :            : 
    9628                 :          0 :         tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
    9629                 :          0 :         tmp &= ~SBI_SSCCTL_DISABLE;
    9630                 :          0 :         tmp |= SBI_SSCCTL_PATHALT;
    9631                 :          0 :         intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
    9632                 :            : 
    9633                 :          0 :         udelay(24);
    9634                 :            : 
    9635         [ #  # ]:          0 :         if (with_spread) {
    9636                 :          0 :                 tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
    9637                 :          0 :                 tmp &= ~SBI_SSCCTL_PATHALT;
    9638                 :          0 :                 intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
    9639                 :            : 
    9640         [ #  # ]:          0 :                 if (with_fdi) {
    9641                 :          0 :                         lpt_reset_fdi_mphy(dev_priv);
    9642                 :          0 :                         lpt_program_fdi_mphy(dev_priv);
    9643                 :            :                 }
    9644                 :            :         }
    9645                 :            : 
    9646         [ #  # ]:          0 :         reg = HAS_PCH_LPT_LP(dev_priv) ? SBI_GEN0 : SBI_DBUFF0;
    9647                 :          0 :         tmp = intel_sbi_read(dev_priv, reg, SBI_ICLK);
    9648                 :          0 :         tmp |= SBI_GEN0_CFG_BUFFENABLE_DISABLE;
    9649                 :          0 :         intel_sbi_write(dev_priv, reg, tmp, SBI_ICLK);
    9650                 :            : 
    9651                 :          0 :         mutex_unlock(&dev_priv->sb_lock);
    9652                 :          0 : }
    9653                 :            : 
    9654                 :            : /* Sequence to disable CLKOUT_DP */
    9655                 :          0 : void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv)
    9656                 :            : {
    9657                 :          0 :         u32 reg, tmp;
    9658                 :            : 
    9659                 :          0 :         mutex_lock(&dev_priv->sb_lock);
    9660                 :            : 
    9661         [ #  # ]:          0 :         reg = HAS_PCH_LPT_LP(dev_priv) ? SBI_GEN0 : SBI_DBUFF0;
    9662                 :          0 :         tmp = intel_sbi_read(dev_priv, reg, SBI_ICLK);
    9663                 :          0 :         tmp &= ~SBI_GEN0_CFG_BUFFENABLE_DISABLE;
    9664                 :          0 :         intel_sbi_write(dev_priv, reg, tmp, SBI_ICLK);
    9665                 :            : 
    9666                 :          0 :         tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
    9667         [ #  # ]:          0 :         if (!(tmp & SBI_SSCCTL_DISABLE)) {
    9668         [ #  # ]:          0 :                 if (!(tmp & SBI_SSCCTL_PATHALT)) {
    9669                 :          0 :                         tmp |= SBI_SSCCTL_PATHALT;
    9670                 :          0 :                         intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
    9671                 :          0 :                         udelay(32);
    9672                 :            :                 }
    9673                 :          0 :                 tmp |= SBI_SSCCTL_DISABLE;
    9674                 :          0 :                 intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
    9675                 :            :         }
    9676                 :            : 
    9677                 :          0 :         mutex_unlock(&dev_priv->sb_lock);
    9678                 :          0 : }
    9679                 :            : 
    9680                 :            : #define BEND_IDX(steps) ((50 + (steps)) / 5)
    9681                 :            : 
    9682                 :            : static const u16 sscdivintphase[] = {
    9683                 :            :         [BEND_IDX( 50)] = 0x3B23,
    9684                 :            :         [BEND_IDX( 45)] = 0x3B23,
    9685                 :            :         [BEND_IDX( 40)] = 0x3C23,
    9686                 :            :         [BEND_IDX( 35)] = 0x3C23,
    9687                 :            :         [BEND_IDX( 30)] = 0x3D23,
    9688                 :            :         [BEND_IDX( 25)] = 0x3D23,
    9689                 :            :         [BEND_IDX( 20)] = 0x3E23,
    9690                 :            :         [BEND_IDX( 15)] = 0x3E23,
    9691                 :            :         [BEND_IDX( 10)] = 0x3F23,
    9692                 :            :         [BEND_IDX(  5)] = 0x3F23,
    9693                 :            :         [BEND_IDX(  0)] = 0x0025,
    9694                 :            :         [BEND_IDX( -5)] = 0x0025,
    9695                 :            :         [BEND_IDX(-10)] = 0x0125,
    9696                 :            :         [BEND_IDX(-15)] = 0x0125,
    9697                 :            :         [BEND_IDX(-20)] = 0x0225,
    9698                 :            :         [BEND_IDX(-25)] = 0x0225,
    9699                 :            :         [BEND_IDX(-30)] = 0x0325,
    9700                 :            :         [BEND_IDX(-35)] = 0x0325,
    9701                 :            :         [BEND_IDX(-40)] = 0x0425,
    9702                 :            :         [BEND_IDX(-45)] = 0x0425,
    9703                 :            :         [BEND_IDX(-50)] = 0x0525,
    9704                 :            : };
    9705                 :            : 
    9706                 :            : /*
    9707                 :            :  * Bend CLKOUT_DP
    9708                 :            :  * steps -50 to 50 inclusive, in steps of 5
    9709                 :            :  * < 0 slow down the clock, > 0 speed up the clock, 0 == no bend (135MHz)
    9710                 :            :  * change in clock period = -(steps / 10) * 5.787 ps
    9711                 :            :  */
    9712                 :          0 : static void lpt_bend_clkout_dp(struct drm_i915_private *dev_priv, int steps)
    9713                 :            : {
    9714                 :          0 :         u32 tmp;
    9715                 :          0 :         int idx = BEND_IDX(steps);
    9716                 :            : 
    9717   [ #  #  #  # ]:          0 :         if (WARN_ON(steps % 5 != 0))
    9718                 :            :                 return;
    9719                 :            : 
    9720   [ #  #  #  # ]:          0 :         if (WARN_ON(idx >= ARRAY_SIZE(sscdivintphase)))
    9721                 :            :                 return;
    9722                 :            : 
    9723                 :          0 :         mutex_lock(&dev_priv->sb_lock);
    9724                 :            : 
    9725         [ #  # ]:          0 :         if (steps % 10 != 0)
    9726                 :            :                 tmp = 0xAAAAAAAB;
    9727                 :            :         else
    9728                 :          0 :                 tmp = 0x00000000;
    9729                 :          0 :         intel_sbi_write(dev_priv, SBI_SSCDITHPHASE, tmp, SBI_ICLK);
    9730                 :            : 
    9731                 :          0 :         tmp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE, SBI_ICLK);
    9732                 :          0 :         tmp &= 0xffff0000;
    9733                 :          0 :         tmp |= sscdivintphase[idx];
    9734                 :          0 :         intel_sbi_write(dev_priv, SBI_SSCDIVINTPHASE, tmp, SBI_ICLK);
    9735                 :            : 
    9736                 :          0 :         mutex_unlock(&dev_priv->sb_lock);
    9737                 :            : }
    9738                 :            : 
    9739                 :            : #undef BEND_IDX
    9740                 :            : 
    9741                 :          0 : static bool spll_uses_pch_ssc(struct drm_i915_private *dev_priv)
    9742                 :            : {
    9743                 :          0 :         u32 fuse_strap = I915_READ(FUSE_STRAP);
    9744                 :          0 :         u32 ctl = I915_READ(SPLL_CTL);
    9745                 :            : 
    9746         [ #  # ]:          0 :         if ((ctl & SPLL_PLL_ENABLE) == 0)
    9747                 :            :                 return false;
    9748                 :            : 
    9749         [ #  # ]:          0 :         if ((ctl & SPLL_REF_MASK) == SPLL_REF_MUXED_SSC &&
    9750         [ #  # ]:          0 :             (fuse_strap & HSW_CPU_SSC_ENABLE) == 0)
    9751                 :            :                 return true;
    9752                 :            : 
    9753   [ #  #  #  # ]:          0 :         if (IS_BROADWELL(dev_priv) &&
    9754                 :            :             (ctl & SPLL_REF_MASK) == SPLL_REF_PCH_SSC_BDW)
    9755                 :          0 :                 return true;
    9756                 :            : 
    9757                 :            :         return false;
    9758                 :            : }
    9759                 :            : 
    9760                 :          0 : static bool wrpll_uses_pch_ssc(struct drm_i915_private *dev_priv,
    9761                 :            :                                enum intel_dpll_id id)
    9762                 :            : {
    9763                 :          0 :         u32 fuse_strap = I915_READ(FUSE_STRAP);
    9764                 :          0 :         u32 ctl = I915_READ(WRPLL_CTL(id));
    9765                 :            : 
    9766         [ #  # ]:          0 :         if ((ctl & WRPLL_PLL_ENABLE) == 0)
    9767                 :            :                 return false;
    9768                 :            : 
    9769         [ #  # ]:          0 :         if ((ctl & WRPLL_REF_MASK) == WRPLL_REF_PCH_SSC)
    9770                 :            :                 return true;
    9771                 :            : 
    9772   [ #  #  #  #  :          0 :         if ((IS_BROADWELL(dev_priv) || IS_HSW_ULT(dev_priv)) &&
                   #  # ]
    9773                 :          0 :             (ctl & WRPLL_REF_MASK) == WRPLL_REF_MUXED_SSC_BDW &&
    9774         [ #  # ]:          0 :             (fuse_strap & HSW_CPU_SSC_ENABLE) == 0)
    9775                 :          0 :                 return true;
    9776                 :            : 
    9777                 :            :         return false;
    9778                 :            : }
    9779                 :            : 
    9780                 :          0 : static void lpt_init_pch_refclk(struct drm_i915_private *dev_priv)
    9781                 :            : {
    9782                 :          0 :         struct intel_encoder *encoder;
    9783                 :          0 :         bool has_fdi = false;
    9784                 :            : 
    9785         [ #  # ]:          0 :         for_each_intel_encoder(&dev_priv->drm, encoder) {
    9786         [ #  # ]:          0 :                 switch (encoder->type) {
    9787                 :          0 :                 case INTEL_OUTPUT_ANALOG:
    9788                 :          0 :                         has_fdi = true;
    9789                 :          0 :                         break;
    9790                 :            :                 default:
    9791                 :            :                         break;
    9792                 :            :                 }
    9793                 :            :         }
    9794                 :            : 
    9795                 :            :         /*
    9796                 :            :          * The BIOS may have decided to use the PCH SSC
    9797                 :            :          * reference so we must not disable it until the
    9798                 :            :          * relevant PLLs have stopped relying on it. We'll
    9799                 :            :          * just leave the PCH SSC reference enabled in case
    9800                 :            :          * any active PLL is using it. It will get disabled
    9801                 :            :          * after runtime suspend if we don't have FDI.
    9802                 :            :          *
    9803                 :            :          * TODO: Move the whole reference clock handling
    9804                 :            :          * to the modeset sequence proper so that we can
    9805                 :            :          * actually enable/disable/reconfigure these things
    9806                 :            :          * safely. To do that we need to introduce a real
    9807                 :            :          * clock hierarchy. That would also allow us to do
    9808                 :            :          * clock bending finally.
    9809                 :            :          */
    9810                 :          0 :         dev_priv->pch_ssc_use = 0;
    9811                 :            : 
    9812         [ #  # ]:          0 :         if (spll_uses_pch_ssc(dev_priv)) {
    9813                 :          0 :                 DRM_DEBUG_KMS("SPLL using PCH SSC\n");
    9814                 :          0 :                 dev_priv->pch_ssc_use |= BIT(DPLL_ID_SPLL);
    9815                 :            :         }
    9816                 :            : 
    9817         [ #  # ]:          0 :         if (wrpll_uses_pch_ssc(dev_priv, DPLL_ID_WRPLL1)) {
    9818                 :          0 :                 DRM_DEBUG_KMS("WRPLL1 using PCH SSC\n");
    9819                 :          0 :                 dev_priv->pch_ssc_use |= BIT(DPLL_ID_WRPLL1);
    9820                 :            :         }
    9821                 :            : 
    9822         [ #  # ]:          0 :         if (wrpll_uses_pch_ssc(dev_priv, DPLL_ID_WRPLL2)) {
    9823                 :          0 :                 DRM_DEBUG_KMS("WRPLL2 using PCH SSC\n");
    9824                 :          0 :                 dev_priv->pch_ssc_use |= BIT(DPLL_ID_WRPLL2);
    9825                 :            :         }
    9826                 :            : 
    9827         [ #  # ]:          0 :         if (dev_priv->pch_ssc_use)
    9828                 :            :                 return;
    9829                 :            : 
    9830         [ #  # ]:          0 :         if (has_fdi) {
    9831                 :          0 :                 lpt_bend_clkout_dp(dev_priv, 0);
    9832                 :          0 :                 lpt_enable_clkout_dp(dev_priv, true, true);
    9833                 :            :         } else {
    9834                 :          0 :                 lpt_disable_clkout_dp(dev_priv);
    9835                 :            :         }
    9836                 :            : }
    9837                 :            : 
    9838                 :            : /*
    9839                 :            :  * Initialize reference clocks when the driver loads
    9840                 :            :  */
    9841                 :          0 : void intel_init_pch_refclk(struct drm_i915_private *dev_priv)
    9842                 :            : {
    9843         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
    9844                 :          0 :                 ilk_init_pch_refclk(dev_priv);
    9845         [ #  # ]:          0 :         else if (HAS_PCH_LPT(dev_priv))
    9846                 :          0 :                 lpt_init_pch_refclk(dev_priv);
    9847                 :          0 : }
    9848                 :            : 
    9849                 :          0 : static void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)
    9850                 :            : {
    9851                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    9852   [ #  #  #  #  :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
                      # ]
    9853                 :          0 :         enum pipe pipe = crtc->pipe;
    9854                 :          0 :         u32 val;
    9855                 :            : 
    9856                 :          0 :         val = 0;
    9857                 :            : 
    9858   [ #  #  #  #  :          0 :         switch (crtc_state->pipe_bpp) {
                      # ]
    9859                 :            :         case 18:
    9860                 :            :                 val |= PIPECONF_6BPC;
    9861                 :            :                 break;
    9862                 :          0 :         case 24:
    9863                 :          0 :                 val |= PIPECONF_8BPC;
    9864                 :          0 :                 break;
    9865                 :          0 :         case 30:
    9866                 :          0 :                 val |= PIPECONF_10BPC;
    9867                 :          0 :                 break;
    9868                 :          0 :         case 36:
    9869                 :          0 :                 val |= PIPECONF_12BPC;
    9870                 :          0 :                 break;
    9871                 :          0 :         default:
    9872                 :            :                 /* Case prevented by intel_choose_pipe_bpp_dither. */
    9873                 :          0 :                 BUG();
    9874                 :            :         }
    9875                 :            : 
    9876         [ #  # ]:          0 :         if (crtc_state->dither)
    9877                 :          0 :                 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
    9878                 :            : 
    9879         [ #  # ]:          0 :         if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
    9880                 :          0 :                 val |= PIPECONF_INTERLACED_ILK;
    9881                 :            :         else
    9882                 :            :                 val |= PIPECONF_PROGRESSIVE;
    9883                 :            : 
    9884                 :            :         /*
    9885                 :            :          * This would end up with an odd purple hue over
    9886                 :            :          * the entire display. Make sure we don't do it.
    9887                 :            :          */
    9888   [ #  #  #  #  :          0 :         WARN_ON(crtc_state->limited_color_range &&
                   #  # ]
    9889                 :            :                 crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
    9890                 :            : 
    9891         [ #  # ]:          0 :         if (crtc_state->limited_color_range)
    9892                 :          0 :                 val |= PIPECONF_COLOR_RANGE_SELECT;
    9893                 :            : 
    9894         [ #  # ]:          0 :         if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
    9895                 :          0 :                 val |= PIPECONF_OUTPUT_COLORSPACE_YUV709;
    9896                 :            : 
    9897                 :          0 :         val |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
    9898                 :            : 
    9899                 :          0 :         val |= PIPECONF_FRAME_START_DELAY(0);
    9900                 :            : 
    9901                 :          0 :         I915_WRITE(PIPECONF(pipe), val);
    9902                 :          0 :         POSTING_READ(PIPECONF(pipe));
    9903                 :          0 : }
    9904                 :            : 
    9905                 :          0 : static void hsw_set_pipeconf(const struct intel_crtc_state *crtc_state)
    9906                 :            : {
    9907                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    9908         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9909                 :          0 :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    9910                 :          0 :         u32 val = 0;
    9911                 :            : 
    9912   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) && crtc_state->dither)
    9913                 :          0 :                 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
    9914                 :            : 
    9915         [ #  # ]:          0 :         if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
    9916                 :          0 :                 val |= PIPECONF_INTERLACED_ILK;
    9917                 :            :         else
    9918                 :            :                 val |= PIPECONF_PROGRESSIVE;
    9919                 :            : 
    9920         [ #  # ]:          0 :         if (IS_HASWELL(dev_priv) &&
    9921         [ #  # ]:          0 :             crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
    9922                 :          0 :                 val |= PIPECONF_OUTPUT_COLORSPACE_YUV_HSW;
    9923                 :            : 
    9924                 :          0 :         I915_WRITE(PIPECONF(cpu_transcoder), val);
    9925                 :          0 :         POSTING_READ(PIPECONF(cpu_transcoder));
    9926                 :          0 : }
    9927                 :            : 
    9928                 :          0 : static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)
    9929                 :            : {
    9930                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    9931   [ #  #  #  #  :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
                      # ]
    9932                 :          0 :         u32 val = 0;
    9933                 :            : 
    9934   [ #  #  #  #  :          0 :         switch (crtc_state->pipe_bpp) {
                      # ]
    9935                 :            :         case 18:
    9936                 :            :                 val |= PIPEMISC_DITHER_6_BPC;
    9937                 :            :                 break;
    9938                 :          0 :         case 24:
    9939                 :          0 :                 val |= PIPEMISC_DITHER_8_BPC;
    9940                 :          0 :                 break;
    9941                 :          0 :         case 30:
    9942                 :          0 :                 val |= PIPEMISC_DITHER_10_BPC;
    9943                 :          0 :                 break;
    9944                 :          0 :         case 36:
    9945                 :          0 :                 val |= PIPEMISC_DITHER_12_BPC;
    9946                 :          0 :                 break;
    9947                 :            :         default:
    9948                 :          0 :                 MISSING_CASE(crtc_state->pipe_bpp);
    9949                 :          0 :                 break;
    9950                 :            :         }
    9951                 :            : 
    9952         [ #  # ]:          0 :         if (crtc_state->dither)
    9953                 :          0 :                 val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
    9954                 :            : 
    9955         [ #  # ]:          0 :         if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
    9956                 :            :             crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
    9957                 :          0 :                 val |= PIPEMISC_OUTPUT_COLORSPACE_YUV;
    9958                 :            : 
    9959         [ #  # ]:          0 :         if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
    9960                 :          0 :                 val |= PIPEMISC_YUV420_ENABLE |
    9961                 :            :                         PIPEMISC_YUV420_MODE_FULL_BLEND;
    9962                 :            : 
    9963   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11 &&
    9964         [ #  # ]:          0 :             (crtc_state->active_planes & ~(icl_hdr_plane_mask() |
    9965                 :            :                                            BIT(PLANE_CURSOR))) == 0)
    9966                 :          0 :                 val |= PIPEMISC_HDR_MODE_PRECISION;
    9967                 :            : 
    9968                 :          0 :         I915_WRITE(PIPEMISC(crtc->pipe), val);
    9969                 :          0 : }
    9970                 :            : 
    9971                 :          0 : int bdw_get_pipemisc_bpp(struct intel_crtc *crtc)
    9972                 :            : {
    9973                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
    9974                 :          0 :         u32 tmp;
    9975                 :            : 
    9976                 :          0 :         tmp = I915_READ(PIPEMISC(crtc->pipe));
    9977                 :            : 
    9978   [ #  #  #  #  :          0 :         switch (tmp & PIPEMISC_DITHER_BPC_MASK) {
                      # ]
    9979                 :            :         case PIPEMISC_DITHER_6_BPC:
    9980                 :            :                 return 18;
    9981                 :          0 :         case PIPEMISC_DITHER_8_BPC:
    9982                 :          0 :                 return 24;
    9983                 :          0 :         case PIPEMISC_DITHER_10_BPC:
    9984                 :          0 :                 return 30;
    9985                 :          0 :         case PIPEMISC_DITHER_12_BPC:
    9986                 :          0 :                 return 36;
    9987                 :            :         default:
    9988                 :          0 :                 MISSING_CASE(tmp);
    9989                 :          0 :                 return 0;
    9990                 :            :         }
    9991                 :            : }
    9992                 :            : 
    9993                 :          0 : int ilk_get_lanes_required(int target_clock, int link_bw, int bpp)
    9994                 :            : {
    9995                 :            :         /*
    9996                 :            :          * Account for spread spectrum to avoid
    9997                 :            :          * oversubscribing the link. Max center spread
    9998                 :            :          * is 2.5%; use 5% for safety's sake.
    9999                 :            :          */
   10000                 :          0 :         u32 bps = target_clock * bpp * 21 / 20;
   10001                 :          0 :         return DIV_ROUND_UP(bps, link_bw * 8);
   10002                 :            : }
   10003                 :            : 
   10004                 :            : static bool ilk_needs_fb_cb_tune(struct dpll *dpll, int factor)
   10005                 :            : {
   10006                 :            :         return i9xx_dpll_compute_m(dpll) < factor * dpll->n;
   10007                 :            : }
   10008                 :            : 
   10009                 :            : static void ilk_compute_dpll(struct intel_crtc *crtc,
   10010                 :            :                              struct intel_crtc_state *crtc_state,
   10011                 :            :                              struct dpll *reduced_clock)
   10012                 :            : {
   10013                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10014                 :            :         u32 dpll, fp, fp2;
   10015                 :            :         int factor;
   10016                 :            : 
   10017                 :            :         /* Enable autotuning of the PLL clock (if permissible) */
   10018                 :            :         factor = 21;
   10019                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   10020                 :            :                 if ((intel_panel_use_ssc(dev_priv) &&
   10021                 :            :                      dev_priv->vbt.lvds_ssc_freq == 100000) ||
   10022                 :            :                     (HAS_PCH_IBX(dev_priv) &&
   10023                 :            :                      intel_is_dual_link_lvds(dev_priv)))
   10024                 :            :                         factor = 25;
   10025                 :            :         } else if (crtc_state->sdvo_tv_clock) {
   10026                 :            :                 factor = 20;
   10027                 :            :         }
   10028                 :            : 
   10029                 :            :         fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
   10030                 :            : 
   10031                 :            :         if (ilk_needs_fb_cb_tune(&crtc_state->dpll, factor))
   10032                 :            :                 fp |= FP_CB_TUNE;
   10033                 :            : 
   10034                 :            :         if (reduced_clock) {
   10035                 :            :                 fp2 = i9xx_dpll_compute_fp(reduced_clock);
   10036                 :            : 
   10037                 :            :                 if (reduced_clock->m < factor * reduced_clock->n)
   10038                 :            :                         fp2 |= FP_CB_TUNE;
   10039                 :            :         } else {
   10040                 :            :                 fp2 = fp;
   10041                 :            :         }
   10042                 :            : 
   10043                 :            :         dpll = 0;
   10044                 :            : 
   10045                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
   10046                 :            :                 dpll |= DPLLB_MODE_LVDS;
   10047                 :            :         else
   10048                 :            :                 dpll |= DPLLB_MODE_DAC_SERIAL;
   10049                 :            : 
   10050                 :            :         dpll |= (crtc_state->pixel_multiplier - 1)
   10051                 :            :                 << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT;
   10052                 :            : 
   10053                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO) ||
   10054                 :            :             intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
   10055                 :            :                 dpll |= DPLL_SDVO_HIGH_SPEED;
   10056                 :            : 
   10057                 :            :         if (intel_crtc_has_dp_encoder(crtc_state))
   10058                 :            :                 dpll |= DPLL_SDVO_HIGH_SPEED;
   10059                 :            : 
   10060                 :            :         /*
   10061                 :            :          * The high speed IO clock is only really required for
   10062                 :            :          * SDVO/HDMI/DP, but we also enable it for CRT to make it
   10063                 :            :          * possible to share the DPLL between CRT and HDMI. Enabling
   10064                 :            :          * the clock needlessly does no real harm, except use up a
   10065                 :            :          * bit of power potentially.
   10066                 :            :          *
   10067                 :            :          * We'll limit this to IVB with 3 pipes, since it has only two
   10068                 :            :          * DPLLs and so DPLL sharing is the only way to get three pipes
   10069                 :            :          * driving PCH ports at the same time. On SNB we could do this,
   10070                 :            :          * and potentially avoid enabling the second DPLL, but it's not
   10071                 :            :          * clear if it''s a win or loss power wise. No point in doing
   10072                 :            :          * this on ILK at all since it has a fixed DPLL<->pipe mapping.
   10073                 :            :          */
   10074                 :            :         if (INTEL_NUM_PIPES(dev_priv) == 3 &&
   10075                 :            :             intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
   10076                 :            :                 dpll |= DPLL_SDVO_HIGH_SPEED;
   10077                 :            : 
   10078                 :            :         /* compute bitmask from p1 value */
   10079                 :            :         dpll |= (1 << (crtc_state->dpll.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
   10080                 :            :         /* also FPA1 */
   10081                 :            :         dpll |= (1 << (crtc_state->dpll.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
   10082                 :            : 
   10083                 :            :         switch (crtc_state->dpll.p2) {
   10084                 :            :         case 5:
   10085                 :            :                 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
   10086                 :            :                 break;
   10087                 :            :         case 7:
   10088                 :            :                 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
   10089                 :            :                 break;
   10090                 :            :         case 10:
   10091                 :            :                 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
   10092                 :            :                 break;
   10093                 :            :         case 14:
   10094                 :            :                 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
   10095                 :            :                 break;
   10096                 :            :         }
   10097                 :            : 
   10098                 :            :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
   10099                 :            :             intel_panel_use_ssc(dev_priv))
   10100                 :            :                 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
   10101                 :            :         else
   10102                 :            :                 dpll |= PLL_REF_INPUT_DREFCLK;
   10103                 :            : 
   10104                 :            :         dpll |= DPLL_VCO_ENABLE;
   10105                 :            : 
   10106                 :            :         crtc_state->dpll_hw_state.dpll = dpll;
   10107                 :            :         crtc_state->dpll_hw_state.fp0 = fp;
   10108                 :            :         crtc_state->dpll_hw_state.fp1 = fp2;
   10109                 :            : }
   10110                 :            : 
   10111                 :          0 : static int ilk_crtc_compute_clock(struct intel_crtc *crtc,
   10112                 :            :                                   struct intel_crtc_state *crtc_state)
   10113                 :            : {
   10114         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10115                 :          0 :         struct intel_atomic_state *state =
   10116                 :          0 :                 to_intel_atomic_state(crtc_state->uapi.state);
   10117                 :          0 :         const struct intel_limit *limit;
   10118                 :          0 :         int refclk = 120000;
   10119                 :            : 
   10120                 :          0 :         memset(&crtc_state->dpll_hw_state, 0,
   10121                 :            :                sizeof(crtc_state->dpll_hw_state));
   10122                 :            : 
   10123                 :            :         /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
   10124         [ #  # ]:          0 :         if (!crtc_state->has_pch_encoder)
   10125                 :            :                 return 0;
   10126                 :            : 
   10127         [ #  # ]:          0 :         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   10128   [ #  #  #  # ]:          0 :                 if (intel_panel_use_ssc(dev_priv)) {
   10129                 :          0 :                         DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n",
   10130                 :            :                                       dev_priv->vbt.lvds_ssc_freq);
   10131                 :          0 :                         refclk = dev_priv->vbt.lvds_ssc_freq;
   10132                 :            :                 }
   10133                 :            : 
   10134         [ #  # ]:          0 :                 if (intel_is_dual_link_lvds(dev_priv)) {
   10135         [ #  # ]:          0 :                         if (refclk == 100000)
   10136                 :            :                                 limit = &ilk_limits_dual_lvds_100m;
   10137                 :            :                         else
   10138                 :          0 :                                 limit = &ilk_limits_dual_lvds;
   10139                 :            :                 } else {
   10140         [ #  # ]:          0 :                         if (refclk == 100000)
   10141                 :            :                                 limit = &ilk_limits_single_lvds_100m;
   10142                 :            :                         else
   10143                 :          0 :                                 limit = &ilk_limits_single_lvds;
   10144                 :            :                 }
   10145                 :            :         } else {
   10146                 :            :                 limit = &ilk_limits_dac;
   10147                 :            :         }
   10148                 :            : 
   10149   [ #  #  #  # ]:          0 :         if (!crtc_state->clock_set &&
   10150                 :          0 :             !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   10151                 :            :                                 refclk, NULL, &crtc_state->dpll)) {
   10152                 :          0 :                 DRM_ERROR("Couldn't find PLL settings for mode!\n");
   10153                 :          0 :                 return -EINVAL;
   10154                 :            :         }
   10155                 :            : 
   10156                 :          0 :         ilk_compute_dpll(crtc, crtc_state, NULL);
   10157                 :            : 
   10158         [ #  # ]:          0 :         if (!intel_reserve_shared_dplls(state, crtc, NULL)) {
   10159                 :          0 :                 DRM_DEBUG_KMS("failed to find PLL for pipe %c\n",
   10160                 :            :                               pipe_name(crtc->pipe));
   10161                 :          0 :                 return -EINVAL;
   10162                 :            :         }
   10163                 :            : 
   10164                 :            :         return 0;
   10165                 :            : }
   10166                 :            : 
   10167                 :            : static void intel_pch_transcoder_get_m_n(struct intel_crtc *crtc,
   10168                 :            :                                          struct intel_link_m_n *m_n)
   10169                 :            : {
   10170                 :            :         struct drm_device *dev = crtc->base.dev;
   10171                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   10172                 :            :         enum pipe pipe = crtc->pipe;
   10173                 :            : 
   10174                 :            :         m_n->link_m = I915_READ(PCH_TRANS_LINK_M1(pipe));
   10175                 :            :         m_n->link_n = I915_READ(PCH_TRANS_LINK_N1(pipe));
   10176                 :            :         m_n->gmch_m = I915_READ(PCH_TRANS_DATA_M1(pipe))
   10177                 :            :                 & ~TU_SIZE_MASK;
   10178                 :            :         m_n->gmch_n = I915_READ(PCH_TRANS_DATA_N1(pipe));
   10179                 :            :         m_n->tu = ((I915_READ(PCH_TRANS_DATA_M1(pipe))
   10180                 :            :                     & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10181                 :            : }
   10182                 :            : 
   10183                 :            : static void intel_cpu_transcoder_get_m_n(struct intel_crtc *crtc,
   10184                 :            :                                          enum transcoder transcoder,
   10185                 :            :                                          struct intel_link_m_n *m_n,
   10186                 :            :                                          struct intel_link_m_n *m2_n2)
   10187                 :            : {
   10188                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10189                 :            :         enum pipe pipe = crtc->pipe;
   10190                 :            : 
   10191                 :            :         if (INTEL_GEN(dev_priv) >= 5) {
   10192                 :            :                 m_n->link_m = I915_READ(PIPE_LINK_M1(transcoder));
   10193                 :            :                 m_n->link_n = I915_READ(PIPE_LINK_N1(transcoder));
   10194                 :            :                 m_n->gmch_m = I915_READ(PIPE_DATA_M1(transcoder))
   10195                 :            :                         & ~TU_SIZE_MASK;
   10196                 :            :                 m_n->gmch_n = I915_READ(PIPE_DATA_N1(transcoder));
   10197                 :            :                 m_n->tu = ((I915_READ(PIPE_DATA_M1(transcoder))
   10198                 :            :                             & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10199                 :            : 
   10200                 :            :                 if (m2_n2 && transcoder_has_m2_n2(dev_priv, transcoder)) {
   10201                 :            :                         m2_n2->link_m = I915_READ(PIPE_LINK_M2(transcoder));
   10202                 :            :                         m2_n2->link_n =      I915_READ(PIPE_LINK_N2(transcoder));
   10203                 :            :                         m2_n2->gmch_m =      I915_READ(PIPE_DATA_M2(transcoder))
   10204                 :            :                                         & ~TU_SIZE_MASK;
   10205                 :            :                         m2_n2->gmch_n =      I915_READ(PIPE_DATA_N2(transcoder));
   10206                 :            :                         m2_n2->tu = ((I915_READ(PIPE_DATA_M2(transcoder))
   10207                 :            :                                         & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10208                 :            :                 }
   10209                 :            :         } else {
   10210                 :            :                 m_n->link_m = I915_READ(PIPE_LINK_M_G4X(pipe));
   10211                 :            :                 m_n->link_n = I915_READ(PIPE_LINK_N_G4X(pipe));
   10212                 :            :                 m_n->gmch_m = I915_READ(PIPE_DATA_M_G4X(pipe))
   10213                 :            :                         & ~TU_SIZE_MASK;
   10214                 :            :                 m_n->gmch_n = I915_READ(PIPE_DATA_N_G4X(pipe));
   10215                 :            :                 m_n->tu = ((I915_READ(PIPE_DATA_M_G4X(pipe))
   10216                 :            :                             & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10217                 :            :         }
   10218                 :            : }
   10219                 :            : 
   10220                 :          0 : void intel_dp_get_m_n(struct intel_crtc *crtc,
   10221                 :            :                       struct intel_crtc_state *pipe_config)
   10222                 :            : {
   10223         [ #  # ]:          0 :         if (pipe_config->has_pch_encoder)
   10224                 :          0 :                 intel_pch_transcoder_get_m_n(crtc, &pipe_config->dp_m_n);
   10225                 :            :         else
   10226                 :          0 :                 intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
   10227                 :            :                                              &pipe_config->dp_m_n,
   10228                 :            :                                              &pipe_config->dp_m2_n2);
   10229                 :          0 : }
   10230                 :            : 
   10231                 :          0 : static void ilk_get_fdi_m_n_config(struct intel_crtc *crtc,
   10232                 :            :                                    struct intel_crtc_state *pipe_config)
   10233                 :            : {
   10234                 :          0 :         intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
   10235                 :            :                                      &pipe_config->fdi_m_n, NULL);
   10236                 :            : }
   10237                 :            : 
   10238                 :          0 : static void skl_get_pfit_config(struct intel_crtc *crtc,
   10239                 :            :                                 struct intel_crtc_state *pipe_config)
   10240                 :            : {
   10241                 :          0 :         struct drm_device *dev = crtc->base.dev;
   10242                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   10243                 :          0 :         struct intel_crtc_scaler_state *scaler_state = &pipe_config->scaler_state;
   10244                 :          0 :         u32 ps_ctrl = 0;
   10245                 :          0 :         int id = -1;
   10246                 :          0 :         int i;
   10247                 :            : 
   10248                 :            :         /* find scaler attached to this pipe */
   10249         [ #  # ]:          0 :         for (i = 0; i < crtc->num_scalers; i++) {
   10250                 :          0 :                 ps_ctrl = I915_READ(SKL_PS_CTRL(crtc->pipe, i));
   10251   [ #  #  #  # ]:          0 :                 if (ps_ctrl & PS_SCALER_EN && !(ps_ctrl & PS_PLANE_SEL_MASK)) {
   10252                 :          0 :                         id = i;
   10253                 :          0 :                         pipe_config->pch_pfit.enabled = true;
   10254                 :          0 :                         pipe_config->pch_pfit.pos = I915_READ(SKL_PS_WIN_POS(crtc->pipe, i));
   10255                 :          0 :                         pipe_config->pch_pfit.size = I915_READ(SKL_PS_WIN_SZ(crtc->pipe, i));
   10256                 :          0 :                         scaler_state->scalers[i].in_use = true;
   10257                 :          0 :                         break;
   10258                 :            :                 }
   10259                 :            :         }
   10260                 :            : 
   10261                 :          0 :         scaler_state->scaler_id = id;
   10262         [ #  # ]:          0 :         if (id >= 0) {
   10263                 :          0 :                 scaler_state->scaler_users |= (1 << SKL_CRTC_INDEX);
   10264                 :            :         } else {
   10265                 :          0 :                 scaler_state->scaler_users &= ~(1 << SKL_CRTC_INDEX);
   10266                 :            :         }
   10267                 :          0 : }
   10268                 :            : 
   10269                 :            : static void
   10270                 :          0 : skl_get_initial_plane_config(struct intel_crtc *crtc,
   10271                 :            :                              struct intel_initial_plane_config *plane_config)
   10272                 :            : {
   10273                 :          0 :         struct drm_device *dev = crtc->base.dev;
   10274                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   10275                 :          0 :         struct intel_plane *plane = to_intel_plane(crtc->base.primary);
   10276                 :          0 :         enum plane_id plane_id = plane->id;
   10277                 :          0 :         enum pipe pipe;
   10278                 :          0 :         u32 val, base, offset, stride_mult, tiling, alpha;
   10279                 :          0 :         int fourcc, pixel_format;
   10280                 :          0 :         unsigned int aligned_height;
   10281                 :          0 :         struct drm_framebuffer *fb;
   10282                 :          0 :         struct intel_framebuffer *intel_fb;
   10283                 :            : 
   10284         [ #  # ]:          0 :         if (!plane->get_hw_state(plane, &pipe))
   10285                 :          0 :                 return;
   10286                 :            : 
   10287         [ #  # ]:          0 :         WARN_ON(pipe != crtc->pipe);
   10288                 :            : 
   10289                 :          0 :         intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
   10290         [ #  # ]:          0 :         if (!intel_fb) {
   10291                 :          0 :                 DRM_DEBUG_KMS("failed to alloc fb\n");
   10292                 :          0 :                 return;
   10293                 :            :         }
   10294                 :            : 
   10295                 :          0 :         fb = &intel_fb->base;
   10296                 :            : 
   10297                 :          0 :         fb->dev = dev;
   10298                 :            : 
   10299                 :          0 :         val = I915_READ(PLANE_CTL(pipe, plane_id));
   10300                 :            : 
   10301         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
   10302                 :          0 :                 pixel_format = val & ICL_PLANE_CTL_FORMAT_MASK;
   10303                 :            :         else
   10304                 :          0 :                 pixel_format = val & PLANE_CTL_FORMAT_MASK;
   10305                 :            : 
   10306   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) {
   10307                 :          0 :                 alpha = I915_READ(PLANE_COLOR_CTL(pipe, plane_id));
   10308                 :          0 :                 alpha &= PLANE_COLOR_ALPHA_MASK;
   10309                 :            :         } else {
   10310                 :          0 :                 alpha = val & PLANE_CTL_ALPHA_MASK;
   10311                 :            :         }
   10312                 :            : 
   10313                 :          0 :         fourcc = skl_format_to_fourcc(pixel_format,
   10314                 :          0 :                                       val & PLANE_CTL_ORDER_RGBX, alpha);
   10315                 :          0 :         fb->format = drm_format_info(fourcc);
   10316                 :            : 
   10317                 :          0 :         tiling = val & PLANE_CTL_TILED_MASK;
   10318   [ #  #  #  #  :          0 :         switch (tiling) {
                      # ]
   10319                 :          0 :         case PLANE_CTL_TILED_LINEAR:
   10320                 :          0 :                 fb->modifier = DRM_FORMAT_MOD_LINEAR;
   10321                 :          0 :                 break;
   10322                 :          0 :         case PLANE_CTL_TILED_X:
   10323                 :          0 :                 plane_config->tiling = I915_TILING_X;
   10324                 :          0 :                 fb->modifier = I915_FORMAT_MOD_X_TILED;
   10325                 :          0 :                 break;
   10326                 :          0 :         case PLANE_CTL_TILED_Y:
   10327                 :          0 :                 plane_config->tiling = I915_TILING_Y;
   10328         [ #  # ]:          0 :                 if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
   10329                 :          0 :                         fb->modifier = INTEL_GEN(dev_priv) >= 12 ?
   10330         [ #  # ]:          0 :                                 I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS :
   10331                 :            :                                 I915_FORMAT_MOD_Y_TILED_CCS;
   10332         [ #  # ]:          0 :                 else if (val & PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE)
   10333                 :          0 :                         fb->modifier = I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
   10334                 :            :                 else
   10335                 :          0 :                         fb->modifier = I915_FORMAT_MOD_Y_TILED;
   10336                 :            :                 break;
   10337                 :          0 :         case PLANE_CTL_TILED_YF:
   10338         [ #  # ]:          0 :                 if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
   10339                 :          0 :                         fb->modifier = I915_FORMAT_MOD_Yf_TILED_CCS;
   10340                 :            :                 else
   10341                 :          0 :                         fb->modifier = I915_FORMAT_MOD_Yf_TILED;
   10342                 :            :                 break;
   10343                 :            :         default:
   10344                 :          0 :                 MISSING_CASE(tiling);
   10345                 :          0 :                 goto error;
   10346                 :            :         }
   10347                 :            : 
   10348                 :            :         /*
   10349                 :            :          * DRM_MODE_ROTATE_ is counter clockwise to stay compatible with Xrandr
   10350                 :            :          * while i915 HW rotation is clockwise, thats why this swapping.
   10351                 :            :          */
   10352   [ #  #  #  # ]:          0 :         switch (val & PLANE_CTL_ROTATE_MASK) {
   10353                 :          0 :         case PLANE_CTL_ROTATE_0:
   10354                 :          0 :                 plane_config->rotation = DRM_MODE_ROTATE_0;
   10355                 :          0 :                 break;
   10356                 :          0 :         case PLANE_CTL_ROTATE_90:
   10357                 :          0 :                 plane_config->rotation = DRM_MODE_ROTATE_270;
   10358                 :          0 :                 break;
   10359                 :          0 :         case PLANE_CTL_ROTATE_180:
   10360                 :          0 :                 plane_config->rotation = DRM_MODE_ROTATE_180;
   10361                 :          0 :                 break;
   10362                 :          0 :         case PLANE_CTL_ROTATE_270:
   10363                 :          0 :                 plane_config->rotation = DRM_MODE_ROTATE_90;
   10364                 :          0 :                 break;
   10365                 :            :         }
   10366                 :            : 
   10367         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 10 &&
   10368         [ #  # ]:          0 :             val & PLANE_CTL_FLIP_HORIZONTAL)
   10369                 :          0 :                 plane_config->rotation |= DRM_MODE_REFLECT_X;
   10370                 :            : 
   10371                 :          0 :         base = I915_READ(PLANE_SURF(pipe, plane_id)) & 0xfffff000;
   10372                 :          0 :         plane_config->base = base;
   10373                 :            : 
   10374                 :          0 :         offset = I915_READ(PLANE_OFFSET(pipe, plane_id));
   10375                 :            : 
   10376                 :          0 :         val = I915_READ(PLANE_SIZE(pipe, plane_id));
   10377                 :          0 :         fb->height = ((val >> 16) & 0xffff) + 1;
   10378                 :          0 :         fb->width = ((val >> 0) & 0xffff) + 1;
   10379                 :            : 
   10380                 :          0 :         val = I915_READ(PLANE_STRIDE(pipe, plane_id));
   10381                 :          0 :         stride_mult = skl_plane_stride_mult(fb, 0, DRM_MODE_ROTATE_0);
   10382                 :          0 :         fb->pitches[0] = (val & 0x3ff) * stride_mult;
   10383                 :            : 
   10384                 :          0 :         aligned_height = intel_fb_align_height(fb, 0, fb->height);
   10385                 :            : 
   10386                 :          0 :         plane_config->size = fb->pitches[0] * aligned_height;
   10387                 :            : 
   10388                 :          0 :         DRM_DEBUG_KMS("%s/%s with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
   10389                 :            :                       crtc->base.name, plane->base.name, fb->width, fb->height,
   10390                 :            :                       fb->format->cpp[0] * 8, base, fb->pitches[0],
   10391                 :            :                       plane_config->size);
   10392                 :            : 
   10393                 :          0 :         plane_config->fb = intel_fb;
   10394                 :          0 :         return;
   10395                 :            : 
   10396                 :            : error:
   10397                 :          0 :         kfree(intel_fb);
   10398                 :            : }
   10399                 :            : 
   10400                 :            : static void ilk_get_pfit_config(struct intel_crtc *crtc,
   10401                 :            :                                 struct intel_crtc_state *pipe_config)
   10402                 :            : {
   10403                 :            :         struct drm_device *dev = crtc->base.dev;
   10404                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   10405                 :            :         u32 tmp;
   10406                 :            : 
   10407                 :            :         tmp = I915_READ(PF_CTL(crtc->pipe));
   10408                 :            : 
   10409                 :            :         if (tmp & PF_ENABLE) {
   10410                 :            :                 pipe_config->pch_pfit.enabled = true;
   10411                 :            :                 pipe_config->pch_pfit.pos = I915_READ(PF_WIN_POS(crtc->pipe));
   10412                 :            :                 pipe_config->pch_pfit.size = I915_READ(PF_WIN_SZ(crtc->pipe));
   10413                 :            : 
   10414                 :            :                 /* We currently do not free assignements of panel fitters on
   10415                 :            :                  * ivb/hsw (since we don't use the higher upscaling modes which
   10416                 :            :                  * differentiates them) so just WARN about this case for now. */
   10417                 :            :                 if (IS_GEN(dev_priv, 7)) {
   10418                 :            :                         WARN_ON((tmp & PF_PIPE_SEL_MASK_IVB) !=
   10419                 :            :                                 PF_PIPE_SEL_IVB(crtc->pipe));
   10420                 :            :                 }
   10421                 :            :         }
   10422                 :            : }
   10423                 :            : 
   10424                 :          0 : static bool ilk_get_pipe_config(struct intel_crtc *crtc,
   10425                 :            :                                 struct intel_crtc_state *pipe_config)
   10426                 :            : {
   10427                 :          0 :         struct drm_device *dev = crtc->base.dev;
   10428                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   10429                 :          0 :         enum intel_display_power_domain power_domain;
   10430                 :          0 :         intel_wakeref_t wakeref;
   10431                 :          0 :         u32 tmp;
   10432                 :          0 :         bool ret;
   10433                 :            : 
   10434                 :          0 :         power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
   10435                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10436         [ #  # ]:          0 :         if (!wakeref)
   10437                 :            :                 return false;
   10438                 :            : 
   10439                 :          0 :         pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
   10440                 :          0 :         pipe_config->shared_dpll = NULL;
   10441                 :          0 :         pipe_config->master_transcoder = INVALID_TRANSCODER;
   10442                 :            : 
   10443                 :          0 :         ret = false;
   10444                 :          0 :         tmp = I915_READ(PIPECONF(crtc->pipe));
   10445         [ #  # ]:          0 :         if (!(tmp & PIPECONF_ENABLE))
   10446                 :          0 :                 goto out;
   10447                 :            : 
   10448   [ #  #  #  #  :          0 :         switch (tmp & PIPECONF_BPC_MASK) {
                      # ]
   10449                 :          0 :         case PIPECONF_6BPC:
   10450                 :          0 :                 pipe_config->pipe_bpp = 18;
   10451                 :          0 :                 break;
   10452                 :          0 :         case PIPECONF_8BPC:
   10453                 :          0 :                 pipe_config->pipe_bpp = 24;
   10454                 :          0 :                 break;
   10455                 :          0 :         case PIPECONF_10BPC:
   10456                 :          0 :                 pipe_config->pipe_bpp = 30;
   10457                 :          0 :                 break;
   10458                 :          0 :         case PIPECONF_12BPC:
   10459                 :          0 :                 pipe_config->pipe_bpp = 36;
   10460                 :          0 :                 break;
   10461                 :            :         default:
   10462                 :            :                 break;
   10463                 :            :         }
   10464                 :            : 
   10465         [ #  # ]:          0 :         if (tmp & PIPECONF_COLOR_RANGE_SELECT)
   10466                 :          0 :                 pipe_config->limited_color_range = true;
   10467                 :            : 
   10468         [ #  # ]:          0 :         switch (tmp & PIPECONF_OUTPUT_COLORSPACE_MASK) {
   10469                 :          0 :         case PIPECONF_OUTPUT_COLORSPACE_YUV601:
   10470                 :            :         case PIPECONF_OUTPUT_COLORSPACE_YUV709:
   10471                 :          0 :                 pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
   10472                 :          0 :                 break;
   10473                 :          0 :         default:
   10474                 :          0 :                 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   10475                 :          0 :                 break;
   10476                 :            :         }
   10477                 :            : 
   10478                 :          0 :         pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_ILK) >>
   10479                 :            :                 PIPECONF_GAMMA_MODE_SHIFT;
   10480                 :            : 
   10481                 :          0 :         pipe_config->csc_mode = I915_READ(PIPE_CSC_MODE(crtc->pipe));
   10482                 :            : 
   10483                 :          0 :         i9xx_get_pipe_color_config(pipe_config);
   10484                 :          0 :         intel_color_get_config(pipe_config);
   10485                 :            : 
   10486         [ #  # ]:          0 :         if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
   10487                 :          0 :                 struct intel_shared_dpll *pll;
   10488                 :          0 :                 enum intel_dpll_id pll_id;
   10489                 :            : 
   10490                 :          0 :                 pipe_config->has_pch_encoder = true;
   10491                 :            : 
   10492                 :          0 :                 tmp = I915_READ(FDI_RX_CTL(crtc->pipe));
   10493                 :          0 :                 pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
   10494                 :          0 :                                           FDI_DP_PORT_WIDTH_SHIFT) + 1;
   10495                 :            : 
   10496                 :          0 :                 ilk_get_fdi_m_n_config(crtc, pipe_config);
   10497                 :            : 
   10498         [ #  # ]:          0 :                 if (HAS_PCH_IBX(dev_priv)) {
   10499                 :            :                         /*
   10500                 :            :                          * The pipe->pch transcoder and pch transcoder->pll
   10501                 :            :                          * mapping is fixed.
   10502                 :            :                          */
   10503                 :          0 :                         pll_id = (enum intel_dpll_id) crtc->pipe;
   10504                 :            :                 } else {
   10505                 :          0 :                         tmp = I915_READ(PCH_DPLL_SEL);
   10506         [ #  # ]:          0 :                         if (tmp & TRANS_DPLLB_SEL(crtc->pipe))
   10507                 :            :                                 pll_id = DPLL_ID_PCH_PLL_B;
   10508                 :            :                         else
   10509                 :          0 :                                 pll_id= DPLL_ID_PCH_PLL_A;
   10510                 :            :                 }
   10511                 :            : 
   10512                 :          0 :                 pipe_config->shared_dpll =
   10513                 :          0 :                         intel_get_shared_dpll_by_id(dev_priv, pll_id);
   10514                 :          0 :                 pll = pipe_config->shared_dpll;
   10515                 :            : 
   10516         [ #  # ]:          0 :                 WARN_ON(!pll->info->funcs->get_hw_state(dev_priv, pll,
   10517                 :            :                                                 &pipe_config->dpll_hw_state));
   10518                 :            : 
   10519                 :          0 :                 tmp = pipe_config->dpll_hw_state.dpll;
   10520                 :          0 :                 pipe_config->pixel_multiplier =
   10521                 :            :                         ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
   10522                 :          0 :                          >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
   10523                 :            : 
   10524                 :          0 :                 ilk_pch_clock_get(crtc, pipe_config);
   10525                 :            :         } else {
   10526                 :          0 :                 pipe_config->pixel_multiplier = 1;
   10527                 :            :         }
   10528                 :            : 
   10529                 :          0 :         intel_get_pipe_timings(crtc, pipe_config);
   10530                 :          0 :         intel_get_pipe_src_size(crtc, pipe_config);
   10531                 :            : 
   10532                 :          0 :         ilk_get_pfit_config(crtc, pipe_config);
   10533                 :            : 
   10534                 :          0 :         ret = true;
   10535                 :            : 
   10536                 :          0 : out:
   10537                 :          0 :         intel_display_power_put(dev_priv, power_domain, wakeref);
   10538                 :            : 
   10539                 :          0 :         return ret;
   10540                 :            : }
   10541                 :            : 
   10542                 :          0 : static int hsw_crtc_compute_clock(struct intel_crtc *crtc,
   10543                 :            :                                   struct intel_crtc_state *crtc_state)
   10544                 :            : {
   10545         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10546                 :          0 :         struct intel_atomic_state *state =
   10547                 :          0 :                 to_intel_atomic_state(crtc_state->uapi.state);
   10548                 :            : 
   10549         [ #  # ]:          0 :         if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) ||
   10550         [ #  # ]:          0 :             INTEL_GEN(dev_priv) >= 11) {
   10551                 :          0 :                 struct intel_encoder *encoder =
   10552                 :          0 :                         intel_get_crtc_new_encoder(state, crtc_state);
   10553                 :            : 
   10554         [ #  # ]:          0 :                 if (!intel_reserve_shared_dplls(state, crtc, encoder)) {
   10555                 :          0 :                         DRM_DEBUG_KMS("failed to find PLL for pipe %c\n",
   10556                 :            :                                       pipe_name(crtc->pipe));
   10557                 :          0 :                         return -EINVAL;
   10558                 :            :                 }
   10559                 :            :         }
   10560                 :            : 
   10561                 :            :         return 0;
   10562                 :            : }
   10563                 :            : 
   10564                 :            : static void cnl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10565                 :            :                             struct intel_crtc_state *pipe_config)
   10566                 :            : {
   10567                 :            :         enum intel_dpll_id id;
   10568                 :            :         u32 temp;
   10569                 :            : 
   10570                 :            :         temp = I915_READ(DPCLKA_CFGCR0) & DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port);
   10571                 :            :         id = temp >> DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port);
   10572                 :            : 
   10573                 :            :         if (WARN_ON(id < SKL_DPLL0 || id > SKL_DPLL2))
   10574                 :            :                 return;
   10575                 :            : 
   10576                 :            :         pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10577                 :            : }
   10578                 :            : 
   10579                 :          0 : static void icl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10580                 :            :                             struct intel_crtc_state *pipe_config)
   10581                 :            : {
   10582         [ #  # ]:          0 :         enum phy phy = intel_port_to_phy(dev_priv, port);
   10583                 :          0 :         enum icl_port_dpll_id port_dpll_id;
   10584                 :          0 :         enum intel_dpll_id id;
   10585                 :          0 :         u32 temp;
   10586                 :            : 
   10587   [ #  #  #  # ]:          0 :         if (intel_phy_is_combo(dev_priv, phy)) {
   10588                 :          0 :                 temp = I915_READ(ICL_DPCLKA_CFGCR0) &
   10589                 :          0 :                         ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy);
   10590                 :          0 :                 id = temp >> ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy);
   10591                 :          0 :                 port_dpll_id = ICL_PORT_DPLL_DEFAULT;
   10592   [ #  #  #  # ]:          0 :         } else if (intel_phy_is_tc(dev_priv, phy)) {
   10593                 :          0 :                 u32 clk_sel = I915_READ(DDI_CLK_SEL(port)) & DDI_CLK_SEL_MASK;
   10594                 :            : 
   10595         [ #  # ]:          0 :                 if (clk_sel == DDI_CLK_SEL_MG) {
   10596                 :          0 :                         id = icl_tc_port_to_pll_id(intel_port_to_tc(dev_priv,
   10597                 :            :                                                                     port));
   10598                 :          0 :                         port_dpll_id = ICL_PORT_DPLL_MG_PHY;
   10599                 :            :                 } else {
   10600         [ #  # ]:          0 :                         WARN_ON(clk_sel < DDI_CLK_SEL_TBT_162);
   10601                 :            :                         id = DPLL_ID_ICL_TBTPLL;
   10602                 :            :                         port_dpll_id = ICL_PORT_DPLL_DEFAULT;
   10603                 :            :                 }
   10604                 :            :         } else {
   10605                 :          0 :                 WARN(1, "Invalid port %x\n", port);
   10606                 :          0 :                 return;
   10607                 :            :         }
   10608                 :            : 
   10609                 :          0 :         pipe_config->icl_port_dplls[port_dpll_id].pll =
   10610                 :          0 :                 intel_get_shared_dpll_by_id(dev_priv, id);
   10611                 :            : 
   10612                 :          0 :         icl_set_active_port_dpll(pipe_config, port_dpll_id);
   10613                 :            : }
   10614                 :            : 
   10615                 :            : static void bxt_get_ddi_pll(struct drm_i915_private *dev_priv,
   10616                 :            :                                 enum port port,
   10617                 :            :                                 struct intel_crtc_state *pipe_config)
   10618                 :            : {
   10619                 :            :         enum intel_dpll_id id;
   10620                 :            : 
   10621                 :            :         switch (port) {
   10622                 :            :         case PORT_A:
   10623                 :            :                 id = DPLL_ID_SKL_DPLL0;
   10624                 :            :                 break;
   10625                 :            :         case PORT_B:
   10626                 :            :                 id = DPLL_ID_SKL_DPLL1;
   10627                 :            :                 break;
   10628                 :            :         case PORT_C:
   10629                 :            :                 id = DPLL_ID_SKL_DPLL2;
   10630                 :            :                 break;
   10631                 :            :         default:
   10632                 :            :                 DRM_ERROR("Incorrect port type\n");
   10633                 :            :                 return;
   10634                 :            :         }
   10635                 :            : 
   10636                 :            :         pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10637                 :            : }
   10638                 :            : 
   10639                 :            : static void skl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10640                 :            :                             struct intel_crtc_state *pipe_config)
   10641                 :            : {
   10642                 :            :         enum intel_dpll_id id;
   10643                 :            :         u32 temp;
   10644                 :            : 
   10645                 :            :         temp = I915_READ(DPLL_CTRL2) & DPLL_CTRL2_DDI_CLK_SEL_MASK(port);
   10646                 :            :         id = temp >> (port * 3 + 1);
   10647                 :            : 
   10648                 :            :         if (WARN_ON(id < SKL_DPLL0 || id > SKL_DPLL3))
   10649                 :            :                 return;
   10650                 :            : 
   10651                 :            :         pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10652                 :            : }
   10653                 :            : 
   10654                 :            : static void hsw_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10655                 :            :                             struct intel_crtc_state *pipe_config)
   10656                 :            : {
   10657                 :            :         enum intel_dpll_id id;
   10658                 :            :         u32 ddi_pll_sel = I915_READ(PORT_CLK_SEL(port));
   10659                 :            : 
   10660                 :            :         switch (ddi_pll_sel) {
   10661                 :            :         case PORT_CLK_SEL_WRPLL1:
   10662                 :            :                 id = DPLL_ID_WRPLL1;
   10663                 :            :                 break;
   10664                 :            :         case PORT_CLK_SEL_WRPLL2:
   10665                 :            :                 id = DPLL_ID_WRPLL2;
   10666                 :            :                 break;
   10667                 :            :         case PORT_CLK_SEL_SPLL:
   10668                 :            :                 id = DPLL_ID_SPLL;
   10669                 :            :                 break;
   10670                 :            :         case PORT_CLK_SEL_LCPLL_810:
   10671                 :            :                 id = DPLL_ID_LCPLL_810;
   10672                 :            :                 break;
   10673                 :            :         case PORT_CLK_SEL_LCPLL_1350:
   10674                 :            :                 id = DPLL_ID_LCPLL_1350;
   10675                 :            :                 break;
   10676                 :            :         case PORT_CLK_SEL_LCPLL_2700:
   10677                 :            :                 id = DPLL_ID_LCPLL_2700;
   10678                 :            :                 break;
   10679                 :            :         default:
   10680                 :            :                 MISSING_CASE(ddi_pll_sel);
   10681                 :            :                 /* fall through */
   10682                 :            :         case PORT_CLK_SEL_NONE:
   10683                 :            :                 return;
   10684                 :            :         }
   10685                 :            : 
   10686                 :            :         pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10687                 :            : }
   10688                 :            : 
   10689                 :            : static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
   10690                 :            :                                      struct intel_crtc_state *pipe_config,
   10691                 :            :                                      u64 *power_domain_mask,
   10692                 :            :                                      intel_wakeref_t *wakerefs)
   10693                 :            : {
   10694                 :            :         struct drm_device *dev = crtc->base.dev;
   10695                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   10696                 :            :         enum intel_display_power_domain power_domain;
   10697                 :            :         unsigned long panel_transcoder_mask = 0;
   10698                 :            :         unsigned long enabled_panel_transcoders = 0;
   10699                 :            :         enum transcoder panel_transcoder;
   10700                 :            :         intel_wakeref_t wf;
   10701                 :            :         u32 tmp;
   10702                 :            : 
   10703                 :            :         if (INTEL_GEN(dev_priv) >= 11)
   10704                 :            :                 panel_transcoder_mask |=
   10705                 :            :                         BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1);
   10706                 :            : 
   10707                 :            :         if (HAS_TRANSCODER_EDP(dev_priv))
   10708                 :            :                 panel_transcoder_mask |= BIT(TRANSCODER_EDP);
   10709                 :            : 
   10710                 :            :         /*
   10711                 :            :          * The pipe->transcoder mapping is fixed with the exception of the eDP
   10712                 :            :          * and DSI transcoders handled below.
   10713                 :            :          */
   10714                 :            :         pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
   10715                 :            : 
   10716                 :            :         /*
   10717                 :            :          * XXX: Do intel_display_power_get_if_enabled before reading this (for
   10718                 :            :          * consistency and less surprising code; it's in always on power).
   10719                 :            :          */
   10720                 :            :         for_each_set_bit(panel_transcoder,
   10721                 :            :                          &panel_transcoder_mask,
   10722                 :            :                          ARRAY_SIZE(INTEL_INFO(dev_priv)->trans_offsets)) {
   10723                 :            :                 bool force_thru = false;
   10724                 :            :                 enum pipe trans_pipe;
   10725                 :            : 
   10726                 :            :                 tmp = I915_READ(TRANS_DDI_FUNC_CTL(panel_transcoder));
   10727                 :            :                 if (!(tmp & TRANS_DDI_FUNC_ENABLE))
   10728                 :            :                         continue;
   10729                 :            : 
   10730                 :            :                 /*
   10731                 :            :                  * Log all enabled ones, only use the first one.
   10732                 :            :                  *
   10733                 :            :                  * FIXME: This won't work for two separate DSI displays.
   10734                 :            :                  */
   10735                 :            :                 enabled_panel_transcoders |= BIT(panel_transcoder);
   10736                 :            :                 if (enabled_panel_transcoders != BIT(panel_transcoder))
   10737                 :            :                         continue;
   10738                 :            : 
   10739                 :            :                 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
   10740                 :            :                 default:
   10741                 :            :                         WARN(1, "unknown pipe linked to transcoder %s\n",
   10742                 :            :                              transcoder_name(panel_transcoder));
   10743                 :            :                         /* fall through */
   10744                 :            :                 case TRANS_DDI_EDP_INPUT_A_ONOFF:
   10745                 :            :                         force_thru = true;
   10746                 :            :                         /* fall through */
   10747                 :            :                 case TRANS_DDI_EDP_INPUT_A_ON:
   10748                 :            :                         trans_pipe = PIPE_A;
   10749                 :            :                         break;
   10750                 :            :                 case TRANS_DDI_EDP_INPUT_B_ONOFF:
   10751                 :            :                         trans_pipe = PIPE_B;
   10752                 :            :                         break;
   10753                 :            :                 case TRANS_DDI_EDP_INPUT_C_ONOFF:
   10754                 :            :                         trans_pipe = PIPE_C;
   10755                 :            :                         break;
   10756                 :            :                 case TRANS_DDI_EDP_INPUT_D_ONOFF:
   10757                 :            :                         trans_pipe = PIPE_D;
   10758                 :            :                         break;
   10759                 :            :                 }
   10760                 :            : 
   10761                 :            :                 if (trans_pipe == crtc->pipe) {
   10762                 :            :                         pipe_config->cpu_transcoder = panel_transcoder;
   10763                 :            :                         pipe_config->pch_pfit.force_thru = force_thru;
   10764                 :            :                 }
   10765                 :            :         }
   10766                 :            : 
   10767                 :            :         /*
   10768                 :            :          * Valid combos: none, eDP, DSI0, DSI1, DSI0+DSI1
   10769                 :            :          */
   10770                 :            :         WARN_ON((enabled_panel_transcoders & BIT(TRANSCODER_EDP)) &&
   10771                 :            :                 enabled_panel_transcoders != BIT(TRANSCODER_EDP));
   10772                 :            : 
   10773                 :            :         power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
   10774                 :            :         WARN_ON(*power_domain_mask & BIT_ULL(power_domain));
   10775                 :            : 
   10776                 :            :         wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10777                 :            :         if (!wf)
   10778                 :            :                 return false;
   10779                 :            : 
   10780                 :            :         wakerefs[power_domain] = wf;
   10781                 :            :         *power_domain_mask |= BIT_ULL(power_domain);
   10782                 :            : 
   10783                 :            :         tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
   10784                 :            : 
   10785                 :            :         return tmp & PIPECONF_ENABLE;
   10786                 :            : }
   10787                 :            : 
   10788                 :            : static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
   10789                 :            :                                          struct intel_crtc_state *pipe_config,
   10790                 :            :                                          u64 *power_domain_mask,
   10791                 :            :                                          intel_wakeref_t *wakerefs)
   10792                 :            : {
   10793                 :            :         struct drm_device *dev = crtc->base.dev;
   10794                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   10795                 :            :         enum intel_display_power_domain power_domain;
   10796                 :            :         enum transcoder cpu_transcoder;
   10797                 :            :         intel_wakeref_t wf;
   10798                 :            :         enum port port;
   10799                 :            :         u32 tmp;
   10800                 :            : 
   10801                 :            :         for_each_port_masked(port, BIT(PORT_A) | BIT(PORT_C)) {
   10802                 :            :                 if (port == PORT_A)
   10803                 :            :                         cpu_transcoder = TRANSCODER_DSI_A;
   10804                 :            :                 else
   10805                 :            :                         cpu_transcoder = TRANSCODER_DSI_C;
   10806                 :            : 
   10807                 :            :                 power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
   10808                 :            :                 WARN_ON(*power_domain_mask & BIT_ULL(power_domain));
   10809                 :            : 
   10810                 :            :                 wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10811                 :            :                 if (!wf)
   10812                 :            :                         continue;
   10813                 :            : 
   10814                 :            :                 wakerefs[power_domain] = wf;
   10815                 :            :                 *power_domain_mask |= BIT_ULL(power_domain);
   10816                 :            : 
   10817                 :            :                 /*
   10818                 :            :                  * The PLL needs to be enabled with a valid divider
   10819                 :            :                  * configuration, otherwise accessing DSI registers will hang
   10820                 :            :                  * the machine. See BSpec North Display Engine
   10821                 :            :                  * registers/MIPI[BXT]. We can break out here early, since we
   10822                 :            :                  * need the same DSI PLL to be enabled for both DSI ports.
   10823                 :            :                  */
   10824                 :            :                 if (!bxt_dsi_pll_is_enabled(dev_priv))
   10825                 :            :                         break;
   10826                 :            : 
   10827                 :            :                 /* XXX: this works for video mode only */
   10828                 :            :                 tmp = I915_READ(BXT_MIPI_PORT_CTRL(port));
   10829                 :            :                 if (!(tmp & DPI_ENABLE))
   10830                 :            :                         continue;
   10831                 :            : 
   10832                 :            :                 tmp = I915_READ(MIPI_CTRL(port));
   10833                 :            :                 if ((tmp & BXT_PIPE_SELECT_MASK) != BXT_PIPE_SELECT(crtc->pipe))
   10834                 :            :                         continue;
   10835                 :            : 
   10836                 :            :                 pipe_config->cpu_transcoder = cpu_transcoder;
   10837                 :            :                 break;
   10838                 :            :         }
   10839                 :            : 
   10840                 :            :         return transcoder_is_dsi(pipe_config->cpu_transcoder);
   10841                 :            : }
   10842                 :            : 
   10843                 :          0 : static void hsw_get_ddi_port_state(struct intel_crtc *crtc,
   10844                 :            :                                    struct intel_crtc_state *pipe_config)
   10845                 :            : {
   10846         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10847                 :          0 :         enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
   10848                 :          0 :         struct intel_shared_dpll *pll;
   10849                 :          0 :         enum port port;
   10850                 :          0 :         u32 tmp;
   10851                 :            : 
   10852         [ #  # ]:          0 :         if (transcoder_is_dsi(cpu_transcoder)) {
   10853                 :          0 :                 port = (cpu_transcoder == TRANSCODER_DSI_A) ?
   10854                 :          0 :                                                 PORT_A : PORT_B;
   10855                 :            :         } else {
   10856                 :          0 :                 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
   10857         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 12)
   10858                 :          0 :                         port = TGL_TRANS_DDI_FUNC_CTL_VAL_TO_PORT(tmp);
   10859                 :            :                 else
   10860                 :          0 :                         port = TRANS_DDI_FUNC_CTL_VAL_TO_PORT(tmp);
   10861                 :            :         }
   10862                 :            : 
   10863         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
   10864                 :          0 :                 icl_get_ddi_pll(dev_priv, port, pipe_config);
   10865         [ #  # ]:          0 :         else if (IS_CANNONLAKE(dev_priv))
   10866                 :          0 :                 cnl_get_ddi_pll(dev_priv, port, pipe_config);
   10867   [ #  #  #  # ]:          0 :         else if (IS_GEN9_BC(dev_priv))
   10868                 :          0 :                 skl_get_ddi_pll(dev_priv, port, pipe_config);
   10869   [ #  #  #  # ]:          0 :         else if (IS_GEN9_LP(dev_priv))
   10870                 :          0 :                 bxt_get_ddi_pll(dev_priv, port, pipe_config);
   10871                 :            :         else
   10872                 :          0 :                 hsw_get_ddi_pll(dev_priv, port, pipe_config);
   10873                 :            : 
   10874                 :          0 :         pll = pipe_config->shared_dpll;
   10875         [ #  # ]:          0 :         if (pll) {
   10876         [ #  # ]:          0 :                 WARN_ON(!pll->info->funcs->get_hw_state(dev_priv, pll,
   10877                 :            :                                                 &pipe_config->dpll_hw_state));
   10878                 :            :         }
   10879                 :            : 
   10880                 :            :         /*
   10881                 :            :          * Haswell has only FDI/PCH transcoder A. It is which is connected to
   10882                 :            :          * DDI E. So just check whether this pipe is wired to DDI E and whether
   10883                 :            :          * the PCH transcoder is on.
   10884                 :            :          */
   10885   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9 &&
   10886         [ #  # ]:          0 :             (port == PORT_E) && I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) {
   10887                 :          0 :                 pipe_config->has_pch_encoder = true;
   10888                 :            : 
   10889                 :          0 :                 tmp = I915_READ(FDI_RX_CTL(PIPE_A));
   10890                 :          0 :                 pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
   10891                 :          0 :                                           FDI_DP_PORT_WIDTH_SHIFT) + 1;
   10892                 :            : 
   10893                 :          0 :                 ilk_get_fdi_m_n_config(crtc, pipe_config);
   10894                 :            :         }
   10895                 :          0 : }
   10896                 :            : 
   10897                 :          0 : static enum transcoder transcoder_master_readout(struct drm_i915_private *dev_priv,
   10898                 :            :                                                  enum transcoder cpu_transcoder)
   10899                 :            : {
   10900                 :          0 :         u32 trans_port_sync, master_select;
   10901                 :            : 
   10902                 :          0 :         trans_port_sync = I915_READ(TRANS_DDI_FUNC_CTL2(cpu_transcoder));
   10903                 :            : 
   10904         [ #  # ]:          0 :         if ((trans_port_sync & PORT_SYNC_MODE_ENABLE) == 0)
   10905                 :            :                 return INVALID_TRANSCODER;
   10906                 :            : 
   10907                 :          0 :         master_select = trans_port_sync &
   10908                 :            :                         PORT_SYNC_MODE_MASTER_SELECT_MASK;
   10909         [ #  # ]:          0 :         if (master_select == 0)
   10910                 :            :                 return TRANSCODER_EDP;
   10911                 :            :         else
   10912                 :          0 :                 return master_select - 1;
   10913                 :            : }
   10914                 :            : 
   10915                 :          0 : static void icl_get_trans_port_sync_config(struct intel_crtc_state *crtc_state)
   10916                 :            : {
   10917                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   10918                 :          0 :         u32 transcoders;
   10919                 :          0 :         enum transcoder cpu_transcoder;
   10920                 :            : 
   10921                 :          0 :         crtc_state->master_transcoder = transcoder_master_readout(dev_priv,
   10922                 :            :                                                                   crtc_state->cpu_transcoder);
   10923                 :            : 
   10924                 :          0 :         transcoders = BIT(TRANSCODER_A) |
   10925                 :            :                 BIT(TRANSCODER_B) |
   10926                 :            :                 BIT(TRANSCODER_C) |
   10927                 :            :                 BIT(TRANSCODER_D);
   10928   [ #  #  #  # ]:          0 :         for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
   10929                 :          0 :                 enum intel_display_power_domain power_domain;
   10930                 :          0 :                 intel_wakeref_t trans_wakeref;
   10931                 :            : 
   10932         [ #  # ]:          0 :                 power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
   10933                 :          0 :                 trans_wakeref = intel_display_power_get_if_enabled(dev_priv,
   10934                 :            :                                                                    power_domain);
   10935                 :            : 
   10936         [ #  # ]:          0 :                 if (!trans_wakeref)
   10937                 :          0 :                         continue;
   10938                 :            : 
   10939                 :          0 :                 if (transcoder_master_readout(dev_priv, cpu_transcoder) ==
   10940         [ #  # ]:          0 :                     crtc_state->cpu_transcoder)
   10941                 :          0 :                         crtc_state->sync_mode_slaves_mask |= BIT(cpu_transcoder);
   10942                 :            : 
   10943                 :          0 :                 intel_display_power_put(dev_priv, power_domain, trans_wakeref);
   10944                 :            :         }
   10945                 :            : 
   10946   [ #  #  #  #  :          0 :         WARN_ON(crtc_state->master_transcoder != INVALID_TRANSCODER &&
                   #  # ]
   10947                 :            :                 crtc_state->sync_mode_slaves_mask);
   10948                 :          0 : }
   10949                 :            : 
   10950                 :          0 : static bool hsw_get_pipe_config(struct intel_crtc *crtc,
   10951                 :            :                                 struct intel_crtc_state *pipe_config)
   10952                 :            : {
   10953                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10954                 :          0 :         intel_wakeref_t wakerefs[POWER_DOMAIN_NUM], wf;
   10955                 :          0 :         enum intel_display_power_domain power_domain;
   10956                 :          0 :         u64 power_domain_mask;
   10957                 :          0 :         bool active;
   10958                 :            : 
   10959                 :          0 :         pipe_config->master_transcoder = INVALID_TRANSCODER;
   10960                 :            : 
   10961                 :          0 :         power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
   10962                 :          0 :         wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10963         [ #  # ]:          0 :         if (!wf)
   10964                 :            :                 return false;
   10965                 :            : 
   10966                 :          0 :         wakerefs[power_domain] = wf;
   10967                 :          0 :         power_domain_mask = BIT_ULL(power_domain);
   10968                 :            : 
   10969                 :          0 :         pipe_config->shared_dpll = NULL;
   10970                 :            : 
   10971                 :          0 :         active = hsw_get_transcoder_state(crtc, pipe_config,
   10972                 :            :                                           &power_domain_mask, wakerefs);
   10973                 :            : 
   10974   [ #  #  #  #  :          0 :         if (IS_GEN9_LP(dev_priv) &&
                   #  # ]
   10975                 :          0 :             bxt_get_dsi_transcoder_state(crtc, pipe_config,
   10976                 :            :                                          &power_domain_mask, wakerefs)) {
   10977         [ #  # ]:          0 :                 WARN_ON(active);
   10978                 :            :                 active = true;
   10979                 :            :         }
   10980                 :            : 
   10981         [ #  # ]:          0 :         if (!active)
   10982                 :          0 :                 goto out;
   10983                 :            : 
   10984         [ #  # ]:          0 :         if (!transcoder_is_dsi(pipe_config->cpu_transcoder) ||
   10985         [ #  # ]:          0 :             INTEL_GEN(dev_priv) >= 11) {
   10986                 :          0 :                 hsw_get_ddi_port_state(crtc, pipe_config);
   10987                 :          0 :                 intel_get_pipe_timings(crtc, pipe_config);
   10988                 :            :         }
   10989                 :            : 
   10990                 :          0 :         intel_get_pipe_src_size(crtc, pipe_config);
   10991                 :            : 
   10992         [ #  # ]:          0 :         if (IS_HASWELL(dev_priv)) {
   10993                 :          0 :                 u32 tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
   10994                 :            : 
   10995         [ #  # ]:          0 :                 if (tmp & PIPECONF_OUTPUT_COLORSPACE_YUV_HSW)
   10996                 :          0 :                         pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
   10997                 :            :                 else
   10998                 :          0 :                         pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   10999                 :            :         } else {
   11000                 :          0 :                 pipe_config->output_format =
   11001                 :          0 :                         bdw_get_pipemisc_output_format(crtc);
   11002                 :            : 
   11003                 :            :                 /*
   11004                 :            :                  * Currently there is no interface defined to
   11005                 :            :                  * check user preference between RGB/YCBCR444
   11006                 :            :                  * or YCBCR420. So the only possible case for
   11007                 :            :                  * YCBCR444 usage is driving YCBCR420 output
   11008                 :            :                  * with LSPCON, when pipe is configured for
   11009                 :            :                  * YCBCR444 output and LSPCON takes care of
   11010                 :            :                  * downsampling it.
   11011                 :            :                  */
   11012                 :          0 :                 pipe_config->lspcon_downsampling =
   11013                 :          0 :                         pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444;
   11014                 :            :         }
   11015                 :            : 
   11016                 :          0 :         pipe_config->gamma_mode = I915_READ(GAMMA_MODE(crtc->pipe));
   11017                 :            : 
   11018                 :          0 :         pipe_config->csc_mode = I915_READ(PIPE_CSC_MODE(crtc->pipe));
   11019                 :            : 
   11020         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9) {
   11021                 :          0 :                 u32 tmp = I915_READ(SKL_BOTTOM_COLOR(crtc->pipe));
   11022                 :            : 
   11023         [ #  # ]:          0 :                 if (tmp & SKL_BOTTOM_COLOR_GAMMA_ENABLE)
   11024                 :          0 :                         pipe_config->gamma_enable = true;
   11025                 :            : 
   11026         [ #  # ]:          0 :                 if (tmp & SKL_BOTTOM_COLOR_CSC_ENABLE)
   11027                 :          0 :                         pipe_config->csc_enable = true;
   11028                 :            :         } else {
   11029                 :          0 :                 i9xx_get_pipe_color_config(pipe_config);
   11030                 :            :         }
   11031                 :            : 
   11032                 :          0 :         intel_color_get_config(pipe_config);
   11033                 :            : 
   11034                 :          0 :         power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
   11035         [ #  # ]:          0 :         WARN_ON(power_domain_mask & BIT_ULL(power_domain));
   11036                 :            : 
   11037                 :          0 :         wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11038         [ #  # ]:          0 :         if (wf) {
   11039                 :          0 :                 wakerefs[power_domain] = wf;
   11040                 :          0 :                 power_domain_mask |= BIT_ULL(power_domain);
   11041                 :            : 
   11042         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 9)
   11043                 :          0 :                         skl_get_pfit_config(crtc, pipe_config);
   11044                 :            :                 else
   11045                 :          0 :                         ilk_get_pfit_config(crtc, pipe_config);
   11046                 :            :         }
   11047                 :            : 
   11048   [ #  #  #  # ]:          0 :         if (hsw_crtc_supports_ips(crtc)) {
   11049         [ #  # ]:          0 :                 if (IS_HASWELL(dev_priv))
   11050                 :          0 :                         pipe_config->ips_enabled = I915_READ(IPS_CTL) & IPS_ENABLE;
   11051                 :            :                 else {
   11052                 :            :                         /*
   11053                 :            :                          * We cannot readout IPS state on broadwell, set to
   11054                 :            :                          * true so we can set it to a defined state on first
   11055                 :            :                          * commit.
   11056                 :            :                          */
   11057                 :          0 :                         pipe_config->ips_enabled = true;
   11058                 :            :                 }
   11059                 :            :         }
   11060                 :            : 
   11061   [ #  #  #  # ]:          0 :         if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
   11062                 :          0 :             !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
   11063                 :          0 :                 pipe_config->pixel_multiplier =
   11064                 :          0 :                         I915_READ(PIPE_MULT(pipe_config->cpu_transcoder)) + 1;
   11065                 :            :         } else {
   11066                 :          0 :                 pipe_config->pixel_multiplier = 1;
   11067                 :            :         }
   11068                 :            : 
   11069   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11 &&
   11070         [ #  # ]:          0 :             !transcoder_is_dsi(pipe_config->cpu_transcoder))
   11071                 :          0 :                 icl_get_trans_port_sync_config(pipe_config);
   11072                 :            : 
   11073                 :          0 : out:
   11074   [ #  #  #  # ]:          0 :         for_each_power_domain(power_domain, power_domain_mask)
   11075                 :          0 :                 intel_display_power_put(dev_priv,
   11076                 :            :                                         power_domain, wakerefs[power_domain]);
   11077                 :            : 
   11078                 :            :         return active;
   11079                 :            : }
   11080                 :            : 
   11081                 :          0 : static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
   11082                 :            : {
   11083                 :          0 :         struct drm_i915_private *dev_priv =
   11084                 :          0 :                 to_i915(plane_state->uapi.plane->dev);
   11085                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
   11086   [ #  #  #  # ]:          0 :         const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   11087                 :          0 :         u32 base;
   11088                 :            : 
   11089   [ #  #  #  # ]:          0 :         if (INTEL_INFO(dev_priv)->display.cursor_needs_physical)
   11090                 :          0 :                 base = sg_dma_address(obj->mm.pages->sgl);
   11091                 :            :         else
   11092                 :          0 :                 base = intel_plane_ggtt_offset(plane_state);
   11093                 :            : 
   11094                 :          0 :         return base + plane_state->color_plane[0].offset;
   11095                 :            : }
   11096                 :            : 
   11097                 :          0 : static u32 intel_cursor_position(const struct intel_plane_state *plane_state)
   11098                 :            : {
   11099                 :          0 :         int x = plane_state->uapi.dst.x1;
   11100                 :          0 :         int y = plane_state->uapi.dst.y1;
   11101                 :          0 :         u32 pos = 0;
   11102                 :            : 
   11103                 :          0 :         if (x < 0) {
   11104                 :          0 :                 pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
   11105                 :          0 :                 x = -x;
   11106                 :            :         }
   11107                 :          0 :         pos |= x << CURSOR_X_SHIFT;
   11108                 :            : 
   11109   [ #  #  #  # ]:          0 :         if (y < 0) {
   11110                 :          0 :                 pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
   11111                 :          0 :                 y = -y;
   11112                 :            :         }
   11113                 :          0 :         pos |= y << CURSOR_Y_SHIFT;
   11114                 :            : 
   11115                 :          0 :         return pos;
   11116                 :            : }
   11117                 :            : 
   11118                 :          0 : static bool intel_cursor_size_ok(const struct intel_plane_state *plane_state)
   11119                 :            : {
   11120                 :          0 :         const struct drm_mode_config *config =
   11121                 :          0 :                 &plane_state->uapi.plane->dev->mode_config;
   11122                 :          0 :         int width = drm_rect_width(&plane_state->uapi.dst);
   11123                 :          0 :         int height = drm_rect_height(&plane_state->uapi.dst);
   11124                 :            : 
   11125   [ #  #  #  #  :          0 :         return width > 0 && width <= config->cursor_width &&
             #  #  #  # ]
   11126   [ #  #  #  #  :          0 :                 height > 0 && height <= config->cursor_height;
                   #  # ]
   11127                 :            : }
   11128                 :            : 
   11129                 :          0 : static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
   11130                 :            : {
   11131                 :          0 :         struct drm_i915_private *dev_priv =
   11132                 :          0 :                 to_i915(plane_state->uapi.plane->dev);
   11133                 :          0 :         unsigned int rotation = plane_state->hw.rotation;
   11134                 :          0 :         int src_x, src_y;
   11135                 :          0 :         u32 offset;
   11136                 :          0 :         int ret;
   11137                 :            : 
   11138                 :          0 :         ret = intel_plane_compute_gtt(plane_state);
   11139         [ #  # ]:          0 :         if (ret)
   11140                 :            :                 return ret;
   11141                 :            : 
   11142         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
   11143                 :            :                 return 0;
   11144                 :            : 
   11145                 :          0 :         src_x = plane_state->uapi.src.x1 >> 16;
   11146                 :          0 :         src_y = plane_state->uapi.src.y1 >> 16;
   11147                 :            : 
   11148                 :          0 :         intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
   11149                 :          0 :         offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
   11150                 :            :                                                     plane_state, 0);
   11151                 :            : 
   11152   [ #  #  #  # ]:          0 :         if (src_x != 0 || src_y != 0) {
   11153                 :          0 :                 DRM_DEBUG_KMS("Arbitrary cursor panning not supported\n");
   11154                 :          0 :                 return -EINVAL;
   11155                 :            :         }
   11156                 :            : 
   11157                 :            :         /*
   11158                 :            :          * Put the final coordinates back so that the src
   11159                 :            :          * coordinate checks will see the right values.
   11160                 :            :          */
   11161         [ #  # ]:          0 :         drm_rect_translate_to(&plane_state->uapi.src,
   11162                 :            :                               src_x << 16, src_y << 16);
   11163                 :            : 
   11164                 :            :         /* ILK+ do this automagically in hardware */
   11165   [ #  #  #  # ]:          0 :         if (HAS_GMCH(dev_priv) && rotation & DRM_MODE_ROTATE_180) {
   11166                 :          0 :                 const struct drm_framebuffer *fb = plane_state->hw.fb;
   11167                 :          0 :                 int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
   11168                 :          0 :                 int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
   11169                 :            : 
   11170                 :          0 :                 offset += (src_h * src_w - 1) * fb->format->cpp[0];
   11171                 :            :         }
   11172                 :            : 
   11173                 :          0 :         plane_state->color_plane[0].offset = offset;
   11174                 :          0 :         plane_state->color_plane[0].x = src_x;
   11175                 :          0 :         plane_state->color_plane[0].y = src_y;
   11176                 :            : 
   11177                 :          0 :         return 0;
   11178                 :            : }
   11179                 :            : 
   11180                 :          0 : static int intel_check_cursor(struct intel_crtc_state *crtc_state,
   11181                 :            :                               struct intel_plane_state *plane_state)
   11182                 :            : {
   11183                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
   11184                 :          0 :         int ret;
   11185                 :            : 
   11186   [ #  #  #  # ]:          0 :         if (fb && fb->modifier != DRM_FORMAT_MOD_LINEAR) {
   11187                 :          0 :                 DRM_DEBUG_KMS("cursor cannot be tiled\n");
   11188                 :          0 :                 return -EINVAL;
   11189                 :            :         }
   11190                 :            : 
   11191                 :          0 :         ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
   11192                 :          0 :                                                   &crtc_state->uapi,
   11193                 :            :                                                   DRM_PLANE_HELPER_NO_SCALING,
   11194                 :            :                                                   DRM_PLANE_HELPER_NO_SCALING,
   11195                 :            :                                                   true, true);
   11196         [ #  # ]:          0 :         if (ret)
   11197                 :            :                 return ret;
   11198                 :            : 
   11199                 :            :         /* Use the unclipped src/dst rectangles, which we program to hw */
   11200                 :          0 :         plane_state->uapi.src = drm_plane_state_src(&plane_state->uapi);
   11201                 :          0 :         plane_state->uapi.dst = drm_plane_state_dest(&plane_state->uapi);
   11202                 :            : 
   11203                 :          0 :         ret = intel_cursor_check_surface(plane_state);
   11204         [ #  # ]:          0 :         if (ret)
   11205                 :            :                 return ret;
   11206                 :            : 
   11207         [ #  # ]:          0 :         if (!plane_state->uapi.visible)
   11208                 :            :                 return 0;
   11209                 :            : 
   11210                 :          0 :         ret = intel_plane_check_src_coordinates(plane_state);
   11211         [ #  # ]:          0 :         if (ret)
   11212                 :          0 :                 return ret;
   11213                 :            : 
   11214                 :            :         return 0;
   11215                 :            : }
   11216                 :            : 
   11217                 :            : static unsigned int
   11218                 :          0 : i845_cursor_max_stride(struct intel_plane *plane,
   11219                 :            :                        u32 pixel_format, u64 modifier,
   11220                 :            :                        unsigned int rotation)
   11221                 :            : {
   11222                 :          0 :         return 2048;
   11223                 :            : }
   11224                 :            : 
   11225                 :          0 : static u32 i845_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
   11226                 :            : {
   11227                 :          0 :         u32 cntl = 0;
   11228                 :            : 
   11229                 :          0 :         if (crtc_state->gamma_enable)
   11230                 :          0 :                 cntl |= CURSOR_GAMMA_ENABLE;
   11231                 :            : 
   11232                 :          0 :         return cntl;
   11233                 :            : }
   11234                 :            : 
   11235                 :          0 : static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
   11236                 :            :                            const struct intel_plane_state *plane_state)
   11237                 :            : {
   11238                 :          0 :         return CURSOR_ENABLE |
   11239                 :          0 :                 CURSOR_FORMAT_ARGB |
   11240                 :          0 :                 CURSOR_STRIDE(plane_state->color_plane[0].stride);
   11241                 :            : }
   11242                 :            : 
   11243                 :          0 : static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
   11244                 :            : {
   11245         [ #  # ]:          0 :         int width = drm_rect_width(&plane_state->uapi.dst);
   11246                 :            : 
   11247                 :            :         /*
   11248                 :            :          * 845g/865g are only limited by the width of their cursors,
   11249                 :            :          * the height is arbitrary up to the precision of the register.
   11250                 :            :          */
   11251   [ #  #  #  #  :          0 :         return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);
                   #  # ]
   11252                 :            : }
   11253                 :            : 
   11254                 :          0 : static int i845_check_cursor(struct intel_crtc_state *crtc_state,
   11255                 :            :                              struct intel_plane_state *plane_state)
   11256                 :            : {
   11257                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
   11258                 :          0 :         int ret;
   11259                 :            : 
   11260                 :          0 :         ret = intel_check_cursor(crtc_state, plane_state);
   11261         [ #  # ]:          0 :         if (ret)
   11262                 :            :                 return ret;
   11263                 :            : 
   11264                 :            :         /* if we want to turn off the cursor ignore width and height */
   11265         [ #  # ]:          0 :         if (!fb)
   11266                 :            :                 return 0;
   11267                 :            : 
   11268                 :            :         /* Check for which cursor types we support */
   11269         [ #  # ]:          0 :         if (!i845_cursor_size_ok(plane_state)) {
   11270                 :          0 :                 DRM_DEBUG("Cursor dimension %dx%d not supported\n",
   11271                 :            :                           drm_rect_width(&plane_state->uapi.dst),
   11272                 :            :                           drm_rect_height(&plane_state->uapi.dst));
   11273                 :          0 :                 return -EINVAL;
   11274                 :            :         }
   11275                 :            : 
   11276   [ #  #  #  #  :          0 :         WARN_ON(plane_state->uapi.visible &&
                   #  # ]
   11277                 :            :                 plane_state->color_plane[0].stride != fb->pitches[0]);
   11278                 :            : 
   11279         [ #  # ]:          0 :         switch (fb->pitches[0]) {
   11280                 :            :         case 256:
   11281                 :            :         case 512:
   11282                 :            :         case 1024:
   11283                 :            :         case 2048:
   11284                 :          0 :                 break;
   11285                 :          0 :         default:
   11286                 :          0 :                 DRM_DEBUG_KMS("Invalid cursor stride (%u)\n",
   11287                 :            :                               fb->pitches[0]);
   11288                 :          0 :                 return -EINVAL;
   11289                 :            :         }
   11290                 :            : 
   11291                 :          0 :         plane_state->ctl = i845_cursor_ctl(crtc_state, plane_state);
   11292                 :            : 
   11293                 :          0 :         return 0;
   11294                 :            : }
   11295                 :            : 
   11296                 :          0 : static void i845_update_cursor(struct intel_plane *plane,
   11297                 :            :                                const struct intel_crtc_state *crtc_state,
   11298                 :            :                                const struct intel_plane_state *plane_state)
   11299                 :            : {
   11300         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11301                 :          0 :         u32 cntl = 0, base = 0, pos = 0, size = 0;
   11302                 :          0 :         unsigned long irqflags;
   11303                 :            : 
   11304   [ #  #  #  # ]:          0 :         if (plane_state && plane_state->uapi.visible) {
   11305         [ #  # ]:          0 :                 unsigned int width = drm_rect_width(&plane_state->uapi.dst);
   11306         [ #  # ]:          0 :                 unsigned int height = drm_rect_height(&plane_state->uapi.dst);
   11307                 :            : 
   11308                 :          0 :                 cntl = plane_state->ctl |
   11309         [ #  # ]:          0 :                         i845_cursor_ctl_crtc(crtc_state);
   11310                 :            : 
   11311                 :          0 :                 size = (height << 12) | width;
   11312                 :            : 
   11313         [ #  # ]:          0 :                 base = intel_cursor_base(plane_state);
   11314         [ #  # ]:          0 :                 pos = intel_cursor_position(plane_state);
   11315                 :            :         }
   11316                 :            : 
   11317                 :          0 :         spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   11318                 :            : 
   11319                 :            :         /* On these chipsets we can only modify the base/size/stride
   11320                 :            :          * whilst the cursor is disabled.
   11321                 :            :          */
   11322         [ #  # ]:          0 :         if (plane->cursor.base != base ||
   11323         [ #  # ]:          0 :             plane->cursor.size != size ||
   11324         [ #  # ]:          0 :             plane->cursor.cntl != cntl) {
   11325                 :          0 :                 I915_WRITE_FW(CURCNTR(PIPE_A), 0);
   11326                 :          0 :                 I915_WRITE_FW(CURBASE(PIPE_A), base);
   11327                 :          0 :                 I915_WRITE_FW(CURSIZE, size);
   11328                 :          0 :                 I915_WRITE_FW(CURPOS(PIPE_A), pos);
   11329                 :          0 :                 I915_WRITE_FW(CURCNTR(PIPE_A), cntl);
   11330                 :            : 
   11331                 :          0 :                 plane->cursor.base = base;
   11332                 :          0 :                 plane->cursor.size = size;
   11333                 :          0 :                 plane->cursor.cntl = cntl;
   11334                 :            :         } else {
   11335                 :          0 :                 I915_WRITE_FW(CURPOS(PIPE_A), pos);
   11336                 :            :         }
   11337                 :            : 
   11338                 :          0 :         spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   11339                 :          0 : }
   11340                 :            : 
   11341                 :          0 : static void i845_disable_cursor(struct intel_plane *plane,
   11342                 :            :                                 const struct intel_crtc_state *crtc_state)
   11343                 :            : {
   11344                 :          0 :         i845_update_cursor(plane, crtc_state, NULL);
   11345                 :          0 : }
   11346                 :            : 
   11347                 :          0 : static bool i845_cursor_get_hw_state(struct intel_plane *plane,
   11348                 :            :                                      enum pipe *pipe)
   11349                 :            : {
   11350                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11351                 :          0 :         enum intel_display_power_domain power_domain;
   11352                 :          0 :         intel_wakeref_t wakeref;
   11353                 :          0 :         bool ret;
   11354                 :            : 
   11355                 :          0 :         power_domain = POWER_DOMAIN_PIPE(PIPE_A);
   11356                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11357         [ #  # ]:          0 :         if (!wakeref)
   11358                 :            :                 return false;
   11359                 :            : 
   11360                 :          0 :         ret = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE;
   11361                 :            : 
   11362                 :          0 :         *pipe = PIPE_A;
   11363                 :            : 
   11364                 :          0 :         intel_display_power_put(dev_priv, power_domain, wakeref);
   11365                 :            : 
   11366                 :          0 :         return ret;
   11367                 :            : }
   11368                 :            : 
   11369                 :            : static unsigned int
   11370                 :          0 : i9xx_cursor_max_stride(struct intel_plane *plane,
   11371                 :            :                        u32 pixel_format, u64 modifier,
   11372                 :            :                        unsigned int rotation)
   11373                 :            : {
   11374                 :          0 :         return plane->base.dev->mode_config.cursor_width * 4;
   11375                 :            : }
   11376                 :            : 
   11377                 :          0 : static u32 i9xx_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
   11378                 :            : {
   11379                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   11380         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   11381                 :          0 :         u32 cntl = 0;
   11382                 :            : 
   11383         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
   11384                 :            :                 return cntl;
   11385                 :            : 
   11386         [ #  # ]:          0 :         if (crtc_state->gamma_enable)
   11387                 :          0 :                 cntl = MCURSOR_GAMMA_ENABLE;
   11388                 :            : 
   11389         [ #  # ]:          0 :         if (crtc_state->csc_enable)
   11390                 :          0 :                 cntl |= MCURSOR_PIPE_CSC_ENABLE;
   11391                 :            : 
   11392   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
                   #  # ]
   11393                 :          0 :                 cntl |= MCURSOR_PIPE_SELECT(crtc->pipe);
   11394                 :            : 
   11395                 :            :         return cntl;
   11396                 :            : }
   11397                 :            : 
   11398                 :            : static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
   11399                 :            :                            const struct intel_plane_state *plane_state)
   11400                 :            : {
   11401                 :            :         struct drm_i915_private *dev_priv =
   11402                 :            :                 to_i915(plane_state->uapi.plane->dev);
   11403                 :            :         u32 cntl = 0;
   11404                 :            : 
   11405                 :            :         if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
   11406                 :            :                 cntl |= MCURSOR_TRICKLE_FEED_DISABLE;
   11407                 :            : 
   11408                 :            :         switch (drm_rect_width(&plane_state->uapi.dst)) {
   11409                 :            :         case 64:
   11410                 :            :                 cntl |= MCURSOR_MODE_64_ARGB_AX;
   11411                 :            :                 break;
   11412                 :            :         case 128:
   11413                 :            :                 cntl |= MCURSOR_MODE_128_ARGB_AX;
   11414                 :            :                 break;
   11415                 :            :         case 256:
   11416                 :            :                 cntl |= MCURSOR_MODE_256_ARGB_AX;
   11417                 :            :                 break;
   11418                 :            :         default:
   11419                 :            :                 MISSING_CASE(drm_rect_width(&plane_state->uapi.dst));
   11420                 :            :                 return 0;
   11421                 :            :         }
   11422                 :            : 
   11423                 :            :         if (plane_state->hw.rotation & DRM_MODE_ROTATE_180)
   11424                 :            :                 cntl |= MCURSOR_ROTATE_180;
   11425                 :            : 
   11426                 :            :         return cntl;
   11427                 :            : }
   11428                 :            : 
   11429                 :          0 : static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
   11430                 :            : {
   11431                 :          0 :         struct drm_i915_private *dev_priv =
   11432         [ #  # ]:          0 :                 to_i915(plane_state->uapi.plane->dev);
   11433         [ #  # ]:          0 :         int width = drm_rect_width(&plane_state->uapi.dst);
   11434         [ #  # ]:          0 :         int height = drm_rect_height(&plane_state->uapi.dst);
   11435                 :            : 
   11436   [ #  #  #  # ]:          0 :         if (!intel_cursor_size_ok(plane_state))
   11437                 :            :                 return false;
   11438                 :            : 
   11439                 :            :         /* Cursor width is limited to a few power-of-two sizes */
   11440         [ #  # ]:          0 :         switch (width) {
   11441                 :            :         case 256:
   11442                 :            :         case 128:
   11443                 :            :         case 64:
   11444                 :          0 :                 break;
   11445                 :            :         default:
   11446                 :            :                 return false;
   11447                 :            :         }
   11448                 :            : 
   11449                 :            :         /*
   11450                 :            :          * IVB+ have CUR_FBC_CTL which allows an arbitrary cursor
   11451                 :            :          * height from 8 lines up to the cursor width, when the
   11452                 :            :          * cursor is not rotated. Everything else requires square
   11453                 :            :          * cursors.
   11454                 :            :          */
   11455   [ #  #  #  # ]:          0 :         if (HAS_CUR_FBC(dev_priv) &&
   11456         [ #  # ]:          0 :             plane_state->hw.rotation & DRM_MODE_ROTATE_0) {
   11457         [ #  # ]:          0 :                 if (height < 8 || height > width)
   11458                 :          0 :                         return false;
   11459                 :            :         } else {
   11460         [ #  # ]:          0 :                 if (height != width)
   11461                 :          0 :                         return false;
   11462                 :            :         }
   11463                 :            : 
   11464                 :            :         return true;
   11465                 :            : }
   11466                 :            : 
   11467                 :          0 : static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
   11468                 :            :                              struct intel_plane_state *plane_state)
   11469                 :            : {
   11470                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   11471                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11472                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
   11473                 :          0 :         enum pipe pipe = plane->pipe;
   11474                 :          0 :         int ret;
   11475                 :            : 
   11476                 :          0 :         ret = intel_check_cursor(crtc_state, plane_state);
   11477         [ #  # ]:          0 :         if (ret)
   11478                 :            :                 return ret;
   11479                 :            : 
   11480                 :            :         /* if we want to turn off the cursor ignore width and height */
   11481         [ #  # ]:          0 :         if (!fb)
   11482                 :            :                 return 0;
   11483                 :            : 
   11484                 :            :         /* Check for which cursor types we support */
   11485         [ #  # ]:          0 :         if (!i9xx_cursor_size_ok(plane_state)) {
   11486                 :          0 :                 DRM_DEBUG("Cursor dimension %dx%d not supported\n",
   11487                 :            :                           drm_rect_width(&plane_state->uapi.dst),
   11488                 :            :                           drm_rect_height(&plane_state->uapi.dst));
   11489                 :          0 :                 return -EINVAL;
   11490                 :            :         }
   11491                 :            : 
   11492   [ #  #  #  #  :          0 :         WARN_ON(plane_state->uapi.visible &&
                   #  # ]
   11493                 :            :                 plane_state->color_plane[0].stride != fb->pitches[0]);
   11494                 :            : 
   11495                 :          0 :         if (fb->pitches[0] !=
   11496         [ #  # ]:          0 :             drm_rect_width(&plane_state->uapi.dst) * fb->format->cpp[0]) {
   11497                 :          0 :                 DRM_DEBUG_KMS("Invalid cursor stride (%u) (cursor width %d)\n",
   11498                 :            :                               fb->pitches[0],
   11499                 :            :                               drm_rect_width(&plane_state->uapi.dst));
   11500                 :          0 :                 return -EINVAL;
   11501                 :            :         }
   11502                 :            : 
   11503                 :            :         /*
   11504                 :            :          * There's something wrong with the cursor on CHV pipe C.
   11505                 :            :          * If it straddles the left edge of the screen then
   11506                 :            :          * moving it away from the edge or disabling it often
   11507                 :            :          * results in a pipe underrun, and often that can lead to
   11508                 :            :          * dead pipe (constant underrun reported, and it scans
   11509                 :            :          * out just a solid color). To recover from that, the
   11510                 :            :          * display power well must be turned off and on again.
   11511                 :            :          * Refuse the put the cursor into that compromised position.
   11512                 :            :          */
   11513   [ #  #  #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_C &&
   11514   [ #  #  #  # ]:          0 :             plane_state->uapi.visible && plane_state->uapi.dst.x1 < 0) {
   11515                 :          0 :                 DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n");
   11516                 :          0 :                 return -EINVAL;
   11517                 :            :         }
   11518                 :            : 
   11519                 :          0 :         plane_state->ctl = i9xx_cursor_ctl(crtc_state, plane_state);
   11520                 :            : 
   11521                 :          0 :         return 0;
   11522                 :            : }
   11523                 :            : 
   11524                 :          0 : static void i9xx_update_cursor(struct intel_plane *plane,
   11525                 :            :                                const struct intel_crtc_state *crtc_state,
   11526                 :            :                                const struct intel_plane_state *plane_state)
   11527                 :            : {
   11528         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11529                 :          0 :         enum pipe pipe = plane->pipe;
   11530                 :          0 :         u32 cntl = 0, base = 0, pos = 0, fbc_ctl = 0;
   11531                 :          0 :         unsigned long irqflags;
   11532                 :            : 
   11533   [ #  #  #  # ]:          0 :         if (plane_state && plane_state->uapi.visible) {
   11534         [ #  # ]:          0 :                 unsigned width = drm_rect_width(&plane_state->uapi.dst);
   11535         [ #  # ]:          0 :                 unsigned height = drm_rect_height(&plane_state->uapi.dst);
   11536                 :            : 
   11537                 :          0 :                 cntl = plane_state->ctl |
   11538                 :          0 :                         i9xx_cursor_ctl_crtc(crtc_state);
   11539                 :            : 
   11540         [ #  # ]:          0 :                 if (width != height)
   11541                 :          0 :                         fbc_ctl = CUR_FBC_CTL_EN | (height - 1);
   11542                 :            : 
   11543         [ #  # ]:          0 :                 base = intel_cursor_base(plane_state);
   11544         [ #  # ]:          0 :                 pos = intel_cursor_position(plane_state);
   11545                 :            :         }
   11546                 :            : 
   11547                 :          0 :         spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   11548                 :            : 
   11549                 :            :         /*
   11550                 :            :          * On some platforms writing CURCNTR first will also
   11551                 :            :          * cause CURPOS to be armed by the CURBASE write.
   11552                 :            :          * Without the CURCNTR write the CURPOS write would
   11553                 :            :          * arm itself. Thus we always update CURCNTR before
   11554                 :            :          * CURPOS.
   11555                 :            :          *
   11556                 :            :          * On other platforms CURPOS always requires the
   11557                 :            :          * CURBASE write to arm the update. Additonally
   11558                 :            :          * a write to any of the cursor register will cancel
   11559                 :            :          * an already armed cursor update. Thus leaving out
   11560                 :            :          * the CURBASE write after CURPOS could lead to a
   11561                 :            :          * cursor that doesn't appear to move, or even change
   11562                 :            :          * shape. Thus we always write CURBASE.
   11563                 :            :          *
   11564                 :            :          * The other registers are armed by by the CURBASE write
   11565                 :            :          * except when the plane is getting enabled at which time
   11566                 :            :          * the CURCNTR write arms the update.
   11567                 :            :          */
   11568                 :            : 
   11569         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   11570                 :          0 :                 skl_write_cursor_wm(plane, crtc_state);
   11571                 :            : 
   11572         [ #  # ]:          0 :         if (plane->cursor.base != base ||
   11573         [ #  # ]:          0 :             plane->cursor.size != fbc_ctl ||
   11574         [ #  # ]:          0 :             plane->cursor.cntl != cntl) {
   11575   [ #  #  #  # ]:          0 :                 if (HAS_CUR_FBC(dev_priv))
   11576                 :          0 :                         I915_WRITE_FW(CUR_FBC_CTL(pipe), fbc_ctl);
   11577                 :          0 :                 I915_WRITE_FW(CURCNTR(pipe), cntl);
   11578                 :          0 :                 I915_WRITE_FW(CURPOS(pipe), pos);
   11579                 :          0 :                 I915_WRITE_FW(CURBASE(pipe), base);
   11580                 :            : 
   11581                 :          0 :                 plane->cursor.base = base;
   11582                 :          0 :                 plane->cursor.size = fbc_ctl;
   11583                 :          0 :                 plane->cursor.cntl = cntl;
   11584                 :            :         } else {
   11585                 :          0 :                 I915_WRITE_FW(CURPOS(pipe), pos);
   11586                 :          0 :                 I915_WRITE_FW(CURBASE(pipe), base);
   11587                 :            :         }
   11588                 :            : 
   11589                 :          0 :         spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   11590                 :          0 : }
   11591                 :            : 
   11592                 :          0 : static void i9xx_disable_cursor(struct intel_plane *plane,
   11593                 :            :                                 const struct intel_crtc_state *crtc_state)
   11594                 :            : {
   11595                 :          0 :         i9xx_update_cursor(plane, crtc_state, NULL);
   11596                 :          0 : }
   11597                 :            : 
   11598                 :          0 : static bool i9xx_cursor_get_hw_state(struct intel_plane *plane,
   11599                 :            :                                      enum pipe *pipe)
   11600                 :            : {
   11601                 :          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11602                 :          0 :         enum intel_display_power_domain power_domain;
   11603                 :          0 :         intel_wakeref_t wakeref;
   11604                 :          0 :         bool ret;
   11605                 :          0 :         u32 val;
   11606                 :            : 
   11607                 :            :         /*
   11608                 :            :          * Not 100% correct for planes that can move between pipes,
   11609                 :            :          * but that's only the case for gen2-3 which don't have any
   11610                 :            :          * display power wells.
   11611                 :            :          */
   11612                 :          0 :         power_domain = POWER_DOMAIN_PIPE(plane->pipe);
   11613                 :          0 :         wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11614         [ #  # ]:          0 :         if (!wakeref)
   11615                 :            :                 return false;
   11616                 :            : 
   11617                 :          0 :         val = I915_READ(CURCNTR(plane->pipe));
   11618                 :            : 
   11619                 :          0 :         ret = val & MCURSOR_MODE;
   11620                 :            : 
   11621   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
                   #  # ]
   11622                 :          0 :                 *pipe = plane->pipe;
   11623                 :            :         else
   11624                 :          0 :                 *pipe = (val & MCURSOR_PIPE_SELECT_MASK) >>
   11625                 :            :                         MCURSOR_PIPE_SELECT_SHIFT;
   11626                 :            : 
   11627                 :          0 :         intel_display_power_put(dev_priv, power_domain, wakeref);
   11628                 :            : 
   11629                 :          0 :         return ret;
   11630                 :            : }
   11631                 :            : 
   11632                 :            : /* VESA 640x480x72Hz mode to set on the pipe */
   11633                 :            : static const struct drm_display_mode load_detect_mode = {
   11634                 :            :         DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664,
   11635                 :            :                  704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
   11636                 :            : };
   11637                 :            : 
   11638                 :            : struct drm_framebuffer *
   11639                 :          0 : intel_framebuffer_create(struct drm_i915_gem_object *obj,
   11640                 :            :                          struct drm_mode_fb_cmd2 *mode_cmd)
   11641                 :            : {
   11642                 :          0 :         struct intel_framebuffer *intel_fb;
   11643                 :          0 :         int ret;
   11644                 :            : 
   11645                 :          0 :         intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
   11646         [ #  # ]:          0 :         if (!intel_fb)
   11647                 :            :                 return ERR_PTR(-ENOMEM);
   11648                 :            : 
   11649                 :          0 :         ret = intel_framebuffer_init(intel_fb, obj, mode_cmd);
   11650         [ #  # ]:          0 :         if (ret)
   11651                 :          0 :                 goto err;
   11652                 :            : 
   11653                 :          0 :         return &intel_fb->base;
   11654                 :            : 
   11655                 :            : err:
   11656                 :          0 :         kfree(intel_fb);
   11657                 :          0 :         return ERR_PTR(ret);
   11658                 :            : }
   11659                 :            : 
   11660                 :          0 : static int intel_modeset_disable_planes(struct drm_atomic_state *state,
   11661                 :            :                                         struct drm_crtc *crtc)
   11662                 :            : {
   11663                 :          0 :         struct drm_plane *plane;
   11664                 :          0 :         struct drm_plane_state *plane_state;
   11665                 :          0 :         int ret, i;
   11666                 :            : 
   11667                 :          0 :         ret = drm_atomic_add_affected_planes(state, crtc);
   11668         [ #  # ]:          0 :         if (ret)
   11669                 :            :                 return ret;
   11670                 :            : 
   11671   [ #  #  #  # ]:          0 :         for_each_new_plane_in_state(state, plane, plane_state, i) {
   11672         [ #  # ]:          0 :                 if (plane_state->crtc != crtc)
   11673                 :          0 :                         continue;
   11674                 :            : 
   11675                 :          0 :                 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
   11676         [ #  # ]:          0 :                 if (ret)
   11677                 :          0 :                         return ret;
   11678                 :            : 
   11679                 :          0 :                 drm_atomic_set_fb_for_plane(plane_state, NULL);
   11680                 :            :         }
   11681                 :            : 
   11682                 :            :         return 0;
   11683                 :            : }
   11684                 :            : 
   11685                 :          0 : int intel_get_load_detect_pipe(struct drm_connector *connector,
   11686                 :            :                                struct intel_load_detect_pipe *old,
   11687                 :            :                                struct drm_modeset_acquire_ctx *ctx)
   11688                 :            : {
   11689                 :          0 :         struct intel_crtc *intel_crtc;
   11690                 :          0 :         struct intel_encoder *intel_encoder =
   11691                 :          0 :                 intel_attached_encoder(to_intel_connector(connector));
   11692                 :          0 :         struct drm_crtc *possible_crtc;
   11693                 :          0 :         struct drm_encoder *encoder = &intel_encoder->base;
   11694                 :          0 :         struct drm_crtc *crtc = NULL;
   11695                 :          0 :         struct drm_device *dev = encoder->dev;
   11696                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   11697                 :          0 :         struct drm_mode_config *config = &dev->mode_config;
   11698                 :          0 :         struct drm_atomic_state *state = NULL, *restore_state = NULL;
   11699                 :          0 :         struct drm_connector_state *connector_state;
   11700                 :          0 :         struct intel_crtc_state *crtc_state;
   11701                 :          0 :         int ret, i = -1;
   11702                 :            : 
   11703                 :          0 :         DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
   11704                 :            :                       connector->base.id, connector->name,
   11705                 :            :                       encoder->base.id, encoder->name);
   11706                 :            : 
   11707                 :          0 :         old->restore_state = NULL;
   11708                 :            : 
   11709         [ #  # ]:          0 :         WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
   11710                 :            : 
   11711                 :            :         /*
   11712                 :            :          * Algorithm gets a little messy:
   11713                 :            :          *
   11714                 :            :          *   - if the connector already has an assigned crtc, use it (but make
   11715                 :            :          *     sure it's on first)
   11716                 :            :          *
   11717                 :            :          *   - try to find the first unused crtc that can drive this connector,
   11718                 :            :          *     and use that if we find one
   11719                 :            :          */
   11720                 :            : 
   11721                 :            :         /* See if we already have a CRTC for this connector */
   11722         [ #  # ]:          0 :         if (connector->state->crtc) {
   11723                 :          0 :                 crtc = connector->state->crtc;
   11724                 :            : 
   11725                 :          0 :                 ret = drm_modeset_lock(&crtc->mutex, ctx);
   11726         [ #  # ]:          0 :                 if (ret)
   11727                 :          0 :                         goto fail;
   11728                 :            : 
   11729                 :            :                 /* Make sure the crtc and connector are running */
   11730                 :          0 :                 goto found;
   11731                 :            :         }
   11732                 :            : 
   11733                 :            :         /* Find an unused one (if possible) */
   11734         [ #  # ]:          0 :         for_each_crtc(dev, possible_crtc) {
   11735                 :          0 :                 i++;
   11736         [ #  # ]:          0 :                 if (!(encoder->possible_crtcs & (1 << i)))
   11737                 :          0 :                         continue;
   11738                 :            : 
   11739                 :          0 :                 ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
   11740         [ #  # ]:          0 :                 if (ret)
   11741                 :          0 :                         goto fail;
   11742                 :            : 
   11743         [ #  # ]:          0 :                 if (possible_crtc->state->enable) {
   11744                 :          0 :                         drm_modeset_unlock(&possible_crtc->mutex);
   11745                 :          0 :                         continue;
   11746                 :            :                 }
   11747                 :            : 
   11748                 :            :                 crtc = possible_crtc;
   11749                 :            :                 break;
   11750                 :            :         }
   11751                 :            : 
   11752                 :            :         /*
   11753                 :            :          * If we didn't find an unused CRTC, don't use any.
   11754                 :            :          */
   11755         [ #  # ]:          0 :         if (!crtc) {
   11756                 :          0 :                 DRM_DEBUG_KMS("no pipe available for load-detect\n");
   11757                 :          0 :                 ret = -ENODEV;
   11758                 :          0 :                 goto fail;
   11759                 :            :         }
   11760                 :            : 
   11761                 :          0 : found:
   11762                 :          0 :         intel_crtc = to_intel_crtc(crtc);
   11763                 :            : 
   11764                 :          0 :         state = drm_atomic_state_alloc(dev);
   11765                 :          0 :         restore_state = drm_atomic_state_alloc(dev);
   11766         [ #  # ]:          0 :         if (!state || !restore_state) {
   11767                 :          0 :                 ret = -ENOMEM;
   11768                 :          0 :                 goto fail;
   11769                 :            :         }
   11770                 :            : 
   11771                 :          0 :         state->acquire_ctx = ctx;
   11772                 :          0 :         restore_state->acquire_ctx = ctx;
   11773                 :            : 
   11774                 :          0 :         connector_state = drm_atomic_get_connector_state(state, connector);
   11775         [ #  # ]:          0 :         if (IS_ERR(connector_state)) {
   11776                 :          0 :                 ret = PTR_ERR(connector_state);
   11777                 :          0 :                 goto fail;
   11778                 :            :         }
   11779                 :            : 
   11780                 :          0 :         ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
   11781         [ #  # ]:          0 :         if (ret)
   11782                 :          0 :                 goto fail;
   11783                 :            : 
   11784                 :          0 :         crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
   11785         [ #  # ]:          0 :         if (IS_ERR(crtc_state)) {
   11786                 :          0 :                 ret = PTR_ERR(crtc_state);
   11787                 :          0 :                 goto fail;
   11788                 :            :         }
   11789                 :            : 
   11790                 :          0 :         crtc_state->uapi.active = true;
   11791                 :            : 
   11792                 :          0 :         ret = drm_atomic_set_mode_for_crtc(&crtc_state->uapi,
   11793                 :            :                                            &load_detect_mode);
   11794         [ #  # ]:          0 :         if (ret)
   11795                 :          0 :                 goto fail;
   11796                 :            : 
   11797                 :          0 :         ret = intel_modeset_disable_planes(state, crtc);
   11798         [ #  # ]:          0 :         if (ret)
   11799                 :          0 :                 goto fail;
   11800                 :            : 
   11801                 :          0 :         ret = PTR_ERR_OR_ZERO(drm_atomic_get_connector_state(restore_state, connector));
   11802         [ #  # ]:          0 :         if (!ret)
   11803                 :          0 :                 ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, crtc));
   11804         [ #  # ]:          0 :         if (!ret)
   11805                 :          0 :                 ret = drm_atomic_add_affected_planes(restore_state, crtc);
   11806         [ #  # ]:          0 :         if (ret) {
   11807                 :          0 :                 DRM_DEBUG_KMS("Failed to create a copy of old state to restore: %i\n", ret);
   11808                 :          0 :                 goto fail;
   11809                 :            :         }
   11810                 :            : 
   11811                 :          0 :         ret = drm_atomic_commit(state);
   11812         [ #  # ]:          0 :         if (ret) {
   11813                 :          0 :                 DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
   11814                 :          0 :                 goto fail;
   11815                 :            :         }
   11816                 :            : 
   11817                 :          0 :         old->restore_state = restore_state;
   11818                 :          0 :         drm_atomic_state_put(state);
   11819                 :            : 
   11820                 :            :         /* let the connector get through one full cycle before testing */
   11821                 :          0 :         intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
   11822                 :          0 :         return true;
   11823                 :            : 
   11824                 :          0 : fail:
   11825         [ #  # ]:          0 :         if (state) {
   11826                 :          0 :                 drm_atomic_state_put(state);
   11827                 :          0 :                 state = NULL;
   11828                 :            :         }
   11829         [ #  # ]:          0 :         if (restore_state) {
   11830                 :          0 :                 drm_atomic_state_put(restore_state);
   11831                 :          0 :                 restore_state = NULL;
   11832                 :            :         }
   11833                 :            : 
   11834         [ #  # ]:          0 :         if (ret == -EDEADLK)
   11835                 :          0 :                 return ret;
   11836                 :            : 
   11837                 :            :         return false;
   11838                 :            : }
   11839                 :            : 
   11840                 :          0 : void intel_release_load_detect_pipe(struct drm_connector *connector,
   11841                 :            :                                     struct intel_load_detect_pipe *old,
   11842                 :            :                                     struct drm_modeset_acquire_ctx *ctx)
   11843                 :            : {
   11844                 :          0 :         struct intel_encoder *intel_encoder =
   11845                 :          0 :                 intel_attached_encoder(to_intel_connector(connector));
   11846                 :          0 :         struct drm_encoder *encoder = &intel_encoder->base;
   11847                 :          0 :         struct drm_atomic_state *state = old->restore_state;
   11848                 :          0 :         int ret;
   11849                 :            : 
   11850                 :          0 :         DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
   11851                 :            :                       connector->base.id, connector->name,
   11852                 :            :                       encoder->base.id, encoder->name);
   11853                 :            : 
   11854         [ #  # ]:          0 :         if (!state)
   11855                 :            :                 return;
   11856                 :            : 
   11857                 :          0 :         ret = drm_atomic_helper_commit_duplicated_state(state, ctx);
   11858         [ #  # ]:          0 :         if (ret)
   11859                 :          0 :                 DRM_DEBUG_KMS("Couldn't release load detect pipe: %i\n", ret);
   11860                 :          0 :         drm_atomic_state_put(state);
   11861                 :            : }
   11862                 :            : 
   11863                 :            : static int i9xx_pll_refclk(struct drm_device *dev,
   11864                 :            :                            const struct intel_crtc_state *pipe_config)
   11865                 :            : {
   11866                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   11867                 :            :         u32 dpll = pipe_config->dpll_hw_state.dpll;
   11868                 :            : 
   11869                 :            :         if ((dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN)
   11870                 :            :                 return dev_priv->vbt.lvds_ssc_freq;
   11871                 :            :         else if (HAS_PCH_SPLIT(dev_priv))
   11872                 :            :                 return 120000;
   11873                 :            :         else if (!IS_GEN(dev_priv, 2))
   11874                 :            :                 return 96000;
   11875                 :            :         else
   11876                 :            :                 return 48000;
   11877                 :            : }
   11878                 :            : 
   11879                 :            : /* Returns the clock of the currently programmed mode of the given pipe. */
   11880                 :            : static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
   11881                 :            :                                 struct intel_crtc_state *pipe_config)
   11882                 :            : {
   11883                 :            :         struct drm_device *dev = crtc->base.dev;
   11884                 :            :         struct drm_i915_private *dev_priv = to_i915(dev);
   11885                 :            :         enum pipe pipe = crtc->pipe;
   11886                 :            :         u32 dpll = pipe_config->dpll_hw_state.dpll;
   11887                 :            :         u32 fp;
   11888                 :            :         struct dpll clock;
   11889                 :            :         int port_clock;
   11890                 :            :         int refclk = i9xx_pll_refclk(dev, pipe_config);
   11891                 :            : 
   11892                 :            :         if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
   11893                 :            :                 fp = pipe_config->dpll_hw_state.fp0;
   11894                 :            :         else
   11895                 :            :                 fp = pipe_config->dpll_hw_state.fp1;
   11896                 :            : 
   11897                 :            :         clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
   11898                 :            :         if (IS_PINEVIEW(dev_priv)) {
   11899                 :            :                 clock.n = ffs((fp & FP_N_PINEVIEW_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
   11900                 :            :                 clock.m2 = (fp & FP_M2_PINEVIEW_DIV_MASK) >> FP_M2_DIV_SHIFT;
   11901                 :            :         } else {
   11902                 :            :                 clock.n = (fp & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT;
   11903                 :            :                 clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT;
   11904                 :            :         }
   11905                 :            : 
   11906                 :            :         if (!IS_GEN(dev_priv, 2)) {
   11907                 :            :                 if (IS_PINEVIEW(dev_priv))
   11908                 :            :                         clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >>
   11909                 :            :                                 DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW);
   11910                 :            :                 else
   11911                 :            :                         clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK) >>
   11912                 :            :                                DPLL_FPA01_P1_POST_DIV_SHIFT);
   11913                 :            : 
   11914                 :            :                 switch (dpll & DPLL_MODE_MASK) {
   11915                 :            :                 case DPLLB_MODE_DAC_SERIAL:
   11916                 :            :                         clock.p2 = dpll & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ?
   11917                 :            :                                 5 : 10;
   11918                 :            :                         break;
   11919                 :            :                 case DPLLB_MODE_LVDS:
   11920                 :            :                         clock.p2 = dpll & DPLLB_LVDS_P2_CLOCK_DIV_7 ?
   11921                 :            :                                 7 : 14;
   11922                 :            :                         break;
   11923                 :            :                 default:
   11924                 :            :                         DRM_DEBUG_KMS("Unknown DPLL mode %08x in programmed "
   11925                 :            :                                   "mode\n", (int)(dpll & DPLL_MODE_MASK));
   11926                 :            :                         return;
   11927                 :            :                 }
   11928                 :            : 
   11929                 :            :                 if (IS_PINEVIEW(dev_priv))
   11930                 :            :                         port_clock = pnv_calc_dpll_params(refclk, &clock);
   11931                 :            :                 else
   11932                 :            :                         port_clock = i9xx_calc_dpll_params(refclk, &clock);
   11933                 :            :         } else {
   11934                 :            :                 u32 lvds = IS_I830(dev_priv) ? 0 : I915_READ(LVDS);
   11935                 :            :                 bool is_lvds = (pipe == 1) && (lvds & LVDS_PORT_EN);
   11936                 :            : 
   11937                 :            :                 if (is_lvds) {
   11938                 :            :                         clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS) >>
   11939                 :            :                                        DPLL_FPA01_P1_POST_DIV_SHIFT);
   11940                 :            : 
   11941                 :            :                         if (lvds & LVDS_CLKB_POWER_UP)
   11942                 :            :                                 clock.p2 = 7;
   11943                 :            :                         else
   11944                 :            :                                 clock.p2 = 14;
   11945                 :            :                 } else {
   11946                 :            :                         if (dpll & PLL_P1_DIVIDE_BY_TWO)
   11947                 :            :                                 clock.p1 = 2;
   11948                 :            :                         else {
   11949                 :            :                                 clock.p1 = ((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830) >>
   11950                 :            :                                             DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
   11951                 :            :                         }
   11952                 :            :                         if (dpll & PLL_P2_DIVIDE_BY_4)
   11953                 :            :                                 clock.p2 = 4;
   11954                 :            :                         else
   11955                 :            :                                 clock.p2 = 2;
   11956                 :            :                 }
   11957                 :            : 
   11958                 :            :                 port_clock = i9xx_calc_dpll_params(refclk, &clock);
   11959                 :            :         }
   11960                 :            : 
   11961                 :            :         /*
   11962                 :            :          * This value includes pixel_multiplier. We will use
   11963                 :            :          * port_clock to compute adjusted_mode.crtc_clock in the
   11964                 :            :          * encoder's get_config() function.
   11965                 :            :          */
   11966                 :            :         pipe_config->port_clock = port_clock;
   11967                 :            : }
   11968                 :            : 
   11969                 :          0 : int intel_dotclock_calculate(int link_freq,
   11970                 :            :                              const struct intel_link_m_n *m_n)
   11971                 :            : {
   11972                 :            :         /*
   11973                 :            :          * The calculation for the data clock is:
   11974                 :            :          * pixel_clock = ((m/n)*(link_clock * nr_lanes))/bpp
   11975                 :            :          * But we want to avoid losing precison if possible, so:
   11976                 :            :          * pixel_clock = ((m * link_clock * nr_lanes)/(n*bpp))
   11977                 :            :          *
   11978                 :            :          * and the link clock is simpler:
   11979                 :            :          * link_clock = (m * link_clock) / n
   11980                 :            :          */
   11981                 :            : 
   11982         [ #  # ]:          0 :         if (!m_n->link_n)
   11983                 :            :                 return 0;
   11984                 :            : 
   11985                 :          0 :         return div_u64(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
   11986                 :            : }
   11987                 :            : 
   11988                 :          0 : static void ilk_pch_clock_get(struct intel_crtc *crtc,
   11989                 :            :                               struct intel_crtc_state *pipe_config)
   11990                 :            : {
   11991                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   11992                 :            : 
   11993                 :            :         /* read out port_clock from the DPLL */
   11994                 :          0 :         i9xx_crtc_clock_get(crtc, pipe_config);
   11995                 :            : 
   11996                 :            :         /*
   11997                 :            :          * In case there is an active pipe without active ports,
   11998                 :            :          * we may need some idea for the dotclock anyway.
   11999                 :            :          * Calculate one based on the FDI configuration.
   12000                 :            :          */
   12001         [ #  # ]:          0 :         pipe_config->hw.adjusted_mode.crtc_clock =
   12002         [ #  # ]:          0 :                 intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
   12003                 :            :                                          &pipe_config->fdi_m_n);
   12004                 :          0 : }
   12005                 :            : 
   12006                 :          0 : static void intel_crtc_state_reset(struct intel_crtc_state *crtc_state,
   12007                 :            :                                    struct intel_crtc *crtc)
   12008                 :            : {
   12009                 :          0 :         memset(crtc_state, 0, sizeof(*crtc_state));
   12010                 :            : 
   12011                 :          0 :         __drm_atomic_helper_crtc_state_reset(&crtc_state->uapi, &crtc->base);
   12012                 :            : 
   12013                 :          0 :         crtc_state->cpu_transcoder = INVALID_TRANSCODER;
   12014                 :          0 :         crtc_state->master_transcoder = INVALID_TRANSCODER;
   12015                 :          0 :         crtc_state->hsw_workaround_pipe = INVALID_PIPE;
   12016                 :          0 :         crtc_state->output_format = INTEL_OUTPUT_FORMAT_INVALID;
   12017                 :          0 :         crtc_state->scaler_state.scaler_id = -1;
   12018                 :          0 :         crtc_state->mst_master_transcoder = INVALID_TRANSCODER;
   12019                 :          0 : }
   12020                 :            : 
   12021                 :          0 : static struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc)
   12022                 :            : {
   12023                 :          0 :         struct intel_crtc_state *crtc_state;
   12024                 :            : 
   12025                 :          0 :         crtc_state = kmalloc(sizeof(*crtc_state), GFP_KERNEL);
   12026                 :            : 
   12027         [ #  # ]:          0 :         if (crtc_state)
   12028                 :          0 :                 intel_crtc_state_reset(crtc_state, crtc);
   12029                 :            : 
   12030                 :          0 :         return crtc_state;
   12031                 :            : }
   12032                 :            : 
   12033                 :            : /* Returns the currently programmed mode of the given encoder. */
   12034                 :            : struct drm_display_mode *
   12035                 :          0 : intel_encoder_current_mode(struct intel_encoder *encoder)
   12036                 :            : {
   12037                 :          0 :         struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   12038                 :          0 :         struct intel_crtc_state *crtc_state;
   12039                 :          0 :         struct drm_display_mode *mode;
   12040                 :          0 :         struct intel_crtc *crtc;
   12041                 :          0 :         enum pipe pipe;
   12042                 :            : 
   12043         [ #  # ]:          0 :         if (!encoder->get_hw_state(encoder, &pipe))
   12044                 :            :                 return NULL;
   12045                 :            : 
   12046                 :          0 :         crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   12047                 :            : 
   12048                 :          0 :         mode = kzalloc(sizeof(*mode), GFP_KERNEL);
   12049         [ #  # ]:          0 :         if (!mode)
   12050                 :            :                 return NULL;
   12051                 :            : 
   12052                 :          0 :         crtc_state = intel_crtc_state_alloc(crtc);
   12053         [ #  # ]:          0 :         if (!crtc_state) {
   12054                 :          0 :                 kfree(mode);
   12055                 :          0 :                 return NULL;
   12056                 :            :         }
   12057                 :            : 
   12058         [ #  # ]:          0 :         if (!dev_priv->display.get_pipe_config(crtc, crtc_state)) {
   12059                 :          0 :                 kfree(crtc_state);
   12060                 :          0 :                 kfree(mode);
   12061                 :          0 :                 return NULL;
   12062                 :            :         }
   12063                 :            : 
   12064                 :          0 :         encoder->get_config(encoder, crtc_state);
   12065                 :            : 
   12066                 :          0 :         intel_mode_from_pipe_config(mode, crtc_state);
   12067                 :            : 
   12068                 :          0 :         kfree(crtc_state);
   12069                 :            : 
   12070                 :          0 :         return mode;
   12071                 :            : }
   12072                 :            : 
   12073                 :          0 : static void intel_crtc_destroy(struct drm_crtc *crtc)
   12074                 :            : {
   12075                 :          0 :         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
   12076                 :            : 
   12077                 :          0 :         drm_crtc_cleanup(crtc);
   12078                 :          0 :         kfree(intel_crtc);
   12079                 :          0 : }
   12080                 :            : 
   12081                 :            : /**
   12082                 :            :  * intel_wm_need_update - Check whether watermarks need updating
   12083                 :            :  * @cur: current plane state
   12084                 :            :  * @new: new plane state
   12085                 :            :  *
   12086                 :            :  * Check current plane state versus the new one to determine whether
   12087                 :            :  * watermarks need to be recalculated.
   12088                 :            :  *
   12089                 :            :  * Returns true or false.
   12090                 :            :  */
   12091                 :          0 : static bool intel_wm_need_update(const struct intel_plane_state *cur,
   12092                 :            :                                  struct intel_plane_state *new)
   12093                 :            : {
   12094                 :            :         /* Update watermarks on tiling or size changes. */
   12095         [ #  # ]:          0 :         if (new->uapi.visible != cur->uapi.visible)
   12096                 :            :                 return true;
   12097                 :            : 
   12098   [ #  #  #  # ]:          0 :         if (!cur->hw.fb || !new->hw.fb)
   12099                 :            :                 return false;
   12100                 :            : 
   12101         [ #  # ]:          0 :         if (cur->hw.fb->modifier != new->hw.fb->modifier ||
   12102   [ #  #  #  # ]:          0 :             cur->hw.rotation != new->hw.rotation ||
   12103   [ #  #  #  # ]:          0 :             drm_rect_width(&new->uapi.src) != drm_rect_width(&cur->uapi.src) ||
   12104   [ #  #  #  # ]:          0 :             drm_rect_height(&new->uapi.src) != drm_rect_height(&cur->uapi.src) ||
   12105   [ #  #  #  # ]:          0 :             drm_rect_width(&new->uapi.dst) != drm_rect_width(&cur->uapi.dst) ||
   12106         [ #  # ]:          0 :             drm_rect_height(&new->uapi.dst) != drm_rect_height(&cur->uapi.dst))
   12107                 :          0 :                 return true;
   12108                 :            : 
   12109                 :            :         return false;
   12110                 :            : }
   12111                 :            : 
   12112                 :          0 : static bool needs_scaling(const struct intel_plane_state *state)
   12113                 :            : {
   12114   [ #  #  #  # ]:          0 :         int src_w = drm_rect_width(&state->uapi.src) >> 16;
   12115   [ #  #  #  # ]:          0 :         int src_h = drm_rect_height(&state->uapi.src) >> 16;
   12116                 :          0 :         int dst_w = drm_rect_width(&state->uapi.dst);
   12117                 :          0 :         int dst_h = drm_rect_height(&state->uapi.dst);
   12118                 :            : 
   12119                 :          0 :         return (src_w != dst_w || src_h != dst_h);
   12120                 :            : }
   12121                 :            : 
   12122                 :          0 : int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
   12123                 :            :                                     struct intel_crtc_state *crtc_state,
   12124                 :            :                                     const struct intel_plane_state *old_plane_state,
   12125                 :            :                                     struct intel_plane_state *plane_state)
   12126                 :            : {
   12127                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   12128                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   12129         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12130         [ #  # ]:          0 :         bool mode_changed = needs_modeset(crtc_state);
   12131                 :          0 :         bool was_crtc_enabled = old_crtc_state->hw.active;
   12132                 :          0 :         bool is_crtc_enabled = crtc_state->hw.active;
   12133                 :          0 :         bool turn_off, turn_on, visible, was_visible;
   12134                 :          0 :         int ret;
   12135                 :            : 
   12136   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_CURSOR) {
   12137                 :          0 :                 ret = skl_update_scaler_plane(crtc_state, plane_state);
   12138         [ #  # ]:          0 :                 if (ret)
   12139                 :            :                         return ret;
   12140                 :            :         }
   12141                 :            : 
   12142                 :          0 :         was_visible = old_plane_state->uapi.visible;
   12143                 :          0 :         visible = plane_state->uapi.visible;
   12144                 :            : 
   12145   [ #  #  #  #  :          0 :         if (!was_crtc_enabled && WARN_ON(was_visible))
                   #  # ]
   12146                 :          0 :                 was_visible = false;
   12147                 :            : 
   12148                 :            :         /*
   12149                 :            :          * Visibility is calculated as if the crtc was on, but
   12150                 :            :          * after scaler setup everything depends on it being off
   12151                 :            :          * when the crtc isn't active.
   12152                 :            :          *
   12153                 :            :          * FIXME this is wrong for watermarks. Watermarks should also
   12154                 :            :          * be computed as if the pipe would be active. Perhaps move
   12155                 :            :          * per-plane wm computation to the .check_plane() hook, and
   12156                 :            :          * only combine the results from all planes in the current place?
   12157                 :            :          */
   12158         [ #  # ]:          0 :         if (!is_crtc_enabled) {
   12159                 :          0 :                 plane_state->uapi.visible = visible = false;
   12160                 :          0 :                 crtc_state->active_planes &= ~BIT(plane->id);
   12161                 :          0 :                 crtc_state->data_rate[plane->id] = 0;
   12162                 :          0 :                 crtc_state->min_cdclk[plane->id] = 0;
   12163                 :            :         }
   12164                 :            : 
   12165         [ #  # ]:          0 :         if (!was_visible && !visible)
   12166                 :            :                 return 0;
   12167                 :            : 
   12168   [ #  #  #  # ]:          0 :         turn_off = was_visible && (!visible || mode_changed);
   12169   [ #  #  #  # ]:          0 :         turn_on = visible && (!was_visible || mode_changed);
   12170                 :            : 
   12171                 :          0 :         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] with [PLANE:%d:%s] visible %i -> %i, off %i, on %i, ms %i\n",
   12172                 :            :                          crtc->base.base.id, crtc->base.name,
   12173                 :            :                          plane->base.base.id, plane->base.name,
   12174                 :            :                          was_visible, visible,
   12175                 :            :                          turn_off, turn_on, mode_changed);
   12176                 :            : 
   12177         [ #  # ]:          0 :         if (turn_on) {
   12178   [ #  #  #  #  :          0 :                 if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
                   #  # ]
   12179                 :          0 :                         crtc_state->update_wm_pre = true;
   12180                 :            : 
   12181                 :            :                 /* must disable cxsr around plane enable/disable */
   12182         [ #  # ]:          0 :                 if (plane->id != PLANE_CURSOR)
   12183                 :          0 :                         crtc_state->disable_cxsr = true;
   12184         [ #  # ]:          0 :         } else if (turn_off) {
   12185   [ #  #  #  #  :          0 :                 if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
                   #  # ]
   12186                 :          0 :                         crtc_state->update_wm_post = true;
   12187                 :            : 
   12188                 :            :                 /* must disable cxsr around plane enable/disable */
   12189         [ #  # ]:          0 :                 if (plane->id != PLANE_CURSOR)
   12190                 :          0 :                         crtc_state->disable_cxsr = true;
   12191         [ #  # ]:          0 :         } else if (intel_wm_need_update(old_plane_state, plane_state)) {
   12192   [ #  #  #  #  :          0 :                 if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv)) {
                   #  # ]
   12193                 :            :                         /* FIXME bollocks */
   12194                 :          0 :                         crtc_state->update_wm_pre = true;
   12195                 :          0 :                         crtc_state->update_wm_post = true;
   12196                 :            :                 }
   12197                 :            :         }
   12198                 :            : 
   12199                 :          0 :         if (visible || was_visible)
   12200                 :          0 :                 crtc_state->fb_bits |= plane->frontbuffer_bit;
   12201                 :            : 
   12202                 :            :         /*
   12203                 :            :          * ILK/SNB DVSACNTR/Sprite Enable
   12204                 :            :          * IVB SPR_CTL/Sprite Enable
   12205                 :            :          * "When in Self Refresh Big FIFO mode, a write to enable the
   12206                 :            :          *  plane will be internally buffered and delayed while Big FIFO
   12207                 :            :          *  mode is exiting."
   12208                 :            :          *
   12209                 :            :          * Which means that enabling the sprite can take an extra frame
   12210                 :            :          * when we start in big FIFO mode (LP1+). Thus we need to drop
   12211                 :            :          * down to LP0 and wait for vblank in order to make sure the
   12212                 :            :          * sprite gets enabled on the next vblank after the register write.
   12213                 :            :          * Doing otherwise would risk enabling the sprite one frame after
   12214                 :            :          * we've already signalled flip completion. We can resume LP1+
   12215                 :            :          * once the sprite has been enabled.
   12216                 :            :          *
   12217                 :            :          *
   12218                 :            :          * WaCxSRDisabledForSpriteScaling:ivb
   12219                 :            :          * IVB SPR_SCALE/Scaling Enable
   12220                 :            :          * "Low Power watermarks must be disabled for at least one
   12221                 :            :          *  frame before enabling sprite scaling, and kept disabled
   12222                 :            :          *  until sprite scaling is disabled."
   12223                 :            :          *
   12224                 :            :          * ILK/SNB DVSASCALE/Scaling Enable
   12225                 :            :          * "When in Self Refresh Big FIFO mode, scaling enable will be
   12226                 :            :          *  masked off while Big FIFO mode is exiting."
   12227                 :            :          *
   12228                 :            :          * Despite the w/a only being listed for IVB we assume that
   12229                 :            :          * the ILK/SNB note has similar ramifications, hence we apply
   12230                 :            :          * the w/a on all three platforms.
   12231                 :            :          *
   12232                 :            :          * With experimental results seems this is needed also for primary
   12233                 :            :          * plane, not only sprite plane.
   12234                 :            :          */
   12235         [ #  # ]:          0 :         if (plane->id != PLANE_CURSOR &&
   12236   [ #  #  #  # ]:          0 :             (IS_GEN_RANGE(dev_priv, 5, 6) ||
   12237         [ #  # ]:          0 :              IS_IVYBRIDGE(dev_priv)) &&
   12238   [ #  #  #  # ]:          0 :             (turn_on || (!needs_scaling(old_plane_state) &&
   12239                 :            :                          needs_scaling(plane_state))))
   12240                 :          0 :                 crtc_state->disable_lp_wm = true;
   12241                 :            : 
   12242                 :            :         return 0;
   12243                 :            : }
   12244                 :            : 
   12245                 :          0 : static bool encoders_cloneable(const struct intel_encoder *a,
   12246                 :            :                                const struct intel_encoder *b)
   12247                 :            : {
   12248                 :            :         /* masks could be asymmetric, so check both ways */
   12249         [ #  # ]:          0 :         return a == b || (a->cloneable & (1 << b->type) &&
   12250         [ #  # ]:          0 :                           b->cloneable & (1 << a->type));
   12251                 :            : }
   12252                 :            : 
   12253                 :            : static bool check_single_encoder_cloning(struct drm_atomic_state *state,
   12254                 :            :                                          struct intel_crtc *crtc,
   12255                 :            :                                          struct intel_encoder *encoder)
   12256                 :            : {
   12257                 :            :         struct intel_encoder *source_encoder;
   12258                 :            :         struct drm_connector *connector;
   12259                 :            :         struct drm_connector_state *connector_state;
   12260                 :            :         int i;
   12261                 :            : 
   12262                 :            :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   12263                 :            :                 if (connector_state->crtc != &crtc->base)
   12264                 :            :                         continue;
   12265                 :            : 
   12266                 :            :                 source_encoder =
   12267                 :            :                         to_intel_encoder(connector_state->best_encoder);
   12268                 :            :                 if (!encoders_cloneable(encoder, source_encoder))
   12269                 :            :                         return false;
   12270                 :            :         }
   12271                 :            : 
   12272                 :            :         return true;
   12273                 :            : }
   12274                 :            : 
   12275                 :          0 : static int icl_add_linked_planes(struct intel_atomic_state *state)
   12276                 :            : {
   12277                 :          0 :         struct intel_plane *plane, *linked;
   12278                 :          0 :         struct intel_plane_state *plane_state, *linked_plane_state;
   12279                 :          0 :         int i;
   12280                 :            : 
   12281   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12282                 :          0 :                 linked = plane_state->planar_linked_plane;
   12283                 :            : 
   12284         [ #  # ]:          0 :                 if (!linked)
   12285                 :          0 :                         continue;
   12286                 :            : 
   12287                 :          0 :                 linked_plane_state = intel_atomic_get_plane_state(state, linked);
   12288         [ #  # ]:          0 :                 if (IS_ERR(linked_plane_state))
   12289                 :          0 :                         return PTR_ERR(linked_plane_state);
   12290                 :            : 
   12291         [ #  # ]:          0 :                 WARN_ON(linked_plane_state->planar_linked_plane != plane);
   12292         [ #  # ]:          0 :                 WARN_ON(linked_plane_state->planar_slave == plane_state->planar_slave);
   12293                 :            :         }
   12294                 :            : 
   12295                 :            :         return 0;
   12296                 :            : }
   12297                 :            : 
   12298                 :          0 : static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
   12299                 :            : {
   12300                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   12301         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12302                 :          0 :         struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
   12303                 :          0 :         struct intel_plane *plane, *linked;
   12304                 :          0 :         struct intel_plane_state *plane_state;
   12305                 :          0 :         int i;
   12306                 :            : 
   12307         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 11)
   12308                 :            :                 return 0;
   12309                 :            : 
   12310                 :            :         /*
   12311                 :            :          * Destroy all old plane links and make the slave plane invisible
   12312                 :            :          * in the crtc_state->active_planes mask.
   12313                 :            :          */
   12314   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12315   [ #  #  #  # ]:          0 :                 if (plane->pipe != crtc->pipe || !plane_state->planar_linked_plane)
   12316                 :          0 :                         continue;
   12317                 :            : 
   12318                 :          0 :                 plane_state->planar_linked_plane = NULL;
   12319   [ #  #  #  # ]:          0 :                 if (plane_state->planar_slave && !plane_state->uapi.visible) {
   12320                 :          0 :                         crtc_state->active_planes &= ~BIT(plane->id);
   12321                 :          0 :                         crtc_state->update_planes |= BIT(plane->id);
   12322                 :            :                 }
   12323                 :            : 
   12324                 :          0 :                 plane_state->planar_slave = false;
   12325                 :            :         }
   12326                 :            : 
   12327         [ #  # ]:          0 :         if (!crtc_state->nv12_planes)
   12328                 :            :                 return 0;
   12329                 :            : 
   12330   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12331                 :          0 :                 struct intel_plane_state *linked_state = NULL;
   12332                 :            : 
   12333         [ #  # ]:          0 :                 if (plane->pipe != crtc->pipe ||
   12334         [ #  # ]:          0 :                     !(crtc_state->nv12_planes & BIT(plane->id)))
   12335                 :          0 :                         continue;
   12336                 :            : 
   12337   [ #  #  #  # ]:          0 :                 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, linked) {
   12338         [ #  # ]:          0 :                         if (!icl_is_nv12_y_plane(linked->id))
   12339                 :          0 :                                 continue;
   12340                 :            : 
   12341         [ #  # ]:          0 :                         if (crtc_state->active_planes & BIT(linked->id))
   12342                 :          0 :                                 continue;
   12343                 :            : 
   12344                 :          0 :                         linked_state = intel_atomic_get_plane_state(state, linked);
   12345         [ #  # ]:          0 :                         if (IS_ERR(linked_state))
   12346                 :          0 :                                 return PTR_ERR(linked_state);
   12347                 :            : 
   12348                 :            :                         break;
   12349                 :            :                 }
   12350                 :            : 
   12351         [ #  # ]:          0 :                 if (!linked_state) {
   12352         [ #  # ]:          0 :                         DRM_DEBUG_KMS("Need %d free Y planes for planar YUV\n",
   12353                 :            :                                       hweight8(crtc_state->nv12_planes));
   12354                 :            : 
   12355                 :          0 :                         return -EINVAL;
   12356                 :            :                 }
   12357                 :            : 
   12358                 :          0 :                 plane_state->planar_linked_plane = linked;
   12359                 :            : 
   12360                 :          0 :                 linked_state->planar_slave = true;
   12361                 :          0 :                 linked_state->planar_linked_plane = plane;
   12362                 :          0 :                 crtc_state->active_planes |= BIT(linked->id);
   12363                 :          0 :                 crtc_state->update_planes |= BIT(linked->id);
   12364                 :          0 :                 DRM_DEBUG_KMS("Using %s as Y plane for %s\n", linked->base.name, plane->base.name);
   12365                 :            : 
   12366                 :            :                 /* Copy parameters to slave plane */
   12367                 :          0 :                 linked_state->ctl = plane_state->ctl | PLANE_CTL_YUV420_Y_PLANE;
   12368                 :          0 :                 linked_state->color_ctl = plane_state->color_ctl;
   12369                 :          0 :                 linked_state->view = plane_state->view;
   12370                 :          0 :                 memcpy(linked_state->color_plane, plane_state->color_plane,
   12371                 :            :                        sizeof(linked_state->color_plane));
   12372                 :            : 
   12373                 :          0 :                 intel_plane_copy_uapi_to_hw_state(linked_state, plane_state);
   12374                 :          0 :                 linked_state->uapi.src = plane_state->uapi.src;
   12375                 :          0 :                 linked_state->uapi.dst = plane_state->uapi.dst;
   12376                 :            : 
   12377         [ #  # ]:          0 :                 if (icl_is_hdr_plane(dev_priv, plane->id)) {
   12378         [ #  # ]:          0 :                         if (linked->id == PLANE_SPRITE5)
   12379                 :          0 :                                 plane_state->cus_ctl |= PLANE_CUS_PLANE_7;
   12380         [ #  # ]:          0 :                         else if (linked->id == PLANE_SPRITE4)
   12381                 :            :                                 plane_state->cus_ctl |= PLANE_CUS_PLANE_6;
   12382                 :            :                         else
   12383                 :          0 :                                 MISSING_CASE(linked->id);
   12384                 :            :                 }
   12385                 :            :         }
   12386                 :            : 
   12387                 :            :         return 0;
   12388                 :            : }
   12389                 :            : 
   12390                 :          0 : static bool c8_planes_changed(const struct intel_crtc_state *new_crtc_state)
   12391                 :            : {
   12392                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   12393                 :          0 :         struct intel_atomic_state *state =
   12394                 :          0 :                 to_intel_atomic_state(new_crtc_state->uapi.state);
   12395                 :          0 :         const struct intel_crtc_state *old_crtc_state =
   12396                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
   12397                 :            : 
   12398         [ #  # ]:          0 :         return !old_crtc_state->c8_planes != !new_crtc_state->c8_planes;
   12399                 :            : }
   12400                 :            : 
   12401                 :            : static bool
   12402                 :            : intel_atomic_is_master_connector(struct intel_crtc_state *crtc_state)
   12403                 :            : {
   12404                 :            :         struct drm_crtc *crtc = crtc_state->uapi.crtc;
   12405                 :            :         struct drm_atomic_state *state = crtc_state->uapi.state;
   12406                 :            :         struct drm_connector *connector;
   12407                 :            :         struct drm_connector_state *connector_state;
   12408                 :            :         int i;
   12409                 :            : 
   12410                 :            :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   12411                 :            :                 if (connector_state->crtc != crtc)
   12412                 :            :                         continue;
   12413                 :            :                 if (connector->has_tile &&
   12414                 :            :                     connector->tile_h_loc == connector->num_h_tile - 1 &&
   12415                 :            :                     connector->tile_v_loc == connector->num_v_tile - 1)
   12416                 :            :                         return true;
   12417                 :            :         }
   12418                 :            : 
   12419                 :            :         return false;
   12420                 :            : }
   12421                 :            : 
   12422                 :          0 : static void reset_port_sync_mode_state(struct intel_crtc_state *crtc_state)
   12423                 :            : {
   12424                 :          0 :         crtc_state->master_transcoder = INVALID_TRANSCODER;
   12425                 :          0 :         crtc_state->sync_mode_slaves_mask = 0;
   12426                 :            : }
   12427                 :            : 
   12428                 :          0 : static int icl_compute_port_sync_crtc_state(struct drm_connector *connector,
   12429                 :            :                                             struct intel_crtc_state *crtc_state,
   12430                 :            :                                             int num_tiled_conns)
   12431                 :            : {
   12432                 :          0 :         struct drm_crtc *crtc = crtc_state->uapi.crtc;
   12433                 :          0 :         struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
   12434         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   12435                 :          0 :         struct drm_connector *master_connector;
   12436                 :          0 :         struct drm_connector_list_iter conn_iter;
   12437                 :          0 :         struct drm_crtc *master_crtc = NULL;
   12438                 :          0 :         struct drm_crtc_state *master_crtc_state;
   12439                 :          0 :         struct intel_crtc_state *master_pipe_config;
   12440                 :            : 
   12441         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 11)
   12442                 :            :                 return 0;
   12443                 :            : 
   12444         [ #  # ]:          0 :         if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
   12445                 :            :                 return 0;
   12446                 :            : 
   12447                 :            :         /*
   12448                 :            :          * In case of tiled displays there could be one or more slaves but there is
   12449                 :            :          * only one master. Lets make the CRTC used by the connector corresponding
   12450                 :            :          * to the last horizonal and last vertical tile a master/genlock CRTC.
   12451                 :            :          * All the other CRTCs corresponding to other tiles of the same Tile group
   12452                 :            :          * are the slave CRTCs and hold a pointer to their genlock CRTC.
   12453                 :            :          * If all tiles not present do not make master slave assignments.
   12454                 :            :          */
   12455         [ #  # ]:          0 :         if (!connector->has_tile ||
   12456         [ #  # ]:          0 :             crtc_state->hw.mode.hdisplay != connector->tile_h_size ||
   12457         [ #  # ]:          0 :             crtc_state->hw.mode.vdisplay != connector->tile_v_size ||
   12458         [ #  # ]:          0 :             num_tiled_conns < connector->num_h_tile * connector->num_v_tile) {
   12459                 :          0 :                 reset_port_sync_mode_state(crtc_state);
   12460                 :          0 :                 return 0;
   12461                 :            :         }
   12462                 :            :         /* Last Horizontal and last vertical tile connector is a master
   12463                 :            :          * Master's crtc state is already populated in slave for port sync
   12464                 :            :          */
   12465         [ #  # ]:          0 :         if (connector->tile_h_loc == connector->num_h_tile - 1 &&
   12466         [ #  # ]:          0 :             connector->tile_v_loc == connector->num_v_tile - 1)
   12467                 :            :                 return 0;
   12468                 :            : 
   12469                 :            :         /* Loop through all connectors and configure the Slave crtc_state
   12470                 :            :          * to point to the correct master.
   12471                 :            :          */
   12472                 :          0 :         drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
   12473         [ #  # ]:          0 :         drm_for_each_connector_iter(master_connector, &conn_iter) {
   12474                 :          0 :                 struct drm_connector_state *master_conn_state = NULL;
   12475                 :            : 
   12476         [ #  # ]:          0 :                 if (!(master_connector->has_tile &&
   12477         [ #  # ]:          0 :                       master_connector->tile_group->id == connector->tile_group->id))
   12478                 :          0 :                         continue;
   12479         [ #  # ]:          0 :                 if (master_connector->tile_h_loc != master_connector->num_h_tile - 1 ||
   12480         [ #  # ]:          0 :                     master_connector->tile_v_loc != master_connector->num_v_tile - 1)
   12481                 :          0 :                         continue;
   12482                 :            : 
   12483                 :          0 :                 master_conn_state = drm_atomic_get_connector_state(&state->base,
   12484                 :            :                                                                    master_connector);
   12485         [ #  # ]:          0 :                 if (IS_ERR(master_conn_state)) {
   12486                 :          0 :                         drm_connector_list_iter_end(&conn_iter);
   12487                 :          0 :                         return PTR_ERR(master_conn_state);
   12488                 :            :                 }
   12489         [ #  # ]:          0 :                 if (master_conn_state->crtc) {
   12490                 :            :                         master_crtc = master_conn_state->crtc;
   12491                 :            :                         break;
   12492                 :            :                 }
   12493                 :            :         }
   12494                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   12495                 :            : 
   12496         [ #  # ]:          0 :         if (!master_crtc) {
   12497                 :          0 :                 DRM_DEBUG_KMS("Could not find Master CRTC for Slave CRTC %d\n",
   12498                 :            :                               crtc->base.id);
   12499                 :          0 :                 return -EINVAL;
   12500                 :            :         }
   12501                 :            : 
   12502                 :          0 :         master_crtc_state = drm_atomic_get_crtc_state(&state->base,
   12503                 :            :                                                       master_crtc);
   12504         [ #  # ]:          0 :         if (IS_ERR(master_crtc_state))
   12505                 :          0 :                 return PTR_ERR(master_crtc_state);
   12506                 :            : 
   12507                 :          0 :         master_pipe_config = to_intel_crtc_state(master_crtc_state);
   12508                 :          0 :         crtc_state->master_transcoder = master_pipe_config->cpu_transcoder;
   12509                 :          0 :         master_pipe_config->sync_mode_slaves_mask |=
   12510                 :          0 :                 BIT(crtc_state->cpu_transcoder);
   12511         [ #  # ]:          0 :         DRM_DEBUG_KMS("Master Transcoder = %s added for Slave CRTC = %d, slave transcoder bitmask = %d\n",
   12512                 :            :                       transcoder_name(crtc_state->master_transcoder),
   12513                 :            :                       crtc->base.id,
   12514                 :            :                       master_pipe_config->sync_mode_slaves_mask);
   12515                 :            : 
   12516                 :          0 :         return 0;
   12517                 :            : }
   12518                 :            : 
   12519                 :          0 : static int intel_crtc_atomic_check(struct intel_atomic_state *state,
   12520                 :            :                                    struct intel_crtc *crtc)
   12521                 :            : {
   12522         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12523         [ #  # ]:          0 :         struct intel_crtc_state *crtc_state =
   12524                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
   12525         [ #  # ]:          0 :         bool mode_changed = needs_modeset(crtc_state);
   12526                 :          0 :         int ret;
   12527                 :            : 
   12528   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) &&
             #  #  #  # ]
   12529         [ #  # ]:          0 :             mode_changed && !crtc_state->hw.active)
   12530                 :          0 :                 crtc_state->update_wm_post = true;
   12531                 :            : 
   12532   [ #  #  #  # ]:          0 :         if (mode_changed && crtc_state->hw.enable &&
   12533         [ #  # ]:          0 :             dev_priv->display.crtc_compute_clock &&
   12534   [ #  #  #  # ]:          0 :             !WARN_ON(crtc_state->shared_dpll)) {
   12535                 :          0 :                 ret = dev_priv->display.crtc_compute_clock(crtc, crtc_state);
   12536         [ #  # ]:          0 :                 if (ret)
   12537                 :            :                         return ret;
   12538                 :            :         }
   12539                 :            : 
   12540                 :            :         /*
   12541                 :            :          * May need to update pipe gamma enable bits
   12542                 :            :          * when C8 planes are getting enabled/disabled.
   12543                 :            :          */
   12544         [ #  # ]:          0 :         if (c8_planes_changed(crtc_state))
   12545                 :          0 :                 crtc_state->uapi.color_mgmt_changed = true;
   12546                 :            : 
   12547   [ #  #  #  #  :          0 :         if (mode_changed || crtc_state->update_pipe ||
                   #  # ]
   12548                 :            :             crtc_state->uapi.color_mgmt_changed) {
   12549                 :          0 :                 ret = intel_color_check(crtc_state);
   12550         [ #  # ]:          0 :                 if (ret)
   12551                 :            :                         return ret;
   12552                 :            :         }
   12553                 :            : 
   12554                 :          0 :         ret = 0;
   12555         [ #  # ]:          0 :         if (dev_priv->display.compute_pipe_wm) {
   12556                 :          0 :                 ret = dev_priv->display.compute_pipe_wm(crtc_state);
   12557         [ #  # ]:          0 :                 if (ret) {
   12558                 :          0 :                         DRM_DEBUG_KMS("Target pipe watermarks are invalid\n");
   12559                 :          0 :                         return ret;
   12560                 :            :                 }
   12561                 :            :         }
   12562                 :            : 
   12563         [ #  # ]:          0 :         if (dev_priv->display.compute_intermediate_wm) {
   12564   [ #  #  #  # ]:          0 :                 if (WARN_ON(!dev_priv->display.compute_pipe_wm))
   12565                 :            :                         return 0;
   12566                 :            : 
   12567                 :            :                 /*
   12568                 :            :                  * Calculate 'intermediate' watermarks that satisfy both the
   12569                 :            :                  * old state and the new state.  We can program these
   12570                 :            :                  * immediately.
   12571                 :            :                  */
   12572                 :          0 :                 ret = dev_priv->display.compute_intermediate_wm(crtc_state);
   12573         [ #  # ]:          0 :                 if (ret) {
   12574                 :          0 :                         DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n");
   12575                 :          0 :                         return ret;
   12576                 :            :                 }
   12577                 :            :         }
   12578                 :            : 
   12579         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9) {
   12580   [ #  #  #  # ]:          0 :                 if (mode_changed || crtc_state->update_pipe)
   12581                 :          0 :                         ret = skl_update_scaler_crtc(crtc_state);
   12582         [ #  # ]:          0 :                 if (!ret)
   12583                 :          0 :                         ret = intel_atomic_setup_scalers(dev_priv, crtc,
   12584                 :            :                                                          crtc_state);
   12585                 :            :         }
   12586                 :            : 
   12587   [ #  #  #  # ]:          0 :         if (HAS_IPS(dev_priv))
   12588                 :          0 :                 crtc_state->ips_enabled = hsw_compute_ips_config(crtc_state);
   12589                 :            : 
   12590                 :            :         return ret;
   12591                 :            : }
   12592                 :            : 
   12593                 :          0 : static void intel_modeset_update_connector_atomic_state(struct drm_device *dev)
   12594                 :            : {
   12595                 :          0 :         struct intel_connector *connector;
   12596                 :          0 :         struct drm_connector_list_iter conn_iter;
   12597                 :            : 
   12598                 :          0 :         drm_connector_list_iter_begin(dev, &conn_iter);
   12599         [ #  # ]:          0 :         for_each_intel_connector_iter(connector, &conn_iter) {
   12600         [ #  # ]:          0 :                 if (connector->base.state->crtc)
   12601                 :          0 :                         drm_connector_put(&connector->base);
   12602                 :            : 
   12603         [ #  # ]:          0 :                 if (connector->base.encoder) {
   12604                 :          0 :                         connector->base.state->best_encoder =
   12605                 :            :                                 connector->base.encoder;
   12606                 :          0 :                         connector->base.state->crtc =
   12607                 :          0 :                                 connector->base.encoder->crtc;
   12608                 :            : 
   12609                 :          0 :                         drm_connector_get(&connector->base);
   12610                 :            :                 } else {
   12611                 :          0 :                         connector->base.state->best_encoder = NULL;
   12612                 :          0 :                         connector->base.state->crtc = NULL;
   12613                 :            :                 }
   12614                 :            :         }
   12615                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   12616                 :          0 : }
   12617                 :            : 
   12618                 :            : static int
   12619                 :            : compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
   12620                 :            :                       struct intel_crtc_state *pipe_config)
   12621                 :            : {
   12622                 :            :         struct drm_connector *connector = conn_state->connector;
   12623                 :            :         const struct drm_display_info *info = &connector->display_info;
   12624                 :            :         int bpp;
   12625                 :            : 
   12626                 :            :         switch (conn_state->max_bpc) {
   12627                 :            :         case 6 ... 7:
   12628                 :            :                 bpp = 6 * 3;
   12629                 :            :                 break;
   12630                 :            :         case 8 ... 9:
   12631                 :            :                 bpp = 8 * 3;
   12632                 :            :                 break;
   12633                 :            :         case 10 ... 11:
   12634                 :            :                 bpp = 10 * 3;
   12635                 :            :                 break;
   12636                 :            :         case 12:
   12637                 :            :                 bpp = 12 * 3;
   12638                 :            :                 break;
   12639                 :            :         default:
   12640                 :            :                 return -EINVAL;
   12641                 :            :         }
   12642                 :            : 
   12643                 :            :         if (bpp < pipe_config->pipe_bpp) {
   12644                 :            :                 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Limiting display bpp to %d instead of "
   12645                 :            :                               "EDID bpp %d, requested bpp %d, max platform bpp %d\n",
   12646                 :            :                               connector->base.id, connector->name,
   12647                 :            :                               bpp, 3 * info->bpc, 3 * conn_state->max_requested_bpc,
   12648                 :            :                               pipe_config->pipe_bpp);
   12649                 :            : 
   12650                 :            :                 pipe_config->pipe_bpp = bpp;
   12651                 :            :         }
   12652                 :            : 
   12653                 :            :         return 0;
   12654                 :            : }
   12655                 :            : 
   12656                 :            : static int
   12657                 :          0 : compute_baseline_pipe_bpp(struct intel_crtc *crtc,
   12658                 :            :                           struct intel_crtc_state *pipe_config)
   12659                 :            : {
   12660         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12661                 :          0 :         struct drm_atomic_state *state = pipe_config->uapi.state;
   12662                 :          0 :         struct drm_connector *connector;
   12663                 :          0 :         struct drm_connector_state *connector_state;
   12664                 :          0 :         int bpp, i;
   12665                 :            : 
   12666   [ #  #  #  #  :          0 :         if ((IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
             #  #  #  # ]
   12667                 :            :             IS_CHERRYVIEW(dev_priv)))
   12668                 :            :                 bpp = 10*3;
   12669         [ #  # ]:          0 :         else if (INTEL_GEN(dev_priv) >= 5)
   12670                 :            :                 bpp = 12*3;
   12671                 :            :         else
   12672                 :          0 :                 bpp = 8*3;
   12673                 :            : 
   12674                 :          0 :         pipe_config->pipe_bpp = bpp;
   12675                 :            : 
   12676                 :            :         /* Clamp display bpp to connector max bpp */
   12677   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   12678                 :          0 :                 int ret;
   12679                 :            : 
   12680         [ #  # ]:          0 :                 if (connector_state->crtc != &crtc->base)
   12681                 :          0 :                         continue;
   12682                 :            : 
   12683                 :          0 :                 ret = compute_sink_pipe_bpp(connector_state, pipe_config);
   12684         [ #  # ]:          0 :                 if (ret)
   12685                 :          0 :                         return ret;
   12686                 :            :         }
   12687                 :            : 
   12688                 :            :         return 0;
   12689                 :            : }
   12690                 :            : 
   12691                 :          0 : static void intel_dump_crtc_timings(const struct drm_display_mode *mode)
   12692                 :            : {
   12693                 :          0 :         DRM_DEBUG_KMS("crtc timings: %d %d %d %d %d %d %d %d %d, "
   12694                 :            :                       "type: 0x%x flags: 0x%x\n",
   12695                 :            :                       mode->crtc_clock,
   12696                 :            :                       mode->crtc_hdisplay, mode->crtc_hsync_start,
   12697                 :            :                       mode->crtc_hsync_end, mode->crtc_htotal,
   12698                 :            :                       mode->crtc_vdisplay, mode->crtc_vsync_start,
   12699                 :            :                       mode->crtc_vsync_end, mode->crtc_vtotal,
   12700                 :            :                       mode->type, mode->flags);
   12701                 :          0 : }
   12702                 :            : 
   12703                 :            : static inline void
   12704                 :            : intel_dump_m_n_config(const struct intel_crtc_state *pipe_config,
   12705                 :            :                       const char *id, unsigned int lane_count,
   12706                 :            :                       const struct intel_link_m_n *m_n)
   12707                 :            : {
   12708                 :            :         DRM_DEBUG_KMS("%s: lanes: %i; gmch_m: %u, gmch_n: %u, link_m: %u, link_n: %u, tu: %u\n",
   12709                 :            :                       id, lane_count,
   12710                 :            :                       m_n->gmch_m, m_n->gmch_n,
   12711                 :            :                       m_n->link_m, m_n->link_n, m_n->tu);
   12712                 :            : }
   12713                 :            : 
   12714                 :            : static void
   12715                 :          0 : intel_dump_infoframe(struct drm_i915_private *dev_priv,
   12716                 :            :                      const union hdmi_infoframe *frame)
   12717                 :            : {
   12718                 :          0 :         if (!drm_debug_enabled(DRM_UT_KMS))
   12719                 :            :                 return;
   12720                 :            : 
   12721                 :          0 :         hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, frame);
   12722                 :            : }
   12723                 :            : 
   12724                 :            : #define OUTPUT_TYPE(x) [INTEL_OUTPUT_ ## x] = #x
   12725                 :            : 
   12726                 :            : static const char * const output_type_str[] = {
   12727                 :            :         OUTPUT_TYPE(UNUSED),
   12728                 :            :         OUTPUT_TYPE(ANALOG),
   12729                 :            :         OUTPUT_TYPE(DVO),
   12730                 :            :         OUTPUT_TYPE(SDVO),
   12731                 :            :         OUTPUT_TYPE(LVDS),
   12732                 :            :         OUTPUT_TYPE(TVOUT),
   12733                 :            :         OUTPUT_TYPE(HDMI),
   12734                 :            :         OUTPUT_TYPE(DP),
   12735                 :            :         OUTPUT_TYPE(EDP),
   12736                 :            :         OUTPUT_TYPE(DSI),
   12737                 :            :         OUTPUT_TYPE(DDI),
   12738                 :            :         OUTPUT_TYPE(DP_MST),
   12739                 :            : };
   12740                 :            : 
   12741                 :            : #undef OUTPUT_TYPE
   12742                 :            : 
   12743                 :          0 : static void snprintf_output_types(char *buf, size_t len,
   12744                 :            :                                   unsigned int output_types)
   12745                 :            : {
   12746                 :          0 :         char *str = buf;
   12747                 :          0 :         int i;
   12748                 :            : 
   12749                 :          0 :         str[0] = '\0';
   12750                 :            : 
   12751         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(output_type_str); i++) {
   12752                 :          0 :                 int r;
   12753                 :            : 
   12754         [ #  # ]:          0 :                 if ((output_types & BIT(i)) == 0)
   12755                 :          0 :                         continue;
   12756                 :            : 
   12757         [ #  # ]:          0 :                 r = snprintf(str, len, "%s%s",
   12758                 :            :                              str != buf ? "," : "", output_type_str[i]);
   12759         [ #  # ]:          0 :                 if (r >= len)
   12760                 :            :                         break;
   12761                 :          0 :                 str += r;
   12762                 :          0 :                 len -= r;
   12763                 :            : 
   12764                 :          0 :                 output_types &= ~BIT(i);
   12765                 :            :         }
   12766                 :            : 
   12767   [ #  #  #  # ]:          0 :         WARN_ON_ONCE(output_types != 0);
   12768                 :          0 : }
   12769                 :            : 
   12770                 :            : static const char * const output_format_str[] = {
   12771                 :            :         [INTEL_OUTPUT_FORMAT_INVALID] = "Invalid",
   12772                 :            :         [INTEL_OUTPUT_FORMAT_RGB] = "RGB",
   12773                 :            :         [INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
   12774                 :            :         [INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
   12775                 :            : };
   12776                 :            : 
   12777                 :          0 : static const char *output_formats(enum intel_output_format format)
   12778                 :            : {
   12779                 :          0 :         if (format >= ARRAY_SIZE(output_format_str))
   12780                 :          0 :                 format = INTEL_OUTPUT_FORMAT_INVALID;
   12781                 :          0 :         return output_format_str[format];
   12782                 :            : }
   12783                 :            : 
   12784                 :          0 : static void intel_dump_plane_state(const struct intel_plane_state *plane_state)
   12785                 :            : {
   12786                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   12787                 :          0 :         const struct drm_framebuffer *fb = plane_state->hw.fb;
   12788                 :          0 :         struct drm_format_name_buf format_name;
   12789                 :            : 
   12790         [ #  # ]:          0 :         if (!fb) {
   12791         [ #  # ]:          0 :                 DRM_DEBUG_KMS("[PLANE:%d:%s] fb: [NOFB], visible: %s\n",
   12792                 :            :                               plane->base.base.id, plane->base.name,
   12793                 :            :                               yesno(plane_state->uapi.visible));
   12794                 :          0 :                 return;
   12795                 :            :         }
   12796                 :            : 
   12797         [ #  # ]:          0 :         DRM_DEBUG_KMS("[PLANE:%d:%s] fb: [FB:%d] %ux%u format = %s, visible: %s\n",
   12798                 :            :                       plane->base.base.id, plane->base.name,
   12799                 :            :                       fb->base.id, fb->width, fb->height,
   12800                 :            :                       drm_get_format_name(fb->format->format, &format_name),
   12801                 :            :                       yesno(plane_state->uapi.visible));
   12802                 :          0 :         DRM_DEBUG_KMS("\trotation: 0x%x, scaler: %d\n",
   12803                 :            :                       plane_state->hw.rotation, plane_state->scaler_id);
   12804         [ #  # ]:          0 :         if (plane_state->uapi.visible)
   12805                 :          0 :                 DRM_DEBUG_KMS("\tsrc: " DRM_RECT_FP_FMT " dst: " DRM_RECT_FMT "\n",
   12806                 :            :                               DRM_RECT_FP_ARG(&plane_state->uapi.src),
   12807                 :            :                               DRM_RECT_ARG(&plane_state->uapi.dst));
   12808                 :            : }
   12809                 :            : 
   12810                 :          0 : static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
   12811                 :            :                                    struct intel_atomic_state *state,
   12812                 :            :                                    const char *context)
   12813                 :            : {
   12814                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   12815         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12816                 :          0 :         const struct intel_plane_state *plane_state;
   12817                 :          0 :         struct intel_plane *plane;
   12818                 :          0 :         char buf[64];
   12819                 :          0 :         int i;
   12820                 :            : 
   12821         [ #  # ]:          0 :         DRM_DEBUG_KMS("[CRTC:%d:%s] enable: %s %s\n",
   12822                 :            :                       crtc->base.base.id, crtc->base.name,
   12823                 :            :                       yesno(pipe_config->hw.enable), context);
   12824                 :            : 
   12825         [ #  # ]:          0 :         if (!pipe_config->hw.enable)
   12826                 :          0 :                 goto dump_planes;
   12827                 :            : 
   12828                 :          0 :         snprintf_output_types(buf, sizeof(buf), pipe_config->output_types);
   12829   [ #  #  #  # ]:          0 :         DRM_DEBUG_KMS("active: %s, output_types: %s (0x%x), output format: %s\n",
   12830                 :            :                       yesno(pipe_config->hw.active),
   12831                 :            :                       buf, pipe_config->output_types,
   12832                 :            :                       output_formats(pipe_config->output_format));
   12833                 :            : 
   12834         [ #  # ]:          0 :         DRM_DEBUG_KMS("cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
   12835                 :            :                       transcoder_name(pipe_config->cpu_transcoder),
   12836                 :            :                       pipe_config->pipe_bpp, pipe_config->dither);
   12837                 :            : 
   12838         [ #  # ]:          0 :         if (pipe_config->has_pch_encoder)
   12839                 :          0 :                 intel_dump_m_n_config(pipe_config, "fdi",
   12840                 :          0 :                                       pipe_config->fdi_lanes,
   12841                 :            :                                       &pipe_config->fdi_m_n);
   12842                 :            : 
   12843         [ #  # ]:          0 :         if (intel_crtc_has_dp_encoder(pipe_config)) {
   12844                 :          0 :                 intel_dump_m_n_config(pipe_config, "dp m_n",
   12845                 :          0 :                                 pipe_config->lane_count, &pipe_config->dp_m_n);
   12846         [ #  # ]:          0 :                 if (pipe_config->has_drrs)
   12847                 :          0 :                         intel_dump_m_n_config(pipe_config, "dp m2_n2",
   12848                 :          0 :                                               pipe_config->lane_count,
   12849                 :            :                                               &pipe_config->dp_m2_n2);
   12850                 :            :         }
   12851                 :            : 
   12852                 :          0 :         DRM_DEBUG_KMS("audio: %i, infoframes: %i, infoframes enabled: 0x%x\n",
   12853                 :            :                       pipe_config->has_audio, pipe_config->has_infoframe,
   12854                 :            :                       pipe_config->infoframes.enable);
   12855                 :            : 
   12856         [ #  # ]:          0 :         if (pipe_config->infoframes.enable &
   12857                 :          0 :             intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL))
   12858                 :          0 :                 DRM_DEBUG_KMS("GCP: 0x%x\n", pipe_config->infoframes.gcp);
   12859         [ #  # ]:          0 :         if (pipe_config->infoframes.enable &
   12860                 :          0 :             intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI))
   12861         [ #  # ]:          0 :                 intel_dump_infoframe(dev_priv, &pipe_config->infoframes.avi);
   12862         [ #  # ]:          0 :         if (pipe_config->infoframes.enable &
   12863                 :          0 :             intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD))
   12864         [ #  # ]:          0 :                 intel_dump_infoframe(dev_priv, &pipe_config->infoframes.spd);
   12865         [ #  # ]:          0 :         if (pipe_config->infoframes.enable &
   12866                 :          0 :             intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR))
   12867         [ #  # ]:          0 :                 intel_dump_infoframe(dev_priv, &pipe_config->infoframes.hdmi);
   12868                 :            : 
   12869                 :          0 :         DRM_DEBUG_KMS("requested mode:\n");
   12870                 :          0 :         drm_mode_debug_printmodeline(&pipe_config->hw.mode);
   12871                 :          0 :         DRM_DEBUG_KMS("adjusted mode:\n");
   12872                 :          0 :         drm_mode_debug_printmodeline(&pipe_config->hw.adjusted_mode);
   12873                 :          0 :         intel_dump_crtc_timings(&pipe_config->hw.adjusted_mode);
   12874                 :          0 :         DRM_DEBUG_KMS("port clock: %d, pipe src size: %dx%d, pixel rate %d\n",
   12875                 :            :                       pipe_config->port_clock,
   12876                 :            :                       pipe_config->pipe_src_w, pipe_config->pipe_src_h,
   12877                 :            :                       pipe_config->pixel_rate);
   12878                 :            : 
   12879         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   12880                 :          0 :                 DRM_DEBUG_KMS("num_scalers: %d, scaler_users: 0x%x, scaler_id: %d\n",
   12881                 :            :                               crtc->num_scalers,
   12882                 :            :                               pipe_config->scaler_state.scaler_users,
   12883                 :            :                               pipe_config->scaler_state.scaler_id);
   12884                 :            : 
   12885         [ #  # ]:          0 :         if (HAS_GMCH(dev_priv))
   12886                 :          0 :                 DRM_DEBUG_KMS("gmch pfit: control: 0x%08x, ratios: 0x%08x, lvds border: 0x%08x\n",
   12887                 :            :                               pipe_config->gmch_pfit.control,
   12888                 :            :                               pipe_config->gmch_pfit.pgm_ratios,
   12889                 :            :                               pipe_config->gmch_pfit.lvds_border_bits);
   12890                 :            :         else
   12891   [ #  #  #  # ]:          0 :                 DRM_DEBUG_KMS("pch pfit: pos: 0x%08x, size: 0x%08x, %s, force thru: %s\n",
   12892                 :            :                               pipe_config->pch_pfit.pos,
   12893                 :            :                               pipe_config->pch_pfit.size,
   12894                 :            :                               enableddisabled(pipe_config->pch_pfit.enabled),
   12895                 :            :                               yesno(pipe_config->pch_pfit.force_thru));
   12896                 :            : 
   12897                 :          0 :         DRM_DEBUG_KMS("ips: %i, double wide: %i\n",
   12898                 :            :                       pipe_config->ips_enabled, pipe_config->double_wide);
   12899                 :            : 
   12900                 :          0 :         intel_dpll_dump_hw_state(dev_priv, &pipe_config->dpll_hw_state);
   12901                 :            : 
   12902         [ #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv))
   12903                 :          0 :                 DRM_DEBUG_KMS("cgm_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d csc_enable: %d\n",
   12904                 :            :                               pipe_config->cgm_mode, pipe_config->gamma_mode,
   12905                 :            :                               pipe_config->gamma_enable, pipe_config->csc_enable);
   12906                 :            :         else
   12907                 :          0 :                 DRM_DEBUG_KMS("csc_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d csc_enable: %d\n",
   12908                 :            :                               pipe_config->csc_mode, pipe_config->gamma_mode,
   12909                 :            :                               pipe_config->gamma_enable, pipe_config->csc_enable);
   12910                 :            : 
   12911         [ #  # ]:          0 :         DRM_DEBUG_KMS("MST master transcoder: %s\n",
   12912                 :            :                       transcoder_name(pipe_config->mst_master_transcoder));
   12913                 :            : 
   12914                 :          0 : dump_planes:
   12915         [ #  # ]:          0 :         if (!state)
   12916                 :          0 :                 return;
   12917                 :            : 
   12918   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12919         [ #  # ]:          0 :                 if (plane->pipe == crtc->pipe)
   12920                 :          0 :                         intel_dump_plane_state(plane_state);
   12921                 :            :         }
   12922                 :            : }
   12923                 :            : 
   12924                 :          0 : static bool check_digital_port_conflicts(struct intel_atomic_state *state)
   12925                 :            : {
   12926                 :          0 :         struct drm_device *dev = state->base.dev;
   12927                 :          0 :         struct drm_connector *connector;
   12928                 :          0 :         struct drm_connector_list_iter conn_iter;
   12929                 :          0 :         unsigned int used_ports = 0;
   12930                 :          0 :         unsigned int used_mst_ports = 0;
   12931                 :          0 :         bool ret = true;
   12932                 :            : 
   12933                 :            :         /*
   12934                 :            :          * We're going to peek into connector->state,
   12935                 :            :          * hence connection_mutex must be held.
   12936                 :            :          */
   12937                 :          0 :         drm_modeset_lock_assert_held(&dev->mode_config.connection_mutex);
   12938                 :            : 
   12939                 :            :         /*
   12940                 :            :          * Walk the connector list instead of the encoder
   12941                 :            :          * list to detect the problem on ddi platforms
   12942                 :            :          * where there's just one encoder per digital port.
   12943                 :            :          */
   12944                 :          0 :         drm_connector_list_iter_begin(dev, &conn_iter);
   12945         [ #  # ]:          0 :         drm_for_each_connector_iter(connector, &conn_iter) {
   12946                 :          0 :                 struct drm_connector_state *connector_state;
   12947                 :          0 :                 struct intel_encoder *encoder;
   12948                 :            : 
   12949                 :          0 :                 connector_state =
   12950         [ #  # ]:          0 :                         drm_atomic_get_new_connector_state(&state->base,
   12951                 :            :                                                            connector);
   12952         [ #  # ]:          0 :                 if (!connector_state)
   12953                 :          0 :                         connector_state = connector->state;
   12954                 :            : 
   12955         [ #  # ]:          0 :                 if (!connector_state->best_encoder)
   12956                 :          0 :                         continue;
   12957                 :            : 
   12958                 :          0 :                 encoder = to_intel_encoder(connector_state->best_encoder);
   12959                 :            : 
   12960         [ #  # ]:          0 :                 WARN_ON(!connector_state->crtc);
   12961                 :            : 
   12962   [ #  #  #  # ]:          0 :                 switch (encoder->type) {
   12963                 :          0 :                         unsigned int port_mask;
   12964                 :            :                 case INTEL_OUTPUT_DDI:
   12965   [ #  #  #  # ]:          0 :                         if (WARN_ON(!HAS_DDI(to_i915(dev))))
   12966                 :            :                                 break;
   12967                 :            :                         /* else, fall through */
   12968                 :            :                 case INTEL_OUTPUT_DP:
   12969                 :            :                 case INTEL_OUTPUT_HDMI:
   12970                 :            :                 case INTEL_OUTPUT_EDP:
   12971                 :          0 :                         port_mask = 1 << encoder->port;
   12972                 :            : 
   12973                 :            :                         /* the same port mustn't appear more than once */
   12974         [ #  # ]:          0 :                         if (used_ports & port_mask)
   12975                 :          0 :                                 ret = false;
   12976                 :            : 
   12977                 :          0 :                         used_ports |= port_mask;
   12978                 :          0 :                         break;
   12979                 :          0 :                 case INTEL_OUTPUT_DP_MST:
   12980                 :          0 :                         used_mst_ports |=
   12981                 :          0 :                                 1 << encoder->port;
   12982                 :          0 :                         break;
   12983                 :            :                 default:
   12984                 :            :                         break;
   12985                 :            :                 }
   12986                 :          0 :         }
   12987                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   12988                 :            : 
   12989                 :            :         /* can't mix MST and SST/HDMI on the same port */
   12990         [ #  # ]:          0 :         if (used_ports & used_mst_ports)
   12991                 :          0 :                 return false;
   12992                 :            : 
   12993                 :            :         return ret;
   12994                 :            : }
   12995                 :            : 
   12996                 :            : static void
   12997                 :          0 : intel_crtc_copy_uapi_to_hw_state_nomodeset(struct intel_crtc_state *crtc_state)
   12998                 :            : {
   12999                 :          0 :         intel_crtc_copy_color_blobs(crtc_state);
   13000                 :            : }
   13001                 :            : 
   13002                 :            : static void
   13003                 :          0 : intel_crtc_copy_uapi_to_hw_state(struct intel_crtc_state *crtc_state)
   13004                 :            : {
   13005                 :          0 :         crtc_state->hw.enable = crtc_state->uapi.enable;
   13006                 :          0 :         crtc_state->hw.active = crtc_state->uapi.active;
   13007                 :          0 :         crtc_state->hw.mode = crtc_state->uapi.mode;
   13008                 :          0 :         crtc_state->hw.adjusted_mode = crtc_state->uapi.adjusted_mode;
   13009                 :          0 :         intel_crtc_copy_uapi_to_hw_state_nomodeset(crtc_state);
   13010                 :          0 : }
   13011                 :            : 
   13012                 :          0 : static void intel_crtc_copy_hw_to_uapi_state(struct intel_crtc_state *crtc_state)
   13013                 :            : {
   13014                 :          0 :         crtc_state->uapi.enable = crtc_state->hw.enable;
   13015                 :          0 :         crtc_state->uapi.active = crtc_state->hw.active;
   13016         [ #  # ]:          0 :         WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
   13017                 :            : 
   13018                 :          0 :         crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
   13019                 :            : 
   13020                 :            :         /* copy color blobs to uapi */
   13021                 :          0 :         drm_property_replace_blob(&crtc_state->uapi.degamma_lut,
   13022                 :            :                                   crtc_state->hw.degamma_lut);
   13023                 :          0 :         drm_property_replace_blob(&crtc_state->uapi.gamma_lut,
   13024                 :            :                                   crtc_state->hw.gamma_lut);
   13025                 :          0 :         drm_property_replace_blob(&crtc_state->uapi.ctm,
   13026                 :            :                                   crtc_state->hw.ctm);
   13027                 :          0 : }
   13028                 :            : 
   13029                 :            : static int
   13030                 :          0 : intel_crtc_prepare_cleared_state(struct intel_crtc_state *crtc_state)
   13031                 :            : {
   13032                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   13033                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   13034                 :          0 :         struct intel_crtc_state *saved_state;
   13035                 :            : 
   13036                 :          0 :         saved_state = intel_crtc_state_alloc(crtc);
   13037         [ #  # ]:          0 :         if (!saved_state)
   13038                 :            :                 return -ENOMEM;
   13039                 :            : 
   13040                 :            :         /* free the old crtc_state->hw members */
   13041                 :          0 :         intel_crtc_free_hw_state(crtc_state);
   13042                 :            : 
   13043                 :            :         /* FIXME: before the switch to atomic started, a new pipe_config was
   13044                 :            :          * kzalloc'd. Code that depends on any field being zero should be
   13045                 :            :          * fixed, so that the crtc_state can be safely duplicated. For now,
   13046                 :            :          * only fields that are know to not cause problems are preserved. */
   13047                 :            : 
   13048                 :          0 :         saved_state->uapi = crtc_state->uapi;
   13049                 :          0 :         saved_state->scaler_state = crtc_state->scaler_state;
   13050                 :          0 :         saved_state->shared_dpll = crtc_state->shared_dpll;
   13051                 :          0 :         saved_state->dpll_hw_state = crtc_state->dpll_hw_state;
   13052                 :          0 :         memcpy(saved_state->icl_port_dplls, crtc_state->icl_port_dplls,
   13053                 :            :                sizeof(saved_state->icl_port_dplls));
   13054                 :          0 :         saved_state->crc_enabled = crtc_state->crc_enabled;
   13055   [ #  #  #  #  :          0 :         if (IS_G4X(dev_priv) ||
                   #  # ]
   13056         [ #  # ]:          0 :             IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13057                 :          0 :                 saved_state->wm = crtc_state->wm;
   13058                 :            :         /*
   13059                 :            :          * Save the slave bitmask which gets filled for master crtc state during
   13060                 :            :          * slave atomic check call. For all other CRTCs reset the port sync variables
   13061                 :            :          * crtc_state->master_transcoder needs to be set to INVALID
   13062                 :            :          */
   13063                 :          0 :         reset_port_sync_mode_state(saved_state);
   13064         [ #  # ]:          0 :         if (intel_atomic_is_master_connector(crtc_state))
   13065                 :          0 :                 saved_state->sync_mode_slaves_mask =
   13066                 :          0 :                         crtc_state->sync_mode_slaves_mask;
   13067                 :            : 
   13068                 :          0 :         memcpy(crtc_state, saved_state, sizeof(*crtc_state));
   13069                 :          0 :         kfree(saved_state);
   13070                 :            : 
   13071                 :          0 :         intel_crtc_copy_uapi_to_hw_state(crtc_state);
   13072                 :            : 
   13073                 :          0 :         return 0;
   13074                 :            : }
   13075                 :            : 
   13076                 :            : static int
   13077                 :          0 : intel_modeset_pipe_config(struct intel_crtc_state *pipe_config)
   13078                 :            : {
   13079                 :          0 :         struct drm_crtc *crtc = pipe_config->uapi.crtc;
   13080                 :          0 :         struct drm_atomic_state *state = pipe_config->uapi.state;
   13081                 :          0 :         struct intel_encoder *encoder;
   13082                 :          0 :         struct drm_connector *connector;
   13083                 :          0 :         struct drm_connector_state *connector_state;
   13084                 :          0 :         int base_bpp, ret;
   13085                 :          0 :         int i, tile_group_id = -1, num_tiled_conns = 0;
   13086                 :          0 :         bool retry = true;
   13087                 :            : 
   13088                 :          0 :         pipe_config->cpu_transcoder =
   13089                 :          0 :                 (enum transcoder) to_intel_crtc(crtc)->pipe;
   13090                 :            : 
   13091                 :            :         /*
   13092                 :            :          * Sanitize sync polarity flags based on requested ones. If neither
   13093                 :            :          * positive or negative polarity is requested, treat this as meaning
   13094                 :            :          * negative polarity.
   13095                 :            :          */
   13096         [ #  # ]:          0 :         if (!(pipe_config->hw.adjusted_mode.flags &
   13097                 :            :               (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC)))
   13098                 :          0 :                 pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_NHSYNC;
   13099                 :            : 
   13100         [ #  # ]:          0 :         if (!(pipe_config->hw.adjusted_mode.flags &
   13101                 :            :               (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC)))
   13102                 :          0 :                 pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_NVSYNC;
   13103                 :            : 
   13104                 :          0 :         ret = compute_baseline_pipe_bpp(to_intel_crtc(crtc),
   13105                 :            :                                         pipe_config);
   13106         [ #  # ]:          0 :         if (ret)
   13107                 :            :                 return ret;
   13108                 :            : 
   13109                 :          0 :         base_bpp = pipe_config->pipe_bpp;
   13110                 :            : 
   13111                 :            :         /*
   13112                 :            :          * Determine the real pipe dimensions. Note that stereo modes can
   13113                 :            :          * increase the actual pipe size due to the frame doubling and
   13114                 :            :          * insertion of additional space for blanks between the frame. This
   13115                 :            :          * is stored in the crtc timings. We use the requested mode to do this
   13116                 :            :          * computation to clearly distinguish it from the adjusted mode, which
   13117                 :            :          * can be changed by the connectors in the below retry loop.
   13118                 :            :          */
   13119                 :          0 :         drm_mode_get_hv_timing(&pipe_config->hw.mode,
   13120                 :            :                                &pipe_config->pipe_src_w,
   13121                 :            :                                &pipe_config->pipe_src_h);
   13122                 :            : 
   13123   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   13124         [ #  # ]:          0 :                 if (connector_state->crtc != crtc)
   13125                 :          0 :                         continue;
   13126                 :            : 
   13127                 :          0 :                 encoder = to_intel_encoder(connector_state->best_encoder);
   13128                 :            : 
   13129         [ #  # ]:          0 :                 if (!check_single_encoder_cloning(state, to_intel_crtc(crtc), encoder)) {
   13130                 :          0 :                         DRM_DEBUG_KMS("rejecting invalid cloning configuration\n");
   13131                 :          0 :                         return -EINVAL;
   13132                 :            :                 }
   13133                 :            : 
   13134                 :            :                 /*
   13135                 :            :                  * Determine output_types before calling the .compute_config()
   13136                 :            :                  * hooks so that the hooks can use this information safely.
   13137                 :            :                  */
   13138         [ #  # ]:          0 :                 if (encoder->compute_output_type)
   13139                 :          0 :                         pipe_config->output_types |=
   13140                 :          0 :                                 BIT(encoder->compute_output_type(encoder, pipe_config,
   13141                 :            :                                                                  connector_state));
   13142                 :            :                 else
   13143                 :          0 :                         pipe_config->output_types |= BIT(encoder->type);
   13144                 :            :         }
   13145                 :            : 
   13146                 :          0 : encoder_retry:
   13147                 :            :         /* Ensure the port clock defaults are reset when retrying. */
   13148                 :          0 :         pipe_config->port_clock = 0;
   13149                 :          0 :         pipe_config->pixel_multiplier = 1;
   13150                 :            : 
   13151                 :            :         /* Fill in default crtc timings, allow encoders to overwrite them. */
   13152                 :          0 :         drm_mode_set_crtcinfo(&pipe_config->hw.adjusted_mode,
   13153                 :            :                               CRTC_STEREO_DOUBLE);
   13154                 :            : 
   13155                 :            :         /* Get tile_group_id of tiled connector */
   13156   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   13157         [ #  # ]:          0 :                 if (connector_state->crtc == crtc &&
   13158         [ #  # ]:          0 :                     connector->has_tile) {
   13159                 :          0 :                         tile_group_id = connector->tile_group->id;
   13160                 :          0 :                         break;
   13161                 :            :                 }
   13162                 :            :         }
   13163                 :            : 
   13164                 :            :         /* Get total number of tiled connectors in state that belong to
   13165                 :            :          * this tile group.
   13166                 :            :          */
   13167   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   13168         [ #  # ]:          0 :                 if (connector->has_tile &&
   13169         [ #  # ]:          0 :                     connector->tile_group->id == tile_group_id)
   13170                 :          0 :                         num_tiled_conns++;
   13171                 :            :         }
   13172                 :            : 
   13173                 :            :         /* Pass our mode to the connectors and the CRTC to give them a chance to
   13174                 :            :          * adjust it according to limitations or connector properties, and also
   13175                 :            :          * a chance to reject the mode entirely.
   13176                 :            :          */
   13177   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(state, connector, connector_state, i) {
   13178         [ #  # ]:          0 :                 if (connector_state->crtc != crtc)
   13179                 :          0 :                         continue;
   13180                 :            : 
   13181                 :          0 :                 ret = icl_compute_port_sync_crtc_state(connector, pipe_config,
   13182                 :            :                                                        num_tiled_conns);
   13183         [ #  # ]:          0 :                 if (ret) {
   13184                 :          0 :                         DRM_DEBUG_KMS("Cannot assign Sync Mode CRTCs: %d\n",
   13185                 :            :                                       ret);
   13186                 :          0 :                         return ret;
   13187                 :            :                 }
   13188                 :            : 
   13189                 :          0 :                 encoder = to_intel_encoder(connector_state->best_encoder);
   13190                 :          0 :                 ret = encoder->compute_config(encoder, pipe_config,
   13191                 :            :                                               connector_state);
   13192         [ #  # ]:          0 :                 if (ret < 0) {
   13193         [ #  # ]:          0 :                         if (ret != -EDEADLK)
   13194                 :          0 :                                 DRM_DEBUG_KMS("Encoder config failure: %d\n",
   13195                 :            :                                               ret);
   13196                 :          0 :                         return ret;
   13197                 :            :                 }
   13198                 :            :         }
   13199                 :            : 
   13200                 :            :         /* Set default port clock if not overwritten by the encoder. Needs to be
   13201                 :            :          * done afterwards in case the encoder adjusts the mode. */
   13202         [ #  # ]:          0 :         if (!pipe_config->port_clock)
   13203                 :          0 :                 pipe_config->port_clock = pipe_config->hw.adjusted_mode.crtc_clock
   13204                 :          0 :                         * pipe_config->pixel_multiplier;
   13205                 :            : 
   13206                 :          0 :         ret = intel_crtc_compute_config(to_intel_crtc(crtc), pipe_config);
   13207         [ #  # ]:          0 :         if (ret == -EDEADLK)
   13208                 :            :                 return ret;
   13209         [ #  # ]:          0 :         if (ret < 0) {
   13210                 :          0 :                 DRM_DEBUG_KMS("CRTC fixup failed\n");
   13211                 :          0 :                 return ret;
   13212                 :            :         }
   13213                 :            : 
   13214         [ #  # ]:          0 :         if (ret == RETRY) {
   13215   [ #  #  #  # ]:          0 :                 if (WARN(!retry, "loop in pipe configuration computation\n"))
   13216                 :            :                         return -EINVAL;
   13217                 :            : 
   13218                 :          0 :                 DRM_DEBUG_KMS("CRTC bw constrained, retrying\n");
   13219                 :          0 :                 retry = false;
   13220                 :          0 :                 goto encoder_retry;
   13221                 :            :         }
   13222                 :            : 
   13223                 :            :         /* Dithering seems to not pass-through bits correctly when it should, so
   13224                 :            :          * only enable it on 6bpc panels and when its not a compliance
   13225                 :            :          * test requesting 6bpc video pattern.
   13226                 :            :          */
   13227         [ #  # ]:          0 :         pipe_config->dither = (pipe_config->pipe_bpp == 6*3) &&
   13228         [ #  # ]:          0 :                 !pipe_config->dither_force_disable;
   13229                 :          0 :         DRM_DEBUG_KMS("hw max bpp: %i, pipe bpp: %i, dithering: %i\n",
   13230                 :            :                       base_bpp, pipe_config->pipe_bpp, pipe_config->dither);
   13231                 :            : 
   13232                 :            :         /*
   13233                 :            :          * Make drm_calc_timestamping_constants in
   13234                 :            :          * drm_atomic_helper_update_legacy_modeset_state() happy
   13235                 :            :          */
   13236                 :          0 :         pipe_config->uapi.adjusted_mode = pipe_config->hw.adjusted_mode;
   13237                 :            : 
   13238                 :          0 :         return 0;
   13239                 :            : }
   13240                 :            : 
   13241                 :          0 : bool intel_fuzzy_clock_check(int clock1, int clock2)
   13242                 :            : {
   13243                 :          0 :         int diff;
   13244                 :            : 
   13245         [ #  # ]:          0 :         if (clock1 == clock2)
   13246                 :            :                 return true;
   13247                 :            : 
   13248   [ #  #  #  #  :          0 :         if (!clock1 || !clock2)
          #  #  #  #  #  
                #  #  # ]
   13249                 :            :                 return false;
   13250                 :            : 
   13251                 :          0 :         diff = abs(clock1 - clock2);
   13252                 :            : 
   13253   [ #  #  #  #  :          0 :         if (((((diff + clock1 + clock2) * 100)) / (clock1 + clock2)) < 105)
          #  #  #  #  #  
                #  #  # ]
   13254                 :          0 :                 return true;
   13255                 :            : 
   13256                 :            :         return false;
   13257                 :            : }
   13258                 :            : 
   13259                 :            : static bool
   13260                 :          0 : intel_compare_m_n(unsigned int m, unsigned int n,
   13261                 :            :                   unsigned int m2, unsigned int n2,
   13262                 :            :                   bool exact)
   13263                 :            : {
   13264         [ #  # ]:          0 :         if (m == m2 && n == n2)
   13265                 :            :                 return true;
   13266                 :            : 
   13267   [ #  #  #  #  :          0 :         if (exact || !m || !n || !m2 || !n2)
                   #  # ]
   13268                 :            :                 return false;
   13269                 :            : 
   13270                 :          0 :         BUILD_BUG_ON(DATA_LINK_M_N_MASK > INT_MAX);
   13271                 :            : 
   13272         [ #  # ]:          0 :         if (n > n2) {
   13273         [ #  # ]:          0 :                 while (n > n2) {
   13274                 :          0 :                         m2 <<= 1;
   13275                 :          0 :                         n2 <<= 1;
   13276                 :            :                 }
   13277         [ #  # ]:          0 :         } else if (n < n2) {
   13278         [ #  # ]:          0 :                 while (n < n2) {
   13279                 :          0 :                         m <<= 1;
   13280                 :          0 :                         n <<= 1;
   13281                 :            :                 }
   13282                 :            :         }
   13283                 :            : 
   13284         [ #  # ]:          0 :         if (n != n2)
   13285                 :            :                 return false;
   13286                 :            : 
   13287         [ #  # ]:          0 :         return intel_fuzzy_clock_check(m, m2);
   13288                 :            : }
   13289                 :            : 
   13290                 :            : static bool
   13291                 :          0 : intel_compare_link_m_n(const struct intel_link_m_n *m_n,
   13292                 :            :                        const struct intel_link_m_n *m2_n2,
   13293                 :            :                        bool exact)
   13294                 :            : {
   13295         [ #  # ]:          0 :         return m_n->tu == m2_n2->tu &&
   13296                 :          0 :                 intel_compare_m_n(m_n->gmch_m, m_n->gmch_n,
   13297   [ #  #  #  # ]:          0 :                                   m2_n2->gmch_m, m2_n2->gmch_n, exact) &&
   13298                 :          0 :                 intel_compare_m_n(m_n->link_m, m_n->link_n,
   13299                 :            :                                   m2_n2->link_m, m2_n2->link_n, exact);
   13300                 :            : }
   13301                 :            : 
   13302                 :            : static bool
   13303                 :          0 : intel_compare_infoframe(const union hdmi_infoframe *a,
   13304                 :            :                         const union hdmi_infoframe *b)
   13305                 :            : {
   13306                 :          0 :         return memcmp(a, b, sizeof(*a)) == 0;
   13307                 :            : }
   13308                 :            : 
   13309                 :            : static void
   13310                 :          0 : pipe_config_infoframe_mismatch(struct drm_i915_private *dev_priv,
   13311                 :            :                                bool fastset, const char *name,
   13312                 :            :                                const union hdmi_infoframe *a,
   13313                 :            :                                const union hdmi_infoframe *b)
   13314                 :            : {
   13315         [ #  # ]:          0 :         if (fastset) {
   13316         [ #  # ]:          0 :                 if (!drm_debug_enabled(DRM_UT_KMS))
   13317                 :            :                         return;
   13318                 :            : 
   13319                 :          0 :                 DRM_DEBUG_KMS("fastset mismatch in %s infoframe\n", name);
   13320                 :          0 :                 DRM_DEBUG_KMS("expected:\n");
   13321                 :          0 :                 hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, a);
   13322                 :          0 :                 DRM_DEBUG_KMS("found:\n");
   13323                 :          0 :                 hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, b);
   13324                 :            :         } else {
   13325                 :          0 :                 DRM_ERROR("mismatch in %s infoframe\n", name);
   13326                 :          0 :                 DRM_ERROR("expected:\n");
   13327                 :          0 :                 hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, a);
   13328                 :          0 :                 DRM_ERROR("found:\n");
   13329                 :          0 :                 hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, b);
   13330                 :            :         }
   13331                 :            : }
   13332                 :            : 
   13333                 :            : static void __printf(4, 5)
   13334                 :          0 : pipe_config_mismatch(bool fastset, const struct intel_crtc *crtc,
   13335                 :            :                      const char *name, const char *format, ...)
   13336                 :            : {
   13337                 :          0 :         struct va_format vaf;
   13338                 :          0 :         va_list args;
   13339                 :            : 
   13340                 :          0 :         va_start(args, format);
   13341                 :          0 :         vaf.fmt = format;
   13342                 :          0 :         vaf.va = &args;
   13343                 :            : 
   13344         [ #  # ]:          0 :         if (fastset)
   13345                 :          0 :                 DRM_DEBUG_KMS("[CRTC:%d:%s] fastset mismatch in %s %pV\n",
   13346                 :            :                               crtc->base.base.id, crtc->base.name, name, &vaf);
   13347                 :            :         else
   13348                 :          0 :                 DRM_ERROR("[CRTC:%d:%s] mismatch in %s %pV\n",
   13349                 :            :                           crtc->base.base.id, crtc->base.name, name, &vaf);
   13350                 :            : 
   13351                 :          0 :         va_end(args);
   13352                 :          0 : }
   13353                 :            : 
   13354                 :          0 : static bool fastboot_enabled(struct drm_i915_private *dev_priv)
   13355                 :            : {
   13356         [ #  # ]:          0 :         if (i915_modparams.fastboot != -1)
   13357                 :          0 :                 return i915_modparams.fastboot;
   13358                 :            : 
   13359                 :            :         /* Enable fastboot by default on Skylake and newer */
   13360         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   13361                 :            :                 return true;
   13362                 :            : 
   13363                 :            :         /* Enable fastboot by default on VLV and CHV */
   13364   [ #  #  #  # ]:          0 :         if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13365                 :            :                 return true;
   13366                 :            : 
   13367                 :            :         /* Disabled by default on all others */
   13368                 :            :         return false;
   13369                 :            : }
   13370                 :            : 
   13371                 :            : static bool
   13372                 :          0 : intel_pipe_config_compare(const struct intel_crtc_state *current_config,
   13373                 :            :                           const struct intel_crtc_state *pipe_config,
   13374                 :            :                           bool fastset)
   13375                 :            : {
   13376         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(current_config->uapi.crtc->dev);
   13377                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   13378                 :          0 :         bool ret = true;
   13379                 :          0 :         u32 bp_gamma = 0;
   13380                 :          0 :         bool fixup_inherited = fastset &&
   13381   [ #  #  #  # ]:          0 :                 (current_config->hw.mode.private_flags & I915_MODE_FLAG_INHERITED) &&
   13382         [ #  # ]:          0 :                 !(pipe_config->hw.mode.private_flags & I915_MODE_FLAG_INHERITED);
   13383                 :            : 
   13384   [ #  #  #  # ]:          0 :         if (fixup_inherited && !fastboot_enabled(dev_priv)) {
   13385                 :          0 :                 DRM_DEBUG_KMS("initial modeset and fastboot not set\n");
   13386                 :          0 :                 ret = false;
   13387                 :            :         }
   13388                 :            : 
   13389                 :            : #define PIPE_CONF_CHECK_X(name) do { \
   13390                 :            :         if (current_config->name != pipe_config->name) { \
   13391                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13392                 :            :                                      "(expected 0x%08x, found 0x%08x)", \
   13393                 :            :                                      current_config->name, \
   13394                 :            :                                      pipe_config->name); \
   13395                 :            :                 ret = false; \
   13396                 :            :         } \
   13397                 :            : } while (0)
   13398                 :            : 
   13399                 :            : #define PIPE_CONF_CHECK_I(name) do { \
   13400                 :            :         if (current_config->name != pipe_config->name) { \
   13401                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13402                 :            :                                      "(expected %i, found %i)", \
   13403                 :            :                                      current_config->name, \
   13404                 :            :                                      pipe_config->name); \
   13405                 :            :                 ret = false; \
   13406                 :            :         } \
   13407                 :            : } while (0)
   13408                 :            : 
   13409                 :            : #define PIPE_CONF_CHECK_BOOL(name) do { \
   13410                 :            :         if (current_config->name != pipe_config->name) { \
   13411                 :            :                 pipe_config_mismatch(fastset, crtc,  __stringify(name), \
   13412                 :            :                                      "(expected %s, found %s)", \
   13413                 :            :                                      yesno(current_config->name), \
   13414                 :            :                                      yesno(pipe_config->name)); \
   13415                 :            :                 ret = false; \
   13416                 :            :         } \
   13417                 :            : } while (0)
   13418                 :            : 
   13419                 :            : /*
   13420                 :            :  * Checks state where we only read out the enabling, but not the entire
   13421                 :            :  * state itself (like full infoframes or ELD for audio). These states
   13422                 :            :  * require a full modeset on bootup to fix up.
   13423                 :            :  */
   13424                 :            : #define PIPE_CONF_CHECK_BOOL_INCOMPLETE(name) do { \
   13425                 :            :         if (!fixup_inherited || (!current_config->name && !pipe_config->name)) { \
   13426                 :            :                 PIPE_CONF_CHECK_BOOL(name); \
   13427                 :            :         } else { \
   13428                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13429                 :            :                                      "unable to verify whether state matches exactly, forcing modeset (expected %s, found %s)", \
   13430                 :            :                                      yesno(current_config->name), \
   13431                 :            :                                      yesno(pipe_config->name)); \
   13432                 :            :                 ret = false; \
   13433                 :            :         } \
   13434                 :            : } while (0)
   13435                 :            : 
   13436                 :            : #define PIPE_CONF_CHECK_P(name) do { \
   13437                 :            :         if (current_config->name != pipe_config->name) { \
   13438                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13439                 :            :                                      "(expected %p, found %p)", \
   13440                 :            :                                      current_config->name, \
   13441                 :            :                                      pipe_config->name); \
   13442                 :            :                 ret = false; \
   13443                 :            :         } \
   13444                 :            : } while (0)
   13445                 :            : 
   13446                 :            : #define PIPE_CONF_CHECK_M_N(name) do { \
   13447                 :            :         if (!intel_compare_link_m_n(&current_config->name, \
   13448                 :            :                                     &pipe_config->name,\
   13449                 :            :                                     !fastset)) { \
   13450                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13451                 :            :                                      "(expected tu %i gmch %i/%i link %i/%i, " \
   13452                 :            :                                      "found tu %i, gmch %i/%i link %i/%i)", \
   13453                 :            :                                      current_config->name.tu, \
   13454                 :            :                                      current_config->name.gmch_m, \
   13455                 :            :                                      current_config->name.gmch_n, \
   13456                 :            :                                      current_config->name.link_m, \
   13457                 :            :                                      current_config->name.link_n, \
   13458                 :            :                                      pipe_config->name.tu, \
   13459                 :            :                                      pipe_config->name.gmch_m, \
   13460                 :            :                                      pipe_config->name.gmch_n, \
   13461                 :            :                                      pipe_config->name.link_m, \
   13462                 :            :                                      pipe_config->name.link_n); \
   13463                 :            :                 ret = false; \
   13464                 :            :         } \
   13465                 :            : } while (0)
   13466                 :            : 
   13467                 :            : /* This is required for BDW+ where there is only one set of registers for
   13468                 :            :  * switching between high and low RR.
   13469                 :            :  * This macro can be used whenever a comparison has to be made between one
   13470                 :            :  * hw state and multiple sw state variables.
   13471                 :            :  */
   13472                 :            : #define PIPE_CONF_CHECK_M_N_ALT(name, alt_name) do { \
   13473                 :            :         if (!intel_compare_link_m_n(&current_config->name, \
   13474                 :            :                                     &pipe_config->name, !fastset) && \
   13475                 :            :             !intel_compare_link_m_n(&current_config->alt_name, \
   13476                 :            :                                     &pipe_config->name, !fastset)) { \
   13477                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13478                 :            :                                      "(expected tu %i gmch %i/%i link %i/%i, " \
   13479                 :            :                                      "or tu %i gmch %i/%i link %i/%i, " \
   13480                 :            :                                      "found tu %i, gmch %i/%i link %i/%i)", \
   13481                 :            :                                      current_config->name.tu, \
   13482                 :            :                                      current_config->name.gmch_m, \
   13483                 :            :                                      current_config->name.gmch_n, \
   13484                 :            :                                      current_config->name.link_m, \
   13485                 :            :                                      current_config->name.link_n, \
   13486                 :            :                                      current_config->alt_name.tu, \
   13487                 :            :                                      current_config->alt_name.gmch_m, \
   13488                 :            :                                      current_config->alt_name.gmch_n, \
   13489                 :            :                                      current_config->alt_name.link_m, \
   13490                 :            :                                      current_config->alt_name.link_n, \
   13491                 :            :                                      pipe_config->name.tu, \
   13492                 :            :                                      pipe_config->name.gmch_m, \
   13493                 :            :                                      pipe_config->name.gmch_n, \
   13494                 :            :                                      pipe_config->name.link_m, \
   13495                 :            :                                      pipe_config->name.link_n); \
   13496                 :            :                 ret = false; \
   13497                 :            :         } \
   13498                 :            : } while (0)
   13499                 :            : 
   13500                 :            : #define PIPE_CONF_CHECK_FLAGS(name, mask) do { \
   13501                 :            :         if ((current_config->name ^ pipe_config->name) & (mask)) { \
   13502                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13503                 :            :                                      "(%x) (expected %i, found %i)", \
   13504                 :            :                                      (mask), \
   13505                 :            :                                      current_config->name & (mask), \
   13506                 :            :                                      pipe_config->name & (mask)); \
   13507                 :            :                 ret = false; \
   13508                 :            :         } \
   13509                 :            : } while (0)
   13510                 :            : 
   13511                 :            : #define PIPE_CONF_CHECK_CLOCK_FUZZY(name) do { \
   13512                 :            :         if (!intel_fuzzy_clock_check(current_config->name, pipe_config->name)) { \
   13513                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13514                 :            :                                      "(expected %i, found %i)", \
   13515                 :            :                                      current_config->name, \
   13516                 :            :                                      pipe_config->name); \
   13517                 :            :                 ret = false; \
   13518                 :            :         } \
   13519                 :            : } while (0)
   13520                 :            : 
   13521                 :            : #define PIPE_CONF_CHECK_INFOFRAME(name) do { \
   13522                 :            :         if (!intel_compare_infoframe(&current_config->infoframes.name, \
   13523                 :            :                                      &pipe_config->infoframes.name)) { \
   13524                 :            :                 pipe_config_infoframe_mismatch(dev_priv, fastset, __stringify(name), \
   13525                 :            :                                                &current_config->infoframes.name, \
   13526                 :            :                                                &pipe_config->infoframes.name); \
   13527                 :            :                 ret = false; \
   13528                 :            :         } \
   13529                 :            : } while (0)
   13530                 :            : 
   13531                 :            : #define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \
   13532                 :            :         if (current_config->name1 != pipe_config->name1) { \
   13533                 :            :                 pipe_config_mismatch(fastset, crtc, __stringify(name1), \
   13534                 :            :                                 "(expected %i, found %i, won't compare lut values)", \
   13535                 :            :                                 current_config->name1, \
   13536                 :            :                                 pipe_config->name1); \
   13537                 :            :                 ret = false;\
   13538                 :            :         } else { \
   13539                 :            :                 if (!intel_color_lut_equal(current_config->name2, \
   13540                 :            :                                         pipe_config->name2, pipe_config->name1, \
   13541                 :            :                                         bit_precision)) { \
   13542                 :            :                         pipe_config_mismatch(fastset, crtc, __stringify(name2), \
   13543                 :            :                                         "hw_state doesn't match sw_state"); \
   13544                 :            :                         ret = false; \
   13545                 :            :                 } \
   13546                 :            :         } \
   13547                 :            : } while (0)
   13548                 :            : 
   13549                 :            : #define PIPE_CONF_QUIRK(quirk) \
   13550                 :            :         ((current_config->quirks | pipe_config->quirks) & (quirk))
   13551                 :            : 
   13552         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(cpu_transcoder);
   13553                 :            : 
   13554   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(has_pch_encoder);
   13555         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(fdi_lanes);
   13556         [ #  # ]:          0 :         PIPE_CONF_CHECK_M_N(fdi_m_n);
   13557                 :            : 
   13558         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(lane_count);
   13559         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(lane_lat_optim_mask);
   13560                 :            : 
   13561         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 8) {
   13562         [ #  # ]:          0 :                 PIPE_CONF_CHECK_M_N(dp_m_n);
   13563                 :            : 
   13564         [ #  # ]:          0 :                 if (current_config->has_drrs)
   13565         [ #  # ]:          0 :                         PIPE_CONF_CHECK_M_N(dp_m2_n2);
   13566                 :            :         } else
   13567   [ #  #  #  # ]:          0 :                 PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
   13568                 :            : 
   13569         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(output_types);
   13570                 :            : 
   13571         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hdisplay);
   13572         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_htotal);
   13573         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hblank_start);
   13574         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hblank_end);
   13575         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hsync_start);
   13576         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hsync_end);
   13577                 :            : 
   13578         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vdisplay);
   13579         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vtotal);
   13580         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vblank_start);
   13581         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vblank_end);
   13582         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vsync_start);
   13583         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vsync_end);
   13584                 :            : 
   13585         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(pixel_multiplier);
   13586         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(output_format);
   13587         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(dc3co_exitline);
   13588   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(has_hdmi_sink);
   13589   [ #  #  #  #  :          0 :         if ((INTEL_GEN(dev_priv) < 8 && !IS_HASWELL(dev_priv)) ||
                   #  # ]
   13590         [ #  # ]:          0 :             IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13591   [ #  #  #  # ]:          0 :                 PIPE_CONF_CHECK_BOOL(limited_color_range);
   13592                 :            : 
   13593   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(hdmi_scrambling);
   13594   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio);
   13595   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(has_infoframe);
   13596   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(fec_enable);
   13597                 :            : 
   13598   [ #  #  #  #  :          0 :         PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio);
          #  #  #  #  #  
                #  #  # ]
   13599                 :            : 
   13600         [ #  # ]:          0 :         PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13601                 :            :                               DRM_MODE_FLAG_INTERLACE);
   13602                 :            : 
   13603         [ #  # ]:          0 :         if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS)) {
   13604         [ #  # ]:          0 :                 PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13605                 :            :                                       DRM_MODE_FLAG_PHSYNC);
   13606         [ #  # ]:          0 :                 PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13607                 :            :                                       DRM_MODE_FLAG_NHSYNC);
   13608         [ #  # ]:          0 :                 PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13609                 :            :                                       DRM_MODE_FLAG_PVSYNC);
   13610         [ #  # ]:          0 :                 PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13611                 :            :                                       DRM_MODE_FLAG_NVSYNC);
   13612                 :            :         }
   13613                 :            : 
   13614         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(gmch_pfit.control);
   13615                 :            :         /* pfit ratios are autocomputed by the hw on gen4+ */
   13616         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4)
   13617         [ #  # ]:          0 :                 PIPE_CONF_CHECK_X(gmch_pfit.pgm_ratios);
   13618         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(gmch_pfit.lvds_border_bits);
   13619                 :            : 
   13620                 :            :         /*
   13621                 :            :          * Changing the EDP transcoder input mux
   13622                 :            :          * (A_ONOFF vs. A_ON) requires a full modeset.
   13623                 :            :          */
   13624   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(pch_pfit.force_thru);
   13625                 :            : 
   13626         [ #  # ]:          0 :         if (!fastset) {
   13627         [ #  # ]:          0 :                 PIPE_CONF_CHECK_I(pipe_src_w);
   13628         [ #  # ]:          0 :                 PIPE_CONF_CHECK_I(pipe_src_h);
   13629                 :            : 
   13630   [ #  #  #  # ]:          0 :                 PIPE_CONF_CHECK_BOOL(pch_pfit.enabled);
   13631         [ #  # ]:          0 :                 if (current_config->pch_pfit.enabled) {
   13632         [ #  # ]:          0 :                         PIPE_CONF_CHECK_X(pch_pfit.pos);
   13633         [ #  # ]:          0 :                         PIPE_CONF_CHECK_X(pch_pfit.size);
   13634                 :            :                 }
   13635                 :            : 
   13636         [ #  # ]:          0 :                 PIPE_CONF_CHECK_I(scaler_state.scaler_id);
   13637         [ #  # ]:          0 :                 PIPE_CONF_CHECK_CLOCK_FUZZY(pixel_rate);
   13638                 :            : 
   13639         [ #  # ]:          0 :                 PIPE_CONF_CHECK_X(gamma_mode);
   13640         [ #  # ]:          0 :                 if (IS_CHERRYVIEW(dev_priv))
   13641         [ #  # ]:          0 :                         PIPE_CONF_CHECK_X(cgm_mode);
   13642                 :            :                 else
   13643         [ #  # ]:          0 :                         PIPE_CONF_CHECK_X(csc_mode);
   13644   [ #  #  #  # ]:          0 :                 PIPE_CONF_CHECK_BOOL(gamma_enable);
   13645   [ #  #  #  # ]:          0 :                 PIPE_CONF_CHECK_BOOL(csc_enable);
   13646                 :            : 
   13647                 :          0 :                 bp_gamma = intel_color_get_gamma_bit_precision(pipe_config);
   13648         [ #  # ]:          0 :                 if (bp_gamma)
   13649   [ #  #  #  # ]:          0 :                         PIPE_CONF_CHECK_COLOR_LUT(gamma_mode, hw.gamma_lut, bp_gamma);
   13650                 :            : 
   13651                 :            :         }
   13652                 :            : 
   13653   [ #  #  #  # ]:          0 :         PIPE_CONF_CHECK_BOOL(double_wide);
   13654                 :            : 
   13655         [ #  # ]:          0 :         PIPE_CONF_CHECK_P(shared_dpll);
   13656         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
   13657         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md);
   13658         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
   13659         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.fp1);
   13660         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.wrpll);
   13661         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.spll);
   13662         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.ctrl1);
   13663         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr1);
   13664         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr2);
   13665         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr0);
   13666         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.ebb0);
   13667         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.ebb4);
   13668         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll0);
   13669         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll1);
   13670         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll2);
   13671         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll3);
   13672         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll6);
   13673         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll8);
   13674         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll9);
   13675         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pll10);
   13676         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.pcsdw12);
   13677         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_refclkin_ctl);
   13678         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_clktop2_coreclkctl1);
   13679         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_clktop2_hsclkctl);
   13680         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_div0);
   13681         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_div1);
   13682         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_lf);
   13683         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_frac_lock);
   13684         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_ssc);
   13685         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_bias);
   13686         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_tdc_coldst_bias);
   13687                 :            : 
   13688         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dsi_pll.ctrl);
   13689         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(dsi_pll.div);
   13690                 :            : 
   13691   [ #  #  #  #  :          0 :         if (IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5)
                   #  # ]
   13692         [ #  # ]:          0 :                 PIPE_CONF_CHECK_I(pipe_bpp);
   13693                 :            : 
   13694         [ #  # ]:          0 :         PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
   13695         [ #  # ]:          0 :         PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
   13696                 :            : 
   13697         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(min_voltage_level);
   13698                 :            : 
   13699         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(infoframes.enable);
   13700         [ #  # ]:          0 :         PIPE_CONF_CHECK_X(infoframes.gcp);
   13701         [ #  # ]:          0 :         PIPE_CONF_CHECK_INFOFRAME(avi);
   13702         [ #  # ]:          0 :         PIPE_CONF_CHECK_INFOFRAME(spd);
   13703         [ #  # ]:          0 :         PIPE_CONF_CHECK_INFOFRAME(hdmi);
   13704         [ #  # ]:          0 :         PIPE_CONF_CHECK_INFOFRAME(drm);
   13705                 :            : 
   13706         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(sync_mode_slaves_mask);
   13707         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(master_transcoder);
   13708                 :            : 
   13709         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(dsc.compression_enable);
   13710         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(dsc.dsc_split);
   13711         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(dsc.compressed_bpp);
   13712                 :            : 
   13713         [ #  # ]:          0 :         PIPE_CONF_CHECK_I(mst_master_transcoder);
   13714                 :            : 
   13715                 :            : #undef PIPE_CONF_CHECK_X
   13716                 :            : #undef PIPE_CONF_CHECK_I
   13717                 :            : #undef PIPE_CONF_CHECK_BOOL
   13718                 :            : #undef PIPE_CONF_CHECK_BOOL_INCOMPLETE
   13719                 :            : #undef PIPE_CONF_CHECK_P
   13720                 :            : #undef PIPE_CONF_CHECK_FLAGS
   13721                 :            : #undef PIPE_CONF_CHECK_CLOCK_FUZZY
   13722                 :            : #undef PIPE_CONF_CHECK_COLOR_LUT
   13723                 :            : #undef PIPE_CONF_QUIRK
   13724                 :            : 
   13725                 :          0 :         return ret;
   13726                 :            : }
   13727                 :            : 
   13728                 :          0 : static void intel_pipe_config_sanity_check(struct drm_i915_private *dev_priv,
   13729                 :            :                                            const struct intel_crtc_state *pipe_config)
   13730                 :            : {
   13731         [ #  # ]:          0 :         if (pipe_config->has_pch_encoder) {
   13732   [ #  #  #  # ]:          0 :                 int fdi_dotclock = intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
   13733                 :            :                                                             &pipe_config->fdi_m_n);
   13734                 :          0 :                 int dotclock = pipe_config->hw.adjusted_mode.crtc_clock;
   13735                 :            : 
   13736                 :            :                 /*
   13737                 :            :                  * FDI already provided one idea for the dotclock.
   13738                 :            :                  * Yell if the encoder disagrees.
   13739                 :            :                  */
   13740   [ #  #  #  # ]:          0 :                 WARN(!intel_fuzzy_clock_check(fdi_dotclock, dotclock),
   13741                 :            :                      "FDI dotclock and encoder dotclock mismatch, fdi: %i, encoder: %i\n",
   13742                 :            :                      fdi_dotclock, dotclock);
   13743                 :            :         }
   13744                 :          0 : }
   13745                 :            : 
   13746                 :          0 : static void verify_wm_state(struct intel_crtc *crtc,
   13747                 :            :                             struct intel_crtc_state *new_crtc_state)
   13748                 :            : {
   13749                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   13750                 :          0 :         struct skl_hw_state {
   13751                 :            :                 struct skl_ddb_entry ddb_y[I915_MAX_PLANES];
   13752                 :            :                 struct skl_ddb_entry ddb_uv[I915_MAX_PLANES];
   13753                 :            :                 struct skl_ddb_allocation ddb;
   13754                 :            :                 struct skl_pipe_wm wm;
   13755                 :            :         } *hw;
   13756                 :          0 :         struct skl_ddb_allocation *sw_ddb;
   13757                 :          0 :         struct skl_pipe_wm *sw_wm;
   13758                 :          0 :         struct skl_ddb_entry *hw_ddb_entry, *sw_ddb_entry;
   13759                 :          0 :         const enum pipe pipe = crtc->pipe;
   13760                 :          0 :         int plane, level, max_level = ilk_wm_max_level(dev_priv);
   13761                 :            : 
   13762   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9 || !new_crtc_state->hw.active)
   13763                 :            :                 return;
   13764                 :            : 
   13765                 :          0 :         hw = kzalloc(sizeof(*hw), GFP_KERNEL);
   13766         [ #  # ]:          0 :         if (!hw)
   13767                 :            :                 return;
   13768                 :            : 
   13769                 :          0 :         skl_pipe_wm_get_hw_state(crtc, &hw->wm);
   13770                 :          0 :         sw_wm = &new_crtc_state->wm.skl.optimal;
   13771                 :            : 
   13772                 :          0 :         skl_pipe_ddb_get_hw_state(crtc, hw->ddb_y, hw->ddb_uv);
   13773                 :            : 
   13774                 :          0 :         skl_ddb_get_hw_state(dev_priv, &hw->ddb);
   13775                 :          0 :         sw_ddb = &dev_priv->wm.skl_hw.ddb;
   13776                 :            : 
   13777         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11 &&
   13778         [ #  # ]:          0 :             hw->ddb.enabled_slices != sw_ddb->enabled_slices)
   13779                 :          0 :                 DRM_ERROR("mismatch in DBUF Slices (expected %u, got %u)\n",
   13780                 :            :                           sw_ddb->enabled_slices,
   13781                 :            :                           hw->ddb.enabled_slices);
   13782                 :            : 
   13783                 :            :         /* planes */
   13784         [ #  # ]:          0 :         for_each_universal_plane(dev_priv, pipe, plane) {
   13785                 :            :                 struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
   13786                 :            : 
   13787                 :            :                 hw_plane_wm = &hw->wm.planes[plane];
   13788                 :            :                 sw_plane_wm = &sw_wm->planes[plane];
   13789                 :            : 
   13790                 :            :                 /* Watermarks */
   13791         [ #  # ]:          0 :                 for (level = 0; level <= max_level; level++) {
   13792         [ #  # ]:          0 :                         if (skl_wm_level_equals(&hw_plane_wm->wm[level],
   13793                 :          0 :                                                 &sw_plane_wm->wm[level]))
   13794                 :          0 :                                 continue;
   13795                 :            : 
   13796                 :          0 :                         DRM_ERROR("mismatch in WM pipe %c plane %d level %d (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
   13797                 :            :                                   pipe_name(pipe), plane + 1, level,
   13798                 :            :                                   sw_plane_wm->wm[level].plane_en,
   13799                 :            :                                   sw_plane_wm->wm[level].plane_res_b,
   13800                 :            :                                   sw_plane_wm->wm[level].plane_res_l,
   13801                 :            :                                   hw_plane_wm->wm[level].plane_en,
   13802                 :            :                                   hw_plane_wm->wm[level].plane_res_b,
   13803                 :            :                                   hw_plane_wm->wm[level].plane_res_l);
   13804                 :            :                 }
   13805                 :            : 
   13806         [ #  # ]:          0 :                 if (!skl_wm_level_equals(&hw_plane_wm->trans_wm,
   13807                 :          0 :                                          &sw_plane_wm->trans_wm)) {
   13808                 :          0 :                         DRM_ERROR("mismatch in trans WM pipe %c plane %d (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
   13809                 :            :                                   pipe_name(pipe), plane + 1,
   13810                 :            :                                   sw_plane_wm->trans_wm.plane_en,
   13811                 :            :                                   sw_plane_wm->trans_wm.plane_res_b,
   13812                 :            :                                   sw_plane_wm->trans_wm.plane_res_l,
   13813                 :            :                                   hw_plane_wm->trans_wm.plane_en,
   13814                 :            :                                   hw_plane_wm->trans_wm.plane_res_b,
   13815                 :            :                                   hw_plane_wm->trans_wm.plane_res_l);
   13816                 :            :                 }
   13817                 :            : 
   13818                 :            :                 /* DDB */
   13819                 :          0 :                 hw_ddb_entry = &hw->ddb_y[plane];
   13820                 :          0 :                 sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb_y[plane];
   13821                 :            : 
   13822         [ #  # ]:          0 :                 if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
   13823                 :          0 :                         DRM_ERROR("mismatch in DDB state pipe %c plane %d (expected (%u,%u), found (%u,%u))\n",
   13824                 :            :                                   pipe_name(pipe), plane + 1,
   13825                 :            :                                   sw_ddb_entry->start, sw_ddb_entry->end,
   13826                 :            :                                   hw_ddb_entry->start, hw_ddb_entry->end);
   13827                 :            :                 }
   13828                 :            :         }
   13829                 :            : 
   13830                 :            :         /*
   13831                 :            :          * cursor
   13832                 :            :          * If the cursor plane isn't active, we may not have updated it's ddb
   13833                 :            :          * allocation. In that case since the ddb allocation will be updated
   13834                 :            :          * once the plane becomes visible, we can skip this check
   13835                 :            :          */
   13836                 :            :         if (1) {
   13837                 :            :                 struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
   13838                 :            : 
   13839                 :            :                 hw_plane_wm = &hw->wm.planes[PLANE_CURSOR];
   13840                 :            :                 sw_plane_wm = &sw_wm->planes[PLANE_CURSOR];
   13841                 :            : 
   13842                 :            :                 /* Watermarks */
   13843         [ #  # ]:          0 :                 for (level = 0; level <= max_level; level++) {
   13844         [ #  # ]:          0 :                         if (skl_wm_level_equals(&hw_plane_wm->wm[level],
   13845                 :          0 :                                                 &sw_plane_wm->wm[level]))
   13846                 :          0 :                                 continue;
   13847                 :            : 
   13848                 :          0 :                         DRM_ERROR("mismatch in WM pipe %c cursor level %d (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
   13849                 :            :                                   pipe_name(pipe), level,
   13850                 :            :                                   sw_plane_wm->wm[level].plane_en,
   13851                 :            :                                   sw_plane_wm->wm[level].plane_res_b,
   13852                 :            :                                   sw_plane_wm->wm[level].plane_res_l,
   13853                 :            :                                   hw_plane_wm->wm[level].plane_en,
   13854                 :            :                                   hw_plane_wm->wm[level].plane_res_b,
   13855                 :            :                                   hw_plane_wm->wm[level].plane_res_l);
   13856                 :            :                 }
   13857                 :            : 
   13858         [ #  # ]:          0 :                 if (!skl_wm_level_equals(&hw_plane_wm->trans_wm,
   13859                 :          0 :                                          &sw_plane_wm->trans_wm)) {
   13860                 :          0 :                         DRM_ERROR("mismatch in trans WM pipe %c cursor (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
   13861                 :            :                                   pipe_name(pipe),
   13862                 :            :                                   sw_plane_wm->trans_wm.plane_en,
   13863                 :            :                                   sw_plane_wm->trans_wm.plane_res_b,
   13864                 :            :                                   sw_plane_wm->trans_wm.plane_res_l,
   13865                 :            :                                   hw_plane_wm->trans_wm.plane_en,
   13866                 :            :                                   hw_plane_wm->trans_wm.plane_res_b,
   13867                 :            :                                   hw_plane_wm->trans_wm.plane_res_l);
   13868                 :            :                 }
   13869                 :            : 
   13870                 :            :                 /* DDB */
   13871                 :          0 :                 hw_ddb_entry = &hw->ddb_y[PLANE_CURSOR];
   13872                 :          0 :                 sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR];
   13873                 :            : 
   13874         [ #  # ]:          0 :                 if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
   13875                 :          0 :                         DRM_ERROR("mismatch in DDB state pipe %c cursor (expected (%u,%u), found (%u,%u))\n",
   13876                 :            :                                   pipe_name(pipe),
   13877                 :            :                                   sw_ddb_entry->start, sw_ddb_entry->end,
   13878                 :            :                                   hw_ddb_entry->start, hw_ddb_entry->end);
   13879                 :            :                 }
   13880                 :            :         }
   13881                 :            : 
   13882                 :          0 :         kfree(hw);
   13883                 :            : }
   13884                 :            : 
   13885                 :            : static void
   13886                 :          0 : verify_connector_state(struct intel_atomic_state *state,
   13887                 :            :                        struct intel_crtc *crtc)
   13888                 :            : {
   13889                 :          0 :         struct drm_connector *connector;
   13890                 :          0 :         struct drm_connector_state *new_conn_state;
   13891                 :          0 :         int i;
   13892                 :            : 
   13893   [ #  #  #  # ]:          0 :         for_each_new_connector_in_state(&state->base, connector, new_conn_state, i) {
   13894                 :          0 :                 struct drm_encoder *encoder = connector->encoder;
   13895                 :          0 :                 struct intel_crtc_state *crtc_state = NULL;
   13896                 :            : 
   13897         [ #  # ]:          0 :                 if (new_conn_state->crtc != &crtc->base)
   13898                 :          0 :                         continue;
   13899                 :            : 
   13900         [ #  # ]:          0 :                 if (crtc)
   13901                 :          0 :                         crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
   13902                 :            : 
   13903                 :          0 :                 intel_connector_verify_state(crtc_state, new_conn_state);
   13904                 :            : 
   13905   [ #  #  #  #  :          0 :                 I915_STATE_WARN(new_conn_state->best_encoder != encoder,
                   #  # ]
   13906                 :            :                      "connector's atomic encoder doesn't match legacy encoder\n");
   13907                 :            :         }
   13908                 :          0 : }
   13909                 :            : 
   13910                 :            : static void
   13911                 :            : verify_encoder_state(struct drm_i915_private *dev_priv, struct intel_atomic_state *state)
   13912                 :            : {
   13913                 :            :         struct intel_encoder *encoder;
   13914                 :            :         struct drm_connector *connector;
   13915                 :            :         struct drm_connector_state *old_conn_state, *new_conn_state;
   13916                 :            :         int i;
   13917                 :            : 
   13918                 :            :         for_each_intel_encoder(&dev_priv->drm, encoder) {
   13919                 :            :                 bool enabled = false, found = false;
   13920                 :            :                 enum pipe pipe;
   13921                 :            : 
   13922                 :            :                 DRM_DEBUG_KMS("[ENCODER:%d:%s]\n",
   13923                 :            :                               encoder->base.base.id,
   13924                 :            :                               encoder->base.name);
   13925                 :            : 
   13926                 :            :                 for_each_oldnew_connector_in_state(&state->base, connector, old_conn_state,
   13927                 :            :                                                    new_conn_state, i) {
   13928                 :            :                         if (old_conn_state->best_encoder == &encoder->base)
   13929                 :            :                                 found = true;
   13930                 :            : 
   13931                 :            :                         if (new_conn_state->best_encoder != &encoder->base)
   13932                 :            :                                 continue;
   13933                 :            :                         found = enabled = true;
   13934                 :            : 
   13935                 :            :                         I915_STATE_WARN(new_conn_state->crtc !=
   13936                 :            :                                         encoder->base.crtc,
   13937                 :            :                              "connector's crtc doesn't match encoder crtc\n");
   13938                 :            :                 }
   13939                 :            : 
   13940                 :            :                 if (!found)
   13941                 :            :                         continue;
   13942                 :            : 
   13943                 :            :                 I915_STATE_WARN(!!encoder->base.crtc != enabled,
   13944                 :            :                      "encoder's enabled state mismatch "
   13945                 :            :                      "(expected %i, found %i)\n",
   13946                 :            :                      !!encoder->base.crtc, enabled);
   13947                 :            : 
   13948                 :            :                 if (!encoder->base.crtc) {
   13949                 :            :                         bool active;
   13950                 :            : 
   13951                 :            :                         active = encoder->get_hw_state(encoder, &pipe);
   13952                 :            :                         I915_STATE_WARN(active,
   13953                 :            :                              "encoder detached but still enabled on pipe %c.\n",
   13954                 :            :                              pipe_name(pipe));
   13955                 :            :                 }
   13956                 :            :         }
   13957                 :            : }
   13958                 :            : 
   13959                 :            : static void
   13960                 :          0 : verify_crtc_state(struct intel_crtc *crtc,
   13961                 :            :                   struct intel_crtc_state *old_crtc_state,
   13962                 :            :                   struct intel_crtc_state *new_crtc_state)
   13963                 :            : {
   13964                 :          0 :         struct drm_device *dev = crtc->base.dev;
   13965                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   13966                 :          0 :         struct intel_encoder *encoder;
   13967                 :          0 :         struct intel_crtc_state *pipe_config = old_crtc_state;
   13968                 :          0 :         struct drm_atomic_state *state = old_crtc_state->uapi.state;
   13969                 :          0 :         bool active;
   13970                 :            : 
   13971                 :          0 :         __drm_atomic_helper_crtc_destroy_state(&old_crtc_state->uapi);
   13972                 :          0 :         intel_crtc_free_hw_state(old_crtc_state);
   13973                 :          0 :         intel_crtc_state_reset(old_crtc_state, crtc);
   13974                 :          0 :         old_crtc_state->uapi.state = state;
   13975                 :            : 
   13976                 :          0 :         DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.base.id, crtc->base.name);
   13977                 :            : 
   13978                 :          0 :         active = dev_priv->display.get_pipe_config(crtc, pipe_config);
   13979                 :            : 
   13980                 :            :         /* we keep both pipes enabled on 830 */
   13981         [ #  # ]:          0 :         if (IS_I830(dev_priv))
   13982                 :          0 :                 active = new_crtc_state->hw.active;
   13983                 :            : 
   13984   [ #  #  #  #  :          0 :         I915_STATE_WARN(new_crtc_state->hw.active != active,
                   #  # ]
   13985                 :            :                         "crtc active state doesn't match with hw state "
   13986                 :            :                         "(expected %i, found %i)\n",
   13987                 :            :                         new_crtc_state->hw.active, active);
   13988                 :            : 
   13989   [ #  #  #  #  :          0 :         I915_STATE_WARN(crtc->active != new_crtc_state->hw.active,
                   #  # ]
   13990                 :            :                         "transitional active state does not match atomic hw state "
   13991                 :            :                         "(expected %i, found %i)\n",
   13992                 :            :                         new_crtc_state->hw.active, crtc->active);
   13993                 :            : 
   13994   [ #  #  #  # ]:          0 :         for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
   13995                 :          0 :                 enum pipe pipe;
   13996                 :            : 
   13997                 :          0 :                 active = encoder->get_hw_state(encoder, &pipe);
   13998   [ #  #  #  #  :          0 :                 I915_STATE_WARN(active != new_crtc_state->hw.active,
                   #  # ]
   13999                 :            :                                 "[ENCODER:%i] active %i with crtc active %i\n",
   14000                 :            :                                 encoder->base.base.id, active,
   14001                 :            :                                 new_crtc_state->hw.active);
   14002                 :            : 
   14003   [ #  #  #  #  :          0 :                 I915_STATE_WARN(active && crtc->pipe != pipe,
          #  #  #  #  #  
                      # ]
   14004                 :            :                                 "Encoder connected to wrong pipe %c\n",
   14005                 :            :                                 pipe_name(pipe));
   14006                 :            : 
   14007         [ #  # ]:          0 :                 if (active)
   14008                 :          0 :                         encoder->get_config(encoder, pipe_config);
   14009                 :            :         }
   14010                 :            : 
   14011         [ #  # ]:          0 :         intel_crtc_compute_pixel_rate(pipe_config);
   14012                 :            : 
   14013         [ #  # ]:          0 :         if (!new_crtc_state->hw.active)
   14014                 :            :                 return;
   14015                 :            : 
   14016                 :          0 :         intel_pipe_config_sanity_check(dev_priv, pipe_config);
   14017                 :            : 
   14018         [ #  # ]:          0 :         if (!intel_pipe_config_compare(new_crtc_state,
   14019                 :            :                                        pipe_config, false)) {
   14020   [ #  #  #  # ]:          0 :                 I915_STATE_WARN(1, "pipe state doesn't match!\n");
   14021                 :          0 :                 intel_dump_pipe_config(pipe_config, NULL, "[hw state]");
   14022                 :          0 :                 intel_dump_pipe_config(new_crtc_state, NULL, "[sw state]");
   14023                 :            :         }
   14024                 :            : }
   14025                 :            : 
   14026                 :            : static void
   14027                 :            : intel_verify_planes(struct intel_atomic_state *state)
   14028                 :            : {
   14029                 :            :         struct intel_plane *plane;
   14030                 :            :         const struct intel_plane_state *plane_state;
   14031                 :            :         int i;
   14032                 :            : 
   14033                 :            :         for_each_new_intel_plane_in_state(state, plane,
   14034                 :            :                                           plane_state, i)
   14035                 :            :                 assert_plane(plane, plane_state->planar_slave ||
   14036                 :            :                              plane_state->uapi.visible);
   14037                 :            : }
   14038                 :            : 
   14039                 :            : static void
   14040                 :            : verify_single_dpll_state(struct drm_i915_private *dev_priv,
   14041                 :            :                          struct intel_shared_dpll *pll,
   14042                 :            :                          struct intel_crtc *crtc,
   14043                 :            :                          struct intel_crtc_state *new_crtc_state)
   14044                 :            : {
   14045                 :            :         struct intel_dpll_hw_state dpll_hw_state;
   14046                 :            :         unsigned int crtc_mask;
   14047                 :            :         bool active;
   14048                 :            : 
   14049                 :            :         memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
   14050                 :            : 
   14051                 :            :         DRM_DEBUG_KMS("%s\n", pll->info->name);
   14052                 :            : 
   14053                 :            :         active = pll->info->funcs->get_hw_state(dev_priv, pll, &dpll_hw_state);
   14054                 :            : 
   14055                 :            :         if (!(pll->info->flags & INTEL_DPLL_ALWAYS_ON)) {
   14056                 :            :                 I915_STATE_WARN(!pll->on && pll->active_mask,
   14057                 :            :                      "pll in active use but not on in sw tracking\n");
   14058                 :            :                 I915_STATE_WARN(pll->on && !pll->active_mask,
   14059                 :            :                      "pll is on but not used by any active crtc\n");
   14060                 :            :                 I915_STATE_WARN(pll->on != active,
   14061                 :            :                      "pll on state mismatch (expected %i, found %i)\n",
   14062                 :            :                      pll->on, active);
   14063                 :            :         }
   14064                 :            : 
   14065                 :            :         if (!crtc) {
   14066                 :            :                 I915_STATE_WARN(pll->active_mask & ~pll->state.crtc_mask,
   14067                 :            :                                 "more active pll users than references: %x vs %x\n",
   14068                 :            :                                 pll->active_mask, pll->state.crtc_mask);
   14069                 :            : 
   14070                 :            :                 return;
   14071                 :            :         }
   14072                 :            : 
   14073                 :            :         crtc_mask = drm_crtc_mask(&crtc->base);
   14074                 :            : 
   14075                 :            :         if (new_crtc_state->hw.active)
   14076                 :            :                 I915_STATE_WARN(!(pll->active_mask & crtc_mask),
   14077                 :            :                                 "pll active mismatch (expected pipe %c in active mask 0x%02x)\n",
   14078                 :            :                                 pipe_name(drm_crtc_index(&crtc->base)), pll->active_mask);
   14079                 :            :         else
   14080                 :            :                 I915_STATE_WARN(pll->active_mask & crtc_mask,
   14081                 :            :                                 "pll active mismatch (didn't expect pipe %c in active mask 0x%02x)\n",
   14082                 :            :                                 pipe_name(drm_crtc_index(&crtc->base)), pll->active_mask);
   14083                 :            : 
   14084                 :            :         I915_STATE_WARN(!(pll->state.crtc_mask & crtc_mask),
   14085                 :            :                         "pll enabled crtcs mismatch (expected 0x%x in 0x%02x)\n",
   14086                 :            :                         crtc_mask, pll->state.crtc_mask);
   14087                 :            : 
   14088                 :            :         I915_STATE_WARN(pll->on && memcmp(&pll->state.hw_state,
   14089                 :            :                                           &dpll_hw_state,
   14090                 :            :                                           sizeof(dpll_hw_state)),
   14091                 :            :                         "pll hw state mismatch\n");
   14092                 :            : }
   14093                 :            : 
   14094                 :            : static void
   14095                 :            : verify_shared_dpll_state(struct intel_crtc *crtc,
   14096                 :            :                          struct intel_crtc_state *old_crtc_state,
   14097                 :            :                          struct intel_crtc_state *new_crtc_state)
   14098                 :            : {
   14099                 :            :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14100                 :            : 
   14101                 :            :         if (new_crtc_state->shared_dpll)
   14102                 :            :                 verify_single_dpll_state(dev_priv, new_crtc_state->shared_dpll, crtc, new_crtc_state);
   14103                 :            : 
   14104                 :            :         if (old_crtc_state->shared_dpll &&
   14105                 :            :             old_crtc_state->shared_dpll != new_crtc_state->shared_dpll) {
   14106                 :            :                 unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
   14107                 :            :                 struct intel_shared_dpll *pll = old_crtc_state->shared_dpll;
   14108                 :            : 
   14109                 :            :                 I915_STATE_WARN(pll->active_mask & crtc_mask,
   14110                 :            :                                 "pll active mismatch (didn't expect pipe %c in active mask)\n",
   14111                 :            :                                 pipe_name(drm_crtc_index(&crtc->base)));
   14112                 :            :                 I915_STATE_WARN(pll->state.crtc_mask & crtc_mask,
   14113                 :            :                                 "pll enabled crtcs mismatch (found %x in enabled mask)\n",
   14114                 :            :                                 pipe_name(drm_crtc_index(&crtc->base)));
   14115                 :            :         }
   14116                 :            : }
   14117                 :            : 
   14118                 :            : static void
   14119                 :          0 : intel_modeset_verify_crtc(struct intel_crtc *crtc,
   14120                 :            :                           struct intel_atomic_state *state,
   14121                 :            :                           struct intel_crtc_state *old_crtc_state,
   14122                 :            :                           struct intel_crtc_state *new_crtc_state)
   14123                 :            : {
   14124   [ #  #  #  # ]:          0 :         if (!needs_modeset(new_crtc_state) && !new_crtc_state->update_pipe)
   14125                 :            :                 return;
   14126                 :            : 
   14127                 :          0 :         verify_wm_state(crtc, new_crtc_state);
   14128                 :          0 :         verify_connector_state(state, crtc);
   14129                 :          0 :         verify_crtc_state(crtc, old_crtc_state, new_crtc_state);
   14130                 :          0 :         verify_shared_dpll_state(crtc, old_crtc_state, new_crtc_state);
   14131                 :            : }
   14132                 :            : 
   14133                 :            : static void
   14134                 :          0 : verify_disabled_dpll_state(struct drm_i915_private *dev_priv)
   14135                 :            : {
   14136                 :          0 :         int i;
   14137                 :            : 
   14138         [ #  # ]:          0 :         for (i = 0; i < dev_priv->num_shared_dpll; i++)
   14139                 :          0 :                 verify_single_dpll_state(dev_priv, &dev_priv->shared_dplls[i], NULL, NULL);
   14140                 :            : }
   14141                 :            : 
   14142                 :            : static void
   14143                 :          0 : intel_modeset_verify_disabled(struct drm_i915_private *dev_priv,
   14144                 :            :                               struct intel_atomic_state *state)
   14145                 :            : {
   14146                 :          0 :         verify_encoder_state(dev_priv, state);
   14147                 :          0 :         verify_connector_state(state, NULL);
   14148                 :          0 :         verify_disabled_dpll_state(dev_priv);
   14149                 :          0 : }
   14150                 :            : 
   14151                 :            : static void
   14152                 :          0 : intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state)
   14153                 :            : {
   14154                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   14155                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14156                 :          0 :         const struct drm_display_mode *adjusted_mode =
   14157                 :            :                 &crtc_state->hw.adjusted_mode;
   14158                 :            : 
   14159                 :          0 :         drm_calc_timestamping_constants(&crtc->base, adjusted_mode);
   14160                 :            : 
   14161                 :            :         /*
   14162                 :            :          * The scanline counter increments at the leading edge of hsync.
   14163                 :            :          *
   14164                 :            :          * On most platforms it starts counting from vtotal-1 on the
   14165                 :            :          * first active line. That means the scanline counter value is
   14166                 :            :          * always one less than what we would expect. Ie. just after
   14167                 :            :          * start of vblank, which also occurs at start of hsync (on the
   14168                 :            :          * last active line), the scanline counter will read vblank_start-1.
   14169                 :            :          *
   14170                 :            :          * On gen2 the scanline counter starts counting from 1 instead
   14171                 :            :          * of vtotal-1, so we have to subtract one (or rather add vtotal-1
   14172                 :            :          * to keep the value positive), instead of adding one.
   14173                 :            :          *
   14174                 :            :          * On HSW+ the behaviour of the scanline counter depends on the output
   14175                 :            :          * type. For DP ports it behaves like most other platforms, but on HDMI
   14176                 :            :          * there's an extra 1 line difference. So we need to add two instead of
   14177                 :            :          * one to the value.
   14178                 :            :          *
   14179                 :            :          * On VLV/CHV DSI the scanline counter would appear to increment
   14180                 :            :          * approx. 1/3 of a scanline before start of vblank. Unfortunately
   14181                 :            :          * that means we can't tell whether we're in vblank or not while
   14182                 :            :          * we're on that particular line. We must still set scanline_offset
   14183                 :            :          * to 1 so that the vblank timestamps come out correct when we query
   14184                 :            :          * the scanline counter from within the vblank interrupt handler.
   14185                 :            :          * However if queried just before the start of vblank we'll get an
   14186                 :            :          * answer that's slightly in the future.
   14187                 :            :          */
   14188         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 2)) {
   14189                 :          0 :                 int vtotal;
   14190                 :            : 
   14191                 :          0 :                 vtotal = adjusted_mode->crtc_vtotal;
   14192         [ #  # ]:          0 :                 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
   14193                 :          0 :                         vtotal /= 2;
   14194                 :            : 
   14195                 :          0 :                 crtc->scanline_offset = vtotal - 1;
   14196   [ #  #  #  # ]:          0 :         } else if (HAS_DDI(dev_priv) &&
   14197         [ #  # ]:          0 :                    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
   14198                 :          0 :                 crtc->scanline_offset = 2;
   14199                 :            :         } else {
   14200                 :          0 :                 crtc->scanline_offset = 1;
   14201                 :            :         }
   14202                 :          0 : }
   14203                 :            : 
   14204                 :          0 : static void intel_modeset_clear_plls(struct intel_atomic_state *state)
   14205                 :            : {
   14206         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14207                 :          0 :         struct intel_crtc_state *new_crtc_state;
   14208                 :          0 :         struct intel_crtc *crtc;
   14209                 :          0 :         int i;
   14210                 :            : 
   14211         [ #  # ]:          0 :         if (!dev_priv->display.crtc_compute_clock)
   14212                 :            :                 return;
   14213                 :            : 
   14214   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14215         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state))
   14216                 :          0 :                         continue;
   14217                 :            : 
   14218                 :          0 :                 intel_release_shared_dplls(state, crtc);
   14219                 :            :         }
   14220                 :            : }
   14221                 :            : 
   14222                 :            : /*
   14223                 :            :  * This implements the workaround described in the "notes" section of the mode
   14224                 :            :  * set sequence documentation. When going from no pipes or single pipe to
   14225                 :            :  * multiple pipes, and planes are enabled after the pipe, we need to wait at
   14226                 :            :  * least 2 vblanks on the first pipe before enabling planes on the second pipe.
   14227                 :            :  */
   14228                 :          0 : static int hsw_mode_set_planes_workaround(struct intel_atomic_state *state)
   14229                 :            : {
   14230                 :          0 :         struct intel_crtc_state *crtc_state;
   14231                 :          0 :         struct intel_crtc *crtc;
   14232                 :          0 :         struct intel_crtc_state *first_crtc_state = NULL;
   14233                 :          0 :         struct intel_crtc_state *other_crtc_state = NULL;
   14234                 :          0 :         enum pipe first_pipe = INVALID_PIPE, enabled_pipe = INVALID_PIPE;
   14235                 :          0 :         int i;
   14236                 :            : 
   14237                 :            :         /* look at all crtc's that are going to be enabled in during modeset */
   14238   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
   14239   [ #  #  #  # ]:          0 :                 if (!crtc_state->hw.active ||
   14240                 :            :                     !needs_modeset(crtc_state))
   14241                 :          0 :                         continue;
   14242                 :            : 
   14243         [ #  # ]:          0 :                 if (first_crtc_state) {
   14244                 :            :                         other_crtc_state = crtc_state;
   14245                 :            :                         break;
   14246                 :            :                 } else {
   14247                 :          0 :                         first_crtc_state = crtc_state;
   14248                 :          0 :                         first_pipe = crtc->pipe;
   14249                 :            :                 }
   14250                 :            :         }
   14251                 :            : 
   14252                 :            :         /* No workaround needed? */
   14253         [ #  # ]:          0 :         if (!first_crtc_state)
   14254                 :            :                 return 0;
   14255                 :            : 
   14256                 :            :         /* w/a possibly needed, check how many crtc's are already enabled. */
   14257         [ #  # ]:          0 :         for_each_intel_crtc(state->base.dev, crtc) {
   14258                 :          0 :                 crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
   14259         [ #  # ]:          0 :                 if (IS_ERR(crtc_state))
   14260                 :          0 :                         return PTR_ERR(crtc_state);
   14261                 :            : 
   14262                 :          0 :                 crtc_state->hsw_workaround_pipe = INVALID_PIPE;
   14263                 :            : 
   14264   [ #  #  #  # ]:          0 :                 if (!crtc_state->hw.active ||
   14265                 :            :                     needs_modeset(crtc_state))
   14266                 :          0 :                         continue;
   14267                 :            : 
   14268                 :            :                 /* 2 or more enabled crtcs means no need for w/a */
   14269         [ #  # ]:          0 :                 if (enabled_pipe != INVALID_PIPE)
   14270                 :            :                         return 0;
   14271                 :            : 
   14272                 :          0 :                 enabled_pipe = crtc->pipe;
   14273                 :            :         }
   14274                 :            : 
   14275         [ #  # ]:          0 :         if (enabled_pipe != INVALID_PIPE)
   14276                 :          0 :                 first_crtc_state->hsw_workaround_pipe = enabled_pipe;
   14277         [ #  # ]:          0 :         else if (other_crtc_state)
   14278                 :          0 :                 other_crtc_state->hsw_workaround_pipe = first_pipe;
   14279                 :            : 
   14280                 :            :         return 0;
   14281                 :            : }
   14282                 :            : 
   14283                 :          0 : static int intel_modeset_checks(struct intel_atomic_state *state)
   14284                 :            : {
   14285         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14286                 :          0 :         struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14287                 :          0 :         struct intel_crtc *crtc;
   14288                 :          0 :         int ret, i;
   14289                 :            : 
   14290                 :            :         /* keep the current setting */
   14291         [ #  # ]:          0 :         if (!state->cdclk.force_min_cdclk_changed)
   14292                 :          0 :                 state->cdclk.force_min_cdclk = dev_priv->cdclk.force_min_cdclk;
   14293                 :            : 
   14294                 :          0 :         state->modeset = true;
   14295                 :          0 :         state->active_pipes = dev_priv->active_pipes;
   14296                 :          0 :         state->cdclk.logical = dev_priv->cdclk.logical;
   14297                 :          0 :         state->cdclk.actual = dev_priv->cdclk.actual;
   14298                 :            : 
   14299   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14300                 :            :                                             new_crtc_state, i) {
   14301         [ #  # ]:          0 :                 if (new_crtc_state->hw.active)
   14302                 :          0 :                         state->active_pipes |= BIT(crtc->pipe);
   14303                 :            :                 else
   14304                 :          0 :                         state->active_pipes &= ~BIT(crtc->pipe);
   14305                 :            : 
   14306         [ #  # ]:          0 :                 if (old_crtc_state->hw.active != new_crtc_state->hw.active)
   14307                 :          0 :                         state->active_pipe_changes |= BIT(crtc->pipe);
   14308                 :            :         }
   14309                 :            : 
   14310         [ #  # ]:          0 :         if (state->active_pipe_changes) {
   14311                 :          0 :                 ret = intel_atomic_lock_global_state(state);
   14312         [ #  # ]:          0 :                 if (ret)
   14313                 :            :                         return ret;
   14314                 :            :         }
   14315                 :            : 
   14316                 :          0 :         ret = intel_modeset_calc_cdclk(state);
   14317         [ #  # ]:          0 :         if (ret)
   14318                 :            :                 return ret;
   14319                 :            : 
   14320                 :          0 :         intel_modeset_clear_plls(state);
   14321                 :            : 
   14322         [ #  # ]:          0 :         if (IS_HASWELL(dev_priv))
   14323                 :          0 :                 return hsw_mode_set_planes_workaround(state);
   14324                 :            : 
   14325                 :            :         return 0;
   14326                 :            : }
   14327                 :            : 
   14328                 :            : /*
   14329                 :            :  * Handle calculation of various watermark data at the end of the atomic check
   14330                 :            :  * phase.  The code here should be run after the per-crtc and per-plane 'check'
   14331                 :            :  * handlers to ensure that all derived state has been updated.
   14332                 :            :  */
   14333                 :          0 : static int calc_watermark_data(struct intel_atomic_state *state)
   14334                 :            : {
   14335                 :          0 :         struct drm_device *dev = state->base.dev;
   14336                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   14337                 :            : 
   14338                 :            :         /* Is there platform-specific watermark information to calculate? */
   14339         [ #  # ]:          0 :         if (dev_priv->display.compute_global_watermarks)
   14340                 :          0 :                 return dev_priv->display.compute_global_watermarks(state);
   14341                 :            : 
   14342                 :            :         return 0;
   14343                 :            : }
   14344                 :            : 
   14345                 :          0 : static void intel_crtc_check_fastset(const struct intel_crtc_state *old_crtc_state,
   14346                 :            :                                      struct intel_crtc_state *new_crtc_state)
   14347                 :            : {
   14348         [ #  # ]:          0 :         if (!intel_pipe_config_compare(old_crtc_state, new_crtc_state, true))
   14349                 :            :                 return;
   14350                 :            : 
   14351                 :          0 :         new_crtc_state->uapi.mode_changed = false;
   14352                 :          0 :         new_crtc_state->update_pipe = true;
   14353                 :            : }
   14354                 :            : 
   14355                 :          0 : static void intel_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
   14356                 :            :                                     struct intel_crtc_state *new_crtc_state)
   14357                 :            : {
   14358                 :            :         /*
   14359                 :            :          * If we're not doing the full modeset we want to
   14360                 :            :          * keep the current M/N values as they may be
   14361                 :            :          * sufficiently different to the computed values
   14362                 :            :          * to cause problems.
   14363                 :            :          *
   14364                 :            :          * FIXME: should really copy more fuzzy state here
   14365                 :            :          */
   14366                 :          0 :         new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
   14367                 :          0 :         new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
   14368                 :          0 :         new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
   14369                 :          0 :         new_crtc_state->has_drrs = old_crtc_state->has_drrs;
   14370                 :          0 : }
   14371                 :            : 
   14372                 :          0 : static int intel_crtc_add_planes_to_state(struct intel_atomic_state *state,
   14373                 :            :                                           struct intel_crtc *crtc,
   14374                 :            :                                           u8 plane_ids_mask)
   14375                 :            : {
   14376                 :          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14377                 :          0 :         struct intel_plane *plane;
   14378                 :            : 
   14379   [ #  #  #  # ]:          0 :         for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
   14380                 :          0 :                 struct intel_plane_state *plane_state;
   14381                 :            : 
   14382         [ #  # ]:          0 :                 if ((plane_ids_mask & BIT(plane->id)) == 0)
   14383                 :          0 :                         continue;
   14384                 :            : 
   14385                 :          0 :                 plane_state = intel_atomic_get_plane_state(state, plane);
   14386         [ #  # ]:          0 :                 if (IS_ERR(plane_state))
   14387                 :          0 :                         return PTR_ERR(plane_state);
   14388                 :            :         }
   14389                 :            : 
   14390                 :            :         return 0;
   14391                 :            : }
   14392                 :            : 
   14393                 :          0 : static bool active_planes_affects_min_cdclk(struct drm_i915_private *dev_priv)
   14394                 :            : {
   14395                 :            :         /* See {hsw,vlv,ivb}_plane_ratio() */
   14396   [ #  #  #  # ]:          0 :         return IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv) ||
   14397   [ #  #  #  #  :          0 :                 IS_CHERRYVIEW(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
                   #  # ]
   14398                 :            :                 IS_IVYBRIDGE(dev_priv);
   14399                 :            : }
   14400                 :            : 
   14401                 :          0 : static int intel_atomic_check_planes(struct intel_atomic_state *state,
   14402                 :            :                                      bool *need_modeset)
   14403                 :            : {
   14404                 :          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14405                 :          0 :         struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14406                 :          0 :         struct intel_plane_state *plane_state;
   14407                 :          0 :         struct intel_plane *plane;
   14408                 :          0 :         struct intel_crtc *crtc;
   14409                 :          0 :         int i, ret;
   14410                 :            : 
   14411                 :          0 :         ret = icl_add_linked_planes(state);
   14412         [ #  # ]:          0 :         if (ret)
   14413                 :            :                 return ret;
   14414                 :            : 
   14415   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   14416                 :          0 :                 ret = intel_plane_atomic_check(state, plane);
   14417         [ #  # ]:          0 :                 if (ret) {
   14418                 :          0 :                         DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
   14419                 :            :                                          plane->base.base.id, plane->base.name);
   14420                 :          0 :                         return ret;
   14421                 :            :                 }
   14422                 :            :         }
   14423                 :            : 
   14424   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14425                 :            :                                             new_crtc_state, i) {
   14426                 :          0 :                 u8 old_active_planes, new_active_planes;
   14427                 :            : 
   14428                 :          0 :                 ret = icl_check_nv12_planes(new_crtc_state);
   14429         [ #  # ]:          0 :                 if (ret)
   14430                 :          0 :                         return ret;
   14431                 :            : 
   14432                 :            :                 /*
   14433                 :            :                  * On some platforms the number of active planes affects
   14434                 :            :                  * the planes' minimum cdclk calculation. Add such planes
   14435                 :            :                  * to the state before we compute the minimum cdclk.
   14436                 :            :                  */
   14437   [ #  #  #  # ]:          0 :                 if (!active_planes_affects_min_cdclk(dev_priv))
   14438                 :          0 :                         continue;
   14439                 :            : 
   14440                 :          0 :                 old_active_planes = old_crtc_state->active_planes & ~BIT(PLANE_CURSOR);
   14441                 :          0 :                 new_active_planes = new_crtc_state->active_planes & ~BIT(PLANE_CURSOR);
   14442                 :            : 
   14443   [ #  #  #  #  :          0 :                 if (hweight8(old_active_planes) == hweight8(new_active_planes))
                   #  # ]
   14444                 :          0 :                         continue;
   14445                 :            : 
   14446                 :          0 :                 ret = intel_crtc_add_planes_to_state(state, crtc, new_active_planes);
   14447         [ #  # ]:          0 :                 if (ret)
   14448                 :          0 :                         return ret;
   14449                 :            :         }
   14450                 :            : 
   14451                 :            :         /*
   14452                 :            :          * active_planes bitmask has been updated, and potentially
   14453                 :            :          * affected planes are part of the state. We can now
   14454                 :            :          * compute the minimum cdclk for each plane.
   14455                 :            :          */
   14456   [ #  #  #  # ]:          0 :         for_each_new_intel_plane_in_state(state, plane, plane_state, i)
   14457                 :          0 :                 *need_modeset |= intel_plane_calc_min_cdclk(state, plane);
   14458                 :            : 
   14459                 :            :         return 0;
   14460                 :            : }
   14461                 :            : 
   14462                 :          0 : static int intel_atomic_check_crtcs(struct intel_atomic_state *state)
   14463                 :            : {
   14464                 :          0 :         struct intel_crtc_state *crtc_state;
   14465                 :          0 :         struct intel_crtc *crtc;
   14466                 :          0 :         int i;
   14467                 :            : 
   14468   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
   14469                 :          0 :                 int ret = intel_crtc_atomic_check(state, crtc);
   14470         [ #  # ]:          0 :                 if (ret) {
   14471                 :          0 :                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
   14472                 :            :                                          crtc->base.base.id, crtc->base.name);
   14473                 :          0 :                         return ret;
   14474                 :            :                 }
   14475                 :            :         }
   14476                 :            : 
   14477                 :            :         return 0;
   14478                 :            : }
   14479                 :            : 
   14480                 :          0 : static bool intel_cpu_transcoders_need_modeset(struct intel_atomic_state *state,
   14481                 :            :                                                u8 transcoders)
   14482                 :            : {
   14483                 :          0 :         const struct intel_crtc_state *new_crtc_state;
   14484                 :          0 :         struct intel_crtc *crtc;
   14485                 :          0 :         int i;
   14486                 :            : 
   14487   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14488         [ #  # ]:          0 :                 if (new_crtc_state->hw.enable &&
   14489   [ #  #  #  # ]:          0 :                     transcoders & BIT(new_crtc_state->cpu_transcoder) &&
   14490                 :            :                     needs_modeset(new_crtc_state))
   14491                 :            :                         return true;
   14492                 :            :         }
   14493                 :            : 
   14494                 :            :         return false;
   14495                 :            : }
   14496                 :            : 
   14497                 :            : static int
   14498                 :          0 : intel_modeset_all_tiles(struct intel_atomic_state *state, int tile_grp_id)
   14499                 :            : {
   14500                 :          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14501                 :          0 :         struct drm_connector *connector;
   14502                 :          0 :         struct drm_connector_list_iter conn_iter;
   14503                 :          0 :         int ret = 0;
   14504                 :            : 
   14505                 :          0 :         drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
   14506         [ #  # ]:          0 :         drm_for_each_connector_iter(connector, &conn_iter) {
   14507                 :          0 :                 struct drm_connector_state *conn_state;
   14508                 :          0 :                 struct drm_crtc_state *crtc_state;
   14509                 :            : 
   14510         [ #  # ]:          0 :                 if (!connector->has_tile ||
   14511         [ #  # ]:          0 :                     connector->tile_group->id != tile_grp_id)
   14512                 :          0 :                         continue;
   14513                 :          0 :                 conn_state = drm_atomic_get_connector_state(&state->base,
   14514                 :            :                                                             connector);
   14515         [ #  # ]:          0 :                 if (IS_ERR(conn_state)) {
   14516                 :          0 :                         ret =  PTR_ERR(conn_state);
   14517                 :          0 :                         break;
   14518                 :            :                 }
   14519                 :            : 
   14520         [ #  # ]:          0 :                 if (!conn_state->crtc)
   14521                 :          0 :                         continue;
   14522                 :            : 
   14523                 :          0 :                 crtc_state = drm_atomic_get_crtc_state(&state->base,
   14524                 :            :                                                        conn_state->crtc);
   14525         [ #  # ]:          0 :                 if (IS_ERR(crtc_state)) {
   14526                 :          0 :                         ret = PTR_ERR(crtc_state);
   14527                 :          0 :                         break;
   14528                 :            :                 }
   14529                 :          0 :                 crtc_state->mode_changed = true;
   14530                 :          0 :                 ret = drm_atomic_add_affected_connectors(&state->base,
   14531                 :            :                                                          conn_state->crtc);
   14532         [ #  # ]:          0 :                 if (ret)
   14533                 :            :                         break;
   14534                 :            :         }
   14535                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   14536                 :            : 
   14537                 :          0 :         return ret;
   14538                 :            : }
   14539                 :            : 
   14540                 :            : static int
   14541                 :          0 : intel_atomic_check_tiled_conns(struct intel_atomic_state *state)
   14542                 :            : {
   14543         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14544                 :          0 :         struct drm_connector *connector;
   14545                 :          0 :         struct drm_connector_state *old_conn_state, *new_conn_state;
   14546                 :          0 :         int i, ret;
   14547                 :            : 
   14548         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 11)
   14549                 :            :                 return 0;
   14550                 :            : 
   14551                 :            :         /* Is tiled, mark all other tiled CRTCs as needing a modeset */
   14552   [ #  #  #  # ]:          0 :         for_each_oldnew_connector_in_state(&state->base, connector,
   14553                 :            :                                            old_conn_state, new_conn_state, i) {
   14554         [ #  # ]:          0 :                 if (!connector->has_tile)
   14555                 :          0 :                         continue;
   14556         [ #  # ]:          0 :                 if (!intel_connector_needs_modeset(state, connector))
   14557                 :          0 :                         continue;
   14558                 :            : 
   14559                 :          0 :                 ret = intel_modeset_all_tiles(state, connector->tile_group->id);
   14560         [ #  # ]:          0 :                 if (ret)
   14561                 :          0 :                         return ret;
   14562                 :            :         }
   14563                 :            : 
   14564                 :            :         return 0;
   14565                 :            : }
   14566                 :            : 
   14567                 :            : /**
   14568                 :            :  * intel_atomic_check - validate state object
   14569                 :            :  * @dev: drm device
   14570                 :            :  * @_state: state to validate
   14571                 :            :  */
   14572                 :          0 : static int intel_atomic_check(struct drm_device *dev,
   14573                 :            :                               struct drm_atomic_state *_state)
   14574                 :            : {
   14575                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   14576                 :          0 :         struct intel_atomic_state *state = to_intel_atomic_state(_state);
   14577                 :          0 :         struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14578                 :          0 :         struct intel_crtc *crtc;
   14579                 :          0 :         int ret, i;
   14580                 :          0 :         bool any_ms = false;
   14581                 :            : 
   14582                 :            :         /* Catch I915_MODE_FLAG_INHERITED */
   14583   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14584                 :            :                                             new_crtc_state, i) {
   14585                 :          0 :                 if (new_crtc_state->hw.mode.private_flags !=
   14586         [ #  # ]:          0 :                     old_crtc_state->hw.mode.private_flags)
   14587                 :          0 :                         new_crtc_state->uapi.mode_changed = true;
   14588                 :            :         }
   14589                 :            : 
   14590                 :          0 :         ret = drm_atomic_helper_check_modeset(dev, &state->base);
   14591         [ #  # ]:          0 :         if (ret)
   14592                 :          0 :                 goto fail;
   14593                 :            : 
   14594                 :            :         /**
   14595                 :            :          * This check adds all the connectors in current state that belong to
   14596                 :            :          * the same tile group to a full modeset.
   14597                 :            :          * This function directly sets the mode_changed to true and we also call
   14598                 :            :          * drm_atomic_add_affected_connectors(). Hence we are not explicitly
   14599                 :            :          * calling drm_atomic_helper_check_modeset() after this.
   14600                 :            :          *
   14601                 :            :          * Fixme: Handle some corner cases where one of the
   14602                 :            :          * tiled connectors gets disconnected and tile info is lost but since it
   14603                 :            :          * was previously synced to other conn, we need to add that to the modeset.
   14604                 :            :          */
   14605                 :          0 :         ret = intel_atomic_check_tiled_conns(state);
   14606         [ #  # ]:          0 :         if (ret)
   14607                 :          0 :                 goto fail;
   14608                 :            : 
   14609   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14610                 :            :                                             new_crtc_state, i) {
   14611         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state)) {
   14612                 :            :                         /* Light copy */
   14613                 :          0 :                         intel_crtc_copy_uapi_to_hw_state_nomodeset(new_crtc_state);
   14614                 :            : 
   14615                 :          0 :                         continue;
   14616                 :            :                 }
   14617                 :            : 
   14618         [ #  # ]:          0 :                 if (!new_crtc_state->uapi.enable) {
   14619                 :          0 :                         intel_crtc_copy_uapi_to_hw_state(new_crtc_state);
   14620                 :          0 :                         continue;
   14621                 :            :                 }
   14622                 :            : 
   14623                 :          0 :                 ret = intel_crtc_prepare_cleared_state(new_crtc_state);
   14624         [ #  # ]:          0 :                 if (ret)
   14625                 :          0 :                         goto fail;
   14626                 :            : 
   14627                 :          0 :                 ret = intel_modeset_pipe_config(new_crtc_state);
   14628         [ #  # ]:          0 :                 if (ret)
   14629                 :          0 :                         goto fail;
   14630                 :            : 
   14631                 :          0 :                 intel_crtc_check_fastset(old_crtc_state, new_crtc_state);
   14632                 :            :         }
   14633                 :            : 
   14634                 :            :         /**
   14635                 :            :          * Check if fastset is allowed by external dependencies like other
   14636                 :            :          * pipes and transcoders.
   14637                 :            :          *
   14638                 :            :          * Right now it only forces a fullmodeset when the MST master
   14639                 :            :          * transcoder did not changed but the pipe of the master transcoder
   14640                 :            :          * needs a fullmodeset so all slaves also needs to do a fullmodeset or
   14641                 :            :          * in case of port synced crtcs, if one of the synced crtcs
   14642                 :            :          * needs a full modeset, all other synced crtcs should be
   14643                 :            :          * forced a full modeset.
   14644                 :            :          */
   14645   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14646   [ #  #  #  # ]:          0 :                 if (!new_crtc_state->hw.enable || needs_modeset(new_crtc_state))
   14647                 :          0 :                         continue;
   14648                 :            : 
   14649         [ #  # ]:          0 :                 if (intel_dp_mst_is_slave_trans(new_crtc_state)) {
   14650                 :          0 :                         enum transcoder master = new_crtc_state->mst_master_transcoder;
   14651                 :            : 
   14652         [ #  # ]:          0 :                         if (intel_cpu_transcoders_need_modeset(state, BIT(master))) {
   14653                 :          0 :                                 new_crtc_state->uapi.mode_changed = true;
   14654                 :          0 :                                 new_crtc_state->update_pipe = false;
   14655                 :            :                         }
   14656                 :            :                 }
   14657                 :            : 
   14658   [ #  #  #  # ]:          0 :                 if (is_trans_port_sync_mode(new_crtc_state)) {
   14659                 :          0 :                         u8 trans = new_crtc_state->sync_mode_slaves_mask |
   14660                 :          0 :                                    BIT(new_crtc_state->master_transcoder);
   14661                 :            : 
   14662         [ #  # ]:          0 :                         if (intel_cpu_transcoders_need_modeset(state, trans)) {
   14663                 :          0 :                                 new_crtc_state->uapi.mode_changed = true;
   14664                 :          0 :                                 new_crtc_state->update_pipe = false;
   14665                 :            :                         }
   14666                 :            :                 }
   14667                 :            :         }
   14668                 :            : 
   14669   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14670                 :            :                                             new_crtc_state, i) {
   14671         [ #  # ]:          0 :                 if (needs_modeset(new_crtc_state)) {
   14672                 :          0 :                         any_ms = true;
   14673                 :          0 :                         continue;
   14674                 :            :                 }
   14675                 :            : 
   14676         [ #  # ]:          0 :                 if (!new_crtc_state->update_pipe)
   14677                 :          0 :                         continue;
   14678                 :            : 
   14679                 :          0 :                 intel_crtc_copy_fastset(old_crtc_state, new_crtc_state);
   14680                 :            :         }
   14681                 :            : 
   14682   [ #  #  #  # ]:          0 :         if (any_ms && !check_digital_port_conflicts(state)) {
   14683                 :          0 :                 DRM_DEBUG_KMS("rejecting conflicting digital port configuration\n");
   14684                 :          0 :                 ret = EINVAL;
   14685                 :          0 :                 goto fail;
   14686                 :            :         }
   14687                 :            : 
   14688                 :          0 :         ret = drm_dp_mst_atomic_check(&state->base);
   14689         [ #  # ]:          0 :         if (ret)
   14690                 :          0 :                 goto fail;
   14691                 :            : 
   14692                 :          0 :         any_ms |= state->cdclk.force_min_cdclk_changed;
   14693                 :            : 
   14694                 :          0 :         ret = intel_atomic_check_planes(state, &any_ms);
   14695         [ #  # ]:          0 :         if (ret)
   14696                 :          0 :                 goto fail;
   14697                 :            : 
   14698         [ #  # ]:          0 :         if (any_ms) {
   14699                 :          0 :                 ret = intel_modeset_checks(state);
   14700         [ #  # ]:          0 :                 if (ret)
   14701                 :          0 :                         goto fail;
   14702                 :            :         } else {
   14703                 :          0 :                 state->cdclk.logical = dev_priv->cdclk.logical;
   14704                 :            :         }
   14705                 :            : 
   14706                 :          0 :         ret = intel_atomic_check_crtcs(state);
   14707         [ #  # ]:          0 :         if (ret)
   14708                 :          0 :                 goto fail;
   14709                 :            : 
   14710                 :          0 :         intel_fbc_choose_crtc(dev_priv, state);
   14711         [ #  # ]:          0 :         ret = calc_watermark_data(state);
   14712         [ #  # ]:          0 :         if (ret)
   14713                 :          0 :                 goto fail;
   14714                 :            : 
   14715                 :          0 :         ret = intel_bw_atomic_check(state);
   14716         [ #  # ]:          0 :         if (ret)
   14717                 :          0 :                 goto fail;
   14718                 :            : 
   14719   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14720                 :            :                                             new_crtc_state, i) {
   14721         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state) &&
   14722         [ #  # ]:          0 :                     !new_crtc_state->update_pipe)
   14723                 :          0 :                         continue;
   14724                 :            : 
   14725         [ #  # ]:          0 :                 intel_dump_pipe_config(new_crtc_state, state,
   14726                 :            :                                        needs_modeset(new_crtc_state) ?
   14727                 :            :                                        "[modeset]" : "[fastset]");
   14728                 :            :         }
   14729                 :            : 
   14730                 :            :         return 0;
   14731                 :            : 
   14732                 :          0 :  fail:
   14733         [ #  # ]:          0 :         if (ret == -EDEADLK)
   14734                 :            :                 return ret;
   14735                 :            : 
   14736                 :            :         /*
   14737                 :            :          * FIXME would probably be nice to know which crtc specifically
   14738                 :            :          * caused the failure, in cases where we can pinpoint it.
   14739                 :            :          */
   14740   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14741                 :            :                                             new_crtc_state, i)
   14742                 :          0 :                 intel_dump_pipe_config(new_crtc_state, state, "[failed]");
   14743                 :            : 
   14744                 :            :         return ret;
   14745                 :            : }
   14746                 :            : 
   14747                 :          0 : static int intel_atomic_prepare_commit(struct intel_atomic_state *state)
   14748                 :            : {
   14749                 :          0 :         return drm_atomic_helper_prepare_planes(state->base.dev,
   14750                 :            :                                                 &state->base);
   14751                 :            : }
   14752                 :            : 
   14753                 :          0 : u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
   14754                 :            : {
   14755                 :          0 :         struct drm_device *dev = crtc->base.dev;
   14756         [ #  # ]:          0 :         struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(&crtc->base)];
   14757                 :            : 
   14758         [ #  # ]:          0 :         if (!vblank->max_vblank_count)
   14759                 :          0 :                 return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
   14760                 :            : 
   14761                 :          0 :         return crtc->base.funcs->get_vblank_counter(&crtc->base);
   14762                 :            : }
   14763                 :            : 
   14764                 :          0 : void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
   14765                 :            :                                   struct intel_crtc_state *crtc_state)
   14766                 :            : {
   14767         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14768                 :            : 
   14769   [ #  #  #  # ]:          0 :         if (!IS_GEN(dev_priv, 2) || crtc_state->active_planes)
   14770                 :          0 :                 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
   14771                 :            : 
   14772         [ #  # ]:          0 :         if (crtc_state->has_pch_encoder) {
   14773         [ #  # ]:          0 :                 enum pipe pch_transcoder =
   14774                 :            :                         intel_crtc_pch_transcoder(crtc);
   14775                 :            : 
   14776                 :          0 :                 intel_set_pch_fifo_underrun_reporting(dev_priv, pch_transcoder, true);
   14777                 :            :         }
   14778                 :          0 : }
   14779                 :            : 
   14780                 :          0 : static void intel_pipe_fastset(const struct intel_crtc_state *old_crtc_state,
   14781                 :            :                                const struct intel_crtc_state *new_crtc_state)
   14782                 :            : {
   14783                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   14784                 :          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14785                 :            : 
   14786                 :            :         /*
   14787                 :            :          * Update pipe size and adjust fitter if needed: the reason for this is
   14788                 :            :          * that in compute_mode_changes we check the native mode (not the pfit
   14789                 :            :          * mode) to see if we can flip rather than do a full mode set. In the
   14790                 :            :          * fastboot case, we'll flip, but if we don't update the pipesrc and
   14791                 :            :          * pfit state, we'll end up with a big fb scanned out into the wrong
   14792                 :            :          * sized surface.
   14793                 :            :          */
   14794                 :          0 :         intel_set_pipe_src_size(new_crtc_state);
   14795                 :            : 
   14796                 :            :         /* on skylake this is done by detaching scalers */
   14797         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9) {
   14798                 :          0 :                 skl_detach_scalers(new_crtc_state);
   14799                 :            : 
   14800         [ #  # ]:          0 :                 if (new_crtc_state->pch_pfit.enabled)
   14801                 :          0 :                         skl_pfit_enable(new_crtc_state);
   14802         [ #  # ]:          0 :         } else if (HAS_PCH_SPLIT(dev_priv)) {
   14803         [ #  # ]:          0 :                 if (new_crtc_state->pch_pfit.enabled)
   14804                 :          0 :                         ilk_pfit_enable(new_crtc_state);
   14805         [ #  # ]:          0 :                 else if (old_crtc_state->pch_pfit.enabled)
   14806                 :          0 :                         ilk_pfit_disable(old_crtc_state);
   14807                 :            :         }
   14808                 :            : 
   14809         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
   14810                 :          0 :                 icl_set_pipe_chicken(crtc);
   14811                 :          0 : }
   14812                 :            : 
   14813                 :          0 : static void commit_pipe_config(struct intel_atomic_state *state,
   14814                 :            :                                struct intel_crtc_state *old_crtc_state,
   14815                 :            :                                struct intel_crtc_state *new_crtc_state)
   14816                 :            : {
   14817                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   14818         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14819         [ #  # ]:          0 :         bool modeset = needs_modeset(new_crtc_state);
   14820                 :            : 
   14821                 :            :         /*
   14822                 :            :          * During modesets pipe configuration was programmed as the
   14823                 :            :          * CRTC was enabled.
   14824                 :            :          */
   14825         [ #  # ]:          0 :         if (!modeset) {
   14826         [ #  # ]:          0 :                 if (new_crtc_state->uapi.color_mgmt_changed ||
   14827         [ #  # ]:          0 :                     new_crtc_state->update_pipe)
   14828                 :          0 :                         intel_color_commit(new_crtc_state);
   14829                 :            : 
   14830         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 9)
   14831                 :          0 :                         skl_detach_scalers(new_crtc_state);
   14832                 :            : 
   14833   [ #  #  #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
   14834                 :          0 :                         bdw_set_pipemisc(new_crtc_state);
   14835                 :            : 
   14836         [ #  # ]:          0 :                 if (new_crtc_state->update_pipe)
   14837                 :          0 :                         intel_pipe_fastset(old_crtc_state, new_crtc_state);
   14838                 :            :         }
   14839                 :            : 
   14840         [ #  # ]:          0 :         if (dev_priv->display.atomic_update_watermarks)
   14841                 :          0 :                 dev_priv->display.atomic_update_watermarks(state, crtc);
   14842                 :          0 : }
   14843                 :            : 
   14844                 :          0 : static void intel_update_crtc(struct intel_crtc *crtc,
   14845                 :            :                               struct intel_atomic_state *state,
   14846                 :            :                               struct intel_crtc_state *old_crtc_state,
   14847                 :            :                               struct intel_crtc_state *new_crtc_state)
   14848                 :            : {
   14849         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14850         [ #  # ]:          0 :         bool modeset = needs_modeset(new_crtc_state);
   14851                 :          0 :         struct intel_plane_state *new_plane_state =
   14852                 :            :                 intel_atomic_get_new_plane_state(state,
   14853         [ #  # ]:          0 :                                                  to_intel_plane(crtc->base.primary));
   14854                 :            : 
   14855         [ #  # ]:          0 :         if (modeset) {
   14856                 :          0 :                 intel_crtc_update_active_timings(new_crtc_state);
   14857                 :            : 
   14858                 :          0 :                 dev_priv->display.crtc_enable(state, crtc);
   14859                 :            : 
   14860                 :            :                 /* vblanks work again, re-enable pipe CRC. */
   14861                 :          0 :                 intel_crtc_enable_pipe_crc(crtc);
   14862                 :            :         } else {
   14863         [ #  # ]:          0 :                 if (new_crtc_state->preload_luts &&
   14864         [ #  # ]:          0 :                     (new_crtc_state->uapi.color_mgmt_changed ||
   14865         [ #  # ]:          0 :                      new_crtc_state->update_pipe))
   14866                 :          0 :                         intel_color_load_luts(new_crtc_state);
   14867                 :            : 
   14868                 :          0 :                 intel_pre_plane_update(state, crtc);
   14869                 :            : 
   14870         [ #  # ]:          0 :                 if (new_crtc_state->update_pipe)
   14871                 :          0 :                         intel_encoders_update_pipe(state, crtc);
   14872                 :            :         }
   14873                 :            : 
   14874   [ #  #  #  # ]:          0 :         if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
   14875                 :          0 :                 intel_fbc_disable(crtc);
   14876         [ #  # ]:          0 :         else if (new_plane_state)
   14877                 :          0 :                 intel_fbc_enable(crtc, new_crtc_state, new_plane_state);
   14878                 :            : 
   14879                 :            :         /* Perform vblank evasion around commit operation */
   14880                 :          0 :         intel_pipe_update_start(new_crtc_state);
   14881                 :            : 
   14882                 :          0 :         commit_pipe_config(state, old_crtc_state, new_crtc_state);
   14883                 :            : 
   14884         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   14885                 :          0 :                 skl_update_planes_on_crtc(state, crtc);
   14886                 :            :         else
   14887                 :          0 :                 i9xx_update_planes_on_crtc(state, crtc);
   14888                 :            : 
   14889                 :          0 :         intel_pipe_update_end(new_crtc_state);
   14890                 :            : 
   14891                 :            :         /*
   14892                 :            :          * We usually enable FIFO underrun interrupts as part of the
   14893                 :            :          * CRTC enable sequence during modesets.  But when we inherit a
   14894                 :            :          * valid pipe configuration from the BIOS we need to take care
   14895                 :            :          * of enabling them on the CRTC's first fastset.
   14896                 :            :          */
   14897   [ #  #  #  # ]:          0 :         if (new_crtc_state->update_pipe && !modeset &&
   14898         [ #  # ]:          0 :             old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
   14899                 :          0 :                 intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
   14900                 :          0 : }
   14901                 :            : 
   14902                 :            : static struct intel_crtc *intel_get_slave_crtc(const struct intel_crtc_state *new_crtc_state)
   14903                 :            : {
   14904                 :            :         struct drm_i915_private *dev_priv = to_i915(new_crtc_state->uapi.crtc->dev);
   14905                 :            :         enum transcoder slave_transcoder;
   14906                 :            : 
   14907                 :            :         WARN_ON(!is_power_of_2(new_crtc_state->sync_mode_slaves_mask));
   14908                 :            : 
   14909                 :            :         slave_transcoder = ffs(new_crtc_state->sync_mode_slaves_mask) - 1;
   14910                 :            :         return intel_get_crtc_for_pipe(dev_priv,
   14911                 :            :                                        (enum pipe)slave_transcoder);
   14912                 :            : }
   14913                 :            : 
   14914                 :            : static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
   14915                 :            :                                           struct intel_crtc_state *old_crtc_state,
   14916                 :            :                                           struct intel_crtc_state *new_crtc_state,
   14917                 :            :                                           struct intel_crtc *crtc)
   14918                 :            : {
   14919                 :            :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14920                 :            : 
   14921                 :            :         intel_crtc_disable_planes(state, crtc);
   14922                 :            : 
   14923                 :            :         /*
   14924                 :            :          * We need to disable pipe CRC before disabling the pipe,
   14925                 :            :          * or we race against vblank off.
   14926                 :            :          */
   14927                 :            :         intel_crtc_disable_pipe_crc(crtc);
   14928                 :            : 
   14929                 :            :         dev_priv->display.crtc_disable(state, crtc);
   14930                 :            :         crtc->active = false;
   14931                 :            :         intel_fbc_disable(crtc);
   14932                 :            :         intel_disable_shared_dpll(old_crtc_state);
   14933                 :            : 
   14934                 :            :         /* FIXME unify this for all platforms */
   14935                 :            :         if (!new_crtc_state->hw.active &&
   14936                 :            :             !HAS_GMCH(dev_priv) &&
   14937                 :            :             dev_priv->display.initial_watermarks)
   14938                 :            :                 dev_priv->display.initial_watermarks(state, crtc);
   14939                 :            : }
   14940                 :            : 
   14941                 :          0 : static void intel_commit_modeset_disables(struct intel_atomic_state *state)
   14942                 :            : {
   14943                 :          0 :         struct intel_crtc_state *new_crtc_state, *old_crtc_state;
   14944                 :          0 :         struct intel_crtc *crtc;
   14945                 :          0 :         u32 handled = 0;
   14946                 :          0 :         int i;
   14947                 :            : 
   14948                 :            :         /* Only disable port sync and MST slaves */
   14949   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14950                 :            :                                             new_crtc_state, i) {
   14951         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state))
   14952                 :          0 :                         continue;
   14953                 :            : 
   14954         [ #  # ]:          0 :                 if (!old_crtc_state->hw.active)
   14955                 :          0 :                         continue;
   14956                 :            : 
   14957                 :            :                 /* In case of Transcoder port Sync master slave CRTCs can be
   14958                 :            :                  * assigned in any order and we need to make sure that
   14959                 :            :                  * slave CRTCs are disabled first and then master CRTC since
   14960                 :            :                  * Slave vblanks are masked till Master Vblanks.
   14961                 :            :                  */
   14962   [ #  #  #  # ]:          0 :                 if (!is_trans_port_sync_slave(old_crtc_state) &&
   14963                 :          0 :                     !intel_dp_mst_is_slave_trans(old_crtc_state))
   14964                 :          0 :                         continue;
   14965                 :            : 
   14966                 :          0 :                 intel_pre_plane_update(state, crtc);
   14967                 :          0 :                 intel_old_crtc_state_disables(state, old_crtc_state,
   14968                 :            :                                               new_crtc_state, crtc);
   14969                 :          0 :                 handled |= BIT(crtc->pipe);
   14970                 :            :         }
   14971                 :            : 
   14972                 :            :         /* Disable everything else left on */
   14973   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14974                 :            :                                             new_crtc_state, i) {
   14975         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state) ||
   14976         [ #  # ]:          0 :                     (handled & BIT(crtc->pipe)))
   14977                 :          0 :                         continue;
   14978                 :            : 
   14979                 :          0 :                 intel_pre_plane_update(state, crtc);
   14980         [ #  # ]:          0 :                 if (old_crtc_state->hw.active)
   14981                 :          0 :                         intel_old_crtc_state_disables(state, old_crtc_state,
   14982                 :            :                                                       new_crtc_state, crtc);
   14983                 :            :         }
   14984                 :          0 : }
   14985                 :            : 
   14986                 :          0 : static void intel_commit_modeset_enables(struct intel_atomic_state *state)
   14987                 :            : {
   14988                 :          0 :         struct intel_crtc *crtc;
   14989                 :          0 :         struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14990                 :          0 :         int i;
   14991                 :            : 
   14992   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   14993         [ #  # ]:          0 :                 if (!new_crtc_state->hw.active)
   14994                 :          0 :                         continue;
   14995                 :            : 
   14996                 :          0 :                 intel_update_crtc(crtc, state, old_crtc_state,
   14997                 :            :                                   new_crtc_state);
   14998                 :            :         }
   14999                 :          0 : }
   15000                 :            : 
   15001                 :          0 : static void intel_crtc_enable_trans_port_sync(struct intel_crtc *crtc,
   15002                 :            :                                               struct intel_atomic_state *state,
   15003                 :            :                                               struct intel_crtc_state *new_crtc_state)
   15004                 :            : {
   15005                 :          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   15006                 :            : 
   15007                 :          0 :         intel_crtc_update_active_timings(new_crtc_state);
   15008                 :          0 :         dev_priv->display.crtc_enable(state, crtc);
   15009                 :          0 :         intel_crtc_enable_pipe_crc(crtc);
   15010                 :          0 : }
   15011                 :            : 
   15012                 :            : static void intel_set_dp_tp_ctl_normal(struct intel_crtc *crtc,
   15013                 :            :                                        struct intel_atomic_state *state)
   15014                 :            : {
   15015                 :            :         struct drm_connector *uninitialized_var(conn);
   15016                 :            :         struct drm_connector_state *conn_state;
   15017                 :            :         struct intel_dp *intel_dp;
   15018                 :            :         int i;
   15019                 :            : 
   15020                 :            :         for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   15021                 :            :                 if (conn_state->crtc == &crtc->base)
   15022                 :            :                         break;
   15023                 :            :         }
   15024                 :            :         intel_dp = enc_to_intel_dp(intel_attached_encoder(to_intel_connector(conn)));
   15025                 :            :         intel_dp_stop_link_train(intel_dp);
   15026                 :            : }
   15027                 :            : 
   15028                 :            : /*
   15029                 :            :  * TODO: This is only called from port sync and it is identical to what will be
   15030                 :            :  * executed again in intel_update_crtc() over port sync pipes
   15031                 :            :  */
   15032                 :          0 : static void intel_post_crtc_enable_updates(struct intel_crtc *crtc,
   15033                 :            :                                            struct intel_atomic_state *state)
   15034                 :            : {
   15035         [ #  # ]:          0 :         struct intel_crtc_state *new_crtc_state =
   15036                 :            :                 intel_atomic_get_new_crtc_state(state, crtc);
   15037         [ #  # ]:          0 :         struct intel_crtc_state *old_crtc_state =
   15038                 :            :                 intel_atomic_get_old_crtc_state(state, crtc);
   15039                 :          0 :         struct intel_plane_state *new_plane_state =
   15040                 :            :                 intel_atomic_get_new_plane_state(state,
   15041         [ #  # ]:          0 :                                                  to_intel_plane(crtc->base.primary));
   15042         [ #  # ]:          0 :         bool modeset = needs_modeset(new_crtc_state);
   15043                 :            : 
   15044   [ #  #  #  # ]:          0 :         if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
   15045                 :          0 :                 intel_fbc_disable(crtc);
   15046         [ #  # ]:          0 :         else if (new_plane_state)
   15047                 :          0 :                 intel_fbc_enable(crtc, new_crtc_state, new_plane_state);
   15048                 :            : 
   15049                 :            :         /* Perform vblank evasion around commit operation */
   15050                 :          0 :         intel_pipe_update_start(new_crtc_state);
   15051                 :          0 :         commit_pipe_config(state, old_crtc_state, new_crtc_state);
   15052                 :          0 :         skl_update_planes_on_crtc(state, crtc);
   15053                 :          0 :         intel_pipe_update_end(new_crtc_state);
   15054                 :            : 
   15055                 :            :         /*
   15056                 :            :          * We usually enable FIFO underrun interrupts as part of the
   15057                 :            :          * CRTC enable sequence during modesets.  But when we inherit a
   15058                 :            :          * valid pipe configuration from the BIOS we need to take care
   15059                 :            :          * of enabling them on the CRTC's first fastset.
   15060                 :            :          */
   15061   [ #  #  #  # ]:          0 :         if (new_crtc_state->update_pipe && !modeset &&
   15062         [ #  # ]:          0 :             old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
   15063                 :          0 :                 intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
   15064                 :          0 : }
   15065                 :            : 
   15066                 :            : static void intel_update_trans_port_sync_crtcs(struct intel_crtc *crtc,
   15067                 :            :                                                struct intel_atomic_state *state,
   15068                 :            :                                                struct intel_crtc_state *old_crtc_state,
   15069                 :            :                                                struct intel_crtc_state *new_crtc_state)
   15070                 :            : {
   15071                 :            :         struct intel_crtc *slave_crtc = intel_get_slave_crtc(new_crtc_state);
   15072                 :            :         struct intel_crtc_state *new_slave_crtc_state =
   15073                 :            :                 intel_atomic_get_new_crtc_state(state, slave_crtc);
   15074                 :            :         struct intel_crtc_state *old_slave_crtc_state =
   15075                 :            :                 intel_atomic_get_old_crtc_state(state, slave_crtc);
   15076                 :            : 
   15077                 :            :         WARN_ON(!slave_crtc || !new_slave_crtc_state ||
   15078                 :            :                 !old_slave_crtc_state);
   15079                 :            : 
   15080                 :            :         DRM_DEBUG_KMS("Updating Transcoder Port Sync Master CRTC = %d %s and Slave CRTC %d %s\n",
   15081                 :            :                       crtc->base.base.id, crtc->base.name, slave_crtc->base.base.id,
   15082                 :            :                       slave_crtc->base.name);
   15083                 :            : 
   15084                 :            :         /* Enable seq for slave with with DP_TP_CTL left Idle until the
   15085                 :            :          * master is ready
   15086                 :            :          */
   15087                 :            :         intel_crtc_enable_trans_port_sync(slave_crtc,
   15088                 :            :                                           state,
   15089                 :            :                                           new_slave_crtc_state);
   15090                 :            : 
   15091                 :            :         /* Enable seq for master with with DP_TP_CTL left Idle */
   15092                 :            :         intel_crtc_enable_trans_port_sync(crtc,
   15093                 :            :                                           state,
   15094                 :            :                                           new_crtc_state);
   15095                 :            : 
   15096                 :            :         /* Set Slave's DP_TP_CTL to Normal */
   15097                 :            :         intel_set_dp_tp_ctl_normal(slave_crtc,
   15098                 :            :                                    state);
   15099                 :            : 
   15100                 :            :         /* Set Master's DP_TP_CTL To Normal */
   15101                 :            :         usleep_range(200, 400);
   15102                 :            :         intel_set_dp_tp_ctl_normal(crtc,
   15103                 :            :                                    state);
   15104                 :            : 
   15105                 :            :         /* Now do the post crtc enable for all master and slaves */
   15106                 :            :         intel_post_crtc_enable_updates(slave_crtc,
   15107                 :            :                                        state);
   15108                 :            :         intel_post_crtc_enable_updates(crtc,
   15109                 :            :                                        state);
   15110                 :            : }
   15111                 :            : 
   15112                 :          0 : static void skl_commit_modeset_enables(struct intel_atomic_state *state)
   15113                 :            : {
   15114         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   15115                 :          0 :         struct intel_crtc *crtc;
   15116                 :          0 :         struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   15117                 :          0 :         u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices;
   15118                 :          0 :         u8 required_slices = state->wm_results.ddb.enabled_slices;
   15119                 :          0 :         struct skl_ddb_entry entries[I915_MAX_PIPES] = {};
   15120         [ #  # ]:          0 :         const u8 num_pipes = INTEL_NUM_PIPES(dev_priv);
   15121                 :          0 :         u8 update_pipes = 0, modeset_pipes = 0;
   15122                 :          0 :         int i;
   15123                 :            : 
   15124   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   15125         [ #  # ]:          0 :                 if (!new_crtc_state->hw.active)
   15126                 :          0 :                         continue;
   15127                 :            : 
   15128                 :            :                 /* ignore allocations for crtc's that have been turned off. */
   15129         [ #  # ]:          0 :                 if (!needs_modeset(new_crtc_state)) {
   15130                 :          0 :                         entries[i] = old_crtc_state->wm.skl.ddb;
   15131                 :          0 :                         update_pipes |= BIT(crtc->pipe);
   15132                 :            :                 } else {
   15133                 :          0 :                         modeset_pipes |= BIT(crtc->pipe);
   15134                 :            :                 }
   15135                 :            :         }
   15136                 :            : 
   15137                 :            :         /* If 2nd DBuf slice required, enable it here */
   15138   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11 && required_slices > hw_enabled_slices)
   15139                 :          0 :                 icl_dbuf_slices_update(dev_priv, required_slices);
   15140                 :            : 
   15141                 :            :         /*
   15142                 :            :          * Whenever the number of active pipes changes, we need to make sure we
   15143                 :            :          * update the pipes in the right order so that their ddb allocations
   15144                 :            :          * never overlap with each other between CRTC updates. Otherwise we'll
   15145                 :            :          * cause pipe underruns and other bad stuff.
   15146                 :            :          *
   15147                 :            :          * So first lets enable all pipes that do not need a fullmodeset as
   15148                 :            :          * those don't have any external dependency.
   15149                 :            :          */
   15150         [ #  # ]:          0 :         while (update_pipes) {
   15151   [ #  #  #  # ]:          0 :                 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15152                 :            :                                                     new_crtc_state, i) {
   15153                 :          0 :                         enum pipe pipe = crtc->pipe;
   15154                 :            : 
   15155         [ #  # ]:          0 :                         if ((update_pipes & BIT(pipe)) == 0)
   15156                 :          0 :                                 continue;
   15157                 :            : 
   15158         [ #  # ]:          0 :                         if (skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15159                 :            :                                                         entries, num_pipes, i))
   15160                 :          0 :                                 continue;
   15161                 :            : 
   15162                 :          0 :                         entries[i] = new_crtc_state->wm.skl.ddb;
   15163                 :          0 :                         update_pipes &= ~BIT(pipe);
   15164                 :            : 
   15165                 :          0 :                         intel_update_crtc(crtc, state, old_crtc_state,
   15166                 :            :                                           new_crtc_state);
   15167                 :            : 
   15168                 :            :                         /*
   15169                 :            :                          * If this is an already active pipe, it's DDB changed,
   15170                 :            :                          * and this isn't the last pipe that needs updating
   15171                 :            :                          * then we need to wait for a vblank to pass for the
   15172                 :            :                          * new ddb allocation to take effect.
   15173                 :            :                          */
   15174         [ #  # ]:          0 :                         if (!skl_ddb_entry_equal(&new_crtc_state->wm.skl.ddb,
   15175         [ #  # ]:          0 :                                                  &old_crtc_state->wm.skl.ddb) &&
   15176                 :            :                             (update_pipes | modeset_pipes))
   15177                 :          0 :                                 intel_wait_for_vblank(dev_priv, pipe);
   15178                 :            :                 }
   15179                 :            :         }
   15180                 :            : 
   15181                 :            :         /*
   15182                 :            :          * Enable all pipes that needs a modeset and do not depends on other
   15183                 :            :          * pipes
   15184                 :            :          */
   15185   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15186                 :            :                                             new_crtc_state, i) {
   15187                 :          0 :                 enum pipe pipe = crtc->pipe;
   15188                 :            : 
   15189         [ #  # ]:          0 :                 if ((modeset_pipes & BIT(pipe)) == 0)
   15190                 :          0 :                         continue;
   15191                 :            : 
   15192         [ #  # ]:          0 :                 if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
   15193         [ #  # ]:          0 :                     is_trans_port_sync_slave(new_crtc_state))
   15194                 :          0 :                         continue;
   15195                 :            : 
   15196         [ #  # ]:          0 :                 WARN_ON(skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15197                 :            :                                                     entries, num_pipes, i));
   15198                 :            : 
   15199                 :          0 :                 entries[i] = new_crtc_state->wm.skl.ddb;
   15200                 :          0 :                 modeset_pipes &= ~BIT(pipe);
   15201                 :            : 
   15202   [ #  #  #  # ]:          0 :                 if (is_trans_port_sync_mode(new_crtc_state)) {
   15203                 :          0 :                         struct intel_crtc *slave_crtc;
   15204                 :            : 
   15205                 :          0 :                         intel_update_trans_port_sync_crtcs(crtc, state,
   15206                 :            :                                                            old_crtc_state,
   15207                 :            :                                                            new_crtc_state);
   15208                 :            : 
   15209                 :          0 :                         slave_crtc = intel_get_slave_crtc(new_crtc_state);
   15210                 :            :                         /* TODO: update entries[] of slave */
   15211                 :          0 :                         modeset_pipes &= ~BIT(slave_crtc->pipe);
   15212                 :            : 
   15213                 :            :                 } else {
   15214                 :          0 :                         intel_update_crtc(crtc, state, old_crtc_state,
   15215                 :            :                                           new_crtc_state);
   15216                 :            :                 }
   15217                 :            :         }
   15218                 :            : 
   15219                 :            :         /*
   15220                 :            :          * Finally enable all pipes that needs a modeset and depends on
   15221                 :            :          * other pipes, right now it is only MST slaves as both port sync slave
   15222                 :            :          * and master are enabled together
   15223                 :            :          */
   15224   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15225                 :            :                                             new_crtc_state, i) {
   15226                 :          0 :                 enum pipe pipe = crtc->pipe;
   15227                 :            : 
   15228         [ #  # ]:          0 :                 if ((modeset_pipes & BIT(pipe)) == 0)
   15229                 :          0 :                         continue;
   15230                 :            : 
   15231         [ #  # ]:          0 :                 WARN_ON(skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15232                 :            :                                                     entries, num_pipes, i));
   15233                 :            : 
   15234                 :          0 :                 entries[i] = new_crtc_state->wm.skl.ddb;
   15235                 :          0 :                 modeset_pipes &= ~BIT(pipe);
   15236                 :            : 
   15237                 :          0 :                 intel_update_crtc(crtc, state, old_crtc_state, new_crtc_state);
   15238                 :            :         }
   15239                 :            : 
   15240         [ #  # ]:          0 :         WARN_ON(modeset_pipes);
   15241                 :            : 
   15242                 :            :         /* If 2nd DBuf slice is no more required disable it */
   15243   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11 && required_slices < hw_enabled_slices)
   15244                 :          0 :                 icl_dbuf_slices_update(dev_priv, required_slices);
   15245                 :          0 : }
   15246                 :            : 
   15247                 :          0 : static void intel_atomic_helper_free_state(struct drm_i915_private *dev_priv)
   15248                 :            : {
   15249                 :          0 :         struct intel_atomic_state *state, *next;
   15250                 :          0 :         struct llist_node *freed;
   15251                 :            : 
   15252                 :          0 :         freed = llist_del_all(&dev_priv->atomic_helper.free_list);
   15253         [ #  # ]:          0 :         llist_for_each_entry_safe(state, next, freed, freed)
   15254                 :          0 :                 drm_atomic_state_put(&state->base);
   15255                 :          0 : }
   15256                 :            : 
   15257                 :          0 : static void intel_atomic_helper_free_state_worker(struct work_struct *work)
   15258                 :            : {
   15259                 :          0 :         struct drm_i915_private *dev_priv =
   15260                 :          0 :                 container_of(work, typeof(*dev_priv), atomic_helper.free_work);
   15261                 :            : 
   15262                 :          0 :         intel_atomic_helper_free_state(dev_priv);
   15263                 :          0 : }
   15264                 :            : 
   15265                 :          0 : static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_state)
   15266                 :            : {
   15267                 :          0 :         struct wait_queue_entry wait_fence, wait_reset;
   15268                 :          0 :         struct drm_i915_private *dev_priv = to_i915(intel_state->base.dev);
   15269                 :            : 
   15270                 :          0 :         init_wait_entry(&wait_fence, 0);
   15271                 :          0 :         init_wait_entry(&wait_reset, 0);
   15272                 :          0 :         for (;;) {
   15273                 :          0 :                 prepare_to_wait(&intel_state->commit_ready.wait,
   15274                 :            :                                 &wait_fence, TASK_UNINTERRUPTIBLE);
   15275                 :          0 :                 prepare_to_wait(bit_waitqueue(&dev_priv->gt.reset.flags,
   15276                 :            :                                               I915_RESET_MODESET),
   15277                 :            :                                 &wait_reset, TASK_UNINTERRUPTIBLE);
   15278                 :            : 
   15279                 :            : 
   15280   [ #  #  #  # ]:          0 :                 if (i915_sw_fence_done(&intel_state->commit_ready) ||
   15281                 :            :                     test_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags))
   15282                 :            :                         break;
   15283                 :            : 
   15284                 :          0 :                 schedule();
   15285                 :            :         }
   15286                 :          0 :         finish_wait(&intel_state->commit_ready.wait, &wait_fence);
   15287                 :          0 :         finish_wait(bit_waitqueue(&dev_priv->gt.reset.flags,
   15288                 :            :                                   I915_RESET_MODESET),
   15289                 :            :                     &wait_reset);
   15290                 :          0 : }
   15291                 :            : 
   15292                 :          0 : static void intel_atomic_cleanup_work(struct work_struct *work)
   15293                 :            : {
   15294                 :          0 :         struct drm_atomic_state *state =
   15295                 :          0 :                 container_of(work, struct drm_atomic_state, commit_work);
   15296                 :          0 :         struct drm_i915_private *i915 = to_i915(state->dev);
   15297                 :            : 
   15298                 :          0 :         drm_atomic_helper_cleanup_planes(&i915->drm, state);
   15299                 :          0 :         drm_atomic_helper_commit_cleanup_done(state);
   15300                 :          0 :         drm_atomic_state_put(state);
   15301                 :            : 
   15302                 :          0 :         intel_atomic_helper_free_state(i915);
   15303                 :          0 : }
   15304                 :            : 
   15305                 :          0 : static void intel_atomic_commit_tail(struct intel_atomic_state *state)
   15306                 :            : {
   15307                 :          0 :         struct drm_device *dev = state->base.dev;
   15308                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   15309                 :          0 :         struct intel_crtc_state *new_crtc_state, *old_crtc_state;
   15310                 :          0 :         struct intel_crtc *crtc;
   15311                 :          0 :         u64 put_domains[I915_MAX_PIPES] = {};
   15312                 :          0 :         intel_wakeref_t wakeref = 0;
   15313                 :          0 :         int i;
   15314                 :            : 
   15315                 :          0 :         intel_atomic_commit_fence_wait(state);
   15316                 :            : 
   15317                 :          0 :         drm_atomic_helper_wait_for_dependencies(&state->base);
   15318                 :            : 
   15319         [ #  # ]:          0 :         if (state->modeset)
   15320                 :          0 :                 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
   15321                 :            : 
   15322   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15323                 :            :                                             new_crtc_state, i) {
   15324         [ #  # ]:          0 :                 if (needs_modeset(new_crtc_state) ||
   15325         [ #  # ]:          0 :                     new_crtc_state->update_pipe) {
   15326                 :            : 
   15327                 :          0 :                         put_domains[crtc->pipe] =
   15328                 :          0 :                                 modeset_get_crtc_power_domains(new_crtc_state);
   15329                 :            :                 }
   15330                 :            :         }
   15331                 :            : 
   15332                 :          0 :         intel_commit_modeset_disables(state);
   15333                 :            : 
   15334                 :            :         /* FIXME: Eventually get rid of our crtc->config pointer */
   15335   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
   15336                 :          0 :                 crtc->config = new_crtc_state;
   15337                 :            : 
   15338         [ #  # ]:          0 :         if (state->modeset) {
   15339                 :          0 :                 drm_atomic_helper_update_legacy_modeset_state(dev, &state->base);
   15340                 :            : 
   15341                 :          0 :                 intel_set_cdclk_pre_plane_update(dev_priv,
   15342                 :          0 :                                                  &state->cdclk.actual,
   15343                 :          0 :                                                  &dev_priv->cdclk.actual,
   15344                 :            :                                                  state->cdclk.pipe);
   15345                 :            : 
   15346                 :            :                 /*
   15347                 :            :                  * SKL workaround: bspec recommends we disable the SAGV when we
   15348                 :            :                  * have more then one pipe enabled
   15349                 :            :                  */
   15350         [ #  # ]:          0 :                 if (!intel_can_enable_sagv(state))
   15351                 :          0 :                         intel_disable_sagv(dev_priv);
   15352                 :            : 
   15353                 :          0 :                 intel_modeset_verify_disabled(dev_priv, state);
   15354                 :            :         }
   15355                 :            : 
   15356                 :            :         /* Complete the events for pipes that have now been disabled */
   15357   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   15358         [ #  # ]:          0 :                 bool modeset = needs_modeset(new_crtc_state);
   15359                 :            : 
   15360                 :            :                 /* Complete events for now disable pipes here. */
   15361   [ #  #  #  #  :          0 :                 if (modeset && !new_crtc_state->hw.active && new_crtc_state->uapi.event) {
                   #  # ]
   15362                 :          0 :                         spin_lock_irq(&dev->event_lock);
   15363                 :          0 :                         drm_crtc_send_vblank_event(&crtc->base,
   15364                 :            :                                                    new_crtc_state->uapi.event);
   15365                 :          0 :                         spin_unlock_irq(&dev->event_lock);
   15366                 :            : 
   15367                 :          0 :                         new_crtc_state->uapi.event = NULL;
   15368                 :            :                 }
   15369                 :            :         }
   15370                 :            : 
   15371         [ #  # ]:          0 :         if (state->modeset)
   15372                 :          0 :                 intel_encoders_update_prepare(state);
   15373                 :            : 
   15374                 :            :         /* Now enable the clocks, plane, pipe, and connectors that we set up. */
   15375                 :          0 :         dev_priv->display.commit_modeset_enables(state);
   15376                 :            : 
   15377         [ #  # ]:          0 :         if (state->modeset) {
   15378                 :          0 :                 intel_encoders_update_complete(state);
   15379                 :            : 
   15380                 :          0 :                 intel_set_cdclk_post_plane_update(dev_priv,
   15381                 :          0 :                                                   &state->cdclk.actual,
   15382                 :          0 :                                                   &dev_priv->cdclk.actual,
   15383                 :            :                                                   state->cdclk.pipe);
   15384                 :            :         }
   15385                 :            : 
   15386                 :            :         /* FIXME: We should call drm_atomic_helper_commit_hw_done() here
   15387                 :            :          * already, but still need the state for the delayed optimization. To
   15388                 :            :          * fix this:
   15389                 :            :          * - wrap the optimization/post_plane_update stuff into a per-crtc work.
   15390                 :            :          * - schedule that vblank worker _before_ calling hw_done
   15391                 :            :          * - at the start of commit_tail, cancel it _synchrously
   15392                 :            :          * - switch over to the vblank wait helper in the core after that since
   15393                 :            :          *   we don't need out special handling any more.
   15394                 :            :          */
   15395                 :          0 :         drm_atomic_helper_wait_for_flip_done(dev, &state->base);
   15396                 :            : 
   15397   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   15398   [ #  #  #  # ]:          0 :                 if (new_crtc_state->hw.active &&
   15399                 :          0 :                     !needs_modeset(new_crtc_state) &&
   15400         [ #  # ]:          0 :                     !new_crtc_state->preload_luts &&
   15401         [ #  # ]:          0 :                     (new_crtc_state->uapi.color_mgmt_changed ||
   15402         [ #  # ]:          0 :                      new_crtc_state->update_pipe))
   15403                 :          0 :                         intel_color_load_luts(new_crtc_state);
   15404                 :            :         }
   15405                 :            : 
   15406                 :            :         /*
   15407                 :            :          * Now that the vblank has passed, we can go ahead and program the
   15408                 :            :          * optimal watermarks on platforms that need two-step watermark
   15409                 :            :          * programming.
   15410                 :            :          *
   15411                 :            :          * TODO: Move this (and other cleanup) to an async worker eventually.
   15412                 :            :          */
   15413   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15414                 :            :                                             new_crtc_state, i) {
   15415                 :            :                 /*
   15416                 :            :                  * Gen2 reports pipe underruns whenever all planes are disabled.
   15417                 :            :                  * So re-enable underrun reporting after some planes get enabled.
   15418                 :            :                  *
   15419                 :            :                  * We do this before .optimize_watermarks() so that we have a
   15420                 :            :                  * chance of catching underruns with the intermediate watermarks
   15421                 :            :                  * vs. the new plane configuration.
   15422                 :            :                  */
   15423   [ #  #  #  #  :          0 :                 if (IS_GEN(dev_priv, 2) && planes_enabling(old_crtc_state, new_crtc_state))
                   #  # ]
   15424                 :          0 :                         intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
   15425                 :            : 
   15426         [ #  # ]:          0 :                 if (dev_priv->display.optimize_watermarks)
   15427                 :          0 :                         dev_priv->display.optimize_watermarks(state, crtc);
   15428                 :            :         }
   15429                 :            : 
   15430   [ #  #  #  # ]:          0 :         for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   15431                 :          0 :                 intel_post_plane_update(state, crtc);
   15432                 :            : 
   15433         [ #  # ]:          0 :                 if (put_domains[i])
   15434                 :            :                         modeset_put_power_domains(dev_priv, put_domains[i]);
   15435                 :            : 
   15436                 :          0 :                 intel_modeset_verify_crtc(crtc, state, old_crtc_state, new_crtc_state);
   15437                 :            :         }
   15438                 :            : 
   15439                 :            :         /* Underruns don't always raise interrupts, so check manually */
   15440                 :          0 :         intel_check_cpu_fifo_underruns(dev_priv);
   15441                 :          0 :         intel_check_pch_fifo_underruns(dev_priv);
   15442                 :            : 
   15443         [ #  # ]:          0 :         if (state->modeset)
   15444                 :          0 :                 intel_verify_planes(state);
   15445                 :            : 
   15446   [ #  #  #  # ]:          0 :         if (state->modeset && intel_can_enable_sagv(state))
   15447                 :          0 :                 intel_enable_sagv(dev_priv);
   15448                 :            : 
   15449                 :          0 :         drm_atomic_helper_commit_hw_done(&state->base);
   15450                 :            : 
   15451         [ #  # ]:          0 :         if (state->modeset) {
   15452                 :            :                 /* As one of the primary mmio accessors, KMS has a high
   15453                 :            :                  * likelihood of triggering bugs in unclaimed access. After we
   15454                 :            :                  * finish modesetting, see if an error has been flagged, and if
   15455                 :            :                  * so enable debugging for the next modeset - and hope we catch
   15456                 :            :                  * the culprit.
   15457                 :            :                  */
   15458                 :          0 :                 intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
   15459                 :          0 :                 intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
   15460                 :            :         }
   15461                 :          0 :         intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15462                 :            : 
   15463                 :            :         /*
   15464                 :            :          * Defer the cleanup of the old state to a separate worker to not
   15465                 :            :          * impede the current task (userspace for blocking modesets) that
   15466                 :            :          * are executed inline. For out-of-line asynchronous modesets/flips,
   15467                 :            :          * deferring to a new worker seems overkill, but we would place a
   15468                 :            :          * schedule point (cond_resched()) here anyway to keep latencies
   15469                 :            :          * down.
   15470                 :            :          */
   15471                 :          0 :         INIT_WORK(&state->base.commit_work, intel_atomic_cleanup_work);
   15472                 :          0 :         queue_work(system_highpri_wq, &state->base.commit_work);
   15473                 :          0 : }
   15474                 :            : 
   15475                 :          0 : static void intel_atomic_commit_work(struct work_struct *work)
   15476                 :            : {
   15477                 :          0 :         struct intel_atomic_state *state =
   15478                 :          0 :                 container_of(work, struct intel_atomic_state, base.commit_work);
   15479                 :            : 
   15480                 :          0 :         intel_atomic_commit_tail(state);
   15481                 :          0 : }
   15482                 :            : 
   15483                 :            : static int __i915_sw_fence_call
   15484                 :          0 : intel_atomic_commit_ready(struct i915_sw_fence *fence,
   15485                 :            :                           enum i915_sw_fence_notify notify)
   15486                 :            : {
   15487                 :          0 :         struct intel_atomic_state *state =
   15488                 :          0 :                 container_of(fence, struct intel_atomic_state, commit_ready);
   15489                 :            : 
   15490         [ #  # ]:          0 :         switch (notify) {
   15491                 :            :         case FENCE_COMPLETE:
   15492                 :            :                 /* we do blocking waits in the worker, nothing to do here */
   15493                 :            :                 break;
   15494                 :          0 :         case FENCE_FREE:
   15495                 :            :                 {
   15496                 :          0 :                         struct intel_atomic_helper *helper =
   15497                 :          0 :                                 &to_i915(state->base.dev)->atomic_helper;
   15498                 :            : 
   15499         [ #  # ]:          0 :                         if (llist_add(&state->freed, &helper->free_list))
   15500                 :          0 :                                 schedule_work(&helper->free_work);
   15501                 :            :                         break;
   15502                 :            :                 }
   15503                 :            :         }
   15504                 :            : 
   15505                 :          0 :         return NOTIFY_DONE;
   15506                 :            : }
   15507                 :            : 
   15508                 :            : static void intel_atomic_track_fbs(struct intel_atomic_state *state)
   15509                 :            : {
   15510                 :            :         struct intel_plane_state *old_plane_state, *new_plane_state;
   15511                 :            :         struct intel_plane *plane;
   15512                 :            :         int i;
   15513                 :            : 
   15514                 :            :         for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
   15515                 :            :                                              new_plane_state, i)
   15516                 :            :                 intel_frontbuffer_track(to_intel_frontbuffer(old_plane_state->hw.fb),
   15517                 :            :                                         to_intel_frontbuffer(new_plane_state->hw.fb),
   15518                 :            :                                         plane->frontbuffer_bit);
   15519                 :            : }
   15520                 :            : 
   15521                 :          0 : static void assert_global_state_locked(struct drm_i915_private *dev_priv)
   15522                 :            : {
   15523                 :          0 :         struct intel_crtc *crtc;
   15524                 :            : 
   15525         [ #  # ]:          0 :         for_each_intel_crtc(&dev_priv->drm, crtc)
   15526                 :          0 :                 drm_modeset_lock_assert_held(&crtc->base.mutex);
   15527                 :            : }
   15528                 :            : 
   15529                 :          0 : static int intel_atomic_commit(struct drm_device *dev,
   15530                 :            :                                struct drm_atomic_state *_state,
   15531                 :            :                                bool nonblock)
   15532                 :            : {
   15533                 :          0 :         struct intel_atomic_state *state = to_intel_atomic_state(_state);
   15534                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   15535                 :          0 :         int ret = 0;
   15536                 :            : 
   15537                 :          0 :         state->wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
   15538                 :            : 
   15539                 :          0 :         drm_atomic_state_get(&state->base);
   15540                 :          0 :         i915_sw_fence_init(&state->commit_ready,
   15541                 :            :                            intel_atomic_commit_ready);
   15542                 :            : 
   15543                 :            :         /*
   15544                 :            :          * The intel_legacy_cursor_update() fast path takes care
   15545                 :            :          * of avoiding the vblank waits for simple cursor
   15546                 :            :          * movement and flips. For cursor on/off and size changes,
   15547                 :            :          * we want to perform the vblank waits so that watermark
   15548                 :            :          * updates happen during the correct frames. Gen9+ have
   15549                 :            :          * double buffered watermarks and so shouldn't need this.
   15550                 :            :          *
   15551                 :            :          * Unset state->legacy_cursor_update before the call to
   15552                 :            :          * drm_atomic_helper_setup_commit() because otherwise
   15553                 :            :          * drm_atomic_helper_wait_for_flip_done() is a noop and
   15554                 :            :          * we get FIFO underruns because we didn't wait
   15555                 :            :          * for vblank.
   15556                 :            :          *
   15557                 :            :          * FIXME doing watermarks and fb cleanup from a vblank worker
   15558                 :            :          * (assuming we had any) would solve these problems.
   15559                 :            :          */
   15560   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9 && state->base.legacy_cursor_update) {
   15561                 :            :                 struct intel_crtc_state *new_crtc_state;
   15562                 :            :                 struct intel_crtc *crtc;
   15563                 :            :                 int i;
   15564                 :            : 
   15565   [ #  #  #  # ]:          0 :                 for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
   15566         [ #  # ]:          0 :                         if (new_crtc_state->wm.need_postvbl_update ||
   15567         [ #  # ]:          0 :                             new_crtc_state->update_wm_post)
   15568                 :          0 :                                 state->base.legacy_cursor_update = false;
   15569                 :            :         }
   15570                 :            : 
   15571                 :          0 :         ret = intel_atomic_prepare_commit(state);
   15572         [ #  # ]:          0 :         if (ret) {
   15573                 :          0 :                 DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
   15574                 :          0 :                 i915_sw_fence_commit(&state->commit_ready);
   15575                 :          0 :                 intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15576                 :          0 :                 return ret;
   15577                 :            :         }
   15578                 :            : 
   15579                 :          0 :         ret = drm_atomic_helper_setup_commit(&state->base, nonblock);
   15580         [ #  # ]:          0 :         if (!ret)
   15581                 :          0 :                 ret = drm_atomic_helper_swap_state(&state->base, true);
   15582                 :            : 
   15583         [ #  # ]:          0 :         if (ret) {
   15584                 :          0 :                 i915_sw_fence_commit(&state->commit_ready);
   15585                 :            : 
   15586                 :          0 :                 drm_atomic_helper_cleanup_planes(dev, &state->base);
   15587                 :          0 :                 intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15588                 :          0 :                 return ret;
   15589                 :            :         }
   15590                 :          0 :         dev_priv->wm.distrust_bios_wm = false;
   15591                 :          0 :         intel_shared_dpll_swap_state(state);
   15592                 :          0 :         intel_atomic_track_fbs(state);
   15593                 :            : 
   15594         [ #  # ]:          0 :         if (state->global_state_changed) {
   15595                 :          0 :                 assert_global_state_locked(dev_priv);
   15596                 :            : 
   15597                 :          0 :                 memcpy(dev_priv->min_cdclk, state->min_cdclk,
   15598                 :            :                        sizeof(state->min_cdclk));
   15599                 :          0 :                 memcpy(dev_priv->min_voltage_level, state->min_voltage_level,
   15600                 :            :                        sizeof(state->min_voltage_level));
   15601                 :          0 :                 dev_priv->active_pipes = state->active_pipes;
   15602                 :          0 :                 dev_priv->cdclk.force_min_cdclk = state->cdclk.force_min_cdclk;
   15603                 :            : 
   15604                 :          0 :                 intel_cdclk_swap_state(state);
   15605                 :            :         }
   15606                 :            : 
   15607                 :          0 :         drm_atomic_state_get(&state->base);
   15608                 :          0 :         INIT_WORK(&state->base.commit_work, intel_atomic_commit_work);
   15609                 :            : 
   15610                 :          0 :         i915_sw_fence_commit(&state->commit_ready);
   15611   [ #  #  #  # ]:          0 :         if (nonblock && state->modeset) {
   15612                 :          0 :                 queue_work(dev_priv->modeset_wq, &state->base.commit_work);
   15613         [ #  # ]:          0 :         } else if (nonblock) {
   15614                 :          0 :                 queue_work(dev_priv->flip_wq, &state->base.commit_work);
   15615                 :            :         } else {
   15616         [ #  # ]:          0 :                 if (state->modeset)
   15617                 :          0 :                         flush_workqueue(dev_priv->modeset_wq);
   15618                 :          0 :                 intel_atomic_commit_tail(state);
   15619                 :            :         }
   15620                 :            : 
   15621                 :            :         return 0;
   15622                 :            : }
   15623                 :            : 
   15624                 :            : struct wait_rps_boost {
   15625                 :            :         struct wait_queue_entry wait;
   15626                 :            : 
   15627                 :            :         struct drm_crtc *crtc;
   15628                 :            :         struct i915_request *request;
   15629                 :            : };
   15630                 :            : 
   15631                 :          0 : static int do_rps_boost(struct wait_queue_entry *_wait,
   15632                 :            :                         unsigned mode, int sync, void *key)
   15633                 :            : {
   15634                 :          0 :         struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
   15635                 :          0 :         struct i915_request *rq = wait->request;
   15636                 :            : 
   15637                 :            :         /*
   15638                 :            :          * If we missed the vblank, but the request is already running it
   15639                 :            :          * is reasonable to assume that it will complete before the next
   15640                 :            :          * vblank without our intervention, so leave RPS alone.
   15641                 :            :          */
   15642         [ #  # ]:          0 :         if (!i915_request_started(rq))
   15643                 :          0 :                 intel_rps_boost(rq);
   15644                 :          0 :         i915_request_put(rq);
   15645                 :            : 
   15646                 :          0 :         drm_crtc_vblank_put(wait->crtc);
   15647                 :            : 
   15648                 :          0 :         list_del(&wait->wait.entry);
   15649                 :          0 :         kfree(wait);
   15650                 :          0 :         return 1;
   15651                 :            : }
   15652                 :            : 
   15653                 :          0 : static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
   15654                 :            :                                        struct dma_fence *fence)
   15655                 :            : {
   15656                 :          0 :         struct wait_rps_boost *wait;
   15657                 :            : 
   15658         [ #  # ]:          0 :         if (!dma_fence_is_i915(fence))
   15659                 :            :                 return;
   15660                 :            : 
   15661         [ #  # ]:          0 :         if (INTEL_GEN(to_i915(crtc->dev)) < 6)
   15662                 :            :                 return;
   15663                 :            : 
   15664         [ #  # ]:          0 :         if (drm_crtc_vblank_get(crtc))
   15665                 :            :                 return;
   15666                 :            : 
   15667                 :          0 :         wait = kmalloc(sizeof(*wait), GFP_KERNEL);
   15668         [ #  # ]:          0 :         if (!wait) {
   15669                 :          0 :                 drm_crtc_vblank_put(crtc);
   15670                 :          0 :                 return;
   15671                 :            :         }
   15672                 :            : 
   15673         [ #  # ]:          0 :         wait->request = to_request(dma_fence_get(fence));
   15674                 :          0 :         wait->crtc = crtc;
   15675                 :            : 
   15676                 :          0 :         wait->wait.func = do_rps_boost;
   15677                 :          0 :         wait->wait.flags = 0;
   15678                 :            : 
   15679                 :          0 :         add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
   15680                 :            : }
   15681                 :            : 
   15682                 :          0 : static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
   15683                 :            : {
   15684                 :          0 :         struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   15685         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   15686                 :          0 :         struct drm_framebuffer *fb = plane_state->hw.fb;
   15687                 :          0 :         struct i915_vma *vma;
   15688                 :            : 
   15689   [ #  #  #  # ]:          0 :         if (plane->id == PLANE_CURSOR &&
   15690                 :            :             INTEL_INFO(dev_priv)->display.cursor_needs_physical) {
   15691         [ #  # ]:          0 :                 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   15692         [ #  # ]:          0 :                 const int align = intel_cursor_alignment(dev_priv);
   15693                 :          0 :                 int err;
   15694                 :            : 
   15695                 :          0 :                 err = i915_gem_object_attach_phys(obj, align);
   15696         [ #  # ]:          0 :                 if (err)
   15697                 :            :                         return err;
   15698                 :            :         }
   15699                 :            : 
   15700                 :          0 :         vma = intel_pin_and_fence_fb_obj(fb,
   15701                 :          0 :                                          &plane_state->view,
   15702         [ #  # ]:          0 :                                          intel_plane_uses_fence(plane_state),
   15703                 :            :                                          &plane_state->flags);
   15704         [ #  # ]:          0 :         if (IS_ERR(vma))
   15705                 :          0 :                 return PTR_ERR(vma);
   15706                 :            : 
   15707                 :          0 :         plane_state->vma = vma;
   15708                 :            : 
   15709                 :          0 :         return 0;
   15710                 :            : }
   15711                 :            : 
   15712                 :          0 : static void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
   15713                 :            : {
   15714                 :          0 :         struct i915_vma *vma;
   15715                 :            : 
   15716                 :          0 :         vma = fetch_and_zero(&old_plane_state->vma);
   15717                 :          0 :         if (vma)
   15718                 :          0 :                 intel_unpin_fb_vma(vma, old_plane_state->flags);
   15719                 :            : }
   15720                 :            : 
   15721                 :          0 : static void fb_obj_bump_render_priority(struct drm_i915_gem_object *obj)
   15722                 :            : {
   15723                 :          0 :         struct i915_sched_attr attr = {
   15724                 :            :                 .priority = I915_USER_PRIORITY(I915_PRIORITY_DISPLAY),
   15725                 :            :         };
   15726                 :            : 
   15727                 :          0 :         i915_gem_object_wait_priority(obj, 0, &attr);
   15728                 :            : }
   15729                 :            : 
   15730                 :            : /**
   15731                 :            :  * intel_prepare_plane_fb - Prepare fb for usage on plane
   15732                 :            :  * @plane: drm plane to prepare for
   15733                 :            :  * @_new_plane_state: the plane state being prepared
   15734                 :            :  *
   15735                 :            :  * Prepares a framebuffer for usage on a display plane.  Generally this
   15736                 :            :  * involves pinning the underlying object and updating the frontbuffer tracking
   15737                 :            :  * bits.  Some older platforms need special physical address handling for
   15738                 :            :  * cursor planes.
   15739                 :            :  *
   15740                 :            :  * Returns 0 on success, negative error code on failure.
   15741                 :            :  */
   15742                 :            : int
   15743                 :          0 : intel_prepare_plane_fb(struct drm_plane *plane,
   15744                 :            :                        struct drm_plane_state *_new_plane_state)
   15745                 :            : {
   15746                 :          0 :         struct intel_plane_state *new_plane_state =
   15747                 :          0 :                 to_intel_plane_state(_new_plane_state);
   15748                 :          0 :         struct intel_atomic_state *intel_state =
   15749                 :          0 :                 to_intel_atomic_state(new_plane_state->uapi.state);
   15750         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->dev);
   15751                 :          0 :         struct drm_framebuffer *fb = new_plane_state->hw.fb;
   15752         [ #  # ]:          0 :         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   15753   [ #  #  #  # ]:          0 :         struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->state->fb);
   15754                 :          0 :         int ret;
   15755                 :            : 
   15756         [ #  # ]:          0 :         if (old_obj) {
   15757                 :          0 :                 struct intel_crtc_state *crtc_state =
   15758                 :            :                         intel_atomic_get_new_crtc_state(intel_state,
   15759         [ #  # ]:          0 :                                                         to_intel_crtc(plane->state->crtc));
   15760                 :            : 
   15761                 :            :                 /* Big Hammer, we also need to ensure that any pending
   15762                 :            :                  * MI_WAIT_FOR_EVENT inside a user batch buffer on the
   15763                 :            :                  * current scanout is retired before unpinning the old
   15764                 :            :                  * framebuffer. Note that we rely on userspace rendering
   15765                 :            :                  * into the buffer attached to the pipe they are waiting
   15766                 :            :                  * on. If not, userspace generates a GPU hang with IPEHR
   15767                 :            :                  * point to the MI_WAIT_FOR_EVENT.
   15768                 :            :                  *
   15769                 :            :                  * This should only fail upon a hung GPU, in which case we
   15770                 :            :                  * can safely continue.
   15771                 :            :                  */
   15772         [ #  # ]:          0 :                 if (needs_modeset(crtc_state)) {
   15773                 :          0 :                         ret = i915_sw_fence_await_reservation(&intel_state->commit_ready,
   15774                 :            :                                                               old_obj->base.resv, NULL,
   15775                 :            :                                                               false, 0,
   15776                 :            :                                                               GFP_KERNEL);
   15777         [ #  # ]:          0 :                         if (ret < 0)
   15778                 :            :                                 return ret;
   15779                 :            :                 }
   15780                 :            :         }
   15781                 :            : 
   15782         [ #  # ]:          0 :         if (new_plane_state->uapi.fence) { /* explicit fencing */
   15783                 :          0 :                 ret = i915_sw_fence_await_dma_fence(&intel_state->commit_ready,
   15784                 :            :                                                     new_plane_state->uapi.fence,
   15785                 :            :                                                     I915_FENCE_TIMEOUT,
   15786                 :            :                                                     GFP_KERNEL);
   15787         [ #  # ]:          0 :                 if (ret < 0)
   15788                 :            :                         return ret;
   15789                 :            :         }
   15790                 :            : 
   15791         [ #  # ]:          0 :         if (!obj)
   15792                 :            :                 return 0;
   15793                 :            : 
   15794                 :          0 :         ret = i915_gem_object_pin_pages(obj);
   15795         [ #  # ]:          0 :         if (ret)
   15796                 :            :                 return ret;
   15797                 :            : 
   15798                 :          0 :         ret = intel_plane_pin_fb(new_plane_state);
   15799                 :            : 
   15800                 :          0 :         i915_gem_object_unpin_pages(obj);
   15801         [ #  # ]:          0 :         if (ret)
   15802                 :            :                 return ret;
   15803                 :            : 
   15804                 :          0 :         fb_obj_bump_render_priority(obj);
   15805         [ #  # ]:          0 :         i915_gem_object_flush_frontbuffer(obj, ORIGIN_DIRTYFB);
   15806                 :            : 
   15807         [ #  # ]:          0 :         if (!new_plane_state->uapi.fence) { /* implicit fencing */
   15808                 :          0 :                 struct dma_fence *fence;
   15809                 :            : 
   15810                 :          0 :                 ret = i915_sw_fence_await_reservation(&intel_state->commit_ready,
   15811                 :            :                                                       obj->base.resv, NULL,
   15812                 :            :                                                       false, I915_FENCE_TIMEOUT,
   15813                 :            :                                                       GFP_KERNEL);
   15814         [ #  # ]:          0 :                 if (ret < 0)
   15815                 :            :                         return ret;
   15816                 :            : 
   15817         [ #  # ]:          0 :                 fence = dma_resv_get_excl_rcu(obj->base.resv);
   15818         [ #  # ]:          0 :                 if (fence) {
   15819                 :          0 :                         add_rps_boost_after_vblank(new_plane_state->hw.crtc,
   15820                 :            :                                                    fence);
   15821                 :          0 :                         dma_fence_put(fence);
   15822                 :            :                 }
   15823                 :            :         } else {
   15824                 :          0 :                 add_rps_boost_after_vblank(new_plane_state->hw.crtc,
   15825                 :            :                                            new_plane_state->uapi.fence);
   15826                 :            :         }
   15827                 :            : 
   15828                 :            :         /*
   15829                 :            :          * We declare pageflips to be interactive and so merit a small bias
   15830                 :            :          * towards upclocking to deliver the frame on time. By only changing
   15831                 :            :          * the RPS thresholds to sample more regularly and aim for higher
   15832                 :            :          * clocks we can hopefully deliver low power workloads (like kodi)
   15833                 :            :          * that are not quite steady state without resorting to forcing
   15834                 :            :          * maximum clocks following a vblank miss (see do_rps_boost()).
   15835                 :            :          */
   15836         [ #  # ]:          0 :         if (!intel_state->rps_interactive) {
   15837                 :          0 :                 intel_rps_mark_interactive(&dev_priv->gt.rps, true);
   15838                 :          0 :                 intel_state->rps_interactive = true;
   15839                 :            :         }
   15840                 :            : 
   15841                 :            :         return 0;
   15842                 :            : }
   15843                 :            : 
   15844                 :            : /**
   15845                 :            :  * intel_cleanup_plane_fb - Cleans up an fb after plane use
   15846                 :            :  * @plane: drm plane to clean up for
   15847                 :            :  * @_old_plane_state: the state from the previous modeset
   15848                 :            :  *
   15849                 :            :  * Cleans up a framebuffer that has just been removed from a plane.
   15850                 :            :  */
   15851                 :            : void
   15852                 :          0 : intel_cleanup_plane_fb(struct drm_plane *plane,
   15853                 :            :                        struct drm_plane_state *_old_plane_state)
   15854                 :            : {
   15855                 :          0 :         struct intel_plane_state *old_plane_state =
   15856                 :          0 :                 to_intel_plane_state(_old_plane_state);
   15857                 :          0 :         struct intel_atomic_state *intel_state =
   15858                 :          0 :                 to_intel_atomic_state(old_plane_state->uapi.state);
   15859         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(plane->dev);
   15860                 :            : 
   15861         [ #  # ]:          0 :         if (intel_state->rps_interactive) {
   15862                 :          0 :                 intel_rps_mark_interactive(&dev_priv->gt.rps, false);
   15863                 :          0 :                 intel_state->rps_interactive = false;
   15864                 :            :         }
   15865                 :            : 
   15866                 :            :         /* Should only be called after a successful intel_prepare_plane_fb()! */
   15867         [ #  # ]:          0 :         intel_plane_unpin_fb(old_plane_state);
   15868                 :          0 : }
   15869                 :            : 
   15870                 :            : /**
   15871                 :            :  * intel_plane_destroy - destroy a plane
   15872                 :            :  * @plane: plane to destroy
   15873                 :            :  *
   15874                 :            :  * Common destruction function for all types of planes (primary, cursor,
   15875                 :            :  * sprite).
   15876                 :            :  */
   15877                 :          0 : void intel_plane_destroy(struct drm_plane *plane)
   15878                 :            : {
   15879                 :          0 :         drm_plane_cleanup(plane);
   15880                 :          0 :         kfree(to_intel_plane(plane));
   15881                 :          0 : }
   15882                 :            : 
   15883                 :          0 : static bool i8xx_plane_format_mod_supported(struct drm_plane *_plane,
   15884                 :            :                                             u32 format, u64 modifier)
   15885                 :            : {
   15886         [ #  # ]:          0 :         switch (modifier) {
   15887                 :            :         case DRM_FORMAT_MOD_LINEAR:
   15888                 :            :         case I915_FORMAT_MOD_X_TILED:
   15889                 :          0 :                 break;
   15890                 :            :         default:
   15891                 :            :                 return false;
   15892                 :            :         }
   15893                 :            : 
   15894         [ #  # ]:          0 :         switch (format) {
   15895                 :          0 :         case DRM_FORMAT_C8:
   15896                 :            :         case DRM_FORMAT_RGB565:
   15897                 :            :         case DRM_FORMAT_XRGB1555:
   15898                 :            :         case DRM_FORMAT_XRGB8888:
   15899                 :          0 :                 return modifier == DRM_FORMAT_MOD_LINEAR ||
   15900                 :          0 :                         modifier == I915_FORMAT_MOD_X_TILED;
   15901                 :            :         default:
   15902                 :            :                 return false;
   15903                 :            :         }
   15904                 :            : }
   15905                 :            : 
   15906                 :          0 : static bool i965_plane_format_mod_supported(struct drm_plane *_plane,
   15907                 :            :                                             u32 format, u64 modifier)
   15908                 :            : {
   15909         [ #  # ]:          0 :         switch (modifier) {
   15910                 :            :         case DRM_FORMAT_MOD_LINEAR:
   15911                 :            :         case I915_FORMAT_MOD_X_TILED:
   15912                 :          0 :                 break;
   15913                 :            :         default:
   15914                 :            :                 return false;
   15915                 :            :         }
   15916                 :            : 
   15917         [ #  # ]:          0 :         switch (format) {
   15918                 :          0 :         case DRM_FORMAT_C8:
   15919                 :            :         case DRM_FORMAT_RGB565:
   15920                 :            :         case DRM_FORMAT_XRGB8888:
   15921                 :            :         case DRM_FORMAT_XBGR8888:
   15922                 :            :         case DRM_FORMAT_ARGB8888:
   15923                 :            :         case DRM_FORMAT_ABGR8888:
   15924                 :            :         case DRM_FORMAT_XRGB2101010:
   15925                 :            :         case DRM_FORMAT_XBGR2101010:
   15926                 :            :         case DRM_FORMAT_ARGB2101010:
   15927                 :            :         case DRM_FORMAT_ABGR2101010:
   15928                 :            :         case DRM_FORMAT_XBGR16161616F:
   15929                 :          0 :                 return modifier == DRM_FORMAT_MOD_LINEAR ||
   15930                 :          0 :                         modifier == I915_FORMAT_MOD_X_TILED;
   15931                 :            :         default:
   15932                 :            :                 return false;
   15933                 :            :         }
   15934                 :            : }
   15935                 :            : 
   15936                 :          0 : static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
   15937                 :            :                                               u32 format, u64 modifier)
   15938                 :            : {
   15939                 :          0 :         return modifier == DRM_FORMAT_MOD_LINEAR &&
   15940                 :          0 :                 format == DRM_FORMAT_ARGB8888;
   15941                 :            : }
   15942                 :            : 
   15943                 :            : static const struct drm_plane_funcs i965_plane_funcs = {
   15944                 :            :         .update_plane = drm_atomic_helper_update_plane,
   15945                 :            :         .disable_plane = drm_atomic_helper_disable_plane,
   15946                 :            :         .destroy = intel_plane_destroy,
   15947                 :            :         .atomic_duplicate_state = intel_plane_duplicate_state,
   15948                 :            :         .atomic_destroy_state = intel_plane_destroy_state,
   15949                 :            :         .format_mod_supported = i965_plane_format_mod_supported,
   15950                 :            : };
   15951                 :            : 
   15952                 :            : static const struct drm_plane_funcs i8xx_plane_funcs = {
   15953                 :            :         .update_plane = drm_atomic_helper_update_plane,
   15954                 :            :         .disable_plane = drm_atomic_helper_disable_plane,
   15955                 :            :         .destroy = intel_plane_destroy,
   15956                 :            :         .atomic_duplicate_state = intel_plane_duplicate_state,
   15957                 :            :         .atomic_destroy_state = intel_plane_destroy_state,
   15958                 :            :         .format_mod_supported = i8xx_plane_format_mod_supported,
   15959                 :            : };
   15960                 :            : 
   15961                 :            : static int
   15962                 :          0 : intel_legacy_cursor_update(struct drm_plane *_plane,
   15963                 :            :                            struct drm_crtc *_crtc,
   15964                 :            :                            struct drm_framebuffer *fb,
   15965                 :            :                            int crtc_x, int crtc_y,
   15966                 :            :                            unsigned int crtc_w, unsigned int crtc_h,
   15967                 :            :                            u32 src_x, u32 src_y,
   15968                 :            :                            u32 src_w, u32 src_h,
   15969                 :            :                            struct drm_modeset_acquire_ctx *ctx)
   15970                 :            : {
   15971                 :          0 :         struct intel_plane *plane = to_intel_plane(_plane);
   15972                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(_crtc);
   15973                 :          0 :         struct intel_plane_state *old_plane_state =
   15974                 :          0 :                 to_intel_plane_state(plane->base.state);
   15975                 :          0 :         struct intel_plane_state *new_plane_state;
   15976                 :          0 :         struct intel_crtc_state *crtc_state =
   15977                 :          0 :                 to_intel_crtc_state(crtc->base.state);
   15978                 :          0 :         struct intel_crtc_state *new_crtc_state;
   15979                 :          0 :         int ret;
   15980                 :            : 
   15981                 :            :         /*
   15982                 :            :          * When crtc is inactive or there is a modeset pending,
   15983                 :            :          * wait for it to complete in the slowpath
   15984                 :            :          */
   15985   [ #  #  #  # ]:          0 :         if (!crtc_state->hw.active || needs_modeset(crtc_state) ||
   15986         [ #  # ]:          0 :             crtc_state->update_pipe)
   15987                 :          0 :                 goto slow;
   15988                 :            : 
   15989                 :            :         /*
   15990                 :            :          * Don't do an async update if there is an outstanding commit modifying
   15991                 :            :          * the plane.  This prevents our async update's changes from getting
   15992                 :            :          * overridden by a previous synchronous update's state.
   15993                 :            :          */
   15994   [ #  #  #  # ]:          0 :         if (old_plane_state->uapi.commit &&
   15995                 :          0 :             !try_wait_for_completion(&old_plane_state->uapi.commit->hw_done))
   15996                 :          0 :                 goto slow;
   15997                 :            : 
   15998                 :            :         /*
   15999                 :            :          * If any parameters change that may affect watermarks,
   16000                 :            :          * take the slowpath. Only changing fb or position should be
   16001                 :            :          * in the fastpath.
   16002                 :            :          */
   16003         [ #  # ]:          0 :         if (old_plane_state->uapi.crtc != &crtc->base ||
   16004         [ #  # ]:          0 :             old_plane_state->uapi.src_w != src_w ||
   16005         [ #  # ]:          0 :             old_plane_state->uapi.src_h != src_h ||
   16006         [ #  # ]:          0 :             old_plane_state->uapi.crtc_w != crtc_w ||
   16007         [ #  # ]:          0 :             old_plane_state->uapi.crtc_h != crtc_h ||
   16008         [ #  # ]:          0 :             !old_plane_state->uapi.fb != !fb)
   16009                 :          0 :                 goto slow;
   16010                 :            : 
   16011                 :          0 :         new_plane_state = to_intel_plane_state(intel_plane_duplicate_state(&plane->base));
   16012         [ #  # ]:          0 :         if (!new_plane_state)
   16013                 :            :                 return -ENOMEM;
   16014                 :            : 
   16015                 :          0 :         new_crtc_state = to_intel_crtc_state(intel_crtc_duplicate_state(&crtc->base));
   16016         [ #  # ]:          0 :         if (!new_crtc_state) {
   16017                 :          0 :                 ret = -ENOMEM;
   16018                 :          0 :                 goto out_free;
   16019                 :            :         }
   16020                 :            : 
   16021                 :          0 :         drm_atomic_set_fb_for_plane(&new_plane_state->uapi, fb);
   16022                 :            : 
   16023                 :          0 :         new_plane_state->uapi.src_x = src_x;
   16024                 :          0 :         new_plane_state->uapi.src_y = src_y;
   16025                 :          0 :         new_plane_state->uapi.src_w = src_w;
   16026                 :          0 :         new_plane_state->uapi.src_h = src_h;
   16027                 :          0 :         new_plane_state->uapi.crtc_x = crtc_x;
   16028                 :          0 :         new_plane_state->uapi.crtc_y = crtc_y;
   16029                 :          0 :         new_plane_state->uapi.crtc_w = crtc_w;
   16030                 :          0 :         new_plane_state->uapi.crtc_h = crtc_h;
   16031                 :            : 
   16032                 :          0 :         ret = intel_plane_atomic_check_with_state(crtc_state, new_crtc_state,
   16033                 :            :                                                   old_plane_state, new_plane_state);
   16034         [ #  # ]:          0 :         if (ret)
   16035                 :          0 :                 goto out_free;
   16036                 :            : 
   16037                 :          0 :         ret = intel_plane_pin_fb(new_plane_state);
   16038         [ #  # ]:          0 :         if (ret)
   16039                 :          0 :                 goto out_free;
   16040                 :            : 
   16041         [ #  # ]:          0 :         intel_frontbuffer_flush(to_intel_frontbuffer(new_plane_state->hw.fb),
   16042                 :            :                                 ORIGIN_FLIP);
   16043   [ #  #  #  # ]:          0 :         intel_frontbuffer_track(to_intel_frontbuffer(old_plane_state->hw.fb),
   16044                 :            :                                 to_intel_frontbuffer(new_plane_state->hw.fb),
   16045                 :            :                                 plane->frontbuffer_bit);
   16046                 :            : 
   16047                 :            :         /* Swap plane state */
   16048                 :          0 :         plane->base.state = &new_plane_state->uapi;
   16049                 :            : 
   16050                 :            :         /*
   16051                 :            :          * We cannot swap crtc_state as it may be in use by an atomic commit or
   16052                 :            :          * page flip that's running simultaneously. If we swap crtc_state and
   16053                 :            :          * destroy the old state, we will cause a use-after-free there.
   16054                 :            :          *
   16055                 :            :          * Only update active_planes, which is needed for our internal
   16056                 :            :          * bookkeeping. Either value will do the right thing when updating
   16057                 :            :          * planes atomically. If the cursor was part of the atomic update then
   16058                 :            :          * we would have taken the slowpath.
   16059                 :            :          */
   16060                 :          0 :         crtc_state->active_planes = new_crtc_state->active_planes;
   16061                 :            : 
   16062         [ #  # ]:          0 :         if (new_plane_state->uapi.visible)
   16063                 :          0 :                 intel_update_plane(plane, crtc_state, new_plane_state);
   16064                 :            :         else
   16065                 :          0 :                 intel_disable_plane(plane, crtc_state);
   16066                 :            : 
   16067         [ #  # ]:          0 :         intel_plane_unpin_fb(old_plane_state);
   16068                 :            : 
   16069                 :          0 : out_free:
   16070         [ #  # ]:          0 :         if (new_crtc_state)
   16071                 :          0 :                 intel_crtc_destroy_state(&crtc->base, &new_crtc_state->uapi);
   16072         [ #  # ]:          0 :         if (ret)
   16073                 :          0 :                 intel_plane_destroy_state(&plane->base, &new_plane_state->uapi);
   16074                 :            :         else
   16075                 :          0 :                 intel_plane_destroy_state(&plane->base, &old_plane_state->uapi);
   16076                 :            :         return ret;
   16077                 :            : 
   16078                 :          0 : slow:
   16079                 :          0 :         return drm_atomic_helper_update_plane(&plane->base, &crtc->base, fb,
   16080                 :            :                                               crtc_x, crtc_y, crtc_w, crtc_h,
   16081                 :            :                                               src_x, src_y, src_w, src_h, ctx);
   16082                 :            : }
   16083                 :            : 
   16084                 :            : static const struct drm_plane_funcs intel_cursor_plane_funcs = {
   16085                 :            :         .update_plane = intel_legacy_cursor_update,
   16086                 :            :         .disable_plane = drm_atomic_helper_disable_plane,
   16087                 :            :         .destroy = intel_plane_destroy,
   16088                 :            :         .atomic_duplicate_state = intel_plane_duplicate_state,
   16089                 :            :         .atomic_destroy_state = intel_plane_destroy_state,
   16090                 :            :         .format_mod_supported = intel_cursor_format_mod_supported,
   16091                 :            : };
   16092                 :            : 
   16093                 :          0 : static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
   16094                 :            :                                enum i9xx_plane_id i9xx_plane)
   16095                 :            : {
   16096         [ #  # ]:          0 :         if (!HAS_FBC(dev_priv))
   16097                 :            :                 return false;
   16098                 :            : 
   16099   [ #  #  #  # ]:          0 :         if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
   16100                 :          0 :                 return i9xx_plane == PLANE_A; /* tied to pipe A */
   16101         [ #  # ]:          0 :         else if (IS_IVYBRIDGE(dev_priv))
   16102                 :          0 :                 return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B ||
   16103                 :            :                         i9xx_plane == PLANE_C;
   16104         [ #  # ]:          0 :         else if (INTEL_GEN(dev_priv) >= 4)
   16105                 :          0 :                 return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B;
   16106                 :            :         else
   16107                 :          0 :                 return i9xx_plane == PLANE_A;
   16108                 :            : }
   16109                 :            : 
   16110                 :            : static struct intel_plane *
   16111                 :          0 : intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
   16112                 :            : {
   16113                 :          0 :         struct intel_plane *plane;
   16114                 :          0 :         const struct drm_plane_funcs *plane_funcs;
   16115                 :          0 :         unsigned int supported_rotations;
   16116                 :          0 :         unsigned int possible_crtcs;
   16117                 :          0 :         const u32 *formats;
   16118                 :          0 :         int num_formats;
   16119                 :          0 :         int ret, zpos;
   16120                 :            : 
   16121         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   16122                 :          0 :                 return skl_universal_plane_create(dev_priv, pipe,
   16123                 :            :                                                   PLANE_PRIMARY);
   16124                 :            : 
   16125                 :          0 :         plane = intel_plane_alloc();
   16126         [ #  # ]:          0 :         if (IS_ERR(plane))
   16127                 :            :                 return plane;
   16128                 :            : 
   16129                 :          0 :         plane->pipe = pipe;
   16130                 :            :         /*
   16131                 :            :          * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS
   16132                 :            :          * port is hooked to pipe B. Hence we want plane A feeding pipe B.
   16133                 :            :          */
   16134   [ #  #  #  # ]:          0 :         if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) < 4)
   16135                 :          0 :                 plane->i9xx_plane = (enum i9xx_plane_id) !pipe;
   16136                 :            :         else
   16137                 :          0 :                 plane->i9xx_plane = (enum i9xx_plane_id) pipe;
   16138                 :          0 :         plane->id = PLANE_PRIMARY;
   16139                 :          0 :         plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
   16140                 :            : 
   16141                 :          0 :         plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
   16142         [ #  # ]:          0 :         if (plane->has_fbc) {
   16143                 :          0 :                 struct intel_fbc *fbc = &dev_priv->fbc;
   16144                 :            : 
   16145                 :          0 :                 fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
   16146                 :            :         }
   16147                 :            : 
   16148   [ #  #  #  # ]:          0 :         if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   16149                 :            :                 formats = vlv_primary_formats;
   16150                 :            :                 num_formats = ARRAY_SIZE(vlv_primary_formats);
   16151         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 4) {
   16152                 :            :                 /*
   16153                 :            :                  * WaFP16GammaEnabling:ivb
   16154                 :            :                  * "Workaround : When using the 64-bit format, the plane
   16155                 :            :                  *  output on each color channel has one quarter amplitude.
   16156                 :            :                  *  It can be brought up to full amplitude by using pipe
   16157                 :            :                  *  gamma correction or pipe color space conversion to
   16158                 :            :                  *  multiply the plane output by four."
   16159                 :            :                  *
   16160                 :            :                  * There is no dedicated plane gamma for the primary plane,
   16161                 :            :                  * and using the pipe gamma/csc could conflict with other
   16162                 :            :                  * planes, so we choose not to expose fp16 on IVB primary
   16163                 :            :                  * planes. HSW primary planes no longer have this problem.
   16164                 :            :                  */
   16165         [ #  # ]:          0 :                 if (IS_IVYBRIDGE(dev_priv)) {
   16166                 :            :                         formats = ivb_primary_formats;
   16167                 :            :                         num_formats = ARRAY_SIZE(ivb_primary_formats);
   16168                 :            :                 } else {
   16169                 :          0 :                         formats = i965_primary_formats;
   16170                 :          0 :                         num_formats = ARRAY_SIZE(i965_primary_formats);
   16171                 :            :                 }
   16172                 :            :         } else {
   16173                 :            :                 formats = i8xx_primary_formats;
   16174                 :            :                 num_formats = ARRAY_SIZE(i8xx_primary_formats);
   16175                 :            :         }
   16176                 :            : 
   16177         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
   16178                 :            :                 plane_funcs = &i965_plane_funcs;
   16179                 :            :         else
   16180                 :          0 :                 plane_funcs = &i8xx_plane_funcs;
   16181                 :            : 
   16182   [ #  #  #  # ]:          0 :         if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16183                 :          0 :                 plane->min_cdclk = vlv_plane_min_cdclk;
   16184   [ #  #  #  # ]:          0 :         else if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
   16185                 :          0 :                 plane->min_cdclk = hsw_plane_min_cdclk;
   16186         [ #  # ]:          0 :         else if (IS_IVYBRIDGE(dev_priv))
   16187                 :          0 :                 plane->min_cdclk = ivb_plane_min_cdclk;
   16188                 :            :         else
   16189                 :          0 :                 plane->min_cdclk = i9xx_plane_min_cdclk;
   16190                 :            : 
   16191                 :          0 :         plane->max_stride = i9xx_plane_max_stride;
   16192                 :          0 :         plane->update_plane = i9xx_update_plane;
   16193                 :          0 :         plane->disable_plane = i9xx_disable_plane;
   16194                 :          0 :         plane->get_hw_state = i9xx_plane_get_hw_state;
   16195                 :          0 :         plane->check_plane = i9xx_plane_check;
   16196                 :            : 
   16197                 :          0 :         possible_crtcs = BIT(pipe);
   16198                 :            : 
   16199   [ #  #  #  #  :          0 :         if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
                   #  # ]
   16200                 :          0 :                 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
   16201                 :            :                                                possible_crtcs, plane_funcs,
   16202                 :            :                                                formats, num_formats,
   16203                 :            :                                                i9xx_format_modifiers,
   16204                 :            :                                                DRM_PLANE_TYPE_PRIMARY,
   16205                 :            :                                                "primary %c", pipe_name(pipe));
   16206                 :            :         else
   16207                 :          0 :                 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
   16208                 :            :                                                possible_crtcs, plane_funcs,
   16209                 :            :                                                formats, num_formats,
   16210                 :            :                                                i9xx_format_modifiers,
   16211                 :            :                                                DRM_PLANE_TYPE_PRIMARY,
   16212                 :            :                                                "plane %c",
   16213                 :          0 :                                                plane_name(plane->i9xx_plane));
   16214         [ #  # ]:          0 :         if (ret)
   16215                 :          0 :                 goto fail;
   16216                 :            : 
   16217   [ #  #  #  # ]:          0 :         if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
   16218                 :            :                 supported_rotations =
   16219                 :            :                         DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
   16220                 :            :                         DRM_MODE_REFLECT_X;
   16221         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 4) {
   16222                 :            :                 supported_rotations =
   16223                 :            :                         DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180;
   16224                 :            :         } else {
   16225                 :          0 :                 supported_rotations = DRM_MODE_ROTATE_0;
   16226                 :            :         }
   16227                 :            : 
   16228         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
   16229                 :          0 :                 drm_plane_create_rotation_property(&plane->base,
   16230                 :            :                                                    DRM_MODE_ROTATE_0,
   16231                 :            :                                                    supported_rotations);
   16232                 :            : 
   16233                 :          0 :         zpos = 0;
   16234                 :          0 :         drm_plane_create_zpos_immutable_property(&plane->base, zpos);
   16235                 :            : 
   16236                 :          0 :         drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
   16237                 :            : 
   16238                 :          0 :         return plane;
   16239                 :            : 
   16240                 :            : fail:
   16241                 :          0 :         intel_plane_free(plane);
   16242                 :            : 
   16243                 :          0 :         return ERR_PTR(ret);
   16244                 :            : }
   16245                 :            : 
   16246                 :            : static struct intel_plane *
   16247                 :          0 : intel_cursor_plane_create(struct drm_i915_private *dev_priv,
   16248                 :            :                           enum pipe pipe)
   16249                 :            : {
   16250                 :          0 :         unsigned int possible_crtcs;
   16251                 :          0 :         struct intel_plane *cursor;
   16252                 :          0 :         int ret, zpos;
   16253                 :            : 
   16254                 :          0 :         cursor = intel_plane_alloc();
   16255         [ #  # ]:          0 :         if (IS_ERR(cursor))
   16256                 :            :                 return cursor;
   16257                 :            : 
   16258                 :          0 :         cursor->pipe = pipe;
   16259                 :          0 :         cursor->i9xx_plane = (enum i9xx_plane_id) pipe;
   16260                 :          0 :         cursor->id = PLANE_CURSOR;
   16261                 :          0 :         cursor->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, cursor->id);
   16262                 :            : 
   16263   [ #  #  #  # ]:          0 :         if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) {
   16264                 :          0 :                 cursor->max_stride = i845_cursor_max_stride;
   16265                 :          0 :                 cursor->update_plane = i845_update_cursor;
   16266                 :          0 :                 cursor->disable_plane = i845_disable_cursor;
   16267                 :          0 :                 cursor->get_hw_state = i845_cursor_get_hw_state;
   16268                 :          0 :                 cursor->check_plane = i845_check_cursor;
   16269                 :            :         } else {
   16270                 :          0 :                 cursor->max_stride = i9xx_cursor_max_stride;
   16271                 :          0 :                 cursor->update_plane = i9xx_update_cursor;
   16272                 :          0 :                 cursor->disable_plane = i9xx_disable_cursor;
   16273                 :          0 :                 cursor->get_hw_state = i9xx_cursor_get_hw_state;
   16274                 :          0 :                 cursor->check_plane = i9xx_check_cursor;
   16275                 :            :         }
   16276                 :            : 
   16277                 :          0 :         cursor->cursor.base = ~0;
   16278                 :          0 :         cursor->cursor.cntl = ~0;
   16279                 :            : 
   16280   [ #  #  #  #  :          0 :         if (IS_I845G(dev_priv) || IS_I865G(dev_priv) || HAS_CUR_FBC(dev_priv))
             #  #  #  # ]
   16281                 :          0 :                 cursor->cursor.size = ~0;
   16282                 :            : 
   16283                 :          0 :         possible_crtcs = BIT(pipe);
   16284                 :            : 
   16285                 :          0 :         ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base,
   16286                 :            :                                        possible_crtcs, &intel_cursor_plane_funcs,
   16287                 :            :                                        intel_cursor_formats,
   16288                 :            :                                        ARRAY_SIZE(intel_cursor_formats),
   16289                 :            :                                        cursor_format_modifiers,
   16290                 :            :                                        DRM_PLANE_TYPE_CURSOR,
   16291                 :            :                                        "cursor %c", pipe_name(pipe));
   16292         [ #  # ]:          0 :         if (ret)
   16293                 :          0 :                 goto fail;
   16294                 :            : 
   16295         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
   16296                 :          0 :                 drm_plane_create_rotation_property(&cursor->base,
   16297                 :            :                                                    DRM_MODE_ROTATE_0,
   16298                 :            :                                                    DRM_MODE_ROTATE_0 |
   16299                 :            :                                                    DRM_MODE_ROTATE_180);
   16300                 :            : 
   16301                 :          0 :         zpos = RUNTIME_INFO(dev_priv)->num_sprites[pipe] + 1;
   16302                 :          0 :         drm_plane_create_zpos_immutable_property(&cursor->base, zpos);
   16303                 :            : 
   16304                 :          0 :         drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs);
   16305                 :            : 
   16306                 :          0 :         return cursor;
   16307                 :            : 
   16308                 :            : fail:
   16309                 :          0 :         intel_plane_free(cursor);
   16310                 :            : 
   16311                 :          0 :         return ERR_PTR(ret);
   16312                 :            : }
   16313                 :            : 
   16314                 :            : #define INTEL_CRTC_FUNCS \
   16315                 :            :         .gamma_set = drm_atomic_helper_legacy_gamma_set, \
   16316                 :            :         .set_config = drm_atomic_helper_set_config, \
   16317                 :            :         .destroy = intel_crtc_destroy, \
   16318                 :            :         .page_flip = drm_atomic_helper_page_flip, \
   16319                 :            :         .atomic_duplicate_state = intel_crtc_duplicate_state, \
   16320                 :            :         .atomic_destroy_state = intel_crtc_destroy_state, \
   16321                 :            :         .set_crc_source = intel_crtc_set_crc_source, \
   16322                 :            :         .verify_crc_source = intel_crtc_verify_crc_source, \
   16323                 :            :         .get_crc_sources = intel_crtc_get_crc_sources
   16324                 :            : 
   16325                 :            : static const struct drm_crtc_funcs bdw_crtc_funcs = {
   16326                 :            :         INTEL_CRTC_FUNCS,
   16327                 :            : 
   16328                 :            :         .get_vblank_counter = g4x_get_vblank_counter,
   16329                 :            :         .enable_vblank = bdw_enable_vblank,
   16330                 :            :         .disable_vblank = bdw_disable_vblank,
   16331                 :            : };
   16332                 :            : 
   16333                 :            : static const struct drm_crtc_funcs ilk_crtc_funcs = {
   16334                 :            :         INTEL_CRTC_FUNCS,
   16335                 :            : 
   16336                 :            :         .get_vblank_counter = g4x_get_vblank_counter,
   16337                 :            :         .enable_vblank = ilk_enable_vblank,
   16338                 :            :         .disable_vblank = ilk_disable_vblank,
   16339                 :            : };
   16340                 :            : 
   16341                 :            : static const struct drm_crtc_funcs g4x_crtc_funcs = {
   16342                 :            :         INTEL_CRTC_FUNCS,
   16343                 :            : 
   16344                 :            :         .get_vblank_counter = g4x_get_vblank_counter,
   16345                 :            :         .enable_vblank = i965_enable_vblank,
   16346                 :            :         .disable_vblank = i965_disable_vblank,
   16347                 :            : };
   16348                 :            : 
   16349                 :            : static const struct drm_crtc_funcs i965_crtc_funcs = {
   16350                 :            :         INTEL_CRTC_FUNCS,
   16351                 :            : 
   16352                 :            :         .get_vblank_counter = i915_get_vblank_counter,
   16353                 :            :         .enable_vblank = i965_enable_vblank,
   16354                 :            :         .disable_vblank = i965_disable_vblank,
   16355                 :            : };
   16356                 :            : 
   16357                 :            : static const struct drm_crtc_funcs i915gm_crtc_funcs = {
   16358                 :            :         INTEL_CRTC_FUNCS,
   16359                 :            : 
   16360                 :            :         .get_vblank_counter = i915_get_vblank_counter,
   16361                 :            :         .enable_vblank = i915gm_enable_vblank,
   16362                 :            :         .disable_vblank = i915gm_disable_vblank,
   16363                 :            : };
   16364                 :            : 
   16365                 :            : static const struct drm_crtc_funcs i915_crtc_funcs = {
   16366                 :            :         INTEL_CRTC_FUNCS,
   16367                 :            : 
   16368                 :            :         .get_vblank_counter = i915_get_vblank_counter,
   16369                 :            :         .enable_vblank = i8xx_enable_vblank,
   16370                 :            :         .disable_vblank = i8xx_disable_vblank,
   16371                 :            : };
   16372                 :            : 
   16373                 :            : static const struct drm_crtc_funcs i8xx_crtc_funcs = {
   16374                 :            :         INTEL_CRTC_FUNCS,
   16375                 :            : 
   16376                 :            :         /* no hw vblank counter */
   16377                 :            :         .enable_vblank = i8xx_enable_vblank,
   16378                 :            :         .disable_vblank = i8xx_disable_vblank,
   16379                 :            : };
   16380                 :            : 
   16381                 :          0 : static struct intel_crtc *intel_crtc_alloc(void)
   16382                 :            : {
   16383                 :          0 :         struct intel_crtc_state *crtc_state;
   16384                 :          0 :         struct intel_crtc *crtc;
   16385                 :            : 
   16386                 :          0 :         crtc = kzalloc(sizeof(*crtc), GFP_KERNEL);
   16387         [ #  # ]:          0 :         if (!crtc)
   16388                 :            :                 return ERR_PTR(-ENOMEM);
   16389                 :            : 
   16390                 :          0 :         crtc_state = intel_crtc_state_alloc(crtc);
   16391         [ #  # ]:          0 :         if (!crtc_state) {
   16392                 :          0 :                 kfree(crtc);
   16393                 :          0 :                 return ERR_PTR(-ENOMEM);
   16394                 :            :         }
   16395                 :            : 
   16396                 :          0 :         crtc->base.state = &crtc_state->uapi;
   16397                 :          0 :         crtc->config = crtc_state;
   16398                 :            : 
   16399                 :          0 :         return crtc;
   16400                 :            : }
   16401                 :            : 
   16402                 :          0 : static void intel_crtc_free(struct intel_crtc *crtc)
   16403                 :            : {
   16404                 :          0 :         intel_crtc_destroy_state(&crtc->base, crtc->base.state);
   16405                 :          0 :         kfree(crtc);
   16406                 :            : }
   16407                 :            : 
   16408                 :          0 : static int intel_crtc_init(struct drm_i915_private *dev_priv, enum pipe pipe)
   16409                 :            : {
   16410                 :          0 :         struct intel_plane *primary, *cursor;
   16411                 :          0 :         const struct drm_crtc_funcs *funcs;
   16412                 :          0 :         struct intel_crtc *crtc;
   16413                 :          0 :         int sprite, ret;
   16414                 :            : 
   16415                 :          0 :         crtc = intel_crtc_alloc();
   16416         [ #  # ]:          0 :         if (IS_ERR(crtc))
   16417                 :          0 :                 return PTR_ERR(crtc);
   16418                 :            : 
   16419                 :          0 :         crtc->pipe = pipe;
   16420                 :          0 :         crtc->num_scalers = RUNTIME_INFO(dev_priv)->num_scalers[pipe];
   16421                 :            : 
   16422                 :          0 :         primary = intel_primary_plane_create(dev_priv, pipe);
   16423         [ #  # ]:          0 :         if (IS_ERR(primary)) {
   16424                 :          0 :                 ret = PTR_ERR(primary);
   16425                 :          0 :                 goto fail;
   16426                 :            :         }
   16427                 :          0 :         crtc->plane_ids_mask |= BIT(primary->id);
   16428                 :            : 
   16429         [ #  # ]:          0 :         for_each_sprite(dev_priv, pipe, sprite) {
   16430                 :          0 :                 struct intel_plane *plane;
   16431                 :            : 
   16432                 :          0 :                 plane = intel_sprite_plane_create(dev_priv, pipe, sprite);
   16433         [ #  # ]:          0 :                 if (IS_ERR(plane)) {
   16434                 :          0 :                         ret = PTR_ERR(plane);
   16435                 :          0 :                         goto fail;
   16436                 :            :                 }
   16437                 :          0 :                 crtc->plane_ids_mask |= BIT(plane->id);
   16438                 :            :         }
   16439                 :            : 
   16440                 :          0 :         cursor = intel_cursor_plane_create(dev_priv, pipe);
   16441         [ #  # ]:          0 :         if (IS_ERR(cursor)) {
   16442                 :          0 :                 ret = PTR_ERR(cursor);
   16443                 :          0 :                 goto fail;
   16444                 :            :         }
   16445                 :          0 :         crtc->plane_ids_mask |= BIT(cursor->id);
   16446                 :            : 
   16447         [ #  # ]:          0 :         if (HAS_GMCH(dev_priv)) {
   16448   [ #  #  #  # ]:          0 :                 if (IS_CHERRYVIEW(dev_priv) ||
   16449   [ #  #  #  # ]:          0 :                     IS_VALLEYVIEW(dev_priv) || IS_G4X(dev_priv))
   16450                 :            :                         funcs = &g4x_crtc_funcs;
   16451         [ #  # ]:          0 :                 else if (IS_GEN(dev_priv, 4))
   16452                 :            :                         funcs = &i965_crtc_funcs;
   16453   [ #  #  #  # ]:          0 :                 else if (IS_I945GM(dev_priv) || IS_I915GM(dev_priv))
   16454                 :            :                         funcs = &i915gm_crtc_funcs;
   16455         [ #  # ]:          0 :                 else if (IS_GEN(dev_priv, 3))
   16456                 :            :                         funcs = &i915_crtc_funcs;
   16457                 :            :                 else
   16458                 :          0 :                         funcs = &i8xx_crtc_funcs;
   16459                 :            :         } else {
   16460         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 8)
   16461                 :            :                         funcs = &bdw_crtc_funcs;
   16462                 :            :                 else
   16463                 :          0 :                         funcs = &ilk_crtc_funcs;
   16464                 :            :         }
   16465                 :            : 
   16466                 :          0 :         ret = drm_crtc_init_with_planes(&dev_priv->drm, &crtc->base,
   16467                 :            :                                         &primary->base, &cursor->base,
   16468                 :            :                                         funcs, "pipe %c", pipe_name(pipe));
   16469         [ #  # ]:          0 :         if (ret)
   16470                 :          0 :                 goto fail;
   16471                 :            : 
   16472   [ #  #  #  # ]:          0 :         BUG_ON(pipe >= ARRAY_SIZE(dev_priv->pipe_to_crtc_mapping) ||
   16473                 :            :                dev_priv->pipe_to_crtc_mapping[pipe] != NULL);
   16474                 :          0 :         dev_priv->pipe_to_crtc_mapping[pipe] = crtc;
   16475                 :            : 
   16476         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9) {
   16477                 :          0 :                 enum i9xx_plane_id i9xx_plane = primary->i9xx_plane;
   16478                 :            : 
   16479   [ #  #  #  # ]:          0 :                 BUG_ON(i9xx_plane >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
   16480                 :            :                        dev_priv->plane_to_crtc_mapping[i9xx_plane] != NULL);
   16481                 :          0 :                 dev_priv->plane_to_crtc_mapping[i9xx_plane] = crtc;
   16482                 :            :         }
   16483                 :            : 
   16484                 :          0 :         intel_color_init(crtc);
   16485                 :            : 
   16486         [ #  # ]:          0 :         WARN_ON(drm_crtc_index(&crtc->base) != crtc->pipe);
   16487                 :            : 
   16488                 :            :         return 0;
   16489                 :            : 
   16490                 :          0 : fail:
   16491                 :          0 :         intel_crtc_free(crtc);
   16492                 :            : 
   16493                 :          0 :         return ret;
   16494                 :            : }
   16495                 :            : 
   16496                 :          0 : int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
   16497                 :            :                                       struct drm_file *file)
   16498                 :            : {
   16499                 :          0 :         struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
   16500                 :          0 :         struct drm_crtc *drmmode_crtc;
   16501                 :          0 :         struct intel_crtc *crtc;
   16502                 :            : 
   16503                 :          0 :         drmmode_crtc = drm_crtc_find(dev, file, pipe_from_crtc_id->crtc_id);
   16504         [ #  # ]:          0 :         if (!drmmode_crtc)
   16505                 :            :                 return -ENOENT;
   16506                 :            : 
   16507                 :          0 :         crtc = to_intel_crtc(drmmode_crtc);
   16508                 :          0 :         pipe_from_crtc_id->pipe = crtc->pipe;
   16509                 :            : 
   16510                 :          0 :         return 0;
   16511                 :            : }
   16512                 :            : 
   16513                 :          0 : static u32 intel_encoder_possible_clones(struct intel_encoder *encoder)
   16514                 :            : {
   16515                 :          0 :         struct drm_device *dev = encoder->base.dev;
   16516                 :          0 :         struct intel_encoder *source_encoder;
   16517                 :          0 :         u32 possible_clones = 0;
   16518                 :            : 
   16519         [ #  # ]:          0 :         for_each_intel_encoder(dev, source_encoder) {
   16520   [ #  #  #  # ]:          0 :                 if (encoders_cloneable(encoder, source_encoder))
   16521                 :          0 :                         possible_clones |= drm_encoder_mask(&source_encoder->base);
   16522                 :            :         }
   16523                 :            : 
   16524                 :          0 :         return possible_clones;
   16525                 :            : }
   16526                 :            : 
   16527                 :          0 : static u32 intel_encoder_possible_crtcs(struct intel_encoder *encoder)
   16528                 :            : {
   16529                 :          0 :         struct drm_device *dev = encoder->base.dev;
   16530                 :          0 :         struct intel_crtc *crtc;
   16531                 :          0 :         u32 possible_crtcs = 0;
   16532                 :            : 
   16533         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   16534         [ #  # ]:          0 :                 if (encoder->pipe_mask & BIT(crtc->pipe))
   16535                 :          0 :                         possible_crtcs |= drm_crtc_mask(&crtc->base);
   16536                 :            :         }
   16537                 :            : 
   16538                 :          0 :         return possible_crtcs;
   16539                 :            : }
   16540                 :            : 
   16541                 :          0 : static bool ilk_has_edp_a(struct drm_i915_private *dev_priv)
   16542                 :            : {
   16543         [ #  # ]:          0 :         if (!IS_MOBILE(dev_priv))
   16544                 :            :                 return false;
   16545                 :            : 
   16546         [ #  # ]:          0 :         if ((I915_READ(DP_A) & DP_DETECTED) == 0)
   16547                 :            :                 return false;
   16548                 :            : 
   16549   [ #  #  #  # ]:          0 :         if (IS_GEN(dev_priv, 5) && (I915_READ(FUSE_STRAP) & ILK_eDP_A_DISABLE))
   16550                 :          0 :                 return false;
   16551                 :            : 
   16552                 :            :         return true;
   16553                 :            : }
   16554                 :            : 
   16555                 :          0 : static bool intel_ddi_crt_present(struct drm_i915_private *dev_priv)
   16556                 :            : {
   16557         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   16558                 :            :                 return false;
   16559                 :            : 
   16560   [ #  #  #  # ]:          0 :         if (IS_HSW_ULT(dev_priv) || IS_BDW_ULT(dev_priv))
   16561                 :            :                 return false;
   16562                 :            : 
   16563         [ #  # ]:          0 :         if (HAS_PCH_LPT_H(dev_priv) &&
   16564         [ #  # ]:          0 :             I915_READ(SFUSE_STRAP) & SFUSE_STRAP_CRT_DISABLED)
   16565                 :            :                 return false;
   16566                 :            : 
   16567                 :            :         /* DDI E can't be used if DDI A requires 4 lanes */
   16568         [ #  # ]:          0 :         if (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES)
   16569                 :            :                 return false;
   16570                 :            : 
   16571         [ #  # ]:          0 :         if (!dev_priv->vbt.int_crt_support)
   16572                 :          0 :                 return false;
   16573                 :            : 
   16574                 :            :         return true;
   16575                 :            : }
   16576                 :            : 
   16577                 :          0 : void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv)
   16578                 :            : {
   16579                 :          0 :         int pps_num;
   16580                 :          0 :         int pps_idx;
   16581                 :            : 
   16582         [ #  # ]:          0 :         if (HAS_DDI(dev_priv))
   16583                 :            :                 return;
   16584                 :            :         /*
   16585                 :            :          * This w/a is needed at least on CPT/PPT, but to be sure apply it
   16586                 :            :          * everywhere where registers can be write protected.
   16587                 :            :          */
   16588   [ #  #  #  # ]:          0 :         if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16589                 :            :                 pps_num = 2;
   16590                 :            :         else
   16591                 :            :                 pps_num = 1;
   16592                 :            : 
   16593         [ #  # ]:          0 :         for (pps_idx = 0; pps_idx < pps_num; pps_idx++) {
   16594                 :          0 :                 u32 val = I915_READ(PP_CONTROL(pps_idx));
   16595                 :            : 
   16596                 :          0 :                 val = (val & ~PANEL_UNLOCK_MASK) | PANEL_UNLOCK_REGS;
   16597                 :          0 :                 I915_WRITE(PP_CONTROL(pps_idx), val);
   16598                 :            :         }
   16599                 :            : }
   16600                 :            : 
   16601                 :          0 : static void intel_pps_init(struct drm_i915_private *dev_priv)
   16602                 :            : {
   16603   [ #  #  #  #  :          0 :         if (HAS_PCH_SPLIT(dev_priv) || IS_GEN9_LP(dev_priv))
                   #  # ]
   16604                 :          0 :                 dev_priv->pps_mmio_base = PCH_PPS_BASE;
   16605   [ #  #  #  # ]:          0 :         else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16606                 :          0 :                 dev_priv->pps_mmio_base = VLV_PPS_BASE;
   16607                 :            :         else
   16608                 :          0 :                 dev_priv->pps_mmio_base = PPS_BASE;
   16609                 :            : 
   16610                 :          0 :         intel_pps_unlock_regs_wa(dev_priv);
   16611                 :          0 : }
   16612                 :            : 
   16613                 :          0 : static void intel_setup_outputs(struct drm_i915_private *dev_priv)
   16614                 :            : {
   16615                 :          0 :         struct intel_encoder *encoder;
   16616                 :          0 :         bool dpd_is_edp = false;
   16617                 :            : 
   16618                 :          0 :         intel_pps_init(dev_priv);
   16619                 :            : 
   16620   [ #  #  #  # ]:          0 :         if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
   16621                 :          0 :                 return;
   16622                 :            : 
   16623         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 12) {
   16624                 :          0 :                 intel_ddi_init(dev_priv, PORT_A);
   16625                 :          0 :                 intel_ddi_init(dev_priv, PORT_B);
   16626                 :          0 :                 intel_ddi_init(dev_priv, PORT_D);
   16627                 :          0 :                 intel_ddi_init(dev_priv, PORT_E);
   16628                 :          0 :                 intel_ddi_init(dev_priv, PORT_F);
   16629                 :          0 :                 intel_ddi_init(dev_priv, PORT_G);
   16630                 :          0 :                 intel_ddi_init(dev_priv, PORT_H);
   16631                 :          0 :                 intel_ddi_init(dev_priv, PORT_I);
   16632                 :          0 :                 icl_dsi_init(dev_priv);
   16633         [ #  # ]:          0 :         } else if (IS_ELKHARTLAKE(dev_priv)) {
   16634                 :          0 :                 intel_ddi_init(dev_priv, PORT_A);
   16635                 :          0 :                 intel_ddi_init(dev_priv, PORT_B);
   16636                 :          0 :                 intel_ddi_init(dev_priv, PORT_C);
   16637                 :          0 :                 intel_ddi_init(dev_priv, PORT_D);
   16638                 :          0 :                 icl_dsi_init(dev_priv);
   16639         [ #  # ]:          0 :         } else if (IS_GEN(dev_priv, 11)) {
   16640                 :          0 :                 intel_ddi_init(dev_priv, PORT_A);
   16641                 :          0 :                 intel_ddi_init(dev_priv, PORT_B);
   16642                 :          0 :                 intel_ddi_init(dev_priv, PORT_C);
   16643                 :          0 :                 intel_ddi_init(dev_priv, PORT_D);
   16644                 :          0 :                 intel_ddi_init(dev_priv, PORT_E);
   16645                 :            :                 /*
   16646                 :            :                  * On some ICL SKUs port F is not present. No strap bits for
   16647                 :            :                  * this, so rely on VBT.
   16648                 :            :                  * Work around broken VBTs on SKUs known to have no port F.
   16649                 :            :                  */
   16650   [ #  #  #  # ]:          0 :                 if (IS_ICL_WITH_PORT_F(dev_priv) &&
   16651                 :          0 :                     intel_bios_is_port_present(dev_priv, PORT_F))
   16652                 :          0 :                         intel_ddi_init(dev_priv, PORT_F);
   16653                 :            : 
   16654                 :          0 :                 icl_dsi_init(dev_priv);
   16655   [ #  #  #  # ]:          0 :         } else if (IS_GEN9_LP(dev_priv)) {
   16656                 :            :                 /*
   16657                 :            :                  * FIXME: Broxton doesn't support port detection via the
   16658                 :            :                  * DDI_BUF_CTL_A or SFUSE_STRAP registers, find another way to
   16659                 :            :                  * detect the ports.
   16660                 :            :                  */
   16661                 :          0 :                 intel_ddi_init(dev_priv, PORT_A);
   16662                 :          0 :                 intel_ddi_init(dev_priv, PORT_B);
   16663                 :          0 :                 intel_ddi_init(dev_priv, PORT_C);
   16664                 :            : 
   16665                 :          0 :                 vlv_dsi_init(dev_priv);
   16666         [ #  # ]:          0 :         } else if (HAS_DDI(dev_priv)) {
   16667                 :          0 :                 int found;
   16668                 :            : 
   16669         [ #  # ]:          0 :                 if (intel_ddi_crt_present(dev_priv))
   16670                 :          0 :                         intel_crt_init(dev_priv);
   16671                 :            : 
   16672                 :            :                 /*
   16673                 :            :                  * Haswell uses DDI functions to detect digital outputs.
   16674                 :            :                  * On SKL pre-D0 the strap isn't connected, so we assume
   16675                 :            :                  * it's there.
   16676                 :            :                  */
   16677                 :          0 :                 found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED;
   16678                 :            :                 /* WaIgnoreDDIAStrap: skl */
   16679   [ #  #  #  #  :          0 :                 if (found || IS_GEN9_BC(dev_priv))
                   #  # ]
   16680                 :          0 :                         intel_ddi_init(dev_priv, PORT_A);
   16681                 :            : 
   16682                 :            :                 /* DDI B, C, D, and F detection is indicated by the SFUSE_STRAP
   16683                 :            :                  * register */
   16684                 :          0 :                 found = I915_READ(SFUSE_STRAP);
   16685                 :            : 
   16686         [ #  # ]:          0 :                 if (found & SFUSE_STRAP_DDIB_DETECTED)
   16687                 :          0 :                         intel_ddi_init(dev_priv, PORT_B);
   16688         [ #  # ]:          0 :                 if (found & SFUSE_STRAP_DDIC_DETECTED)
   16689                 :          0 :                         intel_ddi_init(dev_priv, PORT_C);
   16690         [ #  # ]:          0 :                 if (found & SFUSE_STRAP_DDID_DETECTED)
   16691                 :          0 :                         intel_ddi_init(dev_priv, PORT_D);
   16692         [ #  # ]:          0 :                 if (found & SFUSE_STRAP_DDIF_DETECTED)
   16693                 :          0 :                         intel_ddi_init(dev_priv, PORT_F);
   16694                 :            :                 /*
   16695                 :            :                  * On SKL we don't have a way to detect DDI-E so we rely on VBT.
   16696                 :            :                  */
   16697   [ #  #  #  #  :          0 :                 if (IS_GEN9_BC(dev_priv) &&
                   #  # ]
   16698                 :          0 :                     intel_bios_is_port_present(dev_priv, PORT_E))
   16699                 :          0 :                         intel_ddi_init(dev_priv, PORT_E);
   16700                 :            : 
   16701         [ #  # ]:          0 :         } else if (HAS_PCH_SPLIT(dev_priv)) {
   16702                 :          0 :                 int found;
   16703                 :            : 
   16704                 :            :                 /*
   16705                 :            :                  * intel_edp_init_connector() depends on this completing first,
   16706                 :            :                  * to prevent the registration of both eDP and LVDS and the
   16707                 :            :                  * incorrect sharing of the PPS.
   16708                 :            :                  */
   16709                 :          0 :                 intel_lvds_init(dev_priv);
   16710                 :          0 :                 intel_crt_init(dev_priv);
   16711                 :            : 
   16712                 :          0 :                 dpd_is_edp = intel_dp_is_port_edp(dev_priv, PORT_D);
   16713                 :            : 
   16714         [ #  # ]:          0 :                 if (ilk_has_edp_a(dev_priv))
   16715                 :          0 :                         intel_dp_init(dev_priv, DP_A, PORT_A);
   16716                 :            : 
   16717         [ #  # ]:          0 :                 if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
   16718                 :            :                         /* PCH SDVOB multiplex with HDMIB */
   16719                 :          0 :                         found = intel_sdvo_init(dev_priv, PCH_SDVOB, PORT_B);
   16720         [ #  # ]:          0 :                         if (!found)
   16721                 :          0 :                                 intel_hdmi_init(dev_priv, PCH_HDMIB, PORT_B);
   16722   [ #  #  #  # ]:          0 :                         if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
   16723                 :          0 :                                 intel_dp_init(dev_priv, PCH_DP_B, PORT_B);
   16724                 :            :                 }
   16725                 :            : 
   16726         [ #  # ]:          0 :                 if (I915_READ(PCH_HDMIC) & SDVO_DETECTED)
   16727                 :          0 :                         intel_hdmi_init(dev_priv, PCH_HDMIC, PORT_C);
   16728                 :            : 
   16729   [ #  #  #  # ]:          0 :                 if (!dpd_is_edp && I915_READ(PCH_HDMID) & SDVO_DETECTED)
   16730                 :          0 :                         intel_hdmi_init(dev_priv, PCH_HDMID, PORT_D);
   16731                 :            : 
   16732         [ #  # ]:          0 :                 if (I915_READ(PCH_DP_C) & DP_DETECTED)
   16733                 :          0 :                         intel_dp_init(dev_priv, PCH_DP_C, PORT_C);
   16734                 :            : 
   16735         [ #  # ]:          0 :                 if (I915_READ(PCH_DP_D) & DP_DETECTED)
   16736                 :          0 :                         intel_dp_init(dev_priv, PCH_DP_D, PORT_D);
   16737   [ #  #  #  # ]:          0 :         } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   16738                 :          0 :                 bool has_edp, has_port;
   16739                 :            : 
   16740   [ #  #  #  # ]:          0 :                 if (IS_VALLEYVIEW(dev_priv) && dev_priv->vbt.int_crt_support)
   16741                 :          0 :                         intel_crt_init(dev_priv);
   16742                 :            : 
   16743                 :            :                 /*
   16744                 :            :                  * The DP_DETECTED bit is the latched state of the DDC
   16745                 :            :                  * SDA pin at boot. However since eDP doesn't require DDC
   16746                 :            :                  * (no way to plug in a DP->HDMI dongle) the DDC pins for
   16747                 :            :                  * eDP ports may have been muxed to an alternate function.
   16748                 :            :                  * Thus we can't rely on the DP_DETECTED bit alone to detect
   16749                 :            :                  * eDP ports. Consult the VBT as well as DP_DETECTED to
   16750                 :            :                  * detect eDP ports.
   16751                 :            :                  *
   16752                 :            :                  * Sadly the straps seem to be missing sometimes even for HDMI
   16753                 :            :                  * ports (eg. on Voyo V3 - CHT x7-Z8700), so check both strap
   16754                 :            :                  * and VBT for the presence of the port. Additionally we can't
   16755                 :            :                  * trust the port type the VBT declares as we've seen at least
   16756                 :            :                  * HDMI ports that the VBT claim are DP or eDP.
   16757                 :            :                  */
   16758                 :          0 :                 has_edp = intel_dp_is_port_edp(dev_priv, PORT_B);
   16759                 :          0 :                 has_port = intel_bios_is_port_present(dev_priv, PORT_B);
   16760   [ #  #  #  # ]:          0 :                 if (I915_READ(VLV_DP_B) & DP_DETECTED || has_port)
   16761                 :          0 :                         has_edp &= intel_dp_init(dev_priv, VLV_DP_B, PORT_B);
   16762   [ #  #  #  #  :          0 :                 if ((I915_READ(VLV_HDMIB) & SDVO_DETECTED || has_port) && !has_edp)
                   #  # ]
   16763                 :          0 :                         intel_hdmi_init(dev_priv, VLV_HDMIB, PORT_B);
   16764                 :            : 
   16765                 :          0 :                 has_edp = intel_dp_is_port_edp(dev_priv, PORT_C);
   16766                 :          0 :                 has_port = intel_bios_is_port_present(dev_priv, PORT_C);
   16767   [ #  #  #  # ]:          0 :                 if (I915_READ(VLV_DP_C) & DP_DETECTED || has_port)
   16768                 :          0 :                         has_edp &= intel_dp_init(dev_priv, VLV_DP_C, PORT_C);
   16769   [ #  #  #  #  :          0 :                 if ((I915_READ(VLV_HDMIC) & SDVO_DETECTED || has_port) && !has_edp)
                   #  # ]
   16770                 :          0 :                         intel_hdmi_init(dev_priv, VLV_HDMIC, PORT_C);
   16771                 :            : 
   16772         [ #  # ]:          0 :                 if (IS_CHERRYVIEW(dev_priv)) {
   16773                 :            :                         /*
   16774                 :            :                          * eDP not supported on port D,
   16775                 :            :                          * so no need to worry about it
   16776                 :            :                          */
   16777                 :          0 :                         has_port = intel_bios_is_port_present(dev_priv, PORT_D);
   16778   [ #  #  #  # ]:          0 :                         if (I915_READ(CHV_DP_D) & DP_DETECTED || has_port)
   16779                 :          0 :                                 intel_dp_init(dev_priv, CHV_DP_D, PORT_D);
   16780   [ #  #  #  # ]:          0 :                         if (I915_READ(CHV_HDMID) & SDVO_DETECTED || has_port)
   16781                 :          0 :                                 intel_hdmi_init(dev_priv, CHV_HDMID, PORT_D);
   16782                 :            :                 }
   16783                 :            : 
   16784                 :          0 :                 vlv_dsi_init(dev_priv);
   16785         [ #  # ]:          0 :         } else if (IS_PINEVIEW(dev_priv)) {
   16786                 :          0 :                 intel_lvds_init(dev_priv);
   16787                 :          0 :                 intel_crt_init(dev_priv);
   16788         [ #  # ]:          0 :         } else if (IS_GEN_RANGE(dev_priv, 3, 4)) {
   16789                 :          0 :                 bool found = false;
   16790                 :            : 
   16791         [ #  # ]:          0 :                 if (IS_MOBILE(dev_priv))
   16792                 :          0 :                         intel_lvds_init(dev_priv);
   16793                 :            : 
   16794                 :          0 :                 intel_crt_init(dev_priv);
   16795                 :            : 
   16796         [ #  # ]:          0 :                 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
   16797                 :          0 :                         DRM_DEBUG_KMS("probing SDVOB\n");
   16798                 :          0 :                         found = intel_sdvo_init(dev_priv, GEN3_SDVOB, PORT_B);
   16799   [ #  #  #  #  :          0 :                         if (!found && IS_G4X(dev_priv)) {
                   #  # ]
   16800                 :          0 :                                 DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
   16801                 :          0 :                                 intel_hdmi_init(dev_priv, GEN4_HDMIB, PORT_B);
   16802                 :            :                         }
   16803                 :            : 
   16804   [ #  #  #  #  :          0 :                         if (!found && IS_G4X(dev_priv))
                   #  # ]
   16805                 :          0 :                                 intel_dp_init(dev_priv, DP_B, PORT_B);
   16806                 :            :                 }
   16807                 :            : 
   16808                 :            :                 /* Before G4X SDVOC doesn't have its own detect register */
   16809                 :            : 
   16810         [ #  # ]:          0 :                 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
   16811                 :          0 :                         DRM_DEBUG_KMS("probing SDVOC\n");
   16812                 :          0 :                         found = intel_sdvo_init(dev_priv, GEN3_SDVOC, PORT_C);
   16813                 :            :                 }
   16814                 :            : 
   16815   [ #  #  #  # ]:          0 :                 if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
   16816                 :            : 
   16817   [ #  #  #  # ]:          0 :                         if (IS_G4X(dev_priv)) {
   16818                 :          0 :                                 DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
   16819                 :          0 :                                 intel_hdmi_init(dev_priv, GEN4_HDMIC, PORT_C);
   16820                 :            :                         }
   16821   [ #  #  #  # ]:          0 :                         if (IS_G4X(dev_priv))
   16822                 :          0 :                                 intel_dp_init(dev_priv, DP_C, PORT_C);
   16823                 :            :                 }
   16824                 :            : 
   16825   [ #  #  #  #  :          0 :                 if (IS_G4X(dev_priv) && (I915_READ(DP_D) & DP_DETECTED))
                   #  # ]
   16826                 :          0 :                         intel_dp_init(dev_priv, DP_D, PORT_D);
   16827                 :            : 
   16828         [ #  # ]:          0 :                 if (SUPPORTS_TV(dev_priv))
   16829                 :          0 :                         intel_tv_init(dev_priv);
   16830         [ #  # ]:          0 :         } else if (IS_GEN(dev_priv, 2)) {
   16831         [ #  # ]:          0 :                 if (IS_I85X(dev_priv))
   16832                 :          0 :                         intel_lvds_init(dev_priv);
   16833                 :            : 
   16834                 :          0 :                 intel_crt_init(dev_priv);
   16835                 :          0 :                 intel_dvo_init(dev_priv);
   16836                 :            :         }
   16837                 :            : 
   16838                 :          0 :         intel_psr_init(dev_priv);
   16839                 :            : 
   16840         [ #  # ]:          0 :         for_each_intel_encoder(&dev_priv->drm, encoder) {
   16841                 :          0 :                 encoder->base.possible_crtcs =
   16842                 :          0 :                         intel_encoder_possible_crtcs(encoder);
   16843                 :          0 :                 encoder->base.possible_clones =
   16844                 :          0 :                         intel_encoder_possible_clones(encoder);
   16845                 :            :         }
   16846                 :            : 
   16847                 :          0 :         intel_init_pch_refclk(dev_priv);
   16848                 :            : 
   16849                 :          0 :         drm_helper_move_panel_connectors_to_head(&dev_priv->drm);
   16850                 :            : }
   16851                 :            : 
   16852                 :          0 : static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
   16853                 :            : {
   16854                 :          0 :         struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   16855                 :            : 
   16856                 :          0 :         drm_framebuffer_cleanup(fb);
   16857                 :          0 :         intel_frontbuffer_put(intel_fb->frontbuffer);
   16858                 :            : 
   16859                 :          0 :         kfree(intel_fb);
   16860                 :          0 : }
   16861                 :            : 
   16862                 :          0 : static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
   16863                 :            :                                                 struct drm_file *file,
   16864                 :            :                                                 unsigned int *handle)
   16865                 :            : {
   16866         [ #  # ]:          0 :         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   16867                 :            : 
   16868         [ #  # ]:          0 :         if (obj->userptr.mm) {
   16869                 :          0 :                 DRM_DEBUG("attempting to use a userptr for a framebuffer, denied\n");
   16870                 :          0 :                 return -EINVAL;
   16871                 :            :         }
   16872                 :            : 
   16873                 :          0 :         return drm_gem_handle_create(file, &obj->base, handle);
   16874                 :            : }
   16875                 :            : 
   16876                 :          0 : static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
   16877                 :            :                                         struct drm_file *file,
   16878                 :            :                                         unsigned flags, unsigned color,
   16879                 :            :                                         struct drm_clip_rect *clips,
   16880                 :            :                                         unsigned num_clips)
   16881                 :            : {
   16882         [ #  # ]:          0 :         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   16883                 :            : 
   16884                 :          0 :         i915_gem_object_flush_if_display(obj);
   16885         [ #  # ]:          0 :         intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB);
   16886                 :            : 
   16887                 :          0 :         return 0;
   16888                 :            : }
   16889                 :            : 
   16890                 :            : static const struct drm_framebuffer_funcs intel_fb_funcs = {
   16891                 :            :         .destroy = intel_user_framebuffer_destroy,
   16892                 :            :         .create_handle = intel_user_framebuffer_create_handle,
   16893                 :            :         .dirty = intel_user_framebuffer_dirty,
   16894                 :            : };
   16895                 :            : 
   16896                 :          0 : static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
   16897                 :            :                                   struct drm_i915_gem_object *obj,
   16898                 :            :                                   struct drm_mode_fb_cmd2 *mode_cmd)
   16899                 :            : {
   16900                 :          0 :         struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
   16901                 :          0 :         struct drm_framebuffer *fb = &intel_fb->base;
   16902                 :          0 :         u32 max_stride;
   16903                 :          0 :         unsigned int tiling, stride;
   16904                 :          0 :         int ret = -EINVAL;
   16905                 :          0 :         int i;
   16906                 :            : 
   16907                 :          0 :         intel_fb->frontbuffer = intel_frontbuffer_get(obj);
   16908         [ #  # ]:          0 :         if (!intel_fb->frontbuffer)
   16909                 :            :                 return -ENOMEM;
   16910                 :            : 
   16911                 :          0 :         i915_gem_object_lock(obj);
   16912                 :          0 :         tiling = i915_gem_object_get_tiling(obj);
   16913                 :          0 :         stride = i915_gem_object_get_stride(obj);
   16914                 :          0 :         i915_gem_object_unlock(obj);
   16915                 :            : 
   16916         [ #  # ]:          0 :         if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
   16917                 :            :                 /*
   16918                 :            :                  * If there's a fence, enforce that
   16919                 :            :                  * the fb modifier and tiling mode match.
   16920                 :            :                  */
   16921   [ #  #  #  # ]:          0 :                 if (tiling != I915_TILING_NONE &&
   16922      [ #  #  # ]:          0 :                     tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
   16923                 :          0 :                         DRM_DEBUG_KMS("tiling_mode doesn't match fb modifier\n");
   16924                 :          0 :                         goto err;
   16925                 :            :                 }
   16926                 :            :         } else {
   16927         [ #  # ]:          0 :                 if (tiling == I915_TILING_X) {
   16928                 :          0 :                         mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED;
   16929         [ #  # ]:          0 :                 } else if (tiling == I915_TILING_Y) {
   16930                 :          0 :                         DRM_DEBUG_KMS("No Y tiling for legacy addfb\n");
   16931                 :          0 :                         goto err;
   16932                 :            :                 }
   16933                 :            :         }
   16934                 :            : 
   16935         [ #  # ]:          0 :         if (!drm_any_plane_has_format(&dev_priv->drm,
   16936                 :            :                                       mode_cmd->pixel_format,
   16937                 :            :                                       mode_cmd->modifier[0])) {
   16938                 :          0 :                 struct drm_format_name_buf format_name;
   16939                 :            : 
   16940                 :          0 :                 DRM_DEBUG_KMS("unsupported pixel format %s / modifier 0x%llx\n",
   16941                 :            :                               drm_get_format_name(mode_cmd->pixel_format,
   16942                 :            :                                                   &format_name),
   16943                 :            :                               mode_cmd->modifier[0]);
   16944                 :          0 :                 goto err;
   16945                 :            :         }
   16946                 :            : 
   16947                 :            :         /*
   16948                 :            :          * gen2/3 display engine uses the fence if present,
   16949                 :            :          * so the tiling mode must match the fb modifier exactly.
   16950                 :            :          */
   16951   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 4 &&
   16952      [ #  #  # ]:          0 :             tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
   16953                 :          0 :                 DRM_DEBUG_KMS("tiling_mode must match fb modifier exactly on gen2/3\n");
   16954                 :          0 :                 goto err;
   16955                 :            :         }
   16956                 :            : 
   16957                 :          0 :         max_stride = intel_fb_max_stride(dev_priv, mode_cmd->pixel_format,
   16958                 :            :                                          mode_cmd->modifier[0]);
   16959         [ #  # ]:          0 :         if (mode_cmd->pitches[0] > max_stride) {
   16960         [ #  # ]:          0 :                 DRM_DEBUG_KMS("%s pitch (%u) must be at most %d\n",
   16961                 :            :                               mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ?
   16962                 :            :                               "tiled" : "linear",
   16963                 :            :                               mode_cmd->pitches[0], max_stride);
   16964                 :          0 :                 goto err;
   16965                 :            :         }
   16966                 :            : 
   16967                 :            :         /*
   16968                 :            :          * If there's a fence, enforce that
   16969                 :            :          * the fb pitch and fence stride match.
   16970                 :            :          */
   16971   [ #  #  #  # ]:          0 :         if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) {
   16972                 :          0 :                 DRM_DEBUG_KMS("pitch (%d) must match tiling stride (%d)\n",
   16973                 :            :                               mode_cmd->pitches[0], stride);
   16974                 :          0 :                 goto err;
   16975                 :            :         }
   16976                 :            : 
   16977                 :            :         /* FIXME need to adjust LINOFF/TILEOFF accordingly. */
   16978         [ #  # ]:          0 :         if (mode_cmd->offsets[0] != 0) {
   16979                 :          0 :                 DRM_DEBUG_KMS("plane 0 offset (0x%08x) must be 0\n",
   16980                 :            :                               mode_cmd->offsets[0]);
   16981                 :          0 :                 goto err;
   16982                 :            :         }
   16983                 :            : 
   16984                 :          0 :         drm_helper_mode_fill_fb_struct(&dev_priv->drm, fb, mode_cmd);
   16985                 :            : 
   16986         [ #  # ]:          0 :         for (i = 0; i < fb->format->num_planes; i++) {
   16987                 :          0 :                 u32 stride_alignment;
   16988                 :            : 
   16989         [ #  # ]:          0 :                 if (mode_cmd->handles[i] != mode_cmd->handles[0]) {
   16990                 :          0 :                         DRM_DEBUG_KMS("bad plane %d handle\n", i);
   16991                 :          0 :                         goto err;
   16992                 :            :                 }
   16993                 :            : 
   16994                 :          0 :                 stride_alignment = intel_fb_stride_alignment(fb, i);
   16995         [ #  # ]:          0 :                 if (fb->pitches[i] & (stride_alignment - 1)) {
   16996                 :          0 :                         DRM_DEBUG_KMS("plane %d pitch (%d) must be at least %u byte aligned\n",
   16997                 :            :                                       i, fb->pitches[i], stride_alignment);
   16998                 :          0 :                         goto err;
   16999                 :            :                 }
   17000                 :            : 
   17001   [ #  #  #  # ]:          0 :                 if (is_gen12_ccs_plane(fb, i)) {
   17002                 :          0 :                         int ccs_aux_stride = gen12_ccs_aux_stride(fb, i);
   17003                 :            : 
   17004         [ #  # ]:          0 :                         if (fb->pitches[i] != ccs_aux_stride) {
   17005                 :          0 :                                 DRM_DEBUG_KMS("ccs aux plane %d pitch (%d) must be %d\n",
   17006                 :            :                                               i,
   17007                 :            :                                               fb->pitches[i], ccs_aux_stride);
   17008                 :          0 :                                 goto err;
   17009                 :            :                         }
   17010                 :            :                 }
   17011                 :            : 
   17012                 :          0 :                 fb->obj[i] = &obj->base;
   17013                 :            :         }
   17014                 :            : 
   17015                 :          0 :         ret = intel_fill_fb_info(dev_priv, fb);
   17016         [ #  # ]:          0 :         if (ret)
   17017                 :          0 :                 goto err;
   17018                 :            : 
   17019                 :          0 :         ret = drm_framebuffer_init(&dev_priv->drm, fb, &intel_fb_funcs);
   17020         [ #  # ]:          0 :         if (ret) {
   17021                 :          0 :                 DRM_ERROR("framebuffer init failed %d\n", ret);
   17022                 :          0 :                 goto err;
   17023                 :            :         }
   17024                 :            : 
   17025                 :            :         return 0;
   17026                 :            : 
   17027                 :          0 : err:
   17028                 :          0 :         intel_frontbuffer_put(intel_fb->frontbuffer);
   17029                 :          0 :         return ret;
   17030                 :            : }
   17031                 :            : 
   17032                 :            : static struct drm_framebuffer *
   17033                 :          0 : intel_user_framebuffer_create(struct drm_device *dev,
   17034                 :            :                               struct drm_file *filp,
   17035                 :            :                               const struct drm_mode_fb_cmd2 *user_mode_cmd)
   17036                 :            : {
   17037                 :          0 :         struct drm_framebuffer *fb;
   17038                 :          0 :         struct drm_i915_gem_object *obj;
   17039                 :          0 :         struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
   17040                 :            : 
   17041                 :          0 :         obj = i915_gem_object_lookup(filp, mode_cmd.handles[0]);
   17042         [ #  # ]:          0 :         if (!obj)
   17043                 :            :                 return ERR_PTR(-ENOENT);
   17044                 :            : 
   17045                 :          0 :         fb = intel_framebuffer_create(obj, &mode_cmd);
   17046                 :          0 :         i915_gem_object_put(obj);
   17047                 :            : 
   17048                 :          0 :         return fb;
   17049                 :            : }
   17050                 :            : 
   17051                 :          0 : static void intel_atomic_state_free(struct drm_atomic_state *state)
   17052                 :            : {
   17053                 :          0 :         struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
   17054                 :            : 
   17055                 :          0 :         drm_atomic_state_default_release(state);
   17056                 :            : 
   17057                 :          0 :         i915_sw_fence_fini(&intel_state->commit_ready);
   17058                 :            : 
   17059                 :          0 :         kfree(state);
   17060                 :          0 : }
   17061                 :            : 
   17062                 :            : static enum drm_mode_status
   17063                 :          0 : intel_mode_valid(struct drm_device *dev,
   17064                 :            :                  const struct drm_display_mode *mode)
   17065                 :            : {
   17066         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   17067                 :          0 :         int hdisplay_max, htotal_max;
   17068                 :          0 :         int vdisplay_max, vtotal_max;
   17069                 :            : 
   17070                 :            :         /*
   17071                 :            :          * Can't reject DBLSCAN here because Xorg ddxen can add piles
   17072                 :            :          * of DBLSCAN modes to the output's mode list when they detect
   17073                 :            :          * the scaling mode property on the connector. And they don't
   17074                 :            :          * ask the kernel to validate those modes in any way until
   17075                 :            :          * modeset time at which point the client gets a protocol error.
   17076                 :            :          * So in order to not upset those clients we silently ignore the
   17077                 :            :          * DBLSCAN flag on such connectors. For other connectors we will
   17078                 :            :          * reject modes with the DBLSCAN flag in encoder->compute_config().
   17079                 :            :          * And we always reject DBLSCAN modes in connector->mode_valid()
   17080                 :            :          * as we never want such modes on the connector's mode list.
   17081                 :            :          */
   17082                 :            : 
   17083         [ #  # ]:          0 :         if (mode->vscan > 1)
   17084                 :            :                 return MODE_NO_VSCAN;
   17085                 :            : 
   17086         [ #  # ]:          0 :         if (mode->flags & DRM_MODE_FLAG_HSKEW)
   17087                 :            :                 return MODE_H_ILLEGAL;
   17088                 :            : 
   17089         [ #  # ]:          0 :         if (mode->flags & (DRM_MODE_FLAG_CSYNC |
   17090                 :            :                            DRM_MODE_FLAG_NCSYNC |
   17091                 :            :                            DRM_MODE_FLAG_PCSYNC))
   17092                 :            :                 return MODE_HSYNC;
   17093                 :            : 
   17094         [ #  # ]:          0 :         if (mode->flags & (DRM_MODE_FLAG_BCAST |
   17095                 :            :                            DRM_MODE_FLAG_PIXMUX |
   17096                 :            :                            DRM_MODE_FLAG_CLKDIV2))
   17097                 :            :                 return MODE_BAD;
   17098                 :            : 
   17099                 :            :         /* Transcoder timing limits */
   17100         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11) {
   17101                 :            :                 hdisplay_max = 16384;
   17102                 :            :                 vdisplay_max = 8192;
   17103                 :            :                 htotal_max = 16384;
   17104                 :            :                 vtotal_max = 8192;
   17105   [ #  #  #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 9 ||
   17106         [ #  # ]:          0 :                    IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
   17107                 :            :                 hdisplay_max = 8192; /* FDI max 4096 handled elsewhere */
   17108                 :            :                 vdisplay_max = 4096;
   17109                 :            :                 htotal_max = 8192;
   17110                 :            :                 vtotal_max = 8192;
   17111         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 3) {
   17112                 :            :                 hdisplay_max = 4096;
   17113                 :            :                 vdisplay_max = 4096;
   17114                 :            :                 htotal_max = 8192;
   17115                 :            :                 vtotal_max = 8192;
   17116                 :            :         } else {
   17117                 :          0 :                 hdisplay_max = 2048;
   17118                 :          0 :                 vdisplay_max = 2048;
   17119                 :          0 :                 htotal_max = 4096;
   17120                 :          0 :                 vtotal_max = 4096;
   17121                 :            :         }
   17122                 :            : 
   17123         [ #  # ]:          0 :         if (mode->hdisplay > hdisplay_max ||
   17124         [ #  # ]:          0 :             mode->hsync_start > htotal_max ||
   17125         [ #  # ]:          0 :             mode->hsync_end > htotal_max ||
   17126         [ #  # ]:          0 :             mode->htotal > htotal_max)
   17127                 :            :                 return MODE_H_ILLEGAL;
   17128                 :            : 
   17129         [ #  # ]:          0 :         if (mode->vdisplay > vdisplay_max ||
   17130         [ #  # ]:          0 :             mode->vsync_start > vtotal_max ||
   17131         [ #  # ]:          0 :             mode->vsync_end > vtotal_max ||
   17132         [ #  # ]:          0 :             mode->vtotal > vtotal_max)
   17133                 :            :                 return MODE_V_ILLEGAL;
   17134                 :            : 
   17135         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 5) {
   17136         [ #  # ]:          0 :                 if (mode->hdisplay < 64 ||
   17137         [ #  # ]:          0 :                     mode->htotal - mode->hdisplay < 32)
   17138                 :            :                         return MODE_H_ILLEGAL;
   17139                 :            : 
   17140         [ #  # ]:          0 :                 if (mode->vtotal - mode->vdisplay < 5)
   17141                 :          0 :                         return MODE_V_ILLEGAL;
   17142                 :            :         } else {
   17143         [ #  # ]:          0 :                 if (mode->htotal - mode->hdisplay < 32)
   17144                 :            :                         return MODE_H_ILLEGAL;
   17145                 :            : 
   17146         [ #  # ]:          0 :                 if (mode->vtotal - mode->vdisplay < 3)
   17147                 :          0 :                         return MODE_V_ILLEGAL;
   17148                 :            :         }
   17149                 :            : 
   17150                 :            :         return MODE_OK;
   17151                 :            : }
   17152                 :            : 
   17153                 :            : enum drm_mode_status
   17154                 :          0 : intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv,
   17155                 :            :                                 const struct drm_display_mode *mode)
   17156                 :            : {
   17157                 :          0 :         int plane_width_max, plane_height_max;
   17158                 :            : 
   17159                 :            :         /*
   17160                 :            :          * intel_mode_valid() should be
   17161                 :            :          * sufficient on older platforms.
   17162                 :            :          */
   17163         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) < 9)
   17164                 :            :                 return MODE_OK;
   17165                 :            : 
   17166                 :            :         /*
   17167                 :            :          * Most people will probably want a fullscreen
   17168                 :            :          * plane so let's not advertize modes that are
   17169                 :            :          * too big for that.
   17170                 :            :          */
   17171         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11) {
   17172                 :            :                 plane_width_max = 5120;
   17173                 :            :                 plane_height_max = 4320;
   17174                 :            :         } else {
   17175                 :          0 :                 plane_width_max = 5120;
   17176                 :          0 :                 plane_height_max = 4096;
   17177                 :            :         }
   17178                 :            : 
   17179         [ #  # ]:          0 :         if (mode->hdisplay > plane_width_max)
   17180                 :            :                 return MODE_H_ILLEGAL;
   17181                 :            : 
   17182         [ #  # ]:          0 :         if (mode->vdisplay > plane_height_max)
   17183                 :          0 :                 return MODE_V_ILLEGAL;
   17184                 :            : 
   17185                 :            :         return MODE_OK;
   17186                 :            : }
   17187                 :            : 
   17188                 :            : static const struct drm_mode_config_funcs intel_mode_funcs = {
   17189                 :            :         .fb_create = intel_user_framebuffer_create,
   17190                 :            :         .get_format_info = intel_get_format_info,
   17191                 :            :         .output_poll_changed = intel_fbdev_output_poll_changed,
   17192                 :            :         .mode_valid = intel_mode_valid,
   17193                 :            :         .atomic_check = intel_atomic_check,
   17194                 :            :         .atomic_commit = intel_atomic_commit,
   17195                 :            :         .atomic_state_alloc = intel_atomic_state_alloc,
   17196                 :            :         .atomic_state_clear = intel_atomic_state_clear,
   17197                 :            :         .atomic_state_free = intel_atomic_state_free,
   17198                 :            : };
   17199                 :            : 
   17200                 :            : /**
   17201                 :            :  * intel_init_display_hooks - initialize the display modesetting hooks
   17202                 :            :  * @dev_priv: device private
   17203                 :            :  */
   17204                 :          0 : void intel_init_display_hooks(struct drm_i915_private *dev_priv)
   17205                 :            : {
   17206                 :          0 :         intel_init_cdclk_hooks(dev_priv);
   17207                 :            : 
   17208         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9) {
   17209                 :          0 :                 dev_priv->display.get_pipe_config = hsw_get_pipe_config;
   17210                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17211                 :            :                         skl_get_initial_plane_config;
   17212                 :          0 :                 dev_priv->display.crtc_compute_clock = hsw_crtc_compute_clock;
   17213                 :          0 :                 dev_priv->display.crtc_enable = hsw_crtc_enable;
   17214                 :          0 :                 dev_priv->display.crtc_disable = hsw_crtc_disable;
   17215         [ #  # ]:          0 :         } else if (HAS_DDI(dev_priv)) {
   17216                 :          0 :                 dev_priv->display.get_pipe_config = hsw_get_pipe_config;
   17217                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17218                 :            :                         i9xx_get_initial_plane_config;
   17219                 :          0 :                 dev_priv->display.crtc_compute_clock =
   17220                 :            :                         hsw_crtc_compute_clock;
   17221                 :          0 :                 dev_priv->display.crtc_enable = hsw_crtc_enable;
   17222                 :          0 :                 dev_priv->display.crtc_disable = hsw_crtc_disable;
   17223         [ #  # ]:          0 :         } else if (HAS_PCH_SPLIT(dev_priv)) {
   17224                 :          0 :                 dev_priv->display.get_pipe_config = ilk_get_pipe_config;
   17225                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17226                 :            :                         i9xx_get_initial_plane_config;
   17227                 :          0 :                 dev_priv->display.crtc_compute_clock =
   17228                 :            :                         ilk_crtc_compute_clock;
   17229                 :          0 :                 dev_priv->display.crtc_enable = ilk_crtc_enable;
   17230                 :          0 :                 dev_priv->display.crtc_disable = ilk_crtc_disable;
   17231         [ #  # ]:          0 :         } else if (IS_CHERRYVIEW(dev_priv)) {
   17232                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17233                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17234                 :            :                         i9xx_get_initial_plane_config;
   17235                 :          0 :                 dev_priv->display.crtc_compute_clock = chv_crtc_compute_clock;
   17236                 :          0 :                 dev_priv->display.crtc_enable = valleyview_crtc_enable;
   17237                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17238         [ #  # ]:          0 :         } else if (IS_VALLEYVIEW(dev_priv)) {
   17239                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17240                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17241                 :            :                         i9xx_get_initial_plane_config;
   17242                 :          0 :                 dev_priv->display.crtc_compute_clock = vlv_crtc_compute_clock;
   17243                 :          0 :                 dev_priv->display.crtc_enable = valleyview_crtc_enable;
   17244                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17245   [ #  #  #  # ]:          0 :         } else if (IS_G4X(dev_priv)) {
   17246                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17247                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17248                 :            :                         i9xx_get_initial_plane_config;
   17249                 :          0 :                 dev_priv->display.crtc_compute_clock = g4x_crtc_compute_clock;
   17250                 :          0 :                 dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17251                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17252         [ #  # ]:          0 :         } else if (IS_PINEVIEW(dev_priv)) {
   17253                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17254                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17255                 :            :                         i9xx_get_initial_plane_config;
   17256                 :          0 :                 dev_priv->display.crtc_compute_clock = pnv_crtc_compute_clock;
   17257                 :          0 :                 dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17258                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17259         [ #  # ]:          0 :         } else if (!IS_GEN(dev_priv, 2)) {
   17260                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17261                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17262                 :            :                         i9xx_get_initial_plane_config;
   17263                 :          0 :                 dev_priv->display.crtc_compute_clock = i9xx_crtc_compute_clock;
   17264                 :          0 :                 dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17265                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17266                 :            :         } else {
   17267                 :          0 :                 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17268                 :          0 :                 dev_priv->display.get_initial_plane_config =
   17269                 :            :                         i9xx_get_initial_plane_config;
   17270                 :          0 :                 dev_priv->display.crtc_compute_clock = i8xx_crtc_compute_clock;
   17271                 :          0 :                 dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17272                 :          0 :                 dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17273                 :            :         }
   17274                 :            : 
   17275         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 5)) {
   17276                 :          0 :                 dev_priv->display.fdi_link_train = ilk_fdi_link_train;
   17277         [ #  # ]:          0 :         } else if (IS_GEN(dev_priv, 6)) {
   17278                 :          0 :                 dev_priv->display.fdi_link_train = gen6_fdi_link_train;
   17279         [ #  # ]:          0 :         } else if (IS_IVYBRIDGE(dev_priv)) {
   17280                 :            :                 /* FIXME: detect B0+ stepping and use auto training */
   17281                 :          0 :                 dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
   17282                 :            :         }
   17283                 :            : 
   17284         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9)
   17285                 :          0 :                 dev_priv->display.commit_modeset_enables = skl_commit_modeset_enables;
   17286                 :            :         else
   17287                 :          0 :                 dev_priv->display.commit_modeset_enables = intel_commit_modeset_enables;
   17288                 :            : 
   17289                 :          0 : }
   17290                 :            : 
   17291                 :          0 : void intel_modeset_init_hw(struct drm_i915_private *i915)
   17292                 :            : {
   17293                 :          0 :         intel_update_cdclk(i915);
   17294                 :          0 :         intel_dump_cdclk_state(&i915->cdclk.hw, "Current CDCLK");
   17295                 :          0 :         i915->cdclk.logical = i915->cdclk.actual = i915->cdclk.hw;
   17296                 :          0 : }
   17297                 :            : 
   17298                 :            : /*
   17299                 :            :  * Calculate what we think the watermarks should be for the state we've read
   17300                 :            :  * out of the hardware and then immediately program those watermarks so that
   17301                 :            :  * we ensure the hardware settings match our internal state.
   17302                 :            :  *
   17303                 :            :  * We can calculate what we think WM's should be by creating a duplicate of the
   17304                 :            :  * current state (which was constructed during hardware readout) and running it
   17305                 :            :  * through the atomic check code to calculate new watermark values in the
   17306                 :            :  * state object.
   17307                 :            :  */
   17308                 :          0 : static void sanitize_watermarks(struct drm_device *dev)
   17309                 :            : {
   17310         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   17311                 :          0 :         struct drm_atomic_state *state;
   17312                 :          0 :         struct intel_atomic_state *intel_state;
   17313                 :          0 :         struct intel_crtc *crtc;
   17314                 :          0 :         struct intel_crtc_state *crtc_state;
   17315                 :          0 :         struct drm_modeset_acquire_ctx ctx;
   17316                 :          0 :         int ret;
   17317                 :          0 :         int i;
   17318                 :            : 
   17319                 :            :         /* Only supported on platforms that use atomic watermark design */
   17320         [ #  # ]:          0 :         if (!dev_priv->display.optimize_watermarks)
   17321                 :          0 :                 return;
   17322                 :            : 
   17323                 :            :         /*
   17324                 :            :          * We need to hold connection_mutex before calling duplicate_state so
   17325                 :            :          * that the connector loop is protected.
   17326                 :            :          */
   17327                 :          0 :         drm_modeset_acquire_init(&ctx, 0);
   17328                 :          0 : retry:
   17329                 :          0 :         ret = drm_modeset_lock_all_ctx(dev, &ctx);
   17330         [ #  # ]:          0 :         if (ret == -EDEADLK) {
   17331                 :          0 :                 drm_modeset_backoff(&ctx);
   17332                 :          0 :                 goto retry;
   17333   [ #  #  #  # ]:          0 :         } else if (WARN_ON(ret)) {
   17334                 :          0 :                 goto fail;
   17335                 :            :         }
   17336                 :            : 
   17337                 :          0 :         state = drm_atomic_helper_duplicate_state(dev, &ctx);
   17338   [ #  #  #  # ]:          0 :         if (WARN_ON(IS_ERR(state)))
   17339                 :          0 :                 goto fail;
   17340                 :            : 
   17341                 :          0 :         intel_state = to_intel_atomic_state(state);
   17342                 :            : 
   17343                 :            :         /*
   17344                 :            :          * Hardware readout is the only time we don't want to calculate
   17345                 :            :          * intermediate watermarks (since we don't trust the current
   17346                 :            :          * watermarks).
   17347                 :            :          */
   17348         [ #  # ]:          0 :         if (!HAS_GMCH(dev_priv))
   17349                 :          0 :                 intel_state->skip_intermediate_wm = true;
   17350                 :            : 
   17351                 :          0 :         ret = intel_atomic_check(dev, state);
   17352         [ #  # ]:          0 :         if (ret) {
   17353                 :            :                 /*
   17354                 :            :                  * If we fail here, it means that the hardware appears to be
   17355                 :            :                  * programmed in a way that shouldn't be possible, given our
   17356                 :            :                  * understanding of watermark requirements.  This might mean a
   17357                 :            :                  * mistake in the hardware readout code or a mistake in the
   17358                 :            :                  * watermark calculations for a given platform.  Raise a WARN
   17359                 :            :                  * so that this is noticeable.
   17360                 :            :                  *
   17361                 :            :                  * If this actually happens, we'll have to just leave the
   17362                 :            :                  * BIOS-programmed watermarks untouched and hope for the best.
   17363                 :            :                  */
   17364                 :          0 :                 WARN(true, "Could not determine valid watermarks for inherited state\n");
   17365                 :          0 :                 goto put_state;
   17366                 :            :         }
   17367                 :            : 
   17368                 :            :         /* Write calculated watermark values back */
   17369   [ #  #  #  # ]:          0 :         for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
   17370                 :          0 :                 crtc_state->wm.need_postvbl_update = true;
   17371                 :          0 :                 dev_priv->display.optimize_watermarks(intel_state, crtc);
   17372                 :            : 
   17373                 :          0 :                 to_intel_crtc_state(crtc->base.state)->wm = crtc_state->wm;
   17374                 :            :         }
   17375                 :            : 
   17376                 :          0 : put_state:
   17377                 :          0 :         drm_atomic_state_put(state);
   17378                 :          0 : fail:
   17379                 :          0 :         drm_modeset_drop_locks(&ctx);
   17380                 :          0 :         drm_modeset_acquire_fini(&ctx);
   17381                 :            : }
   17382                 :            : 
   17383                 :          0 : static void intel_update_fdi_pll_freq(struct drm_i915_private *dev_priv)
   17384                 :            : {
   17385         [ #  # ]:          0 :         if (IS_GEN(dev_priv, 5)) {
   17386                 :          0 :                 u32 fdi_pll_clk =
   17387                 :          0 :                         I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK;
   17388                 :            : 
   17389                 :          0 :                 dev_priv->fdi_pll_freq = (fdi_pll_clk + 2) * 10000;
   17390   [ #  #  #  # ]:          0 :         } else if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv)) {
   17391                 :          0 :                 dev_priv->fdi_pll_freq = 270000;
   17392                 :            :         } else {
   17393                 :            :                 return;
   17394                 :            :         }
   17395                 :            : 
   17396                 :          0 :         DRM_DEBUG_DRIVER("FDI PLL freq=%d\n", dev_priv->fdi_pll_freq);
   17397                 :            : }
   17398                 :            : 
   17399                 :          0 : static int intel_initial_commit(struct drm_device *dev)
   17400                 :            : {
   17401                 :          0 :         struct drm_atomic_state *state = NULL;
   17402                 :          0 :         struct drm_modeset_acquire_ctx ctx;
   17403                 :          0 :         struct intel_crtc *crtc;
   17404                 :          0 :         int ret = 0;
   17405                 :            : 
   17406                 :          0 :         state = drm_atomic_state_alloc(dev);
   17407         [ #  # ]:          0 :         if (!state)
   17408                 :            :                 return -ENOMEM;
   17409                 :            : 
   17410                 :          0 :         drm_modeset_acquire_init(&ctx, 0);
   17411                 :            : 
   17412                 :          0 : retry:
   17413                 :          0 :         state->acquire_ctx = &ctx;
   17414                 :            : 
   17415         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   17416                 :          0 :                 struct intel_crtc_state *crtc_state =
   17417                 :          0 :                         intel_atomic_get_crtc_state(state, crtc);
   17418                 :            : 
   17419         [ #  # ]:          0 :                 if (IS_ERR(crtc_state)) {
   17420                 :          0 :                         ret = PTR_ERR(crtc_state);
   17421                 :          0 :                         goto out;
   17422                 :            :                 }
   17423                 :            : 
   17424         [ #  # ]:          0 :                 if (crtc_state->hw.active) {
   17425                 :          0 :                         ret = drm_atomic_add_affected_planes(state, &crtc->base);
   17426         [ #  # ]:          0 :                         if (ret)
   17427                 :          0 :                                 goto out;
   17428                 :            : 
   17429                 :            :                         /*
   17430                 :            :                          * FIXME hack to force a LUT update to avoid the
   17431                 :            :                          * plane update forcing the pipe gamma on without
   17432                 :            :                          * having a proper LUT loaded. Remove once we
   17433                 :            :                          * have readout for pipe gamma enable.
   17434                 :            :                          */
   17435                 :          0 :                         crtc_state->uapi.color_mgmt_changed = true;
   17436                 :            : 
   17437                 :            :                         /*
   17438                 :            :                          * FIXME hack to force full modeset when DSC is being
   17439                 :            :                          * used.
   17440                 :            :                          *
   17441                 :            :                          * As long as we do not have full state readout and
   17442                 :            :                          * config comparison of crtc_state->dsc, we have no way
   17443                 :            :                          * to ensure reliable fastset. Remove once we have
   17444                 :            :                          * readout for DSC.
   17445                 :            :                          */
   17446         [ #  # ]:          0 :                         if (crtc_state->dsc.compression_enable) {
   17447                 :          0 :                                 ret = drm_atomic_add_affected_connectors(state,
   17448                 :            :                                                                          &crtc->base);
   17449         [ #  # ]:          0 :                                 if (ret)
   17450                 :          0 :                                         goto out;
   17451                 :          0 :                                 crtc_state->uapi.mode_changed = true;
   17452                 :          0 :                                 drm_dbg_kms(dev, "Force full modeset for DSC\n");
   17453                 :            :                         }
   17454                 :            :                 }
   17455                 :            :         }
   17456                 :            : 
   17457                 :          0 :         ret = drm_atomic_commit(state);
   17458                 :            : 
   17459                 :          0 : out:
   17460         [ #  # ]:          0 :         if (ret == -EDEADLK) {
   17461                 :          0 :                 drm_atomic_state_clear(state);
   17462                 :          0 :                 drm_modeset_backoff(&ctx);
   17463                 :          0 :                 goto retry;
   17464                 :            :         }
   17465                 :            : 
   17466                 :          0 :         drm_atomic_state_put(state);
   17467                 :            : 
   17468                 :          0 :         drm_modeset_drop_locks(&ctx);
   17469                 :          0 :         drm_modeset_acquire_fini(&ctx);
   17470                 :            : 
   17471                 :          0 :         return ret;
   17472                 :            : }
   17473                 :            : 
   17474                 :          0 : static void intel_mode_config_init(struct drm_i915_private *i915)
   17475                 :            : {
   17476                 :          0 :         struct drm_mode_config *mode_config = &i915->drm.mode_config;
   17477                 :            : 
   17478                 :          0 :         drm_mode_config_init(&i915->drm);
   17479                 :            : 
   17480                 :          0 :         mode_config->min_width = 0;
   17481                 :          0 :         mode_config->min_height = 0;
   17482                 :            : 
   17483                 :          0 :         mode_config->preferred_depth = 24;
   17484                 :          0 :         mode_config->prefer_shadow = 1;
   17485                 :            : 
   17486                 :          0 :         mode_config->allow_fb_modifiers = true;
   17487                 :            : 
   17488                 :          0 :         mode_config->funcs = &intel_mode_funcs;
   17489                 :            : 
   17490                 :            :         /*
   17491                 :            :          * Maximum framebuffer dimensions, chosen to match
   17492                 :            :          * the maximum render engine surface size on gen4+.
   17493                 :            :          */
   17494         [ #  # ]:          0 :         if (INTEL_GEN(i915) >= 7) {
   17495                 :          0 :                 mode_config->max_width = 16384;
   17496                 :          0 :                 mode_config->max_height = 16384;
   17497         [ #  # ]:          0 :         } else if (INTEL_GEN(i915) >= 4) {
   17498                 :          0 :                 mode_config->max_width = 8192;
   17499                 :          0 :                 mode_config->max_height = 8192;
   17500         [ #  # ]:          0 :         } else if (IS_GEN(i915, 3)) {
   17501                 :          0 :                 mode_config->max_width = 4096;
   17502                 :          0 :                 mode_config->max_height = 4096;
   17503                 :            :         } else {
   17504                 :          0 :                 mode_config->max_width = 2048;
   17505                 :          0 :                 mode_config->max_height = 2048;
   17506                 :            :         }
   17507                 :            : 
   17508   [ #  #  #  # ]:          0 :         if (IS_I845G(i915) || IS_I865G(i915)) {
   17509         [ #  # ]:          0 :                 mode_config->cursor_width = IS_I845G(i915) ? 64 : 512;
   17510                 :          0 :                 mode_config->cursor_height = 1023;
   17511         [ #  # ]:          0 :         } else if (IS_GEN(i915, 2)) {
   17512                 :          0 :                 mode_config->cursor_width = 64;
   17513                 :          0 :                 mode_config->cursor_height = 64;
   17514                 :            :         } else {
   17515                 :          0 :                 mode_config->cursor_width = 256;
   17516                 :          0 :                 mode_config->cursor_height = 256;
   17517                 :            :         }
   17518                 :          0 : }
   17519                 :            : 
   17520                 :          0 : int intel_modeset_init(struct drm_i915_private *i915)
   17521                 :            : {
   17522                 :          0 :         struct drm_device *dev = &i915->drm;
   17523                 :          0 :         enum pipe pipe;
   17524                 :          0 :         struct intel_crtc *crtc;
   17525                 :          0 :         int ret;
   17526                 :            : 
   17527                 :          0 :         i915->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
   17528                 :          0 :         i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
   17529                 :          0 :                                         WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
   17530                 :            : 
   17531                 :          0 :         intel_mode_config_init(i915);
   17532                 :            : 
   17533                 :          0 :         ret = intel_bw_init(i915);
   17534         [ #  # ]:          0 :         if (ret)
   17535                 :            :                 return ret;
   17536                 :            : 
   17537                 :          0 :         init_llist_head(&i915->atomic_helper.free_list);
   17538                 :          0 :         INIT_WORK(&i915->atomic_helper.free_work,
   17539                 :            :                   intel_atomic_helper_free_state_worker);
   17540                 :            : 
   17541                 :          0 :         intel_init_quirks(i915);
   17542                 :            : 
   17543                 :          0 :         intel_fbc_init(i915);
   17544                 :            : 
   17545                 :          0 :         intel_init_pm(i915);
   17546                 :            : 
   17547                 :          0 :         intel_panel_sanitize_ssc(i915);
   17548                 :            : 
   17549                 :          0 :         intel_gmbus_setup(i915);
   17550                 :            : 
   17551   [ #  #  #  #  :          0 :         DRM_DEBUG_KMS("%d display pipe%s available.\n",
                   #  # ]
   17552                 :            :                       INTEL_NUM_PIPES(i915),
   17553                 :            :                       INTEL_NUM_PIPES(i915) > 1 ? "s" : "");
   17554                 :            : 
   17555   [ #  #  #  # ]:          0 :         if (HAS_DISPLAY(i915) && INTEL_DISPLAY_ENABLED(i915)) {
   17556   [ #  #  #  # ]:          0 :                 for_each_pipe(i915, pipe) {
   17557                 :          0 :                         ret = intel_crtc_init(i915, pipe);
   17558         [ #  # ]:          0 :                         if (ret) {
   17559                 :          0 :                                 drm_mode_config_cleanup(dev);
   17560                 :          0 :                                 return ret;
   17561                 :            :                         }
   17562                 :            :                 }
   17563                 :            :         }
   17564                 :            : 
   17565                 :          0 :         intel_shared_dpll_init(dev);
   17566                 :          0 :         intel_update_fdi_pll_freq(i915);
   17567                 :            : 
   17568                 :          0 :         intel_update_czclk(i915);
   17569                 :          0 :         intel_modeset_init_hw(i915);
   17570                 :            : 
   17571                 :          0 :         intel_hdcp_component_init(i915);
   17572                 :            : 
   17573         [ #  # ]:          0 :         if (i915->max_cdclk_freq == 0)
   17574                 :          0 :                 intel_update_max_cdclk(i915);
   17575                 :            : 
   17576                 :            :         /* Just disable it once at startup */
   17577                 :          0 :         intel_vga_disable(i915);
   17578                 :          0 :         intel_setup_outputs(i915);
   17579                 :            : 
   17580                 :          0 :         drm_modeset_lock_all(dev);
   17581                 :          0 :         intel_modeset_setup_hw_state(dev, dev->mode_config.acquire_ctx);
   17582                 :          0 :         drm_modeset_unlock_all(dev);
   17583                 :            : 
   17584         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   17585                 :          0 :                 struct intel_initial_plane_config plane_config = {};
   17586                 :            : 
   17587         [ #  # ]:          0 :                 if (!crtc->active)
   17588                 :          0 :                         continue;
   17589                 :            : 
   17590                 :            :                 /*
   17591                 :            :                  * Note that reserving the BIOS fb up front prevents us
   17592                 :            :                  * from stuffing other stolen allocations like the ring
   17593                 :            :                  * on top.  This prevents some ugliness at boot time, and
   17594                 :            :                  * can even allow for smooth boot transitions if the BIOS
   17595                 :            :                  * fb is large enough for the active pipe configuration.
   17596                 :            :                  */
   17597                 :          0 :                 i915->display.get_initial_plane_config(crtc, &plane_config);
   17598                 :            : 
   17599                 :            :                 /*
   17600                 :            :                  * If the fb is shared between multiple heads, we'll
   17601                 :            :                  * just get the first one.
   17602                 :            :                  */
   17603                 :          0 :                 intel_find_initial_plane_obj(crtc, &plane_config);
   17604                 :            :         }
   17605                 :            : 
   17606                 :            :         /*
   17607                 :            :          * Make sure hardware watermarks really match the state we read out.
   17608                 :            :          * Note that we need to do this after reconstructing the BIOS fb's
   17609                 :            :          * since the watermark calculation done here will use pstate->fb.
   17610                 :            :          */
   17611         [ #  # ]:          0 :         if (!HAS_GMCH(i915))
   17612                 :          0 :                 sanitize_watermarks(dev);
   17613                 :            : 
   17614                 :            :         /*
   17615                 :            :          * Force all active planes to recompute their states. So that on
   17616                 :            :          * mode_setcrtc after probe, all the intel_plane_state variables
   17617                 :            :          * are already calculated and there is no assert_plane warnings
   17618                 :            :          * during bootup.
   17619                 :            :          */
   17620                 :          0 :         ret = intel_initial_commit(dev);
   17621         [ #  # ]:          0 :         if (ret)
   17622                 :          0 :                 DRM_DEBUG_KMS("Initial commit in probe failed.\n");
   17623                 :            : 
   17624                 :            :         return 0;
   17625                 :            : }
   17626                 :            : 
   17627                 :          0 : void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
   17628                 :            : {
   17629                 :          0 :         struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17630                 :            :         /* 640x480@60Hz, ~25175 kHz */
   17631                 :          0 :         struct dpll clock = {
   17632                 :            :                 .m1 = 18,
   17633                 :            :                 .m2 = 7,
   17634                 :            :                 .p1 = 13,
   17635                 :            :                 .p2 = 4,
   17636                 :            :                 .n = 2,
   17637                 :            :         };
   17638                 :          0 :         u32 dpll, fp;
   17639                 :          0 :         int i;
   17640                 :            : 
   17641         [ #  # ]:          0 :         WARN_ON(i9xx_calc_dpll_params(48000, &clock) != 25154);
   17642                 :            : 
   17643                 :          0 :         DRM_DEBUG_KMS("enabling pipe %c due to force quirk (vco=%d dot=%d)\n",
   17644                 :            :                       pipe_name(pipe), clock.vco, clock.dot);
   17645                 :            : 
   17646                 :          0 :         fp = i9xx_dpll_compute_fp(&clock);
   17647                 :          0 :         dpll = DPLL_DVO_2X_MODE |
   17648                 :            :                 DPLL_VGA_MODE_DIS |
   17649                 :          0 :                 ((clock.p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT) |
   17650                 :            :                 PLL_P2_DIVIDE_BY_4 |
   17651                 :          0 :                 PLL_REF_INPUT_DREFCLK |
   17652                 :            :                 DPLL_VCO_ENABLE;
   17653                 :            : 
   17654                 :          0 :         I915_WRITE(FP0(pipe), fp);
   17655                 :          0 :         I915_WRITE(FP1(pipe), fp);
   17656                 :            : 
   17657                 :          0 :         I915_WRITE(HTOTAL(pipe), (640 - 1) | ((800 - 1) << 16));
   17658                 :          0 :         I915_WRITE(HBLANK(pipe), (640 - 1) | ((800 - 1) << 16));
   17659                 :          0 :         I915_WRITE(HSYNC(pipe), (656 - 1) | ((752 - 1) << 16));
   17660                 :          0 :         I915_WRITE(VTOTAL(pipe), (480 - 1) | ((525 - 1) << 16));
   17661                 :          0 :         I915_WRITE(VBLANK(pipe), (480 - 1) | ((525 - 1) << 16));
   17662                 :          0 :         I915_WRITE(VSYNC(pipe), (490 - 1) | ((492 - 1) << 16));
   17663                 :          0 :         I915_WRITE(PIPESRC(pipe), ((640 - 1) << 16) | (480 - 1));
   17664                 :            : 
   17665                 :            :         /*
   17666                 :            :          * Apparently we need to have VGA mode enabled prior to changing
   17667                 :            :          * the P1/P2 dividers. Otherwise the DPLL will keep using the old
   17668                 :            :          * dividers, even though the register value does change.
   17669                 :            :          */
   17670                 :          0 :         I915_WRITE(DPLL(pipe), dpll & ~DPLL_VGA_MODE_DIS);
   17671                 :          0 :         I915_WRITE(DPLL(pipe), dpll);
   17672                 :            : 
   17673                 :            :         /* Wait for the clocks to stabilize. */
   17674                 :          0 :         POSTING_READ(DPLL(pipe));
   17675                 :          0 :         udelay(150);
   17676                 :            : 
   17677                 :            :         /* The pixel multiplier can only be updated once the
   17678                 :            :          * DPLL is enabled and the clocks are stable.
   17679                 :            :          *
   17680                 :            :          * So write it again.
   17681                 :            :          */
   17682                 :          0 :         I915_WRITE(DPLL(pipe), dpll);
   17683                 :            : 
   17684                 :            :         /* We do this three times for luck */
   17685         [ #  # ]:          0 :         for (i = 0; i < 3 ; i++) {
   17686                 :          0 :                 I915_WRITE(DPLL(pipe), dpll);
   17687                 :          0 :                 POSTING_READ(DPLL(pipe));
   17688                 :          0 :                 udelay(150); /* wait for warmup */
   17689                 :            :         }
   17690                 :            : 
   17691                 :          0 :         I915_WRITE(PIPECONF(pipe), PIPECONF_ENABLE | PIPECONF_PROGRESSIVE);
   17692                 :          0 :         POSTING_READ(PIPECONF(pipe));
   17693                 :            : 
   17694                 :          0 :         intel_wait_for_pipe_scanline_moving(crtc);
   17695                 :          0 : }
   17696                 :            : 
   17697                 :          0 : void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
   17698                 :            : {
   17699                 :          0 :         struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17700                 :            : 
   17701                 :          0 :         DRM_DEBUG_KMS("disabling pipe %c due to force quirk\n",
   17702                 :            :                       pipe_name(pipe));
   17703                 :            : 
   17704         [ #  # ]:          0 :         WARN_ON(I915_READ(DSPCNTR(PLANE_A)) & DISPLAY_PLANE_ENABLE);
   17705         [ #  # ]:          0 :         WARN_ON(I915_READ(DSPCNTR(PLANE_B)) & DISPLAY_PLANE_ENABLE);
   17706         [ #  # ]:          0 :         WARN_ON(I915_READ(DSPCNTR(PLANE_C)) & DISPLAY_PLANE_ENABLE);
   17707         [ #  # ]:          0 :         WARN_ON(I915_READ(CURCNTR(PIPE_A)) & MCURSOR_MODE);
   17708         [ #  # ]:          0 :         WARN_ON(I915_READ(CURCNTR(PIPE_B)) & MCURSOR_MODE);
   17709                 :            : 
   17710                 :          0 :         I915_WRITE(PIPECONF(pipe), 0);
   17711                 :          0 :         POSTING_READ(PIPECONF(pipe));
   17712                 :            : 
   17713                 :          0 :         intel_wait_for_pipe_scanline_stopped(crtc);
   17714                 :            : 
   17715                 :          0 :         I915_WRITE(DPLL(pipe), DPLL_VGA_MODE_DIS);
   17716                 :          0 :         POSTING_READ(DPLL(pipe));
   17717                 :          0 : }
   17718                 :            : 
   17719                 :            : static void
   17720                 :          0 : intel_sanitize_plane_mapping(struct drm_i915_private *dev_priv)
   17721                 :            : {
   17722                 :          0 :         struct intel_crtc *crtc;
   17723                 :            : 
   17724         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 4)
   17725                 :            :                 return;
   17726                 :            : 
   17727         [ #  # ]:          0 :         for_each_intel_crtc(&dev_priv->drm, crtc) {
   17728                 :          0 :                 struct intel_plane *plane =
   17729                 :          0 :                         to_intel_plane(crtc->base.primary);
   17730                 :          0 :                 struct intel_crtc *plane_crtc;
   17731                 :          0 :                 enum pipe pipe;
   17732                 :            : 
   17733         [ #  # ]:          0 :                 if (!plane->get_hw_state(plane, &pipe))
   17734                 :          0 :                         continue;
   17735                 :            : 
   17736         [ #  # ]:          0 :                 if (pipe == crtc->pipe)
   17737                 :          0 :                         continue;
   17738                 :            : 
   17739                 :          0 :                 DRM_DEBUG_KMS("[PLANE:%d:%s] attached to the wrong pipe, disabling plane\n",
   17740                 :            :                               plane->base.base.id, plane->base.name);
   17741                 :            : 
   17742                 :          0 :                 plane_crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17743                 :          0 :                 intel_plane_disable_noatomic(plane_crtc, plane);
   17744                 :            :         }
   17745                 :            : }
   17746                 :            : 
   17747                 :          0 : static bool intel_crtc_has_encoders(struct intel_crtc *crtc)
   17748                 :            : {
   17749                 :          0 :         struct drm_device *dev = crtc->base.dev;
   17750                 :          0 :         struct intel_encoder *encoder;
   17751                 :            : 
   17752   [ #  #  #  # ]:          0 :         for_each_encoder_on_crtc(dev, &crtc->base, encoder)
   17753                 :            :                 return true;
   17754                 :            : 
   17755                 :            :         return false;
   17756                 :            : }
   17757                 :            : 
   17758                 :          0 : static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder)
   17759                 :            : {
   17760                 :          0 :         struct drm_device *dev = encoder->base.dev;
   17761                 :          0 :         struct intel_connector *connector;
   17762                 :            : 
   17763   [ #  #  #  # ]:          0 :         for_each_connector_on_encoder(dev, &encoder->base, connector)
   17764                 :            :                 return connector;
   17765                 :            : 
   17766                 :            :         return NULL;
   17767                 :            : }
   17768                 :            : 
   17769                 :          0 : static bool has_pch_trancoder(struct drm_i915_private *dev_priv,
   17770                 :            :                               enum pipe pch_transcoder)
   17771                 :            : {
   17772                 :          0 :         return HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
   17773   [ #  #  #  # ]:          0 :                 (HAS_PCH_LPT_H(dev_priv) && pch_transcoder == PIPE_A);
   17774                 :            : }
   17775                 :            : 
   17776                 :          0 : static void intel_sanitize_frame_start_delay(const struct intel_crtc_state *crtc_state)
   17777                 :            : {
   17778                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   17779         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   17780                 :          0 :         enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   17781                 :            : 
   17782   [ #  #  #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 9 ||
   17783         [ #  # ]:          0 :             IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
   17784                 :          0 :                 i915_reg_t reg = CHICKEN_TRANS(cpu_transcoder);
   17785                 :          0 :                 u32 val;
   17786                 :            : 
   17787         [ #  # ]:          0 :                 if (transcoder_is_dsi(cpu_transcoder))
   17788                 :          0 :                         return;
   17789                 :            : 
   17790                 :          0 :                 val = I915_READ(reg);
   17791                 :          0 :                 val &= ~HSW_FRAME_START_DELAY_MASK;
   17792                 :          0 :                 val |= HSW_FRAME_START_DELAY(0);
   17793                 :          0 :                 I915_WRITE(reg, val);
   17794                 :            :         } else {
   17795                 :          0 :                 i915_reg_t reg = PIPECONF(cpu_transcoder);
   17796                 :          0 :                 u32 val;
   17797                 :            : 
   17798                 :          0 :                 val = I915_READ(reg);
   17799                 :          0 :                 val &= ~PIPECONF_FRAME_START_DELAY_MASK;
   17800                 :          0 :                 val |= PIPECONF_FRAME_START_DELAY(0);
   17801                 :          0 :                 I915_WRITE(reg, val);
   17802                 :            :         }
   17803                 :            : 
   17804         [ #  # ]:          0 :         if (!crtc_state->has_pch_encoder)
   17805                 :            :                 return;
   17806                 :            : 
   17807         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv)) {
   17808                 :          0 :                 i915_reg_t reg = PCH_TRANSCONF(crtc->pipe);
   17809                 :          0 :                 u32 val;
   17810                 :            : 
   17811                 :          0 :                 val = I915_READ(reg);
   17812                 :          0 :                 val &= ~TRANS_FRAME_START_DELAY_MASK;
   17813                 :          0 :                 val |= TRANS_FRAME_START_DELAY(0);
   17814                 :          0 :                 I915_WRITE(reg, val);
   17815                 :            :         } else {
   17816         [ #  # ]:          0 :                 enum pipe pch_transcoder = intel_crtc_pch_transcoder(crtc);
   17817                 :          0 :                 i915_reg_t reg = TRANS_CHICKEN2(pch_transcoder);
   17818                 :          0 :                 u32 val;
   17819                 :            : 
   17820                 :          0 :                 val = I915_READ(reg);
   17821                 :          0 :                 val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
   17822                 :          0 :                 val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
   17823                 :          0 :                 I915_WRITE(reg, val);
   17824                 :            :         }
   17825                 :            : }
   17826                 :            : 
   17827                 :          0 : static void intel_sanitize_crtc(struct intel_crtc *crtc,
   17828                 :            :                                 struct drm_modeset_acquire_ctx *ctx)
   17829                 :            : {
   17830                 :          0 :         struct drm_device *dev = crtc->base.dev;
   17831         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   17832                 :          0 :         struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state);
   17833                 :            : 
   17834         [ #  # ]:          0 :         if (crtc_state->hw.active) {
   17835                 :          0 :                 struct intel_plane *plane;
   17836                 :            : 
   17837                 :            :                 /* Clear any frame start delays used for debugging left by the BIOS */
   17838                 :          0 :                 intel_sanitize_frame_start_delay(crtc_state);
   17839                 :            : 
   17840                 :            :                 /* Disable everything but the primary plane */
   17841   [ #  #  #  # ]:          0 :                 for_each_intel_plane_on_crtc(dev, crtc, plane) {
   17842                 :          0 :                         const struct intel_plane_state *plane_state =
   17843                 :          0 :                                 to_intel_plane_state(plane->base.state);
   17844                 :            : 
   17845         [ #  # ]:          0 :                         if (plane_state->uapi.visible &&
   17846         [ #  # ]:          0 :                             plane->base.type != DRM_PLANE_TYPE_PRIMARY)
   17847                 :          0 :                                 intel_plane_disable_noatomic(crtc, plane);
   17848                 :            :                 }
   17849                 :            : 
   17850                 :            :                 /*
   17851                 :            :                  * Disable any background color set by the BIOS, but enable the
   17852                 :            :                  * gamma and CSC to match how we program our planes.
   17853                 :            :                  */
   17854         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 9)
   17855                 :          0 :                         I915_WRITE(SKL_BOTTOM_COLOR(crtc->pipe),
   17856                 :            :                                    SKL_BOTTOM_COLOR_GAMMA_ENABLE |
   17857                 :            :                                    SKL_BOTTOM_COLOR_CSC_ENABLE);
   17858                 :            :         }
   17859                 :            : 
   17860                 :            :         /* Adjust the state of the output pipe according to whether we
   17861                 :            :          * have active connectors/encoders. */
   17862   [ #  #  #  # ]:          0 :         if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc))
   17863                 :          0 :                 intel_crtc_disable_noatomic(crtc, ctx);
   17864                 :            : 
   17865   [ #  #  #  # ]:          0 :         if (crtc_state->hw.active || HAS_GMCH(dev_priv)) {
   17866                 :            :                 /*
   17867                 :            :                  * We start out with underrun reporting disabled to avoid races.
   17868                 :            :                  * For correct bookkeeping mark this on active crtcs.
   17869                 :            :                  *
   17870                 :            :                  * Also on gmch platforms we dont have any hardware bits to
   17871                 :            :                  * disable the underrun reporting. Which means we need to start
   17872                 :            :                  * out with underrun reporting disabled also on inactive pipes,
   17873                 :            :                  * since otherwise we'll complain about the garbage we read when
   17874                 :            :                  * e.g. coming up after runtime pm.
   17875                 :            :                  *
   17876                 :            :                  * No protection against concurrent access is required - at
   17877                 :            :                  * worst a fifo underrun happens which also sets this to false.
   17878                 :            :                  */
   17879                 :          0 :                 crtc->cpu_fifo_underrun_disabled = true;
   17880                 :            :                 /*
   17881                 :            :                  * We track the PCH trancoder underrun reporting state
   17882                 :            :                  * within the crtc. With crtc for pipe A housing the underrun
   17883                 :            :                  * reporting state for PCH transcoder A, crtc for pipe B housing
   17884                 :            :                  * it for PCH transcoder B, etc. LPT-H has only PCH transcoder A,
   17885                 :            :                  * and marking underrun reporting as disabled for the non-existing
   17886                 :            :                  * PCH transcoders B and C would prevent enabling the south
   17887                 :            :                  * error interrupt (see cpt_can_enable_serr_int()).
   17888                 :            :                  */
   17889   [ #  #  #  # ]:          0 :                 if (has_pch_trancoder(dev_priv, crtc->pipe))
   17890                 :          0 :                         crtc->pch_fifo_underrun_disabled = true;
   17891                 :            :         }
   17892                 :          0 : }
   17893                 :            : 
   17894                 :          0 : static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state)
   17895                 :            : {
   17896         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   17897                 :            : 
   17898                 :            :         /*
   17899                 :            :          * Some SNB BIOSen (eg. ASUS K53SV) are known to misprogram
   17900                 :            :          * the hardware when a high res displays plugged in. DPLL P
   17901                 :            :          * divider is zero, and the pipe timings are bonkers. We'll
   17902                 :            :          * try to disable everything in that case.
   17903                 :            :          *
   17904                 :            :          * FIXME would be nice to be able to sanitize this state
   17905                 :            :          * without several WARNs, but for now let's take the easy
   17906                 :            :          * road.
   17907                 :            :          */
   17908                 :          0 :         return IS_GEN(dev_priv, 6) &&
   17909         [ #  # ]:          0 :                 crtc_state->hw.active &&
   17910   [ #  #  #  # ]:          0 :                 crtc_state->shared_dpll &&
   17911         [ #  # ]:          0 :                 crtc_state->port_clock == 0;
   17912                 :            : }
   17913                 :            : 
   17914                 :          0 : static void intel_sanitize_encoder(struct intel_encoder *encoder)
   17915                 :            : {
   17916         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   17917                 :          0 :         struct intel_connector *connector;
   17918                 :          0 :         struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
   17919                 :          0 :         struct intel_crtc_state *crtc_state = crtc ?
   17920         [ #  # ]:          0 :                 to_intel_crtc_state(crtc->base.state) : NULL;
   17921                 :            : 
   17922                 :            :         /* We need to check both for a crtc link (meaning that the
   17923                 :            :          * encoder is active and trying to read from a pipe) and the
   17924                 :            :          * pipe itself being active. */
   17925         [ #  # ]:          0 :         bool has_active_crtc = crtc_state &&
   17926         [ #  # ]:          0 :                 crtc_state->hw.active;
   17927                 :            : 
   17928   [ #  #  #  # ]:          0 :         if (crtc_state && has_bogus_dpll_config(crtc_state)) {
   17929                 :          0 :                 DRM_DEBUG_KMS("BIOS has misprogrammed the hardware. Disabling pipe %c\n",
   17930                 :            :                               pipe_name(crtc->pipe));
   17931                 :          0 :                 has_active_crtc = false;
   17932                 :            :         }
   17933                 :            : 
   17934                 :          0 :         connector = intel_encoder_find_connector(encoder);
   17935         [ #  # ]:          0 :         if (connector && !has_active_crtc) {
   17936                 :          0 :                 DRM_DEBUG_KMS("[ENCODER:%d:%s] has active connectors but no active pipe!\n",
   17937                 :            :                               encoder->base.base.id,
   17938                 :            :                               encoder->base.name);
   17939                 :            : 
   17940                 :            :                 /* Connector is active, but has no active pipe. This is
   17941                 :            :                  * fallout from our resume register restoring. Disable
   17942                 :            :                  * the encoder manually again. */
   17943         [ #  # ]:          0 :                 if (crtc_state) {
   17944                 :          0 :                         struct drm_encoder *best_encoder;
   17945                 :            : 
   17946                 :          0 :                         DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
   17947                 :            :                                       encoder->base.base.id,
   17948                 :            :                                       encoder->base.name);
   17949                 :            : 
   17950                 :            :                         /* avoid oopsing in case the hooks consult best_encoder */
   17951                 :          0 :                         best_encoder = connector->base.state->best_encoder;
   17952                 :          0 :                         connector->base.state->best_encoder = &encoder->base;
   17953                 :            : 
   17954         [ #  # ]:          0 :                         if (encoder->disable)
   17955                 :          0 :                                 encoder->disable(encoder, crtc_state,
   17956                 :          0 :                                                  connector->base.state);
   17957         [ #  # ]:          0 :                         if (encoder->post_disable)
   17958                 :          0 :                                 encoder->post_disable(encoder, crtc_state,
   17959                 :          0 :                                                       connector->base.state);
   17960                 :            : 
   17961                 :          0 :                         connector->base.state->best_encoder = best_encoder;
   17962                 :            :                 }
   17963                 :          0 :                 encoder->base.crtc = NULL;
   17964                 :            : 
   17965                 :            :                 /* Inconsistent output/port/pipe state happens presumably due to
   17966                 :            :                  * a bug in one of the get_hw_state functions. Or someplace else
   17967                 :            :                  * in our code, like the register restore mess on resume. Clamp
   17968                 :            :                  * things to off as a safer default. */
   17969                 :            : 
   17970                 :          0 :                 connector->base.dpms = DRM_MODE_DPMS_OFF;
   17971                 :          0 :                 connector->base.encoder = NULL;
   17972                 :            :         }
   17973                 :            : 
   17974                 :            :         /* notify opregion of the sanitized encoder state */
   17975                 :          0 :         intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
   17976                 :            : 
   17977         [ #  # ]:          0 :         if (INTEL_GEN(dev_priv) >= 11)
   17978                 :          0 :                 icl_sanitize_encoder_pll_mapping(encoder);
   17979                 :          0 : }
   17980                 :            : 
   17981                 :            : /* FIXME read out full plane state for all planes */
   17982                 :          0 : static void readout_plane_state(struct drm_i915_private *dev_priv)
   17983                 :            : {
   17984                 :          0 :         struct intel_plane *plane;
   17985                 :          0 :         struct intel_crtc *crtc;
   17986                 :            : 
   17987         [ #  # ]:          0 :         for_each_intel_plane(&dev_priv->drm, plane) {
   17988                 :          0 :                 struct intel_plane_state *plane_state =
   17989                 :          0 :                         to_intel_plane_state(plane->base.state);
   17990                 :          0 :                 struct intel_crtc_state *crtc_state;
   17991                 :          0 :                 enum pipe pipe = PIPE_A;
   17992                 :          0 :                 bool visible;
   17993                 :            : 
   17994                 :          0 :                 visible = plane->get_hw_state(plane, &pipe);
   17995                 :            : 
   17996         [ #  # ]:          0 :                 crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17997                 :          0 :                 crtc_state = to_intel_crtc_state(crtc->base.state);
   17998                 :            : 
   17999         [ #  # ]:          0 :                 intel_set_plane_visible(crtc_state, plane_state, visible);
   18000                 :            : 
   18001         [ #  # ]:          0 :                 DRM_DEBUG_KMS("[PLANE:%d:%s] hw state readout: %s, pipe %c\n",
   18002                 :            :                               plane->base.base.id, plane->base.name,
   18003                 :            :                               enableddisabled(visible), pipe_name(pipe));
   18004                 :            :         }
   18005                 :            : 
   18006         [ #  # ]:          0 :         for_each_intel_crtc(&dev_priv->drm, crtc) {
   18007                 :          0 :                 struct intel_crtc_state *crtc_state =
   18008                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18009                 :            : 
   18010                 :          0 :                 fixup_active_planes(crtc_state);
   18011                 :            :         }
   18012                 :          0 : }
   18013                 :            : 
   18014                 :          0 : static void intel_modeset_readout_hw_state(struct drm_device *dev)
   18015                 :            : {
   18016                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   18017                 :          0 :         enum pipe pipe;
   18018                 :          0 :         struct intel_crtc *crtc;
   18019                 :          0 :         struct intel_encoder *encoder;
   18020                 :          0 :         struct intel_connector *connector;
   18021                 :          0 :         struct drm_connector_list_iter conn_iter;
   18022                 :          0 :         int i;
   18023                 :            : 
   18024                 :          0 :         dev_priv->active_pipes = 0;
   18025                 :            : 
   18026         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   18027                 :          0 :                 struct intel_crtc_state *crtc_state =
   18028                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18029                 :            : 
   18030                 :          0 :                 __drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
   18031                 :          0 :                 intel_crtc_free_hw_state(crtc_state);
   18032                 :          0 :                 intel_crtc_state_reset(crtc_state, crtc);
   18033                 :            : 
   18034                 :          0 :                 crtc_state->hw.active = crtc_state->hw.enable =
   18035                 :          0 :                         dev_priv->display.get_pipe_config(crtc, crtc_state);
   18036                 :            : 
   18037                 :          0 :                 crtc->base.enabled = crtc_state->hw.enable;
   18038                 :          0 :                 crtc->active = crtc_state->hw.active;
   18039                 :            : 
   18040         [ #  # ]:          0 :                 if (crtc_state->hw.active)
   18041                 :          0 :                         dev_priv->active_pipes |= BIT(crtc->pipe);
   18042                 :            : 
   18043         [ #  # ]:          0 :                 DRM_DEBUG_KMS("[CRTC:%d:%s] hw state readout: %s\n",
   18044                 :            :                               crtc->base.base.id, crtc->base.name,
   18045                 :            :                               enableddisabled(crtc_state->hw.active));
   18046                 :            :         }
   18047                 :            : 
   18048                 :          0 :         readout_plane_state(dev_priv);
   18049                 :            : 
   18050         [ #  # ]:          0 :         for (i = 0; i < dev_priv->num_shared_dpll; i++) {
   18051                 :          0 :                 struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
   18052                 :            : 
   18053                 :          0 :                 pll->on = pll->info->funcs->get_hw_state(dev_priv, pll,
   18054                 :            :                                                         &pll->state.hw_state);
   18055                 :            : 
   18056   [ #  #  #  # ]:          0 :                 if (IS_ELKHARTLAKE(dev_priv) && pll->on &&
   18057         [ #  # ]:          0 :                     pll->info->id == DPLL_ID_EHL_DPLL4) {
   18058                 :          0 :                         pll->wakeref = intel_display_power_get(dev_priv,
   18059                 :            :                                                                POWER_DOMAIN_DPLL_DC_OFF);
   18060                 :            :                 }
   18061                 :            : 
   18062                 :          0 :                 pll->state.crtc_mask = 0;
   18063         [ #  # ]:          0 :                 for_each_intel_crtc(dev, crtc) {
   18064                 :          0 :                         struct intel_crtc_state *crtc_state =
   18065                 :          0 :                                 to_intel_crtc_state(crtc->base.state);
   18066                 :            : 
   18067         [ #  # ]:          0 :                         if (crtc_state->hw.active &&
   18068         [ #  # ]:          0 :                             crtc_state->shared_dpll == pll)
   18069                 :          0 :                                 pll->state.crtc_mask |= 1 << crtc->pipe;
   18070                 :            :                 }
   18071                 :          0 :                 pll->active_mask = pll->state.crtc_mask;
   18072                 :            : 
   18073                 :          0 :                 DRM_DEBUG_KMS("%s hw state readout: crtc_mask 0x%08x, on %i\n",
   18074                 :            :                               pll->info->name, pll->state.crtc_mask, pll->on);
   18075                 :            :         }
   18076                 :            : 
   18077         [ #  # ]:          0 :         for_each_intel_encoder(dev, encoder) {
   18078                 :          0 :                 pipe = 0;
   18079                 :            : 
   18080         [ #  # ]:          0 :                 if (encoder->get_hw_state(encoder, &pipe)) {
   18081                 :          0 :                         struct intel_crtc_state *crtc_state;
   18082                 :            : 
   18083                 :          0 :                         crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   18084                 :          0 :                         crtc_state = to_intel_crtc_state(crtc->base.state);
   18085                 :            : 
   18086                 :          0 :                         encoder->base.crtc = &crtc->base;
   18087                 :          0 :                         encoder->get_config(encoder, crtc_state);
   18088                 :            :                 } else {
   18089                 :          0 :                         encoder->base.crtc = NULL;
   18090                 :            :                 }
   18091                 :            : 
   18092         [ #  # ]:          0 :                 DRM_DEBUG_KMS("[ENCODER:%d:%s] hw state readout: %s, pipe %c\n",
   18093                 :            :                               encoder->base.base.id, encoder->base.name,
   18094                 :            :                               enableddisabled(encoder->base.crtc),
   18095                 :            :                               pipe_name(pipe));
   18096                 :            :         }
   18097                 :            : 
   18098                 :          0 :         drm_connector_list_iter_begin(dev, &conn_iter);
   18099         [ #  # ]:          0 :         for_each_intel_connector_iter(connector, &conn_iter) {
   18100         [ #  # ]:          0 :                 if (connector->get_hw_state(connector)) {
   18101                 :          0 :                         struct intel_crtc_state *crtc_state;
   18102                 :          0 :                         struct intel_crtc *crtc;
   18103                 :            : 
   18104                 :          0 :                         connector->base.dpms = DRM_MODE_DPMS_ON;
   18105                 :            : 
   18106                 :          0 :                         encoder = connector->encoder;
   18107                 :          0 :                         connector->base.encoder = &encoder->base;
   18108                 :            : 
   18109                 :          0 :                         crtc = to_intel_crtc(encoder->base.crtc);
   18110         [ #  # ]:          0 :                         crtc_state = crtc ? to_intel_crtc_state(crtc->base.state) : NULL;
   18111                 :            : 
   18112   [ #  #  #  # ]:          0 :                         if (crtc_state && crtc_state->hw.active) {
   18113                 :            :                                 /*
   18114                 :            :                                  * This has to be done during hardware readout
   18115                 :            :                                  * because anything calling .crtc_disable may
   18116                 :            :                                  * rely on the connector_mask being accurate.
   18117                 :            :                                  */
   18118                 :          0 :                                 crtc_state->uapi.connector_mask |=
   18119                 :          0 :                                         drm_connector_mask(&connector->base);
   18120                 :          0 :                                 crtc_state->uapi.encoder_mask |=
   18121                 :            :                                         drm_encoder_mask(&encoder->base);
   18122                 :            :                         }
   18123                 :            :                 } else {
   18124                 :          0 :                         connector->base.dpms = DRM_MODE_DPMS_OFF;
   18125                 :          0 :                         connector->base.encoder = NULL;
   18126                 :            :                 }
   18127         [ #  # ]:          0 :                 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] hw state readout: %s\n",
   18128                 :            :                               connector->base.base.id, connector->base.name,
   18129                 :            :                               enableddisabled(connector->base.encoder));
   18130                 :            :         }
   18131                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   18132                 :            : 
   18133         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   18134                 :          0 :                 struct intel_bw_state *bw_state =
   18135                 :          0 :                         to_intel_bw_state(dev_priv->bw_obj.state);
   18136                 :          0 :                 struct intel_crtc_state *crtc_state =
   18137                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18138                 :          0 :                 struct intel_plane *plane;
   18139                 :          0 :                 int min_cdclk = 0;
   18140                 :            : 
   18141         [ #  # ]:          0 :                 if (crtc_state->hw.active) {
   18142                 :          0 :                         struct drm_display_mode *mode = &crtc_state->hw.mode;
   18143                 :            : 
   18144                 :          0 :                         intel_mode_from_pipe_config(&crtc_state->hw.adjusted_mode,
   18145                 :            :                                                     crtc_state);
   18146                 :            : 
   18147                 :          0 :                         *mode = crtc_state->hw.adjusted_mode;
   18148                 :          0 :                         mode->hdisplay = crtc_state->pipe_src_w;
   18149                 :          0 :                         mode->vdisplay = crtc_state->pipe_src_h;
   18150                 :            : 
   18151                 :            :                         /*
   18152                 :            :                          * The initial mode needs to be set in order to keep
   18153                 :            :                          * the atomic core happy. It wants a valid mode if the
   18154                 :            :                          * crtc's enabled, so we do the above call.
   18155                 :            :                          *
   18156                 :            :                          * But we don't set all the derived state fully, hence
   18157                 :            :                          * set a flag to indicate that a full recalculation is
   18158                 :            :                          * needed on the next commit.
   18159                 :            :                          */
   18160                 :          0 :                         mode->private_flags = I915_MODE_FLAG_INHERITED;
   18161                 :            : 
   18162         [ #  # ]:          0 :                         intel_crtc_compute_pixel_rate(crtc_state);
   18163                 :            : 
   18164                 :          0 :                         intel_crtc_update_active_timings(crtc_state);
   18165                 :            : 
   18166                 :          0 :                         intel_crtc_copy_hw_to_uapi_state(crtc_state);
   18167                 :            :                 }
   18168                 :            : 
   18169   [ #  #  #  # ]:          0 :                 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
   18170                 :          0 :                         const struct intel_plane_state *plane_state =
   18171                 :          0 :                                 to_intel_plane_state(plane->base.state);
   18172                 :            : 
   18173                 :            :                         /*
   18174                 :            :                          * FIXME don't have the fb yet, so can't
   18175                 :            :                          * use intel_plane_data_rate() :(
   18176                 :            :                          */
   18177         [ #  # ]:          0 :                         if (plane_state->uapi.visible)
   18178                 :          0 :                                 crtc_state->data_rate[plane->id] =
   18179                 :          0 :                                         4 * crtc_state->pixel_rate;
   18180                 :            :                         /*
   18181                 :            :                          * FIXME don't have the fb yet, so can't
   18182                 :            :                          * use plane->min_cdclk() :(
   18183                 :            :                          */
   18184   [ #  #  #  # ]:          0 :                         if (plane_state->uapi.visible && plane->min_cdclk) {
   18185         [ #  # ]:          0 :                                 if (crtc_state->double_wide ||
   18186   [ #  #  #  # ]:          0 :                                     INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   18187                 :          0 :                                         crtc_state->min_cdclk[plane->id] =
   18188                 :          0 :                                                 DIV_ROUND_UP(crtc_state->pixel_rate, 2);
   18189                 :            :                                 else
   18190                 :          0 :                                         crtc_state->min_cdclk[plane->id] =
   18191                 :          0 :                                                 crtc_state->pixel_rate;
   18192                 :            :                         }
   18193                 :          0 :                         DRM_DEBUG_KMS("[PLANE:%d:%s] min_cdclk %d kHz\n",
   18194                 :            :                                       plane->base.base.id, plane->base.name,
   18195                 :            :                                       crtc_state->min_cdclk[plane->id]);
   18196                 :            :                 }
   18197                 :            : 
   18198         [ #  # ]:          0 :                 if (crtc_state->hw.active) {
   18199                 :          0 :                         min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
   18200   [ #  #  #  # ]:          0 :                         if (WARN_ON(min_cdclk < 0))
   18201                 :          0 :                                 min_cdclk = 0;
   18202                 :            :                 }
   18203                 :            : 
   18204                 :          0 :                 dev_priv->min_cdclk[crtc->pipe] = min_cdclk;
   18205                 :          0 :                 dev_priv->min_voltage_level[crtc->pipe] =
   18206                 :          0 :                         crtc_state->min_voltage_level;
   18207                 :            : 
   18208                 :          0 :                 intel_bw_crtc_update(bw_state, crtc_state);
   18209                 :            : 
   18210                 :          0 :                 intel_pipe_config_sanity_check(dev_priv, crtc_state);
   18211                 :            :         }
   18212                 :          0 : }
   18213                 :            : 
   18214                 :            : static void
   18215                 :          0 : get_encoder_power_domains(struct drm_i915_private *dev_priv)
   18216                 :            : {
   18217                 :          0 :         struct intel_encoder *encoder;
   18218                 :            : 
   18219         [ #  # ]:          0 :         for_each_intel_encoder(&dev_priv->drm, encoder) {
   18220                 :          0 :                 struct intel_crtc_state *crtc_state;
   18221                 :            : 
   18222         [ #  # ]:          0 :                 if (!encoder->get_power_domains)
   18223                 :          0 :                         continue;
   18224                 :            : 
   18225                 :            :                 /*
   18226                 :            :                  * MST-primary and inactive encoders don't have a crtc state
   18227                 :            :                  * and neither of these require any power domain references.
   18228                 :            :                  */
   18229         [ #  # ]:          0 :                 if (!encoder->base.crtc)
   18230                 :          0 :                         continue;
   18231                 :            : 
   18232                 :          0 :                 crtc_state = to_intel_crtc_state(encoder->base.crtc->state);
   18233                 :          0 :                 encoder->get_power_domains(encoder, crtc_state);
   18234                 :            :         }
   18235                 :          0 : }
   18236                 :            : 
   18237                 :          0 : static void intel_early_display_was(struct drm_i915_private *dev_priv)
   18238                 :            : {
   18239                 :            :         /*
   18240                 :            :          * Display WA #1185 WaDisableDARBFClkGating:cnl,glk,icl,ehl,tgl
   18241                 :            :          * Also known as Wa_14010480278.
   18242                 :            :          */
   18243   [ #  #  #  # ]:          0 :         if (IS_GEN_RANGE(dev_priv, 10, 12) || IS_GEMINILAKE(dev_priv))
   18244                 :          0 :                 I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
   18245                 :            :                            DARBF_GATING_DIS);
   18246                 :            : 
   18247         [ #  # ]:          0 :         if (IS_HASWELL(dev_priv)) {
   18248                 :            :                 /*
   18249                 :            :                  * WaRsPkgCStateDisplayPMReq:hsw
   18250                 :            :                  * System hang if this isn't done before disabling all planes!
   18251                 :            :                  */
   18252                 :          0 :                 I915_WRITE(CHICKEN_PAR1_1,
   18253                 :            :                            I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
   18254                 :            :         }
   18255                 :          0 : }
   18256                 :            : 
   18257                 :          0 : static void ibx_sanitize_pch_hdmi_port(struct drm_i915_private *dev_priv,
   18258                 :            :                                        enum port port, i915_reg_t hdmi_reg)
   18259                 :            : {
   18260                 :          0 :         u32 val = I915_READ(hdmi_reg);
   18261                 :            : 
   18262         [ #  # ]:          0 :         if (val & SDVO_ENABLE ||
   18263         [ #  # ]:          0 :             (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A))
   18264                 :            :                 return;
   18265                 :            : 
   18266                 :          0 :         DRM_DEBUG_KMS("Sanitizing transcoder select for HDMI %c\n",
   18267                 :            :                       port_name(port));
   18268                 :            : 
   18269                 :          0 :         val &= ~SDVO_PIPE_SEL_MASK;
   18270                 :          0 :         val |= SDVO_PIPE_SEL(PIPE_A);
   18271                 :            : 
   18272                 :          0 :         I915_WRITE(hdmi_reg, val);
   18273                 :            : }
   18274                 :            : 
   18275                 :          0 : static void ibx_sanitize_pch_dp_port(struct drm_i915_private *dev_priv,
   18276                 :            :                                      enum port port, i915_reg_t dp_reg)
   18277                 :            : {
   18278                 :          0 :         u32 val = I915_READ(dp_reg);
   18279                 :            : 
   18280         [ #  # ]:          0 :         if (val & DP_PORT_EN ||
   18281         [ #  # ]:          0 :             (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A))
   18282                 :            :                 return;
   18283                 :            : 
   18284                 :          0 :         DRM_DEBUG_KMS("Sanitizing transcoder select for DP %c\n",
   18285                 :            :                       port_name(port));
   18286                 :            : 
   18287                 :          0 :         val &= ~DP_PIPE_SEL_MASK;
   18288                 :          0 :         val |= DP_PIPE_SEL(PIPE_A);
   18289                 :            : 
   18290                 :          0 :         I915_WRITE(dp_reg, val);
   18291                 :            : }
   18292                 :            : 
   18293                 :          0 : static void ibx_sanitize_pch_ports(struct drm_i915_private *dev_priv)
   18294                 :            : {
   18295                 :            :         /*
   18296                 :            :          * The BIOS may select transcoder B on some of the PCH
   18297                 :            :          * ports even it doesn't enable the port. This would trip
   18298                 :            :          * assert_pch_dp_disabled() and assert_pch_hdmi_disabled().
   18299                 :            :          * Sanitize the transcoder select bits to prevent that. We
   18300                 :            :          * assume that the BIOS never actually enabled the port,
   18301                 :            :          * because if it did we'd actually have to toggle the port
   18302                 :            :          * on and back off to make the transcoder A select stick
   18303                 :            :          * (see. intel_dp_link_down(), intel_disable_hdmi(),
   18304                 :            :          * intel_disable_sdvo()).
   18305                 :            :          */
   18306                 :          0 :         ibx_sanitize_pch_dp_port(dev_priv, PORT_B, PCH_DP_B);
   18307                 :          0 :         ibx_sanitize_pch_dp_port(dev_priv, PORT_C, PCH_DP_C);
   18308                 :          0 :         ibx_sanitize_pch_dp_port(dev_priv, PORT_D, PCH_DP_D);
   18309                 :            : 
   18310                 :            :         /* PCH SDVOB multiplex with HDMIB */
   18311                 :          0 :         ibx_sanitize_pch_hdmi_port(dev_priv, PORT_B, PCH_HDMIB);
   18312                 :          0 :         ibx_sanitize_pch_hdmi_port(dev_priv, PORT_C, PCH_HDMIC);
   18313                 :          0 :         ibx_sanitize_pch_hdmi_port(dev_priv, PORT_D, PCH_HDMID);
   18314                 :          0 : }
   18315                 :            : 
   18316                 :            : /* Scan out the current hw modeset state,
   18317                 :            :  * and sanitizes it to the current state
   18318                 :            :  */
   18319                 :            : static void
   18320                 :          0 : intel_modeset_setup_hw_state(struct drm_device *dev,
   18321                 :            :                              struct drm_modeset_acquire_ctx *ctx)
   18322                 :            : {
   18323                 :          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   18324                 :          0 :         struct intel_encoder *encoder;
   18325                 :          0 :         struct intel_crtc *crtc;
   18326                 :          0 :         intel_wakeref_t wakeref;
   18327                 :          0 :         int i;
   18328                 :            : 
   18329                 :          0 :         wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
   18330                 :            : 
   18331                 :          0 :         intel_early_display_was(dev_priv);
   18332                 :          0 :         intel_modeset_readout_hw_state(dev);
   18333                 :            : 
   18334                 :            :         /* HW state is read out, now we need to sanitize this mess. */
   18335                 :            : 
   18336                 :            :         /* Sanitize the TypeC port mode upfront, encoders depend on this */
   18337         [ #  # ]:          0 :         for_each_intel_encoder(dev, encoder) {
   18338         [ #  # ]:          0 :                 enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
   18339                 :            : 
   18340                 :            :                 /* We need to sanitize only the MST primary port. */
   18341   [ #  #  #  # ]:          0 :                 if (encoder->type != INTEL_OUTPUT_DP_MST &&
   18342                 :            :                     intel_phy_is_tc(dev_priv, phy))
   18343         [ #  # ]:          0 :                         intel_tc_port_sanitize(enc_to_dig_port(encoder));
   18344                 :            :         }
   18345                 :            : 
   18346                 :          0 :         get_encoder_power_domains(dev_priv);
   18347                 :            : 
   18348         [ #  # ]:          0 :         if (HAS_PCH_IBX(dev_priv))
   18349                 :          0 :                 ibx_sanitize_pch_ports(dev_priv);
   18350                 :            : 
   18351                 :            :         /*
   18352                 :            :          * intel_sanitize_plane_mapping() may need to do vblank
   18353                 :            :          * waits, so we need vblank interrupts restored beforehand.
   18354                 :            :          */
   18355         [ #  # ]:          0 :         for_each_intel_crtc(&dev_priv->drm, crtc) {
   18356                 :          0 :                 struct intel_crtc_state *crtc_state =
   18357                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18358                 :            : 
   18359                 :          0 :                 drm_crtc_vblank_reset(&crtc->base);
   18360                 :            : 
   18361         [ #  # ]:          0 :                 if (crtc_state->hw.active)
   18362                 :          0 :                         intel_crtc_vblank_on(crtc_state);
   18363                 :            :         }
   18364                 :            : 
   18365                 :          0 :         intel_sanitize_plane_mapping(dev_priv);
   18366                 :            : 
   18367         [ #  # ]:          0 :         for_each_intel_encoder(dev, encoder)
   18368                 :          0 :                 intel_sanitize_encoder(encoder);
   18369                 :            : 
   18370         [ #  # ]:          0 :         for_each_intel_crtc(&dev_priv->drm, crtc) {
   18371                 :          0 :                 struct intel_crtc_state *crtc_state =
   18372                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18373                 :            : 
   18374                 :          0 :                 intel_sanitize_crtc(crtc, ctx);
   18375                 :          0 :                 intel_dump_pipe_config(crtc_state, NULL, "[setup_hw_state]");
   18376                 :            :         }
   18377                 :            : 
   18378                 :          0 :         intel_modeset_update_connector_atomic_state(dev);
   18379                 :            : 
   18380         [ #  # ]:          0 :         for (i = 0; i < dev_priv->num_shared_dpll; i++) {
   18381                 :          0 :                 struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
   18382                 :            : 
   18383   [ #  #  #  # ]:          0 :                 if (!pll->on || pll->active_mask)
   18384                 :          0 :                         continue;
   18385                 :            : 
   18386                 :          0 :                 DRM_DEBUG_KMS("%s enabled but not in use, disabling\n",
   18387                 :            :                               pll->info->name);
   18388                 :            : 
   18389                 :          0 :                 pll->info->funcs->disable(dev_priv, pll);
   18390                 :          0 :                 pll->on = false;
   18391                 :            :         }
   18392                 :            : 
   18393   [ #  #  #  # ]:          0 :         if (IS_G4X(dev_priv)) {
   18394                 :          0 :                 g4x_wm_get_hw_state(dev_priv);
   18395                 :          0 :                 g4x_wm_sanitize(dev_priv);
   18396   [ #  #  #  # ]:          0 :         } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   18397                 :          0 :                 vlv_wm_get_hw_state(dev_priv);
   18398                 :          0 :                 vlv_wm_sanitize(dev_priv);
   18399         [ #  # ]:          0 :         } else if (INTEL_GEN(dev_priv) >= 9) {
   18400                 :          0 :                 skl_wm_get_hw_state(dev_priv);
   18401         [ #  # ]:          0 :         } else if (HAS_PCH_SPLIT(dev_priv)) {
   18402                 :          0 :                 ilk_wm_get_hw_state(dev_priv);
   18403                 :            :         }
   18404                 :            : 
   18405         [ #  # ]:          0 :         for_each_intel_crtc(dev, crtc) {
   18406                 :          0 :                 struct intel_crtc_state *crtc_state =
   18407                 :          0 :                         to_intel_crtc_state(crtc->base.state);
   18408                 :          0 :                 u64 put_domains;
   18409                 :            : 
   18410                 :          0 :                 put_domains = modeset_get_crtc_power_domains(crtc_state);
   18411   [ #  #  #  # ]:          0 :                 if (WARN_ON(put_domains))
   18412                 :            :                         modeset_put_power_domains(dev_priv, put_domains);
   18413                 :            :         }
   18414                 :            : 
   18415                 :          0 :         intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
   18416                 :          0 : }
   18417                 :            : 
   18418                 :          0 : void intel_display_resume(struct drm_device *dev)
   18419                 :            : {
   18420         [ #  # ]:          0 :         struct drm_i915_private *dev_priv = to_i915(dev);
   18421                 :          0 :         struct drm_atomic_state *state = dev_priv->modeset_restore_state;
   18422                 :          0 :         struct drm_modeset_acquire_ctx ctx;
   18423                 :          0 :         int ret;
   18424                 :            : 
   18425                 :          0 :         dev_priv->modeset_restore_state = NULL;
   18426         [ #  # ]:          0 :         if (state)
   18427                 :          0 :                 state->acquire_ctx = &ctx;
   18428                 :            : 
   18429                 :          0 :         drm_modeset_acquire_init(&ctx, 0);
   18430                 :            : 
   18431                 :          0 :         while (1) {
   18432                 :          0 :                 ret = drm_modeset_lock_all_ctx(dev, &ctx);
   18433         [ #  # ]:          0 :                 if (ret != -EDEADLK)
   18434                 :            :                         break;
   18435                 :            : 
   18436                 :          0 :                 drm_modeset_backoff(&ctx);
   18437                 :            :         }
   18438                 :            : 
   18439         [ #  # ]:          0 :         if (!ret)
   18440                 :          0 :                 ret = __intel_display_resume(dev, state, &ctx);
   18441                 :            : 
   18442                 :          0 :         intel_enable_ipc(dev_priv);
   18443                 :          0 :         drm_modeset_drop_locks(&ctx);
   18444                 :          0 :         drm_modeset_acquire_fini(&ctx);
   18445                 :            : 
   18446         [ #  # ]:          0 :         if (ret)
   18447                 :          0 :                 DRM_ERROR("Restoring old state failed with %i\n", ret);
   18448         [ #  # ]:          0 :         if (state)
   18449                 :          0 :                 drm_atomic_state_put(state);
   18450                 :          0 : }
   18451                 :            : 
   18452                 :          0 : static void intel_hpd_poll_fini(struct drm_i915_private *i915)
   18453                 :            : {
   18454                 :          0 :         struct intel_connector *connector;
   18455                 :          0 :         struct drm_connector_list_iter conn_iter;
   18456                 :            : 
   18457                 :            :         /* Kill all the work that may have been queued by hpd. */
   18458                 :          0 :         drm_connector_list_iter_begin(&i915->drm, &conn_iter);
   18459         [ #  # ]:          0 :         for_each_intel_connector_iter(connector, &conn_iter) {
   18460         [ #  # ]:          0 :                 if (connector->modeset_retry_work.func)
   18461                 :          0 :                         cancel_work_sync(&connector->modeset_retry_work);
   18462         [ #  # ]:          0 :                 if (connector->hdcp.shim) {
   18463                 :          0 :                         cancel_delayed_work_sync(&connector->hdcp.check_work);
   18464                 :          0 :                         cancel_work_sync(&connector->hdcp.prop_work);
   18465                 :            :                 }
   18466                 :            :         }
   18467                 :          0 :         drm_connector_list_iter_end(&conn_iter);
   18468                 :          0 : }
   18469                 :            : 
   18470                 :          0 : void intel_modeset_driver_remove(struct drm_i915_private *i915)
   18471                 :            : {
   18472                 :          0 :         flush_workqueue(i915->flip_wq);
   18473                 :          0 :         flush_workqueue(i915->modeset_wq);
   18474                 :            : 
   18475                 :          0 :         flush_work(&i915->atomic_helper.free_work);
   18476         [ #  # ]:          0 :         WARN_ON(!llist_empty(&i915->atomic_helper.free_list));
   18477                 :            : 
   18478                 :            :         /*
   18479                 :            :          * Interrupts and polling as the first thing to avoid creating havoc.
   18480                 :            :          * Too much stuff here (turning of connectors, ...) would
   18481                 :            :          * experience fancy races otherwise.
   18482                 :            :          */
   18483                 :          0 :         intel_irq_uninstall(i915);
   18484                 :            : 
   18485                 :            :         /*
   18486                 :            :          * Due to the hpd irq storm handling the hotplug work can re-arm the
   18487                 :            :          * poll handlers. Hence disable polling after hpd handling is shut down.
   18488                 :            :          */
   18489                 :          0 :         intel_hpd_poll_fini(i915);
   18490                 :            : 
   18491                 :            :         /*
   18492                 :            :          * MST topology needs to be suspended so we don't have any calls to
   18493                 :            :          * fbdev after it's finalized. MST will be destroyed later as part of
   18494                 :            :          * drm_mode_config_cleanup()
   18495                 :            :          */
   18496                 :          0 :         intel_dp_mst_suspend(i915);
   18497                 :            : 
   18498                 :            :         /* poll work can call into fbdev, hence clean that up afterwards */
   18499                 :          0 :         intel_fbdev_fini(i915);
   18500                 :            : 
   18501                 :          0 :         intel_unregister_dsm_handler();
   18502                 :            : 
   18503                 :          0 :         intel_fbc_global_disable(i915);
   18504                 :            : 
   18505                 :            :         /* flush any delayed tasks or pending work */
   18506                 :          0 :         flush_scheduled_work();
   18507                 :            : 
   18508                 :          0 :         intel_hdcp_component_fini(i915);
   18509                 :            : 
   18510                 :          0 :         drm_mode_config_cleanup(&i915->drm);
   18511                 :            : 
   18512                 :          0 :         intel_overlay_cleanup(i915);
   18513                 :            : 
   18514                 :          0 :         intel_gmbus_teardown(i915);
   18515                 :            : 
   18516                 :          0 :         intel_bw_cleanup(i915);
   18517                 :            : 
   18518                 :          0 :         destroy_workqueue(i915->flip_wq);
   18519                 :          0 :         destroy_workqueue(i915->modeset_wq);
   18520                 :            : 
   18521                 :          0 :         intel_fbc_cleanup_cfb(i915);
   18522                 :          0 : }
   18523                 :            : 
   18524                 :            : #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
   18525                 :            : 
   18526                 :            : struct intel_display_error_state {
   18527                 :            : 
   18528                 :            :         u32 power_well_driver;
   18529                 :            : 
   18530                 :            :         struct intel_cursor_error_state {
   18531                 :            :                 u32 control;
   18532                 :            :                 u32 position;
   18533                 :            :                 u32 base;
   18534                 :            :                 u32 size;
   18535                 :            :         } cursor[I915_MAX_PIPES];
   18536                 :            : 
   18537                 :            :         struct intel_pipe_error_state {
   18538                 :            :                 bool power_domain_on;
   18539                 :            :                 u32 source;
   18540                 :            :                 u32 stat;
   18541                 :            :         } pipe[I915_MAX_PIPES];
   18542                 :            : 
   18543                 :            :         struct intel_plane_error_state {
   18544                 :            :                 u32 control;
   18545                 :            :                 u32 stride;
   18546                 :            :                 u32 size;
   18547                 :            :                 u32 pos;
   18548                 :            :                 u32 addr;
   18549                 :            :                 u32 surface;
   18550                 :            :                 u32 tile_offset;
   18551                 :            :         } plane[I915_MAX_PIPES];
   18552                 :            : 
   18553                 :            :         struct intel_transcoder_error_state {
   18554                 :            :                 bool available;
   18555                 :            :                 bool power_domain_on;
   18556                 :            :                 enum transcoder cpu_transcoder;
   18557                 :            : 
   18558                 :            :                 u32 conf;
   18559                 :            : 
   18560                 :            :                 u32 htotal;
   18561                 :            :                 u32 hblank;
   18562                 :            :                 u32 hsync;
   18563                 :            :                 u32 vtotal;
   18564                 :            :                 u32 vblank;
   18565                 :            :                 u32 vsync;
   18566                 :            :         } transcoder[5];
   18567                 :            : };
   18568                 :            : 
   18569                 :            : struct intel_display_error_state *
   18570                 :          0 : intel_display_capture_error_state(struct drm_i915_private *dev_priv)
   18571                 :            : {
   18572                 :          0 :         struct intel_display_error_state *error;
   18573                 :          0 :         int transcoders[] = {
   18574                 :            :                 TRANSCODER_A,
   18575                 :            :                 TRANSCODER_B,
   18576                 :            :                 TRANSCODER_C,
   18577                 :            :                 TRANSCODER_D,
   18578                 :            :                 TRANSCODER_EDP,
   18579                 :            :         };
   18580                 :          0 :         int i;
   18581                 :            : 
   18582                 :          0 :         BUILD_BUG_ON(ARRAY_SIZE(transcoders) != ARRAY_SIZE(error->transcoder));
   18583                 :            : 
   18584   [ #  #  #  # ]:          0 :         if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
   18585                 :          0 :                 return NULL;
   18586                 :            : 
   18587                 :          0 :         error = kzalloc(sizeof(*error), GFP_ATOMIC);
   18588         [ #  # ]:          0 :         if (error == NULL)
   18589                 :            :                 return NULL;
   18590                 :            : 
   18591   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
   18592                 :          0 :                 error->power_well_driver = I915_READ(HSW_PWR_WELL_CTL2);
   18593                 :            : 
   18594   [ #  #  #  # ]:          0 :         for_each_pipe(dev_priv, i) {
   18595                 :          0 :                 error->pipe[i].power_domain_on =
   18596                 :          0 :                         __intel_display_power_is_enabled(dev_priv,
   18597                 :          0 :                                                          POWER_DOMAIN_PIPE(i));
   18598         [ #  # ]:          0 :                 if (!error->pipe[i].power_domain_on)
   18599                 :          0 :                         continue;
   18600                 :            : 
   18601                 :          0 :                 error->cursor[i].control = I915_READ(CURCNTR(i));
   18602                 :          0 :                 error->cursor[i].position = I915_READ(CURPOS(i));
   18603                 :          0 :                 error->cursor[i].base = I915_READ(CURBASE(i));
   18604                 :            : 
   18605                 :          0 :                 error->plane[i].control = I915_READ(DSPCNTR(i));
   18606                 :          0 :                 error->plane[i].stride = I915_READ(DSPSTRIDE(i));
   18607         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) <= 3) {
   18608                 :          0 :                         error->plane[i].size = I915_READ(DSPSIZE(i));
   18609                 :          0 :                         error->plane[i].pos = I915_READ(DSPPOS(i));
   18610                 :            :                 }
   18611   [ #  #  #  # ]:          0 :                 if (INTEL_GEN(dev_priv) <= 7 && !IS_HASWELL(dev_priv))
   18612                 :          0 :                         error->plane[i].addr = I915_READ(DSPADDR(i));
   18613         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 4) {
   18614                 :          0 :                         error->plane[i].surface = I915_READ(DSPSURF(i));
   18615                 :          0 :                         error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
   18616                 :            :                 }
   18617                 :            : 
   18618                 :          0 :                 error->pipe[i].source = I915_READ(PIPESRC(i));
   18619                 :            : 
   18620         [ #  # ]:          0 :                 if (HAS_GMCH(dev_priv))
   18621                 :          0 :                         error->pipe[i].stat = I915_READ(PIPESTAT(i));
   18622                 :            :         }
   18623                 :            : 
   18624         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
   18625                 :          0 :                 enum transcoder cpu_transcoder = transcoders[i];
   18626                 :            : 
   18627         [ #  # ]:          0 :                 if (!INTEL_INFO(dev_priv)->trans_offsets[cpu_transcoder])
   18628                 :          0 :                         continue;
   18629                 :            : 
   18630                 :          0 :                 error->transcoder[i].available = true;
   18631                 :          0 :                 error->transcoder[i].power_domain_on =
   18632         [ #  # ]:          0 :                         __intel_display_power_is_enabled(dev_priv,
   18633                 :          0 :                                 POWER_DOMAIN_TRANSCODER(cpu_transcoder));
   18634         [ #  # ]:          0 :                 if (!error->transcoder[i].power_domain_on)
   18635                 :          0 :                         continue;
   18636                 :            : 
   18637                 :          0 :                 error->transcoder[i].cpu_transcoder = cpu_transcoder;
   18638                 :            : 
   18639                 :          0 :                 error->transcoder[i].conf = I915_READ(PIPECONF(cpu_transcoder));
   18640                 :          0 :                 error->transcoder[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
   18641                 :          0 :                 error->transcoder[i].hblank = I915_READ(HBLANK(cpu_transcoder));
   18642                 :          0 :                 error->transcoder[i].hsync = I915_READ(HSYNC(cpu_transcoder));
   18643                 :          0 :                 error->transcoder[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
   18644                 :          0 :                 error->transcoder[i].vblank = I915_READ(VBLANK(cpu_transcoder));
   18645                 :          0 :                 error->transcoder[i].vsync = I915_READ(VSYNC(cpu_transcoder));
   18646                 :            :         }
   18647                 :            : 
   18648                 :            :         return error;
   18649                 :            : }
   18650                 :            : 
   18651                 :            : #define err_printf(e, ...) i915_error_printf(e, __VA_ARGS__)
   18652                 :            : 
   18653                 :            : void
   18654                 :          0 : intel_display_print_error_state(struct drm_i915_error_state_buf *m,
   18655                 :            :                                 struct intel_display_error_state *error)
   18656                 :            : {
   18657                 :          0 :         struct drm_i915_private *dev_priv = m->i915;
   18658                 :          0 :         int i;
   18659                 :            : 
   18660         [ #  # ]:          0 :         if (!error)
   18661                 :            :                 return;
   18662                 :            : 
   18663         [ #  # ]:          0 :         err_printf(m, "Num Pipes: %d\n", INTEL_NUM_PIPES(dev_priv));
   18664   [ #  #  #  # ]:          0 :         if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
   18665                 :          0 :                 err_printf(m, "PWR_WELL_CTL2: %08x\n",
   18666                 :            :                            error->power_well_driver);
   18667   [ #  #  #  # ]:          0 :         for_each_pipe(dev_priv, i) {
   18668                 :          0 :                 err_printf(m, "Pipe [%d]:\n", i);
   18669         [ #  # ]:          0 :                 err_printf(m, "  Power: %s\n",
   18670                 :            :                            onoff(error->pipe[i].power_domain_on));
   18671                 :          0 :                 err_printf(m, "  SRC: %08x\n", error->pipe[i].source);
   18672                 :          0 :                 err_printf(m, "  STAT: %08x\n", error->pipe[i].stat);
   18673                 :            : 
   18674                 :          0 :                 err_printf(m, "Plane [%d]:\n", i);
   18675                 :          0 :                 err_printf(m, "  CNTR: %08x\n", error->plane[i].control);
   18676                 :          0 :                 err_printf(m, "  STRIDE: %08x\n", error->plane[i].stride);
   18677         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) <= 3) {
   18678                 :          0 :                         err_printf(m, "  SIZE: %08x\n", error->plane[i].size);
   18679                 :          0 :                         err_printf(m, "  POS: %08x\n", error->plane[i].pos);
   18680                 :            :                 }
   18681   [ #  #  #  # ]:          0 :                 if (INTEL_GEN(dev_priv) <= 7 && !IS_HASWELL(dev_priv))
   18682                 :          0 :                         err_printf(m, "  ADDR: %08x\n", error->plane[i].addr);
   18683         [ #  # ]:          0 :                 if (INTEL_GEN(dev_priv) >= 4) {
   18684                 :          0 :                         err_printf(m, "  SURF: %08x\n", error->plane[i].surface);
   18685                 :          0 :                         err_printf(m, "  TILEOFF: %08x\n", error->plane[i].tile_offset);
   18686                 :            :                 }
   18687                 :            : 
   18688                 :          0 :                 err_printf(m, "Cursor [%d]:\n", i);
   18689                 :          0 :                 err_printf(m, "  CNTR: %08x\n", error->cursor[i].control);
   18690                 :          0 :                 err_printf(m, "  POS: %08x\n", error->cursor[i].position);
   18691                 :          0 :                 err_printf(m, "  BASE: %08x\n", error->cursor[i].base);
   18692                 :            :         }
   18693                 :            : 
   18694         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
   18695         [ #  # ]:          0 :                 if (!error->transcoder[i].available)
   18696                 :          0 :                         continue;
   18697                 :            : 
   18698         [ #  # ]:          0 :                 err_printf(m, "CPU transcoder: %s\n",
   18699                 :            :                            transcoder_name(error->transcoder[i].cpu_transcoder));
   18700         [ #  # ]:          0 :                 err_printf(m, "  Power: %s\n",
   18701                 :            :                            onoff(error->transcoder[i].power_domain_on));
   18702                 :          0 :                 err_printf(m, "  CONF: %08x\n", error->transcoder[i].conf);
   18703                 :          0 :                 err_printf(m, "  HTOTAL: %08x\n", error->transcoder[i].htotal);
   18704                 :          0 :                 err_printf(m, "  HBLANK: %08x\n", error->transcoder[i].hblank);
   18705                 :          0 :                 err_printf(m, "  HSYNC: %08x\n", error->transcoder[i].hsync);
   18706                 :          0 :                 err_printf(m, "  VTOTAL: %08x\n", error->transcoder[i].vtotal);
   18707                 :          0 :                 err_printf(m, "  VBLANK: %08x\n", error->transcoder[i].vblank);
   18708                 :          0 :                 err_printf(m, "  VSYNC: %08x\n", error->transcoder[i].vsync);
   18709                 :            :         }
   18710                 :            : }
   18711                 :            : 
   18712                 :            : #endif

Generated by: LCOV version 1.14