Home | History | Annotate | Line # | Download | only in display
      1  1.12  riastrad /*	$NetBSD: intel_display.c,v 1.12 2021/12/19 12:37:17 riastradh Exp $	*/
      2   1.1  riastrad 
      3   1.1  riastrad /*
      4   1.1  riastrad  * Copyright  2006-2007 Intel Corporation
      5   1.1  riastrad  *
      6   1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      7   1.1  riastrad  * copy of this software and associated documentation files (the "Software"),
      8   1.1  riastrad  * to deal in the Software without restriction, including without limitation
      9   1.1  riastrad  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10   1.1  riastrad  * and/or sell copies of the Software, and to permit persons to whom the
     11   1.1  riastrad  * Software is furnished to do so, subject to the following conditions:
     12   1.1  riastrad  *
     13   1.1  riastrad  * The above copyright notice and this permission notice (including the next
     14   1.1  riastrad  * paragraph) shall be included in all copies or substantial portions of the
     15   1.1  riastrad  * Software.
     16   1.1  riastrad  *
     17   1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18   1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19   1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20   1.1  riastrad  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21   1.1  riastrad  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22   1.1  riastrad  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     23   1.1  riastrad  * DEALINGS IN THE SOFTWARE.
     24   1.1  riastrad  *
     25   1.1  riastrad  * Authors:
     26   1.1  riastrad  *	Eric Anholt <eric (at) anholt.net>
     27   1.1  riastrad  */
     28   1.1  riastrad 
     29   1.1  riastrad #include <sys/cdefs.h>
     30  1.12  riastrad __KERNEL_RCSID(0, "$NetBSD: intel_display.c,v 1.12 2021/12/19 12:37:17 riastradh Exp $");
     31   1.3  riastrad 
     32   1.3  riastrad #include "intel_display.h"	/* for pipe_drmhack */
     33   1.1  riastrad 
     34   1.1  riastrad #include <linux/i2c.h>
     35   1.1  riastrad #include <linux/input.h>
     36   1.1  riastrad #include <linux/intel-iommu.h>
     37   1.1  riastrad #include <linux/kernel.h>
     38   1.1  riastrad #include <linux/module.h>
     39   1.1  riastrad #include <linux/dma-resv.h>
     40   1.1  riastrad #include <linux/slab.h>
     41   1.1  riastrad 
     42   1.1  riastrad #include <drm/drm_atomic.h>
     43   1.1  riastrad #include <drm/drm_atomic_helper.h>
     44   1.1  riastrad #include <drm/drm_atomic_uapi.h>
     45   1.1  riastrad #include <drm/drm_dp_helper.h>
     46   1.1  riastrad #include <drm/drm_edid.h>
     47   1.1  riastrad #include <drm/drm_fourcc.h>
     48   1.1  riastrad #include <drm/drm_plane_helper.h>
     49   1.1  riastrad #include <drm/drm_probe_helper.h>
     50   1.1  riastrad #include <drm/drm_rect.h>
     51   1.1  riastrad #include <drm/i915_drm.h>
     52   1.1  riastrad 
     53   1.1  riastrad #include "display/intel_crt.h"
     54   1.1  riastrad #include "display/intel_ddi.h"
     55   1.1  riastrad #include "display/intel_dp.h"
     56   1.1  riastrad #include "display/intel_dp_mst.h"
     57   1.1  riastrad #include "display/intel_dsi.h"
     58   1.1  riastrad #include "display/intel_dvo.h"
     59   1.1  riastrad #include "display/intel_gmbus.h"
     60   1.1  riastrad #include "display/intel_hdmi.h"
     61   1.1  riastrad #include "display/intel_lvds.h"
     62   1.1  riastrad #include "display/intel_sdvo.h"
     63   1.1  riastrad #include "display/intel_tv.h"
     64   1.1  riastrad #include "display/intel_vdsc.h"
     65   1.1  riastrad 
     66   1.1  riastrad #include "gt/intel_rps.h"
     67   1.1  riastrad 
     68   1.1  riastrad #include "i915_drv.h"
     69   1.1  riastrad #include "i915_trace.h"
     70   1.1  riastrad #include "intel_acpi.h"
     71   1.1  riastrad #include "intel_atomic.h"
     72   1.1  riastrad #include "intel_atomic_plane.h"
     73   1.1  riastrad #include "intel_bw.h"
     74   1.1  riastrad #include "intel_cdclk.h"
     75   1.1  riastrad #include "intel_color.h"
     76   1.1  riastrad #include "intel_display_types.h"
     77   1.1  riastrad #include "intel_dp_link_training.h"
     78   1.1  riastrad #include "intel_fbc.h"
     79   1.1  riastrad #include "intel_fbdev.h"
     80   1.1  riastrad #include "intel_fifo_underrun.h"
     81   1.1  riastrad #include "intel_frontbuffer.h"
     82   1.1  riastrad #include "intel_hdcp.h"
     83   1.1  riastrad #include "intel_hotplug.h"
     84   1.1  riastrad #include "intel_overlay.h"
     85   1.1  riastrad #include "intel_pipe_crc.h"
     86   1.1  riastrad #include "intel_pm.h"
     87   1.1  riastrad #include "intel_psr.h"
     88   1.1  riastrad #include "intel_quirks.h"
     89   1.1  riastrad #include "intel_sideband.h"
     90   1.1  riastrad #include "intel_sprite.h"
     91   1.1  riastrad #include "intel_tc.h"
     92   1.1  riastrad #include "intel_vga.h"
     93   1.1  riastrad 
     94   1.2  riastrad #include <linux/nbsd-namespace.h>
     95   1.2  riastrad 
     96   1.1  riastrad /* Primary plane formats for gen <= 3 */
     97   1.1  riastrad static const u32 i8xx_primary_formats[] = {
     98   1.1  riastrad 	DRM_FORMAT_C8,
     99   1.1  riastrad 	DRM_FORMAT_XRGB1555,
    100   1.1  riastrad 	DRM_FORMAT_RGB565,
    101   1.1  riastrad 	DRM_FORMAT_XRGB8888,
    102   1.1  riastrad };
    103   1.1  riastrad 
    104   1.1  riastrad /* Primary plane formats for ivb (no fp16 due to hw issue) */
    105   1.1  riastrad static const u32 ivb_primary_formats[] = {
    106   1.1  riastrad 	DRM_FORMAT_C8,
    107   1.1  riastrad 	DRM_FORMAT_RGB565,
    108   1.1  riastrad 	DRM_FORMAT_XRGB8888,
    109   1.1  riastrad 	DRM_FORMAT_XBGR8888,
    110   1.1  riastrad 	DRM_FORMAT_XRGB2101010,
    111   1.1  riastrad 	DRM_FORMAT_XBGR2101010,
    112   1.1  riastrad };
    113   1.1  riastrad 
    114   1.1  riastrad /* Primary plane formats for gen >= 4, except ivb */
    115   1.1  riastrad static const u32 i965_primary_formats[] = {
    116   1.1  riastrad 	DRM_FORMAT_C8,
    117   1.1  riastrad 	DRM_FORMAT_RGB565,
    118   1.1  riastrad 	DRM_FORMAT_XRGB8888,
    119   1.1  riastrad 	DRM_FORMAT_XBGR8888,
    120   1.1  riastrad 	DRM_FORMAT_XRGB2101010,
    121   1.1  riastrad 	DRM_FORMAT_XBGR2101010,
    122   1.1  riastrad 	DRM_FORMAT_XBGR16161616F,
    123   1.1  riastrad };
    124   1.1  riastrad 
    125   1.1  riastrad /* Primary plane formats for vlv/chv */
    126   1.1  riastrad static const u32 vlv_primary_formats[] = {
    127   1.1  riastrad 	DRM_FORMAT_C8,
    128   1.1  riastrad 	DRM_FORMAT_RGB565,
    129   1.1  riastrad 	DRM_FORMAT_XRGB8888,
    130   1.1  riastrad 	DRM_FORMAT_XBGR8888,
    131   1.1  riastrad 	DRM_FORMAT_ARGB8888,
    132   1.1  riastrad 	DRM_FORMAT_ABGR8888,
    133   1.1  riastrad 	DRM_FORMAT_XRGB2101010,
    134   1.1  riastrad 	DRM_FORMAT_XBGR2101010,
    135   1.1  riastrad 	DRM_FORMAT_ARGB2101010,
    136   1.1  riastrad 	DRM_FORMAT_ABGR2101010,
    137   1.1  riastrad 	DRM_FORMAT_XBGR16161616F,
    138   1.1  riastrad };
    139   1.1  riastrad 
    140   1.1  riastrad static const u64 i9xx_format_modifiers[] = {
    141   1.1  riastrad 	I915_FORMAT_MOD_X_TILED,
    142   1.1  riastrad 	DRM_FORMAT_MOD_LINEAR,
    143   1.1  riastrad 	DRM_FORMAT_MOD_INVALID
    144   1.1  riastrad };
    145   1.1  riastrad 
    146   1.1  riastrad /* Cursor formats */
    147   1.1  riastrad static const u32 intel_cursor_formats[] = {
    148   1.1  riastrad 	DRM_FORMAT_ARGB8888,
    149   1.1  riastrad };
    150   1.1  riastrad 
    151   1.1  riastrad static const u64 cursor_format_modifiers[] = {
    152   1.1  riastrad 	DRM_FORMAT_MOD_LINEAR,
    153   1.1  riastrad 	DRM_FORMAT_MOD_INVALID
    154   1.1  riastrad };
    155   1.1  riastrad 
    156   1.1  riastrad static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
    157   1.1  riastrad 				struct intel_crtc_state *pipe_config);
    158   1.1  riastrad static void ilk_pch_clock_get(struct intel_crtc *crtc,
    159   1.1  riastrad 			      struct intel_crtc_state *pipe_config);
    160   1.1  riastrad 
    161   1.1  riastrad static int intel_framebuffer_init(struct intel_framebuffer *ifb,
    162   1.1  riastrad 				  struct drm_i915_gem_object *obj,
    163   1.1  riastrad 				  struct drm_mode_fb_cmd2 *mode_cmd);
    164   1.1  riastrad static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state);
    165   1.1  riastrad static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state);
    166   1.1  riastrad static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
    167   1.1  riastrad 					 const struct intel_link_m_n *m_n,
    168   1.1  riastrad 					 const struct intel_link_m_n *m2_n2);
    169   1.1  riastrad static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state);
    170   1.1  riastrad static void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state);
    171   1.1  riastrad static void hsw_set_pipeconf(const struct intel_crtc_state *crtc_state);
    172   1.1  riastrad static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state);
    173   1.1  riastrad static void vlv_prepare_pll(struct intel_crtc *crtc,
    174   1.1  riastrad 			    const struct intel_crtc_state *pipe_config);
    175   1.1  riastrad static void chv_prepare_pll(struct intel_crtc *crtc,
    176   1.1  riastrad 			    const struct intel_crtc_state *pipe_config);
    177   1.1  riastrad static void skl_pfit_enable(const struct intel_crtc_state *crtc_state);
    178   1.1  riastrad static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state);
    179   1.1  riastrad static void intel_modeset_setup_hw_state(struct drm_device *dev,
    180   1.1  riastrad 					 struct drm_modeset_acquire_ctx *ctx);
    181   1.1  riastrad static struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc);
    182   1.1  riastrad 
    183   1.1  riastrad struct intel_limit {
    184   1.1  riastrad 	struct {
    185   1.1  riastrad 		int min, max;
    186   1.1  riastrad 	} dot, vco, n, m, m1, m2, p, p1;
    187   1.1  riastrad 
    188   1.1  riastrad 	struct {
    189   1.1  riastrad 		int dot_limit;
    190   1.1  riastrad 		int p2_slow, p2_fast;
    191   1.1  riastrad 	} p2;
    192   1.1  riastrad };
    193   1.1  riastrad 
    194   1.1  riastrad /* returns HPLL frequency in kHz */
    195   1.1  riastrad int vlv_get_hpll_vco(struct drm_i915_private *dev_priv)
    196   1.1  riastrad {
    197   1.1  riastrad 	int hpll_freq, vco_freq[] = { 800, 1600, 2000, 2400 };
    198   1.1  riastrad 
    199   1.1  riastrad 	/* Obtain SKU information */
    200   1.1  riastrad 	hpll_freq = vlv_cck_read(dev_priv, CCK_FUSE_REG) &
    201   1.1  riastrad 		CCK_FUSE_HPLL_FREQ_MASK;
    202   1.1  riastrad 
    203   1.1  riastrad 	return vco_freq[hpll_freq] * 1000;
    204   1.1  riastrad }
    205   1.1  riastrad 
    206   1.1  riastrad int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
    207   1.1  riastrad 		      const char *name, u32 reg, int ref_freq)
    208   1.1  riastrad {
    209   1.1  riastrad 	u32 val;
    210   1.1  riastrad 	int divider;
    211   1.1  riastrad 
    212   1.1  riastrad 	val = vlv_cck_read(dev_priv, reg);
    213   1.1  riastrad 	divider = val & CCK_FREQUENCY_VALUES;
    214   1.1  riastrad 
    215   1.1  riastrad 	WARN((val & CCK_FREQUENCY_STATUS) !=
    216   1.1  riastrad 	     (divider << CCK_FREQUENCY_STATUS_SHIFT),
    217   1.1  riastrad 	     "%s change in progress\n", name);
    218   1.1  riastrad 
    219   1.1  riastrad 	return DIV_ROUND_CLOSEST(ref_freq << 1, divider + 1);
    220   1.1  riastrad }
    221   1.1  riastrad 
    222   1.1  riastrad int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
    223   1.1  riastrad 			   const char *name, u32 reg)
    224   1.1  riastrad {
    225   1.1  riastrad 	int hpll;
    226   1.1  riastrad 
    227   1.1  riastrad 	vlv_cck_get(dev_priv);
    228   1.1  riastrad 
    229   1.1  riastrad 	if (dev_priv->hpll_freq == 0)
    230   1.1  riastrad 		dev_priv->hpll_freq = vlv_get_hpll_vco(dev_priv);
    231   1.1  riastrad 
    232   1.1  riastrad 	hpll = vlv_get_cck_clock(dev_priv, name, reg, dev_priv->hpll_freq);
    233   1.1  riastrad 
    234   1.1  riastrad 	vlv_cck_put(dev_priv);
    235   1.1  riastrad 
    236   1.1  riastrad 	return hpll;
    237   1.1  riastrad }
    238   1.1  riastrad 
    239   1.1  riastrad static void intel_update_czclk(struct drm_i915_private *dev_priv)
    240   1.1  riastrad {
    241   1.1  riastrad 	if (!(IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
    242   1.1  riastrad 		return;
    243   1.1  riastrad 
    244   1.1  riastrad 	dev_priv->czclk_freq = vlv_get_cck_clock_hpll(dev_priv, "czclk",
    245   1.1  riastrad 						      CCK_CZ_CLOCK_CONTROL);
    246   1.1  riastrad 
    247   1.1  riastrad 	DRM_DEBUG_DRIVER("CZ clock rate: %d kHz\n", dev_priv->czclk_freq);
    248   1.1  riastrad }
    249   1.1  riastrad 
    250   1.1  riastrad static inline u32 /* units of 100MHz */
    251   1.1  riastrad intel_fdi_link_freq(struct drm_i915_private *dev_priv,
    252   1.1  riastrad 		    const struct intel_crtc_state *pipe_config)
    253   1.1  riastrad {
    254   1.1  riastrad 	if (HAS_DDI(dev_priv))
    255   1.1  riastrad 		return pipe_config->port_clock; /* SPLL */
    256   1.1  riastrad 	else
    257   1.1  riastrad 		return dev_priv->fdi_pll_freq;
    258   1.1  riastrad }
    259   1.1  riastrad 
    260   1.1  riastrad static const struct intel_limit intel_limits_i8xx_dac = {
    261   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    262   1.1  riastrad 	.vco = { .min = 908000, .max = 1512000 },
    263   1.1  riastrad 	.n = { .min = 2, .max = 16 },
    264   1.1  riastrad 	.m = { .min = 96, .max = 140 },
    265   1.1  riastrad 	.m1 = { .min = 18, .max = 26 },
    266   1.1  riastrad 	.m2 = { .min = 6, .max = 16 },
    267   1.1  riastrad 	.p = { .min = 4, .max = 128 },
    268   1.1  riastrad 	.p1 = { .min = 2, .max = 33 },
    269   1.1  riastrad 	.p2 = { .dot_limit = 165000,
    270   1.1  riastrad 		.p2_slow = 4, .p2_fast = 2 },
    271   1.1  riastrad };
    272   1.1  riastrad 
    273   1.1  riastrad static const struct intel_limit intel_limits_i8xx_dvo = {
    274   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    275   1.1  riastrad 	.vco = { .min = 908000, .max = 1512000 },
    276   1.1  riastrad 	.n = { .min = 2, .max = 16 },
    277   1.1  riastrad 	.m = { .min = 96, .max = 140 },
    278   1.1  riastrad 	.m1 = { .min = 18, .max = 26 },
    279   1.1  riastrad 	.m2 = { .min = 6, .max = 16 },
    280   1.1  riastrad 	.p = { .min = 4, .max = 128 },
    281   1.1  riastrad 	.p1 = { .min = 2, .max = 33 },
    282   1.1  riastrad 	.p2 = { .dot_limit = 165000,
    283   1.1  riastrad 		.p2_slow = 4, .p2_fast = 4 },
    284   1.1  riastrad };
    285   1.1  riastrad 
    286   1.1  riastrad static const struct intel_limit intel_limits_i8xx_lvds = {
    287   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    288   1.1  riastrad 	.vco = { .min = 908000, .max = 1512000 },
    289   1.1  riastrad 	.n = { .min = 2, .max = 16 },
    290   1.1  riastrad 	.m = { .min = 96, .max = 140 },
    291   1.1  riastrad 	.m1 = { .min = 18, .max = 26 },
    292   1.1  riastrad 	.m2 = { .min = 6, .max = 16 },
    293   1.1  riastrad 	.p = { .min = 4, .max = 128 },
    294   1.1  riastrad 	.p1 = { .min = 1, .max = 6 },
    295   1.1  riastrad 	.p2 = { .dot_limit = 165000,
    296   1.1  riastrad 		.p2_slow = 14, .p2_fast = 7 },
    297   1.1  riastrad };
    298   1.1  riastrad 
    299   1.1  riastrad static const struct intel_limit intel_limits_i9xx_sdvo = {
    300   1.1  riastrad 	.dot = { .min = 20000, .max = 400000 },
    301   1.1  riastrad 	.vco = { .min = 1400000, .max = 2800000 },
    302   1.1  riastrad 	.n = { .min = 1, .max = 6 },
    303   1.1  riastrad 	.m = { .min = 70, .max = 120 },
    304   1.1  riastrad 	.m1 = { .min = 8, .max = 18 },
    305   1.1  riastrad 	.m2 = { .min = 3, .max = 7 },
    306   1.1  riastrad 	.p = { .min = 5, .max = 80 },
    307   1.1  riastrad 	.p1 = { .min = 1, .max = 8 },
    308   1.1  riastrad 	.p2 = { .dot_limit = 200000,
    309   1.1  riastrad 		.p2_slow = 10, .p2_fast = 5 },
    310   1.1  riastrad };
    311   1.1  riastrad 
    312   1.1  riastrad static const struct intel_limit intel_limits_i9xx_lvds = {
    313   1.1  riastrad 	.dot = { .min = 20000, .max = 400000 },
    314   1.1  riastrad 	.vco = { .min = 1400000, .max = 2800000 },
    315   1.1  riastrad 	.n = { .min = 1, .max = 6 },
    316   1.1  riastrad 	.m = { .min = 70, .max = 120 },
    317   1.1  riastrad 	.m1 = { .min = 8, .max = 18 },
    318   1.1  riastrad 	.m2 = { .min = 3, .max = 7 },
    319   1.1  riastrad 	.p = { .min = 7, .max = 98 },
    320   1.1  riastrad 	.p1 = { .min = 1, .max = 8 },
    321   1.1  riastrad 	.p2 = { .dot_limit = 112000,
    322   1.1  riastrad 		.p2_slow = 14, .p2_fast = 7 },
    323   1.1  riastrad };
    324   1.1  riastrad 
    325   1.1  riastrad 
    326   1.1  riastrad static const struct intel_limit intel_limits_g4x_sdvo = {
    327   1.1  riastrad 	.dot = { .min = 25000, .max = 270000 },
    328   1.1  riastrad 	.vco = { .min = 1750000, .max = 3500000},
    329   1.1  riastrad 	.n = { .min = 1, .max = 4 },
    330   1.1  riastrad 	.m = { .min = 104, .max = 138 },
    331   1.1  riastrad 	.m1 = { .min = 17, .max = 23 },
    332   1.1  riastrad 	.m2 = { .min = 5, .max = 11 },
    333   1.1  riastrad 	.p = { .min = 10, .max = 30 },
    334   1.1  riastrad 	.p1 = { .min = 1, .max = 3},
    335   1.1  riastrad 	.p2 = { .dot_limit = 270000,
    336   1.1  riastrad 		.p2_slow = 10,
    337   1.1  riastrad 		.p2_fast = 10
    338   1.1  riastrad 	},
    339   1.1  riastrad };
    340   1.1  riastrad 
    341   1.1  riastrad static const struct intel_limit intel_limits_g4x_hdmi = {
    342   1.1  riastrad 	.dot = { .min = 22000, .max = 400000 },
    343   1.1  riastrad 	.vco = { .min = 1750000, .max = 3500000},
    344   1.1  riastrad 	.n = { .min = 1, .max = 4 },
    345   1.1  riastrad 	.m = { .min = 104, .max = 138 },
    346   1.1  riastrad 	.m1 = { .min = 16, .max = 23 },
    347   1.1  riastrad 	.m2 = { .min = 5, .max = 11 },
    348   1.1  riastrad 	.p = { .min = 5, .max = 80 },
    349   1.1  riastrad 	.p1 = { .min = 1, .max = 8},
    350   1.1  riastrad 	.p2 = { .dot_limit = 165000,
    351   1.1  riastrad 		.p2_slow = 10, .p2_fast = 5 },
    352   1.1  riastrad };
    353   1.1  riastrad 
    354   1.1  riastrad static const struct intel_limit intel_limits_g4x_single_channel_lvds = {
    355   1.1  riastrad 	.dot = { .min = 20000, .max = 115000 },
    356   1.1  riastrad 	.vco = { .min = 1750000, .max = 3500000 },
    357   1.1  riastrad 	.n = { .min = 1, .max = 3 },
    358   1.1  riastrad 	.m = { .min = 104, .max = 138 },
    359   1.1  riastrad 	.m1 = { .min = 17, .max = 23 },
    360   1.1  riastrad 	.m2 = { .min = 5, .max = 11 },
    361   1.1  riastrad 	.p = { .min = 28, .max = 112 },
    362   1.1  riastrad 	.p1 = { .min = 2, .max = 8 },
    363   1.1  riastrad 	.p2 = { .dot_limit = 0,
    364   1.1  riastrad 		.p2_slow = 14, .p2_fast = 14
    365   1.1  riastrad 	},
    366   1.1  riastrad };
    367   1.1  riastrad 
    368   1.1  riastrad static const struct intel_limit intel_limits_g4x_dual_channel_lvds = {
    369   1.1  riastrad 	.dot = { .min = 80000, .max = 224000 },
    370   1.1  riastrad 	.vco = { .min = 1750000, .max = 3500000 },
    371   1.1  riastrad 	.n = { .min = 1, .max = 3 },
    372   1.1  riastrad 	.m = { .min = 104, .max = 138 },
    373   1.1  riastrad 	.m1 = { .min = 17, .max = 23 },
    374   1.1  riastrad 	.m2 = { .min = 5, .max = 11 },
    375   1.1  riastrad 	.p = { .min = 14, .max = 42 },
    376   1.1  riastrad 	.p1 = { .min = 2, .max = 6 },
    377   1.1  riastrad 	.p2 = { .dot_limit = 0,
    378   1.1  riastrad 		.p2_slow = 7, .p2_fast = 7
    379   1.1  riastrad 	},
    380   1.1  riastrad };
    381   1.1  riastrad 
    382   1.1  riastrad static const struct intel_limit pnv_limits_sdvo = {
    383   1.1  riastrad 	.dot = { .min = 20000, .max = 400000},
    384   1.1  riastrad 	.vco = { .min = 1700000, .max = 3500000 },
    385   1.1  riastrad 	/* Pineview's Ncounter is a ring counter */
    386   1.1  riastrad 	.n = { .min = 3, .max = 6 },
    387   1.1  riastrad 	.m = { .min = 2, .max = 256 },
    388   1.1  riastrad 	/* Pineview only has one combined m divider, which we treat as m2. */
    389   1.1  riastrad 	.m1 = { .min = 0, .max = 0 },
    390   1.1  riastrad 	.m2 = { .min = 0, .max = 254 },
    391   1.1  riastrad 	.p = { .min = 5, .max = 80 },
    392   1.1  riastrad 	.p1 = { .min = 1, .max = 8 },
    393   1.1  riastrad 	.p2 = { .dot_limit = 200000,
    394   1.1  riastrad 		.p2_slow = 10, .p2_fast = 5 },
    395   1.1  riastrad };
    396   1.1  riastrad 
    397   1.1  riastrad static const struct intel_limit pnv_limits_lvds = {
    398   1.1  riastrad 	.dot = { .min = 20000, .max = 400000 },
    399   1.1  riastrad 	.vco = { .min = 1700000, .max = 3500000 },
    400   1.1  riastrad 	.n = { .min = 3, .max = 6 },
    401   1.1  riastrad 	.m = { .min = 2, .max = 256 },
    402   1.1  riastrad 	.m1 = { .min = 0, .max = 0 },
    403   1.1  riastrad 	.m2 = { .min = 0, .max = 254 },
    404   1.1  riastrad 	.p = { .min = 7, .max = 112 },
    405   1.1  riastrad 	.p1 = { .min = 1, .max = 8 },
    406   1.1  riastrad 	.p2 = { .dot_limit = 112000,
    407   1.1  riastrad 		.p2_slow = 14, .p2_fast = 14 },
    408   1.1  riastrad };
    409   1.1  riastrad 
    410   1.1  riastrad /* Ironlake / Sandybridge
    411   1.1  riastrad  *
    412   1.1  riastrad  * We calculate clock using (register_value + 2) for N/M1/M2, so here
    413   1.1  riastrad  * the range value for them is (actual_value - 2).
    414   1.1  riastrad  */
    415   1.1  riastrad static const struct intel_limit ilk_limits_dac = {
    416   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    417   1.1  riastrad 	.vco = { .min = 1760000, .max = 3510000 },
    418   1.1  riastrad 	.n = { .min = 1, .max = 5 },
    419   1.1  riastrad 	.m = { .min = 79, .max = 127 },
    420   1.1  riastrad 	.m1 = { .min = 12, .max = 22 },
    421   1.1  riastrad 	.m2 = { .min = 5, .max = 9 },
    422   1.1  riastrad 	.p = { .min = 5, .max = 80 },
    423   1.1  riastrad 	.p1 = { .min = 1, .max = 8 },
    424   1.1  riastrad 	.p2 = { .dot_limit = 225000,
    425   1.1  riastrad 		.p2_slow = 10, .p2_fast = 5 },
    426   1.1  riastrad };
    427   1.1  riastrad 
    428   1.1  riastrad static const struct intel_limit ilk_limits_single_lvds = {
    429   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    430   1.1  riastrad 	.vco = { .min = 1760000, .max = 3510000 },
    431   1.1  riastrad 	.n = { .min = 1, .max = 3 },
    432   1.1  riastrad 	.m = { .min = 79, .max = 118 },
    433   1.1  riastrad 	.m1 = { .min = 12, .max = 22 },
    434   1.1  riastrad 	.m2 = { .min = 5, .max = 9 },
    435   1.1  riastrad 	.p = { .min = 28, .max = 112 },
    436   1.1  riastrad 	.p1 = { .min = 2, .max = 8 },
    437   1.1  riastrad 	.p2 = { .dot_limit = 225000,
    438   1.1  riastrad 		.p2_slow = 14, .p2_fast = 14 },
    439   1.1  riastrad };
    440   1.1  riastrad 
    441   1.1  riastrad static const struct intel_limit ilk_limits_dual_lvds = {
    442   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    443   1.1  riastrad 	.vco = { .min = 1760000, .max = 3510000 },
    444   1.1  riastrad 	.n = { .min = 1, .max = 3 },
    445   1.1  riastrad 	.m = { .min = 79, .max = 127 },
    446   1.1  riastrad 	.m1 = { .min = 12, .max = 22 },
    447   1.1  riastrad 	.m2 = { .min = 5, .max = 9 },
    448   1.1  riastrad 	.p = { .min = 14, .max = 56 },
    449   1.1  riastrad 	.p1 = { .min = 2, .max = 8 },
    450   1.1  riastrad 	.p2 = { .dot_limit = 225000,
    451   1.1  riastrad 		.p2_slow = 7, .p2_fast = 7 },
    452   1.1  riastrad };
    453   1.1  riastrad 
    454   1.1  riastrad /* LVDS 100mhz refclk limits. */
    455   1.1  riastrad static const struct intel_limit ilk_limits_single_lvds_100m = {
    456   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    457   1.1  riastrad 	.vco = { .min = 1760000, .max = 3510000 },
    458   1.1  riastrad 	.n = { .min = 1, .max = 2 },
    459   1.1  riastrad 	.m = { .min = 79, .max = 126 },
    460   1.1  riastrad 	.m1 = { .min = 12, .max = 22 },
    461   1.1  riastrad 	.m2 = { .min = 5, .max = 9 },
    462   1.1  riastrad 	.p = { .min = 28, .max = 112 },
    463   1.1  riastrad 	.p1 = { .min = 2, .max = 8 },
    464   1.1  riastrad 	.p2 = { .dot_limit = 225000,
    465   1.1  riastrad 		.p2_slow = 14, .p2_fast = 14 },
    466   1.1  riastrad };
    467   1.1  riastrad 
    468   1.1  riastrad static const struct intel_limit ilk_limits_dual_lvds_100m = {
    469   1.1  riastrad 	.dot = { .min = 25000, .max = 350000 },
    470   1.1  riastrad 	.vco = { .min = 1760000, .max = 3510000 },
    471   1.1  riastrad 	.n = { .min = 1, .max = 3 },
    472   1.1  riastrad 	.m = { .min = 79, .max = 126 },
    473   1.1  riastrad 	.m1 = { .min = 12, .max = 22 },
    474   1.1  riastrad 	.m2 = { .min = 5, .max = 9 },
    475   1.1  riastrad 	.p = { .min = 14, .max = 42 },
    476   1.1  riastrad 	.p1 = { .min = 2, .max = 6 },
    477   1.1  riastrad 	.p2 = { .dot_limit = 225000,
    478   1.1  riastrad 		.p2_slow = 7, .p2_fast = 7 },
    479   1.1  riastrad };
    480   1.1  riastrad 
    481   1.1  riastrad static const struct intel_limit intel_limits_vlv = {
    482   1.1  riastrad 	 /*
    483   1.1  riastrad 	  * These are the data rate limits (measured in fast clocks)
    484   1.1  riastrad 	  * since those are the strictest limits we have. The fast
    485   1.1  riastrad 	  * clock and actual rate limits are more relaxed, so checking
    486   1.1  riastrad 	  * them would make no difference.
    487   1.1  riastrad 	  */
    488   1.1  riastrad 	.dot = { .min = 25000 * 5, .max = 270000 * 5 },
    489   1.1  riastrad 	.vco = { .min = 4000000, .max = 6000000 },
    490   1.1  riastrad 	.n = { .min = 1, .max = 7 },
    491   1.1  riastrad 	.m1 = { .min = 2, .max = 3 },
    492   1.1  riastrad 	.m2 = { .min = 11, .max = 156 },
    493   1.1  riastrad 	.p1 = { .min = 2, .max = 3 },
    494   1.1  riastrad 	.p2 = { .p2_slow = 2, .p2_fast = 20 }, /* slow=min, fast=max */
    495   1.1  riastrad };
    496   1.1  riastrad 
    497   1.1  riastrad static const struct intel_limit intel_limits_chv = {
    498   1.1  riastrad 	/*
    499   1.1  riastrad 	 * These are the data rate limits (measured in fast clocks)
    500   1.1  riastrad 	 * since those are the strictest limits we have.  The fast
    501   1.1  riastrad 	 * clock and actual rate limits are more relaxed, so checking
    502   1.1  riastrad 	 * them would make no difference.
    503   1.1  riastrad 	 */
    504   1.1  riastrad 	.dot = { .min = 25000 * 5, .max = 540000 * 5},
    505   1.1  riastrad 	.vco = { .min = 4800000, .max = 6480000 },
    506   1.1  riastrad 	.n = { .min = 1, .max = 1 },
    507   1.1  riastrad 	.m1 = { .min = 2, .max = 2 },
    508   1.1  riastrad 	.m2 = { .min = 24 << 22, .max = 175 << 22 },
    509   1.1  riastrad 	.p1 = { .min = 2, .max = 4 },
    510   1.1  riastrad 	.p2 = {	.p2_slow = 1, .p2_fast = 14 },
    511   1.1  riastrad };
    512   1.1  riastrad 
    513   1.1  riastrad static const struct intel_limit intel_limits_bxt = {
    514   1.1  riastrad 	/* FIXME: find real dot limits */
    515   1.1  riastrad 	.dot = { .min = 0, .max = INT_MAX },
    516   1.1  riastrad 	.vco = { .min = 4800000, .max = 6700000 },
    517   1.1  riastrad 	.n = { .min = 1, .max = 1 },
    518   1.1  riastrad 	.m1 = { .min = 2, .max = 2 },
    519   1.1  riastrad 	/* FIXME: find real m2 limits */
    520   1.1  riastrad 	.m2 = { .min = 2 << 22, .max = 255 << 22 },
    521   1.1  riastrad 	.p1 = { .min = 2, .max = 4 },
    522   1.1  riastrad 	.p2 = { .p2_slow = 1, .p2_fast = 20 },
    523   1.1  riastrad };
    524   1.1  riastrad 
    525   1.1  riastrad /* WA Display #0827: Gen9:all */
    526   1.1  riastrad static void
    527   1.1  riastrad skl_wa_827(struct drm_i915_private *dev_priv, enum pipe pipe, bool enable)
    528   1.1  riastrad {
    529   1.1  riastrad 	if (enable)
    530   1.1  riastrad 		I915_WRITE(CLKGATE_DIS_PSL(pipe),
    531   1.1  riastrad 			   I915_READ(CLKGATE_DIS_PSL(pipe)) |
    532   1.1  riastrad 			   DUPS1_GATING_DIS | DUPS2_GATING_DIS);
    533   1.1  riastrad 	else
    534   1.1  riastrad 		I915_WRITE(CLKGATE_DIS_PSL(pipe),
    535   1.1  riastrad 			   I915_READ(CLKGATE_DIS_PSL(pipe)) &
    536   1.1  riastrad 			   ~(DUPS1_GATING_DIS | DUPS2_GATING_DIS));
    537   1.1  riastrad }
    538   1.1  riastrad 
    539   1.1  riastrad /* Wa_2006604312:icl */
    540   1.1  riastrad static void
    541   1.1  riastrad icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
    542   1.1  riastrad 		       bool enable)
    543   1.1  riastrad {
    544   1.1  riastrad 	if (enable)
    545   1.1  riastrad 		I915_WRITE(CLKGATE_DIS_PSL(pipe),
    546   1.1  riastrad 			   I915_READ(CLKGATE_DIS_PSL(pipe)) | DPFR_GATING_DIS);
    547   1.1  riastrad 	else
    548   1.1  riastrad 		I915_WRITE(CLKGATE_DIS_PSL(pipe),
    549   1.1  riastrad 			   I915_READ(CLKGATE_DIS_PSL(pipe)) & ~DPFR_GATING_DIS);
    550   1.1  riastrad }
    551   1.1  riastrad 
    552   1.1  riastrad static bool
    553   1.1  riastrad needs_modeset(const struct intel_crtc_state *state)
    554   1.1  riastrad {
    555   1.1  riastrad 	return drm_atomic_crtc_needs_modeset(&state->uapi);
    556   1.1  riastrad }
    557   1.1  riastrad 
    558   1.1  riastrad bool
    559   1.1  riastrad is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
    560   1.1  riastrad {
    561   1.1  riastrad 	return (crtc_state->master_transcoder != INVALID_TRANSCODER ||
    562   1.1  riastrad 		crtc_state->sync_mode_slaves_mask);
    563   1.1  riastrad }
    564   1.1  riastrad 
    565   1.1  riastrad static bool
    566   1.1  riastrad is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
    567   1.1  riastrad {
    568   1.1  riastrad 	return crtc_state->master_transcoder != INVALID_TRANSCODER;
    569   1.1  riastrad }
    570   1.1  riastrad 
    571   1.1  riastrad /*
    572   1.1  riastrad  * Platform specific helpers to calculate the port PLL loopback- (clock.m),
    573   1.1  riastrad  * and post-divider (clock.p) values, pre- (clock.vco) and post-divided fast
    574   1.1  riastrad  * (clock.dot) clock rates. This fast dot clock is fed to the port's IO logic.
    575   1.1  riastrad  * The helpers' return value is the rate of the clock that is fed to the
    576   1.1  riastrad  * display engine's pipe which can be the above fast dot clock rate or a
    577   1.1  riastrad  * divided-down version of it.
    578   1.1  riastrad  */
    579   1.1  riastrad /* m1 is reserved as 0 in Pineview, n is a ring counter */
    580   1.1  riastrad static int pnv_calc_dpll_params(int refclk, struct dpll *clock)
    581   1.1  riastrad {
    582   1.1  riastrad 	clock->m = clock->m2 + 2;
    583   1.1  riastrad 	clock->p = clock->p1 * clock->p2;
    584   1.1  riastrad 	if (WARN_ON(clock->n == 0 || clock->p == 0))
    585   1.1  riastrad 		return 0;
    586   1.1  riastrad 	clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n);
    587   1.1  riastrad 	clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
    588   1.1  riastrad 
    589   1.1  riastrad 	return clock->dot;
    590   1.1  riastrad }
    591   1.1  riastrad 
    592   1.1  riastrad static u32 i9xx_dpll_compute_m(struct dpll *dpll)
    593   1.1  riastrad {
    594   1.1  riastrad 	return 5 * (dpll->m1 + 2) + (dpll->m2 + 2);
    595   1.1  riastrad }
    596   1.1  riastrad 
    597   1.1  riastrad static int i9xx_calc_dpll_params(int refclk, struct dpll *clock)
    598   1.1  riastrad {
    599   1.1  riastrad 	clock->m = i9xx_dpll_compute_m(clock);
    600   1.1  riastrad 	clock->p = clock->p1 * clock->p2;
    601   1.1  riastrad 	if (WARN_ON(clock->n + 2 == 0 || clock->p == 0))
    602   1.1  riastrad 		return 0;
    603   1.1  riastrad 	clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n + 2);
    604   1.1  riastrad 	clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
    605   1.1  riastrad 
    606   1.1  riastrad 	return clock->dot;
    607   1.1  riastrad }
    608   1.1  riastrad 
    609   1.1  riastrad static int vlv_calc_dpll_params(int refclk, struct dpll *clock)
    610   1.1  riastrad {
    611   1.1  riastrad 	clock->m = clock->m1 * clock->m2;
    612   1.1  riastrad 	clock->p = clock->p1 * clock->p2;
    613   1.1  riastrad 	if (WARN_ON(clock->n == 0 || clock->p == 0))
    614   1.1  riastrad 		return 0;
    615   1.1  riastrad 	clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n);
    616   1.1  riastrad 	clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
    617   1.1  riastrad 
    618   1.1  riastrad 	return clock->dot / 5;
    619   1.1  riastrad }
    620   1.1  riastrad 
    621   1.1  riastrad int chv_calc_dpll_params(int refclk, struct dpll *clock)
    622   1.1  riastrad {
    623   1.1  riastrad 	clock->m = clock->m1 * clock->m2;
    624   1.1  riastrad 	clock->p = clock->p1 * clock->p2;
    625   1.1  riastrad 	if (WARN_ON(clock->n == 0 || clock->p == 0))
    626   1.1  riastrad 		return 0;
    627   1.1  riastrad 	clock->vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, clock->m),
    628   1.1  riastrad 					   clock->n << 22);
    629   1.1  riastrad 	clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
    630   1.1  riastrad 
    631   1.1  riastrad 	return clock->dot / 5;
    632   1.1  riastrad }
    633   1.1  riastrad 
    634   1.1  riastrad #define INTELPllInvalid(s)   do { /* DRM_DEBUG(s); */ return false; } while (0)
    635   1.1  riastrad 
    636   1.1  riastrad /*
    637   1.1  riastrad  * Returns whether the given set of divisors are valid for a given refclk with
    638   1.1  riastrad  * the given connectors.
    639   1.1  riastrad  */
    640   1.1  riastrad static bool intel_PLL_is_valid(struct drm_i915_private *dev_priv,
    641   1.1  riastrad 			       const struct intel_limit *limit,
    642   1.1  riastrad 			       const struct dpll *clock)
    643   1.1  riastrad {
    644   1.1  riastrad 	if (clock->n   < limit->n.min   || limit->n.max   < clock->n)
    645   1.1  riastrad 		INTELPllInvalid("n out of range\n");
    646   1.1  riastrad 	if (clock->p1  < limit->p1.min  || limit->p1.max  < clock->p1)
    647   1.1  riastrad 		INTELPllInvalid("p1 out of range\n");
    648   1.1  riastrad 	if (clock->m2  < limit->m2.min  || limit->m2.max  < clock->m2)
    649   1.1  riastrad 		INTELPllInvalid("m2 out of range\n");
    650   1.1  riastrad 	if (clock->m1  < limit->m1.min  || limit->m1.max  < clock->m1)
    651   1.1  riastrad 		INTELPllInvalid("m1 out of range\n");
    652   1.1  riastrad 
    653   1.1  riastrad 	if (!IS_PINEVIEW(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
    654   1.1  riastrad 	    !IS_CHERRYVIEW(dev_priv) && !IS_GEN9_LP(dev_priv))
    655   1.1  riastrad 		if (clock->m1 <= clock->m2)
    656   1.1  riastrad 			INTELPllInvalid("m1 <= m2\n");
    657   1.1  riastrad 
    658   1.1  riastrad 	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
    659   1.1  riastrad 	    !IS_GEN9_LP(dev_priv)) {
    660   1.1  riastrad 		if (clock->p < limit->p.min || limit->p.max < clock->p)
    661   1.1  riastrad 			INTELPllInvalid("p out of range\n");
    662   1.1  riastrad 		if (clock->m < limit->m.min || limit->m.max < clock->m)
    663   1.1  riastrad 			INTELPllInvalid("m out of range\n");
    664   1.1  riastrad 	}
    665   1.1  riastrad 
    666   1.1  riastrad 	if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
    667   1.1  riastrad 		INTELPllInvalid("vco out of range\n");
    668   1.1  riastrad 	/* XXX: We may need to be checking "Dot clock" depending on the multiplier,
    669   1.1  riastrad 	 * connector, etc., rather than just a single range.
    670   1.1  riastrad 	 */
    671   1.1  riastrad 	if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
    672   1.1  riastrad 		INTELPllInvalid("dot out of range\n");
    673   1.1  riastrad 
    674   1.1  riastrad 	return true;
    675   1.1  riastrad }
    676   1.1  riastrad 
    677   1.1  riastrad static int
    678   1.1  riastrad i9xx_select_p2_div(const struct intel_limit *limit,
    679   1.1  riastrad 		   const struct intel_crtc_state *crtc_state,
    680   1.1  riastrad 		   int target)
    681   1.1  riastrad {
    682   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
    683   1.1  riastrad 
    684   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
    685   1.1  riastrad 		/*
    686   1.1  riastrad 		 * For LVDS just rely on its current settings for dual-channel.
    687   1.1  riastrad 		 * We haven't figured out how to reliably set up different
    688   1.1  riastrad 		 * single/dual channel state, if we even can.
    689   1.1  riastrad 		 */
    690   1.1  riastrad 		if (intel_is_dual_link_lvds(dev_priv))
    691   1.1  riastrad 			return limit->p2.p2_fast;
    692   1.1  riastrad 		else
    693   1.1  riastrad 			return limit->p2.p2_slow;
    694   1.1  riastrad 	} else {
    695   1.1  riastrad 		if (target < limit->p2.dot_limit)
    696   1.1  riastrad 			return limit->p2.p2_slow;
    697   1.1  riastrad 		else
    698   1.1  riastrad 			return limit->p2.p2_fast;
    699   1.1  riastrad 	}
    700   1.1  riastrad }
    701   1.1  riastrad 
    702   1.1  riastrad /*
    703   1.1  riastrad  * Returns a set of divisors for the desired target clock with the given
    704   1.1  riastrad  * refclk, or FALSE.  The returned values represent the clock equation:
    705   1.1  riastrad  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
    706   1.1  riastrad  *
    707   1.1  riastrad  * Target and reference clocks are specified in kHz.
    708   1.1  riastrad  *
    709   1.1  riastrad  * If match_clock is provided, then best_clock P divider must match the P
    710   1.1  riastrad  * divider from @match_clock used for LVDS downclocking.
    711   1.1  riastrad  */
    712   1.1  riastrad static bool
    713   1.1  riastrad i9xx_find_best_dpll(const struct intel_limit *limit,
    714   1.1  riastrad 		    struct intel_crtc_state *crtc_state,
    715   1.1  riastrad 		    int target, int refclk, struct dpll *match_clock,
    716   1.1  riastrad 		    struct dpll *best_clock)
    717   1.1  riastrad {
    718   1.1  riastrad 	struct drm_device *dev = crtc_state->uapi.crtc->dev;
    719   1.1  riastrad 	struct dpll clock;
    720   1.1  riastrad 	int err = target;
    721   1.1  riastrad 
    722   1.1  riastrad 	memset(best_clock, 0, sizeof(*best_clock));
    723   1.1  riastrad 
    724   1.1  riastrad 	clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
    725   1.1  riastrad 
    726   1.1  riastrad 	for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
    727   1.1  riastrad 	     clock.m1++) {
    728   1.1  riastrad 		for (clock.m2 = limit->m2.min;
    729   1.1  riastrad 		     clock.m2 <= limit->m2.max; clock.m2++) {
    730   1.1  riastrad 			if (clock.m2 >= clock.m1)
    731   1.1  riastrad 				break;
    732   1.1  riastrad 			for (clock.n = limit->n.min;
    733   1.1  riastrad 			     clock.n <= limit->n.max; clock.n++) {
    734   1.1  riastrad 				for (clock.p1 = limit->p1.min;
    735   1.1  riastrad 					clock.p1 <= limit->p1.max; clock.p1++) {
    736   1.1  riastrad 					int this_err;
    737   1.1  riastrad 
    738   1.1  riastrad 					i9xx_calc_dpll_params(refclk, &clock);
    739   1.1  riastrad 					if (!intel_PLL_is_valid(to_i915(dev),
    740   1.1  riastrad 								limit,
    741   1.1  riastrad 								&clock))
    742   1.1  riastrad 						continue;
    743   1.1  riastrad 					if (match_clock &&
    744   1.1  riastrad 					    clock.p != match_clock->p)
    745   1.1  riastrad 						continue;
    746   1.1  riastrad 
    747   1.1  riastrad 					this_err = abs(clock.dot - target);
    748   1.1  riastrad 					if (this_err < err) {
    749   1.1  riastrad 						*best_clock = clock;
    750   1.1  riastrad 						err = this_err;
    751   1.1  riastrad 					}
    752   1.1  riastrad 				}
    753   1.1  riastrad 			}
    754   1.1  riastrad 		}
    755   1.1  riastrad 	}
    756   1.1  riastrad 
    757   1.1  riastrad 	return (err != target);
    758   1.1  riastrad }
    759   1.1  riastrad 
    760   1.1  riastrad /*
    761   1.1  riastrad  * Returns a set of divisors for the desired target clock with the given
    762   1.1  riastrad  * refclk, or FALSE.  The returned values represent the clock equation:
    763   1.1  riastrad  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
    764   1.1  riastrad  *
    765   1.1  riastrad  * Target and reference clocks are specified in kHz.
    766   1.1  riastrad  *
    767   1.1  riastrad  * If match_clock is provided, then best_clock P divider must match the P
    768   1.1  riastrad  * divider from @match_clock used for LVDS downclocking.
    769   1.1  riastrad  */
    770   1.1  riastrad static bool
    771   1.1  riastrad pnv_find_best_dpll(const struct intel_limit *limit,
    772   1.1  riastrad 		   struct intel_crtc_state *crtc_state,
    773   1.1  riastrad 		   int target, int refclk, struct dpll *match_clock,
    774   1.1  riastrad 		   struct dpll *best_clock)
    775   1.1  riastrad {
    776   1.1  riastrad 	struct drm_device *dev = crtc_state->uapi.crtc->dev;
    777   1.1  riastrad 	struct dpll clock;
    778   1.1  riastrad 	int err = target;
    779   1.1  riastrad 
    780   1.1  riastrad 	memset(best_clock, 0, sizeof(*best_clock));
    781   1.1  riastrad 
    782   1.1  riastrad 	clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
    783   1.1  riastrad 
    784   1.1  riastrad 	for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
    785   1.1  riastrad 	     clock.m1++) {
    786   1.1  riastrad 		for (clock.m2 = limit->m2.min;
    787   1.1  riastrad 		     clock.m2 <= limit->m2.max; clock.m2++) {
    788   1.1  riastrad 			for (clock.n = limit->n.min;
    789   1.1  riastrad 			     clock.n <= limit->n.max; clock.n++) {
    790   1.1  riastrad 				for (clock.p1 = limit->p1.min;
    791   1.1  riastrad 					clock.p1 <= limit->p1.max; clock.p1++) {
    792   1.1  riastrad 					int this_err;
    793   1.1  riastrad 
    794   1.1  riastrad 					pnv_calc_dpll_params(refclk, &clock);
    795   1.1  riastrad 					if (!intel_PLL_is_valid(to_i915(dev),
    796   1.1  riastrad 								limit,
    797   1.1  riastrad 								&clock))
    798   1.1  riastrad 						continue;
    799   1.1  riastrad 					if (match_clock &&
    800   1.1  riastrad 					    clock.p != match_clock->p)
    801   1.1  riastrad 						continue;
    802   1.1  riastrad 
    803   1.1  riastrad 					this_err = abs(clock.dot - target);
    804   1.1  riastrad 					if (this_err < err) {
    805   1.1  riastrad 						*best_clock = clock;
    806   1.1  riastrad 						err = this_err;
    807   1.1  riastrad 					}
    808   1.1  riastrad 				}
    809   1.1  riastrad 			}
    810   1.1  riastrad 		}
    811   1.1  riastrad 	}
    812   1.1  riastrad 
    813   1.1  riastrad 	return (err != target);
    814   1.1  riastrad }
    815   1.1  riastrad 
    816   1.1  riastrad /*
    817   1.1  riastrad  * Returns a set of divisors for the desired target clock with the given
    818   1.1  riastrad  * refclk, or FALSE.  The returned values represent the clock equation:
    819   1.1  riastrad  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
    820   1.1  riastrad  *
    821   1.1  riastrad  * Target and reference clocks are specified in kHz.
    822   1.1  riastrad  *
    823   1.1  riastrad  * If match_clock is provided, then best_clock P divider must match the P
    824   1.1  riastrad  * divider from @match_clock used for LVDS downclocking.
    825   1.1  riastrad  */
    826   1.1  riastrad static bool
    827   1.1  riastrad g4x_find_best_dpll(const struct intel_limit *limit,
    828   1.1  riastrad 		   struct intel_crtc_state *crtc_state,
    829   1.1  riastrad 		   int target, int refclk, struct dpll *match_clock,
    830   1.1  riastrad 		   struct dpll *best_clock)
    831   1.1  riastrad {
    832   1.1  riastrad 	struct drm_device *dev = crtc_state->uapi.crtc->dev;
    833   1.1  riastrad 	struct dpll clock;
    834   1.1  riastrad 	int max_n;
    835   1.1  riastrad 	bool found = false;
    836   1.1  riastrad 	/* approximately equals target * 0.00585 */
    837   1.1  riastrad 	int err_most = (target >> 8) + (target >> 9);
    838   1.1  riastrad 
    839   1.1  riastrad 	memset(best_clock, 0, sizeof(*best_clock));
    840   1.1  riastrad 
    841   1.1  riastrad 	clock.p2 = i9xx_select_p2_div(limit, crtc_state, target);
    842   1.1  riastrad 
    843   1.1  riastrad 	max_n = limit->n.max;
    844   1.1  riastrad 	/* based on hardware requirement, prefer smaller n to precision */
    845   1.1  riastrad 	for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
    846   1.1  riastrad 		/* based on hardware requirement, prefere larger m1,m2 */
    847   1.1  riastrad 		for (clock.m1 = limit->m1.max;
    848   1.1  riastrad 		     clock.m1 >= limit->m1.min; clock.m1--) {
    849   1.1  riastrad 			for (clock.m2 = limit->m2.max;
    850   1.1  riastrad 			     clock.m2 >= limit->m2.min; clock.m2--) {
    851   1.1  riastrad 				for (clock.p1 = limit->p1.max;
    852   1.1  riastrad 				     clock.p1 >= limit->p1.min; clock.p1--) {
    853   1.1  riastrad 					int this_err;
    854   1.1  riastrad 
    855   1.1  riastrad 					i9xx_calc_dpll_params(refclk, &clock);
    856   1.1  riastrad 					if (!intel_PLL_is_valid(to_i915(dev),
    857   1.1  riastrad 								limit,
    858   1.1  riastrad 								&clock))
    859   1.1  riastrad 						continue;
    860   1.1  riastrad 
    861   1.1  riastrad 					this_err = abs(clock.dot - target);
    862   1.1  riastrad 					if (this_err < err_most) {
    863   1.1  riastrad 						*best_clock = clock;
    864   1.1  riastrad 						err_most = this_err;
    865   1.1  riastrad 						max_n = clock.n;
    866   1.1  riastrad 						found = true;
    867   1.1  riastrad 					}
    868   1.1  riastrad 				}
    869   1.1  riastrad 			}
    870   1.1  riastrad 		}
    871   1.1  riastrad 	}
    872   1.1  riastrad 	return found;
    873   1.1  riastrad }
    874   1.1  riastrad 
    875   1.1  riastrad /*
    876   1.1  riastrad  * Check if the calculated PLL configuration is more optimal compared to the
    877   1.1  riastrad  * best configuration and error found so far. Return the calculated error.
    878   1.1  riastrad  */
    879   1.1  riastrad static bool vlv_PLL_is_optimal(struct drm_device *dev, int target_freq,
    880   1.1  riastrad 			       const struct dpll *calculated_clock,
    881   1.1  riastrad 			       const struct dpll *best_clock,
    882   1.1  riastrad 			       unsigned int best_error_ppm,
    883   1.1  riastrad 			       unsigned int *error_ppm)
    884   1.1  riastrad {
    885   1.1  riastrad 	/*
    886   1.1  riastrad 	 * For CHV ignore the error and consider only the P value.
    887   1.1  riastrad 	 * Prefer a bigger P value based on HW requirements.
    888   1.1  riastrad 	 */
    889   1.1  riastrad 	if (IS_CHERRYVIEW(to_i915(dev))) {
    890   1.1  riastrad 		*error_ppm = 0;
    891   1.1  riastrad 
    892   1.1  riastrad 		return calculated_clock->p > best_clock->p;
    893   1.1  riastrad 	}
    894   1.1  riastrad 
    895   1.1  riastrad 	if (WARN_ON_ONCE(!target_freq))
    896   1.1  riastrad 		return false;
    897   1.1  riastrad 
    898   1.1  riastrad 	*error_ppm = div_u64(1000000ULL *
    899   1.1  riastrad 				abs(target_freq - calculated_clock->dot),
    900   1.1  riastrad 			     target_freq);
    901   1.1  riastrad 	/*
    902   1.1  riastrad 	 * Prefer a better P value over a better (smaller) error if the error
    903   1.1  riastrad 	 * is small. Ensure this preference for future configurations too by
    904   1.1  riastrad 	 * setting the error to 0.
    905   1.1  riastrad 	 */
    906   1.1  riastrad 	if (*error_ppm < 100 && calculated_clock->p > best_clock->p) {
    907   1.1  riastrad 		*error_ppm = 0;
    908   1.1  riastrad 
    909   1.1  riastrad 		return true;
    910   1.1  riastrad 	}
    911   1.1  riastrad 
    912   1.1  riastrad 	return *error_ppm + 10 < best_error_ppm;
    913   1.1  riastrad }
    914   1.1  riastrad 
    915   1.1  riastrad /*
    916   1.1  riastrad  * Returns a set of divisors for the desired target clock with the given
    917   1.1  riastrad  * refclk, or FALSE.  The returned values represent the clock equation:
    918   1.1  riastrad  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
    919   1.1  riastrad  */
    920   1.1  riastrad static bool
    921   1.1  riastrad vlv_find_best_dpll(const struct intel_limit *limit,
    922   1.1  riastrad 		   struct intel_crtc_state *crtc_state,
    923   1.1  riastrad 		   int target, int refclk, struct dpll *match_clock,
    924   1.1  riastrad 		   struct dpll *best_clock)
    925   1.1  riastrad {
    926   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    927   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
    928   1.1  riastrad 	struct dpll clock;
    929   1.1  riastrad 	unsigned int bestppm = 1000000;
    930   1.1  riastrad 	/* min update 19.2 MHz */
    931   1.1  riastrad 	int max_n = min(limit->n.max, refclk / 19200);
    932   1.1  riastrad 	bool found = false;
    933   1.1  riastrad 
    934   1.1  riastrad 	target *= 5; /* fast clock */
    935   1.1  riastrad 
    936   1.1  riastrad 	memset(best_clock, 0, sizeof(*best_clock));
    937   1.1  riastrad 
    938   1.1  riastrad 	/* based on hardware requirement, prefer smaller n to precision */
    939   1.1  riastrad 	for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
    940   1.1  riastrad 		for (clock.p1 = limit->p1.max; clock.p1 >= limit->p1.min; clock.p1--) {
    941   1.1  riastrad 			for (clock.p2 = limit->p2.p2_fast; clock.p2 >= limit->p2.p2_slow;
    942   1.1  riastrad 			     clock.p2 -= clock.p2 > 10 ? 2 : 1) {
    943   1.1  riastrad 				clock.p = clock.p1 * clock.p2;
    944   1.1  riastrad 				/* based on hardware requirement, prefer bigger m1,m2 values */
    945   1.1  riastrad 				for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; clock.m1++) {
    946  1.12  riastrad 					unsigned int ppm = 0; /*XXXGCC*/
    947   1.1  riastrad 
    948   1.1  riastrad 					clock.m2 = DIV_ROUND_CLOSEST(target * clock.p * clock.n,
    949   1.1  riastrad 								     refclk * clock.m1);
    950   1.1  riastrad 
    951   1.1  riastrad 					vlv_calc_dpll_params(refclk, &clock);
    952   1.1  riastrad 
    953   1.1  riastrad 					if (!intel_PLL_is_valid(to_i915(dev),
    954   1.1  riastrad 								limit,
    955   1.1  riastrad 								&clock))
    956   1.1  riastrad 						continue;
    957   1.1  riastrad 
    958   1.1  riastrad 					if (!vlv_PLL_is_optimal(dev, target,
    959   1.1  riastrad 								&clock,
    960   1.1  riastrad 								best_clock,
    961   1.1  riastrad 								bestppm, &ppm))
    962   1.1  riastrad 						continue;
    963   1.1  riastrad 
    964   1.1  riastrad 					*best_clock = clock;
    965   1.1  riastrad 					bestppm = ppm;
    966   1.1  riastrad 					found = true;
    967   1.1  riastrad 				}
    968   1.1  riastrad 			}
    969   1.1  riastrad 		}
    970   1.1  riastrad 	}
    971   1.1  riastrad 
    972   1.1  riastrad 	return found;
    973   1.1  riastrad }
    974   1.1  riastrad 
    975   1.1  riastrad /*
    976   1.1  riastrad  * Returns a set of divisors for the desired target clock with the given
    977   1.1  riastrad  * refclk, or FALSE.  The returned values represent the clock equation:
    978   1.1  riastrad  * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
    979   1.1  riastrad  */
    980   1.1  riastrad static bool
    981   1.1  riastrad chv_find_best_dpll(const struct intel_limit *limit,
    982   1.1  riastrad 		   struct intel_crtc_state *crtc_state,
    983   1.1  riastrad 		   int target, int refclk, struct dpll *match_clock,
    984   1.1  riastrad 		   struct dpll *best_clock)
    985   1.1  riastrad {
    986   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    987   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
    988   1.1  riastrad 	unsigned int best_error_ppm;
    989   1.1  riastrad 	struct dpll clock;
    990   1.1  riastrad 	u64 m2;
    991   1.1  riastrad 	int found = false;
    992   1.1  riastrad 
    993   1.1  riastrad 	memset(best_clock, 0, sizeof(*best_clock));
    994   1.1  riastrad 	best_error_ppm = 1000000;
    995   1.1  riastrad 
    996   1.1  riastrad 	/*
    997   1.1  riastrad 	 * Based on hardware doc, the n always set to 1, and m1 always
    998   1.1  riastrad 	 * set to 2.  If requires to support 200Mhz refclk, we need to
    999   1.1  riastrad 	 * revisit this because n may not 1 anymore.
   1000   1.1  riastrad 	 */
   1001   1.1  riastrad 	clock.n = 1, clock.m1 = 2;
   1002   1.1  riastrad 	target *= 5;	/* fast clock */
   1003   1.1  riastrad 
   1004   1.1  riastrad 	for (clock.p1 = limit->p1.max; clock.p1 >= limit->p1.min; clock.p1--) {
   1005   1.1  riastrad 		for (clock.p2 = limit->p2.p2_fast;
   1006   1.1  riastrad 				clock.p2 >= limit->p2.p2_slow;
   1007   1.1  riastrad 				clock.p2 -= clock.p2 > 10 ? 2 : 1) {
   1008  1.12  riastrad 			unsigned int error_ppm = 0; /*XXXGCC*/
   1009   1.1  riastrad 
   1010   1.1  riastrad 			clock.p = clock.p1 * clock.p2;
   1011   1.1  riastrad 
   1012   1.1  riastrad 			m2 = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(target, clock.p * clock.n) << 22,
   1013   1.1  riastrad 						   refclk * clock.m1);
   1014   1.1  riastrad 
   1015   1.1  riastrad 			if (m2 > INT_MAX/clock.m1)
   1016   1.1  riastrad 				continue;
   1017   1.1  riastrad 
   1018   1.1  riastrad 			clock.m2 = m2;
   1019   1.1  riastrad 
   1020   1.1  riastrad 			chv_calc_dpll_params(refclk, &clock);
   1021   1.1  riastrad 
   1022   1.1  riastrad 			if (!intel_PLL_is_valid(to_i915(dev), limit, &clock))
   1023   1.1  riastrad 				continue;
   1024   1.1  riastrad 
   1025   1.1  riastrad 			if (!vlv_PLL_is_optimal(dev, target, &clock, best_clock,
   1026   1.1  riastrad 						best_error_ppm, &error_ppm))
   1027   1.1  riastrad 				continue;
   1028   1.1  riastrad 
   1029   1.1  riastrad 			*best_clock = clock;
   1030   1.1  riastrad 			best_error_ppm = error_ppm;
   1031   1.1  riastrad 			found = true;
   1032   1.1  riastrad 		}
   1033   1.1  riastrad 	}
   1034   1.1  riastrad 
   1035   1.1  riastrad 	return found;
   1036   1.1  riastrad }
   1037   1.1  riastrad 
   1038   1.1  riastrad bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state,
   1039   1.1  riastrad 			struct dpll *best_clock)
   1040   1.1  riastrad {
   1041   1.1  riastrad 	int refclk = 100000;
   1042   1.1  riastrad 	const struct intel_limit *limit = &intel_limits_bxt;
   1043   1.1  riastrad 
   1044   1.1  riastrad 	return chv_find_best_dpll(limit, crtc_state,
   1045   1.1  riastrad 				  crtc_state->port_clock, refclk,
   1046   1.1  riastrad 				  NULL, best_clock);
   1047   1.1  riastrad }
   1048   1.1  riastrad 
   1049   1.1  riastrad static bool pipe_scanline_is_moving(struct drm_i915_private *dev_priv,
   1050   1.1  riastrad 				    enum pipe pipe)
   1051   1.1  riastrad {
   1052   1.1  riastrad 	i915_reg_t reg = PIPEDSL(pipe);
   1053   1.1  riastrad 	u32 line1, line2;
   1054   1.1  riastrad 	u32 line_mask;
   1055   1.1  riastrad 
   1056   1.1  riastrad 	if (IS_GEN(dev_priv, 2))
   1057   1.1  riastrad 		line_mask = DSL_LINEMASK_GEN2;
   1058   1.1  riastrad 	else
   1059   1.1  riastrad 		line_mask = DSL_LINEMASK_GEN3;
   1060   1.1  riastrad 
   1061   1.1  riastrad 	line1 = I915_READ(reg) & line_mask;
   1062   1.1  riastrad 	msleep(5);
   1063   1.1  riastrad 	line2 = I915_READ(reg) & line_mask;
   1064   1.1  riastrad 
   1065   1.1  riastrad 	return line1 != line2;
   1066   1.1  riastrad }
   1067   1.1  riastrad 
   1068   1.1  riastrad static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)
   1069   1.1  riastrad {
   1070   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1071   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1072   1.1  riastrad 
   1073   1.1  riastrad 	/* Wait for the display line to settle/start moving */
   1074   1.1  riastrad 	if (wait_for(pipe_scanline_is_moving(dev_priv, pipe) == state, 100))
   1075   1.1  riastrad 		DRM_ERROR("pipe %c scanline %s wait timed out\n",
   1076   1.1  riastrad 			  pipe_name(pipe), onoff(state));
   1077   1.1  riastrad }
   1078   1.1  riastrad 
   1079   1.1  riastrad static void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc)
   1080   1.1  riastrad {
   1081   1.1  riastrad 	wait_for_pipe_scanline_moving(crtc, false);
   1082   1.1  riastrad }
   1083   1.1  riastrad 
   1084   1.1  riastrad static void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
   1085   1.1  riastrad {
   1086   1.1  riastrad 	wait_for_pipe_scanline_moving(crtc, true);
   1087   1.1  riastrad }
   1088   1.1  riastrad 
   1089   1.1  riastrad static void
   1090   1.1  riastrad intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state)
   1091   1.1  riastrad {
   1092   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   1093   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1094   1.1  riastrad 
   1095   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4) {
   1096   1.1  riastrad 		enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
   1097   1.1  riastrad 		i915_reg_t reg = PIPECONF(cpu_transcoder);
   1098   1.1  riastrad 
   1099   1.1  riastrad 		/* Wait for the Pipe State to go off */
   1100   1.1  riastrad 		if (intel_de_wait_for_clear(dev_priv, reg,
   1101   1.1  riastrad 					    I965_PIPECONF_ACTIVE, 100))
   1102   1.1  riastrad 			WARN(1, "pipe_off wait timed out\n");
   1103   1.1  riastrad 	} else {
   1104   1.1  riastrad 		intel_wait_for_pipe_scanline_stopped(crtc);
   1105   1.1  riastrad 	}
   1106   1.1  riastrad }
   1107   1.1  riastrad 
   1108   1.1  riastrad /* Only for pre-ILK configs */
   1109   1.1  riastrad void assert_pll(struct drm_i915_private *dev_priv,
   1110   1.1  riastrad 		enum pipe pipe, bool state)
   1111   1.1  riastrad {
   1112   1.1  riastrad 	u32 val;
   1113   1.1  riastrad 	bool cur_state;
   1114   1.1  riastrad 
   1115   1.1  riastrad 	val = I915_READ(DPLL(pipe));
   1116   1.1  riastrad 	cur_state = !!(val & DPLL_VCO_ENABLE);
   1117   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1118   1.1  riastrad 	     "PLL state assertion failure (expected %s, current %s)\n",
   1119   1.1  riastrad 			onoff(state), onoff(cur_state));
   1120   1.1  riastrad }
   1121   1.1  riastrad 
   1122   1.1  riastrad /* XXX: the dsi pll is shared between MIPI DSI ports */
   1123   1.1  riastrad void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
   1124   1.1  riastrad {
   1125   1.1  riastrad 	u32 val;
   1126   1.1  riastrad 	bool cur_state;
   1127   1.1  riastrad 
   1128   1.1  riastrad 	vlv_cck_get(dev_priv);
   1129   1.1  riastrad 	val = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL);
   1130   1.1  riastrad 	vlv_cck_put(dev_priv);
   1131   1.1  riastrad 
   1132   1.1  riastrad 	cur_state = val & DSI_PLL_VCO_EN;
   1133   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1134   1.1  riastrad 	     "DSI PLL state assertion failure (expected %s, current %s)\n",
   1135   1.1  riastrad 			onoff(state), onoff(cur_state));
   1136   1.1  riastrad }
   1137   1.1  riastrad 
   1138   1.1  riastrad static void assert_fdi_tx(struct drm_i915_private *dev_priv,
   1139   1.1  riastrad 			  enum pipe pipe, bool state)
   1140   1.1  riastrad {
   1141   1.1  riastrad 	bool cur_state;
   1142   1.1  riastrad 
   1143   1.1  riastrad 	if (HAS_DDI(dev_priv)) {
   1144   1.1  riastrad 		/*
   1145   1.1  riastrad 		 * DDI does not have a specific FDI_TX register.
   1146   1.1  riastrad 		 *
   1147   1.1  riastrad 		 * FDI is never fed from EDP transcoder
   1148   1.1  riastrad 		 * so pipe->transcoder cast is fine here.
   1149   1.1  riastrad 		 */
   1150   1.1  riastrad 		enum transcoder cpu_transcoder = (enum transcoder)pipe;
   1151   1.1  riastrad 		u32 val = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
   1152   1.1  riastrad 		cur_state = !!(val & TRANS_DDI_FUNC_ENABLE);
   1153   1.1  riastrad 	} else {
   1154   1.1  riastrad 		u32 val = I915_READ(FDI_TX_CTL(pipe));
   1155   1.1  riastrad 		cur_state = !!(val & FDI_TX_ENABLE);
   1156   1.1  riastrad 	}
   1157   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1158   1.1  riastrad 	     "FDI TX state assertion failure (expected %s, current %s)\n",
   1159   1.1  riastrad 			onoff(state), onoff(cur_state));
   1160   1.1  riastrad }
   1161   1.1  riastrad #define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true)
   1162   1.1  riastrad #define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false)
   1163   1.1  riastrad 
   1164   1.1  riastrad static void assert_fdi_rx(struct drm_i915_private *dev_priv,
   1165   1.1  riastrad 			  enum pipe pipe, bool state)
   1166   1.1  riastrad {
   1167   1.1  riastrad 	u32 val;
   1168   1.1  riastrad 	bool cur_state;
   1169   1.1  riastrad 
   1170   1.1  riastrad 	val = I915_READ(FDI_RX_CTL(pipe));
   1171   1.1  riastrad 	cur_state = !!(val & FDI_RX_ENABLE);
   1172   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1173   1.1  riastrad 	     "FDI RX state assertion failure (expected %s, current %s)\n",
   1174   1.1  riastrad 			onoff(state), onoff(cur_state));
   1175   1.1  riastrad }
   1176   1.1  riastrad #define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true)
   1177   1.1  riastrad #define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false)
   1178   1.1  riastrad 
   1179   1.1  riastrad static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
   1180   1.1  riastrad 				      enum pipe pipe)
   1181   1.1  riastrad {
   1182   1.1  riastrad 	u32 val;
   1183   1.1  riastrad 
   1184   1.1  riastrad 	/* ILK FDI PLL is always enabled */
   1185   1.1  riastrad 	if (IS_GEN(dev_priv, 5))
   1186   1.1  riastrad 		return;
   1187   1.1  riastrad 
   1188   1.1  riastrad 	/* On Haswell, DDI ports are responsible for the FDI PLL setup */
   1189   1.1  riastrad 	if (HAS_DDI(dev_priv))
   1190   1.1  riastrad 		return;
   1191   1.1  riastrad 
   1192   1.1  riastrad 	val = I915_READ(FDI_TX_CTL(pipe));
   1193   1.1  riastrad 	I915_STATE_WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n");
   1194   1.1  riastrad }
   1195   1.1  riastrad 
   1196   1.1  riastrad void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
   1197   1.1  riastrad 		       enum pipe pipe, bool state)
   1198   1.1  riastrad {
   1199   1.1  riastrad 	u32 val;
   1200   1.1  riastrad 	bool cur_state;
   1201   1.1  riastrad 
   1202   1.1  riastrad 	val = I915_READ(FDI_RX_CTL(pipe));
   1203   1.1  riastrad 	cur_state = !!(val & FDI_RX_PLL_ENABLE);
   1204   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1205   1.1  riastrad 	     "FDI RX PLL assertion failure (expected %s, current %s)\n",
   1206   1.1  riastrad 			onoff(state), onoff(cur_state));
   1207   1.1  riastrad }
   1208   1.1  riastrad 
   1209   1.1  riastrad void assert_panel_unlocked(struct drm_i915_private *dev_priv, enum pipe pipe)
   1210   1.1  riastrad {
   1211   1.1  riastrad 	i915_reg_t pp_reg;
   1212   1.1  riastrad 	u32 val;
   1213   1.1  riastrad 	enum pipe panel_pipe = INVALID_PIPE;
   1214   1.1  riastrad 	bool locked = true;
   1215   1.1  riastrad 
   1216   1.1  riastrad 	if (WARN_ON(HAS_DDI(dev_priv)))
   1217   1.1  riastrad 		return;
   1218   1.1  riastrad 
   1219   1.1  riastrad 	if (HAS_PCH_SPLIT(dev_priv)) {
   1220   1.1  riastrad 		u32 port_sel;
   1221   1.1  riastrad 
   1222   1.1  riastrad 		pp_reg = PP_CONTROL(0);
   1223   1.1  riastrad 		port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
   1224   1.1  riastrad 
   1225   1.1  riastrad 		switch (port_sel) {
   1226   1.1  riastrad 		case PANEL_PORT_SELECT_LVDS:
   1227   1.1  riastrad 			intel_lvds_port_enabled(dev_priv, PCH_LVDS, &panel_pipe);
   1228   1.1  riastrad 			break;
   1229   1.1  riastrad 		case PANEL_PORT_SELECT_DPA:
   1230   1.1  riastrad 			intel_dp_port_enabled(dev_priv, DP_A, PORT_A, &panel_pipe);
   1231   1.1  riastrad 			break;
   1232   1.1  riastrad 		case PANEL_PORT_SELECT_DPC:
   1233   1.1  riastrad 			intel_dp_port_enabled(dev_priv, PCH_DP_C, PORT_C, &panel_pipe);
   1234   1.1  riastrad 			break;
   1235   1.1  riastrad 		case PANEL_PORT_SELECT_DPD:
   1236   1.1  riastrad 			intel_dp_port_enabled(dev_priv, PCH_DP_D, PORT_D, &panel_pipe);
   1237   1.1  riastrad 			break;
   1238   1.1  riastrad 		default:
   1239   1.1  riastrad 			MISSING_CASE(port_sel);
   1240   1.1  riastrad 			break;
   1241   1.1  riastrad 		}
   1242   1.1  riastrad 	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   1243   1.1  riastrad 		/* presumably write lock depends on pipe, not port select */
   1244   1.1  riastrad 		pp_reg = PP_CONTROL(pipe);
   1245   1.1  riastrad 		panel_pipe = pipe;
   1246   1.1  riastrad 	} else {
   1247   1.1  riastrad 		u32 port_sel;
   1248   1.1  riastrad 
   1249   1.1  riastrad 		pp_reg = PP_CONTROL(0);
   1250   1.1  riastrad 		port_sel = I915_READ(PP_ON_DELAYS(0)) & PANEL_PORT_SELECT_MASK;
   1251   1.1  riastrad 
   1252   1.1  riastrad 		WARN_ON(port_sel != PANEL_PORT_SELECT_LVDS);
   1253   1.1  riastrad 		intel_lvds_port_enabled(dev_priv, LVDS, &panel_pipe);
   1254   1.1  riastrad 	}
   1255   1.1  riastrad 
   1256   1.1  riastrad 	val = I915_READ(pp_reg);
   1257   1.1  riastrad 	if (!(val & PANEL_POWER_ON) ||
   1258   1.1  riastrad 	    ((val & PANEL_UNLOCK_MASK) == PANEL_UNLOCK_REGS))
   1259   1.1  riastrad 		locked = false;
   1260   1.1  riastrad 
   1261   1.1  riastrad 	I915_STATE_WARN(panel_pipe == pipe && locked,
   1262   1.1  riastrad 	     "panel assertion failure, pipe %c regs locked\n",
   1263   1.1  riastrad 	     pipe_name(pipe));
   1264   1.1  riastrad }
   1265   1.1  riastrad 
   1266   1.1  riastrad void assert_pipe(struct drm_i915_private *dev_priv,
   1267   1.1  riastrad 		 enum transcoder cpu_transcoder, bool state)
   1268   1.1  riastrad {
   1269   1.1  riastrad 	bool cur_state;
   1270   1.1  riastrad 	enum intel_display_power_domain power_domain;
   1271   1.1  riastrad 	intel_wakeref_t wakeref;
   1272   1.1  riastrad 
   1273   1.1  riastrad 	/* we keep both pipes enabled on 830 */
   1274   1.1  riastrad 	if (IS_I830(dev_priv))
   1275   1.1  riastrad 		state = true;
   1276   1.1  riastrad 
   1277   1.1  riastrad 	power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
   1278   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   1279   1.1  riastrad 	if (wakeref) {
   1280   1.1  riastrad 		u32 val = I915_READ(PIPECONF(cpu_transcoder));
   1281   1.1  riastrad 		cur_state = !!(val & PIPECONF_ENABLE);
   1282   1.1  riastrad 
   1283   1.1  riastrad 		intel_display_power_put(dev_priv, power_domain, wakeref);
   1284   1.1  riastrad 	} else {
   1285   1.1  riastrad 		cur_state = false;
   1286   1.1  riastrad 	}
   1287   1.1  riastrad 
   1288   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1289   1.1  riastrad 			"transcoder %s assertion failure (expected %s, current %s)\n",
   1290   1.1  riastrad 			transcoder_name(cpu_transcoder),
   1291   1.1  riastrad 			onoff(state), onoff(cur_state));
   1292   1.1  riastrad }
   1293   1.1  riastrad 
   1294   1.1  riastrad static void assert_plane(struct intel_plane *plane, bool state)
   1295   1.1  riastrad {
   1296   1.1  riastrad 	enum pipe pipe;
   1297   1.1  riastrad 	bool cur_state;
   1298   1.1  riastrad 
   1299   1.1  riastrad 	cur_state = plane->get_hw_state(plane, &pipe);
   1300   1.1  riastrad 
   1301   1.1  riastrad 	I915_STATE_WARN(cur_state != state,
   1302   1.1  riastrad 			"%s assertion failure (expected %s, current %s)\n",
   1303   1.1  riastrad 			plane->base.name, onoff(state), onoff(cur_state));
   1304   1.1  riastrad }
   1305   1.1  riastrad 
   1306   1.1  riastrad #define assert_plane_enabled(p) assert_plane(p, true)
   1307   1.1  riastrad #define assert_plane_disabled(p) assert_plane(p, false)
   1308   1.1  riastrad 
   1309   1.1  riastrad static void assert_planes_disabled(struct intel_crtc *crtc)
   1310   1.1  riastrad {
   1311   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1312   1.1  riastrad 	struct intel_plane *plane;
   1313   1.1  riastrad 
   1314   1.1  riastrad 	for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane)
   1315   1.1  riastrad 		assert_plane_disabled(plane);
   1316   1.1  riastrad }
   1317   1.1  riastrad 
   1318   1.1  riastrad static void assert_vblank_disabled(struct drm_crtc *crtc)
   1319   1.1  riastrad {
   1320   1.1  riastrad 	if (I915_STATE_WARN_ON(drm_crtc_vblank_get(crtc) == 0))
   1321   1.1  riastrad 		drm_crtc_vblank_put(crtc);
   1322   1.1  riastrad }
   1323   1.1  riastrad 
   1324   1.1  riastrad void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
   1325   1.1  riastrad 				    enum pipe pipe)
   1326   1.1  riastrad {
   1327   1.1  riastrad 	u32 val;
   1328   1.1  riastrad 	bool enabled;
   1329   1.1  riastrad 
   1330   1.1  riastrad 	val = I915_READ(PCH_TRANSCONF(pipe));
   1331   1.1  riastrad 	enabled = !!(val & TRANS_ENABLE);
   1332   1.1  riastrad 	I915_STATE_WARN(enabled,
   1333   1.1  riastrad 	     "transcoder assertion failed, should be off on pipe %c but is still active\n",
   1334   1.1  riastrad 	     pipe_name(pipe));
   1335   1.1  riastrad }
   1336   1.1  riastrad 
   1337   1.1  riastrad static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
   1338   1.1  riastrad 				   enum pipe pipe, enum port port,
   1339   1.1  riastrad 				   i915_reg_t dp_reg)
   1340   1.1  riastrad {
   1341   1.1  riastrad 	enum pipe port_pipe;
   1342   1.1  riastrad 	bool state;
   1343   1.1  riastrad 
   1344   1.1  riastrad 	state = intel_dp_port_enabled(dev_priv, dp_reg, port, &port_pipe);
   1345   1.1  riastrad 
   1346   1.1  riastrad 	I915_STATE_WARN(state && port_pipe == pipe,
   1347   1.1  riastrad 			"PCH DP %c enabled on transcoder %c, should be disabled\n",
   1348   1.1  riastrad 			port_name(port), pipe_name(pipe));
   1349   1.1  riastrad 
   1350   1.1  riastrad 	I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
   1351   1.1  riastrad 			"IBX PCH DP %c still using transcoder B\n",
   1352   1.1  riastrad 			port_name(port));
   1353   1.1  riastrad }
   1354   1.1  riastrad 
   1355   1.1  riastrad static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
   1356   1.1  riastrad 				     enum pipe pipe, enum port port,
   1357   1.1  riastrad 				     i915_reg_t hdmi_reg)
   1358   1.1  riastrad {
   1359   1.1  riastrad 	enum pipe port_pipe;
   1360   1.1  riastrad 	bool state;
   1361   1.1  riastrad 
   1362   1.1  riastrad 	state = intel_sdvo_port_enabled(dev_priv, hdmi_reg, &port_pipe);
   1363   1.1  riastrad 
   1364   1.1  riastrad 	I915_STATE_WARN(state && port_pipe == pipe,
   1365   1.1  riastrad 			"PCH HDMI %c enabled on transcoder %c, should be disabled\n",
   1366   1.1  riastrad 			port_name(port), pipe_name(pipe));
   1367   1.1  riastrad 
   1368   1.1  riastrad 	I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
   1369   1.1  riastrad 			"IBX PCH HDMI %c still using transcoder B\n",
   1370   1.1  riastrad 			port_name(port));
   1371   1.1  riastrad }
   1372   1.1  riastrad 
   1373   1.1  riastrad static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
   1374   1.1  riastrad 				      enum pipe pipe)
   1375   1.1  riastrad {
   1376   1.1  riastrad 	enum pipe port_pipe;
   1377   1.1  riastrad 
   1378   1.1  riastrad 	assert_pch_dp_disabled(dev_priv, pipe, PORT_B, PCH_DP_B);
   1379   1.1  riastrad 	assert_pch_dp_disabled(dev_priv, pipe, PORT_C, PCH_DP_C);
   1380   1.1  riastrad 	assert_pch_dp_disabled(dev_priv, pipe, PORT_D, PCH_DP_D);
   1381   1.1  riastrad 
   1382   1.1  riastrad 	I915_STATE_WARN(intel_crt_port_enabled(dev_priv, PCH_ADPA, &port_pipe) &&
   1383   1.1  riastrad 			port_pipe == pipe,
   1384   1.1  riastrad 			"PCH VGA enabled on transcoder %c, should be disabled\n",
   1385   1.1  riastrad 			pipe_name(pipe));
   1386   1.1  riastrad 
   1387   1.1  riastrad 	I915_STATE_WARN(intel_lvds_port_enabled(dev_priv, PCH_LVDS, &port_pipe) &&
   1388   1.1  riastrad 			port_pipe == pipe,
   1389   1.1  riastrad 			"PCH LVDS enabled on transcoder %c, should be disabled\n",
   1390   1.1  riastrad 			pipe_name(pipe));
   1391   1.1  riastrad 
   1392   1.1  riastrad 	/* PCH SDVOB multiplex with HDMIB */
   1393   1.1  riastrad 	assert_pch_hdmi_disabled(dev_priv, pipe, PORT_B, PCH_HDMIB);
   1394   1.1  riastrad 	assert_pch_hdmi_disabled(dev_priv, pipe, PORT_C, PCH_HDMIC);
   1395   1.1  riastrad 	assert_pch_hdmi_disabled(dev_priv, pipe, PORT_D, PCH_HDMID);
   1396   1.1  riastrad }
   1397   1.1  riastrad 
   1398   1.1  riastrad static void _vlv_enable_pll(struct intel_crtc *crtc,
   1399   1.1  riastrad 			    const struct intel_crtc_state *pipe_config)
   1400   1.1  riastrad {
   1401   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1402   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1403   1.1  riastrad 
   1404   1.1  riastrad 	I915_WRITE(DPLL(pipe), pipe_config->dpll_hw_state.dpll);
   1405   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   1406   1.1  riastrad 	udelay(150);
   1407   1.1  riastrad 
   1408   1.1  riastrad 	if (intel_de_wait_for_set(dev_priv, DPLL(pipe), DPLL_LOCK_VLV, 1))
   1409   1.1  riastrad 		DRM_ERROR("DPLL %d failed to lock\n", pipe);
   1410   1.1  riastrad }
   1411   1.1  riastrad 
   1412   1.1  riastrad static void vlv_enable_pll(struct intel_crtc *crtc,
   1413   1.1  riastrad 			   const struct intel_crtc_state *pipe_config)
   1414   1.1  riastrad {
   1415   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1416   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1417   1.1  riastrad 
   1418   1.1  riastrad 	assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
   1419   1.1  riastrad 
   1420   1.1  riastrad 	/* PLL is protected by panel, make sure we can write it */
   1421   1.1  riastrad 	assert_panel_unlocked(dev_priv, pipe);
   1422   1.1  riastrad 
   1423   1.1  riastrad 	if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
   1424   1.1  riastrad 		_vlv_enable_pll(crtc, pipe_config);
   1425   1.1  riastrad 
   1426   1.1  riastrad 	I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
   1427   1.1  riastrad 	POSTING_READ(DPLL_MD(pipe));
   1428   1.1  riastrad }
   1429   1.1  riastrad 
   1430   1.1  riastrad 
   1431   1.1  riastrad static void _chv_enable_pll(struct intel_crtc *crtc,
   1432   1.1  riastrad 			    const struct intel_crtc_state *pipe_config)
   1433   1.1  riastrad {
   1434   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1435   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1436   1.1  riastrad 	enum dpio_channel port = vlv_pipe_to_channel(pipe);
   1437   1.1  riastrad 	u32 tmp;
   1438   1.1  riastrad 
   1439   1.1  riastrad 	vlv_dpio_get(dev_priv);
   1440   1.1  riastrad 
   1441   1.1  riastrad 	/* Enable back the 10bit clock to display controller */
   1442   1.1  riastrad 	tmp = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port));
   1443   1.1  riastrad 	tmp |= DPIO_DCLKP_EN;
   1444   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), tmp);
   1445   1.1  riastrad 
   1446   1.1  riastrad 	vlv_dpio_put(dev_priv);
   1447   1.1  riastrad 
   1448   1.1  riastrad 	/*
   1449   1.1  riastrad 	 * Need to wait > 100ns between dclkp clock enable bit and PLL enable.
   1450   1.1  riastrad 	 */
   1451   1.1  riastrad 	udelay(1);
   1452   1.1  riastrad 
   1453   1.1  riastrad 	/* Enable PLL */
   1454   1.1  riastrad 	I915_WRITE(DPLL(pipe), pipe_config->dpll_hw_state.dpll);
   1455   1.1  riastrad 
   1456   1.1  riastrad 	/* Check PLL is locked */
   1457   1.1  riastrad 	if (intel_de_wait_for_set(dev_priv, DPLL(pipe), DPLL_LOCK_VLV, 1))
   1458   1.1  riastrad 		DRM_ERROR("PLL %d failed to lock\n", pipe);
   1459   1.1  riastrad }
   1460   1.1  riastrad 
   1461   1.1  riastrad static void chv_enable_pll(struct intel_crtc *crtc,
   1462   1.1  riastrad 			   const struct intel_crtc_state *pipe_config)
   1463   1.1  riastrad {
   1464   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1465   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1466   1.1  riastrad 
   1467   1.1  riastrad 	assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
   1468   1.1  riastrad 
   1469   1.1  riastrad 	/* PLL is protected by panel, make sure we can write it */
   1470   1.1  riastrad 	assert_panel_unlocked(dev_priv, pipe);
   1471   1.1  riastrad 
   1472   1.1  riastrad 	if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
   1473   1.1  riastrad 		_chv_enable_pll(crtc, pipe_config);
   1474   1.1  riastrad 
   1475   1.1  riastrad 	if (pipe != PIPE_A) {
   1476   1.1  riastrad 		/*
   1477   1.1  riastrad 		 * WaPixelRepeatModeFixForC0:chv
   1478   1.1  riastrad 		 *
   1479   1.1  riastrad 		 * DPLLCMD is AWOL. Use chicken bits to propagate
   1480   1.1  riastrad 		 * the value from DPLLBMD to either pipe B or C.
   1481   1.1  riastrad 		 */
   1482   1.1  riastrad 		I915_WRITE(CBR4_VLV, CBR_DPLLBMD_PIPE(pipe));
   1483   1.1  riastrad 		I915_WRITE(DPLL_MD(PIPE_B), pipe_config->dpll_hw_state.dpll_md);
   1484   1.1  riastrad 		I915_WRITE(CBR4_VLV, 0);
   1485   1.1  riastrad 		dev_priv->chv_dpll_md[pipe] = pipe_config->dpll_hw_state.dpll_md;
   1486   1.1  riastrad 
   1487   1.1  riastrad 		/*
   1488   1.1  riastrad 		 * DPLLB VGA mode also seems to cause problems.
   1489   1.1  riastrad 		 * We should always have it disabled.
   1490   1.1  riastrad 		 */
   1491   1.1  riastrad 		WARN_ON((I915_READ(DPLL(PIPE_B)) & DPLL_VGA_MODE_DIS) == 0);
   1492   1.1  riastrad 	} else {
   1493   1.1  riastrad 		I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
   1494   1.1  riastrad 		POSTING_READ(DPLL_MD(pipe));
   1495   1.1  riastrad 	}
   1496   1.1  riastrad }
   1497   1.1  riastrad 
   1498   1.1  riastrad static bool i9xx_has_pps(struct drm_i915_private *dev_priv)
   1499   1.1  riastrad {
   1500   1.1  riastrad 	if (IS_I830(dev_priv))
   1501   1.1  riastrad 		return false;
   1502   1.1  riastrad 
   1503   1.1  riastrad 	return IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
   1504   1.1  riastrad }
   1505   1.1  riastrad 
   1506   1.1  riastrad static void i9xx_enable_pll(struct intel_crtc *crtc,
   1507   1.1  riastrad 			    const struct intel_crtc_state *crtc_state)
   1508   1.1  riastrad {
   1509   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1510   1.1  riastrad 	i915_reg_t reg = DPLL(crtc->pipe);
   1511   1.1  riastrad 	u32 dpll = crtc_state->dpll_hw_state.dpll;
   1512   1.1  riastrad 	int i;
   1513   1.1  riastrad 
   1514   1.1  riastrad 	assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
   1515   1.1  riastrad 
   1516   1.1  riastrad 	/* PLL is protected by panel, make sure we can write it */
   1517   1.1  riastrad 	if (i9xx_has_pps(dev_priv))
   1518   1.1  riastrad 		assert_panel_unlocked(dev_priv, crtc->pipe);
   1519   1.1  riastrad 
   1520   1.1  riastrad 	/*
   1521   1.1  riastrad 	 * Apparently we need to have VGA mode enabled prior to changing
   1522   1.1  riastrad 	 * the P1/P2 dividers. Otherwise the DPLL will keep using the old
   1523   1.1  riastrad 	 * dividers, even though the register value does change.
   1524   1.1  riastrad 	 */
   1525   1.1  riastrad 	I915_WRITE(reg, dpll & ~DPLL_VGA_MODE_DIS);
   1526   1.1  riastrad 	I915_WRITE(reg, dpll);
   1527   1.1  riastrad 
   1528   1.1  riastrad 	/* Wait for the clocks to stabilize. */
   1529   1.1  riastrad 	POSTING_READ(reg);
   1530   1.1  riastrad 	udelay(150);
   1531   1.1  riastrad 
   1532   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4) {
   1533   1.1  riastrad 		I915_WRITE(DPLL_MD(crtc->pipe),
   1534   1.1  riastrad 			   crtc_state->dpll_hw_state.dpll_md);
   1535   1.1  riastrad 	} else {
   1536   1.1  riastrad 		/* The pixel multiplier can only be updated once the
   1537   1.1  riastrad 		 * DPLL is enabled and the clocks are stable.
   1538   1.1  riastrad 		 *
   1539   1.1  riastrad 		 * So write it again.
   1540   1.1  riastrad 		 */
   1541   1.1  riastrad 		I915_WRITE(reg, dpll);
   1542   1.1  riastrad 	}
   1543   1.1  riastrad 
   1544   1.1  riastrad 	/* We do this three times for luck */
   1545   1.1  riastrad 	for (i = 0; i < 3; i++) {
   1546   1.1  riastrad 		I915_WRITE(reg, dpll);
   1547   1.1  riastrad 		POSTING_READ(reg);
   1548   1.1  riastrad 		udelay(150); /* wait for warmup */
   1549   1.1  riastrad 	}
   1550   1.1  riastrad }
   1551   1.1  riastrad 
   1552   1.1  riastrad static void i9xx_disable_pll(const struct intel_crtc_state *crtc_state)
   1553   1.1  riastrad {
   1554   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1555   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1556   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1557   1.1  riastrad 
   1558   1.1  riastrad 	/* Don't disable pipe or pipe PLLs if needed */
   1559   1.1  riastrad 	if (IS_I830(dev_priv))
   1560   1.1  riastrad 		return;
   1561   1.1  riastrad 
   1562   1.1  riastrad 	/* Make sure the pipe isn't still relying on us */
   1563   1.1  riastrad 	assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
   1564   1.1  riastrad 
   1565   1.1  riastrad 	I915_WRITE(DPLL(pipe), DPLL_VGA_MODE_DIS);
   1566   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   1567   1.1  riastrad }
   1568   1.1  riastrad 
   1569   1.1  riastrad static void vlv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
   1570   1.1  riastrad {
   1571   1.1  riastrad 	u32 val;
   1572   1.1  riastrad 
   1573   1.1  riastrad 	/* Make sure the pipe isn't still relying on us */
   1574   1.1  riastrad 	assert_pipe_disabled(dev_priv, (enum transcoder)pipe);
   1575   1.1  riastrad 
   1576   1.1  riastrad 	val = DPLL_INTEGRATED_REF_CLK_VLV |
   1577   1.1  riastrad 		DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
   1578   1.1  riastrad 	if (pipe != PIPE_A)
   1579   1.1  riastrad 		val |= DPLL_INTEGRATED_CRI_CLK_VLV;
   1580   1.1  riastrad 
   1581   1.1  riastrad 	I915_WRITE(DPLL(pipe), val);
   1582   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   1583   1.1  riastrad }
   1584   1.1  riastrad 
   1585   1.1  riastrad static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
   1586   1.1  riastrad {
   1587   1.1  riastrad 	enum dpio_channel port = vlv_pipe_to_channel(pipe);
   1588   1.1  riastrad 	u32 val;
   1589   1.1  riastrad 
   1590   1.1  riastrad 	/* Make sure the pipe isn't still relying on us */
   1591   1.1  riastrad 	assert_pipe_disabled(dev_priv, (enum transcoder)pipe);
   1592   1.1  riastrad 
   1593   1.1  riastrad 	val = DPLL_SSC_REF_CLK_CHV |
   1594   1.1  riastrad 		DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
   1595   1.1  riastrad 	if (pipe != PIPE_A)
   1596   1.1  riastrad 		val |= DPLL_INTEGRATED_CRI_CLK_VLV;
   1597   1.1  riastrad 
   1598   1.1  riastrad 	I915_WRITE(DPLL(pipe), val);
   1599   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   1600   1.1  riastrad 
   1601   1.1  riastrad 	vlv_dpio_get(dev_priv);
   1602   1.1  riastrad 
   1603   1.1  riastrad 	/* Disable 10bit clock to display controller */
   1604   1.1  riastrad 	val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port));
   1605   1.1  riastrad 	val &= ~DPIO_DCLKP_EN;
   1606   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), val);
   1607   1.1  riastrad 
   1608   1.1  riastrad 	vlv_dpio_put(dev_priv);
   1609   1.1  riastrad }
   1610   1.1  riastrad 
   1611   1.1  riastrad void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
   1612   1.1  riastrad 			 struct intel_digital_port *dport,
   1613   1.1  riastrad 			 unsigned int expected_mask)
   1614   1.1  riastrad {
   1615   1.1  riastrad 	u32 port_mask;
   1616   1.1  riastrad 	i915_reg_t dpll_reg;
   1617   1.1  riastrad 
   1618   1.1  riastrad 	switch (dport->base.port) {
   1619   1.1  riastrad 	case PORT_B:
   1620   1.1  riastrad 		port_mask = DPLL_PORTB_READY_MASK;
   1621   1.1  riastrad 		dpll_reg = DPLL(0);
   1622   1.1  riastrad 		break;
   1623   1.1  riastrad 	case PORT_C:
   1624   1.1  riastrad 		port_mask = DPLL_PORTC_READY_MASK;
   1625   1.1  riastrad 		dpll_reg = DPLL(0);
   1626   1.1  riastrad 		expected_mask <<= 4;
   1627   1.1  riastrad 		break;
   1628   1.1  riastrad 	case PORT_D:
   1629   1.1  riastrad 		port_mask = DPLL_PORTD_READY_MASK;
   1630   1.1  riastrad 		dpll_reg = DPIO_PHY_STATUS;
   1631   1.1  riastrad 		break;
   1632   1.1  riastrad 	default:
   1633   1.1  riastrad 		BUG();
   1634   1.1  riastrad 	}
   1635   1.1  riastrad 
   1636   1.1  riastrad 	if (intel_de_wait_for_register(dev_priv, dpll_reg,
   1637   1.1  riastrad 				       port_mask, expected_mask, 1000))
   1638   1.1  riastrad 		WARN(1, "timed out waiting for [ENCODER:%d:%s] port ready: got 0x%x, expected 0x%x\n",
   1639   1.1  riastrad 		     dport->base.base.base.id, dport->base.base.name,
   1640   1.1  riastrad 		     I915_READ(dpll_reg) & port_mask, expected_mask);
   1641   1.1  riastrad }
   1642   1.1  riastrad 
   1643   1.1  riastrad static void ilk_enable_pch_transcoder(const struct intel_crtc_state *crtc_state)
   1644   1.1  riastrad {
   1645   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1646   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1647   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1648   1.1  riastrad 	i915_reg_t reg;
   1649   1.1  riastrad 	u32 val, pipeconf_val;
   1650   1.1  riastrad 
   1651   1.1  riastrad 	/* Make sure PCH DPLL is enabled */
   1652   1.1  riastrad 	assert_shared_dpll_enabled(dev_priv, crtc_state->shared_dpll);
   1653   1.1  riastrad 
   1654   1.1  riastrad 	/* FDI must be feeding us bits for PCH ports */
   1655   1.1  riastrad 	assert_fdi_tx_enabled(dev_priv, pipe);
   1656   1.1  riastrad 	assert_fdi_rx_enabled(dev_priv, pipe);
   1657   1.1  riastrad 
   1658   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   1659   1.1  riastrad 		reg = TRANS_CHICKEN2(pipe);
   1660   1.1  riastrad 		val = I915_READ(reg);
   1661   1.1  riastrad 		/*
   1662   1.1  riastrad 		 * Workaround: Set the timing override bit
   1663   1.1  riastrad 		 * before enabling the pch transcoder.
   1664   1.1  riastrad 		 */
   1665   1.1  riastrad 		val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
   1666   1.1  riastrad 		/* Configure frame start delay to match the CPU */
   1667   1.1  riastrad 		val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
   1668   1.1  riastrad 		val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
   1669   1.1  riastrad 		I915_WRITE(reg, val);
   1670   1.1  riastrad 	}
   1671   1.1  riastrad 
   1672   1.1  riastrad 	reg = PCH_TRANSCONF(pipe);
   1673   1.1  riastrad 	val = I915_READ(reg);
   1674   1.1  riastrad 	pipeconf_val = I915_READ(PIPECONF(pipe));
   1675   1.1  riastrad 
   1676   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv)) {
   1677   1.1  riastrad 		/* Configure frame start delay to match the CPU */
   1678   1.1  riastrad 		val &= ~TRANS_FRAME_START_DELAY_MASK;
   1679   1.1  riastrad 		val |= TRANS_FRAME_START_DELAY(0);
   1680   1.1  riastrad 
   1681   1.1  riastrad 		/*
   1682   1.1  riastrad 		 * Make the BPC in transcoder be consistent with
   1683   1.1  riastrad 		 * that in pipeconf reg. For HDMI we must use 8bpc
   1684   1.1  riastrad 		 * here for both 8bpc and 12bpc.
   1685   1.1  riastrad 		 */
   1686   1.1  riastrad 		val &= ~PIPECONF_BPC_MASK;
   1687   1.1  riastrad 		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
   1688   1.1  riastrad 			val |= PIPECONF_8BPC;
   1689   1.1  riastrad 		else
   1690   1.1  riastrad 			val |= pipeconf_val & PIPECONF_BPC_MASK;
   1691   1.1  riastrad 	}
   1692   1.1  riastrad 
   1693   1.1  riastrad 	val &= ~TRANS_INTERLACE_MASK;
   1694   1.1  riastrad 	if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK) {
   1695   1.1  riastrad 		if (HAS_PCH_IBX(dev_priv) &&
   1696   1.1  riastrad 		    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
   1697   1.1  riastrad 			val |= TRANS_LEGACY_INTERLACED_ILK;
   1698   1.1  riastrad 		else
   1699   1.1  riastrad 			val |= TRANS_INTERLACED;
   1700   1.1  riastrad 	} else {
   1701   1.1  riastrad 		val |= TRANS_PROGRESSIVE;
   1702   1.1  riastrad 	}
   1703   1.1  riastrad 
   1704   1.1  riastrad 	I915_WRITE(reg, val | TRANS_ENABLE);
   1705   1.1  riastrad 	if (intel_de_wait_for_set(dev_priv, reg, TRANS_STATE_ENABLE, 100))
   1706   1.1  riastrad 		DRM_ERROR("failed to enable transcoder %c\n", pipe_name(pipe));
   1707   1.1  riastrad }
   1708   1.1  riastrad 
   1709   1.1  riastrad static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
   1710   1.1  riastrad 				      enum transcoder cpu_transcoder)
   1711   1.1  riastrad {
   1712   1.1  riastrad 	u32 val, pipeconf_val;
   1713   1.1  riastrad 
   1714   1.1  riastrad 	/* FDI must be feeding us bits for PCH ports */
   1715   1.1  riastrad 	assert_fdi_tx_enabled(dev_priv, (enum pipe) cpu_transcoder);
   1716   1.1  riastrad 	assert_fdi_rx_enabled(dev_priv, PIPE_A);
   1717   1.1  riastrad 
   1718   1.1  riastrad 	val = I915_READ(TRANS_CHICKEN2(PIPE_A));
   1719   1.1  riastrad 	/* Workaround: set timing override bit. */
   1720   1.1  riastrad 	val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
   1721   1.1  riastrad 	/* Configure frame start delay to match the CPU */
   1722   1.1  riastrad 	val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
   1723   1.1  riastrad 	val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
   1724   1.1  riastrad 	I915_WRITE(TRANS_CHICKEN2(PIPE_A), val);
   1725   1.1  riastrad 
   1726   1.1  riastrad 	val = TRANS_ENABLE;
   1727   1.1  riastrad 	pipeconf_val = I915_READ(PIPECONF(cpu_transcoder));
   1728   1.1  riastrad 
   1729   1.1  riastrad 	if ((pipeconf_val & PIPECONF_INTERLACE_MASK_HSW) ==
   1730   1.1  riastrad 	    PIPECONF_INTERLACED_ILK)
   1731   1.1  riastrad 		val |= TRANS_INTERLACED;
   1732   1.1  riastrad 	else
   1733   1.1  riastrad 		val |= TRANS_PROGRESSIVE;
   1734   1.1  riastrad 
   1735   1.1  riastrad 	I915_WRITE(LPT_TRANSCONF, val);
   1736   1.1  riastrad 	if (intel_de_wait_for_set(dev_priv, LPT_TRANSCONF,
   1737   1.1  riastrad 				  TRANS_STATE_ENABLE, 100))
   1738   1.1  riastrad 		DRM_ERROR("Failed to enable PCH transcoder\n");
   1739   1.1  riastrad }
   1740   1.1  riastrad 
   1741   1.1  riastrad static void ilk_disable_pch_transcoder(struct drm_i915_private *dev_priv,
   1742   1.1  riastrad 				       enum pipe pipe)
   1743   1.1  riastrad {
   1744   1.1  riastrad 	i915_reg_t reg;
   1745   1.1  riastrad 	u32 val;
   1746   1.1  riastrad 
   1747   1.1  riastrad 	/* FDI relies on the transcoder */
   1748   1.1  riastrad 	assert_fdi_tx_disabled(dev_priv, pipe);
   1749   1.1  riastrad 	assert_fdi_rx_disabled(dev_priv, pipe);
   1750   1.1  riastrad 
   1751   1.1  riastrad 	/* Ports must be off as well */
   1752   1.1  riastrad 	assert_pch_ports_disabled(dev_priv, pipe);
   1753   1.1  riastrad 
   1754   1.1  riastrad 	reg = PCH_TRANSCONF(pipe);
   1755   1.1  riastrad 	val = I915_READ(reg);
   1756   1.1  riastrad 	val &= ~TRANS_ENABLE;
   1757   1.1  riastrad 	I915_WRITE(reg, val);
   1758   1.1  riastrad 	/* wait for PCH transcoder off, transcoder state */
   1759   1.1  riastrad 	if (intel_de_wait_for_clear(dev_priv, reg, TRANS_STATE_ENABLE, 50))
   1760   1.1  riastrad 		DRM_ERROR("failed to disable transcoder %c\n", pipe_name(pipe));
   1761   1.1  riastrad 
   1762   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   1763   1.1  riastrad 		/* Workaround: Clear the timing override chicken bit again. */
   1764   1.1  riastrad 		reg = TRANS_CHICKEN2(pipe);
   1765   1.1  riastrad 		val = I915_READ(reg);
   1766   1.1  riastrad 		val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
   1767   1.1  riastrad 		I915_WRITE(reg, val);
   1768   1.1  riastrad 	}
   1769   1.1  riastrad }
   1770   1.1  riastrad 
   1771   1.1  riastrad void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv)
   1772   1.1  riastrad {
   1773   1.1  riastrad 	u32 val;
   1774   1.1  riastrad 
   1775   1.1  riastrad 	val = I915_READ(LPT_TRANSCONF);
   1776   1.1  riastrad 	val &= ~TRANS_ENABLE;
   1777   1.1  riastrad 	I915_WRITE(LPT_TRANSCONF, val);
   1778   1.1  riastrad 	/* wait for PCH transcoder off, transcoder state */
   1779   1.1  riastrad 	if (intel_de_wait_for_clear(dev_priv, LPT_TRANSCONF,
   1780   1.1  riastrad 				    TRANS_STATE_ENABLE, 50))
   1781   1.1  riastrad 		DRM_ERROR("Failed to disable PCH transcoder\n");
   1782   1.1  riastrad 
   1783   1.1  riastrad 	/* Workaround: clear timing override bit. */
   1784   1.1  riastrad 	val = I915_READ(TRANS_CHICKEN2(PIPE_A));
   1785   1.1  riastrad 	val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
   1786   1.1  riastrad 	I915_WRITE(TRANS_CHICKEN2(PIPE_A), val);
   1787   1.1  riastrad }
   1788   1.1  riastrad 
   1789   1.1  riastrad enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc)
   1790   1.1  riastrad {
   1791   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1792   1.1  riastrad 
   1793   1.1  riastrad 	if (HAS_PCH_LPT(dev_priv))
   1794   1.1  riastrad 		return PIPE_A;
   1795   1.1  riastrad 	else
   1796   1.1  riastrad 		return crtc->pipe;
   1797   1.1  riastrad }
   1798   1.1  riastrad 
   1799   1.1  riastrad static u32 intel_crtc_max_vblank_count(const struct intel_crtc_state *crtc_state)
   1800   1.1  riastrad {
   1801   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   1802   1.1  riastrad 
   1803   1.1  riastrad 	/*
   1804   1.1  riastrad 	 * On i965gm the hardware frame counter reads
   1805   1.1  riastrad 	 * zero when the TV encoder is enabled :(
   1806   1.1  riastrad 	 */
   1807   1.1  riastrad 	if (IS_I965GM(dev_priv) &&
   1808   1.1  riastrad 	    (crtc_state->output_types & BIT(INTEL_OUTPUT_TVOUT)))
   1809   1.1  riastrad 		return 0;
   1810   1.1  riastrad 
   1811   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
   1812   1.1  riastrad 		return 0xffffffff; /* full 32 bit counter */
   1813   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 3)
   1814   1.1  riastrad 		return 0xffffff; /* only 24 bits of frame count */
   1815   1.1  riastrad 	else
   1816   1.1  riastrad 		return 0; /* Gen2 doesn't have a hardware frame counter */
   1817   1.1  riastrad }
   1818   1.1  riastrad 
   1819   1.1  riastrad static void intel_crtc_vblank_on(const struct intel_crtc_state *crtc_state)
   1820   1.1  riastrad {
   1821   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1822   1.1  riastrad 
   1823   1.1  riastrad 	assert_vblank_disabled(&crtc->base);
   1824   1.1  riastrad 	drm_crtc_set_max_vblank_count(&crtc->base,
   1825   1.1  riastrad 				      intel_crtc_max_vblank_count(crtc_state));
   1826   1.1  riastrad 	drm_crtc_vblank_on(&crtc->base);
   1827   1.1  riastrad }
   1828   1.1  riastrad 
   1829   1.1  riastrad void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state)
   1830   1.1  riastrad {
   1831   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1832   1.1  riastrad 
   1833   1.1  riastrad 	drm_crtc_vblank_off(&crtc->base);
   1834   1.1  riastrad 	assert_vblank_disabled(&crtc->base);
   1835   1.1  riastrad }
   1836   1.1  riastrad 
   1837   1.1  riastrad static void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state)
   1838   1.1  riastrad {
   1839   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   1840   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1841   1.1  riastrad 	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
   1842   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1843   1.1  riastrad 	i915_reg_t reg;
   1844   1.1  riastrad 	u32 val;
   1845   1.1  riastrad 
   1846   1.1  riastrad 	DRM_DEBUG_KMS("enabling pipe %c\n", pipe_name(pipe));
   1847   1.1  riastrad 
   1848   1.1  riastrad 	assert_planes_disabled(crtc);
   1849   1.1  riastrad 
   1850   1.1  riastrad 	/*
   1851   1.1  riastrad 	 * A pipe without a PLL won't actually be able to drive bits from
   1852   1.1  riastrad 	 * a plane.  On ILK+ the pipe PLLs are integrated, so we don't
   1853   1.1  riastrad 	 * need the check.
   1854   1.1  riastrad 	 */
   1855   1.1  riastrad 	if (HAS_GMCH(dev_priv)) {
   1856   1.1  riastrad 		if (intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI))
   1857   1.1  riastrad 			assert_dsi_pll_enabled(dev_priv);
   1858   1.1  riastrad 		else
   1859   1.1  riastrad 			assert_pll_enabled(dev_priv, pipe);
   1860   1.1  riastrad 	} else {
   1861   1.1  riastrad 		if (new_crtc_state->has_pch_encoder) {
   1862   1.1  riastrad 			/* if driving the PCH, we need FDI enabled */
   1863   1.1  riastrad 			assert_fdi_rx_pll_enabled(dev_priv,
   1864   1.1  riastrad 						  intel_crtc_pch_transcoder(crtc));
   1865   1.1  riastrad 			assert_fdi_tx_pll_enabled(dev_priv,
   1866   1.1  riastrad 						  (enum pipe) cpu_transcoder);
   1867   1.1  riastrad 		}
   1868   1.1  riastrad 		/* FIXME: assert CPU port conditions for SNB+ */
   1869   1.1  riastrad 	}
   1870   1.1  riastrad 
   1871   1.1  riastrad 	trace_intel_pipe_enable(crtc);
   1872   1.1  riastrad 
   1873   1.1  riastrad 	reg = PIPECONF(cpu_transcoder);
   1874   1.1  riastrad 	val = I915_READ(reg);
   1875   1.1  riastrad 	if (val & PIPECONF_ENABLE) {
   1876   1.1  riastrad 		/* we keep both pipes enabled on 830 */
   1877   1.1  riastrad 		WARN_ON(!IS_I830(dev_priv));
   1878   1.1  riastrad 		return;
   1879   1.1  riastrad 	}
   1880   1.1  riastrad 
   1881   1.1  riastrad 	I915_WRITE(reg, val | PIPECONF_ENABLE);
   1882   1.1  riastrad 	POSTING_READ(reg);
   1883   1.1  riastrad 
   1884   1.1  riastrad 	/*
   1885   1.1  riastrad 	 * Until the pipe starts PIPEDSL reads will return a stale value,
   1886   1.1  riastrad 	 * which causes an apparent vblank timestamp jump when PIPEDSL
   1887   1.1  riastrad 	 * resets to its proper value. That also messes up the frame count
   1888   1.1  riastrad 	 * when it's derived from the timestamps. So let's wait for the
   1889   1.1  riastrad 	 * pipe to start properly before we call drm_crtc_vblank_on()
   1890   1.1  riastrad 	 */
   1891   1.1  riastrad 	if (intel_crtc_max_vblank_count(new_crtc_state) == 0)
   1892   1.1  riastrad 		intel_wait_for_pipe_scanline_moving(crtc);
   1893   1.1  riastrad }
   1894   1.1  riastrad 
   1895   1.1  riastrad void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state)
   1896   1.1  riastrad {
   1897   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   1898   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   1899   1.1  riastrad 	enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
   1900   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1901   1.1  riastrad 	i915_reg_t reg;
   1902   1.1  riastrad 	u32 val;
   1903   1.1  riastrad 
   1904   1.1  riastrad 	DRM_DEBUG_KMS("disabling pipe %c\n", pipe_name(pipe));
   1905   1.1  riastrad 
   1906   1.1  riastrad 	/*
   1907   1.1  riastrad 	 * Make sure planes won't keep trying to pump pixels to us,
   1908   1.1  riastrad 	 * or we might hang the display.
   1909   1.1  riastrad 	 */
   1910   1.1  riastrad 	assert_planes_disabled(crtc);
   1911   1.1  riastrad 
   1912   1.1  riastrad 	trace_intel_pipe_disable(crtc);
   1913   1.1  riastrad 
   1914   1.1  riastrad 	reg = PIPECONF(cpu_transcoder);
   1915   1.1  riastrad 	val = I915_READ(reg);
   1916   1.1  riastrad 	if ((val & PIPECONF_ENABLE) == 0)
   1917   1.1  riastrad 		return;
   1918   1.1  riastrad 
   1919   1.1  riastrad 	/*
   1920   1.1  riastrad 	 * Double wide has implications for planes
   1921   1.1  riastrad 	 * so best keep it disabled when not needed.
   1922   1.1  riastrad 	 */
   1923   1.1  riastrad 	if (old_crtc_state->double_wide)
   1924   1.1  riastrad 		val &= ~PIPECONF_DOUBLE_WIDE;
   1925   1.1  riastrad 
   1926   1.1  riastrad 	/* Don't disable pipe or pipe PLLs if needed */
   1927   1.1  riastrad 	if (!IS_I830(dev_priv))
   1928   1.1  riastrad 		val &= ~PIPECONF_ENABLE;
   1929   1.1  riastrad 
   1930   1.1  riastrad 	I915_WRITE(reg, val);
   1931   1.1  riastrad 	if ((val & PIPECONF_ENABLE) == 0)
   1932   1.1  riastrad 		intel_wait_for_pipe_off(old_crtc_state);
   1933   1.1  riastrad }
   1934   1.1  riastrad 
   1935   1.1  riastrad static unsigned int intel_tile_size(const struct drm_i915_private *dev_priv)
   1936   1.1  riastrad {
   1937   1.1  riastrad 	return IS_GEN(dev_priv, 2) ? 2048 : 4096;
   1938   1.1  riastrad }
   1939   1.1  riastrad 
   1940   1.1  riastrad static bool is_ccs_plane(const struct drm_framebuffer *fb, int plane)
   1941   1.1  riastrad {
   1942   1.1  riastrad 	if (!is_ccs_modifier(fb->modifier))
   1943   1.1  riastrad 		return false;
   1944   1.1  riastrad 
   1945   1.1  riastrad 	return plane >= fb->format->num_planes / 2;
   1946   1.1  riastrad }
   1947   1.1  riastrad 
   1948   1.1  riastrad static bool is_gen12_ccs_modifier(u64 modifier)
   1949   1.1  riastrad {
   1950   1.1  riastrad 	return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ||
   1951   1.1  riastrad 	       modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
   1952   1.1  riastrad 
   1953   1.1  riastrad }
   1954   1.1  riastrad 
   1955   1.1  riastrad static bool is_gen12_ccs_plane(const struct drm_framebuffer *fb, int plane)
   1956   1.1  riastrad {
   1957   1.1  riastrad 	return is_gen12_ccs_modifier(fb->modifier) && is_ccs_plane(fb, plane);
   1958   1.1  riastrad }
   1959   1.1  riastrad 
   1960   1.1  riastrad static bool is_aux_plane(const struct drm_framebuffer *fb, int plane)
   1961   1.1  riastrad {
   1962   1.1  riastrad 	if (is_ccs_modifier(fb->modifier))
   1963   1.1  riastrad 		return is_ccs_plane(fb, plane);
   1964   1.1  riastrad 
   1965   1.1  riastrad 	return plane == 1;
   1966   1.1  riastrad }
   1967   1.1  riastrad 
   1968   1.1  riastrad static int main_to_ccs_plane(const struct drm_framebuffer *fb, int main_plane)
   1969   1.1  riastrad {
   1970   1.1  riastrad 	WARN_ON(!is_ccs_modifier(fb->modifier) ||
   1971   1.1  riastrad 		(main_plane && main_plane >= fb->format->num_planes / 2));
   1972   1.1  riastrad 
   1973   1.1  riastrad 	return fb->format->num_planes / 2 + main_plane;
   1974   1.1  riastrad }
   1975   1.1  riastrad 
   1976   1.1  riastrad static int ccs_to_main_plane(const struct drm_framebuffer *fb, int ccs_plane)
   1977   1.1  riastrad {
   1978   1.1  riastrad 	WARN_ON(!is_ccs_modifier(fb->modifier) ||
   1979   1.1  riastrad 		ccs_plane < fb->format->num_planes / 2);
   1980   1.1  riastrad 
   1981   1.1  riastrad 	return ccs_plane - fb->format->num_planes / 2;
   1982   1.1  riastrad }
   1983   1.1  riastrad 
   1984   1.1  riastrad /* Return either the main plane's CCS or - if not a CCS FB - UV plane */
   1985   1.1  riastrad int intel_main_to_aux_plane(const struct drm_framebuffer *fb, int main_plane)
   1986   1.1  riastrad {
   1987   1.1  riastrad 	if (is_ccs_modifier(fb->modifier))
   1988   1.1  riastrad 		return main_to_ccs_plane(fb, main_plane);
   1989   1.1  riastrad 
   1990   1.1  riastrad 	return 1;
   1991   1.1  riastrad }
   1992   1.1  riastrad 
   1993   1.1  riastrad bool
   1994   1.1  riastrad intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info,
   1995   1.1  riastrad 				    uint64_t modifier)
   1996   1.1  riastrad {
   1997   1.1  riastrad 	return info->is_yuv &&
   1998   1.1  riastrad 	       info->num_planes == (is_ccs_modifier(modifier) ? 4 : 2);
   1999   1.1  riastrad }
   2000   1.1  riastrad 
   2001   1.1  riastrad static bool is_semiplanar_uv_plane(const struct drm_framebuffer *fb,
   2002   1.1  riastrad 				   int color_plane)
   2003   1.1  riastrad {
   2004   1.1  riastrad 	return intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) &&
   2005   1.1  riastrad 	       color_plane == 1;
   2006   1.1  riastrad }
   2007   1.1  riastrad 
   2008   1.1  riastrad static unsigned int
   2009   1.1  riastrad intel_tile_width_bytes(const struct drm_framebuffer *fb, int color_plane)
   2010   1.1  riastrad {
   2011   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(fb->dev);
   2012   1.1  riastrad 	unsigned int cpp = fb->format->cpp[color_plane];
   2013   1.1  riastrad 
   2014   1.1  riastrad 	switch (fb->modifier) {
   2015   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   2016   1.1  riastrad 		return intel_tile_size(dev_priv);
   2017   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   2018   1.1  riastrad 		if (IS_GEN(dev_priv, 2))
   2019   1.1  riastrad 			return 128;
   2020   1.1  riastrad 		else
   2021   1.1  riastrad 			return 512;
   2022   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   2023   1.1  riastrad 		if (is_ccs_plane(fb, color_plane))
   2024   1.1  riastrad 			return 128;
   2025   1.1  riastrad 		/* fall through */
   2026   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
   2027   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   2028   1.1  riastrad 		if (is_ccs_plane(fb, color_plane))
   2029   1.1  riastrad 			return 64;
   2030   1.1  riastrad 		/* fall through */
   2031   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   2032   1.1  riastrad 		if (IS_GEN(dev_priv, 2) || HAS_128_BYTE_Y_TILING(dev_priv))
   2033   1.1  riastrad 			return 128;
   2034   1.1  riastrad 		else
   2035   1.1  riastrad 			return 512;
   2036   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   2037   1.1  riastrad 		if (is_ccs_plane(fb, color_plane))
   2038   1.1  riastrad 			return 128;
   2039   1.1  riastrad 		/* fall through */
   2040   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED:
   2041   1.1  riastrad 		switch (cpp) {
   2042   1.1  riastrad 		case 1:
   2043   1.1  riastrad 			return 64;
   2044   1.1  riastrad 		case 2:
   2045   1.1  riastrad 		case 4:
   2046   1.1  riastrad 			return 128;
   2047   1.1  riastrad 		case 8:
   2048   1.1  riastrad 		case 16:
   2049   1.1  riastrad 			return 256;
   2050   1.1  riastrad 		default:
   2051   1.1  riastrad 			MISSING_CASE(cpp);
   2052   1.1  riastrad 			return cpp;
   2053   1.1  riastrad 		}
   2054   1.1  riastrad 		break;
   2055   1.1  riastrad 	default:
   2056   1.1  riastrad 		MISSING_CASE(fb->modifier);
   2057   1.1  riastrad 		return cpp;
   2058   1.1  riastrad 	}
   2059   1.1  riastrad }
   2060   1.1  riastrad 
   2061   1.1  riastrad static unsigned int
   2062   1.1  riastrad intel_tile_height(const struct drm_framebuffer *fb, int color_plane)
   2063   1.1  riastrad {
   2064   1.1  riastrad 	if (is_gen12_ccs_plane(fb, color_plane))
   2065   1.1  riastrad 		return 1;
   2066   1.1  riastrad 
   2067   1.1  riastrad 	return intel_tile_size(to_i915(fb->dev)) /
   2068   1.1  riastrad 		intel_tile_width_bytes(fb, color_plane);
   2069   1.1  riastrad }
   2070   1.1  riastrad 
   2071   1.1  riastrad /* Return the tile dimensions in pixel units */
   2072   1.1  riastrad static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane,
   2073   1.1  riastrad 			    unsigned int *tile_width,
   2074   1.1  riastrad 			    unsigned int *tile_height)
   2075   1.1  riastrad {
   2076   1.1  riastrad 	unsigned int tile_width_bytes = intel_tile_width_bytes(fb, color_plane);
   2077   1.1  riastrad 	unsigned int cpp = fb->format->cpp[color_plane];
   2078   1.1  riastrad 
   2079   1.1  riastrad 	*tile_width = tile_width_bytes / cpp;
   2080   1.1  riastrad 	*tile_height = intel_tile_height(fb, color_plane);
   2081   1.1  riastrad }
   2082   1.1  riastrad 
   2083   1.1  riastrad static unsigned int intel_tile_row_size(const struct drm_framebuffer *fb,
   2084   1.1  riastrad 					int color_plane)
   2085   1.1  riastrad {
   2086   1.1  riastrad 	unsigned int tile_width, tile_height;
   2087   1.1  riastrad 
   2088   1.1  riastrad 	intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
   2089   1.1  riastrad 
   2090   1.1  riastrad 	return fb->pitches[color_plane] * tile_height;
   2091   1.1  riastrad }
   2092   1.1  riastrad 
   2093   1.1  riastrad unsigned int
   2094   1.1  riastrad intel_fb_align_height(const struct drm_framebuffer *fb,
   2095   1.1  riastrad 		      int color_plane, unsigned int height)
   2096   1.1  riastrad {
   2097   1.1  riastrad 	unsigned int tile_height = intel_tile_height(fb, color_plane);
   2098   1.1  riastrad 
   2099   1.1  riastrad 	return ALIGN(height, tile_height);
   2100   1.1  riastrad }
   2101   1.1  riastrad 
   2102   1.1  riastrad unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info)
   2103   1.1  riastrad {
   2104   1.1  riastrad 	unsigned int size = 0;
   2105   1.1  riastrad 	int i;
   2106   1.1  riastrad 
   2107   1.1  riastrad 	for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++)
   2108   1.1  riastrad 		size += rot_info->plane[i].width * rot_info->plane[i].height;
   2109   1.1  riastrad 
   2110   1.1  riastrad 	return size;
   2111   1.1  riastrad }
   2112   1.1  riastrad 
   2113   1.1  riastrad unsigned int intel_remapped_info_size(const struct intel_remapped_info *rem_info)
   2114   1.1  riastrad {
   2115   1.1  riastrad 	unsigned int size = 0;
   2116   1.1  riastrad 	int i;
   2117   1.1  riastrad 
   2118   1.1  riastrad 	for (i = 0 ; i < ARRAY_SIZE(rem_info->plane); i++)
   2119   1.1  riastrad 		size += rem_info->plane[i].width * rem_info->plane[i].height;
   2120   1.1  riastrad 
   2121   1.1  riastrad 	return size;
   2122   1.1  riastrad }
   2123   1.1  riastrad 
   2124   1.1  riastrad static void
   2125   1.1  riastrad intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
   2126   1.1  riastrad 			const struct drm_framebuffer *fb,
   2127   1.1  riastrad 			unsigned int rotation)
   2128   1.1  riastrad {
   2129   1.1  riastrad 	view->type = I915_GGTT_VIEW_NORMAL;
   2130   1.1  riastrad 	if (drm_rotation_90_or_270(rotation)) {
   2131   1.1  riastrad 		view->type = I915_GGTT_VIEW_ROTATED;
   2132   1.3  riastrad 		view->rotated = to_intel_framebuffer((struct drm_framebuffer *)__UNCONST(fb))->rot_info;
   2133   1.1  riastrad 	}
   2134   1.1  riastrad }
   2135   1.1  riastrad 
   2136   1.1  riastrad static unsigned int intel_cursor_alignment(const struct drm_i915_private *dev_priv)
   2137   1.1  riastrad {
   2138   1.1  riastrad 	if (IS_I830(dev_priv))
   2139   1.1  riastrad 		return 16 * 1024;
   2140   1.1  riastrad 	else if (IS_I85X(dev_priv))
   2141   1.1  riastrad 		return 256;
   2142   1.1  riastrad 	else if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
   2143   1.1  riastrad 		return 32;
   2144   1.1  riastrad 	else
   2145   1.1  riastrad 		return 4 * 1024;
   2146   1.1  riastrad }
   2147   1.1  riastrad 
   2148   1.1  riastrad static unsigned int intel_linear_alignment(const struct drm_i915_private *dev_priv)
   2149   1.1  riastrad {
   2150   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   2151   1.1  riastrad 		return 256 * 1024;
   2152   1.1  riastrad 	else if (IS_I965G(dev_priv) || IS_I965GM(dev_priv) ||
   2153   1.1  riastrad 		 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   2154   1.1  riastrad 		return 128 * 1024;
   2155   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 4)
   2156   1.1  riastrad 		return 4 * 1024;
   2157   1.1  riastrad 	else
   2158   1.1  riastrad 		return 0;
   2159   1.1  riastrad }
   2160   1.1  riastrad 
   2161   1.1  riastrad static unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
   2162   1.1  riastrad 					 int color_plane)
   2163   1.1  riastrad {
   2164   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(fb->dev);
   2165   1.1  riastrad 
   2166   1.1  riastrad 	/* AUX_DIST needs only 4K alignment */
   2167   1.1  riastrad 	if ((INTEL_GEN(dev_priv) < 12 && is_aux_plane(fb, color_plane)) ||
   2168   1.1  riastrad 	    is_ccs_plane(fb, color_plane))
   2169   1.1  riastrad 		return 4096;
   2170   1.1  riastrad 
   2171   1.1  riastrad 	switch (fb->modifier) {
   2172   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   2173   1.1  riastrad 		return intel_linear_alignment(dev_priv);
   2174   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   2175   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 9)
   2176   1.1  riastrad 			return 256 * 1024;
   2177   1.1  riastrad 		return 0;
   2178   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   2179   1.1  riastrad 		if (is_semiplanar_uv_plane(fb, color_plane))
   2180   1.1  riastrad 			return intel_tile_row_size(fb, color_plane);
   2181   1.1  riastrad 		/* Fall-through */
   2182   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
   2183   1.1  riastrad 		return 16 * 1024;
   2184   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   2185   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   2186   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   2187   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 12 &&
   2188   1.1  riastrad 		    is_semiplanar_uv_plane(fb, color_plane))
   2189   1.1  riastrad 			return intel_tile_row_size(fb, color_plane);
   2190   1.1  riastrad 		/* Fall-through */
   2191   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED:
   2192   1.1  riastrad 		return 1 * 1024 * 1024;
   2193   1.1  riastrad 	default:
   2194   1.1  riastrad 		MISSING_CASE(fb->modifier);
   2195   1.1  riastrad 		return 0;
   2196   1.1  riastrad 	}
   2197   1.1  riastrad }
   2198   1.1  riastrad 
   2199   1.1  riastrad static bool intel_plane_uses_fence(const struct intel_plane_state *plane_state)
   2200   1.1  riastrad {
   2201   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   2202   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   2203   1.1  riastrad 
   2204   1.1  riastrad 	return INTEL_GEN(dev_priv) < 4 ||
   2205   1.1  riastrad 		(plane->has_fbc &&
   2206   1.1  riastrad 		 plane_state->view.type == I915_GGTT_VIEW_NORMAL);
   2207   1.1  riastrad }
   2208   1.1  riastrad 
   2209   1.1  riastrad struct i915_vma *
   2210   1.1  riastrad intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
   2211   1.1  riastrad 			   const struct i915_ggtt_view *view,
   2212   1.1  riastrad 			   bool uses_fence,
   2213   1.1  riastrad 			   unsigned long *out_flags)
   2214   1.1  riastrad {
   2215   1.1  riastrad 	struct drm_device *dev = fb->dev;
   2216   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   2217   1.1  riastrad 	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   2218   1.1  riastrad 	intel_wakeref_t wakeref;
   2219   1.1  riastrad 	struct i915_vma *vma;
   2220   1.1  riastrad 	unsigned int pinctl;
   2221   1.1  riastrad 	u32 alignment;
   2222   1.1  riastrad 
   2223   1.1  riastrad 	if (WARN_ON(!i915_gem_object_is_framebuffer(obj)))
   2224   1.1  riastrad 		return ERR_PTR(-EINVAL);
   2225   1.1  riastrad 
   2226   1.1  riastrad 	alignment = intel_surf_alignment(fb, 0);
   2227   1.1  riastrad 	if (WARN_ON(alignment && !is_power_of_2(alignment)))
   2228   1.1  riastrad 		return ERR_PTR(-EINVAL);
   2229   1.1  riastrad 
   2230   1.1  riastrad 	/* Note that the w/a also requires 64 PTE of padding following the
   2231   1.1  riastrad 	 * bo. We currently fill all unused PTE with the shadow page and so
   2232   1.1  riastrad 	 * we should always have valid PTE following the scanout preventing
   2233   1.1  riastrad 	 * the VT-d warning.
   2234   1.1  riastrad 	 */
   2235   1.1  riastrad 	if (intel_scanout_needs_vtd_wa(dev_priv) && alignment < 256 * 1024)
   2236   1.1  riastrad 		alignment = 256 * 1024;
   2237   1.1  riastrad 
   2238   1.1  riastrad 	/*
   2239   1.1  riastrad 	 * Global gtt pte registers are special registers which actually forward
   2240   1.1  riastrad 	 * writes to a chunk of system memory. Which means that there is no risk
   2241   1.1  riastrad 	 * that the register values disappear as soon as we call
   2242   1.1  riastrad 	 * intel_runtime_pm_put(), so it is correct to wrap only the
   2243   1.1  riastrad 	 * pin/unpin/fence and not more.
   2244   1.1  riastrad 	 */
   2245   1.1  riastrad 	wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
   2246   1.1  riastrad 
   2247   1.1  riastrad 	atomic_inc(&dev_priv->gpu_error.pending_fb_pin);
   2248   1.1  riastrad 
   2249   1.1  riastrad 	/*
   2250   1.1  riastrad 	 * Valleyview is definitely limited to scanning out the first
   2251   1.1  riastrad 	 * 512MiB. Lets presume this behaviour was inherited from the
   2252   1.1  riastrad 	 * g4x display engine and that all earlier gen are similarly
   2253   1.1  riastrad 	 * limited. Testing suggests that it is a little more
   2254   1.1  riastrad 	 * complicated than this. For example, Cherryview appears quite
   2255   1.1  riastrad 	 * happy to scanout from anywhere within its global aperture.
   2256   1.1  riastrad 	 */
   2257   1.1  riastrad 	pinctl = 0;
   2258   1.1  riastrad 	if (HAS_GMCH(dev_priv))
   2259   1.1  riastrad 		pinctl |= PIN_MAPPABLE;
   2260   1.1  riastrad 
   2261   1.1  riastrad 	vma = i915_gem_object_pin_to_display_plane(obj,
   2262   1.1  riastrad 						   alignment, view, pinctl);
   2263   1.1  riastrad 	if (IS_ERR(vma))
   2264   1.1  riastrad 		goto err;
   2265   1.1  riastrad 
   2266   1.1  riastrad 	if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
   2267   1.1  riastrad 		int ret;
   2268   1.1  riastrad 
   2269   1.1  riastrad 		/*
   2270   1.1  riastrad 		 * Install a fence for tiled scan-out. Pre-i965 always needs a
   2271   1.1  riastrad 		 * fence, whereas 965+ only requires a fence if using
   2272   1.1  riastrad 		 * framebuffer compression.  For simplicity, we always, when
   2273   1.1  riastrad 		 * possible, install a fence as the cost is not that onerous.
   2274   1.1  riastrad 		 *
   2275   1.1  riastrad 		 * If we fail to fence the tiled scanout, then either the
   2276   1.1  riastrad 		 * modeset will reject the change (which is highly unlikely as
   2277   1.1  riastrad 		 * the affected systems, all but one, do not have unmappable
   2278   1.1  riastrad 		 * space) or we will not be able to enable full powersaving
   2279   1.1  riastrad 		 * techniques (also likely not to apply due to various limits
   2280   1.1  riastrad 		 * FBC and the like impose on the size of the buffer, which
   2281   1.1  riastrad 		 * presumably we violated anyway with this unmappable buffer).
   2282   1.1  riastrad 		 * Anyway, it is presumably better to stumble onwards with
   2283   1.1  riastrad 		 * something and try to run the system in a "less than optimal"
   2284   1.1  riastrad 		 * mode that matches the user configuration.
   2285   1.1  riastrad 		 */
   2286   1.1  riastrad 		ret = i915_vma_pin_fence(vma);
   2287   1.1  riastrad 		if (ret != 0 && INTEL_GEN(dev_priv) < 4) {
   2288   1.1  riastrad 			i915_gem_object_unpin_from_display_plane(vma);
   2289   1.1  riastrad 			vma = ERR_PTR(ret);
   2290   1.1  riastrad 			goto err;
   2291   1.1  riastrad 		}
   2292   1.1  riastrad 
   2293   1.1  riastrad 		if (ret == 0 && vma->fence)
   2294   1.1  riastrad 			*out_flags |= PLANE_HAS_FENCE;
   2295   1.1  riastrad 	}
   2296   1.1  riastrad 
   2297   1.1  riastrad 	i915_vma_get(vma);
   2298   1.1  riastrad err:
   2299   1.1  riastrad 	atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
   2300   1.1  riastrad 	intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
   2301   1.1  riastrad 	return vma;
   2302   1.1  riastrad }
   2303   1.1  riastrad 
   2304   1.1  riastrad void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
   2305   1.1  riastrad {
   2306   1.1  riastrad 	i915_gem_object_lock(vma->obj);
   2307   1.1  riastrad 	if (flags & PLANE_HAS_FENCE)
   2308   1.1  riastrad 		i915_vma_unpin_fence(vma);
   2309   1.1  riastrad 	i915_gem_object_unpin_from_display_plane(vma);
   2310   1.1  riastrad 	i915_gem_object_unlock(vma->obj);
   2311   1.1  riastrad 
   2312   1.1  riastrad 	i915_vma_put(vma);
   2313   1.1  riastrad }
   2314   1.1  riastrad 
   2315   1.1  riastrad static int intel_fb_pitch(const struct drm_framebuffer *fb, int color_plane,
   2316   1.1  riastrad 			  unsigned int rotation)
   2317   1.1  riastrad {
   2318   1.1  riastrad 	if (drm_rotation_90_or_270(rotation))
   2319   1.3  riastrad 		return to_intel_framebuffer((struct drm_framebuffer *)__UNCONST(fb))->rotated[color_plane].pitch;
   2320   1.1  riastrad 	else
   2321   1.1  riastrad 		return fb->pitches[color_plane];
   2322   1.1  riastrad }
   2323   1.1  riastrad 
   2324   1.1  riastrad /*
   2325   1.1  riastrad  * Convert the x/y offsets into a linear offset.
   2326   1.1  riastrad  * Only valid with 0/180 degree rotation, which is fine since linear
   2327   1.1  riastrad  * offset is only used with linear buffers on pre-hsw and tiled buffers
   2328   1.1  riastrad  * with gen2/3, and 90/270 degree rotations isn't supported on any of them.
   2329   1.1  riastrad  */
   2330   1.1  riastrad u32 intel_fb_xy_to_linear(int x, int y,
   2331   1.1  riastrad 			  const struct intel_plane_state *state,
   2332   1.1  riastrad 			  int color_plane)
   2333   1.1  riastrad {
   2334   1.1  riastrad 	const struct drm_framebuffer *fb = state->hw.fb;
   2335   1.1  riastrad 	unsigned int cpp = fb->format->cpp[color_plane];
   2336   1.1  riastrad 	unsigned int pitch = state->color_plane[color_plane].stride;
   2337   1.1  riastrad 
   2338   1.1  riastrad 	return y * pitch + x * cpp;
   2339   1.1  riastrad }
   2340   1.1  riastrad 
   2341   1.1  riastrad /*
   2342   1.1  riastrad  * Add the x/y offsets derived from fb->offsets[] to the user
   2343   1.1  riastrad  * specified plane src x/y offsets. The resulting x/y offsets
   2344   1.1  riastrad  * specify the start of scanout from the beginning of the gtt mapping.
   2345   1.1  riastrad  */
   2346   1.1  riastrad void intel_add_fb_offsets(int *x, int *y,
   2347   1.1  riastrad 			  const struct intel_plane_state *state,
   2348   1.1  riastrad 			  int color_plane)
   2349   1.1  riastrad 
   2350   1.1  riastrad {
   2351   1.1  riastrad 	*x += state->color_plane[color_plane].x;
   2352   1.1  riastrad 	*y += state->color_plane[color_plane].y;
   2353   1.1  riastrad }
   2354   1.1  riastrad 
   2355   1.1  riastrad static u32 intel_adjust_tile_offset(int *x, int *y,
   2356   1.1  riastrad 				    unsigned int tile_width,
   2357   1.1  riastrad 				    unsigned int tile_height,
   2358   1.1  riastrad 				    unsigned int tile_size,
   2359   1.1  riastrad 				    unsigned int pitch_tiles,
   2360   1.1  riastrad 				    u32 old_offset,
   2361   1.1  riastrad 				    u32 new_offset)
   2362   1.1  riastrad {
   2363   1.1  riastrad 	unsigned int pitch_pixels = pitch_tiles * tile_width;
   2364   1.1  riastrad 	unsigned int tiles;
   2365   1.1  riastrad 
   2366   1.1  riastrad 	WARN_ON(old_offset & (tile_size - 1));
   2367   1.1  riastrad 	WARN_ON(new_offset & (tile_size - 1));
   2368   1.1  riastrad 	WARN_ON(new_offset > old_offset);
   2369   1.1  riastrad 
   2370   1.1  riastrad 	tiles = (old_offset - new_offset) / tile_size;
   2371   1.1  riastrad 
   2372   1.1  riastrad 	*y += tiles / pitch_tiles * tile_height;
   2373   1.1  riastrad 	*x += tiles % pitch_tiles * tile_width;
   2374   1.1  riastrad 
   2375   1.1  riastrad 	/* minimize x in case it got needlessly big */
   2376   1.1  riastrad 	*y += *x / pitch_pixels * tile_height;
   2377   1.1  riastrad 	*x %= pitch_pixels;
   2378   1.1  riastrad 
   2379   1.1  riastrad 	return new_offset;
   2380   1.1  riastrad }
   2381   1.1  riastrad 
   2382   1.1  riastrad static bool is_surface_linear(const struct drm_framebuffer *fb, int color_plane)
   2383   1.1  riastrad {
   2384   1.1  riastrad 	return fb->modifier == DRM_FORMAT_MOD_LINEAR ||
   2385   1.1  riastrad 	       is_gen12_ccs_plane(fb, color_plane);
   2386   1.1  riastrad }
   2387   1.1  riastrad 
   2388   1.1  riastrad static u32 intel_adjust_aligned_offset(int *x, int *y,
   2389   1.1  riastrad 				       const struct drm_framebuffer *fb,
   2390   1.1  riastrad 				       int color_plane,
   2391   1.1  riastrad 				       unsigned int rotation,
   2392   1.1  riastrad 				       unsigned int pitch,
   2393   1.1  riastrad 				       u32 old_offset, u32 new_offset)
   2394   1.1  riastrad {
   2395   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(fb->dev);
   2396   1.1  riastrad 	unsigned int cpp = fb->format->cpp[color_plane];
   2397   1.1  riastrad 
   2398   1.1  riastrad 	WARN_ON(new_offset > old_offset);
   2399   1.1  riastrad 
   2400   1.1  riastrad 	if (!is_surface_linear(fb, color_plane)) {
   2401   1.1  riastrad 		unsigned int tile_size, tile_width, tile_height;
   2402   1.1  riastrad 		unsigned int pitch_tiles;
   2403   1.1  riastrad 
   2404   1.1  riastrad 		tile_size = intel_tile_size(dev_priv);
   2405   1.1  riastrad 		intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
   2406   1.1  riastrad 
   2407   1.1  riastrad 		if (drm_rotation_90_or_270(rotation)) {
   2408   1.1  riastrad 			pitch_tiles = pitch / tile_height;
   2409   1.1  riastrad 			swap(tile_width, tile_height);
   2410   1.1  riastrad 		} else {
   2411   1.1  riastrad 			pitch_tiles = pitch / (tile_width * cpp);
   2412   1.1  riastrad 		}
   2413   1.1  riastrad 
   2414   1.1  riastrad 		intel_adjust_tile_offset(x, y, tile_width, tile_height,
   2415   1.1  riastrad 					 tile_size, pitch_tiles,
   2416   1.1  riastrad 					 old_offset, new_offset);
   2417   1.1  riastrad 	} else {
   2418   1.1  riastrad 		old_offset += *y * pitch + *x * cpp;
   2419   1.1  riastrad 
   2420   1.1  riastrad 		*y = (old_offset - new_offset) / pitch;
   2421   1.1  riastrad 		*x = ((old_offset - new_offset) - *y * pitch) / cpp;
   2422   1.1  riastrad 	}
   2423   1.1  riastrad 
   2424   1.1  riastrad 	return new_offset;
   2425   1.1  riastrad }
   2426   1.1  riastrad 
   2427   1.1  riastrad /*
   2428   1.1  riastrad  * Adjust the tile offset by moving the difference into
   2429   1.1  riastrad  * the x/y offsets.
   2430   1.1  riastrad  */
   2431   1.1  riastrad static u32 intel_plane_adjust_aligned_offset(int *x, int *y,
   2432   1.1  riastrad 					     const struct intel_plane_state *state,
   2433   1.1  riastrad 					     int color_plane,
   2434   1.1  riastrad 					     u32 old_offset, u32 new_offset)
   2435   1.1  riastrad {
   2436   1.1  riastrad 	return intel_adjust_aligned_offset(x, y, state->hw.fb, color_plane,
   2437   1.1  riastrad 					   state->hw.rotation,
   2438   1.1  riastrad 					   state->color_plane[color_plane].stride,
   2439   1.1  riastrad 					   old_offset, new_offset);
   2440   1.1  riastrad }
   2441   1.1  riastrad 
   2442   1.1  riastrad /*
   2443   1.1  riastrad  * Computes the aligned offset to the base tile and adjusts
   2444   1.1  riastrad  * x, y. bytes per pixel is assumed to be a power-of-two.
   2445   1.1  riastrad  *
   2446   1.1  riastrad  * In the 90/270 rotated case, x and y are assumed
   2447   1.1  riastrad  * to be already rotated to match the rotated GTT view, and
   2448   1.1  riastrad  * pitch is the tile_height aligned framebuffer height.
   2449   1.1  riastrad  *
   2450   1.1  riastrad  * This function is used when computing the derived information
   2451   1.1  riastrad  * under intel_framebuffer, so using any of that information
   2452   1.1  riastrad  * here is not allowed. Anything under drm_framebuffer can be
   2453   1.1  riastrad  * used. This is why the user has to pass in the pitch since it
   2454   1.1  riastrad  * is specified in the rotated orientation.
   2455   1.1  riastrad  */
   2456   1.1  riastrad static u32 intel_compute_aligned_offset(struct drm_i915_private *dev_priv,
   2457   1.1  riastrad 					int *x, int *y,
   2458   1.1  riastrad 					const struct drm_framebuffer *fb,
   2459   1.1  riastrad 					int color_plane,
   2460   1.1  riastrad 					unsigned int pitch,
   2461   1.1  riastrad 					unsigned int rotation,
   2462   1.1  riastrad 					u32 alignment)
   2463   1.1  riastrad {
   2464   1.1  riastrad 	unsigned int cpp = fb->format->cpp[color_plane];
   2465   1.1  riastrad 	u32 offset, offset_aligned;
   2466   1.1  riastrad 
   2467   1.1  riastrad 	if (!is_surface_linear(fb, color_plane)) {
   2468   1.1  riastrad 		unsigned int tile_size, tile_width, tile_height;
   2469   1.1  riastrad 		unsigned int tile_rows, tiles, pitch_tiles;
   2470   1.1  riastrad 
   2471   1.1  riastrad 		tile_size = intel_tile_size(dev_priv);
   2472   1.1  riastrad 		intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
   2473   1.1  riastrad 
   2474   1.1  riastrad 		if (drm_rotation_90_or_270(rotation)) {
   2475   1.1  riastrad 			pitch_tiles = pitch / tile_height;
   2476   1.1  riastrad 			swap(tile_width, tile_height);
   2477   1.1  riastrad 		} else {
   2478   1.1  riastrad 			pitch_tiles = pitch / (tile_width * cpp);
   2479   1.1  riastrad 		}
   2480   1.1  riastrad 
   2481   1.1  riastrad 		tile_rows = *y / tile_height;
   2482   1.1  riastrad 		*y %= tile_height;
   2483   1.1  riastrad 
   2484   1.1  riastrad 		tiles = *x / tile_width;
   2485   1.1  riastrad 		*x %= tile_width;
   2486   1.1  riastrad 
   2487   1.1  riastrad 		offset = (tile_rows * pitch_tiles + tiles) * tile_size;
   2488   1.1  riastrad 
   2489   1.1  riastrad 		offset_aligned = offset;
   2490   1.1  riastrad 		if (alignment)
   2491   1.1  riastrad 			offset_aligned = rounddown(offset_aligned, alignment);
   2492   1.1  riastrad 
   2493   1.1  riastrad 		intel_adjust_tile_offset(x, y, tile_width, tile_height,
   2494   1.1  riastrad 					 tile_size, pitch_tiles,
   2495   1.1  riastrad 					 offset, offset_aligned);
   2496   1.1  riastrad 	} else {
   2497   1.1  riastrad 		offset = *y * pitch + *x * cpp;
   2498   1.1  riastrad 		offset_aligned = offset;
   2499   1.1  riastrad 		if (alignment) {
   2500   1.1  riastrad 			offset_aligned = rounddown(offset_aligned, alignment);
   2501   1.1  riastrad 			*y = (offset % alignment) / pitch;
   2502   1.1  riastrad 			*x = ((offset % alignment) - *y * pitch) / cpp;
   2503   1.1  riastrad 		} else {
   2504   1.1  riastrad 			*y = *x = 0;
   2505   1.1  riastrad 		}
   2506   1.1  riastrad 	}
   2507   1.1  riastrad 
   2508   1.1  riastrad 	return offset_aligned;
   2509   1.1  riastrad }
   2510   1.1  riastrad 
   2511   1.1  riastrad static u32 intel_plane_compute_aligned_offset(int *x, int *y,
   2512   1.1  riastrad 					      const struct intel_plane_state *state,
   2513   1.1  riastrad 					      int color_plane)
   2514   1.1  riastrad {
   2515   1.1  riastrad 	struct intel_plane *intel_plane = to_intel_plane(state->uapi.plane);
   2516   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
   2517   1.1  riastrad 	const struct drm_framebuffer *fb = state->hw.fb;
   2518   1.1  riastrad 	unsigned int rotation = state->hw.rotation;
   2519   1.1  riastrad 	int pitch = state->color_plane[color_plane].stride;
   2520   1.1  riastrad 	u32 alignment;
   2521   1.1  riastrad 
   2522   1.1  riastrad 	if (intel_plane->id == PLANE_CURSOR)
   2523   1.1  riastrad 		alignment = intel_cursor_alignment(dev_priv);
   2524   1.1  riastrad 	else
   2525   1.1  riastrad 		alignment = intel_surf_alignment(fb, color_plane);
   2526   1.1  riastrad 
   2527   1.1  riastrad 	return intel_compute_aligned_offset(dev_priv, x, y, fb, color_plane,
   2528   1.1  riastrad 					    pitch, rotation, alignment);
   2529   1.1  riastrad }
   2530   1.1  riastrad 
   2531   1.1  riastrad /* Convert the fb->offset[] into x/y offsets */
   2532   1.1  riastrad static int intel_fb_offset_to_xy(int *x, int *y,
   2533   1.1  riastrad 				 const struct drm_framebuffer *fb,
   2534   1.1  riastrad 				 int color_plane)
   2535   1.1  riastrad {
   2536   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(fb->dev);
   2537   1.1  riastrad 	unsigned int height;
   2538   1.1  riastrad 	u32 alignment;
   2539   1.1  riastrad 
   2540   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 12 &&
   2541   1.1  riastrad 	    is_semiplanar_uv_plane(fb, color_plane))
   2542   1.1  riastrad 		alignment = intel_tile_row_size(fb, color_plane);
   2543   1.1  riastrad 	else if (fb->modifier != DRM_FORMAT_MOD_LINEAR)
   2544   1.1  riastrad 		alignment = intel_tile_size(dev_priv);
   2545   1.1  riastrad 	else
   2546   1.1  riastrad 		alignment = 0;
   2547   1.1  riastrad 
   2548   1.1  riastrad 	if (alignment != 0 && fb->offsets[color_plane] % alignment) {
   2549   1.1  riastrad 		DRM_DEBUG_KMS("Misaligned offset 0x%08x for color plane %d\n",
   2550   1.1  riastrad 			      fb->offsets[color_plane], color_plane);
   2551   1.1  riastrad 		return -EINVAL;
   2552   1.1  riastrad 	}
   2553   1.1  riastrad 
   2554   1.1  riastrad 	height = drm_framebuffer_plane_height(fb->height, fb, color_plane);
   2555   1.1  riastrad 	height = ALIGN(height, intel_tile_height(fb, color_plane));
   2556   1.1  riastrad 
   2557   1.1  riastrad 	/* Catch potential overflows early */
   2558   1.1  riastrad 	if (add_overflows_t(u32, mul_u32_u32(height, fb->pitches[color_plane]),
   2559   1.1  riastrad 			    fb->offsets[color_plane])) {
   2560   1.1  riastrad 		DRM_DEBUG_KMS("Bad offset 0x%08x or pitch %d for color plane %d\n",
   2561   1.1  riastrad 			      fb->offsets[color_plane], fb->pitches[color_plane],
   2562   1.1  riastrad 			      color_plane);
   2563   1.1  riastrad 		return -ERANGE;
   2564   1.1  riastrad 	}
   2565   1.1  riastrad 
   2566   1.1  riastrad 	*x = 0;
   2567   1.1  riastrad 	*y = 0;
   2568   1.1  riastrad 
   2569   1.1  riastrad 	intel_adjust_aligned_offset(x, y,
   2570   1.1  riastrad 				    fb, color_plane, DRM_MODE_ROTATE_0,
   2571   1.1  riastrad 				    fb->pitches[color_plane],
   2572   1.1  riastrad 				    fb->offsets[color_plane], 0);
   2573   1.1  riastrad 
   2574   1.1  riastrad 	return 0;
   2575   1.1  riastrad }
   2576   1.1  riastrad 
   2577   1.1  riastrad static unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
   2578   1.1  riastrad {
   2579   1.1  riastrad 	switch (fb_modifier) {
   2580   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   2581   1.1  riastrad 		return I915_TILING_X;
   2582   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   2583   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   2584   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
   2585   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   2586   1.1  riastrad 		return I915_TILING_Y;
   2587   1.1  riastrad 	default:
   2588   1.1  riastrad 		return I915_TILING_NONE;
   2589   1.1  riastrad 	}
   2590   1.1  riastrad }
   2591   1.1  riastrad 
   2592   1.1  riastrad /*
   2593   1.1  riastrad  * From the Sky Lake PRM:
   2594   1.1  riastrad  * "The Color Control Surface (CCS) contains the compression status of
   2595   1.1  riastrad  *  the cache-line pairs. The compression state of the cache-line pair
   2596   1.1  riastrad  *  is specified by 2 bits in the CCS. Each CCS cache-line represents
   2597   1.1  riastrad  *  an area on the main surface of 16 x16 sets of 128 byte Y-tiled
   2598   1.1  riastrad  *  cache-line-pairs. CCS is always Y tiled."
   2599   1.1  riastrad  *
   2600   1.1  riastrad  * Since cache line pairs refers to horizontally adjacent cache lines,
   2601   1.1  riastrad  * each cache line in the CCS corresponds to an area of 32x16 cache
   2602   1.1  riastrad  * lines on the main surface. Since each pixel is 4 bytes, this gives
   2603   1.1  riastrad  * us a ratio of one byte in the CCS for each 8x16 pixels in the
   2604   1.1  riastrad  * main surface.
   2605   1.1  riastrad  */
   2606   1.1  riastrad static const struct drm_format_info skl_ccs_formats[] = {
   2607   1.1  riastrad 	{ .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
   2608   1.1  riastrad 	  .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
   2609   1.1  riastrad 	{ .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
   2610   1.1  riastrad 	  .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, },
   2611   1.1  riastrad 	{ .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
   2612   1.1  riastrad 	  .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
   2613   1.1  riastrad 	{ .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
   2614   1.1  riastrad 	  .cpp = { 4, 1, }, .hsub = 8, .vsub = 16, .has_alpha = true, },
   2615   1.1  riastrad };
   2616   1.1  riastrad 
   2617   1.1  riastrad /*
   2618   1.1  riastrad  * Gen-12 compression uses 4 bits of CCS data for each cache line pair in the
   2619   1.1  riastrad  * main surface. And each 64B CCS cache line represents an area of 4x1 Y-tiles
   2620   1.1  riastrad  * in the main surface. With 4 byte pixels and each Y-tile having dimensions of
   2621   1.1  riastrad  * 32x32 pixels, the ratio turns out to 1B in the CCS for every 2x32 pixels in
   2622   1.1  riastrad  * the main surface.
   2623   1.1  riastrad  */
   2624   1.1  riastrad static const struct drm_format_info gen12_ccs_formats[] = {
   2625   1.1  riastrad 	{ .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
   2626   1.1  riastrad 	  .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2627   1.1  riastrad 	  .hsub = 1, .vsub = 1, },
   2628   1.1  riastrad 	{ .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
   2629   1.1  riastrad 	  .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2630   1.1  riastrad 	  .hsub = 1, .vsub = 1, },
   2631   1.1  riastrad 	{ .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
   2632   1.1  riastrad 	  .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2633   1.1  riastrad 	  .hsub = 1, .vsub = 1, .has_alpha = true },
   2634   1.1  riastrad 	{ .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
   2635   1.1  riastrad 	  .char_per_block = { 4, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2636   1.1  riastrad 	  .hsub = 1, .vsub = 1, .has_alpha = true },
   2637   1.1  riastrad 	{ .format = DRM_FORMAT_YUYV, .num_planes = 2,
   2638   1.1  riastrad 	  .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2639   1.1  riastrad 	  .hsub = 2, .vsub = 1, .is_yuv = true },
   2640   1.1  riastrad 	{ .format = DRM_FORMAT_YVYU, .num_planes = 2,
   2641   1.1  riastrad 	  .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2642   1.1  riastrad 	  .hsub = 2, .vsub = 1, .is_yuv = true },
   2643   1.1  riastrad 	{ .format = DRM_FORMAT_UYVY, .num_planes = 2,
   2644   1.1  riastrad 	  .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2645   1.1  riastrad 	  .hsub = 2, .vsub = 1, .is_yuv = true },
   2646   1.1  riastrad 	{ .format = DRM_FORMAT_VYUY, .num_planes = 2,
   2647   1.1  riastrad 	  .char_per_block = { 2, 1 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
   2648   1.1  riastrad 	  .hsub = 2, .vsub = 1, .is_yuv = true },
   2649   1.1  riastrad 	{ .format = DRM_FORMAT_NV12, .num_planes = 4,
   2650   1.1  riastrad 	  .char_per_block = { 1, 2, 1, 1 }, .block_w = { 1, 1, 4, 4 }, .block_h = { 1, 1, 1, 1 },
   2651   1.1  riastrad 	  .hsub = 2, .vsub = 2, .is_yuv = true },
   2652   1.1  riastrad 	{ .format = DRM_FORMAT_P010, .num_planes = 4,
   2653   1.1  riastrad 	  .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
   2654   1.1  riastrad 	  .hsub = 2, .vsub = 2, .is_yuv = true },
   2655   1.1  riastrad 	{ .format = DRM_FORMAT_P012, .num_planes = 4,
   2656   1.1  riastrad 	  .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
   2657   1.1  riastrad 	  .hsub = 2, .vsub = 2, .is_yuv = true },
   2658   1.1  riastrad 	{ .format = DRM_FORMAT_P016, .num_planes = 4,
   2659   1.1  riastrad 	  .char_per_block = { 2, 4, 1, 1 }, .block_w = { 1, 1, 2, 2 }, .block_h = { 1, 1, 1, 1 },
   2660   1.1  riastrad 	  .hsub = 2, .vsub = 2, .is_yuv = true },
   2661   1.1  riastrad };
   2662   1.1  riastrad 
   2663   1.1  riastrad static const struct drm_format_info *
   2664   1.1  riastrad lookup_format_info(const struct drm_format_info formats[],
   2665   1.1  riastrad 		   int num_formats, u32 format)
   2666   1.1  riastrad {
   2667   1.1  riastrad 	int i;
   2668   1.1  riastrad 
   2669   1.1  riastrad 	for (i = 0; i < num_formats; i++) {
   2670   1.1  riastrad 		if (formats[i].format == format)
   2671   1.1  riastrad 			return &formats[i];
   2672   1.1  riastrad 	}
   2673   1.1  riastrad 
   2674   1.1  riastrad 	return NULL;
   2675   1.1  riastrad }
   2676   1.1  riastrad 
   2677   1.1  riastrad static const struct drm_format_info *
   2678   1.1  riastrad intel_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
   2679   1.1  riastrad {
   2680   1.1  riastrad 	switch (cmd->modifier[0]) {
   2681   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   2682   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   2683   1.1  riastrad 		return lookup_format_info(skl_ccs_formats,
   2684   1.1  riastrad 					  ARRAY_SIZE(skl_ccs_formats),
   2685   1.1  riastrad 					  cmd->pixel_format);
   2686   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
   2687   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   2688   1.1  riastrad 		return lookup_format_info(gen12_ccs_formats,
   2689   1.1  riastrad 					  ARRAY_SIZE(gen12_ccs_formats),
   2690   1.1  riastrad 					  cmd->pixel_format);
   2691   1.1  riastrad 	default:
   2692   1.1  riastrad 		return NULL;
   2693   1.1  riastrad 	}
   2694   1.1  riastrad }
   2695   1.1  riastrad 
   2696   1.1  riastrad bool is_ccs_modifier(u64 modifier)
   2697   1.1  riastrad {
   2698   1.1  riastrad 	return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ||
   2699   1.1  riastrad 	       modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS ||
   2700   1.1  riastrad 	       modifier == I915_FORMAT_MOD_Y_TILED_CCS ||
   2701   1.1  riastrad 	       modifier == I915_FORMAT_MOD_Yf_TILED_CCS;
   2702   1.1  riastrad }
   2703   1.1  riastrad 
   2704   1.1  riastrad static int gen12_ccs_aux_stride(struct drm_framebuffer *fb, int ccs_plane)
   2705   1.1  riastrad {
   2706   1.1  riastrad 	return DIV_ROUND_UP(fb->pitches[ccs_to_main_plane(fb, ccs_plane)],
   2707   1.1  riastrad 			    512) * 64;
   2708   1.1  riastrad }
   2709   1.1  riastrad 
   2710   1.1  riastrad u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv,
   2711   1.1  riastrad 			      u32 pixel_format, u64 modifier)
   2712   1.1  riastrad {
   2713   1.1  riastrad 	struct intel_crtc *crtc;
   2714   1.1  riastrad 	struct intel_plane *plane;
   2715   1.1  riastrad 
   2716   1.1  riastrad 	/*
   2717   1.1  riastrad 	 * We assume the primary plane for pipe A has
   2718   1.1  riastrad 	 * the highest stride limits of them all.
   2719   1.1  riastrad 	 */
   2720   1.1  riastrad 	crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_A);
   2721   1.1  riastrad 	if (!crtc)
   2722   1.1  riastrad 		return 0;
   2723   1.1  riastrad 
   2724   1.1  riastrad 	plane = to_intel_plane(crtc->base.primary);
   2725   1.1  riastrad 
   2726   1.1  riastrad 	return plane->max_stride(plane, pixel_format, modifier,
   2727   1.1  riastrad 				 DRM_MODE_ROTATE_0);
   2728   1.1  riastrad }
   2729   1.1  riastrad 
   2730   1.1  riastrad static
   2731   1.1  riastrad u32 intel_fb_max_stride(struct drm_i915_private *dev_priv,
   2732   1.1  riastrad 			u32 pixel_format, u64 modifier)
   2733   1.1  riastrad {
   2734   1.1  riastrad 	/*
   2735   1.1  riastrad 	 * Arbitrary limit for gen4+ chosen to match the
   2736   1.1  riastrad 	 * render engine max stride.
   2737   1.1  riastrad 	 *
   2738   1.1  riastrad 	 * The new CCS hash mode makes remapping impossible
   2739   1.1  riastrad 	 */
   2740   1.1  riastrad 	if (!is_ccs_modifier(modifier)) {
   2741   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 7)
   2742   1.1  riastrad 			return 256*1024;
   2743   1.1  riastrad 		else if (INTEL_GEN(dev_priv) >= 4)
   2744   1.1  riastrad 			return 128*1024;
   2745   1.1  riastrad 	}
   2746   1.1  riastrad 
   2747   1.1  riastrad 	return intel_plane_fb_max_stride(dev_priv, pixel_format, modifier);
   2748   1.1  riastrad }
   2749   1.1  riastrad 
   2750   1.1  riastrad static u32
   2751   1.1  riastrad intel_fb_stride_alignment(const struct drm_framebuffer *fb, int color_plane)
   2752   1.1  riastrad {
   2753   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(fb->dev);
   2754   1.1  riastrad 	u32 tile_width;
   2755   1.1  riastrad 
   2756   1.1  riastrad 	if (is_surface_linear(fb, color_plane)) {
   2757   1.1  riastrad 		u32 max_stride = intel_plane_fb_max_stride(dev_priv,
   2758   1.1  riastrad 							   fb->format->format,
   2759   1.1  riastrad 							   fb->modifier);
   2760   1.1  riastrad 
   2761   1.1  riastrad 		/*
   2762   1.1  riastrad 		 * To make remapping with linear generally feasible
   2763   1.1  riastrad 		 * we need the stride to be page aligned.
   2764   1.1  riastrad 		 */
   2765   1.1  riastrad 		if (fb->pitches[color_plane] > max_stride &&
   2766   1.1  riastrad 		    !is_ccs_modifier(fb->modifier))
   2767   1.1  riastrad 			return intel_tile_size(dev_priv);
   2768   1.1  riastrad 		else
   2769   1.1  riastrad 			return 64;
   2770   1.1  riastrad 	}
   2771   1.1  riastrad 
   2772   1.1  riastrad 	tile_width = intel_tile_width_bytes(fb, color_plane);
   2773   1.1  riastrad 	if (is_ccs_modifier(fb->modifier)) {
   2774   1.1  riastrad 		/*
   2775   1.1  riastrad 		 * Display WA #0531: skl,bxt,kbl,glk
   2776   1.1  riastrad 		 *
   2777   1.1  riastrad 		 * Render decompression and plane width > 3840
   2778   1.1  riastrad 		 * combined with horizontal panning requires the
   2779   1.1  riastrad 		 * plane stride to be a multiple of 4. We'll just
   2780   1.1  riastrad 		 * require the entire fb to accommodate that to avoid
   2781   1.1  riastrad 		 * potential runtime errors at plane configuration time.
   2782   1.1  riastrad 		 */
   2783   1.1  riastrad 		if (IS_GEN(dev_priv, 9) && color_plane == 0 && fb->width > 3840)
   2784   1.1  riastrad 			tile_width *= 4;
   2785   1.1  riastrad 		/*
   2786   1.1  riastrad 		 * The main surface pitch must be padded to a multiple of four
   2787   1.1  riastrad 		 * tile widths.
   2788   1.1  riastrad 		 */
   2789   1.1  riastrad 		else if (INTEL_GEN(dev_priv) >= 12)
   2790   1.1  riastrad 			tile_width *= 4;
   2791   1.1  riastrad 	}
   2792   1.1  riastrad 	return tile_width;
   2793   1.1  riastrad }
   2794   1.1  riastrad 
   2795   1.1  riastrad bool intel_plane_can_remap(const struct intel_plane_state *plane_state)
   2796   1.1  riastrad {
   2797   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   2798   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   2799   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   2800   1.1  riastrad 	int i;
   2801   1.1  riastrad 
   2802   1.1  riastrad 	/* We don't want to deal with remapping with cursors */
   2803   1.1  riastrad 	if (plane->id == PLANE_CURSOR)
   2804   1.1  riastrad 		return false;
   2805   1.1  riastrad 
   2806   1.1  riastrad 	/*
   2807   1.1  riastrad 	 * The display engine limits already match/exceed the
   2808   1.1  riastrad 	 * render engine limits, so not much point in remapping.
   2809   1.1  riastrad 	 * Would also need to deal with the fence POT alignment
   2810   1.1  riastrad 	 * and gen2 2KiB GTT tile size.
   2811   1.1  riastrad 	 */
   2812   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4)
   2813   1.1  riastrad 		return false;
   2814   1.1  riastrad 
   2815   1.1  riastrad 	/*
   2816   1.1  riastrad 	 * The new CCS hash mode isn't compatible with remapping as
   2817   1.1  riastrad 	 * the virtual address of the pages affects the compressed data.
   2818   1.1  riastrad 	 */
   2819   1.1  riastrad 	if (is_ccs_modifier(fb->modifier))
   2820   1.1  riastrad 		return false;
   2821   1.1  riastrad 
   2822   1.1  riastrad 	/* Linear needs a page aligned stride for remapping */
   2823   1.1  riastrad 	if (fb->modifier == DRM_FORMAT_MOD_LINEAR) {
   2824   1.1  riastrad 		unsigned int alignment = intel_tile_size(dev_priv) - 1;
   2825   1.1  riastrad 
   2826   1.1  riastrad 		for (i = 0; i < fb->format->num_planes; i++) {
   2827   1.1  riastrad 			if (fb->pitches[i] & alignment)
   2828   1.1  riastrad 				return false;
   2829   1.1  riastrad 		}
   2830   1.1  riastrad 	}
   2831   1.1  riastrad 
   2832   1.1  riastrad 	return true;
   2833   1.1  riastrad }
   2834   1.1  riastrad 
   2835   1.1  riastrad static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
   2836   1.1  riastrad {
   2837   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   2838   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   2839   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   2840   1.1  riastrad 	u32 stride, max_stride;
   2841   1.1  riastrad 
   2842   1.1  riastrad 	/*
   2843   1.1  riastrad 	 * No remapping for invisible planes since we don't have
   2844   1.1  riastrad 	 * an actual source viewport to remap.
   2845   1.1  riastrad 	 */
   2846   1.1  riastrad 	if (!plane_state->uapi.visible)
   2847   1.1  riastrad 		return false;
   2848   1.1  riastrad 
   2849   1.1  riastrad 	if (!intel_plane_can_remap(plane_state))
   2850   1.1  riastrad 		return false;
   2851   1.1  riastrad 
   2852   1.1  riastrad 	/*
   2853   1.1  riastrad 	 * FIXME: aux plane limits on gen9+ are
   2854   1.1  riastrad 	 * unclear in Bspec, for now no checking.
   2855   1.1  riastrad 	 */
   2856   1.1  riastrad 	stride = intel_fb_pitch(fb, 0, rotation);
   2857   1.1  riastrad 	max_stride = plane->max_stride(plane, fb->format->format,
   2858   1.1  riastrad 				       fb->modifier, rotation);
   2859   1.1  riastrad 
   2860   1.1  riastrad 	return stride > max_stride;
   2861   1.1  riastrad }
   2862   1.1  riastrad 
   2863   1.1  riastrad static void
   2864   1.1  riastrad intel_fb_plane_get_subsampling(int *hsub, int *vsub,
   2865   1.1  riastrad 			       const struct drm_framebuffer *fb,
   2866   1.1  riastrad 			       int color_plane)
   2867   1.1  riastrad {
   2868   1.1  riastrad 	int main_plane;
   2869   1.1  riastrad 
   2870   1.1  riastrad 	if (color_plane == 0) {
   2871   1.1  riastrad 		*hsub = 1;
   2872   1.1  riastrad 		*vsub = 1;
   2873   1.1  riastrad 
   2874   1.1  riastrad 		return;
   2875   1.1  riastrad 	}
   2876   1.1  riastrad 
   2877   1.1  riastrad 	/*
   2878   1.1  riastrad 	 * TODO: Deduct the subsampling from the char block for all CCS
   2879   1.1  riastrad 	 * formats and planes.
   2880   1.1  riastrad 	 */
   2881   1.1  riastrad 	if (!is_gen12_ccs_plane(fb, color_plane)) {
   2882   1.1  riastrad 		*hsub = fb->format->hsub;
   2883   1.1  riastrad 		*vsub = fb->format->vsub;
   2884   1.1  riastrad 
   2885   1.1  riastrad 		return;
   2886   1.1  riastrad 	}
   2887   1.1  riastrad 
   2888   1.1  riastrad 	main_plane = ccs_to_main_plane(fb, color_plane);
   2889   1.1  riastrad 	*hsub = drm_format_info_block_width(fb->format, color_plane) /
   2890   1.1  riastrad 		drm_format_info_block_width(fb->format, main_plane);
   2891   1.1  riastrad 
   2892   1.1  riastrad 	/*
   2893   1.1  riastrad 	 * The min stride check in the core framebuffer_check() function
   2894   1.1  riastrad 	 * assumes that format->hsub applies to every plane except for the
   2895   1.1  riastrad 	 * first plane. That's incorrect for the CCS AUX plane of the first
   2896   1.1  riastrad 	 * plane, but for the above check to pass we must define the block
   2897   1.1  riastrad 	 * width with that subsampling applied to it. Adjust the width here
   2898   1.1  riastrad 	 * accordingly, so we can calculate the actual subsampling factor.
   2899   1.1  riastrad 	 */
   2900   1.1  riastrad 	if (main_plane == 0)
   2901   1.1  riastrad 		*hsub *= fb->format->hsub;
   2902   1.1  riastrad 
   2903   1.1  riastrad 	*vsub = 32;
   2904   1.1  riastrad }
   2905   1.1  riastrad static int
   2906   1.1  riastrad intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
   2907   1.1  riastrad {
   2908   1.1  riastrad 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   2909   1.1  riastrad 	int main_plane;
   2910   1.1  riastrad 	int hsub, vsub;
   2911   1.1  riastrad 	int tile_width, tile_height;
   2912   1.1  riastrad 	int ccs_x, ccs_y;
   2913   1.1  riastrad 	int main_x, main_y;
   2914   1.1  riastrad 
   2915   1.1  riastrad 	if (!is_ccs_plane(fb, ccs_plane))
   2916   1.1  riastrad 		return 0;
   2917   1.1  riastrad 
   2918   1.1  riastrad 	intel_tile_dims(fb, ccs_plane, &tile_width, &tile_height);
   2919   1.1  riastrad 	intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
   2920   1.1  riastrad 
   2921   1.1  riastrad 	tile_width *= hsub;
   2922   1.1  riastrad 	tile_height *= vsub;
   2923   1.1  riastrad 
   2924   1.1  riastrad 	ccs_x = (x * hsub) % tile_width;
   2925   1.1  riastrad 	ccs_y = (y * vsub) % tile_height;
   2926   1.1  riastrad 
   2927   1.1  riastrad 	main_plane = ccs_to_main_plane(fb, ccs_plane);
   2928   1.1  riastrad 	main_x = intel_fb->normal[main_plane].x % tile_width;
   2929   1.1  riastrad 	main_y = intel_fb->normal[main_plane].y % tile_height;
   2930   1.1  riastrad 
   2931   1.1  riastrad 	/*
   2932   1.1  riastrad 	 * CCS doesn't have its own x/y offset register, so the intra CCS tile
   2933   1.1  riastrad 	 * x/y offsets must match between CCS and the main surface.
   2934   1.1  riastrad 	 */
   2935   1.1  riastrad 	if (main_x != ccs_x || main_y != ccs_y) {
   2936   1.1  riastrad 		DRM_DEBUG_KMS("Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
   2937   1.1  riastrad 			      main_x, main_y,
   2938   1.1  riastrad 			      ccs_x, ccs_y,
   2939   1.1  riastrad 			      intel_fb->normal[main_plane].x,
   2940   1.1  riastrad 			      intel_fb->normal[main_plane].y,
   2941   1.1  riastrad 			      x, y);
   2942   1.1  riastrad 		return -EINVAL;
   2943   1.1  riastrad 	}
   2944   1.1  riastrad 
   2945   1.1  riastrad 	return 0;
   2946   1.1  riastrad }
   2947   1.1  riastrad 
   2948   1.1  riastrad static void
   2949   1.1  riastrad intel_fb_plane_dims(int *w, int *h, struct drm_framebuffer *fb, int color_plane)
   2950   1.1  riastrad {
   2951   1.1  riastrad 	int main_plane = is_ccs_plane(fb, color_plane) ?
   2952   1.1  riastrad 			 ccs_to_main_plane(fb, color_plane) : 0;
   2953   1.1  riastrad 	int main_hsub, main_vsub;
   2954   1.1  riastrad 	int hsub, vsub;
   2955   1.1  riastrad 
   2956   1.1  riastrad 	intel_fb_plane_get_subsampling(&main_hsub, &main_vsub, fb, main_plane);
   2957   1.1  riastrad 	intel_fb_plane_get_subsampling(&hsub, &vsub, fb, color_plane);
   2958   1.1  riastrad 	*w = fb->width / main_hsub / hsub;
   2959   1.1  riastrad 	*h = fb->height / main_vsub / vsub;
   2960   1.1  riastrad }
   2961   1.1  riastrad 
   2962   1.1  riastrad /*
   2963   1.1  riastrad  * Setup the rotated view for an FB plane and return the size the GTT mapping
   2964   1.1  riastrad  * requires for this view.
   2965   1.1  riastrad  */
   2966   1.1  riastrad static u32
   2967   1.1  riastrad setup_fb_rotation(int plane, const struct intel_remapped_plane_info *plane_info,
   2968   1.1  riastrad 		  u32 gtt_offset_rotated, int x, int y,
   2969   1.1  riastrad 		  unsigned int width, unsigned int height,
   2970   1.1  riastrad 		  unsigned int tile_size,
   2971   1.1  riastrad 		  unsigned int tile_width, unsigned int tile_height,
   2972   1.1  riastrad 		  struct drm_framebuffer *fb)
   2973   1.1  riastrad {
   2974   1.1  riastrad 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   2975   1.1  riastrad 	struct intel_rotation_info *rot_info = &intel_fb->rot_info;
   2976   1.1  riastrad 	unsigned int pitch_tiles;
   2977   1.1  riastrad 	struct drm_rect r;
   2978   1.1  riastrad 
   2979   1.1  riastrad 	/* Y or Yf modifiers required for 90/270 rotation */
   2980   1.1  riastrad 	if (fb->modifier != I915_FORMAT_MOD_Y_TILED &&
   2981   1.1  riastrad 	    fb->modifier != I915_FORMAT_MOD_Yf_TILED)
   2982   1.1  riastrad 		return 0;
   2983   1.1  riastrad 
   2984   1.1  riastrad 	if (WARN_ON(plane >= ARRAY_SIZE(rot_info->plane)))
   2985   1.1  riastrad 		return 0;
   2986   1.1  riastrad 
   2987   1.1  riastrad 	rot_info->plane[plane] = *plane_info;
   2988   1.1  riastrad 
   2989   1.1  riastrad 	intel_fb->rotated[plane].pitch = plane_info->height * tile_height;
   2990   1.1  riastrad 
   2991   1.1  riastrad 	/* rotate the x/y offsets to match the GTT view */
   2992   1.1  riastrad 	drm_rect_init(&r, x, y, width, height);
   2993   1.1  riastrad 	drm_rect_rotate(&r,
   2994   1.1  riastrad 			plane_info->width * tile_width,
   2995   1.1  riastrad 			plane_info->height * tile_height,
   2996   1.1  riastrad 			DRM_MODE_ROTATE_270);
   2997   1.1  riastrad 	x = r.x1;
   2998   1.1  riastrad 	y = r.y1;
   2999   1.1  riastrad 
   3000   1.1  riastrad 	/* rotate the tile dimensions to match the GTT view */
   3001   1.1  riastrad 	pitch_tiles = intel_fb->rotated[plane].pitch / tile_height;
   3002   1.1  riastrad 	swap(tile_width, tile_height);
   3003   1.1  riastrad 
   3004   1.1  riastrad 	/*
   3005   1.1  riastrad 	 * We only keep the x/y offsets, so push all of the
   3006   1.1  riastrad 	 * gtt offset into the x/y offsets.
   3007   1.1  riastrad 	 */
   3008   1.1  riastrad 	intel_adjust_tile_offset(&x, &y,
   3009   1.1  riastrad 				 tile_width, tile_height,
   3010   1.1  riastrad 				 tile_size, pitch_tiles,
   3011   1.1  riastrad 				 gtt_offset_rotated * tile_size, 0);
   3012   1.1  riastrad 
   3013   1.1  riastrad 	/*
   3014   1.1  riastrad 	 * First pixel of the framebuffer from
   3015   1.1  riastrad 	 * the start of the rotated gtt mapping.
   3016   1.1  riastrad 	 */
   3017   1.1  riastrad 	intel_fb->rotated[plane].x = x;
   3018   1.1  riastrad 	intel_fb->rotated[plane].y = y;
   3019   1.1  riastrad 
   3020   1.1  riastrad 	return plane_info->width * plane_info->height;
   3021   1.1  riastrad }
   3022   1.1  riastrad 
   3023   1.1  riastrad static int
   3024   1.1  riastrad intel_fill_fb_info(struct drm_i915_private *dev_priv,
   3025   1.1  riastrad 		   struct drm_framebuffer *fb)
   3026   1.1  riastrad {
   3027   1.1  riastrad 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   3028   1.1  riastrad 	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   3029   1.1  riastrad 	u32 gtt_offset_rotated = 0;
   3030   1.1  riastrad 	unsigned int max_size = 0;
   3031   1.1  riastrad 	int i, num_planes = fb->format->num_planes;
   3032   1.1  riastrad 	unsigned int tile_size = intel_tile_size(dev_priv);
   3033   1.1  riastrad 
   3034   1.1  riastrad 	for (i = 0; i < num_planes; i++) {
   3035   1.1  riastrad 		unsigned int width, height;
   3036   1.1  riastrad 		unsigned int cpp, size;
   3037   1.1  riastrad 		u32 offset;
   3038   1.1  riastrad 		int x, y;
   3039   1.1  riastrad 		int ret;
   3040   1.1  riastrad 
   3041   1.1  riastrad 		cpp = fb->format->cpp[i];
   3042   1.1  riastrad 		intel_fb_plane_dims(&width, &height, fb, i);
   3043   1.1  riastrad 
   3044   1.1  riastrad 		ret = intel_fb_offset_to_xy(&x, &y, fb, i);
   3045   1.1  riastrad 		if (ret) {
   3046   1.1  riastrad 			DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
   3047   1.1  riastrad 				      i, fb->offsets[i]);
   3048   1.1  riastrad 			return ret;
   3049   1.1  riastrad 		}
   3050   1.1  riastrad 
   3051   1.1  riastrad 		ret = intel_fb_check_ccs_xy(fb, i, x, y);
   3052   1.1  riastrad 		if (ret)
   3053   1.1  riastrad 			return ret;
   3054   1.1  riastrad 
   3055   1.1  riastrad 		/*
   3056   1.1  riastrad 		 * The fence (if used) is aligned to the start of the object
   3057   1.1  riastrad 		 * so having the framebuffer wrap around across the edge of the
   3058   1.1  riastrad 		 * fenced region doesn't really work. We have no API to configure
   3059   1.1  riastrad 		 * the fence start offset within the object (nor could we probably
   3060   1.1  riastrad 		 * on gen2/3). So it's just easier if we just require that the
   3061   1.1  riastrad 		 * fb layout agrees with the fence layout. We already check that the
   3062   1.1  riastrad 		 * fb stride matches the fence stride elsewhere.
   3063   1.1  riastrad 		 */
   3064   1.1  riastrad 		if (i == 0 && i915_gem_object_is_tiled(obj) &&
   3065   1.1  riastrad 		    (x + width) * cpp > fb->pitches[i]) {
   3066   1.1  riastrad 			DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
   3067   1.1  riastrad 				      i, fb->offsets[i]);
   3068   1.1  riastrad 			return -EINVAL;
   3069   1.1  riastrad 		}
   3070   1.1  riastrad 
   3071   1.1  riastrad 		/*
   3072   1.1  riastrad 		 * First pixel of the framebuffer from
   3073   1.1  riastrad 		 * the start of the normal gtt mapping.
   3074   1.1  riastrad 		 */
   3075   1.1  riastrad 		intel_fb->normal[i].x = x;
   3076   1.1  riastrad 		intel_fb->normal[i].y = y;
   3077   1.1  riastrad 
   3078   1.1  riastrad 		offset = intel_compute_aligned_offset(dev_priv, &x, &y, fb, i,
   3079   1.1  riastrad 						      fb->pitches[i],
   3080   1.1  riastrad 						      DRM_MODE_ROTATE_0,
   3081   1.1  riastrad 						      tile_size);
   3082   1.1  riastrad 		offset /= tile_size;
   3083   1.1  riastrad 
   3084   1.1  riastrad 		if (!is_surface_linear(fb, i)) {
   3085   1.1  riastrad 			struct intel_remapped_plane_info plane_info;
   3086   1.1  riastrad 			unsigned int tile_width, tile_height;
   3087   1.1  riastrad 
   3088   1.1  riastrad 			intel_tile_dims(fb, i, &tile_width, &tile_height);
   3089   1.1  riastrad 
   3090   1.1  riastrad 			plane_info.offset = offset;
   3091   1.1  riastrad 			plane_info.stride = DIV_ROUND_UP(fb->pitches[i],
   3092   1.1  riastrad 							 tile_width * cpp);
   3093   1.1  riastrad 			plane_info.width = DIV_ROUND_UP(x + width, tile_width);
   3094   1.1  riastrad 			plane_info.height = DIV_ROUND_UP(y + height,
   3095   1.1  riastrad 							 tile_height);
   3096   1.1  riastrad 
   3097   1.1  riastrad 			/* how many tiles does this plane need */
   3098   1.1  riastrad 			size = plane_info.stride * plane_info.height;
   3099   1.1  riastrad 			/*
   3100   1.1  riastrad 			 * If the plane isn't horizontally tile aligned,
   3101   1.1  riastrad 			 * we need one more tile.
   3102   1.1  riastrad 			 */
   3103   1.1  riastrad 			if (x != 0)
   3104   1.1  riastrad 				size++;
   3105   1.1  riastrad 
   3106   1.1  riastrad 			gtt_offset_rotated +=
   3107   1.1  riastrad 				setup_fb_rotation(i, &plane_info,
   3108   1.1  riastrad 						  gtt_offset_rotated,
   3109   1.1  riastrad 						  x, y, width, height,
   3110   1.1  riastrad 						  tile_size,
   3111   1.1  riastrad 						  tile_width, tile_height,
   3112   1.1  riastrad 						  fb);
   3113   1.1  riastrad 		} else {
   3114   1.1  riastrad 			size = DIV_ROUND_UP((y + height) * fb->pitches[i] +
   3115   1.1  riastrad 					    x * cpp, tile_size);
   3116   1.1  riastrad 		}
   3117   1.1  riastrad 
   3118   1.1  riastrad 		/* how many tiles in total needed in the bo */
   3119   1.1  riastrad 		max_size = max(max_size, offset + size);
   3120   1.1  riastrad 	}
   3121   1.1  riastrad 
   3122   1.1  riastrad 	if (mul_u32_u32(max_size, tile_size) > obj->base.size) {
   3123   1.3  riastrad 		DRM_DEBUG_KMS("fb too big for bo (need %"PRIu64" bytes, have %zu bytes)\n",
   3124   1.1  riastrad 			      mul_u32_u32(max_size, tile_size), obj->base.size);
   3125   1.1  riastrad 		return -EINVAL;
   3126   1.1  riastrad 	}
   3127   1.1  riastrad 
   3128   1.1  riastrad 	return 0;
   3129   1.1  riastrad }
   3130   1.1  riastrad 
   3131   1.1  riastrad static void
   3132   1.1  riastrad intel_plane_remap_gtt(struct intel_plane_state *plane_state)
   3133   1.1  riastrad {
   3134   1.1  riastrad 	struct drm_i915_private *dev_priv =
   3135   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   3136   1.1  riastrad 	struct drm_framebuffer *fb = plane_state->hw.fb;
   3137   1.1  riastrad 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   3138   1.1  riastrad 	struct intel_rotation_info *info = &plane_state->view.rotated;
   3139   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   3140   1.1  riastrad 	int i, num_planes = fb->format->num_planes;
   3141   1.1  riastrad 	unsigned int tile_size = intel_tile_size(dev_priv);
   3142   1.1  riastrad 	unsigned int src_x, src_y;
   3143   1.1  riastrad 	unsigned int src_w, src_h;
   3144   1.1  riastrad 	u32 gtt_offset = 0;
   3145   1.1  riastrad 
   3146   1.1  riastrad 	memset(&plane_state->view, 0, sizeof(plane_state->view));
   3147   1.1  riastrad 	plane_state->view.type = drm_rotation_90_or_270(rotation) ?
   3148   1.1  riastrad 		I915_GGTT_VIEW_ROTATED : I915_GGTT_VIEW_REMAPPED;
   3149   1.1  riastrad 
   3150   1.1  riastrad 	src_x = plane_state->uapi.src.x1 >> 16;
   3151   1.1  riastrad 	src_y = plane_state->uapi.src.y1 >> 16;
   3152   1.1  riastrad 	src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
   3153   1.1  riastrad 	src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
   3154   1.1  riastrad 
   3155   1.1  riastrad 	WARN_ON(is_ccs_modifier(fb->modifier));
   3156   1.1  riastrad 
   3157   1.1  riastrad 	/* Make src coordinates relative to the viewport */
   3158   1.1  riastrad 	drm_rect_translate(&plane_state->uapi.src,
   3159   1.1  riastrad 			   -(src_x << 16), -(src_y << 16));
   3160   1.1  riastrad 
   3161   1.1  riastrad 	/* Rotate src coordinates to match rotated GTT view */
   3162   1.1  riastrad 	if (drm_rotation_90_or_270(rotation))
   3163   1.1  riastrad 		drm_rect_rotate(&plane_state->uapi.src,
   3164   1.1  riastrad 				src_w << 16, src_h << 16,
   3165   1.1  riastrad 				DRM_MODE_ROTATE_270);
   3166   1.1  riastrad 
   3167   1.1  riastrad 	for (i = 0; i < num_planes; i++) {
   3168   1.1  riastrad 		unsigned int hsub = i ? fb->format->hsub : 1;
   3169   1.1  riastrad 		unsigned int vsub = i ? fb->format->vsub : 1;
   3170   1.1  riastrad 		unsigned int cpp = fb->format->cpp[i];
   3171   1.1  riastrad 		unsigned int tile_width, tile_height;
   3172   1.1  riastrad 		unsigned int width, height;
   3173   1.1  riastrad 		unsigned int pitch_tiles;
   3174   1.1  riastrad 		unsigned int x, y;
   3175   1.1  riastrad 		u32 offset;
   3176   1.1  riastrad 
   3177   1.1  riastrad 		intel_tile_dims(fb, i, &tile_width, &tile_height);
   3178   1.1  riastrad 
   3179   1.1  riastrad 		x = src_x / hsub;
   3180   1.1  riastrad 		y = src_y / vsub;
   3181   1.1  riastrad 		width = src_w / hsub;
   3182   1.1  riastrad 		height = src_h / vsub;
   3183   1.1  riastrad 
   3184   1.1  riastrad 		/*
   3185   1.1  riastrad 		 * First pixel of the src viewport from the
   3186   1.1  riastrad 		 * start of the normal gtt mapping.
   3187   1.1  riastrad 		 */
   3188   1.1  riastrad 		x += intel_fb->normal[i].x;
   3189   1.1  riastrad 		y += intel_fb->normal[i].y;
   3190   1.1  riastrad 
   3191   1.1  riastrad 		offset = intel_compute_aligned_offset(dev_priv, &x, &y,
   3192   1.1  riastrad 						      fb, i, fb->pitches[i],
   3193   1.1  riastrad 						      DRM_MODE_ROTATE_0, tile_size);
   3194   1.1  riastrad 		offset /= tile_size;
   3195   1.1  riastrad 
   3196   1.1  riastrad 		WARN_ON(i >= ARRAY_SIZE(info->plane));
   3197   1.1  riastrad 		info->plane[i].offset = offset;
   3198   1.1  riastrad 		info->plane[i].stride = DIV_ROUND_UP(fb->pitches[i],
   3199   1.1  riastrad 						     tile_width * cpp);
   3200   1.1  riastrad 		info->plane[i].width = DIV_ROUND_UP(x + width, tile_width);
   3201   1.1  riastrad 		info->plane[i].height = DIV_ROUND_UP(y + height, tile_height);
   3202   1.1  riastrad 
   3203   1.1  riastrad 		if (drm_rotation_90_or_270(rotation)) {
   3204   1.1  riastrad 			struct drm_rect r;
   3205   1.1  riastrad 
   3206   1.1  riastrad 			/* rotate the x/y offsets to match the GTT view */
   3207   1.1  riastrad 			drm_rect_init(&r, x, y, width, height);
   3208   1.1  riastrad 			drm_rect_rotate(&r,
   3209   1.1  riastrad 					info->plane[i].width * tile_width,
   3210   1.1  riastrad 					info->plane[i].height * tile_height,
   3211   1.1  riastrad 					DRM_MODE_ROTATE_270);
   3212   1.1  riastrad 			x = r.x1;
   3213   1.1  riastrad 			y = r.y1;
   3214   1.1  riastrad 
   3215   1.1  riastrad 			pitch_tiles = info->plane[i].height;
   3216   1.1  riastrad 			plane_state->color_plane[i].stride = pitch_tiles * tile_height;
   3217   1.1  riastrad 
   3218   1.1  riastrad 			/* rotate the tile dimensions to match the GTT view */
   3219   1.1  riastrad 			swap(tile_width, tile_height);
   3220   1.1  riastrad 		} else {
   3221   1.1  riastrad 			pitch_tiles = info->plane[i].width;
   3222   1.1  riastrad 			plane_state->color_plane[i].stride = pitch_tiles * tile_width * cpp;
   3223   1.1  riastrad 		}
   3224   1.1  riastrad 
   3225   1.1  riastrad 		/*
   3226   1.1  riastrad 		 * We only keep the x/y offsets, so push all of the
   3227   1.1  riastrad 		 * gtt offset into the x/y offsets.
   3228   1.1  riastrad 		 */
   3229   1.1  riastrad 		intel_adjust_tile_offset(&x, &y,
   3230   1.1  riastrad 					 tile_width, tile_height,
   3231   1.1  riastrad 					 tile_size, pitch_tiles,
   3232   1.1  riastrad 					 gtt_offset * tile_size, 0);
   3233   1.1  riastrad 
   3234   1.1  riastrad 		gtt_offset += info->plane[i].width * info->plane[i].height;
   3235   1.1  riastrad 
   3236   1.1  riastrad 		plane_state->color_plane[i].offset = 0;
   3237   1.1  riastrad 		plane_state->color_plane[i].x = x;
   3238   1.1  riastrad 		plane_state->color_plane[i].y = y;
   3239   1.1  riastrad 	}
   3240   1.1  riastrad }
   3241   1.1  riastrad 
   3242   1.1  riastrad static int
   3243   1.1  riastrad intel_plane_compute_gtt(struct intel_plane_state *plane_state)
   3244   1.1  riastrad {
   3245   1.1  riastrad 	const struct intel_framebuffer *fb =
   3246   1.1  riastrad 		to_intel_framebuffer(plane_state->hw.fb);
   3247   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   3248   1.1  riastrad 	int i, num_planes;
   3249   1.1  riastrad 
   3250   1.1  riastrad 	if (!fb)
   3251   1.1  riastrad 		return 0;
   3252   1.1  riastrad 
   3253   1.1  riastrad 	num_planes = fb->base.format->num_planes;
   3254   1.1  riastrad 
   3255   1.1  riastrad 	if (intel_plane_needs_remap(plane_state)) {
   3256   1.1  riastrad 		intel_plane_remap_gtt(plane_state);
   3257   1.1  riastrad 
   3258   1.1  riastrad 		/*
   3259   1.1  riastrad 		 * Sometimes even remapping can't overcome
   3260   1.1  riastrad 		 * the stride limitations :( Can happen with
   3261   1.1  riastrad 		 * big plane sizes and suitably misaligned
   3262   1.1  riastrad 		 * offsets.
   3263   1.1  riastrad 		 */
   3264   1.1  riastrad 		return intel_plane_check_stride(plane_state);
   3265   1.1  riastrad 	}
   3266   1.1  riastrad 
   3267   1.1  riastrad 	intel_fill_fb_ggtt_view(&plane_state->view, &fb->base, rotation);
   3268   1.1  riastrad 
   3269   1.1  riastrad 	for (i = 0; i < num_planes; i++) {
   3270   1.1  riastrad 		plane_state->color_plane[i].stride = intel_fb_pitch(&fb->base, i, rotation);
   3271   1.1  riastrad 		plane_state->color_plane[i].offset = 0;
   3272   1.1  riastrad 
   3273   1.1  riastrad 		if (drm_rotation_90_or_270(rotation)) {
   3274   1.1  riastrad 			plane_state->color_plane[i].x = fb->rotated[i].x;
   3275   1.1  riastrad 			plane_state->color_plane[i].y = fb->rotated[i].y;
   3276   1.1  riastrad 		} else {
   3277   1.1  riastrad 			plane_state->color_plane[i].x = fb->normal[i].x;
   3278   1.1  riastrad 			plane_state->color_plane[i].y = fb->normal[i].y;
   3279   1.1  riastrad 		}
   3280   1.1  riastrad 	}
   3281   1.1  riastrad 
   3282   1.1  riastrad 	/* Rotate src coordinates to match rotated GTT view */
   3283   1.1  riastrad 	if (drm_rotation_90_or_270(rotation))
   3284   1.1  riastrad 		drm_rect_rotate(&plane_state->uapi.src,
   3285   1.1  riastrad 				fb->base.width << 16, fb->base.height << 16,
   3286   1.1  riastrad 				DRM_MODE_ROTATE_270);
   3287   1.1  riastrad 
   3288   1.1  riastrad 	return intel_plane_check_stride(plane_state);
   3289   1.1  riastrad }
   3290   1.1  riastrad 
   3291   1.1  riastrad static int i9xx_format_to_fourcc(int format)
   3292   1.1  riastrad {
   3293   1.1  riastrad 	switch (format) {
   3294   1.1  riastrad 	case DISPPLANE_8BPP:
   3295   1.1  riastrad 		return DRM_FORMAT_C8;
   3296   1.1  riastrad 	case DISPPLANE_BGRA555:
   3297   1.1  riastrad 		return DRM_FORMAT_ARGB1555;
   3298   1.1  riastrad 	case DISPPLANE_BGRX555:
   3299   1.1  riastrad 		return DRM_FORMAT_XRGB1555;
   3300   1.1  riastrad 	case DISPPLANE_BGRX565:
   3301   1.1  riastrad 		return DRM_FORMAT_RGB565;
   3302   1.1  riastrad 	default:
   3303   1.1  riastrad 	case DISPPLANE_BGRX888:
   3304   1.1  riastrad 		return DRM_FORMAT_XRGB8888;
   3305   1.1  riastrad 	case DISPPLANE_RGBX888:
   3306   1.1  riastrad 		return DRM_FORMAT_XBGR8888;
   3307   1.1  riastrad 	case DISPPLANE_BGRA888:
   3308   1.1  riastrad 		return DRM_FORMAT_ARGB8888;
   3309   1.1  riastrad 	case DISPPLANE_RGBA888:
   3310   1.1  riastrad 		return DRM_FORMAT_ABGR8888;
   3311   1.1  riastrad 	case DISPPLANE_BGRX101010:
   3312   1.1  riastrad 		return DRM_FORMAT_XRGB2101010;
   3313   1.1  riastrad 	case DISPPLANE_RGBX101010:
   3314   1.1  riastrad 		return DRM_FORMAT_XBGR2101010;
   3315   1.1  riastrad 	case DISPPLANE_BGRA101010:
   3316   1.1  riastrad 		return DRM_FORMAT_ARGB2101010;
   3317   1.1  riastrad 	case DISPPLANE_RGBA101010:
   3318   1.1  riastrad 		return DRM_FORMAT_ABGR2101010;
   3319   1.1  riastrad 	case DISPPLANE_RGBX161616:
   3320   1.1  riastrad 		return DRM_FORMAT_XBGR16161616F;
   3321   1.1  riastrad 	}
   3322   1.1  riastrad }
   3323   1.1  riastrad 
   3324   1.1  riastrad int skl_format_to_fourcc(int format, bool rgb_order, bool alpha)
   3325   1.1  riastrad {
   3326   1.1  riastrad 	switch (format) {
   3327   1.1  riastrad 	case PLANE_CTL_FORMAT_RGB_565:
   3328   1.1  riastrad 		return DRM_FORMAT_RGB565;
   3329   1.1  riastrad 	case PLANE_CTL_FORMAT_NV12:
   3330   1.1  riastrad 		return DRM_FORMAT_NV12;
   3331   1.1  riastrad 	case PLANE_CTL_FORMAT_P010:
   3332   1.1  riastrad 		return DRM_FORMAT_P010;
   3333   1.1  riastrad 	case PLANE_CTL_FORMAT_P012:
   3334   1.1  riastrad 		return DRM_FORMAT_P012;
   3335   1.1  riastrad 	case PLANE_CTL_FORMAT_P016:
   3336   1.1  riastrad 		return DRM_FORMAT_P016;
   3337   1.1  riastrad 	case PLANE_CTL_FORMAT_Y210:
   3338   1.1  riastrad 		return DRM_FORMAT_Y210;
   3339   1.1  riastrad 	case PLANE_CTL_FORMAT_Y212:
   3340   1.1  riastrad 		return DRM_FORMAT_Y212;
   3341   1.1  riastrad 	case PLANE_CTL_FORMAT_Y216:
   3342   1.1  riastrad 		return DRM_FORMAT_Y216;
   3343   1.1  riastrad 	case PLANE_CTL_FORMAT_Y410:
   3344   1.1  riastrad 		return DRM_FORMAT_XVYU2101010;
   3345   1.1  riastrad 	case PLANE_CTL_FORMAT_Y412:
   3346   1.1  riastrad 		return DRM_FORMAT_XVYU12_16161616;
   3347   1.1  riastrad 	case PLANE_CTL_FORMAT_Y416:
   3348   1.1  riastrad 		return DRM_FORMAT_XVYU16161616;
   3349   1.1  riastrad 	default:
   3350   1.1  riastrad 	case PLANE_CTL_FORMAT_XRGB_8888:
   3351   1.1  riastrad 		if (rgb_order) {
   3352   1.1  riastrad 			if (alpha)
   3353   1.1  riastrad 				return DRM_FORMAT_ABGR8888;
   3354   1.1  riastrad 			else
   3355   1.1  riastrad 				return DRM_FORMAT_XBGR8888;
   3356   1.1  riastrad 		} else {
   3357   1.1  riastrad 			if (alpha)
   3358   1.1  riastrad 				return DRM_FORMAT_ARGB8888;
   3359   1.1  riastrad 			else
   3360   1.1  riastrad 				return DRM_FORMAT_XRGB8888;
   3361   1.1  riastrad 		}
   3362   1.1  riastrad 	case PLANE_CTL_FORMAT_XRGB_2101010:
   3363   1.1  riastrad 		if (rgb_order) {
   3364   1.1  riastrad 			if (alpha)
   3365   1.1  riastrad 				return DRM_FORMAT_ABGR2101010;
   3366   1.1  riastrad 			else
   3367   1.1  riastrad 				return DRM_FORMAT_XBGR2101010;
   3368   1.1  riastrad 		} else {
   3369   1.1  riastrad 			if (alpha)
   3370   1.1  riastrad 				return DRM_FORMAT_ARGB2101010;
   3371   1.1  riastrad 			else
   3372   1.1  riastrad 				return DRM_FORMAT_XRGB2101010;
   3373   1.1  riastrad 		}
   3374   1.1  riastrad 	case PLANE_CTL_FORMAT_XRGB_16161616F:
   3375   1.1  riastrad 		if (rgb_order) {
   3376   1.1  riastrad 			if (alpha)
   3377   1.1  riastrad 				return DRM_FORMAT_ABGR16161616F;
   3378   1.1  riastrad 			else
   3379   1.1  riastrad 				return DRM_FORMAT_XBGR16161616F;
   3380   1.1  riastrad 		} else {
   3381   1.1  riastrad 			if (alpha)
   3382   1.1  riastrad 				return DRM_FORMAT_ARGB16161616F;
   3383   1.1  riastrad 			else
   3384   1.1  riastrad 				return DRM_FORMAT_XRGB16161616F;
   3385   1.1  riastrad 		}
   3386   1.1  riastrad 	}
   3387   1.1  riastrad }
   3388   1.1  riastrad 
   3389   1.1  riastrad static bool
   3390   1.1  riastrad intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
   3391   1.1  riastrad 			      struct intel_initial_plane_config *plane_config)
   3392   1.1  riastrad {
   3393   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   3394   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   3395   1.1  riastrad 	struct drm_mode_fb_cmd2 mode_cmd = { 0 };
   3396   1.1  riastrad 	struct drm_framebuffer *fb = &plane_config->fb->base;
   3397   1.1  riastrad 	u32 base_aligned = round_down(plane_config->base, PAGE_SIZE);
   3398   1.1  riastrad 	u32 size_aligned = round_up(plane_config->base + plane_config->size,
   3399   1.1  riastrad 				    PAGE_SIZE);
   3400   1.1  riastrad 	struct drm_i915_gem_object *obj;
   3401   1.1  riastrad 	bool ret = false;
   3402   1.1  riastrad 
   3403   1.1  riastrad 	size_aligned -= base_aligned;
   3404   1.1  riastrad 
   3405   1.1  riastrad 	if (plane_config->size == 0)
   3406   1.1  riastrad 		return false;
   3407   1.1  riastrad 
   3408   1.1  riastrad 	/* If the FB is too big, just don't use it since fbdev is not very
   3409   1.1  riastrad 	 * important and we should probably use that space with FBC or other
   3410   1.1  riastrad 	 * features. */
   3411   1.1  riastrad 	if (size_aligned * 2 > dev_priv->stolen_usable_size)
   3412   1.1  riastrad 		return false;
   3413   1.1  riastrad 
   3414   1.1  riastrad 	switch (fb->modifier) {
   3415   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   3416   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   3417   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   3418   1.1  riastrad 		break;
   3419   1.1  riastrad 	default:
   3420   1.3  riastrad 		DRM_DEBUG_DRIVER("Unsupported modifier for initial FB: 0x%"PRIx64"\n",
   3421   1.1  riastrad 				 fb->modifier);
   3422   1.1  riastrad 		return false;
   3423   1.1  riastrad 	}
   3424   1.1  riastrad 
   3425   1.1  riastrad 	obj = i915_gem_object_create_stolen_for_preallocated(dev_priv,
   3426   1.1  riastrad 							     base_aligned,
   3427   1.1  riastrad 							     base_aligned,
   3428   1.1  riastrad 							     size_aligned);
   3429   1.1  riastrad 	if (IS_ERR(obj))
   3430   1.1  riastrad 		return false;
   3431   1.1  riastrad 
   3432   1.1  riastrad 	switch (plane_config->tiling) {
   3433   1.1  riastrad 	case I915_TILING_NONE:
   3434   1.1  riastrad 		break;
   3435   1.1  riastrad 	case I915_TILING_X:
   3436   1.1  riastrad 	case I915_TILING_Y:
   3437   1.1  riastrad 		obj->tiling_and_stride = fb->pitches[0] | plane_config->tiling;
   3438   1.1  riastrad 		break;
   3439   1.1  riastrad 	default:
   3440   1.1  riastrad 		MISSING_CASE(plane_config->tiling);
   3441   1.1  riastrad 		goto out;
   3442   1.1  riastrad 	}
   3443   1.1  riastrad 
   3444   1.1  riastrad 	mode_cmd.pixel_format = fb->format->format;
   3445   1.1  riastrad 	mode_cmd.width = fb->width;
   3446   1.1  riastrad 	mode_cmd.height = fb->height;
   3447   1.1  riastrad 	mode_cmd.pitches[0] = fb->pitches[0];
   3448   1.1  riastrad 	mode_cmd.modifier[0] = fb->modifier;
   3449   1.1  riastrad 	mode_cmd.flags = DRM_MODE_FB_MODIFIERS;
   3450   1.1  riastrad 
   3451   1.1  riastrad 	if (intel_framebuffer_init(to_intel_framebuffer(fb), obj, &mode_cmd)) {
   3452   1.1  riastrad 		DRM_DEBUG_KMS("intel fb init failed\n");
   3453   1.1  riastrad 		goto out;
   3454   1.1  riastrad 	}
   3455   1.1  riastrad 
   3456   1.1  riastrad 
   3457   1.1  riastrad 	DRM_DEBUG_KMS("initial plane fb obj %p\n", obj);
   3458   1.1  riastrad 	ret = true;
   3459   1.1  riastrad out:
   3460   1.1  riastrad 	i915_gem_object_put(obj);
   3461   1.1  riastrad 	return ret;
   3462   1.1  riastrad }
   3463   1.1  riastrad 
   3464   1.1  riastrad static void
   3465   1.1  riastrad intel_set_plane_visible(struct intel_crtc_state *crtc_state,
   3466   1.1  riastrad 			struct intel_plane_state *plane_state,
   3467   1.1  riastrad 			bool visible)
   3468   1.1  riastrad {
   3469   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   3470   1.1  riastrad 
   3471   1.1  riastrad 	plane_state->uapi.visible = visible;
   3472   1.1  riastrad 
   3473   1.1  riastrad 	if (visible)
   3474   1.1  riastrad 		crtc_state->uapi.plane_mask |= drm_plane_mask(&plane->base);
   3475   1.1  riastrad 	else
   3476   1.1  riastrad 		crtc_state->uapi.plane_mask &= ~drm_plane_mask(&plane->base);
   3477   1.1  riastrad }
   3478   1.1  riastrad 
   3479   1.1  riastrad static void fixup_active_planes(struct intel_crtc_state *crtc_state)
   3480   1.1  riastrad {
   3481   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   3482   1.1  riastrad 	struct drm_plane *plane;
   3483   1.1  riastrad 
   3484   1.1  riastrad 	/*
   3485   1.1  riastrad 	 * Active_planes aliases if multiple "primary" or cursor planes
   3486   1.1  riastrad 	 * have been used on the same (or wrong) pipe. plane_mask uses
   3487   1.1  riastrad 	 * unique ids, hence we can use that to reconstruct active_planes.
   3488   1.1  riastrad 	 */
   3489   1.1  riastrad 	crtc_state->active_planes = 0;
   3490   1.1  riastrad 
   3491   1.1  riastrad 	drm_for_each_plane_mask(plane, &dev_priv->drm,
   3492   1.1  riastrad 				crtc_state->uapi.plane_mask)
   3493   1.1  riastrad 		crtc_state->active_planes |= BIT(to_intel_plane(plane)->id);
   3494   1.1  riastrad }
   3495   1.1  riastrad 
   3496   1.1  riastrad static void intel_plane_disable_noatomic(struct intel_crtc *crtc,
   3497   1.1  riastrad 					 struct intel_plane *plane)
   3498   1.1  riastrad {
   3499   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   3500   1.1  riastrad 	struct intel_crtc_state *crtc_state =
   3501   1.1  riastrad 		to_intel_crtc_state(crtc->base.state);
   3502   1.1  riastrad 	struct intel_plane_state *plane_state =
   3503   1.1  riastrad 		to_intel_plane_state(plane->base.state);
   3504   1.1  riastrad 
   3505   1.1  riastrad 	DRM_DEBUG_KMS("Disabling [PLANE:%d:%s] on [CRTC:%d:%s]\n",
   3506   1.1  riastrad 		      plane->base.base.id, plane->base.name,
   3507   1.1  riastrad 		      crtc->base.base.id, crtc->base.name);
   3508   1.1  riastrad 
   3509   1.1  riastrad 	intel_set_plane_visible(crtc_state, plane_state, false);
   3510   1.1  riastrad 	fixup_active_planes(crtc_state);
   3511   1.1  riastrad 	crtc_state->data_rate[plane->id] = 0;
   3512   1.1  riastrad 	crtc_state->min_cdclk[plane->id] = 0;
   3513   1.1  riastrad 
   3514   1.1  riastrad 	if (plane->id == PLANE_PRIMARY)
   3515   1.1  riastrad 		hsw_disable_ips(crtc_state);
   3516   1.1  riastrad 
   3517   1.1  riastrad 	/*
   3518   1.1  riastrad 	 * Vblank time updates from the shadow to live plane control register
   3519   1.1  riastrad 	 * are blocked if the memory self-refresh mode is active at that
   3520   1.1  riastrad 	 * moment. So to make sure the plane gets truly disabled, disable
   3521   1.1  riastrad 	 * first the self-refresh mode. The self-refresh enable bit in turn
   3522   1.1  riastrad 	 * will be checked/applied by the HW only at the next frame start
   3523   1.1  riastrad 	 * event which is after the vblank start event, so we need to have a
   3524   1.1  riastrad 	 * wait-for-vblank between disabling the plane and the pipe.
   3525   1.1  riastrad 	 */
   3526   1.1  riastrad 	if (HAS_GMCH(dev_priv) &&
   3527   1.1  riastrad 	    intel_set_memory_cxsr(dev_priv, false))
   3528   1.1  riastrad 		intel_wait_for_vblank(dev_priv, crtc->pipe);
   3529   1.1  riastrad 
   3530   1.1  riastrad 	/*
   3531   1.1  riastrad 	 * Gen2 reports pipe underruns whenever all planes are disabled.
   3532   1.1  riastrad 	 * So disable underrun reporting before all the planes get disabled.
   3533   1.1  riastrad 	 */
   3534   1.1  riastrad 	if (IS_GEN(dev_priv, 2) && !crtc_state->active_planes)
   3535   1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
   3536   1.1  riastrad 
   3537   1.1  riastrad 	intel_disable_plane(plane, crtc_state);
   3538   1.1  riastrad }
   3539   1.1  riastrad 
   3540   1.1  riastrad static struct intel_frontbuffer *
   3541   1.1  riastrad to_intel_frontbuffer(struct drm_framebuffer *fb)
   3542   1.1  riastrad {
   3543   1.1  riastrad 	return fb ? to_intel_framebuffer(fb)->frontbuffer : NULL;
   3544   1.1  riastrad }
   3545   1.1  riastrad 
   3546   1.1  riastrad static void
   3547   1.1  riastrad intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
   3548   1.1  riastrad 			     struct intel_initial_plane_config *plane_config)
   3549   1.1  riastrad {
   3550   1.1  riastrad 	struct drm_device *dev = intel_crtc->base.dev;
   3551   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   3552   1.1  riastrad 	struct drm_crtc *c;
   3553   1.1  riastrad 	struct drm_plane *primary = intel_crtc->base.primary;
   3554   1.1  riastrad 	struct drm_plane_state *plane_state = primary->state;
   3555   1.1  riastrad 	struct intel_plane *intel_plane = to_intel_plane(primary);
   3556   1.1  riastrad 	struct intel_plane_state *intel_state =
   3557   1.1  riastrad 		to_intel_plane_state(plane_state);
   3558   1.1  riastrad 	struct drm_framebuffer *fb;
   3559   1.1  riastrad 
   3560   1.1  riastrad 	if (!plane_config->fb)
   3561   1.1  riastrad 		return;
   3562   1.1  riastrad 
   3563   1.1  riastrad 	if (intel_alloc_initial_plane_obj(intel_crtc, plane_config)) {
   3564   1.1  riastrad 		fb = &plane_config->fb->base;
   3565   1.1  riastrad 		goto valid_fb;
   3566   1.1  riastrad 	}
   3567   1.1  riastrad 
   3568   1.1  riastrad 	kfree(plane_config->fb);
   3569   1.1  riastrad 
   3570   1.1  riastrad 	/*
   3571   1.1  riastrad 	 * Failed to alloc the obj, check to see if we should share
   3572   1.1  riastrad 	 * an fb with another CRTC instead
   3573   1.1  riastrad 	 */
   3574   1.1  riastrad 	for_each_crtc(dev, c) {
   3575   1.1  riastrad 		struct intel_plane_state *state;
   3576   1.1  riastrad 
   3577   1.1  riastrad 		if (c == &intel_crtc->base)
   3578   1.1  riastrad 			continue;
   3579   1.1  riastrad 
   3580   1.1  riastrad 		if (!to_intel_crtc(c)->active)
   3581   1.1  riastrad 			continue;
   3582   1.1  riastrad 
   3583   1.1  riastrad 		state = to_intel_plane_state(c->primary->state);
   3584   1.1  riastrad 		if (!state->vma)
   3585   1.1  riastrad 			continue;
   3586   1.1  riastrad 
   3587   1.1  riastrad 		if (intel_plane_ggtt_offset(state) == plane_config->base) {
   3588   1.1  riastrad 			fb = state->hw.fb;
   3589   1.1  riastrad 			drm_framebuffer_get(fb);
   3590   1.1  riastrad 			goto valid_fb;
   3591   1.1  riastrad 		}
   3592   1.1  riastrad 	}
   3593   1.1  riastrad 
   3594   1.1  riastrad 	/*
   3595   1.1  riastrad 	 * We've failed to reconstruct the BIOS FB.  Current display state
   3596   1.1  riastrad 	 * indicates that the primary plane is visible, but has a NULL FB,
   3597   1.1  riastrad 	 * which will lead to problems later if we don't fix it up.  The
   3598   1.1  riastrad 	 * simplest solution is to just disable the primary plane now and
   3599   1.1  riastrad 	 * pretend the BIOS never had it enabled.
   3600   1.1  riastrad 	 */
   3601   1.1  riastrad 	intel_plane_disable_noatomic(intel_crtc, intel_plane);
   3602   1.1  riastrad 
   3603   1.1  riastrad 	return;
   3604   1.1  riastrad 
   3605   1.1  riastrad valid_fb:
   3606   1.1  riastrad 	intel_state->hw.rotation = plane_config->rotation;
   3607   1.1  riastrad 	intel_fill_fb_ggtt_view(&intel_state->view, fb,
   3608   1.1  riastrad 				intel_state->hw.rotation);
   3609   1.1  riastrad 	intel_state->color_plane[0].stride =
   3610   1.1  riastrad 		intel_fb_pitch(fb, 0, intel_state->hw.rotation);
   3611   1.1  riastrad 
   3612   1.1  riastrad 	intel_state->vma =
   3613   1.1  riastrad 		intel_pin_and_fence_fb_obj(fb,
   3614   1.1  riastrad 					   &intel_state->view,
   3615   1.1  riastrad 					   intel_plane_uses_fence(intel_state),
   3616   1.1  riastrad 					   &intel_state->flags);
   3617   1.1  riastrad 	if (IS_ERR(intel_state->vma)) {
   3618   1.1  riastrad 		DRM_ERROR("failed to pin boot fb on pipe %d: %li\n",
   3619   1.1  riastrad 			  intel_crtc->pipe, PTR_ERR(intel_state->vma));
   3620   1.1  riastrad 
   3621   1.1  riastrad 		intel_state->vma = NULL;
   3622   1.1  riastrad 		drm_framebuffer_put(fb);
   3623   1.1  riastrad 		return;
   3624   1.1  riastrad 	}
   3625   1.1  riastrad 
   3626   1.1  riastrad 	intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB);
   3627   1.1  riastrad 
   3628   1.1  riastrad 	plane_state->src_x = 0;
   3629   1.1  riastrad 	plane_state->src_y = 0;
   3630   1.1  riastrad 	plane_state->src_w = fb->width << 16;
   3631   1.1  riastrad 	plane_state->src_h = fb->height << 16;
   3632   1.1  riastrad 
   3633   1.1  riastrad 	plane_state->crtc_x = 0;
   3634   1.1  riastrad 	plane_state->crtc_y = 0;
   3635   1.1  riastrad 	plane_state->crtc_w = fb->width;
   3636   1.1  riastrad 	plane_state->crtc_h = fb->height;
   3637   1.1  riastrad 
   3638   1.1  riastrad 	intel_state->uapi.src = drm_plane_state_src(plane_state);
   3639   1.1  riastrad 	intel_state->uapi.dst = drm_plane_state_dest(plane_state);
   3640   1.1  riastrad 
   3641   1.1  riastrad 	if (plane_config->tiling)
   3642   1.1  riastrad 		dev_priv->preserve_bios_swizzle = true;
   3643   1.1  riastrad 
   3644   1.1  riastrad 	plane_state->fb = fb;
   3645   1.1  riastrad 	plane_state->crtc = &intel_crtc->base;
   3646   1.1  riastrad 	intel_plane_copy_uapi_to_hw_state(intel_state, intel_state);
   3647   1.1  riastrad 
   3648   1.1  riastrad 	atomic_or(to_intel_plane(primary)->frontbuffer_bit,
   3649   1.1  riastrad 		  &to_intel_frontbuffer(fb)->bits);
   3650   1.1  riastrad }
   3651   1.1  riastrad 
   3652   1.1  riastrad static int skl_max_plane_width(const struct drm_framebuffer *fb,
   3653   1.1  riastrad 			       int color_plane,
   3654   1.1  riastrad 			       unsigned int rotation)
   3655   1.1  riastrad {
   3656   1.1  riastrad 	int cpp = fb->format->cpp[color_plane];
   3657   1.1  riastrad 
   3658   1.1  riastrad 	switch (fb->modifier) {
   3659   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   3660   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   3661   1.1  riastrad 		/*
   3662   1.1  riastrad 		 * Validated limit is 4k, but has 5k should
   3663   1.1  riastrad 		 * work apart from the following features:
   3664   1.1  riastrad 		 * - Ytile (already limited to 4k)
   3665   1.1  riastrad 		 * - FP16 (already limited to 4k)
   3666   1.1  riastrad 		 * - render compression (already limited to 4k)
   3667   1.1  riastrad 		 * - KVMR sprite and cursor (don't care)
   3668   1.1  riastrad 		 * - horizontal panning (TODO verify this)
   3669   1.1  riastrad 		 * - pipe and plane scaling (TODO verify this)
   3670   1.1  riastrad 		 */
   3671   1.1  riastrad 		if (cpp == 8)
   3672   1.1  riastrad 			return 4096;
   3673   1.1  riastrad 		else
   3674   1.1  riastrad 			return 5120;
   3675   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   3676   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   3677   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   3678   1.1  riastrad 		/* FIXME AUX plane? */
   3679   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   3680   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED:
   3681   1.1  riastrad 		if (cpp == 8)
   3682   1.1  riastrad 			return 2048;
   3683   1.1  riastrad 		else
   3684   1.1  riastrad 			return 4096;
   3685   1.1  riastrad 	default:
   3686   1.1  riastrad 		MISSING_CASE(fb->modifier);
   3687   1.1  riastrad 		return 2048;
   3688   1.1  riastrad 	}
   3689   1.1  riastrad }
   3690   1.1  riastrad 
   3691   1.1  riastrad static int glk_max_plane_width(const struct drm_framebuffer *fb,
   3692   1.1  riastrad 			       int color_plane,
   3693   1.1  riastrad 			       unsigned int rotation)
   3694   1.1  riastrad {
   3695   1.1  riastrad 	int cpp = fb->format->cpp[color_plane];
   3696   1.1  riastrad 
   3697   1.1  riastrad 	switch (fb->modifier) {
   3698   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   3699   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   3700   1.1  riastrad 		if (cpp == 8)
   3701   1.1  riastrad 			return 4096;
   3702   1.1  riastrad 		else
   3703   1.1  riastrad 			return 5120;
   3704   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   3705   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   3706   1.1  riastrad 		/* FIXME AUX plane? */
   3707   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   3708   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED:
   3709   1.1  riastrad 		if (cpp == 8)
   3710   1.1  riastrad 			return 2048;
   3711   1.1  riastrad 		else
   3712   1.1  riastrad 			return 5120;
   3713   1.1  riastrad 	default:
   3714   1.1  riastrad 		MISSING_CASE(fb->modifier);
   3715   1.1  riastrad 		return 2048;
   3716   1.1  riastrad 	}
   3717   1.1  riastrad }
   3718   1.1  riastrad 
   3719   1.1  riastrad static int icl_max_plane_width(const struct drm_framebuffer *fb,
   3720   1.1  riastrad 			       int color_plane,
   3721   1.1  riastrad 			       unsigned int rotation)
   3722   1.1  riastrad {
   3723   1.1  riastrad 	return 5120;
   3724   1.1  riastrad }
   3725   1.1  riastrad 
   3726   1.1  riastrad static int skl_max_plane_height(void)
   3727   1.1  riastrad {
   3728   1.1  riastrad 	return 4096;
   3729   1.1  riastrad }
   3730   1.1  riastrad 
   3731   1.1  riastrad static int icl_max_plane_height(void)
   3732   1.1  riastrad {
   3733   1.1  riastrad 	return 4320;
   3734   1.1  riastrad }
   3735   1.1  riastrad 
   3736   1.1  riastrad static bool
   3737   1.1  riastrad skl_check_main_ccs_coordinates(struct intel_plane_state *plane_state,
   3738   1.1  riastrad 			       int main_x, int main_y, u32 main_offset,
   3739   1.1  riastrad 			       int ccs_plane)
   3740   1.1  riastrad {
   3741   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   3742   1.1  riastrad 	int aux_x = plane_state->color_plane[ccs_plane].x;
   3743   1.1  riastrad 	int aux_y = plane_state->color_plane[ccs_plane].y;
   3744   1.1  riastrad 	u32 aux_offset = plane_state->color_plane[ccs_plane].offset;
   3745   1.1  riastrad 	u32 alignment = intel_surf_alignment(fb, ccs_plane);
   3746   1.1  riastrad 	int hsub;
   3747   1.1  riastrad 	int vsub;
   3748   1.1  riastrad 
   3749   1.1  riastrad 	intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
   3750   1.1  riastrad 	while (aux_offset >= main_offset && aux_y <= main_y) {
   3751   1.1  riastrad 		int x, y;
   3752   1.1  riastrad 
   3753   1.1  riastrad 		if (aux_x == main_x && aux_y == main_y)
   3754   1.1  riastrad 			break;
   3755   1.1  riastrad 
   3756   1.1  riastrad 		if (aux_offset == 0)
   3757   1.1  riastrad 			break;
   3758   1.1  riastrad 
   3759   1.1  riastrad 		x = aux_x / hsub;
   3760   1.1  riastrad 		y = aux_y / vsub;
   3761   1.1  riastrad 		aux_offset = intel_plane_adjust_aligned_offset(&x, &y,
   3762   1.1  riastrad 							       plane_state,
   3763   1.1  riastrad 							       ccs_plane,
   3764   1.1  riastrad 							       aux_offset,
   3765   1.1  riastrad 							       aux_offset -
   3766   1.1  riastrad 								alignment);
   3767   1.1  riastrad 		aux_x = x * hsub + aux_x % hsub;
   3768   1.1  riastrad 		aux_y = y * vsub + aux_y % vsub;
   3769   1.1  riastrad 	}
   3770   1.1  riastrad 
   3771   1.1  riastrad 	if (aux_x != main_x || aux_y != main_y)
   3772   1.1  riastrad 		return false;
   3773   1.1  riastrad 
   3774   1.1  riastrad 	plane_state->color_plane[ccs_plane].offset = aux_offset;
   3775   1.1  riastrad 	plane_state->color_plane[ccs_plane].x = aux_x;
   3776   1.1  riastrad 	plane_state->color_plane[ccs_plane].y = aux_y;
   3777   1.1  riastrad 
   3778   1.1  riastrad 	return true;
   3779   1.1  riastrad }
   3780   1.1  riastrad 
   3781   1.1  riastrad static int skl_check_main_surface(struct intel_plane_state *plane_state)
   3782   1.1  riastrad {
   3783   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane_state->uapi.plane->dev);
   3784   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   3785   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   3786   1.1  riastrad 	int x = plane_state->uapi.src.x1 >> 16;
   3787   1.1  riastrad 	int y = plane_state->uapi.src.y1 >> 16;
   3788   1.1  riastrad 	int w = drm_rect_width(&plane_state->uapi.src) >> 16;
   3789   1.1  riastrad 	int h = drm_rect_height(&plane_state->uapi.src) >> 16;
   3790   1.1  riastrad 	int max_width;
   3791   1.1  riastrad 	int max_height;
   3792   1.1  riastrad 	u32 alignment;
   3793   1.1  riastrad 	u32 offset;
   3794   1.1  riastrad 	int aux_plane = intel_main_to_aux_plane(fb, 0);
   3795   1.1  riastrad 	u32 aux_offset = plane_state->color_plane[aux_plane].offset;
   3796   1.1  riastrad 
   3797   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   3798   1.1  riastrad 		max_width = icl_max_plane_width(fb, 0, rotation);
   3799   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   3800   1.1  riastrad 		max_width = glk_max_plane_width(fb, 0, rotation);
   3801   1.1  riastrad 	else
   3802   1.1  riastrad 		max_width = skl_max_plane_width(fb, 0, rotation);
   3803   1.1  riastrad 
   3804   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   3805   1.1  riastrad 		max_height = icl_max_plane_height();
   3806   1.1  riastrad 	else
   3807   1.1  riastrad 		max_height = skl_max_plane_height();
   3808   1.1  riastrad 
   3809   1.1  riastrad 	if (w > max_width || h > max_height) {
   3810   1.1  riastrad 		DRM_DEBUG_KMS("requested Y/RGB source size %dx%d too big (limit %dx%d)\n",
   3811   1.1  riastrad 			      w, h, max_width, max_height);
   3812   1.1  riastrad 		return -EINVAL;
   3813   1.1  riastrad 	}
   3814   1.1  riastrad 
   3815   1.1  riastrad 	intel_add_fb_offsets(&x, &y, plane_state, 0);
   3816   1.1  riastrad 	offset = intel_plane_compute_aligned_offset(&x, &y, plane_state, 0);
   3817   1.1  riastrad 	alignment = intel_surf_alignment(fb, 0);
   3818   1.1  riastrad 	if (WARN_ON(alignment && !is_power_of_2(alignment)))
   3819   1.1  riastrad 		return -EINVAL;
   3820   1.1  riastrad 
   3821   1.1  riastrad 	/*
   3822   1.1  riastrad 	 * AUX surface offset is specified as the distance from the
   3823   1.1  riastrad 	 * main surface offset, and it must be non-negative. Make
   3824   1.1  riastrad 	 * sure that is what we will get.
   3825   1.1  riastrad 	 */
   3826   1.1  riastrad 	if (offset > aux_offset)
   3827   1.1  riastrad 		offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
   3828   1.1  riastrad 							   offset, aux_offset & ~(alignment - 1));
   3829   1.1  riastrad 
   3830   1.1  riastrad 	/*
   3831   1.1  riastrad 	 * When using an X-tiled surface, the plane blows up
   3832   1.1  riastrad 	 * if the x offset + width exceed the stride.
   3833   1.1  riastrad 	 *
   3834   1.1  riastrad 	 * TODO: linear and Y-tiled seem fine, Yf untested,
   3835   1.1  riastrad 	 */
   3836   1.1  riastrad 	if (fb->modifier == I915_FORMAT_MOD_X_TILED) {
   3837   1.1  riastrad 		int cpp = fb->format->cpp[0];
   3838   1.1  riastrad 
   3839   1.1  riastrad 		while ((x + w) * cpp > plane_state->color_plane[0].stride) {
   3840   1.1  riastrad 			if (offset == 0) {
   3841   1.1  riastrad 				DRM_DEBUG_KMS("Unable to find suitable display surface offset due to X-tiling\n");
   3842   1.1  riastrad 				return -EINVAL;
   3843   1.1  riastrad 			}
   3844   1.1  riastrad 
   3845   1.1  riastrad 			offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
   3846   1.1  riastrad 								   offset, offset - alignment);
   3847   1.1  riastrad 		}
   3848   1.1  riastrad 	}
   3849   1.1  riastrad 
   3850   1.1  riastrad 	/*
   3851   1.1  riastrad 	 * CCS AUX surface doesn't have its own x/y offsets, we must make sure
   3852   1.1  riastrad 	 * they match with the main surface x/y offsets.
   3853   1.1  riastrad 	 */
   3854   1.1  riastrad 	if (is_ccs_modifier(fb->modifier)) {
   3855   1.1  riastrad 		while (!skl_check_main_ccs_coordinates(plane_state, x, y,
   3856   1.1  riastrad 						       offset, aux_plane)) {
   3857   1.1  riastrad 			if (offset == 0)
   3858   1.1  riastrad 				break;
   3859   1.1  riastrad 
   3860   1.1  riastrad 			offset = intel_plane_adjust_aligned_offset(&x, &y, plane_state, 0,
   3861   1.1  riastrad 								   offset, offset - alignment);
   3862   1.1  riastrad 		}
   3863   1.1  riastrad 
   3864   1.1  riastrad 		if (x != plane_state->color_plane[aux_plane].x ||
   3865   1.1  riastrad 		    y != plane_state->color_plane[aux_plane].y) {
   3866   1.1  riastrad 			DRM_DEBUG_KMS("Unable to find suitable display surface offset due to CCS\n");
   3867   1.1  riastrad 			return -EINVAL;
   3868   1.1  riastrad 		}
   3869   1.1  riastrad 	}
   3870   1.1  riastrad 
   3871   1.1  riastrad 	plane_state->color_plane[0].offset = offset;
   3872   1.1  riastrad 	plane_state->color_plane[0].x = x;
   3873   1.1  riastrad 	plane_state->color_plane[0].y = y;
   3874   1.1  riastrad 
   3875   1.1  riastrad 	/*
   3876   1.1  riastrad 	 * Put the final coordinates back so that the src
   3877   1.1  riastrad 	 * coordinate checks will see the right values.
   3878   1.1  riastrad 	 */
   3879   1.1  riastrad 	drm_rect_translate_to(&plane_state->uapi.src,
   3880   1.1  riastrad 			      x << 16, y << 16);
   3881   1.1  riastrad 
   3882   1.1  riastrad 	return 0;
   3883   1.1  riastrad }
   3884   1.1  riastrad 
   3885   1.1  riastrad static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
   3886   1.1  riastrad {
   3887   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   3888   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   3889   1.1  riastrad 	int uv_plane = 1;
   3890   1.1  riastrad 	int max_width = skl_max_plane_width(fb, uv_plane, rotation);
   3891   1.1  riastrad 	int max_height = 4096;
   3892   1.1  riastrad 	int x = plane_state->uapi.src.x1 >> 17;
   3893   1.1  riastrad 	int y = plane_state->uapi.src.y1 >> 17;
   3894   1.1  riastrad 	int w = drm_rect_width(&plane_state->uapi.src) >> 17;
   3895   1.1  riastrad 	int h = drm_rect_height(&plane_state->uapi.src) >> 17;
   3896   1.1  riastrad 	u32 offset;
   3897   1.1  riastrad 
   3898   1.1  riastrad 	intel_add_fb_offsets(&x, &y, plane_state, uv_plane);
   3899   1.1  riastrad 	offset = intel_plane_compute_aligned_offset(&x, &y,
   3900   1.1  riastrad 						    plane_state, uv_plane);
   3901   1.1  riastrad 
   3902   1.1  riastrad 	/* FIXME not quite sure how/if these apply to the chroma plane */
   3903   1.1  riastrad 	if (w > max_width || h > max_height) {
   3904   1.1  riastrad 		DRM_DEBUG_KMS("CbCr source size %dx%d too big (limit %dx%d)\n",
   3905   1.1  riastrad 			      w, h, max_width, max_height);
   3906   1.1  riastrad 		return -EINVAL;
   3907   1.1  riastrad 	}
   3908   1.1  riastrad 
   3909   1.1  riastrad 	if (is_ccs_modifier(fb->modifier)) {
   3910   1.1  riastrad 		int ccs_plane = main_to_ccs_plane(fb, uv_plane);
   3911   1.1  riastrad 		int aux_offset = plane_state->color_plane[ccs_plane].offset;
   3912   1.1  riastrad 		int alignment = intel_surf_alignment(fb, uv_plane);
   3913   1.1  riastrad 
   3914   1.1  riastrad 		if (offset > aux_offset)
   3915   1.1  riastrad 			offset = intel_plane_adjust_aligned_offset(&x, &y,
   3916   1.1  riastrad 								   plane_state,
   3917   1.1  riastrad 								   uv_plane,
   3918   1.1  riastrad 								   offset,
   3919   1.1  riastrad 								   aux_offset & ~(alignment - 1));
   3920   1.1  riastrad 
   3921   1.1  riastrad 		while (!skl_check_main_ccs_coordinates(plane_state, x, y,
   3922   1.1  riastrad 						       offset, ccs_plane)) {
   3923   1.1  riastrad 			if (offset == 0)
   3924   1.1  riastrad 				break;
   3925   1.1  riastrad 
   3926   1.1  riastrad 			offset = intel_plane_adjust_aligned_offset(&x, &y,
   3927   1.1  riastrad 								   plane_state,
   3928   1.1  riastrad 								   uv_plane,
   3929   1.1  riastrad 								   offset, offset - alignment);
   3930   1.1  riastrad 		}
   3931   1.1  riastrad 
   3932   1.1  riastrad 		if (x != plane_state->color_plane[ccs_plane].x ||
   3933   1.1  riastrad 		    y != plane_state->color_plane[ccs_plane].y) {
   3934   1.1  riastrad 			DRM_DEBUG_KMS("Unable to find suitable display surface offset due to CCS\n");
   3935   1.1  riastrad 			return -EINVAL;
   3936   1.1  riastrad 		}
   3937   1.1  riastrad 	}
   3938   1.1  riastrad 
   3939   1.1  riastrad 	plane_state->color_plane[uv_plane].offset = offset;
   3940   1.1  riastrad 	plane_state->color_plane[uv_plane].x = x;
   3941   1.1  riastrad 	plane_state->color_plane[uv_plane].y = y;
   3942   1.1  riastrad 
   3943   1.1  riastrad 	return 0;
   3944   1.1  riastrad }
   3945   1.1  riastrad 
   3946   1.1  riastrad static int skl_check_ccs_aux_surface(struct intel_plane_state *plane_state)
   3947   1.1  riastrad {
   3948   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   3949   1.1  riastrad 	int src_x = plane_state->uapi.src.x1 >> 16;
   3950   1.1  riastrad 	int src_y = plane_state->uapi.src.y1 >> 16;
   3951   1.1  riastrad 	u32 offset;
   3952   1.1  riastrad 	int ccs_plane;
   3953   1.1  riastrad 
   3954   1.1  riastrad 	for (ccs_plane = 0; ccs_plane < fb->format->num_planes; ccs_plane++) {
   3955   1.1  riastrad 		int main_hsub, main_vsub;
   3956   1.1  riastrad 		int hsub, vsub;
   3957   1.1  riastrad 		int x, y;
   3958   1.1  riastrad 
   3959   1.1  riastrad 		if (!is_ccs_plane(fb, ccs_plane))
   3960   1.1  riastrad 			continue;
   3961   1.1  riastrad 
   3962   1.1  riastrad 		intel_fb_plane_get_subsampling(&main_hsub, &main_vsub, fb,
   3963   1.1  riastrad 					       ccs_to_main_plane(fb, ccs_plane));
   3964   1.1  riastrad 		intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
   3965   1.1  riastrad 
   3966   1.1  riastrad 		hsub *= main_hsub;
   3967   1.1  riastrad 		vsub *= main_vsub;
   3968   1.1  riastrad 		x = src_x / hsub;
   3969   1.1  riastrad 		y = src_y / vsub;
   3970   1.1  riastrad 
   3971   1.1  riastrad 		intel_add_fb_offsets(&x, &y, plane_state, ccs_plane);
   3972   1.1  riastrad 
   3973   1.1  riastrad 		offset = intel_plane_compute_aligned_offset(&x, &y,
   3974   1.1  riastrad 							    plane_state,
   3975   1.1  riastrad 							    ccs_plane);
   3976   1.1  riastrad 
   3977   1.1  riastrad 		plane_state->color_plane[ccs_plane].offset = offset;
   3978   1.1  riastrad 		plane_state->color_plane[ccs_plane].x = (x * hsub +
   3979   1.1  riastrad 							 src_x % hsub) /
   3980   1.1  riastrad 							main_hsub;
   3981   1.1  riastrad 		plane_state->color_plane[ccs_plane].y = (y * vsub +
   3982   1.1  riastrad 							 src_y % vsub) /
   3983   1.1  riastrad 							main_vsub;
   3984   1.1  riastrad 	}
   3985   1.1  riastrad 
   3986   1.1  riastrad 	return 0;
   3987   1.1  riastrad }
   3988   1.1  riastrad 
   3989   1.1  riastrad int skl_check_plane_surface(struct intel_plane_state *plane_state)
   3990   1.1  riastrad {
   3991   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   3992   1.1  riastrad 	int ret;
   3993   1.1  riastrad 	bool needs_aux = false;
   3994   1.1  riastrad 
   3995   1.1  riastrad 	ret = intel_plane_compute_gtt(plane_state);
   3996   1.1  riastrad 	if (ret)
   3997   1.1  riastrad 		return ret;
   3998   1.1  riastrad 
   3999   1.1  riastrad 	if (!plane_state->uapi.visible)
   4000   1.1  riastrad 		return 0;
   4001   1.1  riastrad 
   4002   1.1  riastrad 	/*
   4003   1.1  riastrad 	 * Handle the AUX surface first since the main surface setup depends on
   4004   1.1  riastrad 	 * it.
   4005   1.1  riastrad 	 */
   4006   1.1  riastrad 	if (is_ccs_modifier(fb->modifier)) {
   4007   1.1  riastrad 		needs_aux = true;
   4008   1.1  riastrad 		ret = skl_check_ccs_aux_surface(plane_state);
   4009   1.1  riastrad 		if (ret)
   4010   1.1  riastrad 			return ret;
   4011   1.1  riastrad 	}
   4012   1.1  riastrad 
   4013   1.1  riastrad 	if (intel_format_info_is_yuv_semiplanar(fb->format,
   4014   1.1  riastrad 						fb->modifier)) {
   4015   1.1  riastrad 		needs_aux = true;
   4016   1.1  riastrad 		ret = skl_check_nv12_aux_surface(plane_state);
   4017   1.1  riastrad 		if (ret)
   4018   1.1  riastrad 			return ret;
   4019   1.1  riastrad 	}
   4020   1.1  riastrad 
   4021   1.1  riastrad 	if (!needs_aux) {
   4022   1.1  riastrad 		int i;
   4023   1.1  riastrad 
   4024   1.1  riastrad 		for (i = 1; i < fb->format->num_planes; i++) {
   4025   1.1  riastrad 			plane_state->color_plane[i].offset = ~0xfff;
   4026   1.1  riastrad 			plane_state->color_plane[i].x = 0;
   4027   1.1  riastrad 			plane_state->color_plane[i].y = 0;
   4028   1.1  riastrad 		}
   4029   1.1  riastrad 	}
   4030   1.1  riastrad 
   4031   1.1  riastrad 	ret = skl_check_main_surface(plane_state);
   4032   1.1  riastrad 	if (ret)
   4033   1.1  riastrad 		return ret;
   4034   1.1  riastrad 
   4035   1.1  riastrad 	return 0;
   4036   1.1  riastrad }
   4037   1.1  riastrad 
   4038   1.1  riastrad static void i9xx_plane_ratio(const struct intel_crtc_state *crtc_state,
   4039   1.1  riastrad 			     const struct intel_plane_state *plane_state,
   4040   1.1  riastrad 			     unsigned int *num, unsigned int *den)
   4041   1.1  riastrad {
   4042   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4043   1.1  riastrad 	unsigned int cpp = fb->format->cpp[0];
   4044   1.1  riastrad 
   4045   1.1  riastrad 	/*
   4046   1.1  riastrad 	 * g4x bspec says 64bpp pixel rate can't exceed 80%
   4047   1.1  riastrad 	 * of cdclk when the sprite plane is enabled on the
   4048   1.1  riastrad 	 * same pipe. ilk/snb bspec says 64bpp pixel rate is
   4049   1.1  riastrad 	 * never allowed to exceed 80% of cdclk. Let's just go
   4050   1.1  riastrad 	 * with the ilk/snb limit always.
   4051   1.1  riastrad 	 */
   4052   1.1  riastrad 	if (cpp == 8) {
   4053   1.1  riastrad 		*num = 10;
   4054   1.1  riastrad 		*den = 8;
   4055   1.1  riastrad 	} else {
   4056   1.1  riastrad 		*num = 1;
   4057   1.1  riastrad 		*den = 1;
   4058   1.1  riastrad 	}
   4059   1.1  riastrad }
   4060   1.1  riastrad 
   4061   1.1  riastrad static int i9xx_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
   4062   1.1  riastrad 				const struct intel_plane_state *plane_state)
   4063   1.1  riastrad {
   4064   1.1  riastrad 	unsigned int pixel_rate;
   4065   1.1  riastrad 	unsigned int num, den;
   4066   1.1  riastrad 
   4067   1.1  riastrad 	/*
   4068   1.1  riastrad 	 * Note that crtc_state->pixel_rate accounts for both
   4069   1.1  riastrad 	 * horizontal and vertical panel fitter downscaling factors.
   4070   1.1  riastrad 	 * Pre-HSW bspec tells us to only consider the horizontal
   4071   1.1  riastrad 	 * downscaling factor here. We ignore that and just consider
   4072   1.1  riastrad 	 * both for simplicity.
   4073   1.1  riastrad 	 */
   4074   1.1  riastrad 	pixel_rate = crtc_state->pixel_rate;
   4075   1.1  riastrad 
   4076   1.1  riastrad 	i9xx_plane_ratio(crtc_state, plane_state, &num, &den);
   4077   1.1  riastrad 
   4078   1.1  riastrad 	/* two pixels per clock with double wide pipe */
   4079   1.1  riastrad 	if (crtc_state->double_wide)
   4080   1.1  riastrad 		den *= 2;
   4081   1.1  riastrad 
   4082   1.1  riastrad 	return DIV_ROUND_UP(pixel_rate * num, den);
   4083   1.1  riastrad }
   4084   1.1  riastrad 
   4085   1.1  riastrad unsigned int
   4086   1.1  riastrad i9xx_plane_max_stride(struct intel_plane *plane,
   4087   1.1  riastrad 		      u32 pixel_format, u64 modifier,
   4088   1.1  riastrad 		      unsigned int rotation)
   4089   1.1  riastrad {
   4090   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   4091   1.1  riastrad 
   4092   1.1  riastrad 	if (!HAS_GMCH(dev_priv)) {
   4093   1.1  riastrad 		return 32*1024;
   4094   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 4) {
   4095   1.1  riastrad 		if (modifier == I915_FORMAT_MOD_X_TILED)
   4096   1.1  riastrad 			return 16*1024;
   4097   1.1  riastrad 		else
   4098   1.1  riastrad 			return 32*1024;
   4099   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 3) {
   4100   1.1  riastrad 		if (modifier == I915_FORMAT_MOD_X_TILED)
   4101   1.1  riastrad 			return 8*1024;
   4102   1.1  riastrad 		else
   4103   1.1  riastrad 			return 16*1024;
   4104   1.1  riastrad 	} else {
   4105   1.1  riastrad 		if (plane->i9xx_plane == PLANE_C)
   4106   1.1  riastrad 			return 4*1024;
   4107   1.1  riastrad 		else
   4108   1.1  riastrad 			return 8*1024;
   4109   1.1  riastrad 	}
   4110   1.1  riastrad }
   4111   1.1  riastrad 
   4112   1.1  riastrad static u32 i9xx_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
   4113   1.1  riastrad {
   4114   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   4115   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   4116   1.1  riastrad 	u32 dspcntr = 0;
   4117   1.1  riastrad 
   4118   1.1  riastrad 	if (crtc_state->gamma_enable)
   4119   1.1  riastrad 		dspcntr |= DISPPLANE_GAMMA_ENABLE;
   4120   1.1  riastrad 
   4121   1.1  riastrad 	if (crtc_state->csc_enable)
   4122   1.1  riastrad 		dspcntr |= DISPPLANE_PIPE_CSC_ENABLE;
   4123   1.1  riastrad 
   4124   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 5)
   4125   1.1  riastrad 		dspcntr |= DISPPLANE_SEL_PIPE(crtc->pipe);
   4126   1.1  riastrad 
   4127   1.1  riastrad 	return dspcntr;
   4128   1.1  riastrad }
   4129   1.1  riastrad 
   4130   1.1  riastrad static u32 i9xx_plane_ctl(const struct intel_crtc_state *crtc_state,
   4131   1.1  riastrad 			  const struct intel_plane_state *plane_state)
   4132   1.1  riastrad {
   4133   1.1  riastrad 	struct drm_i915_private *dev_priv =
   4134   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   4135   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4136   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   4137   1.1  riastrad 	u32 dspcntr;
   4138   1.1  riastrad 
   4139   1.1  riastrad 	dspcntr = DISPLAY_PLANE_ENABLE;
   4140   1.1  riastrad 
   4141   1.1  riastrad 	if (IS_G4X(dev_priv) || IS_GEN(dev_priv, 5) ||
   4142   1.1  riastrad 	    IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
   4143   1.1  riastrad 		dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
   4144   1.1  riastrad 
   4145   1.1  riastrad 	switch (fb->format->format) {
   4146   1.1  riastrad 	case DRM_FORMAT_C8:
   4147   1.1  riastrad 		dspcntr |= DISPPLANE_8BPP;
   4148   1.1  riastrad 		break;
   4149   1.1  riastrad 	case DRM_FORMAT_XRGB1555:
   4150   1.1  riastrad 		dspcntr |= DISPPLANE_BGRX555;
   4151   1.1  riastrad 		break;
   4152   1.1  riastrad 	case DRM_FORMAT_ARGB1555:
   4153   1.1  riastrad 		dspcntr |= DISPPLANE_BGRA555;
   4154   1.1  riastrad 		break;
   4155   1.1  riastrad 	case DRM_FORMAT_RGB565:
   4156   1.1  riastrad 		dspcntr |= DISPPLANE_BGRX565;
   4157   1.1  riastrad 		break;
   4158   1.1  riastrad 	case DRM_FORMAT_XRGB8888:
   4159   1.1  riastrad 		dspcntr |= DISPPLANE_BGRX888;
   4160   1.1  riastrad 		break;
   4161   1.1  riastrad 	case DRM_FORMAT_XBGR8888:
   4162   1.1  riastrad 		dspcntr |= DISPPLANE_RGBX888;
   4163   1.1  riastrad 		break;
   4164   1.1  riastrad 	case DRM_FORMAT_ARGB8888:
   4165   1.1  riastrad 		dspcntr |= DISPPLANE_BGRA888;
   4166   1.1  riastrad 		break;
   4167   1.1  riastrad 	case DRM_FORMAT_ABGR8888:
   4168   1.1  riastrad 		dspcntr |= DISPPLANE_RGBA888;
   4169   1.1  riastrad 		break;
   4170   1.1  riastrad 	case DRM_FORMAT_XRGB2101010:
   4171   1.1  riastrad 		dspcntr |= DISPPLANE_BGRX101010;
   4172   1.1  riastrad 		break;
   4173   1.1  riastrad 	case DRM_FORMAT_XBGR2101010:
   4174   1.1  riastrad 		dspcntr |= DISPPLANE_RGBX101010;
   4175   1.1  riastrad 		break;
   4176   1.1  riastrad 	case DRM_FORMAT_ARGB2101010:
   4177   1.1  riastrad 		dspcntr |= DISPPLANE_BGRA101010;
   4178   1.1  riastrad 		break;
   4179   1.1  riastrad 	case DRM_FORMAT_ABGR2101010:
   4180   1.1  riastrad 		dspcntr |= DISPPLANE_RGBA101010;
   4181   1.1  riastrad 		break;
   4182   1.1  riastrad 	case DRM_FORMAT_XBGR16161616F:
   4183   1.1  riastrad 		dspcntr |= DISPPLANE_RGBX161616;
   4184   1.1  riastrad 		break;
   4185   1.1  riastrad 	default:
   4186   1.1  riastrad 		MISSING_CASE(fb->format->format);
   4187   1.1  riastrad 		return 0;
   4188   1.1  riastrad 	}
   4189   1.1  riastrad 
   4190   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4 &&
   4191   1.1  riastrad 	    fb->modifier == I915_FORMAT_MOD_X_TILED)
   4192   1.1  riastrad 		dspcntr |= DISPPLANE_TILED;
   4193   1.1  riastrad 
   4194   1.1  riastrad 	if (rotation & DRM_MODE_ROTATE_180)
   4195   1.1  riastrad 		dspcntr |= DISPPLANE_ROTATE_180;
   4196   1.1  riastrad 
   4197   1.1  riastrad 	if (rotation & DRM_MODE_REFLECT_X)
   4198   1.1  riastrad 		dspcntr |= DISPPLANE_MIRROR;
   4199   1.1  riastrad 
   4200   1.1  riastrad 	return dspcntr;
   4201   1.1  riastrad }
   4202   1.1  riastrad 
   4203   1.1  riastrad int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
   4204   1.1  riastrad {
   4205   1.1  riastrad 	struct drm_i915_private *dev_priv =
   4206   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   4207   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4208   1.1  riastrad 	int src_x, src_y, src_w;
   4209   1.1  riastrad 	u32 offset;
   4210   1.1  riastrad 	int ret;
   4211   1.1  riastrad 
   4212   1.1  riastrad 	ret = intel_plane_compute_gtt(plane_state);
   4213   1.1  riastrad 	if (ret)
   4214   1.1  riastrad 		return ret;
   4215   1.1  riastrad 
   4216   1.1  riastrad 	if (!plane_state->uapi.visible)
   4217   1.1  riastrad 		return 0;
   4218   1.1  riastrad 
   4219   1.1  riastrad 	src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
   4220   1.1  riastrad 	src_x = plane_state->uapi.src.x1 >> 16;
   4221   1.1  riastrad 	src_y = plane_state->uapi.src.y1 >> 16;
   4222   1.1  riastrad 
   4223   1.1  riastrad 	/* Undocumented hardware limit on i965/g4x/vlv/chv */
   4224   1.1  riastrad 	if (HAS_GMCH(dev_priv) && fb->format->cpp[0] == 8 && src_w > 2048)
   4225   1.1  riastrad 		return -EINVAL;
   4226   1.1  riastrad 
   4227   1.1  riastrad 	intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
   4228   1.1  riastrad 
   4229   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   4230   1.1  riastrad 		offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
   4231   1.1  riastrad 							    plane_state, 0);
   4232   1.1  riastrad 	else
   4233   1.1  riastrad 		offset = 0;
   4234   1.1  riastrad 
   4235   1.1  riastrad 	/*
   4236   1.1  riastrad 	 * Put the final coordinates back so that the src
   4237   1.1  riastrad 	 * coordinate checks will see the right values.
   4238   1.1  riastrad 	 */
   4239   1.1  riastrad 	drm_rect_translate_to(&plane_state->uapi.src,
   4240   1.1  riastrad 			      src_x << 16, src_y << 16);
   4241   1.1  riastrad 
   4242   1.1  riastrad 	/* HSW/BDW do this automagically in hardware */
   4243   1.1  riastrad 	if (!IS_HASWELL(dev_priv) && !IS_BROADWELL(dev_priv)) {
   4244   1.1  riastrad 		unsigned int rotation = plane_state->hw.rotation;
   4245   1.1  riastrad 		int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
   4246   1.1  riastrad 		int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
   4247   1.1  riastrad 
   4248   1.1  riastrad 		if (rotation & DRM_MODE_ROTATE_180) {
   4249   1.1  riastrad 			src_x += src_w - 1;
   4250   1.1  riastrad 			src_y += src_h - 1;
   4251   1.1  riastrad 		} else if (rotation & DRM_MODE_REFLECT_X) {
   4252   1.1  riastrad 			src_x += src_w - 1;
   4253   1.1  riastrad 		}
   4254   1.1  riastrad 	}
   4255   1.1  riastrad 
   4256   1.1  riastrad 	plane_state->color_plane[0].offset = offset;
   4257   1.1  riastrad 	plane_state->color_plane[0].x = src_x;
   4258   1.1  riastrad 	plane_state->color_plane[0].y = src_y;
   4259   1.1  riastrad 
   4260   1.1  riastrad 	return 0;
   4261   1.1  riastrad }
   4262   1.1  riastrad 
   4263   1.1  riastrad static bool i9xx_plane_has_windowing(struct intel_plane *plane)
   4264   1.1  riastrad {
   4265   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   4266   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   4267   1.1  riastrad 
   4268   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv))
   4269   1.1  riastrad 		return i9xx_plane == PLANE_B;
   4270   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
   4271   1.1  riastrad 		return false;
   4272   1.1  riastrad 	else if (IS_GEN(dev_priv, 4))
   4273   1.1  riastrad 		return i9xx_plane == PLANE_C;
   4274   1.1  riastrad 	else
   4275   1.1  riastrad 		return i9xx_plane == PLANE_B ||
   4276   1.1  riastrad 			i9xx_plane == PLANE_C;
   4277   1.1  riastrad }
   4278   1.1  riastrad 
   4279   1.1  riastrad static int
   4280   1.1  riastrad i9xx_plane_check(struct intel_crtc_state *crtc_state,
   4281   1.1  riastrad 		 struct intel_plane_state *plane_state)
   4282   1.1  riastrad {
   4283   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   4284   1.1  riastrad 	int ret;
   4285   1.1  riastrad 
   4286   1.1  riastrad 	ret = chv_plane_check_rotation(plane_state);
   4287   1.1  riastrad 	if (ret)
   4288   1.1  riastrad 		return ret;
   4289   1.1  riastrad 
   4290   1.1  riastrad 	ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
   4291   1.1  riastrad 						  &crtc_state->uapi,
   4292   1.1  riastrad 						  DRM_PLANE_HELPER_NO_SCALING,
   4293   1.1  riastrad 						  DRM_PLANE_HELPER_NO_SCALING,
   4294   1.1  riastrad 						  i9xx_plane_has_windowing(plane),
   4295   1.1  riastrad 						  true);
   4296   1.1  riastrad 	if (ret)
   4297   1.1  riastrad 		return ret;
   4298   1.1  riastrad 
   4299   1.1  riastrad 	ret = i9xx_check_plane_surface(plane_state);
   4300   1.1  riastrad 	if (ret)
   4301   1.1  riastrad 		return ret;
   4302   1.1  riastrad 
   4303   1.1  riastrad 	if (!plane_state->uapi.visible)
   4304   1.1  riastrad 		return 0;
   4305   1.1  riastrad 
   4306   1.1  riastrad 	ret = intel_plane_check_src_coordinates(plane_state);
   4307   1.1  riastrad 	if (ret)
   4308   1.1  riastrad 		return ret;
   4309   1.1  riastrad 
   4310   1.1  riastrad 	plane_state->ctl = i9xx_plane_ctl(crtc_state, plane_state);
   4311   1.1  riastrad 
   4312   1.1  riastrad 	return 0;
   4313   1.1  riastrad }
   4314   1.1  riastrad 
   4315   1.1  riastrad static void i9xx_update_plane(struct intel_plane *plane,
   4316   1.1  riastrad 			      const struct intel_crtc_state *crtc_state,
   4317   1.1  riastrad 			      const struct intel_plane_state *plane_state)
   4318   1.1  riastrad {
   4319   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   4320   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   4321   1.1  riastrad 	u32 linear_offset;
   4322   1.1  riastrad 	int x = plane_state->color_plane[0].x;
   4323   1.1  riastrad 	int y = plane_state->color_plane[0].y;
   4324   1.1  riastrad 	int crtc_x = plane_state->uapi.dst.x1;
   4325   1.1  riastrad 	int crtc_y = plane_state->uapi.dst.y1;
   4326   1.1  riastrad 	int crtc_w = drm_rect_width(&plane_state->uapi.dst);
   4327   1.1  riastrad 	int crtc_h = drm_rect_height(&plane_state->uapi.dst);
   4328   1.1  riastrad 	unsigned long irqflags;
   4329   1.1  riastrad 	u32 dspaddr_offset;
   4330   1.1  riastrad 	u32 dspcntr;
   4331   1.1  riastrad 
   4332   1.1  riastrad 	dspcntr = plane_state->ctl | i9xx_plane_ctl_crtc(crtc_state);
   4333   1.1  riastrad 
   4334   1.1  riastrad 	linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
   4335   1.1  riastrad 
   4336   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   4337   1.1  riastrad 		dspaddr_offset = plane_state->color_plane[0].offset;
   4338   1.1  riastrad 	else
   4339   1.1  riastrad 		dspaddr_offset = linear_offset;
   4340   1.1  riastrad 
   4341   1.1  riastrad 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   4342   1.1  riastrad 
   4343   1.1  riastrad 	I915_WRITE_FW(DSPSTRIDE(i9xx_plane), plane_state->color_plane[0].stride);
   4344   1.1  riastrad 
   4345   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4) {
   4346   1.1  riastrad 		/*
   4347   1.1  riastrad 		 * PLANE_A doesn't actually have a full window
   4348   1.1  riastrad 		 * generator but let's assume we still need to
   4349   1.1  riastrad 		 * program whatever is there.
   4350   1.1  riastrad 		 */
   4351   1.1  riastrad 		I915_WRITE_FW(DSPPOS(i9xx_plane), (crtc_y << 16) | crtc_x);
   4352   1.1  riastrad 		I915_WRITE_FW(DSPSIZE(i9xx_plane),
   4353   1.1  riastrad 			      ((crtc_h - 1) << 16) | (crtc_w - 1));
   4354   1.1  riastrad 	} else if (IS_CHERRYVIEW(dev_priv) && i9xx_plane == PLANE_B) {
   4355   1.1  riastrad 		I915_WRITE_FW(PRIMPOS(i9xx_plane), (crtc_y << 16) | crtc_x);
   4356   1.1  riastrad 		I915_WRITE_FW(PRIMSIZE(i9xx_plane),
   4357   1.1  riastrad 			      ((crtc_h - 1) << 16) | (crtc_w - 1));
   4358   1.1  riastrad 		I915_WRITE_FW(PRIMCNSTALPHA(i9xx_plane), 0);
   4359   1.1  riastrad 	}
   4360   1.1  riastrad 
   4361   1.1  riastrad 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
   4362   1.1  riastrad 		I915_WRITE_FW(DSPOFFSET(i9xx_plane), (y << 16) | x);
   4363   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 4) {
   4364   1.1  riastrad 		I915_WRITE_FW(DSPLINOFF(i9xx_plane), linear_offset);
   4365   1.1  riastrad 		I915_WRITE_FW(DSPTILEOFF(i9xx_plane), (y << 16) | x);
   4366   1.1  riastrad 	}
   4367   1.1  riastrad 
   4368   1.1  riastrad 	/*
   4369   1.1  riastrad 	 * The control register self-arms if the plane was previously
   4370   1.1  riastrad 	 * disabled. Try to make the plane enable atomic by writing
   4371   1.1  riastrad 	 * the control register just before the surface register.
   4372   1.1  riastrad 	 */
   4373   1.1  riastrad 	I915_WRITE_FW(DSPCNTR(i9xx_plane), dspcntr);
   4374   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   4375   1.1  riastrad 		I915_WRITE_FW(DSPSURF(i9xx_plane),
   4376   1.1  riastrad 			      intel_plane_ggtt_offset(plane_state) +
   4377   1.1  riastrad 			      dspaddr_offset);
   4378   1.1  riastrad 	else
   4379   1.1  riastrad 		I915_WRITE_FW(DSPADDR(i9xx_plane),
   4380   1.1  riastrad 			      intel_plane_ggtt_offset(plane_state) +
   4381   1.1  riastrad 			      dspaddr_offset);
   4382   1.1  riastrad 
   4383   1.1  riastrad 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   4384   1.1  riastrad }
   4385   1.1  riastrad 
   4386   1.1  riastrad static void i9xx_disable_plane(struct intel_plane *plane,
   4387   1.1  riastrad 			       const struct intel_crtc_state *crtc_state)
   4388   1.1  riastrad {
   4389   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   4390   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   4391   1.1  riastrad 	unsigned long irqflags;
   4392   1.1  riastrad 	u32 dspcntr;
   4393   1.1  riastrad 
   4394   1.1  riastrad 	/*
   4395   1.1  riastrad 	 * DSPCNTR pipe gamma enable on g4x+ and pipe csc
   4396   1.1  riastrad 	 * enable on ilk+ affect the pipe bottom color as
   4397   1.1  riastrad 	 * well, so we must configure them even if the plane
   4398   1.1  riastrad 	 * is disabled.
   4399   1.1  riastrad 	 *
   4400   1.1  riastrad 	 * On pre-g4x there is no way to gamma correct the
   4401   1.1  riastrad 	 * pipe bottom color but we'll keep on doing this
   4402   1.1  riastrad 	 * anyway so that the crtc state readout works correctly.
   4403   1.1  riastrad 	 */
   4404   1.1  riastrad 	dspcntr = i9xx_plane_ctl_crtc(crtc_state);
   4405   1.1  riastrad 
   4406   1.1  riastrad 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   4407   1.1  riastrad 
   4408   1.1  riastrad 	I915_WRITE_FW(DSPCNTR(i9xx_plane), dspcntr);
   4409   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   4410   1.1  riastrad 		I915_WRITE_FW(DSPSURF(i9xx_plane), 0);
   4411   1.1  riastrad 	else
   4412   1.1  riastrad 		I915_WRITE_FW(DSPADDR(i9xx_plane), 0);
   4413   1.1  riastrad 
   4414   1.1  riastrad 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   4415   1.1  riastrad }
   4416   1.1  riastrad 
   4417   1.1  riastrad static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
   4418   1.1  riastrad 				    enum pipe *pipe)
   4419   1.1  riastrad {
   4420   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   4421   1.1  riastrad 	enum intel_display_power_domain power_domain;
   4422   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   4423   1.1  riastrad 	intel_wakeref_t wakeref;
   4424   1.1  riastrad 	bool ret;
   4425   1.1  riastrad 	u32 val;
   4426   1.1  riastrad 
   4427   1.1  riastrad 	/*
   4428   1.1  riastrad 	 * Not 100% correct for planes that can move between pipes,
   4429   1.1  riastrad 	 * but that's only the case for gen2-4 which don't have any
   4430   1.1  riastrad 	 * display power wells.
   4431   1.1  riastrad 	 */
   4432   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(plane->pipe);
   4433   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   4434   1.1  riastrad 	if (!wakeref)
   4435   1.1  riastrad 		return false;
   4436   1.1  riastrad 
   4437   1.1  riastrad 	val = I915_READ(DSPCNTR(i9xx_plane));
   4438   1.1  riastrad 
   4439   1.1  riastrad 	ret = val & DISPLAY_PLANE_ENABLE;
   4440   1.1  riastrad 
   4441   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5)
   4442   1.1  riastrad 		*pipe = plane->pipe;
   4443   1.1  riastrad 	else
   4444   1.1  riastrad 		*pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
   4445   1.1  riastrad 			DISPPLANE_SEL_PIPE_SHIFT;
   4446   1.1  riastrad 
   4447   1.1  riastrad 	intel_display_power_put(dev_priv, power_domain, wakeref);
   4448   1.1  riastrad 
   4449   1.1  riastrad 	return ret;
   4450   1.1  riastrad }
   4451   1.1  riastrad 
   4452   1.1  riastrad static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
   4453   1.1  riastrad {
   4454   1.1  riastrad 	struct drm_device *dev = intel_crtc->base.dev;
   4455   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   4456   1.1  riastrad 
   4457   1.1  riastrad 	I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, id), 0);
   4458   1.1  riastrad 	I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, id), 0);
   4459   1.1  riastrad 	I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, id), 0);
   4460   1.1  riastrad }
   4461   1.1  riastrad 
   4462   1.1  riastrad /*
   4463   1.1  riastrad  * This function detaches (aka. unbinds) unused scalers in hardware
   4464   1.1  riastrad  */
   4465   1.1  riastrad static void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
   4466   1.1  riastrad {
   4467   1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
   4468   1.1  riastrad 	const struct intel_crtc_scaler_state *scaler_state =
   4469   1.1  riastrad 		&crtc_state->scaler_state;
   4470   1.1  riastrad 	int i;
   4471   1.1  riastrad 
   4472   1.1  riastrad 	/* loop through and disable scalers that aren't in use */
   4473   1.1  riastrad 	for (i = 0; i < intel_crtc->num_scalers; i++) {
   4474   1.1  riastrad 		if (!scaler_state->scalers[i].in_use)
   4475   1.1  riastrad 			skl_detach_scaler(intel_crtc, i);
   4476   1.1  riastrad 	}
   4477   1.1  riastrad }
   4478   1.1  riastrad 
   4479   1.1  riastrad static unsigned int skl_plane_stride_mult(const struct drm_framebuffer *fb,
   4480   1.1  riastrad 					  int color_plane, unsigned int rotation)
   4481   1.1  riastrad {
   4482   1.1  riastrad 	/*
   4483   1.1  riastrad 	 * The stride is either expressed as a multiple of 64 bytes chunks for
   4484   1.1  riastrad 	 * linear buffers or in number of tiles for tiled buffers.
   4485   1.1  riastrad 	 */
   4486   1.1  riastrad 	if (is_surface_linear(fb, color_plane))
   4487   1.1  riastrad 		return 64;
   4488   1.1  riastrad 	else if (drm_rotation_90_or_270(rotation))
   4489   1.1  riastrad 		return intel_tile_height(fb, color_plane);
   4490   1.1  riastrad 	else
   4491   1.1  riastrad 		return intel_tile_width_bytes(fb, color_plane);
   4492   1.1  riastrad }
   4493   1.1  riastrad 
   4494   1.1  riastrad u32 skl_plane_stride(const struct intel_plane_state *plane_state,
   4495   1.1  riastrad 		     int color_plane)
   4496   1.1  riastrad {
   4497   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4498   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   4499   1.1  riastrad 	u32 stride = plane_state->color_plane[color_plane].stride;
   4500   1.1  riastrad 
   4501   1.1  riastrad 	if (color_plane >= fb->format->num_planes)
   4502   1.1  riastrad 		return 0;
   4503   1.1  riastrad 
   4504   1.1  riastrad 	return stride / skl_plane_stride_mult(fb, color_plane, rotation);
   4505   1.1  riastrad }
   4506   1.1  riastrad 
   4507   1.1  riastrad static u32 skl_plane_ctl_format(u32 pixel_format)
   4508   1.1  riastrad {
   4509   1.1  riastrad 	switch (pixel_format) {
   4510   1.1  riastrad 	case DRM_FORMAT_C8:
   4511   1.1  riastrad 		return PLANE_CTL_FORMAT_INDEXED;
   4512   1.1  riastrad 	case DRM_FORMAT_RGB565:
   4513   1.1  riastrad 		return PLANE_CTL_FORMAT_RGB_565;
   4514   1.1  riastrad 	case DRM_FORMAT_XBGR8888:
   4515   1.1  riastrad 	case DRM_FORMAT_ABGR8888:
   4516   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX;
   4517   1.1  riastrad 	case DRM_FORMAT_XRGB8888:
   4518   1.1  riastrad 	case DRM_FORMAT_ARGB8888:
   4519   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_8888;
   4520   1.1  riastrad 	case DRM_FORMAT_XBGR2101010:
   4521   1.1  riastrad 	case DRM_FORMAT_ABGR2101010:
   4522   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_2101010 | PLANE_CTL_ORDER_RGBX;
   4523   1.1  riastrad 	case DRM_FORMAT_XRGB2101010:
   4524   1.1  riastrad 	case DRM_FORMAT_ARGB2101010:
   4525   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_2101010;
   4526   1.1  riastrad 	case DRM_FORMAT_XBGR16161616F:
   4527   1.1  riastrad 	case DRM_FORMAT_ABGR16161616F:
   4528   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_16161616F | PLANE_CTL_ORDER_RGBX;
   4529   1.1  riastrad 	case DRM_FORMAT_XRGB16161616F:
   4530   1.1  riastrad 	case DRM_FORMAT_ARGB16161616F:
   4531   1.1  riastrad 		return PLANE_CTL_FORMAT_XRGB_16161616F;
   4532   1.1  riastrad 	case DRM_FORMAT_YUYV:
   4533   1.1  riastrad 		return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YUYV;
   4534   1.1  riastrad 	case DRM_FORMAT_YVYU:
   4535   1.1  riastrad 		return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YVYU;
   4536   1.1  riastrad 	case DRM_FORMAT_UYVY:
   4537   1.1  riastrad 		return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_UYVY;
   4538   1.1  riastrad 	case DRM_FORMAT_VYUY:
   4539   1.1  riastrad 		return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_VYUY;
   4540   1.1  riastrad 	case DRM_FORMAT_NV12:
   4541   1.1  riastrad 		return PLANE_CTL_FORMAT_NV12;
   4542   1.1  riastrad 	case DRM_FORMAT_P010:
   4543   1.1  riastrad 		return PLANE_CTL_FORMAT_P010;
   4544   1.1  riastrad 	case DRM_FORMAT_P012:
   4545   1.1  riastrad 		return PLANE_CTL_FORMAT_P012;
   4546   1.1  riastrad 	case DRM_FORMAT_P016:
   4547   1.1  riastrad 		return PLANE_CTL_FORMAT_P016;
   4548   1.1  riastrad 	case DRM_FORMAT_Y210:
   4549   1.1  riastrad 		return PLANE_CTL_FORMAT_Y210;
   4550   1.1  riastrad 	case DRM_FORMAT_Y212:
   4551   1.1  riastrad 		return PLANE_CTL_FORMAT_Y212;
   4552   1.1  riastrad 	case DRM_FORMAT_Y216:
   4553   1.1  riastrad 		return PLANE_CTL_FORMAT_Y216;
   4554   1.1  riastrad 	case DRM_FORMAT_XVYU2101010:
   4555   1.1  riastrad 		return PLANE_CTL_FORMAT_Y410;
   4556   1.1  riastrad 	case DRM_FORMAT_XVYU12_16161616:
   4557   1.1  riastrad 		return PLANE_CTL_FORMAT_Y412;
   4558   1.1  riastrad 	case DRM_FORMAT_XVYU16161616:
   4559   1.1  riastrad 		return PLANE_CTL_FORMAT_Y416;
   4560   1.1  riastrad 	default:
   4561   1.1  riastrad 		MISSING_CASE(pixel_format);
   4562   1.1  riastrad 	}
   4563   1.1  riastrad 
   4564   1.1  riastrad 	return 0;
   4565   1.1  riastrad }
   4566   1.1  riastrad 
   4567   1.1  riastrad static u32 skl_plane_ctl_alpha(const struct intel_plane_state *plane_state)
   4568   1.1  riastrad {
   4569   1.1  riastrad 	if (!plane_state->hw.fb->format->has_alpha)
   4570   1.1  riastrad 		return PLANE_CTL_ALPHA_DISABLE;
   4571   1.1  riastrad 
   4572   1.1  riastrad 	switch (plane_state->hw.pixel_blend_mode) {
   4573   1.1  riastrad 	case DRM_MODE_BLEND_PIXEL_NONE:
   4574   1.1  riastrad 		return PLANE_CTL_ALPHA_DISABLE;
   4575   1.1  riastrad 	case DRM_MODE_BLEND_PREMULTI:
   4576   1.1  riastrad 		return PLANE_CTL_ALPHA_SW_PREMULTIPLY;
   4577   1.1  riastrad 	case DRM_MODE_BLEND_COVERAGE:
   4578   1.1  riastrad 		return PLANE_CTL_ALPHA_HW_PREMULTIPLY;
   4579   1.1  riastrad 	default:
   4580   1.1  riastrad 		MISSING_CASE(plane_state->hw.pixel_blend_mode);
   4581   1.1  riastrad 		return PLANE_CTL_ALPHA_DISABLE;
   4582   1.1  riastrad 	}
   4583   1.1  riastrad }
   4584   1.1  riastrad 
   4585   1.1  riastrad static u32 glk_plane_color_ctl_alpha(const struct intel_plane_state *plane_state)
   4586   1.1  riastrad {
   4587   1.1  riastrad 	if (!plane_state->hw.fb->format->has_alpha)
   4588   1.1  riastrad 		return PLANE_COLOR_ALPHA_DISABLE;
   4589   1.1  riastrad 
   4590   1.1  riastrad 	switch (plane_state->hw.pixel_blend_mode) {
   4591   1.1  riastrad 	case DRM_MODE_BLEND_PIXEL_NONE:
   4592   1.1  riastrad 		return PLANE_COLOR_ALPHA_DISABLE;
   4593   1.1  riastrad 	case DRM_MODE_BLEND_PREMULTI:
   4594   1.1  riastrad 		return PLANE_COLOR_ALPHA_SW_PREMULTIPLY;
   4595   1.1  riastrad 	case DRM_MODE_BLEND_COVERAGE:
   4596   1.1  riastrad 		return PLANE_COLOR_ALPHA_HW_PREMULTIPLY;
   4597   1.1  riastrad 	default:
   4598   1.1  riastrad 		MISSING_CASE(plane_state->hw.pixel_blend_mode);
   4599   1.1  riastrad 		return PLANE_COLOR_ALPHA_DISABLE;
   4600   1.1  riastrad 	}
   4601   1.1  riastrad }
   4602   1.1  riastrad 
   4603   1.1  riastrad static u32 skl_plane_ctl_tiling(u64 fb_modifier)
   4604   1.1  riastrad {
   4605   1.1  riastrad 	switch (fb_modifier) {
   4606   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   4607   1.1  riastrad 		break;
   4608   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   4609   1.1  riastrad 		return PLANE_CTL_TILED_X;
   4610   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED:
   4611   1.1  riastrad 		return PLANE_CTL_TILED_Y;
   4612   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_CCS:
   4613   1.1  riastrad 		return PLANE_CTL_TILED_Y | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
   4614   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
   4615   1.1  riastrad 		return PLANE_CTL_TILED_Y |
   4616   1.1  riastrad 		       PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
   4617   1.1  riastrad 		       PLANE_CTL_CLEAR_COLOR_DISABLE;
   4618   1.1  riastrad 	case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
   4619   1.1  riastrad 		return PLANE_CTL_TILED_Y | PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE;
   4620   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED:
   4621   1.1  riastrad 		return PLANE_CTL_TILED_YF;
   4622   1.1  riastrad 	case I915_FORMAT_MOD_Yf_TILED_CCS:
   4623   1.1  riastrad 		return PLANE_CTL_TILED_YF | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
   4624   1.1  riastrad 	default:
   4625   1.1  riastrad 		MISSING_CASE(fb_modifier);
   4626   1.1  riastrad 	}
   4627   1.1  riastrad 
   4628   1.1  riastrad 	return 0;
   4629   1.1  riastrad }
   4630   1.1  riastrad 
   4631   1.1  riastrad static u32 skl_plane_ctl_rotate(unsigned int rotate)
   4632   1.1  riastrad {
   4633   1.1  riastrad 	switch (rotate) {
   4634   1.1  riastrad 	case DRM_MODE_ROTATE_0:
   4635   1.1  riastrad 		break;
   4636   1.1  riastrad 	/*
   4637   1.1  riastrad 	 * DRM_MODE_ROTATE_ is counter clockwise to stay compatible with Xrandr
   4638   1.1  riastrad 	 * while i915 HW rotation is clockwise, thats why this swapping.
   4639   1.1  riastrad 	 */
   4640   1.1  riastrad 	case DRM_MODE_ROTATE_90:
   4641   1.1  riastrad 		return PLANE_CTL_ROTATE_270;
   4642   1.1  riastrad 	case DRM_MODE_ROTATE_180:
   4643   1.1  riastrad 		return PLANE_CTL_ROTATE_180;
   4644   1.1  riastrad 	case DRM_MODE_ROTATE_270:
   4645   1.1  riastrad 		return PLANE_CTL_ROTATE_90;
   4646   1.1  riastrad 	default:
   4647   1.1  riastrad 		MISSING_CASE(rotate);
   4648   1.1  riastrad 	}
   4649   1.1  riastrad 
   4650   1.1  riastrad 	return 0;
   4651   1.1  riastrad }
   4652   1.1  riastrad 
   4653   1.1  riastrad static u32 cnl_plane_ctl_flip(unsigned int reflect)
   4654   1.1  riastrad {
   4655   1.1  riastrad 	switch (reflect) {
   4656   1.1  riastrad 	case 0:
   4657   1.1  riastrad 		break;
   4658   1.1  riastrad 	case DRM_MODE_REFLECT_X:
   4659   1.1  riastrad 		return PLANE_CTL_FLIP_HORIZONTAL;
   4660   1.1  riastrad 	case DRM_MODE_REFLECT_Y:
   4661   1.1  riastrad 	default:
   4662   1.1  riastrad 		MISSING_CASE(reflect);
   4663   1.1  riastrad 	}
   4664   1.1  riastrad 
   4665   1.1  riastrad 	return 0;
   4666   1.1  riastrad }
   4667   1.1  riastrad 
   4668   1.1  riastrad u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
   4669   1.1  riastrad {
   4670   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   4671   1.1  riastrad 	u32 plane_ctl = 0;
   4672   1.1  riastrad 
   4673   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   4674   1.1  riastrad 		return plane_ctl;
   4675   1.1  riastrad 
   4676   1.1  riastrad 	if (crtc_state->gamma_enable)
   4677   1.1  riastrad 		plane_ctl |= PLANE_CTL_PIPE_GAMMA_ENABLE;
   4678   1.1  riastrad 
   4679   1.1  riastrad 	if (crtc_state->csc_enable)
   4680   1.1  riastrad 		plane_ctl |= PLANE_CTL_PIPE_CSC_ENABLE;
   4681   1.1  riastrad 
   4682   1.1  riastrad 	return plane_ctl;
   4683   1.1  riastrad }
   4684   1.1  riastrad 
   4685   1.1  riastrad u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
   4686   1.1  riastrad 		  const struct intel_plane_state *plane_state)
   4687   1.1  riastrad {
   4688   1.1  riastrad 	struct drm_i915_private *dev_priv =
   4689   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   4690   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4691   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   4692   1.1  riastrad 	const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
   4693   1.1  riastrad 	u32 plane_ctl;
   4694   1.1  riastrad 
   4695   1.1  riastrad 	plane_ctl = PLANE_CTL_ENABLE;
   4696   1.1  riastrad 
   4697   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) {
   4698   1.1  riastrad 		plane_ctl |= skl_plane_ctl_alpha(plane_state);
   4699   1.1  riastrad 		plane_ctl |= PLANE_CTL_PLANE_GAMMA_DISABLE;
   4700   1.1  riastrad 
   4701   1.1  riastrad 		if (plane_state->hw.color_encoding == DRM_COLOR_YCBCR_BT709)
   4702   1.1  riastrad 			plane_ctl |= PLANE_CTL_YUV_TO_RGB_CSC_FORMAT_BT709;
   4703   1.1  riastrad 
   4704   1.1  riastrad 		if (plane_state->hw.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
   4705   1.1  riastrad 			plane_ctl |= PLANE_CTL_YUV_RANGE_CORRECTION_DISABLE;
   4706   1.1  riastrad 	}
   4707   1.1  riastrad 
   4708   1.1  riastrad 	plane_ctl |= skl_plane_ctl_format(fb->format->format);
   4709   1.1  riastrad 	plane_ctl |= skl_plane_ctl_tiling(fb->modifier);
   4710   1.1  riastrad 	plane_ctl |= skl_plane_ctl_rotate(rotation & DRM_MODE_ROTATE_MASK);
   4711   1.1  riastrad 
   4712   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10)
   4713   1.1  riastrad 		plane_ctl |= cnl_plane_ctl_flip(rotation &
   4714   1.1  riastrad 						DRM_MODE_REFLECT_MASK);
   4715   1.1  riastrad 
   4716   1.1  riastrad 	if (key->flags & I915_SET_COLORKEY_DESTINATION)
   4717   1.1  riastrad 		plane_ctl |= PLANE_CTL_KEY_ENABLE_DESTINATION;
   4718   1.1  riastrad 	else if (key->flags & I915_SET_COLORKEY_SOURCE)
   4719   1.1  riastrad 		plane_ctl |= PLANE_CTL_KEY_ENABLE_SOURCE;
   4720   1.1  riastrad 
   4721   1.1  riastrad 	return plane_ctl;
   4722   1.1  riastrad }
   4723   1.1  riastrad 
   4724   1.1  riastrad u32 glk_plane_color_ctl_crtc(const struct intel_crtc_state *crtc_state)
   4725   1.1  riastrad {
   4726   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   4727   1.1  riastrad 	u32 plane_color_ctl = 0;
   4728   1.1  riastrad 
   4729   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   4730   1.1  riastrad 		return plane_color_ctl;
   4731   1.1  riastrad 
   4732   1.1  riastrad 	if (crtc_state->gamma_enable)
   4733   1.1  riastrad 		plane_color_ctl |= PLANE_COLOR_PIPE_GAMMA_ENABLE;
   4734   1.1  riastrad 
   4735   1.1  riastrad 	if (crtc_state->csc_enable)
   4736   1.1  riastrad 		plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
   4737   1.1  riastrad 
   4738   1.1  riastrad 	return plane_color_ctl;
   4739   1.1  riastrad }
   4740   1.1  riastrad 
   4741   1.1  riastrad u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
   4742   1.1  riastrad 			const struct intel_plane_state *plane_state)
   4743   1.1  riastrad {
   4744   1.1  riastrad 	struct drm_i915_private *dev_priv =
   4745   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   4746   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   4747   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   4748   1.1  riastrad 	u32 plane_color_ctl = 0;
   4749   1.1  riastrad 
   4750   1.1  riastrad 	plane_color_ctl |= PLANE_COLOR_PLANE_GAMMA_DISABLE;
   4751   1.1  riastrad 	plane_color_ctl |= glk_plane_color_ctl_alpha(plane_state);
   4752   1.1  riastrad 
   4753   1.1  riastrad 	if (fb->format->is_yuv && !icl_is_hdr_plane(dev_priv, plane->id)) {
   4754   1.1  riastrad 		if (plane_state->hw.color_encoding == DRM_COLOR_YCBCR_BT709)
   4755   1.1  riastrad 			plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
   4756   1.1  riastrad 		else
   4757   1.1  riastrad 			plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV601_TO_RGB709;
   4758   1.1  riastrad 
   4759   1.1  riastrad 		if (plane_state->hw.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
   4760   1.1  riastrad 			plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
   4761   1.1  riastrad 	} else if (fb->format->is_yuv) {
   4762   1.1  riastrad 		plane_color_ctl |= PLANE_COLOR_INPUT_CSC_ENABLE;
   4763   1.1  riastrad 	}
   4764   1.1  riastrad 
   4765   1.1  riastrad 	return plane_color_ctl;
   4766   1.1  riastrad }
   4767   1.1  riastrad 
   4768   1.1  riastrad static int
   4769   1.1  riastrad __intel_display_resume(struct drm_device *dev,
   4770   1.1  riastrad 		       struct drm_atomic_state *state,
   4771   1.1  riastrad 		       struct drm_modeset_acquire_ctx *ctx)
   4772   1.1  riastrad {
   4773   1.1  riastrad 	struct drm_crtc_state *crtc_state;
   4774   1.1  riastrad 	struct drm_crtc *crtc;
   4775   1.1  riastrad 	int i, ret;
   4776   1.1  riastrad 
   4777   1.1  riastrad 	intel_modeset_setup_hw_state(dev, ctx);
   4778   1.1  riastrad 	intel_vga_redisable(to_i915(dev));
   4779   1.1  riastrad 
   4780   1.1  riastrad 	if (!state)
   4781   1.1  riastrad 		return 0;
   4782   1.1  riastrad 
   4783   1.1  riastrad 	/*
   4784   1.1  riastrad 	 * We've duplicated the state, pointers to the old state are invalid.
   4785   1.1  riastrad 	 *
   4786   1.1  riastrad 	 * Don't attempt to use the old state until we commit the duplicated state.
   4787   1.1  riastrad 	 */
   4788   1.1  riastrad 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
   4789   1.1  riastrad 		/*
   4790   1.1  riastrad 		 * Force recalculation even if we restore
   4791   1.1  riastrad 		 * current state. With fast modeset this may not result
   4792   1.1  riastrad 		 * in a modeset when the state is compatible.
   4793   1.1  riastrad 		 */
   4794   1.1  riastrad 		crtc_state->mode_changed = true;
   4795   1.1  riastrad 	}
   4796   1.1  riastrad 
   4797   1.1  riastrad 	/* ignore any reset values/BIOS leftovers in the WM registers */
   4798   1.1  riastrad 	if (!HAS_GMCH(to_i915(dev)))
   4799   1.1  riastrad 		to_intel_atomic_state(state)->skip_intermediate_wm = true;
   4800   1.1  riastrad 
   4801   1.1  riastrad 	ret = drm_atomic_helper_commit_duplicated_state(state, ctx);
   4802   1.1  riastrad 
   4803   1.1  riastrad 	WARN_ON(ret == -EDEADLK);
   4804   1.1  riastrad 	return ret;
   4805   1.1  riastrad }
   4806   1.1  riastrad 
   4807   1.1  riastrad static bool gpu_reset_clobbers_display(struct drm_i915_private *dev_priv)
   4808   1.1  riastrad {
   4809   1.1  riastrad 	return (INTEL_INFO(dev_priv)->gpu_reset_clobbers_display &&
   4810   1.1  riastrad 		intel_has_gpu_reset(&dev_priv->gt));
   4811   1.1  riastrad }
   4812   1.1  riastrad 
   4813   1.1  riastrad void intel_prepare_reset(struct drm_i915_private *dev_priv)
   4814   1.1  riastrad {
   4815   1.1  riastrad 	struct drm_device *dev = &dev_priv->drm;
   4816   1.1  riastrad 	struct drm_modeset_acquire_ctx *ctx = &dev_priv->reset_ctx;
   4817   1.1  riastrad 	struct drm_atomic_state *state;
   4818   1.1  riastrad 	int ret;
   4819   1.1  riastrad 
   4820   1.1  riastrad 	/* reset doesn't touch the display */
   4821   1.1  riastrad 	if (!i915_modparams.force_reset_modeset_test &&
   4822   1.1  riastrad 	    !gpu_reset_clobbers_display(dev_priv))
   4823   1.1  riastrad 		return;
   4824   1.1  riastrad 
   4825   1.1  riastrad 	/* We have a modeset vs reset deadlock, defensively unbreak it. */
   4826   1.5  riastrad 	spin_lock(&dev_priv->atomic_commit_lock);
   4827   1.1  riastrad 	set_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags);
   4828   1.5  riastrad 	DRM_SPIN_WAKEUP_ALL(&dev_priv->atomic_commit_wq,
   4829   1.5  riastrad 	    &dev_priv->atomic_commit_lock);
   4830   1.5  riastrad 	spin_unlock(&dev_priv->atomic_commit_lock);
   4831   1.1  riastrad 
   4832   1.1  riastrad 	if (atomic_read(&dev_priv->gpu_error.pending_fb_pin)) {
   4833   1.1  riastrad 		DRM_DEBUG_KMS("Modeset potentially stuck, unbreaking through wedging\n");
   4834   1.1  riastrad 		intel_gt_set_wedged(&dev_priv->gt);
   4835   1.1  riastrad 	}
   4836   1.1  riastrad 
   4837   1.1  riastrad 	/*
   4838   1.1  riastrad 	 * Need mode_config.mutex so that we don't
   4839   1.1  riastrad 	 * trample ongoing ->detect() and whatnot.
   4840   1.1  riastrad 	 */
   4841   1.1  riastrad 	mutex_lock(&dev->mode_config.mutex);
   4842   1.1  riastrad 	drm_modeset_acquire_init(ctx, 0);
   4843   1.1  riastrad 	while (1) {
   4844   1.1  riastrad 		ret = drm_modeset_lock_all_ctx(dev, ctx);
   4845   1.1  riastrad 		if (ret != -EDEADLK)
   4846   1.1  riastrad 			break;
   4847   1.1  riastrad 
   4848   1.1  riastrad 		drm_modeset_backoff(ctx);
   4849   1.1  riastrad 	}
   4850   1.1  riastrad 	/*
   4851   1.1  riastrad 	 * Disabling the crtcs gracefully seems nicer. Also the
   4852   1.1  riastrad 	 * g33 docs say we should at least disable all the planes.
   4853   1.1  riastrad 	 */
   4854   1.1  riastrad 	state = drm_atomic_helper_duplicate_state(dev, ctx);
   4855   1.1  riastrad 	if (IS_ERR(state)) {
   4856   1.1  riastrad 		ret = PTR_ERR(state);
   4857   1.1  riastrad 		DRM_ERROR("Duplicating state failed with %i\n", ret);
   4858   1.1  riastrad 		return;
   4859   1.1  riastrad 	}
   4860   1.1  riastrad 
   4861   1.1  riastrad 	ret = drm_atomic_helper_disable_all(dev, ctx);
   4862   1.1  riastrad 	if (ret) {
   4863   1.1  riastrad 		DRM_ERROR("Suspending crtc's failed with %i\n", ret);
   4864   1.1  riastrad 		drm_atomic_state_put(state);
   4865   1.1  riastrad 		return;
   4866   1.1  riastrad 	}
   4867   1.1  riastrad 
   4868   1.1  riastrad 	dev_priv->modeset_restore_state = state;
   4869   1.1  riastrad 	state->acquire_ctx = ctx;
   4870   1.1  riastrad }
   4871   1.1  riastrad 
   4872   1.1  riastrad void intel_finish_reset(struct drm_i915_private *dev_priv)
   4873   1.1  riastrad {
   4874   1.1  riastrad 	struct drm_device *dev = &dev_priv->drm;
   4875   1.1  riastrad 	struct drm_modeset_acquire_ctx *ctx = &dev_priv->reset_ctx;
   4876   1.1  riastrad 	struct drm_atomic_state *state;
   4877   1.1  riastrad 	int ret;
   4878   1.1  riastrad 
   4879   1.1  riastrad 	/* reset doesn't touch the display */
   4880   1.1  riastrad 	if (!test_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags))
   4881   1.1  riastrad 		return;
   4882   1.1  riastrad 
   4883   1.1  riastrad 	state = fetch_and_zero(&dev_priv->modeset_restore_state);
   4884   1.1  riastrad 	if (!state)
   4885   1.1  riastrad 		goto unlock;
   4886   1.1  riastrad 
   4887   1.1  riastrad 	/* reset doesn't touch the display */
   4888   1.1  riastrad 	if (!gpu_reset_clobbers_display(dev_priv)) {
   4889   1.1  riastrad 		/* for testing only restore the display */
   4890   1.1  riastrad 		ret = __intel_display_resume(dev, state, ctx);
   4891   1.1  riastrad 		if (ret)
   4892   1.1  riastrad 			DRM_ERROR("Restoring old state failed with %i\n", ret);
   4893   1.1  riastrad 	} else {
   4894   1.1  riastrad 		/*
   4895   1.1  riastrad 		 * The display has been reset as well,
   4896   1.1  riastrad 		 * so need a full re-initialization.
   4897   1.1  riastrad 		 */
   4898   1.1  riastrad 		intel_pps_unlock_regs_wa(dev_priv);
   4899   1.1  riastrad 		intel_modeset_init_hw(dev_priv);
   4900   1.1  riastrad 		intel_init_clock_gating(dev_priv);
   4901   1.1  riastrad 
   4902   1.1  riastrad 		spin_lock_irq(&dev_priv->irq_lock);
   4903   1.1  riastrad 		if (dev_priv->display.hpd_irq_setup)
   4904   1.1  riastrad 			dev_priv->display.hpd_irq_setup(dev_priv);
   4905   1.1  riastrad 		spin_unlock_irq(&dev_priv->irq_lock);
   4906   1.1  riastrad 
   4907   1.1  riastrad 		ret = __intel_display_resume(dev, state, ctx);
   4908   1.1  riastrad 		if (ret)
   4909   1.1  riastrad 			DRM_ERROR("Restoring old state failed with %i\n", ret);
   4910   1.1  riastrad 
   4911   1.1  riastrad 		intel_hpd_init(dev_priv);
   4912   1.1  riastrad 	}
   4913   1.1  riastrad 
   4914   1.1  riastrad 	drm_atomic_state_put(state);
   4915   1.1  riastrad unlock:
   4916   1.1  riastrad 	drm_modeset_drop_locks(ctx);
   4917   1.1  riastrad 	drm_modeset_acquire_fini(ctx);
   4918   1.1  riastrad 	mutex_unlock(&dev->mode_config.mutex);
   4919   1.1  riastrad 
   4920   1.1  riastrad 	clear_bit_unlock(I915_RESET_MODESET, &dev_priv->gt.reset.flags);
   4921   1.1  riastrad }
   4922   1.1  riastrad 
   4923   1.1  riastrad static void icl_set_pipe_chicken(struct intel_crtc *crtc)
   4924   1.1  riastrad {
   4925   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   4926   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   4927   1.1  riastrad 	u32 tmp;
   4928   1.1  riastrad 
   4929   1.1  riastrad 	tmp = I915_READ(PIPE_CHICKEN(pipe));
   4930   1.1  riastrad 
   4931   1.1  riastrad 	/*
   4932   1.1  riastrad 	 * Display WA #1153: icl
   4933   1.1  riastrad 	 * enable hardware to bypass the alpha math
   4934   1.1  riastrad 	 * and rounding for per-pixel values 00 and 0xff
   4935   1.1  riastrad 	 */
   4936   1.1  riastrad 	tmp |= PER_PIXEL_ALPHA_BYPASS_EN;
   4937   1.1  riastrad 	/*
   4938   1.1  riastrad 	 * Display WA # 1605353570: icl
   4939   1.1  riastrad 	 * Set the pixel rounding bit to 1 for allowing
   4940   1.1  riastrad 	 * passthrough of Frame buffer pixels unmodified
   4941   1.1  riastrad 	 * across pipe
   4942   1.1  riastrad 	 */
   4943   1.1  riastrad 	tmp |= PIXEL_ROUNDING_TRUNC_FB_PASSTHRU;
   4944   1.1  riastrad 	I915_WRITE(PIPE_CHICKEN(pipe), tmp);
   4945   1.1  riastrad }
   4946   1.1  riastrad 
   4947   1.1  riastrad static void icl_enable_trans_port_sync(const struct intel_crtc_state *crtc_state)
   4948   1.1  riastrad {
   4949   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   4950   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   4951   1.1  riastrad 	u32 trans_ddi_func_ctl2_val;
   4952   1.1  riastrad 	u8 master_select;
   4953   1.1  riastrad 
   4954   1.1  riastrad 	/*
   4955   1.1  riastrad 	 * Configure the master select and enable Transcoder Port Sync for
   4956   1.1  riastrad 	 * Slave CRTCs transcoder.
   4957   1.1  riastrad 	 */
   4958   1.1  riastrad 	if (crtc_state->master_transcoder == INVALID_TRANSCODER)
   4959   1.1  riastrad 		return;
   4960   1.1  riastrad 
   4961   1.1  riastrad 	if (crtc_state->master_transcoder == TRANSCODER_EDP)
   4962   1.1  riastrad 		master_select = 0;
   4963   1.1  riastrad 	else
   4964   1.1  riastrad 		master_select = crtc_state->master_transcoder + 1;
   4965   1.1  riastrad 
   4966   1.1  riastrad 	/* Set the master select bits for Tranascoder Port Sync */
   4967   1.1  riastrad 	trans_ddi_func_ctl2_val = (PORT_SYNC_MODE_MASTER_SELECT(master_select) &
   4968   1.1  riastrad 				   PORT_SYNC_MODE_MASTER_SELECT_MASK) <<
   4969   1.1  riastrad 		PORT_SYNC_MODE_MASTER_SELECT_SHIFT;
   4970   1.1  riastrad 	/* Enable Transcoder Port Sync */
   4971   1.1  riastrad 	trans_ddi_func_ctl2_val |= PORT_SYNC_MODE_ENABLE;
   4972   1.1  riastrad 
   4973   1.1  riastrad 	I915_WRITE(TRANS_DDI_FUNC_CTL2(crtc_state->cpu_transcoder),
   4974   1.1  riastrad 		   trans_ddi_func_ctl2_val);
   4975   1.1  riastrad }
   4976   1.1  riastrad 
   4977   1.1  riastrad static void intel_fdi_normal_train(struct intel_crtc *crtc)
   4978   1.1  riastrad {
   4979   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   4980   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   4981   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   4982   1.1  riastrad 	i915_reg_t reg;
   4983   1.1  riastrad 	u32 temp;
   4984   1.1  riastrad 
   4985   1.1  riastrad 	/* enable normal train */
   4986   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   4987   1.1  riastrad 	temp = I915_READ(reg);
   4988   1.1  riastrad 	if (IS_IVYBRIDGE(dev_priv)) {
   4989   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE_IVB;
   4990   1.1  riastrad 		temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
   4991   1.1  riastrad 	} else {
   4992   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE;
   4993   1.1  riastrad 		temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
   4994   1.1  riastrad 	}
   4995   1.1  riastrad 	I915_WRITE(reg, temp);
   4996   1.1  riastrad 
   4997   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   4998   1.1  riastrad 	temp = I915_READ(reg);
   4999   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   5000   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5001   1.1  riastrad 		temp |= FDI_LINK_TRAIN_NORMAL_CPT;
   5002   1.1  riastrad 	} else {
   5003   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE;
   5004   1.1  riastrad 		temp |= FDI_LINK_TRAIN_NONE;
   5005   1.1  riastrad 	}
   5006   1.1  riastrad 	I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
   5007   1.1  riastrad 
   5008   1.1  riastrad 	/* wait one idle pattern time */
   5009   1.1  riastrad 	POSTING_READ(reg);
   5010   1.1  riastrad 	udelay(1000);
   5011   1.1  riastrad 
   5012   1.1  riastrad 	/* IVB wants error correction enabled */
   5013   1.1  riastrad 	if (IS_IVYBRIDGE(dev_priv))
   5014   1.1  riastrad 		I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE |
   5015   1.1  riastrad 			   FDI_FE_ERRC_ENABLE);
   5016   1.1  riastrad }
   5017   1.1  riastrad 
   5018   1.1  riastrad /* The FDI link training functions for ILK/Ibexpeak. */
   5019   1.1  riastrad static void ilk_fdi_link_train(struct intel_crtc *crtc,
   5020   1.1  riastrad 			       const struct intel_crtc_state *crtc_state)
   5021   1.1  riastrad {
   5022   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   5023   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   5024   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   5025   1.1  riastrad 	i915_reg_t reg;
   5026   1.1  riastrad 	u32 temp, tries;
   5027   1.1  riastrad 
   5028   1.1  riastrad 	/* FDI needs bits from pipe first */
   5029   1.1  riastrad 	assert_pipe_enabled(dev_priv, crtc_state->cpu_transcoder);
   5030   1.1  riastrad 
   5031   1.1  riastrad 	/* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
   5032   1.1  riastrad 	   for train result */
   5033   1.1  riastrad 	reg = FDI_RX_IMR(pipe);
   5034   1.1  riastrad 	temp = I915_READ(reg);
   5035   1.1  riastrad 	temp &= ~FDI_RX_SYMBOL_LOCK;
   5036   1.1  riastrad 	temp &= ~FDI_RX_BIT_LOCK;
   5037   1.1  riastrad 	I915_WRITE(reg, temp);
   5038   1.1  riastrad 	I915_READ(reg);
   5039   1.1  riastrad 	udelay(150);
   5040   1.1  riastrad 
   5041   1.1  riastrad 	/* enable CPU FDI TX and PCH FDI RX */
   5042   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5043   1.1  riastrad 	temp = I915_READ(reg);
   5044   1.1  riastrad 	temp &= ~FDI_DP_PORT_WIDTH_MASK;
   5045   1.1  riastrad 	temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
   5046   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5047   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_1;
   5048   1.1  riastrad 	I915_WRITE(reg, temp | FDI_TX_ENABLE);
   5049   1.1  riastrad 
   5050   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5051   1.1  riastrad 	temp = I915_READ(reg);
   5052   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5053   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_1;
   5054   1.1  riastrad 	I915_WRITE(reg, temp | FDI_RX_ENABLE);
   5055   1.1  riastrad 
   5056   1.1  riastrad 	POSTING_READ(reg);
   5057   1.1  riastrad 	udelay(150);
   5058   1.1  riastrad 
   5059   1.1  riastrad 	/* Ironlake workaround, enable clock pointer after FDI enable*/
   5060   1.1  riastrad 	I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
   5061   1.1  riastrad 	I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR |
   5062   1.1  riastrad 		   FDI_RX_PHASE_SYNC_POINTER_EN);
   5063   1.1  riastrad 
   5064   1.1  riastrad 	reg = FDI_RX_IIR(pipe);
   5065   1.1  riastrad 	for (tries = 0; tries < 5; tries++) {
   5066   1.1  riastrad 		temp = I915_READ(reg);
   5067   1.1  riastrad 		DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5068   1.1  riastrad 
   5069   1.1  riastrad 		if ((temp & FDI_RX_BIT_LOCK)) {
   5070   1.1  riastrad 			DRM_DEBUG_KMS("FDI train 1 done.\n");
   5071   1.1  riastrad 			I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
   5072   1.1  riastrad 			break;
   5073   1.1  riastrad 		}
   5074   1.1  riastrad 	}
   5075   1.1  riastrad 	if (tries == 5)
   5076   1.1  riastrad 		DRM_ERROR("FDI train 1 fail!\n");
   5077   1.1  riastrad 
   5078   1.1  riastrad 	/* Train 2 */
   5079   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5080   1.1  riastrad 	temp = I915_READ(reg);
   5081   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5082   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_2;
   5083   1.1  riastrad 	I915_WRITE(reg, temp);
   5084   1.1  riastrad 
   5085   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5086   1.1  riastrad 	temp = I915_READ(reg);
   5087   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5088   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_2;
   5089   1.1  riastrad 	I915_WRITE(reg, temp);
   5090   1.1  riastrad 
   5091   1.1  riastrad 	POSTING_READ(reg);
   5092   1.1  riastrad 	udelay(150);
   5093   1.1  riastrad 
   5094   1.1  riastrad 	reg = FDI_RX_IIR(pipe);
   5095   1.1  riastrad 	for (tries = 0; tries < 5; tries++) {
   5096   1.1  riastrad 		temp = I915_READ(reg);
   5097   1.1  riastrad 		DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5098   1.1  riastrad 
   5099   1.1  riastrad 		if (temp & FDI_RX_SYMBOL_LOCK) {
   5100   1.1  riastrad 			I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
   5101   1.1  riastrad 			DRM_DEBUG_KMS("FDI train 2 done.\n");
   5102   1.1  riastrad 			break;
   5103   1.1  riastrad 		}
   5104   1.1  riastrad 	}
   5105   1.1  riastrad 	if (tries == 5)
   5106   1.1  riastrad 		DRM_ERROR("FDI train 2 fail!\n");
   5107   1.1  riastrad 
   5108   1.1  riastrad 	DRM_DEBUG_KMS("FDI train done\n");
   5109   1.1  riastrad 
   5110   1.1  riastrad }
   5111   1.1  riastrad 
   5112   1.1  riastrad static const int snb_b_fdi_train_param[] = {
   5113   1.1  riastrad 	FDI_LINK_TRAIN_400MV_0DB_SNB_B,
   5114   1.1  riastrad 	FDI_LINK_TRAIN_400MV_6DB_SNB_B,
   5115   1.1  riastrad 	FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
   5116   1.1  riastrad 	FDI_LINK_TRAIN_800MV_0DB_SNB_B,
   5117   1.1  riastrad };
   5118   1.1  riastrad 
   5119   1.1  riastrad /* The FDI link training functions for SNB/Cougarpoint. */
   5120   1.1  riastrad static void gen6_fdi_link_train(struct intel_crtc *crtc,
   5121   1.1  riastrad 				const struct intel_crtc_state *crtc_state)
   5122   1.1  riastrad {
   5123   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   5124   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   5125   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   5126   1.1  riastrad 	i915_reg_t reg;
   5127   1.1  riastrad 	u32 temp, i, retry;
   5128   1.1  riastrad 
   5129   1.1  riastrad 	/* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
   5130   1.1  riastrad 	   for train result */
   5131   1.1  riastrad 	reg = FDI_RX_IMR(pipe);
   5132   1.1  riastrad 	temp = I915_READ(reg);
   5133   1.1  riastrad 	temp &= ~FDI_RX_SYMBOL_LOCK;
   5134   1.1  riastrad 	temp &= ~FDI_RX_BIT_LOCK;
   5135   1.1  riastrad 	I915_WRITE(reg, temp);
   5136   1.1  riastrad 
   5137   1.1  riastrad 	POSTING_READ(reg);
   5138   1.1  riastrad 	udelay(150);
   5139   1.1  riastrad 
   5140   1.1  riastrad 	/* enable CPU FDI TX and PCH FDI RX */
   5141   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5142   1.1  riastrad 	temp = I915_READ(reg);
   5143   1.1  riastrad 	temp &= ~FDI_DP_PORT_WIDTH_MASK;
   5144   1.1  riastrad 	temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
   5145   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5146   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_1;
   5147   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
   5148   1.1  riastrad 	/* SNB-B */
   5149   1.1  riastrad 	temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
   5150   1.1  riastrad 	I915_WRITE(reg, temp | FDI_TX_ENABLE);
   5151   1.1  riastrad 
   5152   1.1  riastrad 	I915_WRITE(FDI_RX_MISC(pipe),
   5153   1.1  riastrad 		   FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
   5154   1.1  riastrad 
   5155   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5156   1.1  riastrad 	temp = I915_READ(reg);
   5157   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   5158   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5159   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
   5160   1.1  riastrad 	} else {
   5161   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE;
   5162   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1;
   5163   1.1  riastrad 	}
   5164   1.1  riastrad 	I915_WRITE(reg, temp | FDI_RX_ENABLE);
   5165   1.1  riastrad 
   5166   1.1  riastrad 	POSTING_READ(reg);
   5167   1.1  riastrad 	udelay(150);
   5168   1.1  riastrad 
   5169   1.1  riastrad 	for (i = 0; i < 4; i++) {
   5170   1.1  riastrad 		reg = FDI_TX_CTL(pipe);
   5171   1.1  riastrad 		temp = I915_READ(reg);
   5172   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
   5173   1.1  riastrad 		temp |= snb_b_fdi_train_param[i];
   5174   1.1  riastrad 		I915_WRITE(reg, temp);
   5175   1.1  riastrad 
   5176   1.1  riastrad 		POSTING_READ(reg);
   5177   1.1  riastrad 		udelay(500);
   5178   1.1  riastrad 
   5179   1.1  riastrad 		for (retry = 0; retry < 5; retry++) {
   5180   1.1  riastrad 			reg = FDI_RX_IIR(pipe);
   5181   1.1  riastrad 			temp = I915_READ(reg);
   5182   1.1  riastrad 			DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5183   1.1  riastrad 			if (temp & FDI_RX_BIT_LOCK) {
   5184   1.1  riastrad 				I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
   5185   1.1  riastrad 				DRM_DEBUG_KMS("FDI train 1 done.\n");
   5186   1.1  riastrad 				break;
   5187   1.1  riastrad 			}
   5188   1.1  riastrad 			udelay(50);
   5189   1.1  riastrad 		}
   5190   1.1  riastrad 		if (retry < 5)
   5191   1.1  riastrad 			break;
   5192   1.1  riastrad 	}
   5193   1.1  riastrad 	if (i == 4)
   5194   1.1  riastrad 		DRM_ERROR("FDI train 1 fail!\n");
   5195   1.1  riastrad 
   5196   1.1  riastrad 	/* Train 2 */
   5197   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5198   1.1  riastrad 	temp = I915_READ(reg);
   5199   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5200   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_2;
   5201   1.1  riastrad 	if (IS_GEN(dev_priv, 6)) {
   5202   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
   5203   1.1  riastrad 		/* SNB-B */
   5204   1.1  riastrad 		temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
   5205   1.1  riastrad 	}
   5206   1.1  riastrad 	I915_WRITE(reg, temp);
   5207   1.1  riastrad 
   5208   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5209   1.1  riastrad 	temp = I915_READ(reg);
   5210   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   5211   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5212   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
   5213   1.1  riastrad 	} else {
   5214   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE;
   5215   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_2;
   5216   1.1  riastrad 	}
   5217   1.1  riastrad 	I915_WRITE(reg, temp);
   5218   1.1  riastrad 
   5219   1.1  riastrad 	POSTING_READ(reg);
   5220   1.1  riastrad 	udelay(150);
   5221   1.1  riastrad 
   5222   1.1  riastrad 	for (i = 0; i < 4; i++) {
   5223   1.1  riastrad 		reg = FDI_TX_CTL(pipe);
   5224   1.1  riastrad 		temp = I915_READ(reg);
   5225   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
   5226   1.1  riastrad 		temp |= snb_b_fdi_train_param[i];
   5227   1.1  riastrad 		I915_WRITE(reg, temp);
   5228   1.1  riastrad 
   5229   1.1  riastrad 		POSTING_READ(reg);
   5230   1.1  riastrad 		udelay(500);
   5231   1.1  riastrad 
   5232   1.1  riastrad 		for (retry = 0; retry < 5; retry++) {
   5233   1.1  riastrad 			reg = FDI_RX_IIR(pipe);
   5234   1.1  riastrad 			temp = I915_READ(reg);
   5235   1.1  riastrad 			DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5236   1.1  riastrad 			if (temp & FDI_RX_SYMBOL_LOCK) {
   5237   1.1  riastrad 				I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
   5238   1.1  riastrad 				DRM_DEBUG_KMS("FDI train 2 done.\n");
   5239   1.1  riastrad 				break;
   5240   1.1  riastrad 			}
   5241   1.1  riastrad 			udelay(50);
   5242   1.1  riastrad 		}
   5243   1.1  riastrad 		if (retry < 5)
   5244   1.1  riastrad 			break;
   5245   1.1  riastrad 	}
   5246   1.1  riastrad 	if (i == 4)
   5247   1.1  riastrad 		DRM_ERROR("FDI train 2 fail!\n");
   5248   1.1  riastrad 
   5249   1.1  riastrad 	DRM_DEBUG_KMS("FDI train done.\n");
   5250   1.1  riastrad }
   5251   1.1  riastrad 
   5252   1.1  riastrad /* Manual link training for Ivy Bridge A0 parts */
   5253   1.1  riastrad static void ivb_manual_fdi_link_train(struct intel_crtc *crtc,
   5254   1.1  riastrad 				      const struct intel_crtc_state *crtc_state)
   5255   1.1  riastrad {
   5256   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   5257   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   5258   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   5259   1.1  riastrad 	i915_reg_t reg;
   5260   1.1  riastrad 	u32 temp, i, j;
   5261   1.1  riastrad 
   5262   1.1  riastrad 	/* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
   5263   1.1  riastrad 	   for train result */
   5264   1.1  riastrad 	reg = FDI_RX_IMR(pipe);
   5265   1.1  riastrad 	temp = I915_READ(reg);
   5266   1.1  riastrad 	temp &= ~FDI_RX_SYMBOL_LOCK;
   5267   1.1  riastrad 	temp &= ~FDI_RX_BIT_LOCK;
   5268   1.1  riastrad 	I915_WRITE(reg, temp);
   5269   1.1  riastrad 
   5270   1.1  riastrad 	POSTING_READ(reg);
   5271   1.1  riastrad 	udelay(150);
   5272   1.1  riastrad 
   5273   1.1  riastrad 	DRM_DEBUG_KMS("FDI_RX_IIR before link train 0x%x\n",
   5274   1.1  riastrad 		      I915_READ(FDI_RX_IIR(pipe)));
   5275   1.1  riastrad 
   5276   1.1  riastrad 	/* Try each vswing and preemphasis setting twice before moving on */
   5277   1.1  riastrad 	for (j = 0; j < ARRAY_SIZE(snb_b_fdi_train_param) * 2; j++) {
   5278   1.1  riastrad 		/* disable first in case we need to retry */
   5279   1.1  riastrad 		reg = FDI_TX_CTL(pipe);
   5280   1.1  riastrad 		temp = I915_READ(reg);
   5281   1.1  riastrad 		temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
   5282   1.1  riastrad 		temp &= ~FDI_TX_ENABLE;
   5283   1.1  riastrad 		I915_WRITE(reg, temp);
   5284   1.1  riastrad 
   5285   1.1  riastrad 		reg = FDI_RX_CTL(pipe);
   5286   1.1  riastrad 		temp = I915_READ(reg);
   5287   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_AUTO;
   5288   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5289   1.1  riastrad 		temp &= ~FDI_RX_ENABLE;
   5290   1.1  riastrad 		I915_WRITE(reg, temp);
   5291   1.1  riastrad 
   5292   1.1  riastrad 		/* enable CPU FDI TX and PCH FDI RX */
   5293   1.1  riastrad 		reg = FDI_TX_CTL(pipe);
   5294   1.1  riastrad 		temp = I915_READ(reg);
   5295   1.1  riastrad 		temp &= ~FDI_DP_PORT_WIDTH_MASK;
   5296   1.1  riastrad 		temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
   5297   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
   5298   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
   5299   1.1  riastrad 		temp |= snb_b_fdi_train_param[j/2];
   5300   1.1  riastrad 		temp |= FDI_COMPOSITE_SYNC;
   5301   1.1  riastrad 		I915_WRITE(reg, temp | FDI_TX_ENABLE);
   5302   1.1  riastrad 
   5303   1.1  riastrad 		I915_WRITE(FDI_RX_MISC(pipe),
   5304   1.1  riastrad 			   FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
   5305   1.1  riastrad 
   5306   1.1  riastrad 		reg = FDI_RX_CTL(pipe);
   5307   1.1  riastrad 		temp = I915_READ(reg);
   5308   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
   5309   1.1  riastrad 		temp |= FDI_COMPOSITE_SYNC;
   5310   1.1  riastrad 		I915_WRITE(reg, temp | FDI_RX_ENABLE);
   5311   1.1  riastrad 
   5312   1.1  riastrad 		POSTING_READ(reg);
   5313   1.1  riastrad 		udelay(1); /* should be 0.5us */
   5314   1.1  riastrad 
   5315   1.1  riastrad 		for (i = 0; i < 4; i++) {
   5316   1.1  riastrad 			reg = FDI_RX_IIR(pipe);
   5317   1.1  riastrad 			temp = I915_READ(reg);
   5318   1.1  riastrad 			DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5319   1.1  riastrad 
   5320   1.1  riastrad 			if (temp & FDI_RX_BIT_LOCK ||
   5321   1.1  riastrad 			    (I915_READ(reg) & FDI_RX_BIT_LOCK)) {
   5322   1.1  riastrad 				I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
   5323   1.1  riastrad 				DRM_DEBUG_KMS("FDI train 1 done, level %i.\n",
   5324   1.1  riastrad 					      i);
   5325   1.1  riastrad 				break;
   5326   1.1  riastrad 			}
   5327   1.1  riastrad 			udelay(1); /* should be 0.5us */
   5328   1.1  riastrad 		}
   5329   1.1  riastrad 		if (i == 4) {
   5330   1.1  riastrad 			DRM_DEBUG_KMS("FDI train 1 fail on vswing %d\n", j / 2);
   5331   1.1  riastrad 			continue;
   5332   1.1  riastrad 		}
   5333   1.1  riastrad 
   5334   1.1  riastrad 		/* Train 2 */
   5335   1.1  riastrad 		reg = FDI_TX_CTL(pipe);
   5336   1.1  riastrad 		temp = I915_READ(reg);
   5337   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE_IVB;
   5338   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
   5339   1.1  riastrad 		I915_WRITE(reg, temp);
   5340   1.1  riastrad 
   5341   1.1  riastrad 		reg = FDI_RX_CTL(pipe);
   5342   1.1  riastrad 		temp = I915_READ(reg);
   5343   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5344   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
   5345   1.1  riastrad 		I915_WRITE(reg, temp);
   5346   1.1  riastrad 
   5347   1.1  riastrad 		POSTING_READ(reg);
   5348   1.1  riastrad 		udelay(2); /* should be 1.5us */
   5349   1.1  riastrad 
   5350   1.1  riastrad 		for (i = 0; i < 4; i++) {
   5351   1.1  riastrad 			reg = FDI_RX_IIR(pipe);
   5352   1.1  riastrad 			temp = I915_READ(reg);
   5353   1.1  riastrad 			DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
   5354   1.1  riastrad 
   5355   1.1  riastrad 			if (temp & FDI_RX_SYMBOL_LOCK ||
   5356   1.1  riastrad 			    (I915_READ(reg) & FDI_RX_SYMBOL_LOCK)) {
   5357   1.1  riastrad 				I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
   5358   1.1  riastrad 				DRM_DEBUG_KMS("FDI train 2 done, level %i.\n",
   5359   1.1  riastrad 					      i);
   5360   1.1  riastrad 				goto train_done;
   5361   1.1  riastrad 			}
   5362   1.1  riastrad 			udelay(2); /* should be 1.5us */
   5363   1.1  riastrad 		}
   5364   1.1  riastrad 		if (i == 4)
   5365   1.1  riastrad 			DRM_DEBUG_KMS("FDI train 2 fail on vswing %d\n", j / 2);
   5366   1.1  riastrad 	}
   5367   1.1  riastrad 
   5368   1.1  riastrad train_done:
   5369   1.1  riastrad 	DRM_DEBUG_KMS("FDI train done.\n");
   5370   1.1  riastrad }
   5371   1.1  riastrad 
   5372   1.1  riastrad static void ilk_fdi_pll_enable(const struct intel_crtc_state *crtc_state)
   5373   1.1  riastrad {
   5374   1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5375   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
   5376   1.1  riastrad 	enum pipe pipe = intel_crtc->pipe;
   5377   1.1  riastrad 	i915_reg_t reg;
   5378   1.1  riastrad 	u32 temp;
   5379   1.1  riastrad 
   5380   1.1  riastrad 	/* enable PCH FDI RX PLL, wait warmup plus DMI latency */
   5381   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5382   1.1  riastrad 	temp = I915_READ(reg);
   5383   1.1  riastrad 	temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16));
   5384   1.1  riastrad 	temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
   5385   1.1  riastrad 	temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
   5386   1.1  riastrad 	I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
   5387   1.1  riastrad 
   5388   1.1  riastrad 	POSTING_READ(reg);
   5389   1.1  riastrad 	udelay(200);
   5390   1.1  riastrad 
   5391   1.1  riastrad 	/* Switch from Rawclk to PCDclk */
   5392   1.1  riastrad 	temp = I915_READ(reg);
   5393   1.1  riastrad 	I915_WRITE(reg, temp | FDI_PCDCLK);
   5394   1.1  riastrad 
   5395   1.1  riastrad 	POSTING_READ(reg);
   5396   1.1  riastrad 	udelay(200);
   5397   1.1  riastrad 
   5398   1.1  riastrad 	/* Enable CPU FDI TX PLL, always on for Ironlake */
   5399   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5400   1.1  riastrad 	temp = I915_READ(reg);
   5401   1.1  riastrad 	if ((temp & FDI_TX_PLL_ENABLE) == 0) {
   5402   1.1  riastrad 		I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE);
   5403   1.1  riastrad 
   5404   1.1  riastrad 		POSTING_READ(reg);
   5405   1.1  riastrad 		udelay(100);
   5406   1.1  riastrad 	}
   5407   1.1  riastrad }
   5408   1.1  riastrad 
   5409   1.1  riastrad static void ilk_fdi_pll_disable(struct intel_crtc *intel_crtc)
   5410   1.1  riastrad {
   5411   1.1  riastrad 	struct drm_device *dev = intel_crtc->base.dev;
   5412   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   5413   1.1  riastrad 	enum pipe pipe = intel_crtc->pipe;
   5414   1.1  riastrad 	i915_reg_t reg;
   5415   1.1  riastrad 	u32 temp;
   5416   1.1  riastrad 
   5417   1.1  riastrad 	/* Switch from PCDclk to Rawclk */
   5418   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5419   1.1  riastrad 	temp = I915_READ(reg);
   5420   1.1  riastrad 	I915_WRITE(reg, temp & ~FDI_PCDCLK);
   5421   1.1  riastrad 
   5422   1.1  riastrad 	/* Disable CPU FDI TX PLL */
   5423   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5424   1.1  riastrad 	temp = I915_READ(reg);
   5425   1.1  riastrad 	I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE);
   5426   1.1  riastrad 
   5427   1.1  riastrad 	POSTING_READ(reg);
   5428   1.1  riastrad 	udelay(100);
   5429   1.1  riastrad 
   5430   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5431   1.1  riastrad 	temp = I915_READ(reg);
   5432   1.1  riastrad 	I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE);
   5433   1.1  riastrad 
   5434   1.1  riastrad 	/* Wait for the clocks to turn off. */
   5435   1.1  riastrad 	POSTING_READ(reg);
   5436   1.1  riastrad 	udelay(100);
   5437   1.1  riastrad }
   5438   1.1  riastrad 
   5439   1.1  riastrad static void ilk_fdi_disable(struct intel_crtc *crtc)
   5440   1.1  riastrad {
   5441   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   5442   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   5443   1.1  riastrad 	i915_reg_t reg;
   5444   1.1  riastrad 	u32 temp;
   5445   1.1  riastrad 
   5446   1.1  riastrad 	/* disable CPU FDI tx and PCH FDI rx */
   5447   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5448   1.1  riastrad 	temp = I915_READ(reg);
   5449   1.1  riastrad 	I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
   5450   1.1  riastrad 	POSTING_READ(reg);
   5451   1.1  riastrad 
   5452   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5453   1.1  riastrad 	temp = I915_READ(reg);
   5454   1.1  riastrad 	temp &= ~(0x7 << 16);
   5455   1.1  riastrad 	temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
   5456   1.1  riastrad 	I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
   5457   1.1  riastrad 
   5458   1.1  riastrad 	POSTING_READ(reg);
   5459   1.1  riastrad 	udelay(100);
   5460   1.1  riastrad 
   5461   1.1  riastrad 	/* Ironlake workaround, disable clock pointer after downing FDI */
   5462   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv))
   5463   1.1  riastrad 		I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
   5464   1.1  riastrad 
   5465   1.1  riastrad 	/* still set train pattern 1 */
   5466   1.1  riastrad 	reg = FDI_TX_CTL(pipe);
   5467   1.1  riastrad 	temp = I915_READ(reg);
   5468   1.1  riastrad 	temp &= ~FDI_LINK_TRAIN_NONE;
   5469   1.1  riastrad 	temp |= FDI_LINK_TRAIN_PATTERN_1;
   5470   1.1  riastrad 	I915_WRITE(reg, temp);
   5471   1.1  riastrad 
   5472   1.1  riastrad 	reg = FDI_RX_CTL(pipe);
   5473   1.1  riastrad 	temp = I915_READ(reg);
   5474   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   5475   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
   5476   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
   5477   1.1  riastrad 	} else {
   5478   1.1  riastrad 		temp &= ~FDI_LINK_TRAIN_NONE;
   5479   1.1  riastrad 		temp |= FDI_LINK_TRAIN_PATTERN_1;
   5480   1.1  riastrad 	}
   5481   1.1  riastrad 	/* BPC in FDI rx is consistent with that in PIPECONF */
   5482   1.1  riastrad 	temp &= ~(0x07 << 16);
   5483   1.1  riastrad 	temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
   5484   1.1  riastrad 	I915_WRITE(reg, temp);
   5485   1.1  riastrad 
   5486   1.1  riastrad 	POSTING_READ(reg);
   5487   1.1  riastrad 	udelay(100);
   5488   1.1  riastrad }
   5489   1.1  riastrad 
   5490   1.1  riastrad bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv)
   5491   1.1  riastrad {
   5492   1.1  riastrad 	struct drm_crtc *crtc;
   5493   1.1  riastrad 	bool cleanup_done;
   5494   1.1  riastrad 
   5495   1.1  riastrad 	drm_for_each_crtc(crtc, &dev_priv->drm) {
   5496   1.1  riastrad 		struct drm_crtc_commit *commit;
   5497   1.1  riastrad 		spin_lock(&crtc->commit_lock);
   5498   1.1  riastrad 		commit = list_first_entry_or_null(&crtc->commit_list,
   5499   1.1  riastrad 						  struct drm_crtc_commit, commit_entry);
   5500   1.1  riastrad 		cleanup_done = commit ?
   5501   1.1  riastrad 			try_wait_for_completion(&commit->cleanup_done) : true;
   5502   1.1  riastrad 		spin_unlock(&crtc->commit_lock);
   5503   1.1  riastrad 
   5504   1.1  riastrad 		if (cleanup_done)
   5505   1.1  riastrad 			continue;
   5506   1.1  riastrad 
   5507   1.1  riastrad 		drm_crtc_wait_one_vblank(crtc);
   5508   1.1  riastrad 
   5509   1.1  riastrad 		return true;
   5510   1.1  riastrad 	}
   5511   1.1  riastrad 
   5512   1.1  riastrad 	return false;
   5513   1.1  riastrad }
   5514   1.1  riastrad 
   5515   1.1  riastrad void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
   5516   1.1  riastrad {
   5517   1.1  riastrad 	u32 temp;
   5518   1.1  riastrad 
   5519   1.1  riastrad 	I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_GATE);
   5520   1.1  riastrad 
   5521   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   5522   1.1  riastrad 
   5523   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
   5524   1.1  riastrad 	temp |= SBI_SSCCTL_DISABLE;
   5525   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCCTL6, temp, SBI_ICLK);
   5526   1.1  riastrad 
   5527   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   5528   1.1  riastrad }
   5529   1.1  riastrad 
   5530   1.1  riastrad /* Program iCLKIP clock to the desired frequency */
   5531   1.1  riastrad static void lpt_program_iclkip(const struct intel_crtc_state *crtc_state)
   5532   1.1  riastrad {
   5533   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5534   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   5535   1.1  riastrad 	int clock = crtc_state->hw.adjusted_mode.crtc_clock;
   5536   1.1  riastrad 	u32 divsel, phaseinc, auxdiv, phasedir = 0;
   5537   1.1  riastrad 	u32 temp;
   5538   1.1  riastrad 
   5539   1.1  riastrad 	lpt_disable_iclkip(dev_priv);
   5540   1.1  riastrad 
   5541   1.1  riastrad 	/* The iCLK virtual clock root frequency is in MHz,
   5542   1.1  riastrad 	 * but the adjusted_mode->crtc_clock in in KHz. To get the
   5543   1.1  riastrad 	 * divisors, it is necessary to divide one by another, so we
   5544   1.1  riastrad 	 * convert the virtual clock precision to KHz here for higher
   5545   1.1  riastrad 	 * precision.
   5546   1.1  riastrad 	 */
   5547   1.1  riastrad 	for (auxdiv = 0; auxdiv < 2; auxdiv++) {
   5548   1.1  riastrad 		u32 iclk_virtual_root_freq = 172800 * 1000;
   5549   1.1  riastrad 		u32 iclk_pi_range = 64;
   5550   1.1  riastrad 		u32 desired_divisor;
   5551   1.1  riastrad 
   5552   1.1  riastrad 		desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
   5553   1.1  riastrad 						    clock << auxdiv);
   5554   1.1  riastrad 		divsel = (desired_divisor / iclk_pi_range) - 2;
   5555   1.1  riastrad 		phaseinc = desired_divisor % iclk_pi_range;
   5556   1.1  riastrad 
   5557   1.1  riastrad 		/*
   5558   1.1  riastrad 		 * Near 20MHz is a corner case which is
   5559   1.1  riastrad 		 * out of range for the 7-bit divisor
   5560   1.1  riastrad 		 */
   5561   1.1  riastrad 		if (divsel <= 0x7f)
   5562   1.1  riastrad 			break;
   5563   1.1  riastrad 	}
   5564   1.1  riastrad 
   5565   1.1  riastrad 	/* This should not happen with any sane values */
   5566   1.1  riastrad 	WARN_ON(SBI_SSCDIVINTPHASE_DIVSEL(divsel) &
   5567   1.1  riastrad 		~SBI_SSCDIVINTPHASE_DIVSEL_MASK);
   5568   1.1  riastrad 	WARN_ON(SBI_SSCDIVINTPHASE_DIR(phasedir) &
   5569   1.1  riastrad 		~SBI_SSCDIVINTPHASE_INCVAL_MASK);
   5570   1.1  riastrad 
   5571   1.1  riastrad 	DRM_DEBUG_KMS("iCLKIP clock: found settings for %dKHz refresh rate: auxdiv=%x, divsel=%x, phasedir=%x, phaseinc=%x\n",
   5572   1.1  riastrad 			clock,
   5573   1.1  riastrad 			auxdiv,
   5574   1.1  riastrad 			divsel,
   5575   1.1  riastrad 			phasedir,
   5576   1.1  riastrad 			phaseinc);
   5577   1.1  riastrad 
   5578   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   5579   1.1  riastrad 
   5580   1.1  riastrad 	/* Program SSCDIVINTPHASE6 */
   5581   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
   5582   1.1  riastrad 	temp &= ~SBI_SSCDIVINTPHASE_DIVSEL_MASK;
   5583   1.1  riastrad 	temp |= SBI_SSCDIVINTPHASE_DIVSEL(divsel);
   5584   1.1  riastrad 	temp &= ~SBI_SSCDIVINTPHASE_INCVAL_MASK;
   5585   1.1  riastrad 	temp |= SBI_SSCDIVINTPHASE_INCVAL(phaseinc);
   5586   1.1  riastrad 	temp |= SBI_SSCDIVINTPHASE_DIR(phasedir);
   5587   1.1  riastrad 	temp |= SBI_SSCDIVINTPHASE_PROPAGATE;
   5588   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCDIVINTPHASE6, temp, SBI_ICLK);
   5589   1.1  riastrad 
   5590   1.1  riastrad 	/* Program SSCAUXDIV */
   5591   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
   5592   1.1  riastrad 	temp &= ~SBI_SSCAUXDIV_FINALDIV2SEL(1);
   5593   1.1  riastrad 	temp |= SBI_SSCAUXDIV_FINALDIV2SEL(auxdiv);
   5594   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCAUXDIV6, temp, SBI_ICLK);
   5595   1.1  riastrad 
   5596   1.1  riastrad 	/* Enable modulator and associated divider */
   5597   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
   5598   1.1  riastrad 	temp &= ~SBI_SSCCTL_DISABLE;
   5599   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCCTL6, temp, SBI_ICLK);
   5600   1.1  riastrad 
   5601   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   5602   1.1  riastrad 
   5603   1.1  riastrad 	/* Wait for initialization time */
   5604   1.1  riastrad 	udelay(24);
   5605   1.1  riastrad 
   5606   1.1  riastrad 	I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE);
   5607   1.1  riastrad }
   5608   1.1  riastrad 
   5609   1.1  riastrad int lpt_get_iclkip(struct drm_i915_private *dev_priv)
   5610   1.1  riastrad {
   5611   1.1  riastrad 	u32 divsel, phaseinc, auxdiv;
   5612   1.1  riastrad 	u32 iclk_virtual_root_freq = 172800 * 1000;
   5613   1.1  riastrad 	u32 iclk_pi_range = 64;
   5614   1.1  riastrad 	u32 desired_divisor;
   5615   1.1  riastrad 	u32 temp;
   5616   1.1  riastrad 
   5617   1.1  riastrad 	if ((I915_READ(PIXCLK_GATE) & PIXCLK_GATE_UNGATE) == 0)
   5618   1.1  riastrad 		return 0;
   5619   1.1  riastrad 
   5620   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   5621   1.1  riastrad 
   5622   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
   5623   1.1  riastrad 	if (temp & SBI_SSCCTL_DISABLE) {
   5624   1.1  riastrad 		mutex_unlock(&dev_priv->sb_lock);
   5625   1.1  riastrad 		return 0;
   5626   1.1  riastrad 	}
   5627   1.1  riastrad 
   5628   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
   5629   1.1  riastrad 	divsel = (temp & SBI_SSCDIVINTPHASE_DIVSEL_MASK) >>
   5630   1.1  riastrad 		SBI_SSCDIVINTPHASE_DIVSEL_SHIFT;
   5631   1.1  riastrad 	phaseinc = (temp & SBI_SSCDIVINTPHASE_INCVAL_MASK) >>
   5632   1.1  riastrad 		SBI_SSCDIVINTPHASE_INCVAL_SHIFT;
   5633   1.1  riastrad 
   5634   1.1  riastrad 	temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
   5635   1.1  riastrad 	auxdiv = (temp & SBI_SSCAUXDIV_FINALDIV2SEL_MASK) >>
   5636   1.1  riastrad 		SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT;
   5637   1.1  riastrad 
   5638   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   5639   1.1  riastrad 
   5640   1.1  riastrad 	desired_divisor = (divsel + 2) * iclk_pi_range + phaseinc;
   5641   1.1  riastrad 
   5642   1.1  riastrad 	return DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
   5643   1.1  riastrad 				 desired_divisor << auxdiv);
   5644   1.1  riastrad }
   5645   1.1  riastrad 
   5646   1.1  riastrad static void ilk_pch_transcoder_set_timings(const struct intel_crtc_state *crtc_state,
   5647   1.1  riastrad 					   enum pipe pch_transcoder)
   5648   1.1  riastrad {
   5649   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5650   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   5651   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   5652   1.1  riastrad 
   5653   1.1  riastrad 	I915_WRITE(PCH_TRANS_HTOTAL(pch_transcoder),
   5654   1.1  riastrad 		   I915_READ(HTOTAL(cpu_transcoder)));
   5655   1.1  riastrad 	I915_WRITE(PCH_TRANS_HBLANK(pch_transcoder),
   5656   1.1  riastrad 		   I915_READ(HBLANK(cpu_transcoder)));
   5657   1.1  riastrad 	I915_WRITE(PCH_TRANS_HSYNC(pch_transcoder),
   5658   1.1  riastrad 		   I915_READ(HSYNC(cpu_transcoder)));
   5659   1.1  riastrad 
   5660   1.1  riastrad 	I915_WRITE(PCH_TRANS_VTOTAL(pch_transcoder),
   5661   1.1  riastrad 		   I915_READ(VTOTAL(cpu_transcoder)));
   5662   1.1  riastrad 	I915_WRITE(PCH_TRANS_VBLANK(pch_transcoder),
   5663   1.1  riastrad 		   I915_READ(VBLANK(cpu_transcoder)));
   5664   1.1  riastrad 	I915_WRITE(PCH_TRANS_VSYNC(pch_transcoder),
   5665   1.1  riastrad 		   I915_READ(VSYNC(cpu_transcoder)));
   5666   1.1  riastrad 	I915_WRITE(PCH_TRANS_VSYNCSHIFT(pch_transcoder),
   5667   1.1  riastrad 		   I915_READ(VSYNCSHIFT(cpu_transcoder)));
   5668   1.1  riastrad }
   5669   1.1  riastrad 
   5670   1.1  riastrad static void cpt_set_fdi_bc_bifurcation(struct drm_i915_private *dev_priv, bool enable)
   5671   1.1  riastrad {
   5672   1.1  riastrad 	u32 temp;
   5673   1.1  riastrad 
   5674   1.1  riastrad 	temp = I915_READ(SOUTH_CHICKEN1);
   5675   1.1  riastrad 	if (!!(temp & FDI_BC_BIFURCATION_SELECT) == enable)
   5676   1.1  riastrad 		return;
   5677   1.1  riastrad 
   5678   1.1  riastrad 	WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
   5679   1.1  riastrad 	WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
   5680   1.1  riastrad 
   5681   1.1  riastrad 	temp &= ~FDI_BC_BIFURCATION_SELECT;
   5682   1.1  riastrad 	if (enable)
   5683   1.1  riastrad 		temp |= FDI_BC_BIFURCATION_SELECT;
   5684   1.1  riastrad 
   5685   1.1  riastrad 	DRM_DEBUG_KMS("%sabling fdi C rx\n", enable ? "en" : "dis");
   5686   1.1  riastrad 	I915_WRITE(SOUTH_CHICKEN1, temp);
   5687   1.1  riastrad 	POSTING_READ(SOUTH_CHICKEN1);
   5688   1.1  riastrad }
   5689   1.1  riastrad 
   5690   1.1  riastrad static void ivb_update_fdi_bc_bifurcation(const struct intel_crtc_state *crtc_state)
   5691   1.1  riastrad {
   5692   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5693   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   5694   1.1  riastrad 
   5695   1.1  riastrad 	switch (crtc->pipe) {
   5696   1.1  riastrad 	case PIPE_A:
   5697   1.1  riastrad 		break;
   5698   1.1  riastrad 	case PIPE_B:
   5699   1.1  riastrad 		if (crtc_state->fdi_lanes > 2)
   5700   1.1  riastrad 			cpt_set_fdi_bc_bifurcation(dev_priv, false);
   5701   1.1  riastrad 		else
   5702   1.1  riastrad 			cpt_set_fdi_bc_bifurcation(dev_priv, true);
   5703   1.1  riastrad 
   5704   1.1  riastrad 		break;
   5705   1.1  riastrad 	case PIPE_C:
   5706   1.1  riastrad 		cpt_set_fdi_bc_bifurcation(dev_priv, true);
   5707   1.1  riastrad 
   5708   1.1  riastrad 		break;
   5709   1.1  riastrad 	default:
   5710   1.1  riastrad 		BUG();
   5711   1.1  riastrad 	}
   5712   1.1  riastrad }
   5713   1.1  riastrad 
   5714   1.1  riastrad /*
   5715   1.1  riastrad  * Finds the encoder associated with the given CRTC. This can only be
   5716   1.1  riastrad  * used when we know that the CRTC isn't feeding multiple encoders!
   5717   1.1  riastrad  */
   5718   1.1  riastrad static struct intel_encoder *
   5719   1.1  riastrad intel_get_crtc_new_encoder(const struct intel_atomic_state *state,
   5720   1.1  riastrad 			   const struct intel_crtc_state *crtc_state)
   5721   1.1  riastrad {
   5722   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5723   1.1  riastrad 	const struct drm_connector_state *connector_state;
   5724   1.1  riastrad 	const struct drm_connector *connector;
   5725   1.1  riastrad 	struct intel_encoder *encoder = NULL;
   5726   1.1  riastrad 	int num_encoders = 0;
   5727   1.1  riastrad 	int i;
   5728   1.1  riastrad 
   5729   1.1  riastrad 	for_each_new_connector_in_state(&state->base, connector, connector_state, i) {
   5730   1.1  riastrad 		if (connector_state->crtc != &crtc->base)
   5731   1.1  riastrad 			continue;
   5732   1.1  riastrad 
   5733   1.1  riastrad 		encoder = to_intel_encoder(connector_state->best_encoder);
   5734   1.1  riastrad 		num_encoders++;
   5735   1.1  riastrad 	}
   5736   1.1  riastrad 
   5737   1.1  riastrad 	WARN(num_encoders != 1, "%d encoders for pipe %c\n",
   5738   1.1  riastrad 	     num_encoders, pipe_name(crtc->pipe));
   5739   1.1  riastrad 
   5740   1.1  riastrad 	return encoder;
   5741   1.1  riastrad }
   5742   1.1  riastrad 
   5743   1.1  riastrad /*
   5744   1.1  riastrad  * Enable PCH resources required for PCH ports:
   5745   1.1  riastrad  *   - PCH PLLs
   5746   1.1  riastrad  *   - FDI training & RX/TX
   5747   1.1  riastrad  *   - update transcoder timings
   5748   1.1  riastrad  *   - DP transcoding bits
   5749   1.1  riastrad  *   - transcoder
   5750   1.1  riastrad  */
   5751   1.1  riastrad static void ilk_pch_enable(const struct intel_atomic_state *state,
   5752   1.1  riastrad 			   const struct intel_crtc_state *crtc_state)
   5753   1.1  riastrad {
   5754   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5755   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   5756   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   5757   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   5758   1.1  riastrad 	u32 temp;
   5759   1.1  riastrad 
   5760   1.1  riastrad 	assert_pch_transcoder_disabled(dev_priv, pipe);
   5761   1.1  riastrad 
   5762   1.1  riastrad 	if (IS_IVYBRIDGE(dev_priv))
   5763   1.1  riastrad 		ivb_update_fdi_bc_bifurcation(crtc_state);
   5764   1.1  riastrad 
   5765   1.1  riastrad 	/* Write the TU size bits before fdi link training, so that error
   5766   1.1  riastrad 	 * detection works. */
   5767   1.1  riastrad 	I915_WRITE(FDI_RX_TUSIZE1(pipe),
   5768   1.1  riastrad 		   I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
   5769   1.1  riastrad 
   5770   1.1  riastrad 	/* For PCH output, training FDI link */
   5771   1.1  riastrad 	dev_priv->display.fdi_link_train(crtc, crtc_state);
   5772   1.1  riastrad 
   5773   1.1  riastrad 	/* We need to program the right clock selection before writing the pixel
   5774   1.1  riastrad 	 * mutliplier into the DPLL. */
   5775   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv)) {
   5776   1.1  riastrad 		u32 sel;
   5777   1.1  riastrad 
   5778   1.1  riastrad 		temp = I915_READ(PCH_DPLL_SEL);
   5779   1.1  riastrad 		temp |= TRANS_DPLL_ENABLE(pipe);
   5780   1.1  riastrad 		sel = TRANS_DPLLB_SEL(pipe);
   5781   1.1  riastrad 		if (crtc_state->shared_dpll ==
   5782   1.1  riastrad 		    intel_get_shared_dpll_by_id(dev_priv, DPLL_ID_PCH_PLL_B))
   5783   1.1  riastrad 			temp |= sel;
   5784   1.1  riastrad 		else
   5785   1.1  riastrad 			temp &= ~sel;
   5786   1.1  riastrad 		I915_WRITE(PCH_DPLL_SEL, temp);
   5787   1.1  riastrad 	}
   5788   1.1  riastrad 
   5789   1.1  riastrad 	/* XXX: pch pll's can be enabled any time before we enable the PCH
   5790   1.1  riastrad 	 * transcoder, and we actually should do this to not upset any PCH
   5791   1.1  riastrad 	 * transcoder that already use the clock when we share it.
   5792   1.1  riastrad 	 *
   5793   1.1  riastrad 	 * Note that enable_shared_dpll tries to do the right thing, but
   5794   1.1  riastrad 	 * get_shared_dpll unconditionally resets the pll - we need that to have
   5795   1.1  riastrad 	 * the right LVDS enable sequence. */
   5796   1.1  riastrad 	intel_enable_shared_dpll(crtc_state);
   5797   1.1  riastrad 
   5798   1.1  riastrad 	/* set transcoder timing, panel must allow it */
   5799   1.1  riastrad 	assert_panel_unlocked(dev_priv, pipe);
   5800   1.1  riastrad 	ilk_pch_transcoder_set_timings(crtc_state, pipe);
   5801   1.1  riastrad 
   5802   1.1  riastrad 	intel_fdi_normal_train(crtc);
   5803   1.1  riastrad 
   5804   1.1  riastrad 	/* For PCH DP, enable TRANS_DP_CTL */
   5805   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv) &&
   5806   1.1  riastrad 	    intel_crtc_has_dp_encoder(crtc_state)) {
   5807   1.1  riastrad 		const struct drm_display_mode *adjusted_mode =
   5808   1.1  riastrad 			&crtc_state->hw.adjusted_mode;
   5809   1.1  riastrad 		u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
   5810   1.1  riastrad 		i915_reg_t reg = TRANS_DP_CTL(pipe);
   5811   1.1  riastrad 		enum port port;
   5812   1.1  riastrad 
   5813   1.1  riastrad 		temp = I915_READ(reg);
   5814   1.1  riastrad 		temp &= ~(TRANS_DP_PORT_SEL_MASK |
   5815   1.1  riastrad 			  TRANS_DP_SYNC_MASK |
   5816   1.1  riastrad 			  TRANS_DP_BPC_MASK);
   5817   1.1  riastrad 		temp |= TRANS_DP_OUTPUT_ENABLE;
   5818   1.1  riastrad 		temp |= bpc << 9; /* same format but at 11:9 */
   5819   1.1  riastrad 
   5820   1.1  riastrad 		if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
   5821   1.1  riastrad 			temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
   5822   1.1  riastrad 		if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
   5823   1.1  riastrad 			temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
   5824   1.1  riastrad 
   5825   1.1  riastrad 		port = intel_get_crtc_new_encoder(state, crtc_state)->port;
   5826   1.1  riastrad 		WARN_ON(port < PORT_B || port > PORT_D);
   5827   1.1  riastrad 		temp |= TRANS_DP_PORT_SEL(port);
   5828   1.1  riastrad 
   5829   1.1  riastrad 		I915_WRITE(reg, temp);
   5830   1.1  riastrad 	}
   5831   1.1  riastrad 
   5832   1.1  riastrad 	ilk_enable_pch_transcoder(crtc_state);
   5833   1.1  riastrad }
   5834   1.1  riastrad 
   5835   1.1  riastrad static void lpt_pch_enable(const struct intel_atomic_state *state,
   5836   1.1  riastrad 			   const struct intel_crtc_state *crtc_state)
   5837   1.1  riastrad {
   5838   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   5839   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   5840   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   5841   1.1  riastrad 
   5842   1.1  riastrad 	assert_pch_transcoder_disabled(dev_priv, PIPE_A);
   5843   1.1  riastrad 
   5844   1.1  riastrad 	lpt_program_iclkip(crtc_state);
   5845   1.1  riastrad 
   5846   1.1  riastrad 	/* Set transcoder timing. */
   5847   1.1  riastrad 	ilk_pch_transcoder_set_timings(crtc_state, PIPE_A);
   5848   1.1  riastrad 
   5849   1.1  riastrad 	lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
   5850   1.1  riastrad }
   5851   1.1  riastrad 
   5852   1.1  riastrad static void cpt_verify_modeset(struct drm_i915_private *dev_priv,
   5853   1.1  riastrad 			       enum pipe pipe)
   5854   1.1  riastrad {
   5855   1.1  riastrad 	i915_reg_t dslreg = PIPEDSL(pipe);
   5856   1.1  riastrad 	u32 temp;
   5857   1.1  riastrad 
   5858   1.1  riastrad 	temp = I915_READ(dslreg);
   5859   1.1  riastrad 	udelay(500);
   5860   1.1  riastrad 	if (wait_for(I915_READ(dslreg) != temp, 5)) {
   5861   1.1  riastrad 		if (wait_for(I915_READ(dslreg) != temp, 5))
   5862   1.1  riastrad 			DRM_ERROR("mode set failed: pipe %c stuck\n", pipe_name(pipe));
   5863   1.1  riastrad 	}
   5864   1.1  riastrad }
   5865   1.1  riastrad 
   5866   1.1  riastrad /*
   5867   1.1  riastrad  * The hardware phase 0.0 refers to the center of the pixel.
   5868   1.1  riastrad  * We want to start from the top/left edge which is phase
   5869   1.1  riastrad  * -0.5. That matches how the hardware calculates the scaling
   5870   1.1  riastrad  * factors (from top-left of the first pixel to bottom-right
   5871   1.1  riastrad  * of the last pixel, as opposed to the pixel centers).
   5872   1.1  riastrad  *
   5873   1.1  riastrad  * For 4:2:0 subsampled chroma planes we obviously have to
   5874   1.1  riastrad  * adjust that so that the chroma sample position lands in
   5875   1.1  riastrad  * the right spot.
   5876   1.1  riastrad  *
   5877   1.1  riastrad  * Note that for packed YCbCr 4:2:2 formats there is no way to
   5878   1.1  riastrad  * control chroma siting. The hardware simply replicates the
   5879   1.1  riastrad  * chroma samples for both of the luma samples, and thus we don't
   5880   1.1  riastrad  * actually get the expected MPEG2 chroma siting convention :(
   5881   1.1  riastrad  * The same behaviour is observed on pre-SKL platforms as well.
   5882   1.1  riastrad  *
   5883   1.1  riastrad  * Theory behind the formula (note that we ignore sub-pixel
   5884   1.1  riastrad  * source coordinates):
   5885   1.1  riastrad  * s = source sample position
   5886   1.1  riastrad  * d = destination sample position
   5887   1.1  riastrad  *
   5888   1.1  riastrad  * Downscaling 4:1:
   5889   1.1  riastrad  * -0.5
   5890   1.1  riastrad  * | 0.0
   5891   1.1  riastrad  * | |     1.5 (initial phase)
   5892   1.1  riastrad  * | |     |
   5893   1.1  riastrad  * v v     v
   5894   1.1  riastrad  * | s | s | s | s |
   5895   1.1  riastrad  * |       d       |
   5896   1.1  riastrad  *
   5897   1.1  riastrad  * Upscaling 1:4:
   5898   1.1  riastrad  * -0.5
   5899   1.1  riastrad  * | -0.375 (initial phase)
   5900   1.1  riastrad  * | |     0.0
   5901   1.1  riastrad  * | |     |
   5902   1.1  riastrad  * v v     v
   5903   1.1  riastrad  * |       s       |
   5904   1.1  riastrad  * | d | d | d | d |
   5905   1.1  riastrad  */
   5906   1.1  riastrad u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_cosited)
   5907   1.1  riastrad {
   5908   1.1  riastrad 	int phase = -0x8000;
   5909   1.1  riastrad 	u16 trip = 0;
   5910   1.1  riastrad 
   5911   1.1  riastrad 	if (chroma_cosited)
   5912   1.1  riastrad 		phase += (sub - 1) * 0x8000 / sub;
   5913   1.1  riastrad 
   5914   1.1  riastrad 	phase += scale / (2 * sub);
   5915   1.1  riastrad 
   5916   1.1  riastrad 	/*
   5917   1.1  riastrad 	 * Hardware initial phase limited to [-0.5:1.5].
   5918   1.1  riastrad 	 * Since the max hardware scale factor is 3.0, we
   5919   1.1  riastrad 	 * should never actually excdeed 1.0 here.
   5920   1.1  riastrad 	 */
   5921   1.1  riastrad 	WARN_ON(phase < -0x8000 || phase > 0x18000);
   5922   1.1  riastrad 
   5923   1.1  riastrad 	if (phase < 0)
   5924   1.1  riastrad 		phase = 0x10000 + phase;
   5925   1.1  riastrad 	else
   5926   1.1  riastrad 		trip = PS_PHASE_TRIP;
   5927   1.1  riastrad 
   5928   1.1  riastrad 	return ((phase >> 2) & PS_PHASE_MASK) | trip;
   5929   1.1  riastrad }
   5930   1.1  riastrad 
   5931   1.1  riastrad #define SKL_MIN_SRC_W 8
   5932   1.1  riastrad #define SKL_MAX_SRC_W 4096
   5933   1.1  riastrad #define SKL_MIN_SRC_H 8
   5934   1.1  riastrad #define SKL_MAX_SRC_H 4096
   5935   1.1  riastrad #define SKL_MIN_DST_W 8
   5936   1.1  riastrad #define SKL_MAX_DST_W 4096
   5937   1.1  riastrad #define SKL_MIN_DST_H 8
   5938   1.1  riastrad #define SKL_MAX_DST_H 4096
   5939   1.1  riastrad #define ICL_MAX_SRC_W 5120
   5940   1.1  riastrad #define ICL_MAX_SRC_H 4096
   5941   1.1  riastrad #define ICL_MAX_DST_W 5120
   5942   1.1  riastrad #define ICL_MAX_DST_H 4096
   5943   1.1  riastrad #define SKL_MIN_YUV_420_SRC_W 16
   5944   1.1  riastrad #define SKL_MIN_YUV_420_SRC_H 16
   5945   1.1  riastrad 
   5946   1.1  riastrad static int
   5947   1.1  riastrad skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
   5948   1.1  riastrad 		  unsigned int scaler_user, int *scaler_id,
   5949   1.1  riastrad 		  int src_w, int src_h, int dst_w, int dst_h,
   5950   1.1  riastrad 		  const struct drm_format_info *format,
   5951   1.1  riastrad 		  u64 modifier, bool need_scaler)
   5952   1.1  riastrad {
   5953   1.1  riastrad 	struct intel_crtc_scaler_state *scaler_state =
   5954   1.1  riastrad 		&crtc_state->scaler_state;
   5955   1.1  riastrad 	struct intel_crtc *intel_crtc =
   5956   1.1  riastrad 		to_intel_crtc(crtc_state->uapi.crtc);
   5957   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
   5958   1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
   5959   1.1  riastrad 		&crtc_state->hw.adjusted_mode;
   5960   1.1  riastrad 
   5961   1.1  riastrad 	/*
   5962   1.1  riastrad 	 * Src coordinates are already rotated by 270 degrees for
   5963   1.1  riastrad 	 * the 90/270 degree plane rotation cases (to match the
   5964   1.1  riastrad 	 * GTT mapping), hence no need to account for rotation here.
   5965   1.1  riastrad 	 */
   5966   1.1  riastrad 	if (src_w != dst_w || src_h != dst_h)
   5967   1.1  riastrad 		need_scaler = true;
   5968   1.1  riastrad 
   5969   1.1  riastrad 	/*
   5970   1.1  riastrad 	 * Scaling/fitting not supported in IF-ID mode in GEN9+
   5971   1.1  riastrad 	 * TODO: Interlace fetch mode doesn't support YUV420 planar formats.
   5972   1.1  riastrad 	 * Once NV12 is enabled, handle it here while allocating scaler
   5973   1.1  riastrad 	 * for NV12.
   5974   1.1  riastrad 	 */
   5975   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9 && crtc_state->hw.enable &&
   5976   1.1  riastrad 	    need_scaler && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
   5977   1.1  riastrad 		DRM_DEBUG_KMS("Pipe/Plane scaling not supported with IF-ID mode\n");
   5978   1.1  riastrad 		return -EINVAL;
   5979   1.1  riastrad 	}
   5980   1.1  riastrad 
   5981   1.1  riastrad 	/*
   5982   1.1  riastrad 	 * if plane is being disabled or scaler is no more required or force detach
   5983   1.1  riastrad 	 *  - free scaler binded to this plane/crtc
   5984   1.1  riastrad 	 *  - in order to do this, update crtc->scaler_usage
   5985   1.1  riastrad 	 *
   5986   1.1  riastrad 	 * Here scaler state in crtc_state is set free so that
   5987   1.1  riastrad 	 * scaler can be assigned to other user. Actual register
   5988   1.1  riastrad 	 * update to free the scaler is done in plane/panel-fit programming.
   5989   1.1  riastrad 	 * For this purpose crtc/plane_state->scaler_id isn't reset here.
   5990   1.1  riastrad 	 */
   5991   1.1  riastrad 	if (force_detach || !need_scaler) {
   5992   1.1  riastrad 		if (*scaler_id >= 0) {
   5993   1.1  riastrad 			scaler_state->scaler_users &= ~(1 << scaler_user);
   5994   1.1  riastrad 			scaler_state->scalers[*scaler_id].in_use = 0;
   5995   1.1  riastrad 
   5996   1.1  riastrad 			DRM_DEBUG_KMS("scaler_user index %u.%u: "
   5997   1.1  riastrad 				"Staged freeing scaler id %d scaler_users = 0x%x\n",
   5998   1.1  riastrad 				intel_crtc->pipe, scaler_user, *scaler_id,
   5999   1.1  riastrad 				scaler_state->scaler_users);
   6000   1.1  riastrad 			*scaler_id = -1;
   6001   1.1  riastrad 		}
   6002   1.1  riastrad 		return 0;
   6003   1.1  riastrad 	}
   6004   1.1  riastrad 
   6005   1.1  riastrad 	if (format && intel_format_info_is_yuv_semiplanar(format, modifier) &&
   6006   1.1  riastrad 	    (src_h < SKL_MIN_YUV_420_SRC_H || src_w < SKL_MIN_YUV_420_SRC_W)) {
   6007   1.1  riastrad 		DRM_DEBUG_KMS("Planar YUV: src dimensions not met\n");
   6008   1.1  riastrad 		return -EINVAL;
   6009   1.1  riastrad 	}
   6010   1.1  riastrad 
   6011   1.1  riastrad 	/* range checks */
   6012   1.1  riastrad 	if (src_w < SKL_MIN_SRC_W || src_h < SKL_MIN_SRC_H ||
   6013   1.1  riastrad 	    dst_w < SKL_MIN_DST_W || dst_h < SKL_MIN_DST_H ||
   6014   1.1  riastrad 	    (INTEL_GEN(dev_priv) >= 11 &&
   6015   1.1  riastrad 	     (src_w > ICL_MAX_SRC_W || src_h > ICL_MAX_SRC_H ||
   6016   1.1  riastrad 	      dst_w > ICL_MAX_DST_W || dst_h > ICL_MAX_DST_H)) ||
   6017   1.1  riastrad 	    (INTEL_GEN(dev_priv) < 11 &&
   6018   1.1  riastrad 	     (src_w > SKL_MAX_SRC_W || src_h > SKL_MAX_SRC_H ||
   6019   1.1  riastrad 	      dst_w > SKL_MAX_DST_W || dst_h > SKL_MAX_DST_H)))	{
   6020   1.1  riastrad 		DRM_DEBUG_KMS("scaler_user index %u.%u: src %ux%u dst %ux%u "
   6021   1.1  riastrad 			"size is out of scaler range\n",
   6022   1.1  riastrad 			intel_crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h);
   6023   1.1  riastrad 		return -EINVAL;
   6024   1.1  riastrad 	}
   6025   1.1  riastrad 
   6026   1.1  riastrad 	/* mark this plane as a scaler user in crtc_state */
   6027   1.1  riastrad 	scaler_state->scaler_users |= (1 << scaler_user);
   6028   1.1  riastrad 	DRM_DEBUG_KMS("scaler_user index %u.%u: "
   6029   1.1  riastrad 		"staged scaling request for %ux%u->%ux%u scaler_users = 0x%x\n",
   6030   1.1  riastrad 		intel_crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h,
   6031   1.1  riastrad 		scaler_state->scaler_users);
   6032   1.1  riastrad 
   6033   1.1  riastrad 	return 0;
   6034   1.1  riastrad }
   6035   1.1  riastrad 
   6036   1.1  riastrad /**
   6037   1.1  riastrad  * skl_update_scaler_crtc - Stages update to scaler state for a given crtc.
   6038   1.1  riastrad  *
   6039   1.1  riastrad  * @state: crtc's scaler state
   6040   1.1  riastrad  *
   6041   1.1  riastrad  * Return
   6042   1.1  riastrad  *     0 - scaler_usage updated successfully
   6043   1.1  riastrad  *    error - requested scaling cannot be supported or other error condition
   6044   1.1  riastrad  */
   6045   1.1  riastrad int skl_update_scaler_crtc(struct intel_crtc_state *state)
   6046   1.1  riastrad {
   6047   1.1  riastrad 	const struct drm_display_mode *adjusted_mode = &state->hw.adjusted_mode;
   6048   1.1  riastrad 	bool need_scaler = false;
   6049   1.1  riastrad 
   6050   1.1  riastrad 	if (state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
   6051   1.1  riastrad 		need_scaler = true;
   6052   1.1  riastrad 
   6053   1.1  riastrad 	return skl_update_scaler(state, !state->hw.active, SKL_CRTC_INDEX,
   6054   1.1  riastrad 				 &state->scaler_state.scaler_id,
   6055   1.1  riastrad 				 state->pipe_src_w, state->pipe_src_h,
   6056   1.1  riastrad 				 adjusted_mode->crtc_hdisplay,
   6057   1.1  riastrad 				 adjusted_mode->crtc_vdisplay, NULL, 0,
   6058   1.1  riastrad 				 need_scaler);
   6059   1.1  riastrad }
   6060   1.1  riastrad 
   6061   1.1  riastrad /**
   6062   1.1  riastrad  * skl_update_scaler_plane - Stages update to scaler state for a given plane.
   6063   1.1  riastrad  * @crtc_state: crtc's scaler state
   6064   1.1  riastrad  * @plane_state: atomic plane state to update
   6065   1.1  riastrad  *
   6066   1.1  riastrad  * Return
   6067   1.1  riastrad  *     0 - scaler_usage updated successfully
   6068   1.1  riastrad  *    error - requested scaling cannot be supported or other error condition
   6069   1.1  riastrad  */
   6070   1.1  riastrad static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
   6071   1.1  riastrad 				   struct intel_plane_state *plane_state)
   6072   1.1  riastrad {
   6073   1.1  riastrad 	struct intel_plane *intel_plane =
   6074   1.1  riastrad 		to_intel_plane(plane_state->uapi.plane);
   6075   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
   6076   1.1  riastrad 	struct drm_framebuffer *fb = plane_state->hw.fb;
   6077   1.1  riastrad 	int ret;
   6078   1.1  riastrad 	bool force_detach = !fb || !plane_state->uapi.visible;
   6079   1.1  riastrad 	bool need_scaler = false;
   6080   1.1  riastrad 
   6081   1.1  riastrad 	/* Pre-gen11 and SDR planes always need a scaler for planar formats. */
   6082   1.1  riastrad 	if (!icl_is_hdr_plane(dev_priv, intel_plane->id) &&
   6083   1.1  riastrad 	    fb && intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier))
   6084   1.1  riastrad 		need_scaler = true;
   6085   1.1  riastrad 
   6086   1.1  riastrad 	ret = skl_update_scaler(crtc_state, force_detach,
   6087   1.1  riastrad 				drm_plane_index(&intel_plane->base),
   6088   1.1  riastrad 				&plane_state->scaler_id,
   6089   1.1  riastrad 				drm_rect_width(&plane_state->uapi.src) >> 16,
   6090   1.1  riastrad 				drm_rect_height(&plane_state->uapi.src) >> 16,
   6091   1.1  riastrad 				drm_rect_width(&plane_state->uapi.dst),
   6092   1.1  riastrad 				drm_rect_height(&plane_state->uapi.dst),
   6093   1.1  riastrad 				fb ? fb->format : NULL,
   6094   1.1  riastrad 				fb ? fb->modifier : 0,
   6095   1.1  riastrad 				need_scaler);
   6096   1.1  riastrad 
   6097   1.1  riastrad 	if (ret || plane_state->scaler_id < 0)
   6098   1.1  riastrad 		return ret;
   6099   1.1  riastrad 
   6100   1.1  riastrad 	/* check colorkey */
   6101   1.1  riastrad 	if (plane_state->ckey.flags) {
   6102   1.1  riastrad 		DRM_DEBUG_KMS("[PLANE:%d:%s] scaling with color key not allowed",
   6103   1.1  riastrad 			      intel_plane->base.base.id,
   6104   1.1  riastrad 			      intel_plane->base.name);
   6105   1.1  riastrad 		return -EINVAL;
   6106   1.1  riastrad 	}
   6107   1.1  riastrad 
   6108   1.1  riastrad 	/* Check src format */
   6109   1.1  riastrad 	switch (fb->format->format) {
   6110   1.1  riastrad 	case DRM_FORMAT_RGB565:
   6111   1.1  riastrad 	case DRM_FORMAT_XBGR8888:
   6112   1.1  riastrad 	case DRM_FORMAT_XRGB8888:
   6113   1.1  riastrad 	case DRM_FORMAT_ABGR8888:
   6114   1.1  riastrad 	case DRM_FORMAT_ARGB8888:
   6115   1.1  riastrad 	case DRM_FORMAT_XRGB2101010:
   6116   1.1  riastrad 	case DRM_FORMAT_XBGR2101010:
   6117   1.1  riastrad 	case DRM_FORMAT_ARGB2101010:
   6118   1.1  riastrad 	case DRM_FORMAT_ABGR2101010:
   6119   1.1  riastrad 	case DRM_FORMAT_YUYV:
   6120   1.1  riastrad 	case DRM_FORMAT_YVYU:
   6121   1.1  riastrad 	case DRM_FORMAT_UYVY:
   6122   1.1  riastrad 	case DRM_FORMAT_VYUY:
   6123   1.1  riastrad 	case DRM_FORMAT_NV12:
   6124   1.1  riastrad 	case DRM_FORMAT_P010:
   6125   1.1  riastrad 	case DRM_FORMAT_P012:
   6126   1.1  riastrad 	case DRM_FORMAT_P016:
   6127   1.1  riastrad 	case DRM_FORMAT_Y210:
   6128   1.1  riastrad 	case DRM_FORMAT_Y212:
   6129   1.1  riastrad 	case DRM_FORMAT_Y216:
   6130   1.1  riastrad 	case DRM_FORMAT_XVYU2101010:
   6131   1.1  riastrad 	case DRM_FORMAT_XVYU12_16161616:
   6132   1.1  riastrad 	case DRM_FORMAT_XVYU16161616:
   6133   1.1  riastrad 		break;
   6134   1.1  riastrad 	case DRM_FORMAT_XBGR16161616F:
   6135   1.1  riastrad 	case DRM_FORMAT_ABGR16161616F:
   6136   1.1  riastrad 	case DRM_FORMAT_XRGB16161616F:
   6137   1.1  riastrad 	case DRM_FORMAT_ARGB16161616F:
   6138   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 11)
   6139   1.1  riastrad 			break;
   6140   1.1  riastrad 		/* fall through */
   6141   1.1  riastrad 	default:
   6142   1.1  riastrad 		DRM_DEBUG_KMS("[PLANE:%d:%s] FB:%d unsupported scaling format 0x%x\n",
   6143   1.1  riastrad 			      intel_plane->base.base.id, intel_plane->base.name,
   6144   1.1  riastrad 			      fb->base.id, fb->format->format);
   6145   1.1  riastrad 		return -EINVAL;
   6146   1.1  riastrad 	}
   6147   1.1  riastrad 
   6148   1.1  riastrad 	return 0;
   6149   1.1  riastrad }
   6150   1.1  riastrad 
   6151   1.1  riastrad void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state)
   6152   1.1  riastrad {
   6153   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   6154   1.1  riastrad 	int i;
   6155   1.1  riastrad 
   6156   1.1  riastrad 	for (i = 0; i < crtc->num_scalers; i++)
   6157   1.1  riastrad 		skl_detach_scaler(crtc, i);
   6158   1.1  riastrad }
   6159   1.1  riastrad 
   6160   1.1  riastrad static void skl_pfit_enable(const struct intel_crtc_state *crtc_state)
   6161   1.1  riastrad {
   6162   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6163   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6164   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6165   1.1  riastrad 	const struct intel_crtc_scaler_state *scaler_state =
   6166   1.1  riastrad 		&crtc_state->scaler_state;
   6167   1.1  riastrad 
   6168   1.1  riastrad 	if (crtc_state->pch_pfit.enabled) {
   6169   1.1  riastrad 		u16 uv_rgb_hphase, uv_rgb_vphase;
   6170   1.1  riastrad 		int pfit_w, pfit_h, hscale, vscale;
   6171   1.1  riastrad 		int id;
   6172   1.1  riastrad 
   6173   1.1  riastrad 		if (WARN_ON(crtc_state->scaler_state.scaler_id < 0))
   6174   1.1  riastrad 			return;
   6175   1.1  riastrad 
   6176   1.1  riastrad 		pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
   6177   1.1  riastrad 		pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
   6178   1.1  riastrad 
   6179   1.1  riastrad 		hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
   6180   1.1  riastrad 		vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
   6181   1.1  riastrad 
   6182   1.1  riastrad 		uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
   6183   1.1  riastrad 		uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
   6184   1.1  riastrad 
   6185   1.1  riastrad 		id = scaler_state->scaler_id;
   6186   1.1  riastrad 		I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
   6187   1.1  riastrad 			PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
   6188   1.1  riastrad 		I915_WRITE_FW(SKL_PS_VPHASE(pipe, id),
   6189   1.1  riastrad 			      PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
   6190   1.1  riastrad 		I915_WRITE_FW(SKL_PS_HPHASE(pipe, id),
   6191   1.1  riastrad 			      PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
   6192   1.1  riastrad 		I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc_state->pch_pfit.pos);
   6193   1.1  riastrad 		I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc_state->pch_pfit.size);
   6194   1.1  riastrad 	}
   6195   1.1  riastrad }
   6196   1.1  riastrad 
   6197   1.1  riastrad static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
   6198   1.1  riastrad {
   6199   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6200   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6201   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6202   1.1  riastrad 
   6203   1.1  riastrad 	if (crtc_state->pch_pfit.enabled) {
   6204   1.1  riastrad 		/* Force use of hard-coded filter coefficients
   6205   1.1  riastrad 		 * as some pre-programmed values are broken,
   6206   1.1  riastrad 		 * e.g. x201.
   6207   1.1  riastrad 		 */
   6208   1.1  riastrad 		if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
   6209   1.1  riastrad 			I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 |
   6210   1.1  riastrad 						 PF_PIPE_SEL_IVB(pipe));
   6211   1.1  riastrad 		else
   6212   1.1  riastrad 			I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
   6213   1.1  riastrad 		I915_WRITE(PF_WIN_POS(pipe), crtc_state->pch_pfit.pos);
   6214   1.1  riastrad 		I915_WRITE(PF_WIN_SZ(pipe), crtc_state->pch_pfit.size);
   6215   1.1  riastrad 	}
   6216   1.1  riastrad }
   6217   1.1  riastrad 
   6218   1.1  riastrad void hsw_enable_ips(const struct intel_crtc_state *crtc_state)
   6219   1.1  riastrad {
   6220   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6221   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   6222   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   6223   1.1  riastrad 
   6224   1.1  riastrad 	if (!crtc_state->ips_enabled)
   6225   1.1  riastrad 		return;
   6226   1.1  riastrad 
   6227   1.1  riastrad 	/*
   6228   1.1  riastrad 	 * We can only enable IPS after we enable a plane and wait for a vblank
   6229   1.1  riastrad 	 * This function is called from post_plane_update, which is run after
   6230   1.1  riastrad 	 * a vblank wait.
   6231   1.1  riastrad 	 */
   6232   1.1  riastrad 	WARN_ON(!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)));
   6233   1.1  riastrad 
   6234   1.1  riastrad 	if (IS_BROADWELL(dev_priv)) {
   6235   1.1  riastrad 		WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL,
   6236   1.1  riastrad 						IPS_ENABLE | IPS_PCODE_CONTROL));
   6237   1.1  riastrad 		/* Quoting Art Runyan: "its not safe to expect any particular
   6238   1.1  riastrad 		 * value in IPS_CTL bit 31 after enabling IPS through the
   6239   1.1  riastrad 		 * mailbox." Moreover, the mailbox may return a bogus state,
   6240   1.1  riastrad 		 * so we need to just enable it and continue on.
   6241   1.1  riastrad 		 */
   6242   1.1  riastrad 	} else {
   6243   1.1  riastrad 		I915_WRITE(IPS_CTL, IPS_ENABLE);
   6244   1.1  riastrad 		/* The bit only becomes 1 in the next vblank, so this wait here
   6245   1.1  riastrad 		 * is essentially intel_wait_for_vblank. If we don't have this
   6246   1.1  riastrad 		 * and don't wait for vblanks until the end of crtc_enable, then
   6247   1.1  riastrad 		 * the HW state readout code will complain that the expected
   6248   1.1  riastrad 		 * IPS_CTL value is not the one we read. */
   6249   1.1  riastrad 		if (intel_de_wait_for_set(dev_priv, IPS_CTL, IPS_ENABLE, 50))
   6250   1.1  riastrad 			DRM_ERROR("Timed out waiting for IPS enable\n");
   6251   1.1  riastrad 	}
   6252   1.1  riastrad }
   6253   1.1  riastrad 
   6254   1.1  riastrad void hsw_disable_ips(const struct intel_crtc_state *crtc_state)
   6255   1.1  riastrad {
   6256   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6257   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   6258   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   6259   1.1  riastrad 
   6260   1.1  riastrad 	if (!crtc_state->ips_enabled)
   6261   1.1  riastrad 		return;
   6262   1.1  riastrad 
   6263   1.1  riastrad 	if (IS_BROADWELL(dev_priv)) {
   6264   1.1  riastrad 		WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));
   6265   1.1  riastrad 		/*
   6266   1.1  riastrad 		 * Wait for PCODE to finish disabling IPS. The BSpec specified
   6267   1.1  riastrad 		 * 42ms timeout value leads to occasional timeouts so use 100ms
   6268   1.1  riastrad 		 * instead.
   6269   1.1  riastrad 		 */
   6270   1.1  riastrad 		if (intel_de_wait_for_clear(dev_priv, IPS_CTL, IPS_ENABLE, 100))
   6271   1.1  riastrad 			DRM_ERROR("Timed out waiting for IPS disable\n");
   6272   1.1  riastrad 	} else {
   6273   1.1  riastrad 		I915_WRITE(IPS_CTL, 0);
   6274   1.1  riastrad 		POSTING_READ(IPS_CTL);
   6275   1.1  riastrad 	}
   6276   1.1  riastrad 
   6277   1.1  riastrad 	/* We need to wait for a vblank before we can disable the plane. */
   6278   1.1  riastrad 	intel_wait_for_vblank(dev_priv, crtc->pipe);
   6279   1.1  riastrad }
   6280   1.1  riastrad 
   6281   1.1  riastrad static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc)
   6282   1.1  riastrad {
   6283   1.1  riastrad 	if (intel_crtc->overlay)
   6284   1.1  riastrad 		(void) intel_overlay_switch_off(intel_crtc->overlay);
   6285   1.1  riastrad 
   6286   1.1  riastrad 	/* Let userspace switch the overlay on again. In most cases userspace
   6287   1.1  riastrad 	 * has to recompute where to put it anyway.
   6288   1.1  riastrad 	 */
   6289   1.1  riastrad }
   6290   1.1  riastrad 
   6291   1.1  riastrad static bool hsw_pre_update_disable_ips(const struct intel_crtc_state *old_crtc_state,
   6292   1.1  riastrad 				       const struct intel_crtc_state *new_crtc_state)
   6293   1.1  riastrad {
   6294   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   6295   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6296   1.1  riastrad 
   6297   1.1  riastrad 	if (!old_crtc_state->ips_enabled)
   6298   1.1  riastrad 		return false;
   6299   1.1  riastrad 
   6300   1.1  riastrad 	if (needs_modeset(new_crtc_state))
   6301   1.1  riastrad 		return true;
   6302   1.1  riastrad 
   6303   1.1  riastrad 	/*
   6304   1.1  riastrad 	 * Workaround : Do not read or write the pipe palette/gamma data while
   6305   1.1  riastrad 	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
   6306   1.1  riastrad 	 *
   6307   1.1  riastrad 	 * Disable IPS before we program the LUT.
   6308   1.1  riastrad 	 */
   6309   1.1  riastrad 	if (IS_HASWELL(dev_priv) &&
   6310   1.1  riastrad 	    (new_crtc_state->uapi.color_mgmt_changed ||
   6311   1.1  riastrad 	     new_crtc_state->update_pipe) &&
   6312   1.1  riastrad 	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
   6313   1.1  riastrad 		return true;
   6314   1.1  riastrad 
   6315   1.1  riastrad 	return !new_crtc_state->ips_enabled;
   6316   1.1  riastrad }
   6317   1.1  riastrad 
   6318   1.1  riastrad static bool hsw_post_update_enable_ips(const struct intel_crtc_state *old_crtc_state,
   6319   1.1  riastrad 				       const struct intel_crtc_state *new_crtc_state)
   6320   1.1  riastrad {
   6321   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   6322   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6323   1.1  riastrad 
   6324   1.1  riastrad 	if (!new_crtc_state->ips_enabled)
   6325   1.1  riastrad 		return false;
   6326   1.1  riastrad 
   6327   1.1  riastrad 	if (needs_modeset(new_crtc_state))
   6328   1.1  riastrad 		return true;
   6329   1.1  riastrad 
   6330   1.1  riastrad 	/*
   6331   1.1  riastrad 	 * Workaround : Do not read or write the pipe palette/gamma data while
   6332   1.1  riastrad 	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
   6333   1.1  riastrad 	 *
   6334   1.1  riastrad 	 * Re-enable IPS after the LUT has been programmed.
   6335   1.1  riastrad 	 */
   6336   1.1  riastrad 	if (IS_HASWELL(dev_priv) &&
   6337   1.1  riastrad 	    (new_crtc_state->uapi.color_mgmt_changed ||
   6338   1.1  riastrad 	     new_crtc_state->update_pipe) &&
   6339   1.1  riastrad 	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
   6340   1.1  riastrad 		return true;
   6341   1.1  riastrad 
   6342   1.1  riastrad 	/*
   6343   1.1  riastrad 	 * We can't read out IPS on broadwell, assume the worst and
   6344   1.1  riastrad 	 * forcibly enable IPS on the first fastset.
   6345   1.1  riastrad 	 */
   6346   1.1  riastrad 	if (new_crtc_state->update_pipe &&
   6347   1.1  riastrad 	    old_crtc_state->hw.adjusted_mode.private_flags & I915_MODE_FLAG_INHERITED)
   6348   1.1  riastrad 		return true;
   6349   1.1  riastrad 
   6350   1.1  riastrad 	return !old_crtc_state->ips_enabled;
   6351   1.1  riastrad }
   6352   1.1  riastrad 
   6353   1.1  riastrad static bool needs_nv12_wa(const struct intel_crtc_state *crtc_state)
   6354   1.1  riastrad {
   6355   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   6356   1.1  riastrad 
   6357   1.1  riastrad 	if (!crtc_state->nv12_planes)
   6358   1.1  riastrad 		return false;
   6359   1.1  riastrad 
   6360   1.1  riastrad 	/* WA Display #0827: Gen9:all */
   6361   1.1  riastrad 	if (IS_GEN(dev_priv, 9) && !IS_GEMINILAKE(dev_priv))
   6362   1.1  riastrad 		return true;
   6363   1.1  riastrad 
   6364   1.1  riastrad 	return false;
   6365   1.1  riastrad }
   6366   1.1  riastrad 
   6367   1.1  riastrad static bool needs_scalerclk_wa(const struct intel_crtc_state *crtc_state)
   6368   1.1  riastrad {
   6369   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   6370   1.1  riastrad 
   6371   1.1  riastrad 	/* Wa_2006604312:icl */
   6372   1.1  riastrad 	if (crtc_state->scaler_state.scaler_users > 0 && IS_ICELAKE(dev_priv))
   6373   1.1  riastrad 		return true;
   6374   1.1  riastrad 
   6375   1.1  riastrad 	return false;
   6376   1.1  riastrad }
   6377   1.1  riastrad 
   6378   1.1  riastrad static bool planes_enabling(const struct intel_crtc_state *old_crtc_state,
   6379   1.1  riastrad 			    const struct intel_crtc_state *new_crtc_state)
   6380   1.1  riastrad {
   6381   1.1  riastrad 	return (!old_crtc_state->active_planes || needs_modeset(new_crtc_state)) &&
   6382   1.1  riastrad 		new_crtc_state->active_planes;
   6383   1.1  riastrad }
   6384   1.1  riastrad 
   6385   1.1  riastrad static bool planes_disabling(const struct intel_crtc_state *old_crtc_state,
   6386   1.1  riastrad 			     const struct intel_crtc_state *new_crtc_state)
   6387   1.1  riastrad {
   6388   1.1  riastrad 	return old_crtc_state->active_planes &&
   6389   1.1  riastrad 		(!new_crtc_state->active_planes || needs_modeset(new_crtc_state));
   6390   1.1  riastrad }
   6391   1.1  riastrad 
   6392   1.1  riastrad static void intel_post_plane_update(struct intel_atomic_state *state,
   6393   1.1  riastrad 				    struct intel_crtc *crtc)
   6394   1.1  riastrad {
   6395   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   6396   1.1  riastrad 	struct intel_plane *primary = to_intel_plane(crtc->base.primary);
   6397   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   6398   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   6399   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   6400   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6401   1.1  riastrad 	const struct intel_plane_state *new_primary_state =
   6402   1.1  riastrad 		intel_atomic_get_new_plane_state(state, primary);
   6403   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6404   1.1  riastrad 
   6405   1.1  riastrad 	intel_frontbuffer_flip(dev_priv, new_crtc_state->fb_bits);
   6406   1.1  riastrad 
   6407   1.1  riastrad 	if (new_crtc_state->update_wm_post && new_crtc_state->hw.active)
   6408   1.1  riastrad 		intel_update_watermarks(crtc);
   6409   1.1  riastrad 
   6410   1.1  riastrad 	if (hsw_post_update_enable_ips(old_crtc_state, new_crtc_state))
   6411   1.1  riastrad 		hsw_enable_ips(new_crtc_state);
   6412   1.1  riastrad 
   6413   1.1  riastrad 	if (new_primary_state)
   6414   1.1  riastrad 		intel_fbc_post_update(crtc);
   6415   1.1  riastrad 
   6416   1.1  riastrad 	if (needs_nv12_wa(old_crtc_state) &&
   6417   1.1  riastrad 	    !needs_nv12_wa(new_crtc_state))
   6418   1.1  riastrad 		skl_wa_827(dev_priv, pipe, false);
   6419   1.1  riastrad 
   6420   1.1  riastrad 	if (needs_scalerclk_wa(old_crtc_state) &&
   6421   1.1  riastrad 	    !needs_scalerclk_wa(new_crtc_state))
   6422   1.1  riastrad 		icl_wa_scalerclkgating(dev_priv, pipe, false);
   6423   1.1  riastrad }
   6424   1.1  riastrad 
   6425   1.1  riastrad static void intel_pre_plane_update(struct intel_atomic_state *state,
   6426   1.1  riastrad 				   struct intel_crtc *crtc)
   6427   1.1  riastrad {
   6428   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   6429   1.1  riastrad 	struct intel_plane *primary = to_intel_plane(crtc->base.primary);
   6430   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   6431   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   6432   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   6433   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6434   1.1  riastrad 	const struct intel_plane_state *new_primary_state =
   6435   1.1  riastrad 		intel_atomic_get_new_plane_state(state, primary);
   6436   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6437   1.1  riastrad 
   6438   1.1  riastrad 	if (hsw_pre_update_disable_ips(old_crtc_state, new_crtc_state))
   6439   1.1  riastrad 		hsw_disable_ips(old_crtc_state);
   6440   1.1  riastrad 
   6441   1.1  riastrad 	if (new_primary_state &&
   6442   1.1  riastrad 	    intel_fbc_pre_update(crtc, new_crtc_state, new_primary_state))
   6443   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   6444   1.1  riastrad 
   6445   1.1  riastrad 	/* Display WA 827 */
   6446   1.1  riastrad 	if (!needs_nv12_wa(old_crtc_state) &&
   6447   1.1  riastrad 	    needs_nv12_wa(new_crtc_state))
   6448   1.1  riastrad 		skl_wa_827(dev_priv, pipe, true);
   6449   1.1  riastrad 
   6450   1.1  riastrad 	/* Wa_2006604312:icl */
   6451   1.1  riastrad 	if (!needs_scalerclk_wa(old_crtc_state) &&
   6452   1.1  riastrad 	    needs_scalerclk_wa(new_crtc_state))
   6453   1.1  riastrad 		icl_wa_scalerclkgating(dev_priv, pipe, true);
   6454   1.1  riastrad 
   6455   1.1  riastrad 	/*
   6456   1.1  riastrad 	 * Vblank time updates from the shadow to live plane control register
   6457   1.1  riastrad 	 * are blocked if the memory self-refresh mode is active at that
   6458   1.1  riastrad 	 * moment. So to make sure the plane gets truly disabled, disable
   6459   1.1  riastrad 	 * first the self-refresh mode. The self-refresh enable bit in turn
   6460   1.1  riastrad 	 * will be checked/applied by the HW only at the next frame start
   6461   1.1  riastrad 	 * event which is after the vblank start event, so we need to have a
   6462   1.1  riastrad 	 * wait-for-vblank between disabling the plane and the pipe.
   6463   1.1  riastrad 	 */
   6464   1.1  riastrad 	if (HAS_GMCH(dev_priv) && old_crtc_state->hw.active &&
   6465   1.1  riastrad 	    new_crtc_state->disable_cxsr && intel_set_memory_cxsr(dev_priv, false))
   6466   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   6467   1.1  riastrad 
   6468   1.1  riastrad 	/*
   6469   1.1  riastrad 	 * IVB workaround: must disable low power watermarks for at least
   6470   1.1  riastrad 	 * one frame before enabling scaling.  LP watermarks can be re-enabled
   6471   1.1  riastrad 	 * when scaling is disabled.
   6472   1.1  riastrad 	 *
   6473   1.1  riastrad 	 * WaCxSRDisabledForSpriteScaling:ivb
   6474   1.1  riastrad 	 */
   6475   1.1  riastrad 	if (old_crtc_state->hw.active &&
   6476   1.1  riastrad 	    new_crtc_state->disable_lp_wm && ilk_disable_lp_wm(dev_priv))
   6477   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   6478   1.1  riastrad 
   6479   1.1  riastrad 	/*
   6480   1.1  riastrad 	 * If we're doing a modeset we don't need to do any
   6481   1.1  riastrad 	 * pre-vblank watermark programming here.
   6482   1.1  riastrad 	 */
   6483   1.1  riastrad 	if (!needs_modeset(new_crtc_state)) {
   6484   1.1  riastrad 		/*
   6485   1.1  riastrad 		 * For platforms that support atomic watermarks, program the
   6486   1.1  riastrad 		 * 'intermediate' watermarks immediately.  On pre-gen9 platforms, these
   6487   1.1  riastrad 		 * will be the intermediate values that are safe for both pre- and
   6488   1.1  riastrad 		 * post- vblank; when vblank happens, the 'active' values will be set
   6489   1.1  riastrad 		 * to the final 'target' values and we'll do this again to get the
   6490   1.1  riastrad 		 * optimal watermarks.  For gen9+ platforms, the values we program here
   6491   1.1  riastrad 		 * will be the final target values which will get automatically latched
   6492   1.1  riastrad 		 * at vblank time; no further programming will be necessary.
   6493   1.1  riastrad 		 *
   6494   1.1  riastrad 		 * If a platform hasn't been transitioned to atomic watermarks yet,
   6495   1.1  riastrad 		 * we'll continue to update watermarks the old way, if flags tell
   6496   1.1  riastrad 		 * us to.
   6497   1.1  riastrad 		 */
   6498   1.1  riastrad 		if (dev_priv->display.initial_watermarks)
   6499   1.1  riastrad 			dev_priv->display.initial_watermarks(state, crtc);
   6500   1.1  riastrad 		else if (new_crtc_state->update_wm_pre)
   6501   1.1  riastrad 			intel_update_watermarks(crtc);
   6502   1.1  riastrad 	}
   6503   1.1  riastrad 
   6504   1.1  riastrad 	/*
   6505   1.1  riastrad 	 * Gen2 reports pipe underruns whenever all planes are disabled.
   6506   1.1  riastrad 	 * So disable underrun reporting before all the planes get disabled.
   6507   1.1  riastrad 	 *
   6508   1.1  riastrad 	 * We do this after .initial_watermarks() so that we have a
   6509   1.1  riastrad 	 * chance of catching underruns with the intermediate watermarks
   6510   1.1  riastrad 	 * vs. the old plane configuration.
   6511   1.1  riastrad 	 */
   6512   1.1  riastrad 	if (IS_GEN(dev_priv, 2) && planes_disabling(old_crtc_state, new_crtc_state))
   6513   1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
   6514   1.1  riastrad }
   6515   1.1  riastrad 
   6516   1.1  riastrad static void intel_crtc_disable_planes(struct intel_atomic_state *state,
   6517   1.1  riastrad 				      struct intel_crtc *crtc)
   6518   1.1  riastrad {
   6519   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6520   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   6521   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6522   1.1  riastrad 	unsigned int update_mask = new_crtc_state->update_planes;
   6523   1.1  riastrad 	const struct intel_plane_state *old_plane_state;
   6524   1.1  riastrad 	struct intel_plane *plane;
   6525   1.1  riastrad 	unsigned fb_bits = 0;
   6526   1.1  riastrad 	int i;
   6527   1.1  riastrad 
   6528   1.1  riastrad 	intel_crtc_dpms_overlay_disable(crtc);
   6529   1.1  riastrad 
   6530   1.1  riastrad 	for_each_old_intel_plane_in_state(state, plane, old_plane_state, i) {
   6531   1.1  riastrad 		if (crtc->pipe != plane->pipe ||
   6532   1.1  riastrad 		    !(update_mask & BIT(plane->id)))
   6533   1.1  riastrad 			continue;
   6534   1.1  riastrad 
   6535   1.1  riastrad 		intel_disable_plane(plane, new_crtc_state);
   6536   1.1  riastrad 
   6537   1.1  riastrad 		if (old_plane_state->uapi.visible)
   6538   1.1  riastrad 			fb_bits |= plane->frontbuffer_bit;
   6539   1.1  riastrad 	}
   6540   1.1  riastrad 
   6541   1.1  riastrad 	intel_frontbuffer_flip(dev_priv, fb_bits);
   6542   1.1  riastrad }
   6543   1.1  riastrad 
   6544   1.1  riastrad /*
   6545   1.1  riastrad  * intel_connector_primary_encoder - get the primary encoder for a connector
   6546   1.1  riastrad  * @connector: connector for which to return the encoder
   6547   1.1  riastrad  *
   6548   1.1  riastrad  * Returns the primary encoder for a connector. There is a 1:1 mapping from
   6549   1.1  riastrad  * all connectors to their encoder, except for DP-MST connectors which have
   6550   1.1  riastrad  * both a virtual and a primary encoder. These DP-MST primary encoders can be
   6551   1.1  riastrad  * pointed to by as many DP-MST connectors as there are pipes.
   6552   1.1  riastrad  */
   6553   1.1  riastrad static struct intel_encoder *
   6554   1.1  riastrad intel_connector_primary_encoder(struct intel_connector *connector)
   6555   1.1  riastrad {
   6556   1.1  riastrad 	struct intel_encoder *encoder;
   6557   1.1  riastrad 
   6558   1.1  riastrad 	if (connector->mst_port)
   6559   1.1  riastrad 		return &dp_to_dig_port(connector->mst_port)->base;
   6560   1.1  riastrad 
   6561   1.1  riastrad 	encoder = intel_attached_encoder(connector);
   6562   1.1  riastrad 	WARN_ON(!encoder);
   6563   1.1  riastrad 
   6564   1.1  riastrad 	return encoder;
   6565   1.1  riastrad }
   6566   1.1  riastrad 
   6567   1.1  riastrad static void intel_encoders_update_prepare(struct intel_atomic_state *state)
   6568   1.1  riastrad {
   6569   1.1  riastrad 	struct drm_connector_state *new_conn_state;
   6570   1.1  riastrad 	struct drm_connector *connector;
   6571   1.1  riastrad 	int i;
   6572   1.1  riastrad 
   6573   1.1  riastrad 	for_each_new_connector_in_state(&state->base, connector, new_conn_state,
   6574   1.1  riastrad 					i) {
   6575   1.1  riastrad 		struct intel_connector *intel_connector;
   6576   1.1  riastrad 		struct intel_encoder *encoder;
   6577   1.1  riastrad 		struct intel_crtc *crtc;
   6578   1.1  riastrad 
   6579   1.1  riastrad 		if (!intel_connector_needs_modeset(state, connector))
   6580   1.1  riastrad 			continue;
   6581   1.1  riastrad 
   6582   1.1  riastrad 		intel_connector = to_intel_connector(connector);
   6583   1.1  riastrad 		encoder = intel_connector_primary_encoder(intel_connector);
   6584   1.1  riastrad 		if (!encoder->update_prepare)
   6585   1.1  riastrad 			continue;
   6586   1.1  riastrad 
   6587   1.1  riastrad 		crtc = new_conn_state->crtc ?
   6588   1.1  riastrad 			to_intel_crtc(new_conn_state->crtc) : NULL;
   6589   1.1  riastrad 		encoder->update_prepare(state, encoder, crtc);
   6590   1.1  riastrad 	}
   6591   1.1  riastrad }
   6592   1.1  riastrad 
   6593   1.1  riastrad static void intel_encoders_update_complete(struct intel_atomic_state *state)
   6594   1.1  riastrad {
   6595   1.1  riastrad 	struct drm_connector_state *new_conn_state;
   6596   1.1  riastrad 	struct drm_connector *connector;
   6597   1.1  riastrad 	int i;
   6598   1.1  riastrad 
   6599   1.1  riastrad 	for_each_new_connector_in_state(&state->base, connector, new_conn_state,
   6600   1.1  riastrad 					i) {
   6601   1.1  riastrad 		struct intel_connector *intel_connector;
   6602   1.1  riastrad 		struct intel_encoder *encoder;
   6603   1.1  riastrad 		struct intel_crtc *crtc;
   6604   1.1  riastrad 
   6605   1.1  riastrad 		if (!intel_connector_needs_modeset(state, connector))
   6606   1.1  riastrad 			continue;
   6607   1.1  riastrad 
   6608   1.1  riastrad 		intel_connector = to_intel_connector(connector);
   6609   1.1  riastrad 		encoder = intel_connector_primary_encoder(intel_connector);
   6610   1.1  riastrad 		if (!encoder->update_complete)
   6611   1.1  riastrad 			continue;
   6612   1.1  riastrad 
   6613   1.1  riastrad 		crtc = new_conn_state->crtc ?
   6614   1.1  riastrad 			to_intel_crtc(new_conn_state->crtc) : NULL;
   6615   1.1  riastrad 		encoder->update_complete(state, encoder, crtc);
   6616   1.1  riastrad 	}
   6617   1.1  riastrad }
   6618   1.1  riastrad 
   6619   1.1  riastrad static void intel_encoders_pre_pll_enable(struct intel_atomic_state *state,
   6620   1.1  riastrad 					  struct intel_crtc *crtc)
   6621   1.1  riastrad {
   6622   1.1  riastrad 	const struct intel_crtc_state *crtc_state =
   6623   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6624   1.1  riastrad 	const struct drm_connector_state *conn_state;
   6625   1.1  riastrad 	struct drm_connector *conn;
   6626   1.1  riastrad 	int i;
   6627   1.1  riastrad 
   6628   1.1  riastrad 	for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   6629   1.1  riastrad 		struct intel_encoder *encoder =
   6630   1.1  riastrad 			to_intel_encoder(conn_state->best_encoder);
   6631   1.1  riastrad 
   6632   1.1  riastrad 		if (conn_state->crtc != &crtc->base)
   6633   1.1  riastrad 			continue;
   6634   1.1  riastrad 
   6635   1.1  riastrad 		if (encoder->pre_pll_enable)
   6636   1.1  riastrad 			encoder->pre_pll_enable(encoder, crtc_state, conn_state);
   6637   1.1  riastrad 	}
   6638   1.1  riastrad }
   6639   1.1  riastrad 
   6640   1.1  riastrad static void intel_encoders_pre_enable(struct intel_atomic_state *state,
   6641   1.1  riastrad 				      struct intel_crtc *crtc)
   6642   1.1  riastrad {
   6643   1.1  riastrad 	const struct intel_crtc_state *crtc_state =
   6644   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6645   1.1  riastrad 	const struct drm_connector_state *conn_state;
   6646   1.1  riastrad 	struct drm_connector *conn;
   6647   1.1  riastrad 	int i;
   6648   1.1  riastrad 
   6649   1.1  riastrad 	for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   6650   1.1  riastrad 		struct intel_encoder *encoder =
   6651   1.1  riastrad 			to_intel_encoder(conn_state->best_encoder);
   6652   1.1  riastrad 
   6653   1.1  riastrad 		if (conn_state->crtc != &crtc->base)
   6654   1.1  riastrad 			continue;
   6655   1.1  riastrad 
   6656   1.1  riastrad 		if (encoder->pre_enable)
   6657   1.1  riastrad 			encoder->pre_enable(encoder, crtc_state, conn_state);
   6658   1.1  riastrad 	}
   6659   1.1  riastrad }
   6660   1.1  riastrad 
   6661   1.1  riastrad static void intel_encoders_enable(struct intel_atomic_state *state,
   6662   1.1  riastrad 				  struct intel_crtc *crtc)
   6663   1.1  riastrad {
   6664   1.1  riastrad 	const struct intel_crtc_state *crtc_state =
   6665   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6666   1.1  riastrad 	const struct drm_connector_state *conn_state;
   6667   1.1  riastrad 	struct drm_connector *conn;
   6668   1.1  riastrad 	int i;
   6669   1.1  riastrad 
   6670   1.1  riastrad 	for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   6671   1.1  riastrad 		struct intel_encoder *encoder =
   6672   1.1  riastrad 			to_intel_encoder(conn_state->best_encoder);
   6673   1.1  riastrad 
   6674   1.1  riastrad 		if (conn_state->crtc != &crtc->base)
   6675   1.1  riastrad 			continue;
   6676   1.1  riastrad 
   6677   1.1  riastrad 		if (encoder->enable)
   6678   1.1  riastrad 			encoder->enable(encoder, crtc_state, conn_state);
   6679   1.1  riastrad 		intel_opregion_notify_encoder(encoder, true);
   6680   1.1  riastrad 	}
   6681   1.1  riastrad }
   6682   1.1  riastrad 
   6683   1.1  riastrad static void intel_encoders_disable(struct intel_atomic_state *state,
   6684   1.1  riastrad 				   struct intel_crtc *crtc)
   6685   1.1  riastrad {
   6686   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   6687   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   6688   1.1  riastrad 	const struct drm_connector_state *old_conn_state;
   6689   1.1  riastrad 	struct drm_connector *conn;
   6690   1.1  riastrad 	int i;
   6691   1.1  riastrad 
   6692   1.1  riastrad 	for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
   6693   1.1  riastrad 		struct intel_encoder *encoder =
   6694   1.1  riastrad 			to_intel_encoder(old_conn_state->best_encoder);
   6695   1.1  riastrad 
   6696   1.1  riastrad 		if (old_conn_state->crtc != &crtc->base)
   6697   1.1  riastrad 			continue;
   6698   1.1  riastrad 
   6699   1.1  riastrad 		intel_opregion_notify_encoder(encoder, false);
   6700   1.1  riastrad 		if (encoder->disable)
   6701   1.1  riastrad 			encoder->disable(encoder, old_crtc_state, old_conn_state);
   6702   1.1  riastrad 	}
   6703   1.1  riastrad }
   6704   1.1  riastrad 
   6705   1.1  riastrad static void intel_encoders_post_disable(struct intel_atomic_state *state,
   6706   1.1  riastrad 					struct intel_crtc *crtc)
   6707   1.1  riastrad {
   6708   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   6709   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   6710   1.1  riastrad 	const struct drm_connector_state *old_conn_state;
   6711   1.1  riastrad 	struct drm_connector *conn;
   6712   1.1  riastrad 	int i;
   6713   1.1  riastrad 
   6714   1.1  riastrad 	for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
   6715   1.1  riastrad 		struct intel_encoder *encoder =
   6716   1.1  riastrad 			to_intel_encoder(old_conn_state->best_encoder);
   6717   1.1  riastrad 
   6718   1.1  riastrad 		if (old_conn_state->crtc != &crtc->base)
   6719   1.1  riastrad 			continue;
   6720   1.1  riastrad 
   6721   1.1  riastrad 		if (encoder->post_disable)
   6722   1.1  riastrad 			encoder->post_disable(encoder, old_crtc_state, old_conn_state);
   6723   1.1  riastrad 	}
   6724   1.1  riastrad }
   6725   1.1  riastrad 
   6726   1.1  riastrad static void intel_encoders_post_pll_disable(struct intel_atomic_state *state,
   6727   1.1  riastrad 					    struct intel_crtc *crtc)
   6728   1.1  riastrad {
   6729   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   6730   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   6731   1.1  riastrad 	const struct drm_connector_state *old_conn_state;
   6732   1.1  riastrad 	struct drm_connector *conn;
   6733   1.1  riastrad 	int i;
   6734   1.1  riastrad 
   6735   1.1  riastrad 	for_each_old_connector_in_state(&state->base, conn, old_conn_state, i) {
   6736   1.1  riastrad 		struct intel_encoder *encoder =
   6737   1.1  riastrad 			to_intel_encoder(old_conn_state->best_encoder);
   6738   1.1  riastrad 
   6739   1.1  riastrad 		if (old_conn_state->crtc != &crtc->base)
   6740   1.1  riastrad 			continue;
   6741   1.1  riastrad 
   6742   1.1  riastrad 		if (encoder->post_pll_disable)
   6743   1.1  riastrad 			encoder->post_pll_disable(encoder, old_crtc_state, old_conn_state);
   6744   1.1  riastrad 	}
   6745   1.1  riastrad }
   6746   1.1  riastrad 
   6747   1.1  riastrad static void intel_encoders_update_pipe(struct intel_atomic_state *state,
   6748   1.1  riastrad 				       struct intel_crtc *crtc)
   6749   1.1  riastrad {
   6750   1.1  riastrad 	const struct intel_crtc_state *crtc_state =
   6751   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6752   1.1  riastrad 	const struct drm_connector_state *conn_state;
   6753   1.1  riastrad 	struct drm_connector *conn;
   6754   1.1  riastrad 	int i;
   6755   1.1  riastrad 
   6756   1.1  riastrad 	for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   6757   1.1  riastrad 		struct intel_encoder *encoder =
   6758   1.1  riastrad 			to_intel_encoder(conn_state->best_encoder);
   6759   1.1  riastrad 
   6760   1.1  riastrad 		if (conn_state->crtc != &crtc->base)
   6761   1.1  riastrad 			continue;
   6762   1.1  riastrad 
   6763   1.1  riastrad 		if (encoder->update_pipe)
   6764   1.1  riastrad 			encoder->update_pipe(encoder, crtc_state, conn_state);
   6765   1.1  riastrad 	}
   6766   1.1  riastrad }
   6767   1.1  riastrad 
   6768   1.1  riastrad static void intel_disable_primary_plane(const struct intel_crtc_state *crtc_state)
   6769   1.1  riastrad {
   6770   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6771   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
   6772   1.1  riastrad 
   6773   1.1  riastrad 	plane->disable_plane(plane, crtc_state);
   6774   1.1  riastrad }
   6775   1.1  riastrad 
   6776   1.1  riastrad static void ilk_crtc_enable(struct intel_atomic_state *state,
   6777   1.1  riastrad 			    struct intel_crtc *crtc)
   6778   1.1  riastrad {
   6779   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   6780   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6781   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6782   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6783   1.1  riastrad 
   6784   1.1  riastrad 	if (WARN_ON(crtc->active))
   6785   1.1  riastrad 		return;
   6786   1.1  riastrad 
   6787   1.1  riastrad 	/*
   6788   1.1  riastrad 	 * Sometimes spurious CPU pipe underruns happen during FDI
   6789   1.1  riastrad 	 * training, at least with VGA+HDMI cloning. Suppress them.
   6790   1.1  riastrad 	 *
   6791   1.1  riastrad 	 * On ILK we get an occasional spurious CPU pipe underruns
   6792   1.1  riastrad 	 * between eDP port A enable and vdd enable. Also PCH port
   6793   1.1  riastrad 	 * enable seems to result in the occasional CPU pipe underrun.
   6794   1.1  riastrad 	 *
   6795   1.1  riastrad 	 * Spurious PCH underruns also occur during PCH enabling.
   6796   1.1  riastrad 	 */
   6797   1.1  riastrad 	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
   6798   1.1  riastrad 	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
   6799   1.1  riastrad 
   6800   1.1  riastrad 	if (new_crtc_state->has_pch_encoder)
   6801   1.1  riastrad 		intel_prepare_shared_dpll(new_crtc_state);
   6802   1.1  riastrad 
   6803   1.1  riastrad 	if (intel_crtc_has_dp_encoder(new_crtc_state))
   6804   1.1  riastrad 		intel_dp_set_m_n(new_crtc_state, M1_N1);
   6805   1.1  riastrad 
   6806   1.1  riastrad 	intel_set_pipe_timings(new_crtc_state);
   6807   1.1  riastrad 	intel_set_pipe_src_size(new_crtc_state);
   6808   1.1  riastrad 
   6809   1.1  riastrad 	if (new_crtc_state->has_pch_encoder)
   6810   1.1  riastrad 		intel_cpu_transcoder_set_m_n(new_crtc_state,
   6811   1.1  riastrad 					     &new_crtc_state->fdi_m_n, NULL);
   6812   1.1  riastrad 
   6813   1.1  riastrad 	ilk_set_pipeconf(new_crtc_state);
   6814   1.1  riastrad 
   6815   1.1  riastrad 	crtc->active = true;
   6816   1.1  riastrad 
   6817   1.1  riastrad 	intel_encoders_pre_enable(state, crtc);
   6818   1.1  riastrad 
   6819   1.1  riastrad 	if (new_crtc_state->has_pch_encoder) {
   6820   1.1  riastrad 		/* Note: FDI PLL enabling _must_ be done before we enable the
   6821   1.1  riastrad 		 * cpu pipes, hence this is separate from all the other fdi/pch
   6822   1.1  riastrad 		 * enabling. */
   6823   1.1  riastrad 		ilk_fdi_pll_enable(new_crtc_state);
   6824   1.1  riastrad 	} else {
   6825   1.1  riastrad 		assert_fdi_tx_disabled(dev_priv, pipe);
   6826   1.1  riastrad 		assert_fdi_rx_disabled(dev_priv, pipe);
   6827   1.1  riastrad 	}
   6828   1.1  riastrad 
   6829   1.1  riastrad 	ilk_pfit_enable(new_crtc_state);
   6830   1.1  riastrad 
   6831   1.1  riastrad 	/*
   6832   1.1  riastrad 	 * On ILK+ LUT must be loaded before the pipe is running but with
   6833   1.1  riastrad 	 * clocks enabled
   6834   1.1  riastrad 	 */
   6835   1.1  riastrad 	intel_color_load_luts(new_crtc_state);
   6836   1.1  riastrad 	intel_color_commit(new_crtc_state);
   6837   1.1  riastrad 	/* update DSPCNTR to configure gamma for pipe bottom color */
   6838   1.1  riastrad 	intel_disable_primary_plane(new_crtc_state);
   6839   1.1  riastrad 
   6840   1.1  riastrad 	if (dev_priv->display.initial_watermarks)
   6841   1.1  riastrad 		dev_priv->display.initial_watermarks(state, crtc);
   6842   1.1  riastrad 	intel_enable_pipe(new_crtc_state);
   6843   1.1  riastrad 
   6844   1.1  riastrad 	if (new_crtc_state->has_pch_encoder)
   6845   1.1  riastrad 		ilk_pch_enable(state, new_crtc_state);
   6846   1.1  riastrad 
   6847   1.1  riastrad 	intel_crtc_vblank_on(new_crtc_state);
   6848   1.1  riastrad 
   6849   1.1  riastrad 	intel_encoders_enable(state, crtc);
   6850   1.1  riastrad 
   6851   1.1  riastrad 	if (HAS_PCH_CPT(dev_priv))
   6852   1.1  riastrad 		cpt_verify_modeset(dev_priv, pipe);
   6853   1.1  riastrad 
   6854   1.1  riastrad 	/*
   6855   1.1  riastrad 	 * Must wait for vblank to avoid spurious PCH FIFO underruns.
   6856   1.1  riastrad 	 * And a second vblank wait is needed at least on ILK with
   6857   1.1  riastrad 	 * some interlaced HDMI modes. Let's do the double wait always
   6858   1.1  riastrad 	 * in case there are more corner cases we don't know about.
   6859   1.1  riastrad 	 */
   6860   1.1  riastrad 	if (new_crtc_state->has_pch_encoder) {
   6861   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   6862   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   6863   1.1  riastrad 	}
   6864   1.1  riastrad 	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
   6865   1.1  riastrad 	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
   6866   1.1  riastrad }
   6867   1.1  riastrad 
   6868   1.1  riastrad /* IPS only exists on ULT machines and is tied to pipe A. */
   6869   1.1  riastrad static bool hsw_crtc_supports_ips(struct intel_crtc *crtc)
   6870   1.1  riastrad {
   6871   1.1  riastrad 	return HAS_IPS(to_i915(crtc->base.dev)) && crtc->pipe == PIPE_A;
   6872   1.1  riastrad }
   6873   1.1  riastrad 
   6874   1.1  riastrad static void glk_pipe_scaler_clock_gating_wa(struct drm_i915_private *dev_priv,
   6875   1.1  riastrad 					    enum pipe pipe, bool apply)
   6876   1.1  riastrad {
   6877   1.1  riastrad 	u32 val = I915_READ(CLKGATE_DIS_PSL(pipe));
   6878   1.1  riastrad 	u32 mask = DPF_GATING_DIS | DPF_RAM_GATING_DIS | DPFR_GATING_DIS;
   6879   1.1  riastrad 
   6880   1.1  riastrad 	if (apply)
   6881   1.1  riastrad 		val |= mask;
   6882   1.1  riastrad 	else
   6883   1.1  riastrad 		val &= ~mask;
   6884   1.1  riastrad 
   6885   1.1  riastrad 	I915_WRITE(CLKGATE_DIS_PSL(pipe), val);
   6886   1.1  riastrad }
   6887   1.1  riastrad 
   6888   1.1  riastrad static void icl_pipe_mbus_enable(struct intel_crtc *crtc)
   6889   1.1  riastrad {
   6890   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6891   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   6892   1.1  riastrad 	u32 val;
   6893   1.1  riastrad 
   6894   1.1  riastrad 	val = MBUS_DBOX_A_CREDIT(2);
   6895   1.1  riastrad 
   6896   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 12) {
   6897   1.1  riastrad 		val |= MBUS_DBOX_BW_CREDIT(2);
   6898   1.1  riastrad 		val |= MBUS_DBOX_B_CREDIT(12);
   6899   1.1  riastrad 	} else {
   6900   1.1  riastrad 		val |= MBUS_DBOX_BW_CREDIT(1);
   6901   1.1  riastrad 		val |= MBUS_DBOX_B_CREDIT(8);
   6902   1.1  riastrad 	}
   6903   1.1  riastrad 
   6904   1.1  riastrad 	I915_WRITE(PIPE_MBUS_DBOX_CTL(pipe), val);
   6905   1.1  riastrad }
   6906   1.1  riastrad 
   6907   1.1  riastrad static void hsw_set_frame_start_delay(const struct intel_crtc_state *crtc_state)
   6908   1.1  riastrad {
   6909   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   6910   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6911   1.1  riastrad 	i915_reg_t reg = CHICKEN_TRANS(crtc_state->cpu_transcoder);
   6912   1.1  riastrad 	u32 val;
   6913   1.1  riastrad 
   6914   1.1  riastrad 	val = I915_READ(reg);
   6915   1.1  riastrad 	val &= ~HSW_FRAME_START_DELAY_MASK;
   6916   1.1  riastrad 	val |= HSW_FRAME_START_DELAY(0);
   6917   1.1  riastrad 	I915_WRITE(reg, val);
   6918   1.1  riastrad }
   6919   1.1  riastrad 
   6920   1.1  riastrad static void hsw_crtc_enable(struct intel_atomic_state *state,
   6921   1.1  riastrad 			    struct intel_crtc *crtc)
   6922   1.1  riastrad {
   6923   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   6924   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   6925   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   6926   1.1  riastrad 	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
   6927   1.1  riastrad 	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
   6928   1.1  riastrad 	bool psl_clkgate_wa;
   6929   1.1  riastrad 
   6930   1.1  riastrad 	if (WARN_ON(crtc->active))
   6931   1.1  riastrad 		return;
   6932   1.1  riastrad 
   6933   1.1  riastrad 	intel_encoders_pre_pll_enable(state, crtc);
   6934   1.1  riastrad 
   6935   1.1  riastrad 	if (new_crtc_state->shared_dpll)
   6936   1.1  riastrad 		intel_enable_shared_dpll(new_crtc_state);
   6937   1.1  riastrad 
   6938   1.1  riastrad 	intel_encoders_pre_enable(state, crtc);
   6939   1.1  riastrad 
   6940   1.1  riastrad 	if (intel_crtc_has_dp_encoder(new_crtc_state))
   6941   1.1  riastrad 		intel_dp_set_m_n(new_crtc_state, M1_N1);
   6942   1.1  riastrad 
   6943   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder))
   6944   1.1  riastrad 		intel_set_pipe_timings(new_crtc_state);
   6945   1.1  riastrad 
   6946   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   6947   1.1  riastrad 		icl_enable_trans_port_sync(new_crtc_state);
   6948   1.1  riastrad 
   6949   1.1  riastrad 	intel_set_pipe_src_size(new_crtc_state);
   6950   1.1  riastrad 
   6951   1.1  riastrad 	if (cpu_transcoder != TRANSCODER_EDP &&
   6952   1.1  riastrad 	    !transcoder_is_dsi(cpu_transcoder))
   6953   1.1  riastrad 		I915_WRITE(PIPE_MULT(cpu_transcoder),
   6954   1.1  riastrad 			   new_crtc_state->pixel_multiplier - 1);
   6955   1.1  riastrad 
   6956   1.1  riastrad 	if (new_crtc_state->has_pch_encoder)
   6957   1.1  riastrad 		intel_cpu_transcoder_set_m_n(new_crtc_state,
   6958   1.1  riastrad 					     &new_crtc_state->fdi_m_n, NULL);
   6959   1.1  riastrad 
   6960   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder)) {
   6961   1.1  riastrad 		hsw_set_frame_start_delay(new_crtc_state);
   6962   1.1  riastrad 		hsw_set_pipeconf(new_crtc_state);
   6963   1.1  riastrad 	}
   6964   1.1  riastrad 
   6965   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
   6966   1.1  riastrad 		bdw_set_pipemisc(new_crtc_state);
   6967   1.1  riastrad 
   6968   1.1  riastrad 	crtc->active = true;
   6969   1.1  riastrad 
   6970   1.1  riastrad 	/* Display WA #1180: WaDisableScalarClockGating: glk, cnl */
   6971   1.1  riastrad 	psl_clkgate_wa = (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) &&
   6972   1.1  riastrad 		new_crtc_state->pch_pfit.enabled;
   6973   1.1  riastrad 	if (psl_clkgate_wa)
   6974   1.1  riastrad 		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
   6975   1.1  riastrad 
   6976   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   6977   1.1  riastrad 		skl_pfit_enable(new_crtc_state);
   6978   1.1  riastrad 	else
   6979   1.1  riastrad 		ilk_pfit_enable(new_crtc_state);
   6980   1.1  riastrad 
   6981   1.1  riastrad 	/*
   6982   1.1  riastrad 	 * On ILK+ LUT must be loaded before the pipe is running but with
   6983   1.1  riastrad 	 * clocks enabled
   6984   1.1  riastrad 	 */
   6985   1.1  riastrad 	intel_color_load_luts(new_crtc_state);
   6986   1.1  riastrad 	intel_color_commit(new_crtc_state);
   6987   1.1  riastrad 	/* update DSPCNTR to configure gamma/csc for pipe bottom color */
   6988   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9)
   6989   1.1  riastrad 		intel_disable_primary_plane(new_crtc_state);
   6990   1.1  riastrad 
   6991   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   6992   1.1  riastrad 		icl_set_pipe_chicken(crtc);
   6993   1.1  riastrad 
   6994   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder))
   6995   1.1  riastrad 		intel_ddi_enable_transcoder_func(new_crtc_state);
   6996   1.1  riastrad 
   6997   1.1  riastrad 	if (dev_priv->display.initial_watermarks)
   6998   1.1  riastrad 		dev_priv->display.initial_watermarks(state, crtc);
   6999   1.1  riastrad 
   7000   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   7001   1.1  riastrad 		icl_pipe_mbus_enable(crtc);
   7002   1.1  riastrad 
   7003   1.1  riastrad 	/* XXX: Do the pipe assertions at the right place for BXT DSI. */
   7004   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder))
   7005   1.1  riastrad 		intel_enable_pipe(new_crtc_state);
   7006   1.1  riastrad 
   7007   1.1  riastrad 	if (new_crtc_state->has_pch_encoder)
   7008   1.1  riastrad 		lpt_pch_enable(state, new_crtc_state);
   7009   1.1  riastrad 
   7010   1.1  riastrad 	intel_crtc_vblank_on(new_crtc_state);
   7011   1.1  riastrad 
   7012   1.1  riastrad 	intel_encoders_enable(state, crtc);
   7013   1.1  riastrad 
   7014   1.1  riastrad 	if (psl_clkgate_wa) {
   7015   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   7016   1.1  riastrad 		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
   7017   1.1  riastrad 	}
   7018   1.1  riastrad 
   7019   1.1  riastrad 	/* If we change the relative order between pipe/planes enabling, we need
   7020   1.1  riastrad 	 * to change the workaround. */
   7021   1.1  riastrad 	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
   7022   1.1  riastrad 	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
   7023   1.1  riastrad 		intel_wait_for_vblank(dev_priv, hsw_workaround_pipe);
   7024   1.1  riastrad 		intel_wait_for_vblank(dev_priv, hsw_workaround_pipe);
   7025   1.1  riastrad 	}
   7026   1.1  riastrad }
   7027   1.1  riastrad 
   7028   1.1  riastrad void ilk_pfit_disable(const struct intel_crtc_state *old_crtc_state)
   7029   1.1  riastrad {
   7030   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   7031   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7032   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7033   1.1  riastrad 
   7034   1.1  riastrad 	/* To avoid upsetting the power well on haswell only disable the pfit if
   7035   1.1  riastrad 	 * it's in use. The hw state code will make sure we get this right. */
   7036   1.1  riastrad 	if (old_crtc_state->pch_pfit.enabled) {
   7037   1.1  riastrad 		I915_WRITE(PF_CTL(pipe), 0);
   7038   1.1  riastrad 		I915_WRITE(PF_WIN_POS(pipe), 0);
   7039   1.1  riastrad 		I915_WRITE(PF_WIN_SZ(pipe), 0);
   7040   1.1  riastrad 	}
   7041   1.1  riastrad }
   7042   1.1  riastrad 
   7043   1.1  riastrad static void ilk_crtc_disable(struct intel_atomic_state *state,
   7044   1.1  riastrad 			     struct intel_crtc *crtc)
   7045   1.1  riastrad {
   7046   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   7047   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   7048   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7049   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7050   1.1  riastrad 
   7051   1.1  riastrad 	/*
   7052   1.1  riastrad 	 * Sometimes spurious CPU pipe underruns happen when the
   7053   1.1  riastrad 	 * pipe is already disabled, but FDI RX/TX is still enabled.
   7054   1.1  riastrad 	 * Happens at least with VGA+HDMI cloning. Suppress them.
   7055   1.1  riastrad 	 */
   7056   1.1  riastrad 	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
   7057   1.1  riastrad 	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
   7058   1.1  riastrad 
   7059   1.1  riastrad 	intel_encoders_disable(state, crtc);
   7060   1.1  riastrad 
   7061   1.1  riastrad 	intel_crtc_vblank_off(old_crtc_state);
   7062   1.1  riastrad 
   7063   1.1  riastrad 	intel_disable_pipe(old_crtc_state);
   7064   1.1  riastrad 
   7065   1.1  riastrad 	ilk_pfit_disable(old_crtc_state);
   7066   1.1  riastrad 
   7067   1.1  riastrad 	if (old_crtc_state->has_pch_encoder)
   7068   1.1  riastrad 		ilk_fdi_disable(crtc);
   7069   1.1  riastrad 
   7070   1.1  riastrad 	intel_encoders_post_disable(state, crtc);
   7071   1.1  riastrad 
   7072   1.1  riastrad 	if (old_crtc_state->has_pch_encoder) {
   7073   1.1  riastrad 		ilk_disable_pch_transcoder(dev_priv, pipe);
   7074   1.1  riastrad 
   7075   1.1  riastrad 		if (HAS_PCH_CPT(dev_priv)) {
   7076   1.1  riastrad 			i915_reg_t reg;
   7077   1.1  riastrad 			u32 temp;
   7078   1.1  riastrad 
   7079   1.1  riastrad 			/* disable TRANS_DP_CTL */
   7080   1.1  riastrad 			reg = TRANS_DP_CTL(pipe);
   7081   1.1  riastrad 			temp = I915_READ(reg);
   7082   1.1  riastrad 			temp &= ~(TRANS_DP_OUTPUT_ENABLE |
   7083   1.1  riastrad 				  TRANS_DP_PORT_SEL_MASK);
   7084   1.1  riastrad 			temp |= TRANS_DP_PORT_SEL_NONE;
   7085   1.1  riastrad 			I915_WRITE(reg, temp);
   7086   1.1  riastrad 
   7087   1.1  riastrad 			/* disable DPLL_SEL */
   7088   1.1  riastrad 			temp = I915_READ(PCH_DPLL_SEL);
   7089   1.1  riastrad 			temp &= ~(TRANS_DPLL_ENABLE(pipe) | TRANS_DPLLB_SEL(pipe));
   7090   1.1  riastrad 			I915_WRITE(PCH_DPLL_SEL, temp);
   7091   1.1  riastrad 		}
   7092   1.1  riastrad 
   7093   1.1  riastrad 		ilk_fdi_pll_disable(crtc);
   7094   1.1  riastrad 	}
   7095   1.1  riastrad 
   7096   1.1  riastrad 	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
   7097   1.1  riastrad 	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
   7098   1.1  riastrad }
   7099   1.1  riastrad 
   7100   1.1  riastrad static void hsw_crtc_disable(struct intel_atomic_state *state,
   7101   1.1  riastrad 			     struct intel_crtc *crtc)
   7102   1.1  riastrad {
   7103   1.1  riastrad 	/*
   7104   1.1  riastrad 	 * FIXME collapse everything to one hook.
   7105   1.1  riastrad 	 * Need care with mst->ddi interactions.
   7106   1.1  riastrad 	 */
   7107   1.1  riastrad 	intel_encoders_disable(state, crtc);
   7108   1.1  riastrad 	intel_encoders_post_disable(state, crtc);
   7109   1.1  riastrad }
   7110   1.1  riastrad 
   7111   1.1  riastrad static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
   7112   1.1  riastrad {
   7113   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   7114   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7115   1.1  riastrad 
   7116   1.1  riastrad 	if (!crtc_state->gmch_pfit.control)
   7117   1.1  riastrad 		return;
   7118   1.1  riastrad 
   7119   1.1  riastrad 	/*
   7120   1.1  riastrad 	 * The panel fitter should only be adjusted whilst the pipe is disabled,
   7121   1.1  riastrad 	 * according to register description and PRM.
   7122   1.1  riastrad 	 */
   7123   1.1  riastrad 	WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE);
   7124   1.1  riastrad 	assert_pipe_disabled(dev_priv, crtc_state->cpu_transcoder);
   7125   1.1  riastrad 
   7126   1.1  riastrad 	I915_WRITE(PFIT_PGM_RATIOS, crtc_state->gmch_pfit.pgm_ratios);
   7127   1.1  riastrad 	I915_WRITE(PFIT_CONTROL, crtc_state->gmch_pfit.control);
   7128   1.1  riastrad 
   7129   1.1  riastrad 	/* Border color in case we don't scale up to the full screen. Black by
   7130   1.1  riastrad 	 * default, change to something else for debugging. */
   7131   1.1  riastrad 	I915_WRITE(BCLRPAT(crtc->pipe), 0);
   7132   1.1  riastrad }
   7133   1.1  riastrad 
   7134   1.1  riastrad bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)
   7135   1.1  riastrad {
   7136   1.1  riastrad 	if (phy == PHY_NONE)
   7137   1.1  riastrad 		return false;
   7138   1.1  riastrad 
   7139   1.1  riastrad 	if (IS_ELKHARTLAKE(dev_priv))
   7140   1.1  riastrad 		return phy <= PHY_C;
   7141   1.1  riastrad 
   7142   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   7143   1.1  riastrad 		return phy <= PHY_B;
   7144   1.1  riastrad 
   7145   1.1  riastrad 	return false;
   7146   1.1  riastrad }
   7147   1.1  riastrad 
   7148   1.1  riastrad bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
   7149   1.1  riastrad {
   7150   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 12)
   7151   1.1  riastrad 		return phy >= PHY_D && phy <= PHY_I;
   7152   1.1  riastrad 
   7153   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 && !IS_ELKHARTLAKE(dev_priv))
   7154   1.1  riastrad 		return phy >= PHY_C && phy <= PHY_F;
   7155   1.1  riastrad 
   7156   1.1  riastrad 	return false;
   7157   1.1  riastrad }
   7158   1.1  riastrad 
   7159   1.1  riastrad enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)
   7160   1.1  riastrad {
   7161   1.1  riastrad 	if (IS_ELKHARTLAKE(i915) && port == PORT_D)
   7162   1.1  riastrad 		return PHY_A;
   7163   1.1  riastrad 
   7164   1.1  riastrad 	return (enum phy)port;
   7165   1.1  riastrad }
   7166   1.1  riastrad 
   7167   1.1  riastrad enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port)
   7168   1.1  riastrad {
   7169   1.1  riastrad 	if (!intel_phy_is_tc(dev_priv, intel_port_to_phy(dev_priv, port)))
   7170   1.1  riastrad 		return PORT_TC_NONE;
   7171   1.1  riastrad 
   7172   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 12)
   7173   1.1  riastrad 		return port - PORT_D;
   7174   1.1  riastrad 
   7175   1.1  riastrad 	return port - PORT_C;
   7176   1.1  riastrad }
   7177   1.1  riastrad 
   7178   1.1  riastrad enum intel_display_power_domain intel_port_to_power_domain(enum port port)
   7179   1.1  riastrad {
   7180   1.1  riastrad 	switch (port) {
   7181   1.1  riastrad 	case PORT_A:
   7182   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_A_LANES;
   7183   1.1  riastrad 	case PORT_B:
   7184   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_B_LANES;
   7185   1.1  riastrad 	case PORT_C:
   7186   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_C_LANES;
   7187   1.1  riastrad 	case PORT_D:
   7188   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_D_LANES;
   7189   1.1  riastrad 	case PORT_E:
   7190   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_E_LANES;
   7191   1.1  riastrad 	case PORT_F:
   7192   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_F_LANES;
   7193   1.1  riastrad 	case PORT_G:
   7194   1.1  riastrad 		return POWER_DOMAIN_PORT_DDI_G_LANES;
   7195   1.1  riastrad 	default:
   7196   1.1  riastrad 		MISSING_CASE(port);
   7197   1.1  riastrad 		return POWER_DOMAIN_PORT_OTHER;
   7198   1.1  riastrad 	}
   7199   1.1  riastrad }
   7200   1.1  riastrad 
   7201   1.1  riastrad enum intel_display_power_domain
   7202   1.1  riastrad intel_aux_power_domain(struct intel_digital_port *dig_port)
   7203   1.1  riastrad {
   7204   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
   7205   1.1  riastrad 	enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port);
   7206   1.1  riastrad 
   7207   1.1  riastrad 	if (intel_phy_is_tc(dev_priv, phy) &&
   7208   1.1  riastrad 	    dig_port->tc_mode == TC_PORT_TBT_ALT) {
   7209   1.1  riastrad 		switch (dig_port->aux_ch) {
   7210   1.1  riastrad 		case AUX_CH_C:
   7211   1.1  riastrad 			return POWER_DOMAIN_AUX_C_TBT;
   7212   1.1  riastrad 		case AUX_CH_D:
   7213   1.1  riastrad 			return POWER_DOMAIN_AUX_D_TBT;
   7214   1.1  riastrad 		case AUX_CH_E:
   7215   1.1  riastrad 			return POWER_DOMAIN_AUX_E_TBT;
   7216   1.1  riastrad 		case AUX_CH_F:
   7217   1.1  riastrad 			return POWER_DOMAIN_AUX_F_TBT;
   7218   1.1  riastrad 		case AUX_CH_G:
   7219   1.1  riastrad 			return POWER_DOMAIN_AUX_G_TBT;
   7220   1.1  riastrad 		default:
   7221   1.1  riastrad 			MISSING_CASE(dig_port->aux_ch);
   7222   1.1  riastrad 			return POWER_DOMAIN_AUX_C_TBT;
   7223   1.1  riastrad 		}
   7224   1.1  riastrad 	}
   7225   1.1  riastrad 
   7226   1.1  riastrad 	switch (dig_port->aux_ch) {
   7227   1.1  riastrad 	case AUX_CH_A:
   7228   1.1  riastrad 		return POWER_DOMAIN_AUX_A;
   7229   1.1  riastrad 	case AUX_CH_B:
   7230   1.1  riastrad 		return POWER_DOMAIN_AUX_B;
   7231   1.1  riastrad 	case AUX_CH_C:
   7232   1.1  riastrad 		return POWER_DOMAIN_AUX_C;
   7233   1.1  riastrad 	case AUX_CH_D:
   7234   1.1  riastrad 		return POWER_DOMAIN_AUX_D;
   7235   1.1  riastrad 	case AUX_CH_E:
   7236   1.1  riastrad 		return POWER_DOMAIN_AUX_E;
   7237   1.1  riastrad 	case AUX_CH_F:
   7238   1.1  riastrad 		return POWER_DOMAIN_AUX_F;
   7239   1.1  riastrad 	case AUX_CH_G:
   7240   1.1  riastrad 		return POWER_DOMAIN_AUX_G;
   7241   1.1  riastrad 	default:
   7242   1.1  riastrad 		MISSING_CASE(dig_port->aux_ch);
   7243   1.1  riastrad 		return POWER_DOMAIN_AUX_A;
   7244   1.1  riastrad 	}
   7245   1.1  riastrad }
   7246   1.1  riastrad 
   7247   1.1  riastrad static u64 get_crtc_power_domains(struct intel_crtc_state *crtc_state)
   7248   1.1  riastrad {
   7249   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   7250   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7251   1.1  riastrad 	struct drm_encoder *encoder;
   7252   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7253   1.1  riastrad 	u64 mask;
   7254   1.1  riastrad 	enum transcoder transcoder = crtc_state->cpu_transcoder;
   7255   1.1  riastrad 
   7256   1.1  riastrad 	if (!crtc_state->hw.active)
   7257   1.1  riastrad 		return 0;
   7258   1.1  riastrad 
   7259   1.1  riastrad 	mask = BIT_ULL(POWER_DOMAIN_PIPE(pipe));
   7260   1.1  riastrad 	mask |= BIT_ULL(POWER_DOMAIN_TRANSCODER(transcoder));
   7261   1.1  riastrad 	if (crtc_state->pch_pfit.enabled ||
   7262   1.1  riastrad 	    crtc_state->pch_pfit.force_thru)
   7263   1.1  riastrad 		mask |= BIT_ULL(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
   7264   1.1  riastrad 
   7265   1.1  riastrad 	drm_for_each_encoder_mask(encoder, &dev_priv->drm,
   7266   1.1  riastrad 				  crtc_state->uapi.encoder_mask) {
   7267   1.1  riastrad 		struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
   7268   1.1  riastrad 
   7269   1.1  riastrad 		mask |= BIT_ULL(intel_encoder->power_domain);
   7270   1.1  riastrad 	}
   7271   1.1  riastrad 
   7272   1.1  riastrad 	if (HAS_DDI(dev_priv) && crtc_state->has_audio)
   7273   1.1  riastrad 		mask |= BIT_ULL(POWER_DOMAIN_AUDIO);
   7274   1.1  riastrad 
   7275   1.1  riastrad 	if (crtc_state->shared_dpll)
   7276   1.1  riastrad 		mask |= BIT_ULL(POWER_DOMAIN_DISPLAY_CORE);
   7277   1.1  riastrad 
   7278   1.1  riastrad 	return mask;
   7279   1.1  riastrad }
   7280   1.1  riastrad 
   7281   1.1  riastrad static u64
   7282   1.1  riastrad modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state)
   7283   1.1  riastrad {
   7284   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   7285   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7286   1.1  riastrad 	enum intel_display_power_domain domain;
   7287   1.1  riastrad 	u64 domains, new_domains, old_domains;
   7288   1.1  riastrad 
   7289   1.1  riastrad 	old_domains = crtc->enabled_power_domains;
   7290   1.1  riastrad 	crtc->enabled_power_domains = new_domains =
   7291   1.1  riastrad 		get_crtc_power_domains(crtc_state);
   7292   1.1  riastrad 
   7293   1.1  riastrad 	domains = new_domains & ~old_domains;
   7294   1.1  riastrad 
   7295   1.1  riastrad 	for_each_power_domain(domain, domains)
   7296   1.1  riastrad 		intel_display_power_get(dev_priv, domain);
   7297   1.1  riastrad 
   7298   1.1  riastrad 	return old_domains & ~new_domains;
   7299   1.1  riastrad }
   7300   1.1  riastrad 
   7301   1.1  riastrad static void modeset_put_power_domains(struct drm_i915_private *dev_priv,
   7302   1.1  riastrad 				      u64 domains)
   7303   1.1  riastrad {
   7304   1.1  riastrad 	enum intel_display_power_domain domain;
   7305   1.1  riastrad 
   7306   1.1  riastrad 	for_each_power_domain(domain, domains)
   7307   1.1  riastrad 		intel_display_power_put_unchecked(dev_priv, domain);
   7308   1.1  riastrad }
   7309   1.1  riastrad 
   7310   1.1  riastrad static void valleyview_crtc_enable(struct intel_atomic_state *state,
   7311   1.1  riastrad 				   struct intel_crtc *crtc)
   7312   1.1  riastrad {
   7313   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   7314   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   7315   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7316   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7317   1.1  riastrad 
   7318   1.1  riastrad 	if (WARN_ON(crtc->active))
   7319   1.1  riastrad 		return;
   7320   1.1  riastrad 
   7321   1.1  riastrad 	if (intel_crtc_has_dp_encoder(new_crtc_state))
   7322   1.1  riastrad 		intel_dp_set_m_n(new_crtc_state, M1_N1);
   7323   1.1  riastrad 
   7324   1.1  riastrad 	intel_set_pipe_timings(new_crtc_state);
   7325   1.1  riastrad 	intel_set_pipe_src_size(new_crtc_state);
   7326   1.1  riastrad 
   7327   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
   7328   1.1  riastrad 		I915_WRITE(CHV_BLEND(pipe), CHV_BLEND_LEGACY);
   7329   1.1  riastrad 		I915_WRITE(CHV_CANVAS(pipe), 0);
   7330   1.1  riastrad 	}
   7331   1.1  riastrad 
   7332   1.1  riastrad 	i9xx_set_pipeconf(new_crtc_state);
   7333   1.1  riastrad 
   7334   1.1  riastrad 	crtc->active = true;
   7335   1.1  riastrad 
   7336   1.1  riastrad 	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
   7337   1.1  riastrad 
   7338   1.1  riastrad 	intel_encoders_pre_pll_enable(state, crtc);
   7339   1.1  riastrad 
   7340   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv)) {
   7341   1.1  riastrad 		chv_prepare_pll(crtc, new_crtc_state);
   7342   1.1  riastrad 		chv_enable_pll(crtc, new_crtc_state);
   7343   1.1  riastrad 	} else {
   7344   1.1  riastrad 		vlv_prepare_pll(crtc, new_crtc_state);
   7345   1.1  riastrad 		vlv_enable_pll(crtc, new_crtc_state);
   7346   1.1  riastrad 	}
   7347   1.1  riastrad 
   7348   1.1  riastrad 	intel_encoders_pre_enable(state, crtc);
   7349   1.1  riastrad 
   7350   1.1  riastrad 	i9xx_pfit_enable(new_crtc_state);
   7351   1.1  riastrad 
   7352   1.1  riastrad 	intel_color_load_luts(new_crtc_state);
   7353   1.1  riastrad 	intel_color_commit(new_crtc_state);
   7354   1.1  riastrad 	/* update DSPCNTR to configure gamma for pipe bottom color */
   7355   1.1  riastrad 	intel_disable_primary_plane(new_crtc_state);
   7356   1.1  riastrad 
   7357   1.1  riastrad 	dev_priv->display.initial_watermarks(state, crtc);
   7358   1.1  riastrad 	intel_enable_pipe(new_crtc_state);
   7359   1.1  riastrad 
   7360   1.1  riastrad 	intel_crtc_vblank_on(new_crtc_state);
   7361   1.1  riastrad 
   7362   1.1  riastrad 	intel_encoders_enable(state, crtc);
   7363   1.1  riastrad }
   7364   1.1  riastrad 
   7365   1.1  riastrad static void i9xx_set_pll_dividers(const struct intel_crtc_state *crtc_state)
   7366   1.1  riastrad {
   7367   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   7368   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7369   1.1  riastrad 
   7370   1.1  riastrad 	I915_WRITE(FP0(crtc->pipe), crtc_state->dpll_hw_state.fp0);
   7371   1.1  riastrad 	I915_WRITE(FP1(crtc->pipe), crtc_state->dpll_hw_state.fp1);
   7372   1.1  riastrad }
   7373   1.1  riastrad 
   7374   1.1  riastrad static void i9xx_crtc_enable(struct intel_atomic_state *state,
   7375   1.1  riastrad 			     struct intel_crtc *crtc)
   7376   1.1  riastrad {
   7377   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state =
   7378   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   7379   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7380   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7381   1.1  riastrad 
   7382   1.1  riastrad 	if (WARN_ON(crtc->active))
   7383   1.1  riastrad 		return;
   7384   1.1  riastrad 
   7385   1.1  riastrad 	i9xx_set_pll_dividers(new_crtc_state);
   7386   1.1  riastrad 
   7387   1.1  riastrad 	if (intel_crtc_has_dp_encoder(new_crtc_state))
   7388   1.1  riastrad 		intel_dp_set_m_n(new_crtc_state, M1_N1);
   7389   1.1  riastrad 
   7390   1.1  riastrad 	intel_set_pipe_timings(new_crtc_state);
   7391   1.1  riastrad 	intel_set_pipe_src_size(new_crtc_state);
   7392   1.1  riastrad 
   7393   1.1  riastrad 	i9xx_set_pipeconf(new_crtc_state);
   7394   1.1  riastrad 
   7395   1.1  riastrad 	crtc->active = true;
   7396   1.1  riastrad 
   7397   1.1  riastrad 	if (!IS_GEN(dev_priv, 2))
   7398   1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
   7399   1.1  riastrad 
   7400   1.1  riastrad 	intel_encoders_pre_enable(state, crtc);
   7401   1.1  riastrad 
   7402   1.1  riastrad 	i9xx_enable_pll(crtc, new_crtc_state);
   7403   1.1  riastrad 
   7404   1.1  riastrad 	i9xx_pfit_enable(new_crtc_state);
   7405   1.1  riastrad 
   7406   1.1  riastrad 	intel_color_load_luts(new_crtc_state);
   7407   1.1  riastrad 	intel_color_commit(new_crtc_state);
   7408   1.1  riastrad 	/* update DSPCNTR to configure gamma for pipe bottom color */
   7409   1.1  riastrad 	intel_disable_primary_plane(new_crtc_state);
   7410   1.1  riastrad 
   7411   1.1  riastrad 	if (dev_priv->display.initial_watermarks)
   7412   1.1  riastrad 		dev_priv->display.initial_watermarks(state, crtc);
   7413   1.1  riastrad 	else
   7414   1.1  riastrad 		intel_update_watermarks(crtc);
   7415   1.1  riastrad 	intel_enable_pipe(new_crtc_state);
   7416   1.1  riastrad 
   7417   1.1  riastrad 	intel_crtc_vblank_on(new_crtc_state);
   7418   1.1  riastrad 
   7419   1.1  riastrad 	intel_encoders_enable(state, crtc);
   7420   1.1  riastrad }
   7421   1.1  riastrad 
   7422   1.1  riastrad static void i9xx_pfit_disable(const struct intel_crtc_state *old_crtc_state)
   7423   1.1  riastrad {
   7424   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   7425   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7426   1.1  riastrad 
   7427   1.1  riastrad 	if (!old_crtc_state->gmch_pfit.control)
   7428   1.1  riastrad 		return;
   7429   1.1  riastrad 
   7430   1.1  riastrad 	assert_pipe_disabled(dev_priv, old_crtc_state->cpu_transcoder);
   7431   1.1  riastrad 
   7432   1.1  riastrad 	DRM_DEBUG_KMS("disabling pfit, current: 0x%08x\n",
   7433   1.1  riastrad 		      I915_READ(PFIT_CONTROL));
   7434   1.1  riastrad 	I915_WRITE(PFIT_CONTROL, 0);
   7435   1.1  riastrad }
   7436   1.1  riastrad 
   7437   1.1  riastrad static void i9xx_crtc_disable(struct intel_atomic_state *state,
   7438   1.1  riastrad 			      struct intel_crtc *crtc)
   7439   1.1  riastrad {
   7440   1.1  riastrad 	struct intel_crtc_state *old_crtc_state =
   7441   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   7442   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7443   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7444   1.1  riastrad 
   7445   1.1  riastrad 	/*
   7446   1.1  riastrad 	 * On gen2 planes are double buffered but the pipe isn't, so we must
   7447   1.1  riastrad 	 * wait for planes to fully turn off before disabling the pipe.
   7448   1.1  riastrad 	 */
   7449   1.1  riastrad 	if (IS_GEN(dev_priv, 2))
   7450   1.1  riastrad 		intel_wait_for_vblank(dev_priv, pipe);
   7451   1.1  riastrad 
   7452   1.1  riastrad 	intel_encoders_disable(state, crtc);
   7453   1.1  riastrad 
   7454   1.1  riastrad 	intel_crtc_vblank_off(old_crtc_state);
   7455   1.1  riastrad 
   7456   1.1  riastrad 	intel_disable_pipe(old_crtc_state);
   7457   1.1  riastrad 
   7458   1.1  riastrad 	i9xx_pfit_disable(old_crtc_state);
   7459   1.1  riastrad 
   7460   1.1  riastrad 	intel_encoders_post_disable(state, crtc);
   7461   1.1  riastrad 
   7462   1.1  riastrad 	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DSI)) {
   7463   1.1  riastrad 		if (IS_CHERRYVIEW(dev_priv))
   7464   1.1  riastrad 			chv_disable_pll(dev_priv, pipe);
   7465   1.1  riastrad 		else if (IS_VALLEYVIEW(dev_priv))
   7466   1.1  riastrad 			vlv_disable_pll(dev_priv, pipe);
   7467   1.1  riastrad 		else
   7468   1.1  riastrad 			i9xx_disable_pll(old_crtc_state);
   7469   1.1  riastrad 	}
   7470   1.1  riastrad 
   7471   1.1  riastrad 	intel_encoders_post_pll_disable(state, crtc);
   7472   1.1  riastrad 
   7473   1.1  riastrad 	if (!IS_GEN(dev_priv, 2))
   7474   1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
   7475   1.1  riastrad 
   7476   1.1  riastrad 	if (!dev_priv->display.initial_watermarks)
   7477   1.1  riastrad 		intel_update_watermarks(crtc);
   7478   1.1  riastrad 
   7479   1.1  riastrad 	/* clock the pipe down to 640x480@60 to potentially save power */
   7480   1.1  riastrad 	if (IS_I830(dev_priv))
   7481   1.1  riastrad 		i830_enable_pipe(dev_priv, pipe);
   7482   1.1  riastrad }
   7483   1.1  riastrad 
   7484   1.1  riastrad static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
   7485   1.1  riastrad 					struct drm_modeset_acquire_ctx *ctx)
   7486   1.1  riastrad {
   7487   1.1  riastrad 	struct intel_encoder *encoder;
   7488   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7489   1.1  riastrad 	struct intel_bw_state *bw_state =
   7490   1.1  riastrad 		to_intel_bw_state(dev_priv->bw_obj.state);
   7491   1.1  riastrad 	struct intel_crtc_state *crtc_state =
   7492   1.1  riastrad 		to_intel_crtc_state(crtc->base.state);
   7493   1.1  riastrad 	enum intel_display_power_domain domain;
   7494   1.1  riastrad 	struct intel_plane *plane;
   7495   1.1  riastrad 	struct drm_atomic_state *state;
   7496   1.1  riastrad 	struct intel_crtc_state *temp_crtc_state;
   7497   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   7498   1.1  riastrad 	u64 domains;
   7499   1.1  riastrad 	int ret;
   7500   1.1  riastrad 
   7501   1.1  riastrad 	if (!crtc_state->hw.active)
   7502   1.1  riastrad 		return;
   7503   1.1  riastrad 
   7504   1.1  riastrad 	for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
   7505   1.1  riastrad 		const struct intel_plane_state *plane_state =
   7506   1.1  riastrad 			to_intel_plane_state(plane->base.state);
   7507   1.1  riastrad 
   7508   1.1  riastrad 		if (plane_state->uapi.visible)
   7509   1.1  riastrad 			intel_plane_disable_noatomic(crtc, plane);
   7510   1.1  riastrad 	}
   7511   1.1  riastrad 
   7512   1.1  riastrad 	state = drm_atomic_state_alloc(&dev_priv->drm);
   7513   1.1  riastrad 	if (!state) {
   7514   1.1  riastrad 		DRM_DEBUG_KMS("failed to disable [CRTC:%d:%s], out of memory",
   7515   1.1  riastrad 			      crtc->base.base.id, crtc->base.name);
   7516   1.1  riastrad 		return;
   7517   1.1  riastrad 	}
   7518   1.1  riastrad 
   7519   1.1  riastrad 	state->acquire_ctx = ctx;
   7520   1.1  riastrad 
   7521   1.1  riastrad 	/* Everything's already locked, -EDEADLK can't happen. */
   7522   1.1  riastrad 	temp_crtc_state = intel_atomic_get_crtc_state(state, crtc);
   7523   1.1  riastrad 	ret = drm_atomic_add_affected_connectors(state, &crtc->base);
   7524   1.1  riastrad 
   7525   1.1  riastrad 	WARN_ON(IS_ERR(temp_crtc_state) || ret);
   7526   1.1  riastrad 
   7527   1.1  riastrad 	dev_priv->display.crtc_disable(to_intel_atomic_state(state), crtc);
   7528   1.1  riastrad 
   7529   1.1  riastrad 	drm_atomic_state_put(state);
   7530   1.1  riastrad 
   7531   1.1  riastrad 	DRM_DEBUG_KMS("[CRTC:%d:%s] hw state adjusted, was enabled, now disabled\n",
   7532   1.1  riastrad 		      crtc->base.base.id, crtc->base.name);
   7533   1.1  riastrad 
   7534   1.1  riastrad 	crtc->active = false;
   7535   1.1  riastrad 	crtc->base.enabled = false;
   7536   1.1  riastrad 
   7537   1.1  riastrad 	WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, NULL) < 0);
   7538   1.1  riastrad 	crtc_state->uapi.active = false;
   7539   1.1  riastrad 	crtc_state->uapi.connector_mask = 0;
   7540   1.1  riastrad 	crtc_state->uapi.encoder_mask = 0;
   7541   1.1  riastrad 	intel_crtc_free_hw_state(crtc_state);
   7542   1.1  riastrad 	memset(&crtc_state->hw, 0, sizeof(crtc_state->hw));
   7543   1.1  riastrad 
   7544   1.1  riastrad 	for_each_encoder_on_crtc(&dev_priv->drm, &crtc->base, encoder)
   7545   1.1  riastrad 		encoder->base.crtc = NULL;
   7546   1.1  riastrad 
   7547   1.1  riastrad 	intel_fbc_disable(crtc);
   7548   1.1  riastrad 	intel_update_watermarks(crtc);
   7549   1.1  riastrad 	intel_disable_shared_dpll(crtc_state);
   7550   1.1  riastrad 
   7551   1.1  riastrad 	domains = crtc->enabled_power_domains;
   7552   1.1  riastrad 	for_each_power_domain(domain, domains)
   7553   1.1  riastrad 		intel_display_power_put_unchecked(dev_priv, domain);
   7554   1.1  riastrad 	crtc->enabled_power_domains = 0;
   7555   1.1  riastrad 
   7556   1.1  riastrad 	dev_priv->active_pipes &= ~BIT(pipe);
   7557   1.1  riastrad 	dev_priv->min_cdclk[pipe] = 0;
   7558   1.1  riastrad 	dev_priv->min_voltage_level[pipe] = 0;
   7559   1.1  riastrad 
   7560   1.1  riastrad 	bw_state->data_rate[pipe] = 0;
   7561   1.1  riastrad 	bw_state->num_active_planes[pipe] = 0;
   7562   1.1  riastrad }
   7563   1.1  riastrad 
   7564   1.1  riastrad /*
   7565   1.1  riastrad  * turn all crtc's off, but do not adjust state
   7566   1.1  riastrad  * This has to be paired with a call to intel_modeset_setup_hw_state.
   7567   1.1  riastrad  */
   7568   1.1  riastrad int intel_display_suspend(struct drm_device *dev)
   7569   1.1  riastrad {
   7570   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   7571   1.1  riastrad 	struct drm_atomic_state *state;
   7572   1.1  riastrad 	int ret;
   7573   1.1  riastrad 
   7574   1.1  riastrad 	state = drm_atomic_helper_suspend(dev);
   7575   1.1  riastrad 	ret = PTR_ERR_OR_ZERO(state);
   7576   1.1  riastrad 	if (ret)
   7577   1.1  riastrad 		DRM_ERROR("Suspending crtc's failed with %i\n", ret);
   7578   1.1  riastrad 	else
   7579   1.1  riastrad 		dev_priv->modeset_restore_state = state;
   7580   1.1  riastrad 	return ret;
   7581   1.1  riastrad }
   7582   1.1  riastrad 
   7583   1.1  riastrad void intel_encoder_destroy(struct drm_encoder *encoder)
   7584   1.1  riastrad {
   7585   1.1  riastrad 	struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
   7586   1.1  riastrad 
   7587   1.1  riastrad 	drm_encoder_cleanup(encoder);
   7588   1.1  riastrad 	kfree(intel_encoder);
   7589   1.1  riastrad }
   7590   1.1  riastrad 
   7591   1.1  riastrad /* Cross check the actual hw state with our own modeset state tracking (and it's
   7592   1.1  riastrad  * internal consistency). */
   7593   1.1  riastrad static void intel_connector_verify_state(struct intel_crtc_state *crtc_state,
   7594   1.1  riastrad 					 struct drm_connector_state *conn_state)
   7595   1.1  riastrad {
   7596   1.1  riastrad 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
   7597   1.1  riastrad 
   7598   1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
   7599   1.1  riastrad 		      connector->base.base.id,
   7600   1.1  riastrad 		      connector->base.name);
   7601   1.1  riastrad 
   7602   1.1  riastrad 	if (connector->get_hw_state(connector)) {
   7603   1.1  riastrad 		struct intel_encoder *encoder = connector->encoder;
   7604   1.1  riastrad 
   7605   1.1  riastrad 		I915_STATE_WARN(!crtc_state,
   7606   1.1  riastrad 			 "connector enabled without attached crtc\n");
   7607   1.1  riastrad 
   7608   1.1  riastrad 		if (!crtc_state)
   7609   1.1  riastrad 			return;
   7610   1.1  riastrad 
   7611   1.1  riastrad 		I915_STATE_WARN(!crtc_state->hw.active,
   7612   1.1  riastrad 				"connector is active, but attached crtc isn't\n");
   7613   1.1  riastrad 
   7614   1.1  riastrad 		if (!encoder || encoder->type == INTEL_OUTPUT_DP_MST)
   7615   1.1  riastrad 			return;
   7616   1.1  riastrad 
   7617   1.1  riastrad 		I915_STATE_WARN(conn_state->best_encoder != &encoder->base,
   7618   1.1  riastrad 			"atomic encoder doesn't match attached encoder\n");
   7619   1.1  riastrad 
   7620   1.1  riastrad 		I915_STATE_WARN(conn_state->crtc != encoder->base.crtc,
   7621   1.1  riastrad 			"attached encoder crtc differs from connector crtc\n");
   7622   1.1  riastrad 	} else {
   7623   1.1  riastrad 		I915_STATE_WARN(crtc_state && crtc_state->hw.active,
   7624   1.1  riastrad 				"attached crtc is active, but connector isn't\n");
   7625   1.1  riastrad 		I915_STATE_WARN(!crtc_state && conn_state->best_encoder,
   7626   1.1  riastrad 			"best encoder set without crtc!\n");
   7627   1.1  riastrad 	}
   7628   1.1  riastrad }
   7629   1.1  riastrad 
   7630   1.1  riastrad static int pipe_required_fdi_lanes(struct intel_crtc_state *crtc_state)
   7631   1.1  riastrad {
   7632   1.1  riastrad 	if (crtc_state->hw.enable && crtc_state->has_pch_encoder)
   7633   1.1  riastrad 		return crtc_state->fdi_lanes;
   7634   1.1  riastrad 
   7635   1.1  riastrad 	return 0;
   7636   1.1  riastrad }
   7637   1.1  riastrad 
   7638   1.1  riastrad static int ilk_check_fdi_lanes(struct drm_device *dev, enum pipe pipe,
   7639   1.1  riastrad 			       struct intel_crtc_state *pipe_config)
   7640   1.1  riastrad {
   7641   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   7642   1.1  riastrad 	struct drm_atomic_state *state = pipe_config->uapi.state;
   7643   1.1  riastrad 	struct intel_crtc *other_crtc;
   7644   1.1  riastrad 	struct intel_crtc_state *other_crtc_state;
   7645   1.1  riastrad 
   7646   1.1  riastrad 	DRM_DEBUG_KMS("checking fdi config on pipe %c, lanes %i\n",
   7647   1.1  riastrad 		      pipe_name(pipe), pipe_config->fdi_lanes);
   7648   1.1  riastrad 	if (pipe_config->fdi_lanes > 4) {
   7649   1.1  riastrad 		DRM_DEBUG_KMS("invalid fdi lane config on pipe %c: %i lanes\n",
   7650   1.1  riastrad 			      pipe_name(pipe), pipe_config->fdi_lanes);
   7651   1.1  riastrad 		return -EINVAL;
   7652   1.1  riastrad 	}
   7653   1.1  riastrad 
   7654   1.1  riastrad 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
   7655   1.1  riastrad 		if (pipe_config->fdi_lanes > 2) {
   7656   1.1  riastrad 			DRM_DEBUG_KMS("only 2 lanes on haswell, required: %i lanes\n",
   7657   1.1  riastrad 				      pipe_config->fdi_lanes);
   7658   1.1  riastrad 			return -EINVAL;
   7659   1.1  riastrad 		} else {
   7660   1.1  riastrad 			return 0;
   7661   1.1  riastrad 		}
   7662   1.1  riastrad 	}
   7663   1.1  riastrad 
   7664   1.1  riastrad 	if (INTEL_NUM_PIPES(dev_priv) == 2)
   7665   1.1  riastrad 		return 0;
   7666   1.1  riastrad 
   7667   1.1  riastrad 	/* Ivybridge 3 pipe is really complicated */
   7668   1.1  riastrad 	switch (pipe) {
   7669   1.1  riastrad 	case PIPE_A:
   7670   1.1  riastrad 		return 0;
   7671   1.1  riastrad 	case PIPE_B:
   7672   1.1  riastrad 		if (pipe_config->fdi_lanes <= 2)
   7673   1.1  riastrad 			return 0;
   7674   1.1  riastrad 
   7675   1.1  riastrad 		other_crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_C);
   7676   1.1  riastrad 		other_crtc_state =
   7677   1.1  riastrad 			intel_atomic_get_crtc_state(state, other_crtc);
   7678   1.1  riastrad 		if (IS_ERR(other_crtc_state))
   7679   1.1  riastrad 			return PTR_ERR(other_crtc_state);
   7680   1.1  riastrad 
   7681   1.1  riastrad 		if (pipe_required_fdi_lanes(other_crtc_state) > 0) {
   7682   1.1  riastrad 			DRM_DEBUG_KMS("invalid shared fdi lane config on pipe %c: %i lanes\n",
   7683   1.1  riastrad 				      pipe_name(pipe), pipe_config->fdi_lanes);
   7684   1.1  riastrad 			return -EINVAL;
   7685   1.1  riastrad 		}
   7686   1.1  riastrad 		return 0;
   7687   1.1  riastrad 	case PIPE_C:
   7688   1.1  riastrad 		if (pipe_config->fdi_lanes > 2) {
   7689   1.1  riastrad 			DRM_DEBUG_KMS("only 2 lanes on pipe %c: required %i lanes\n",
   7690   1.1  riastrad 				      pipe_name(pipe), pipe_config->fdi_lanes);
   7691   1.1  riastrad 			return -EINVAL;
   7692   1.1  riastrad 		}
   7693   1.1  riastrad 
   7694   1.1  riastrad 		other_crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_B);
   7695   1.1  riastrad 		other_crtc_state =
   7696   1.1  riastrad 			intel_atomic_get_crtc_state(state, other_crtc);
   7697   1.1  riastrad 		if (IS_ERR(other_crtc_state))
   7698   1.1  riastrad 			return PTR_ERR(other_crtc_state);
   7699   1.1  riastrad 
   7700   1.1  riastrad 		if (pipe_required_fdi_lanes(other_crtc_state) > 2) {
   7701   1.1  riastrad 			DRM_DEBUG_KMS("fdi link B uses too many lanes to enable link C\n");
   7702   1.1  riastrad 			return -EINVAL;
   7703   1.1  riastrad 		}
   7704   1.1  riastrad 		return 0;
   7705   1.1  riastrad 	default:
   7706   1.1  riastrad 		BUG();
   7707   1.1  riastrad 	}
   7708   1.1  riastrad }
   7709   1.1  riastrad 
   7710   1.1  riastrad #define RETRY 1
   7711   1.1  riastrad static int ilk_fdi_compute_config(struct intel_crtc *intel_crtc,
   7712   1.1  riastrad 				  struct intel_crtc_state *pipe_config)
   7713   1.1  riastrad {
   7714   1.1  riastrad 	struct drm_device *dev = intel_crtc->base.dev;
   7715   1.1  riastrad 	const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
   7716   1.1  riastrad 	int lane, link_bw, fdi_dotclock, ret;
   7717   1.1  riastrad 	bool needs_recompute = false;
   7718   1.1  riastrad 
   7719   1.1  riastrad retry:
   7720   1.1  riastrad 	/* FDI is a binary signal running at ~2.7GHz, encoding
   7721   1.1  riastrad 	 * each output octet as 10 bits. The actual frequency
   7722   1.1  riastrad 	 * is stored as a divider into a 100MHz clock, and the
   7723   1.1  riastrad 	 * mode pixel clock is stored in units of 1KHz.
   7724   1.1  riastrad 	 * Hence the bw of each lane in terms of the mode signal
   7725   1.1  riastrad 	 * is:
   7726   1.1  riastrad 	 */
   7727   1.1  riastrad 	link_bw = intel_fdi_link_freq(to_i915(dev), pipe_config);
   7728   1.1  riastrad 
   7729   1.1  riastrad 	fdi_dotclock = adjusted_mode->crtc_clock;
   7730   1.1  riastrad 
   7731   1.1  riastrad 	lane = ilk_get_lanes_required(fdi_dotclock, link_bw,
   7732   1.1  riastrad 				      pipe_config->pipe_bpp);
   7733   1.1  riastrad 
   7734   1.1  riastrad 	pipe_config->fdi_lanes = lane;
   7735   1.1  riastrad 
   7736   1.1  riastrad 	intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock,
   7737   1.1  riastrad 			       link_bw, &pipe_config->fdi_m_n, false, false);
   7738   1.1  riastrad 
   7739   1.1  riastrad 	ret = ilk_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config);
   7740   1.1  riastrad 	if (ret == -EDEADLK)
   7741   1.1  riastrad 		return ret;
   7742   1.1  riastrad 
   7743   1.1  riastrad 	if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
   7744   1.1  riastrad 		pipe_config->pipe_bpp -= 2*3;
   7745   1.1  riastrad 		DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe bpp to %i\n",
   7746   1.1  riastrad 			      pipe_config->pipe_bpp);
   7747   1.1  riastrad 		needs_recompute = true;
   7748   1.1  riastrad 		pipe_config->bw_constrained = true;
   7749   1.1  riastrad 
   7750   1.1  riastrad 		goto retry;
   7751   1.1  riastrad 	}
   7752   1.1  riastrad 
   7753   1.1  riastrad 	if (needs_recompute)
   7754   1.1  riastrad 		return RETRY;
   7755   1.1  riastrad 
   7756   1.1  riastrad 	return ret;
   7757   1.1  riastrad }
   7758   1.1  riastrad 
   7759   1.1  riastrad bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state)
   7760   1.1  riastrad {
   7761   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   7762   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7763   1.1  riastrad 
   7764   1.1  riastrad 	/* IPS only exists on ULT machines and is tied to pipe A. */
   7765   1.1  riastrad 	if (!hsw_crtc_supports_ips(crtc))
   7766   1.1  riastrad 		return false;
   7767   1.1  riastrad 
   7768   1.1  riastrad 	if (!i915_modparams.enable_ips)
   7769   1.1  riastrad 		return false;
   7770   1.1  riastrad 
   7771   1.1  riastrad 	if (crtc_state->pipe_bpp > 24)
   7772   1.1  riastrad 		return false;
   7773   1.1  riastrad 
   7774   1.1  riastrad 	/*
   7775   1.1  riastrad 	 * We compare against max which means we must take
   7776   1.1  riastrad 	 * the increased cdclk requirement into account when
   7777   1.1  riastrad 	 * calculating the new cdclk.
   7778   1.1  riastrad 	 *
   7779   1.1  riastrad 	 * Should measure whether using a lower cdclk w/o IPS
   7780   1.1  riastrad 	 */
   7781   1.1  riastrad 	if (IS_BROADWELL(dev_priv) &&
   7782   1.1  riastrad 	    crtc_state->pixel_rate > dev_priv->max_cdclk_freq * 95 / 100)
   7783   1.1  riastrad 		return false;
   7784   1.1  riastrad 
   7785   1.1  riastrad 	return true;
   7786   1.1  riastrad }
   7787   1.1  riastrad 
   7788   1.1  riastrad static bool hsw_compute_ips_config(struct intel_crtc_state *crtc_state)
   7789   1.1  riastrad {
   7790   1.1  riastrad 	struct drm_i915_private *dev_priv =
   7791   1.1  riastrad 		to_i915(crtc_state->uapi.crtc->dev);
   7792   1.1  riastrad 	struct intel_atomic_state *intel_state =
   7793   1.1  riastrad 		to_intel_atomic_state(crtc_state->uapi.state);
   7794   1.1  riastrad 
   7795   1.1  riastrad 	if (!hsw_crtc_state_ips_capable(crtc_state))
   7796   1.1  riastrad 		return false;
   7797   1.1  riastrad 
   7798   1.1  riastrad 	/*
   7799   1.1  riastrad 	 * When IPS gets enabled, the pipe CRC changes. Since IPS gets
   7800   1.1  riastrad 	 * enabled and disabled dynamically based on package C states,
   7801   1.1  riastrad 	 * user space can't make reliable use of the CRCs, so let's just
   7802   1.1  riastrad 	 * completely disable it.
   7803   1.1  riastrad 	 */
   7804   1.1  riastrad 	if (crtc_state->crc_enabled)
   7805   1.1  riastrad 		return false;
   7806   1.1  riastrad 
   7807   1.1  riastrad 	/* IPS should be fine as long as at least one plane is enabled. */
   7808   1.1  riastrad 	if (!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)))
   7809   1.1  riastrad 		return false;
   7810   1.1  riastrad 
   7811   1.1  riastrad 	/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
   7812   1.1  riastrad 	if (IS_BROADWELL(dev_priv) &&
   7813   1.1  riastrad 	    crtc_state->pixel_rate > intel_state->cdclk.logical.cdclk * 95 / 100)
   7814   1.1  riastrad 		return false;
   7815   1.1  riastrad 
   7816   1.1  riastrad 	return true;
   7817   1.1  riastrad }
   7818   1.1  riastrad 
   7819   1.1  riastrad static bool intel_crtc_supports_double_wide(const struct intel_crtc *crtc)
   7820   1.1  riastrad {
   7821   1.1  riastrad 	const struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7822   1.1  riastrad 
   7823   1.1  riastrad 	/* GDG double wide on either pipe, otherwise pipe A only */
   7824   1.1  riastrad 	return INTEL_GEN(dev_priv) < 4 &&
   7825   1.1  riastrad 		(crtc->pipe == PIPE_A || IS_I915G(dev_priv));
   7826   1.1  riastrad }
   7827   1.1  riastrad 
   7828   1.1  riastrad static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config)
   7829   1.1  riastrad {
   7830   1.1  riastrad 	u32 pixel_rate;
   7831   1.1  riastrad 
   7832   1.1  riastrad 	pixel_rate = pipe_config->hw.adjusted_mode.crtc_clock;
   7833   1.1  riastrad 
   7834   1.1  riastrad 	/*
   7835   1.1  riastrad 	 * We only use IF-ID interlacing. If we ever use
   7836   1.1  riastrad 	 * PF-ID we'll need to adjust the pixel_rate here.
   7837   1.1  riastrad 	 */
   7838   1.1  riastrad 
   7839   1.1  riastrad 	if (pipe_config->pch_pfit.enabled) {
   7840   1.1  riastrad 		u64 pipe_w, pipe_h, pfit_w, pfit_h;
   7841   1.1  riastrad 		u32 pfit_size = pipe_config->pch_pfit.size;
   7842   1.1  riastrad 
   7843   1.1  riastrad 		pipe_w = pipe_config->pipe_src_w;
   7844   1.1  riastrad 		pipe_h = pipe_config->pipe_src_h;
   7845   1.1  riastrad 
   7846   1.1  riastrad 		pfit_w = (pfit_size >> 16) & 0xFFFF;
   7847   1.1  riastrad 		pfit_h = pfit_size & 0xFFFF;
   7848   1.1  riastrad 		if (pipe_w < pfit_w)
   7849   1.1  riastrad 			pipe_w = pfit_w;
   7850   1.1  riastrad 		if (pipe_h < pfit_h)
   7851   1.1  riastrad 			pipe_h = pfit_h;
   7852   1.1  riastrad 
   7853   1.1  riastrad 		if (WARN_ON(!pfit_w || !pfit_h))
   7854   1.1  riastrad 			return pixel_rate;
   7855   1.1  riastrad 
   7856   1.1  riastrad 		pixel_rate = div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
   7857   1.1  riastrad 				     pfit_w * pfit_h);
   7858   1.1  riastrad 	}
   7859   1.1  riastrad 
   7860   1.1  riastrad 	return pixel_rate;
   7861   1.1  riastrad }
   7862   1.1  riastrad 
   7863   1.1  riastrad static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
   7864   1.1  riastrad {
   7865   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   7866   1.1  riastrad 
   7867   1.1  riastrad 	if (HAS_GMCH(dev_priv))
   7868   1.1  riastrad 		/* FIXME calculate proper pipe pixel rate for GMCH pfit */
   7869   1.1  riastrad 		crtc_state->pixel_rate =
   7870   1.1  riastrad 			crtc_state->hw.adjusted_mode.crtc_clock;
   7871   1.1  riastrad 	else
   7872   1.1  riastrad 		crtc_state->pixel_rate =
   7873   1.1  riastrad 			ilk_pipe_pixel_rate(crtc_state);
   7874   1.1  riastrad }
   7875   1.1  riastrad 
   7876   1.1  riastrad static int intel_crtc_compute_config(struct intel_crtc *crtc,
   7877   1.1  riastrad 				     struct intel_crtc_state *pipe_config)
   7878   1.1  riastrad {
   7879   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   7880   1.1  riastrad 	const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
   7881   1.1  riastrad 	int clock_limit = dev_priv->max_dotclk_freq;
   7882   1.1  riastrad 
   7883   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4) {
   7884   1.1  riastrad 		clock_limit = dev_priv->max_cdclk_freq * 9 / 10;
   7885   1.1  riastrad 
   7886   1.1  riastrad 		/*
   7887   1.1  riastrad 		 * Enable double wide mode when the dot clock
   7888   1.1  riastrad 		 * is > 90% of the (display) core speed.
   7889   1.1  riastrad 		 */
   7890   1.1  riastrad 		if (intel_crtc_supports_double_wide(crtc) &&
   7891   1.1  riastrad 		    adjusted_mode->crtc_clock > clock_limit) {
   7892   1.1  riastrad 			clock_limit = dev_priv->max_dotclk_freq;
   7893   1.1  riastrad 			pipe_config->double_wide = true;
   7894   1.1  riastrad 		}
   7895   1.1  riastrad 	}
   7896   1.1  riastrad 
   7897   1.1  riastrad 	if (adjusted_mode->crtc_clock > clock_limit) {
   7898   1.1  riastrad 		DRM_DEBUG_KMS("requested pixel clock (%d kHz) too high (max: %d kHz, double wide: %s)\n",
   7899   1.1  riastrad 			      adjusted_mode->crtc_clock, clock_limit,
   7900   1.1  riastrad 			      yesno(pipe_config->double_wide));
   7901   1.1  riastrad 		return -EINVAL;
   7902   1.1  riastrad 	}
   7903   1.1  riastrad 
   7904   1.1  riastrad 	if ((pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
   7905   1.1  riastrad 	     pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) &&
   7906   1.1  riastrad 	     pipe_config->hw.ctm) {
   7907   1.1  riastrad 		/*
   7908   1.1  riastrad 		 * There is only one pipe CSC unit per pipe, and we need that
   7909   1.1  riastrad 		 * for output conversion from RGB->YCBCR. So if CTM is already
   7910   1.1  riastrad 		 * applied we can't support YCBCR420 output.
   7911   1.1  riastrad 		 */
   7912   1.1  riastrad 		DRM_DEBUG_KMS("YCBCR420 and CTM together are not possible\n");
   7913   1.1  riastrad 		return -EINVAL;
   7914   1.1  riastrad 	}
   7915   1.1  riastrad 
   7916   1.1  riastrad 	/*
   7917   1.1  riastrad 	 * Pipe horizontal size must be even in:
   7918   1.1  riastrad 	 * - DVO ganged mode
   7919   1.1  riastrad 	 * - LVDS dual channel mode
   7920   1.1  riastrad 	 * - Double wide pipe
   7921   1.1  riastrad 	 */
   7922   1.1  riastrad 	if (pipe_config->pipe_src_w & 1) {
   7923   1.1  riastrad 		if (pipe_config->double_wide) {
   7924   1.1  riastrad 			DRM_DEBUG_KMS("Odd pipe source width not supported with double wide pipe\n");
   7925   1.1  riastrad 			return -EINVAL;
   7926   1.1  riastrad 		}
   7927   1.1  riastrad 
   7928   1.1  riastrad 		if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_LVDS) &&
   7929   1.1  riastrad 		    intel_is_dual_link_lvds(dev_priv)) {
   7930   1.1  riastrad 			DRM_DEBUG_KMS("Odd pipe source width not supported with dual link LVDS\n");
   7931   1.1  riastrad 			return -EINVAL;
   7932   1.1  riastrad 		}
   7933   1.1  riastrad 	}
   7934   1.1  riastrad 
   7935   1.1  riastrad 	/* Cantiga+ cannot handle modes with a hsync front porch of 0.
   7936   1.1  riastrad 	 * WaPruneModeWithIncorrectHsyncOffset:ctg,elk,ilk,snb,ivb,vlv,hsw.
   7937   1.1  riastrad 	 */
   7938   1.1  riastrad 	if ((INTEL_GEN(dev_priv) > 4 || IS_G4X(dev_priv)) &&
   7939   1.1  riastrad 		adjusted_mode->crtc_hsync_start == adjusted_mode->crtc_hdisplay)
   7940   1.1  riastrad 		return -EINVAL;
   7941   1.1  riastrad 
   7942   1.1  riastrad 	intel_crtc_compute_pixel_rate(pipe_config);
   7943   1.1  riastrad 
   7944   1.1  riastrad 	if (pipe_config->has_pch_encoder)
   7945   1.1  riastrad 		return ilk_fdi_compute_config(crtc, pipe_config);
   7946   1.1  riastrad 
   7947   1.1  riastrad 	return 0;
   7948   1.1  riastrad }
   7949   1.1  riastrad 
   7950   1.1  riastrad static void
   7951   1.1  riastrad intel_reduce_m_n_ratio(u32 *num, u32 *den)
   7952   1.1  riastrad {
   7953   1.1  riastrad 	while (*num > DATA_LINK_M_N_MASK ||
   7954   1.1  riastrad 	       *den > DATA_LINK_M_N_MASK) {
   7955   1.1  riastrad 		*num >>= 1;
   7956   1.1  riastrad 		*den >>= 1;
   7957   1.1  riastrad 	}
   7958   1.1  riastrad }
   7959   1.1  riastrad 
   7960   1.1  riastrad static void compute_m_n(unsigned int m, unsigned int n,
   7961   1.1  riastrad 			u32 *ret_m, u32 *ret_n,
   7962   1.1  riastrad 			bool constant_n)
   7963   1.1  riastrad {
   7964   1.1  riastrad 	/*
   7965   1.1  riastrad 	 * Several DP dongles in particular seem to be fussy about
   7966   1.1  riastrad 	 * too large link M/N values. Give N value as 0x8000 that
   7967   1.1  riastrad 	 * should be acceptable by specific devices. 0x8000 is the
   7968   1.1  riastrad 	 * specified fixed N value for asynchronous clock mode,
   7969   1.1  riastrad 	 * which the devices expect also in synchronous clock mode.
   7970   1.1  riastrad 	 */
   7971   1.1  riastrad 	if (constant_n)
   7972   1.1  riastrad 		*ret_n = 0x8000;
   7973   1.1  riastrad 	else
   7974   1.1  riastrad 		*ret_n = min_t(unsigned int, roundup_pow_of_two(n), DATA_LINK_N_MAX);
   7975   1.1  riastrad 
   7976   1.1  riastrad 	*ret_m = div_u64(mul_u32_u32(m, *ret_n), n);
   7977   1.1  riastrad 	intel_reduce_m_n_ratio(ret_m, ret_n);
   7978   1.1  riastrad }
   7979   1.1  riastrad 
   7980   1.1  riastrad void
   7981   1.1  riastrad intel_link_compute_m_n(u16 bits_per_pixel, int nlanes,
   7982   1.1  riastrad 		       int pixel_clock, int link_clock,
   7983   1.1  riastrad 		       struct intel_link_m_n *m_n,
   7984   1.1  riastrad 		       bool constant_n, bool fec_enable)
   7985   1.1  riastrad {
   7986   1.1  riastrad 	u32 data_clock = bits_per_pixel * pixel_clock;
   7987   1.1  riastrad 
   7988   1.1  riastrad 	if (fec_enable)
   7989   1.1  riastrad 		data_clock = intel_dp_mode_to_fec_clock(data_clock);
   7990   1.1  riastrad 
   7991   1.1  riastrad 	m_n->tu = 64;
   7992   1.1  riastrad 	compute_m_n(data_clock,
   7993   1.1  riastrad 		    link_clock * nlanes * 8,
   7994   1.1  riastrad 		    &m_n->gmch_m, &m_n->gmch_n,
   7995   1.1  riastrad 		    constant_n);
   7996   1.1  riastrad 
   7997   1.1  riastrad 	compute_m_n(pixel_clock, link_clock,
   7998   1.1  riastrad 		    &m_n->link_m, &m_n->link_n,
   7999   1.1  riastrad 		    constant_n);
   8000   1.1  riastrad }
   8001   1.1  riastrad 
   8002   1.1  riastrad static void intel_panel_sanitize_ssc(struct drm_i915_private *dev_priv)
   8003   1.1  riastrad {
   8004   1.1  riastrad 	/*
   8005   1.1  riastrad 	 * There may be no VBT; and if the BIOS enabled SSC we can
   8006   1.1  riastrad 	 * just keep using it to avoid unnecessary flicker.  Whereas if the
   8007   1.1  riastrad 	 * BIOS isn't using it, don't assume it will work even if the VBT
   8008   1.1  riastrad 	 * indicates as much.
   8009   1.1  riastrad 	 */
   8010   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)) {
   8011   1.1  riastrad 		bool bios_lvds_use_ssc = I915_READ(PCH_DREF_CONTROL) &
   8012   1.1  riastrad 			DREF_SSC1_ENABLE;
   8013   1.1  riastrad 
   8014   1.1  riastrad 		if (dev_priv->vbt.lvds_use_ssc != bios_lvds_use_ssc) {
   8015   1.1  riastrad 			DRM_DEBUG_KMS("SSC %s by BIOS, overriding VBT which says %s\n",
   8016   1.1  riastrad 				      enableddisabled(bios_lvds_use_ssc),
   8017   1.1  riastrad 				      enableddisabled(dev_priv->vbt.lvds_use_ssc));
   8018   1.1  riastrad 			dev_priv->vbt.lvds_use_ssc = bios_lvds_use_ssc;
   8019   1.1  riastrad 		}
   8020   1.1  riastrad 	}
   8021   1.1  riastrad }
   8022   1.1  riastrad 
   8023   1.1  riastrad static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
   8024   1.1  riastrad {
   8025   1.1  riastrad 	if (i915_modparams.panel_use_ssc >= 0)
   8026   1.1  riastrad 		return i915_modparams.panel_use_ssc != 0;
   8027   1.1  riastrad 	return dev_priv->vbt.lvds_use_ssc
   8028   1.1  riastrad 		&& !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
   8029   1.1  riastrad }
   8030   1.1  riastrad 
   8031   1.1  riastrad static u32 pnv_dpll_compute_fp(struct dpll *dpll)
   8032   1.1  riastrad {
   8033   1.1  riastrad 	return (1 << dpll->n) << 16 | dpll->m2;
   8034   1.1  riastrad }
   8035   1.1  riastrad 
   8036   1.1  riastrad static u32 i9xx_dpll_compute_fp(struct dpll *dpll)
   8037   1.1  riastrad {
   8038   1.1  riastrad 	return dpll->n << 16 | dpll->m1 << 8 | dpll->m2;
   8039   1.1  riastrad }
   8040   1.1  riastrad 
   8041   1.1  riastrad static void i9xx_update_pll_dividers(struct intel_crtc *crtc,
   8042   1.1  riastrad 				     struct intel_crtc_state *crtc_state,
   8043   1.1  riastrad 				     struct dpll *reduced_clock)
   8044   1.1  riastrad {
   8045   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8046   1.1  riastrad 	u32 fp, fp2 = 0;
   8047   1.1  riastrad 
   8048   1.1  riastrad 	if (IS_PINEVIEW(dev_priv)) {
   8049   1.1  riastrad 		fp = pnv_dpll_compute_fp(&crtc_state->dpll);
   8050   1.1  riastrad 		if (reduced_clock)
   8051   1.1  riastrad 			fp2 = pnv_dpll_compute_fp(reduced_clock);
   8052   1.1  riastrad 	} else {
   8053   1.1  riastrad 		fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
   8054   1.1  riastrad 		if (reduced_clock)
   8055   1.1  riastrad 			fp2 = i9xx_dpll_compute_fp(reduced_clock);
   8056   1.1  riastrad 	}
   8057   1.1  riastrad 
   8058   1.1  riastrad 	crtc_state->dpll_hw_state.fp0 = fp;
   8059   1.1  riastrad 
   8060   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
   8061   1.1  riastrad 	    reduced_clock) {
   8062   1.1  riastrad 		crtc_state->dpll_hw_state.fp1 = fp2;
   8063   1.1  riastrad 	} else {
   8064   1.1  riastrad 		crtc_state->dpll_hw_state.fp1 = fp;
   8065   1.1  riastrad 	}
   8066   1.1  riastrad }
   8067   1.1  riastrad 
   8068   1.1  riastrad static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv, enum pipe
   8069   1.1  riastrad 		pipe)
   8070   1.1  riastrad {
   8071   1.1  riastrad 	u32 reg_val;
   8072   1.1  riastrad 
   8073   1.1  riastrad 	/*
   8074   1.1  riastrad 	 * PLLB opamp always calibrates to max value of 0x3f, force enable it
   8075   1.1  riastrad 	 * and set it to a reasonable value instead.
   8076   1.1  riastrad 	 */
   8077   1.1  riastrad 	reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
   8078   1.1  riastrad 	reg_val &= 0xffffff00;
   8079   1.1  riastrad 	reg_val |= 0x00000030;
   8080   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
   8081   1.1  riastrad 
   8082   1.1  riastrad 	reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
   8083   1.1  riastrad 	reg_val &= 0x00ffffff;
   8084   1.1  riastrad 	reg_val |= 0x8c000000;
   8085   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
   8086   1.1  riastrad 
   8087   1.1  riastrad 	reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
   8088   1.1  riastrad 	reg_val &= 0xffffff00;
   8089   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
   8090   1.1  riastrad 
   8091   1.1  riastrad 	reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
   8092   1.1  riastrad 	reg_val &= 0x00ffffff;
   8093   1.1  riastrad 	reg_val |= 0xb0000000;
   8094   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
   8095   1.1  riastrad }
   8096   1.1  riastrad 
   8097   1.1  riastrad static void intel_pch_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
   8098   1.1  riastrad 					 const struct intel_link_m_n *m_n)
   8099   1.1  riastrad {
   8100   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   8101   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8102   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8103   1.1  riastrad 
   8104   1.1  riastrad 	I915_WRITE(PCH_TRANS_DATA_M1(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
   8105   1.1  riastrad 	I915_WRITE(PCH_TRANS_DATA_N1(pipe), m_n->gmch_n);
   8106   1.1  riastrad 	I915_WRITE(PCH_TRANS_LINK_M1(pipe), m_n->link_m);
   8107   1.1  riastrad 	I915_WRITE(PCH_TRANS_LINK_N1(pipe), m_n->link_n);
   8108   1.1  riastrad }
   8109   1.1  riastrad 
   8110   1.1  riastrad static bool transcoder_has_m2_n2(struct drm_i915_private *dev_priv,
   8111   1.1  riastrad 				 enum transcoder transcoder)
   8112   1.1  riastrad {
   8113   1.1  riastrad 	if (IS_HASWELL(dev_priv))
   8114   1.1  riastrad 		return transcoder == TRANSCODER_EDP;
   8115   1.1  riastrad 
   8116   1.1  riastrad 	/*
   8117   1.1  riastrad 	 * Strictly speaking some registers are available before
   8118   1.1  riastrad 	 * gen7, but we only support DRRS on gen7+
   8119   1.1  riastrad 	 */
   8120   1.1  riastrad 	return IS_GEN(dev_priv, 7) || IS_CHERRYVIEW(dev_priv);
   8121   1.1  riastrad }
   8122   1.1  riastrad 
   8123   1.1  riastrad static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
   8124   1.1  riastrad 					 const struct intel_link_m_n *m_n,
   8125   1.1  riastrad 					 const struct intel_link_m_n *m2_n2)
   8126   1.1  riastrad {
   8127   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   8128   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8129   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8130   1.1  riastrad 	enum transcoder transcoder = crtc_state->cpu_transcoder;
   8131   1.1  riastrad 
   8132   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5) {
   8133   1.1  riastrad 		I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
   8134   1.1  riastrad 		I915_WRITE(PIPE_DATA_N1(transcoder), m_n->gmch_n);
   8135   1.1  riastrad 		I915_WRITE(PIPE_LINK_M1(transcoder), m_n->link_m);
   8136   1.1  riastrad 		I915_WRITE(PIPE_LINK_N1(transcoder), m_n->link_n);
   8137   1.1  riastrad 		/*
   8138   1.1  riastrad 		 *  M2_N2 registers are set only if DRRS is supported
   8139   1.1  riastrad 		 * (to make sure the registers are not unnecessarily accessed).
   8140   1.1  riastrad 		 */
   8141   1.1  riastrad 		if (m2_n2 && crtc_state->has_drrs &&
   8142   1.1  riastrad 		    transcoder_has_m2_n2(dev_priv, transcoder)) {
   8143   1.1  riastrad 			I915_WRITE(PIPE_DATA_M2(transcoder),
   8144   1.1  riastrad 					TU_SIZE(m2_n2->tu) | m2_n2->gmch_m);
   8145   1.1  riastrad 			I915_WRITE(PIPE_DATA_N2(transcoder), m2_n2->gmch_n);
   8146   1.1  riastrad 			I915_WRITE(PIPE_LINK_M2(transcoder), m2_n2->link_m);
   8147   1.1  riastrad 			I915_WRITE(PIPE_LINK_N2(transcoder), m2_n2->link_n);
   8148   1.1  riastrad 		}
   8149   1.1  riastrad 	} else {
   8150   1.1  riastrad 		I915_WRITE(PIPE_DATA_M_G4X(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
   8151   1.1  riastrad 		I915_WRITE(PIPE_DATA_N_G4X(pipe), m_n->gmch_n);
   8152   1.1  riastrad 		I915_WRITE(PIPE_LINK_M_G4X(pipe), m_n->link_m);
   8153   1.1  riastrad 		I915_WRITE(PIPE_LINK_N_G4X(pipe), m_n->link_n);
   8154   1.1  riastrad 	}
   8155   1.1  riastrad }
   8156   1.1  riastrad 
   8157   1.1  riastrad void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, enum link_m_n_set m_n)
   8158   1.1  riastrad {
   8159   1.1  riastrad 	const struct intel_link_m_n *dp_m_n, *dp_m2_n2 = NULL;
   8160   1.1  riastrad 
   8161   1.1  riastrad 	if (m_n == M1_N1) {
   8162   1.1  riastrad 		dp_m_n = &crtc_state->dp_m_n;
   8163   1.1  riastrad 		dp_m2_n2 = &crtc_state->dp_m2_n2;
   8164   1.1  riastrad 	} else if (m_n == M2_N2) {
   8165   1.1  riastrad 
   8166   1.1  riastrad 		/*
   8167   1.1  riastrad 		 * M2_N2 registers are not supported. Hence m2_n2 divider value
   8168   1.1  riastrad 		 * needs to be programmed into M1_N1.
   8169   1.1  riastrad 		 */
   8170   1.1  riastrad 		dp_m_n = &crtc_state->dp_m2_n2;
   8171   1.1  riastrad 	} else {
   8172   1.1  riastrad 		DRM_ERROR("Unsupported divider value\n");
   8173   1.1  riastrad 		return;
   8174   1.1  riastrad 	}
   8175   1.1  riastrad 
   8176   1.1  riastrad 	if (crtc_state->has_pch_encoder)
   8177   1.1  riastrad 		intel_pch_transcoder_set_m_n(crtc_state, &crtc_state->dp_m_n);
   8178   1.1  riastrad 	else
   8179   1.1  riastrad 		intel_cpu_transcoder_set_m_n(crtc_state, dp_m_n, dp_m2_n2);
   8180   1.1  riastrad }
   8181   1.1  riastrad 
   8182   1.1  riastrad static void vlv_compute_dpll(struct intel_crtc *crtc,
   8183   1.1  riastrad 			     struct intel_crtc_state *pipe_config)
   8184   1.1  riastrad {
   8185   1.1  riastrad 	pipe_config->dpll_hw_state.dpll = DPLL_INTEGRATED_REF_CLK_VLV |
   8186   1.1  riastrad 		DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
   8187   1.1  riastrad 	if (crtc->pipe != PIPE_A)
   8188   1.1  riastrad 		pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
   8189   1.1  riastrad 
   8190   1.1  riastrad 	/* DPLL not used with DSI, but still need the rest set up */
   8191   1.1  riastrad 	if (!intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DSI))
   8192   1.1  riastrad 		pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE |
   8193   1.1  riastrad 			DPLL_EXT_BUFFER_ENABLE_VLV;
   8194   1.1  riastrad 
   8195   1.1  riastrad 	pipe_config->dpll_hw_state.dpll_md =
   8196   1.1  riastrad 		(pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
   8197   1.1  riastrad }
   8198   1.1  riastrad 
   8199   1.1  riastrad static void chv_compute_dpll(struct intel_crtc *crtc,
   8200   1.1  riastrad 			     struct intel_crtc_state *pipe_config)
   8201   1.1  riastrad {
   8202   1.1  riastrad 	pipe_config->dpll_hw_state.dpll = DPLL_SSC_REF_CLK_CHV |
   8203   1.1  riastrad 		DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
   8204   1.1  riastrad 	if (crtc->pipe != PIPE_A)
   8205   1.1  riastrad 		pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
   8206   1.1  riastrad 
   8207   1.1  riastrad 	/* DPLL not used with DSI, but still need the rest set up */
   8208   1.1  riastrad 	if (!intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DSI))
   8209   1.1  riastrad 		pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE;
   8210   1.1  riastrad 
   8211   1.1  riastrad 	pipe_config->dpll_hw_state.dpll_md =
   8212   1.1  riastrad 		(pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
   8213   1.1  riastrad }
   8214   1.1  riastrad 
   8215   1.1  riastrad static void vlv_prepare_pll(struct intel_crtc *crtc,
   8216   1.1  riastrad 			    const struct intel_crtc_state *pipe_config)
   8217   1.1  riastrad {
   8218   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8219   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8220   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8221   1.1  riastrad 	u32 mdiv;
   8222   1.1  riastrad 	u32 bestn, bestm1, bestm2, bestp1, bestp2;
   8223   1.1  riastrad 	u32 coreclk, reg_val;
   8224   1.1  riastrad 
   8225   1.1  riastrad 	/* Enable Refclk */
   8226   1.1  riastrad 	I915_WRITE(DPLL(pipe),
   8227   1.1  riastrad 		   pipe_config->dpll_hw_state.dpll &
   8228   1.1  riastrad 		   ~(DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV));
   8229   1.1  riastrad 
   8230   1.1  riastrad 	/* No need to actually set up the DPLL with DSI */
   8231   1.1  riastrad 	if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
   8232   1.1  riastrad 		return;
   8233   1.1  riastrad 
   8234   1.1  riastrad 	vlv_dpio_get(dev_priv);
   8235   1.1  riastrad 
   8236   1.1  riastrad 	bestn = pipe_config->dpll.n;
   8237   1.1  riastrad 	bestm1 = pipe_config->dpll.m1;
   8238   1.1  riastrad 	bestm2 = pipe_config->dpll.m2;
   8239   1.1  riastrad 	bestp1 = pipe_config->dpll.p1;
   8240   1.1  riastrad 	bestp2 = pipe_config->dpll.p2;
   8241   1.1  riastrad 
   8242   1.1  riastrad 	/* See eDP HDMI DPIO driver vbios notes doc */
   8243   1.1  riastrad 
   8244   1.1  riastrad 	/* PLL B needs special handling */
   8245   1.1  riastrad 	if (pipe == PIPE_B)
   8246   1.1  riastrad 		vlv_pllb_recal_opamp(dev_priv, pipe);
   8247   1.1  riastrad 
   8248   1.1  riastrad 	/* Set up Tx target for periodic Rcomp update */
   8249   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9_BCAST, 0x0100000f);
   8250   1.1  riastrad 
   8251   1.1  riastrad 	/* Disable target IRef on PLL */
   8252   1.1  riastrad 	reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW8(pipe));
   8253   1.1  riastrad 	reg_val &= 0x00ffffff;
   8254   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW8(pipe), reg_val);
   8255   1.1  riastrad 
   8256   1.1  riastrad 	/* Disable fast lock */
   8257   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_CMN_DW0, 0x610);
   8258   1.1  riastrad 
   8259   1.1  riastrad 	/* Set idtafcrecal before PLL is enabled */
   8260   1.1  riastrad 	mdiv = ((bestm1 << DPIO_M1DIV_SHIFT) | (bestm2 & DPIO_M2DIV_MASK));
   8261   1.1  riastrad 	mdiv |= ((bestp1 << DPIO_P1_SHIFT) | (bestp2 << DPIO_P2_SHIFT));
   8262   1.1  riastrad 	mdiv |= ((bestn << DPIO_N_SHIFT));
   8263   1.1  riastrad 	mdiv |= (1 << DPIO_K_SHIFT);
   8264   1.1  riastrad 
   8265   1.1  riastrad 	/*
   8266   1.1  riastrad 	 * Post divider depends on pixel clock rate, DAC vs digital (and LVDS,
   8267   1.1  riastrad 	 * but we don't support that).
   8268   1.1  riastrad 	 * Note: don't use the DAC post divider as it seems unstable.
   8269   1.1  riastrad 	 */
   8270   1.1  riastrad 	mdiv |= (DPIO_POST_DIV_HDMIDP << DPIO_POST_DIV_SHIFT);
   8271   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
   8272   1.1  riastrad 
   8273   1.1  riastrad 	mdiv |= DPIO_ENABLE_CALIBRATION;
   8274   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
   8275   1.1  riastrad 
   8276   1.1  riastrad 	/* Set HBR and RBR LPF coefficients */
   8277   1.1  riastrad 	if (pipe_config->port_clock == 162000 ||
   8278   1.1  riastrad 	    intel_crtc_has_type(pipe_config, INTEL_OUTPUT_ANALOG) ||
   8279   1.1  riastrad 	    intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI))
   8280   1.1  riastrad 		vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
   8281   1.1  riastrad 				 0x009f0003);
   8282   1.1  riastrad 	else
   8283   1.1  riastrad 		vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
   8284   1.1  riastrad 				 0x00d0000f);
   8285   1.1  riastrad 
   8286   1.1  riastrad 	if (intel_crtc_has_dp_encoder(pipe_config)) {
   8287   1.1  riastrad 		/* Use SSC source */
   8288   1.1  riastrad 		if (pipe == PIPE_A)
   8289   1.1  riastrad 			vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
   8290   1.1  riastrad 					 0x0df40000);
   8291   1.1  riastrad 		else
   8292   1.1  riastrad 			vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
   8293   1.1  riastrad 					 0x0df70000);
   8294   1.1  riastrad 	} else { /* HDMI or VGA */
   8295   1.1  riastrad 		/* Use bend source */
   8296   1.1  riastrad 		if (pipe == PIPE_A)
   8297   1.1  riastrad 			vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
   8298   1.1  riastrad 					 0x0df70000);
   8299   1.1  riastrad 		else
   8300   1.1  riastrad 			vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
   8301   1.1  riastrad 					 0x0df40000);
   8302   1.1  riastrad 	}
   8303   1.1  riastrad 
   8304   1.1  riastrad 	coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe));
   8305   1.1  riastrad 	coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
   8306   1.1  riastrad 	if (intel_crtc_has_dp_encoder(pipe_config))
   8307   1.1  riastrad 		coreclk |= 0x01000000;
   8308   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk);
   8309   1.1  riastrad 
   8310   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW11(pipe), 0x87871000);
   8311   1.1  riastrad 
   8312   1.1  riastrad 	vlv_dpio_put(dev_priv);
   8313   1.1  riastrad }
   8314   1.1  riastrad 
   8315   1.1  riastrad static void chv_prepare_pll(struct intel_crtc *crtc,
   8316   1.1  riastrad 			    const struct intel_crtc_state *pipe_config)
   8317   1.1  riastrad {
   8318   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8319   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8320   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8321   1.1  riastrad 	enum dpio_channel port = vlv_pipe_to_channel(pipe);
   8322   1.1  riastrad 	u32 loopfilter, tribuf_calcntr;
   8323   1.3  riastrad 	u32 bestn __unused, bestm1 __unused, bestm2, bestp1, bestp2, bestm2_frac;
   8324   1.1  riastrad 	u32 dpio_val;
   8325   1.1  riastrad 	int vco;
   8326   1.1  riastrad 
   8327   1.1  riastrad 	/* Enable Refclk and SSC */
   8328   1.1  riastrad 	I915_WRITE(DPLL(pipe),
   8329   1.1  riastrad 		   pipe_config->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE);
   8330   1.1  riastrad 
   8331   1.1  riastrad 	/* No need to actually set up the DPLL with DSI */
   8332   1.1  riastrad 	if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
   8333   1.1  riastrad 		return;
   8334   1.1  riastrad 
   8335   1.1  riastrad 	bestn = pipe_config->dpll.n;
   8336   1.1  riastrad 	bestm2_frac = pipe_config->dpll.m2 & 0x3fffff;
   8337   1.1  riastrad 	bestm1 = pipe_config->dpll.m1;
   8338   1.1  riastrad 	bestm2 = pipe_config->dpll.m2 >> 22;
   8339   1.1  riastrad 	bestp1 = pipe_config->dpll.p1;
   8340   1.1  riastrad 	bestp2 = pipe_config->dpll.p2;
   8341   1.1  riastrad 	vco = pipe_config->dpll.vco;
   8342   1.1  riastrad 	dpio_val = 0;
   8343   1.1  riastrad 	loopfilter = 0;
   8344   1.1  riastrad 
   8345   1.1  riastrad 	vlv_dpio_get(dev_priv);
   8346   1.1  riastrad 
   8347   1.1  riastrad 	/* p1 and p2 divider */
   8348   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW13(port),
   8349   1.1  riastrad 			5 << DPIO_CHV_S1_DIV_SHIFT |
   8350   1.1  riastrad 			bestp1 << DPIO_CHV_P1_DIV_SHIFT |
   8351   1.1  riastrad 			bestp2 << DPIO_CHV_P2_DIV_SHIFT |
   8352   1.1  riastrad 			1 << DPIO_CHV_K_DIV_SHIFT);
   8353   1.1  riastrad 
   8354   1.1  riastrad 	/* Feedback post-divider - m2 */
   8355   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW0(port), bestm2);
   8356   1.1  riastrad 
   8357   1.1  riastrad 	/* Feedback refclk divider - n and m1 */
   8358   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW1(port),
   8359   1.1  riastrad 			DPIO_CHV_M1_DIV_BY_2 |
   8360   1.1  riastrad 			1 << DPIO_CHV_N_DIV_SHIFT);
   8361   1.1  riastrad 
   8362   1.1  riastrad 	/* M2 fraction division */
   8363   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW2(port), bestm2_frac);
   8364   1.1  riastrad 
   8365   1.1  riastrad 	/* M2 fraction division enable */
   8366   1.1  riastrad 	dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
   8367   1.1  riastrad 	dpio_val &= ~(DPIO_CHV_FEEDFWD_GAIN_MASK | DPIO_CHV_FRAC_DIV_EN);
   8368   1.1  riastrad 	dpio_val |= (2 << DPIO_CHV_FEEDFWD_GAIN_SHIFT);
   8369   1.1  riastrad 	if (bestm2_frac)
   8370   1.1  riastrad 		dpio_val |= DPIO_CHV_FRAC_DIV_EN;
   8371   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW3(port), dpio_val);
   8372   1.1  riastrad 
   8373   1.1  riastrad 	/* Program digital lock detect threshold */
   8374   1.1  riastrad 	dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW9(port));
   8375   1.1  riastrad 	dpio_val &= ~(DPIO_CHV_INT_LOCK_THRESHOLD_MASK |
   8376   1.1  riastrad 					DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE);
   8377   1.1  riastrad 	dpio_val |= (0x5 << DPIO_CHV_INT_LOCK_THRESHOLD_SHIFT);
   8378   1.1  riastrad 	if (!bestm2_frac)
   8379   1.1  riastrad 		dpio_val |= DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE;
   8380   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW9(port), dpio_val);
   8381   1.1  riastrad 
   8382   1.1  riastrad 	/* Loop filter */
   8383   1.1  riastrad 	if (vco == 5400000) {
   8384   1.1  riastrad 		loopfilter |= (0x3 << DPIO_CHV_PROP_COEFF_SHIFT);
   8385   1.1  riastrad 		loopfilter |= (0x8 << DPIO_CHV_INT_COEFF_SHIFT);
   8386   1.1  riastrad 		loopfilter |= (0x1 << DPIO_CHV_GAIN_CTRL_SHIFT);
   8387   1.1  riastrad 		tribuf_calcntr = 0x9;
   8388   1.1  riastrad 	} else if (vco <= 6200000) {
   8389   1.1  riastrad 		loopfilter |= (0x5 << DPIO_CHV_PROP_COEFF_SHIFT);
   8390   1.1  riastrad 		loopfilter |= (0xB << DPIO_CHV_INT_COEFF_SHIFT);
   8391   1.1  riastrad 		loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
   8392   1.1  riastrad 		tribuf_calcntr = 0x9;
   8393   1.1  riastrad 	} else if (vco <= 6480000) {
   8394   1.1  riastrad 		loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
   8395   1.1  riastrad 		loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
   8396   1.1  riastrad 		loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
   8397   1.1  riastrad 		tribuf_calcntr = 0x8;
   8398   1.1  riastrad 	} else {
   8399   1.1  riastrad 		/* Not supported. Apply the same limits as in the max case */
   8400   1.1  riastrad 		loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
   8401   1.1  riastrad 		loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
   8402   1.1  riastrad 		loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
   8403   1.1  riastrad 		tribuf_calcntr = 0;
   8404   1.1  riastrad 	}
   8405   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW6(port), loopfilter);
   8406   1.1  riastrad 
   8407   1.1  riastrad 	dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW8(port));
   8408   1.1  riastrad 	dpio_val &= ~DPIO_CHV_TDC_TARGET_CNT_MASK;
   8409   1.1  riastrad 	dpio_val |= (tribuf_calcntr << DPIO_CHV_TDC_TARGET_CNT_SHIFT);
   8410   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW8(port), dpio_val);
   8411   1.1  riastrad 
   8412   1.1  riastrad 	/* AFC Recal */
   8413   1.1  riastrad 	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port),
   8414   1.1  riastrad 			vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)) |
   8415   1.1  riastrad 			DPIO_AFC_RECAL);
   8416   1.1  riastrad 
   8417   1.1  riastrad 	vlv_dpio_put(dev_priv);
   8418   1.1  riastrad }
   8419   1.1  riastrad 
   8420   1.1  riastrad /**
   8421   1.1  riastrad  * vlv_force_pll_on - forcibly enable just the PLL
   8422   1.1  riastrad  * @dev_priv: i915 private structure
   8423   1.1  riastrad  * @pipe: pipe PLL to enable
   8424   1.1  riastrad  * @dpll: PLL configuration
   8425   1.1  riastrad  *
   8426   1.1  riastrad  * Enable the PLL for @pipe using the supplied @dpll config. To be used
   8427   1.1  riastrad  * in cases where we need the PLL enabled even when @pipe is not going to
   8428   1.1  riastrad  * be enabled.
   8429   1.1  riastrad  */
   8430   1.1  riastrad int vlv_force_pll_on(struct drm_i915_private *dev_priv, enum pipe pipe,
   8431   1.1  riastrad 		     const struct dpll *dpll)
   8432   1.1  riastrad {
   8433   1.1  riastrad 	struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   8434   1.1  riastrad 	struct intel_crtc_state *pipe_config;
   8435   1.1  riastrad 
   8436   1.1  riastrad 	pipe_config = intel_crtc_state_alloc(crtc);
   8437   1.1  riastrad 	if (!pipe_config)
   8438   1.1  riastrad 		return -ENOMEM;
   8439   1.1  riastrad 
   8440   1.1  riastrad 	pipe_config->cpu_transcoder = (enum transcoder)pipe;
   8441   1.1  riastrad 	pipe_config->pixel_multiplier = 1;
   8442   1.1  riastrad 	pipe_config->dpll = *dpll;
   8443   1.1  riastrad 
   8444   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv)) {
   8445   1.1  riastrad 		chv_compute_dpll(crtc, pipe_config);
   8446   1.1  riastrad 		chv_prepare_pll(crtc, pipe_config);
   8447   1.1  riastrad 		chv_enable_pll(crtc, pipe_config);
   8448   1.1  riastrad 	} else {
   8449   1.1  riastrad 		vlv_compute_dpll(crtc, pipe_config);
   8450   1.1  riastrad 		vlv_prepare_pll(crtc, pipe_config);
   8451   1.1  riastrad 		vlv_enable_pll(crtc, pipe_config);
   8452   1.1  riastrad 	}
   8453   1.1  riastrad 
   8454   1.1  riastrad 	kfree(pipe_config);
   8455   1.1  riastrad 
   8456   1.1  riastrad 	return 0;
   8457   1.1  riastrad }
   8458   1.1  riastrad 
   8459   1.1  riastrad /**
   8460   1.1  riastrad  * vlv_force_pll_off - forcibly disable just the PLL
   8461   1.1  riastrad  * @dev_priv: i915 private structure
   8462   1.1  riastrad  * @pipe: pipe PLL to disable
   8463   1.1  riastrad  *
   8464   1.1  riastrad  * Disable the PLL for @pipe. To be used in cases where we need
   8465   1.1  riastrad  * the PLL enabled even when @pipe is not going to be enabled.
   8466   1.1  riastrad  */
   8467   1.1  riastrad void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe)
   8468   1.1  riastrad {
   8469   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv))
   8470   1.1  riastrad 		chv_disable_pll(dev_priv, pipe);
   8471   1.1  riastrad 	else
   8472   1.1  riastrad 		vlv_disable_pll(dev_priv, pipe);
   8473   1.1  riastrad }
   8474   1.1  riastrad 
   8475   1.1  riastrad static void i9xx_compute_dpll(struct intel_crtc *crtc,
   8476   1.1  riastrad 			      struct intel_crtc_state *crtc_state,
   8477   1.1  riastrad 			      struct dpll *reduced_clock)
   8478   1.1  riastrad {
   8479   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8480   1.1  riastrad 	u32 dpll;
   8481   1.1  riastrad 	struct dpll *clock = &crtc_state->dpll;
   8482   1.1  riastrad 
   8483   1.1  riastrad 	i9xx_update_pll_dividers(crtc, crtc_state, reduced_clock);
   8484   1.1  riastrad 
   8485   1.1  riastrad 	dpll = DPLL_VGA_MODE_DIS;
   8486   1.1  riastrad 
   8487   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
   8488   1.1  riastrad 		dpll |= DPLLB_MODE_LVDS;
   8489   1.1  riastrad 	else
   8490   1.1  riastrad 		dpll |= DPLLB_MODE_DAC_SERIAL;
   8491   1.1  riastrad 
   8492   1.1  riastrad 	if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
   8493   1.1  riastrad 	    IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
   8494   1.1  riastrad 		dpll |= (crtc_state->pixel_multiplier - 1)
   8495   1.1  riastrad 			<< SDVO_MULTIPLIER_SHIFT_HIRES;
   8496   1.1  riastrad 	}
   8497   1.1  riastrad 
   8498   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO) ||
   8499   1.1  riastrad 	    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
   8500   1.1  riastrad 		dpll |= DPLL_SDVO_HIGH_SPEED;
   8501   1.1  riastrad 
   8502   1.1  riastrad 	if (intel_crtc_has_dp_encoder(crtc_state))
   8503   1.1  riastrad 		dpll |= DPLL_SDVO_HIGH_SPEED;
   8504   1.1  riastrad 
   8505   1.1  riastrad 	/* compute bitmask from p1 value */
   8506   1.1  riastrad 	if (IS_PINEVIEW(dev_priv))
   8507   1.1  riastrad 		dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW;
   8508   1.1  riastrad 	else {
   8509   1.1  riastrad 		dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
   8510   1.1  riastrad 		if (IS_G4X(dev_priv) && reduced_clock)
   8511   1.1  riastrad 			dpll |= (1 << (reduced_clock->p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
   8512   1.1  riastrad 	}
   8513   1.1  riastrad 	switch (clock->p2) {
   8514   1.1  riastrad 	case 5:
   8515   1.1  riastrad 		dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
   8516   1.1  riastrad 		break;
   8517   1.1  riastrad 	case 7:
   8518   1.1  riastrad 		dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
   8519   1.1  riastrad 		break;
   8520   1.1  riastrad 	case 10:
   8521   1.1  riastrad 		dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
   8522   1.1  riastrad 		break;
   8523   1.1  riastrad 	case 14:
   8524   1.1  riastrad 		dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
   8525   1.1  riastrad 		break;
   8526   1.1  riastrad 	}
   8527   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   8528   1.1  riastrad 		dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT);
   8529   1.1  riastrad 
   8530   1.1  riastrad 	if (crtc_state->sdvo_tv_clock)
   8531   1.1  riastrad 		dpll |= PLL_REF_INPUT_TVCLKINBC;
   8532   1.1  riastrad 	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
   8533   1.1  riastrad 		 intel_panel_use_ssc(dev_priv))
   8534   1.1  riastrad 		dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
   8535   1.1  riastrad 	else
   8536   1.1  riastrad 		dpll |= PLL_REF_INPUT_DREFCLK;
   8537   1.1  riastrad 
   8538   1.1  riastrad 	dpll |= DPLL_VCO_ENABLE;
   8539   1.1  riastrad 	crtc_state->dpll_hw_state.dpll = dpll;
   8540   1.1  riastrad 
   8541   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4) {
   8542   1.1  riastrad 		u32 dpll_md = (crtc_state->pixel_multiplier - 1)
   8543   1.1  riastrad 			<< DPLL_MD_UDI_MULTIPLIER_SHIFT;
   8544   1.1  riastrad 		crtc_state->dpll_hw_state.dpll_md = dpll_md;
   8545   1.1  riastrad 	}
   8546   1.1  riastrad }
   8547   1.1  riastrad 
   8548   1.1  riastrad static void i8xx_compute_dpll(struct intel_crtc *crtc,
   8549   1.1  riastrad 			      struct intel_crtc_state *crtc_state,
   8550   1.1  riastrad 			      struct dpll *reduced_clock)
   8551   1.1  riastrad {
   8552   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8553   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8554   1.1  riastrad 	u32 dpll;
   8555   1.1  riastrad 	struct dpll *clock = &crtc_state->dpll;
   8556   1.1  riastrad 
   8557   1.1  riastrad 	i9xx_update_pll_dividers(crtc, crtc_state, reduced_clock);
   8558   1.1  riastrad 
   8559   1.1  riastrad 	dpll = DPLL_VGA_MODE_DIS;
   8560   1.1  riastrad 
   8561   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   8562   1.1  riastrad 		dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
   8563   1.1  riastrad 	} else {
   8564   1.1  riastrad 		if (clock->p1 == 2)
   8565   1.1  riastrad 			dpll |= PLL_P1_DIVIDE_BY_TWO;
   8566   1.1  riastrad 		else
   8567   1.1  riastrad 			dpll |= (clock->p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT;
   8568   1.1  riastrad 		if (clock->p2 == 4)
   8569   1.1  riastrad 			dpll |= PLL_P2_DIVIDE_BY_4;
   8570   1.1  riastrad 	}
   8571   1.1  riastrad 
   8572   1.1  riastrad 	/*
   8573   1.1  riastrad 	 * Bspec:
   8574   1.1  riastrad 	 * "[Almador Errata}: For the correct operation of the muxed DVO pins
   8575   1.1  riastrad 	 *  (GDEVSELB/I2Cdata, GIRDBY/I2CClk) and (GFRAMEB/DVI_Data,
   8576   1.1  riastrad 	 *  GTRDYB/DVI_Clk): Bit 31 (DPLL VCO Enable) and Bit 30 (2X Clock
   8577   1.1  riastrad 	 *  Enable) must be set to 1 in both the DPLL A Control Register
   8578   1.1  riastrad 	 *  (06014h-06017h) and DPLL B Control Register (06018h-0601Bh)."
   8579   1.1  riastrad 	 *
   8580   1.1  riastrad 	 * For simplicity We simply keep both bits always enabled in
   8581   1.1  riastrad 	 * both DPLLS. The spec says we should disable the DVO 2X clock
   8582   1.1  riastrad 	 * when not needed, but this seems to work fine in practice.
   8583   1.1  riastrad 	 */
   8584   1.1  riastrad 	if (IS_I830(dev_priv) ||
   8585   1.1  riastrad 	    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO))
   8586   1.1  riastrad 		dpll |= DPLL_DVO_2X_MODE;
   8587   1.1  riastrad 
   8588   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
   8589   1.1  riastrad 	    intel_panel_use_ssc(dev_priv))
   8590   1.1  riastrad 		dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
   8591   1.1  riastrad 	else
   8592   1.1  riastrad 		dpll |= PLL_REF_INPUT_DREFCLK;
   8593   1.1  riastrad 
   8594   1.1  riastrad 	dpll |= DPLL_VCO_ENABLE;
   8595   1.1  riastrad 	crtc_state->dpll_hw_state.dpll = dpll;
   8596   1.1  riastrad }
   8597   1.1  riastrad 
   8598   1.1  riastrad static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state)
   8599   1.1  riastrad {
   8600   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   8601   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8602   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8603   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   8604   1.1  riastrad 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
   8605   1.1  riastrad 	u32 crtc_vtotal, crtc_vblank_end;
   8606   1.1  riastrad 	int vsyncshift = 0;
   8607   1.1  riastrad 
   8608   1.1  riastrad 	/* We need to be careful not to changed the adjusted mode, for otherwise
   8609   1.1  riastrad 	 * the hw state checker will get angry at the mismatch. */
   8610   1.1  riastrad 	crtc_vtotal = adjusted_mode->crtc_vtotal;
   8611   1.1  riastrad 	crtc_vblank_end = adjusted_mode->crtc_vblank_end;
   8612   1.1  riastrad 
   8613   1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
   8614   1.1  riastrad 		/* the chip adds 2 halflines automatically */
   8615   1.1  riastrad 		crtc_vtotal -= 1;
   8616   1.1  riastrad 		crtc_vblank_end -= 1;
   8617   1.1  riastrad 
   8618   1.1  riastrad 		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
   8619   1.1  riastrad 			vsyncshift = (adjusted_mode->crtc_htotal - 1) / 2;
   8620   1.1  riastrad 		else
   8621   1.1  riastrad 			vsyncshift = adjusted_mode->crtc_hsync_start -
   8622   1.1  riastrad 				adjusted_mode->crtc_htotal / 2;
   8623   1.1  riastrad 		if (vsyncshift < 0)
   8624   1.1  riastrad 			vsyncshift += adjusted_mode->crtc_htotal;
   8625   1.1  riastrad 	}
   8626   1.1  riastrad 
   8627   1.1  riastrad 	if (INTEL_GEN(dev_priv) > 3)
   8628   1.1  riastrad 		I915_WRITE(VSYNCSHIFT(cpu_transcoder), vsyncshift);
   8629   1.1  riastrad 
   8630   1.1  riastrad 	I915_WRITE(HTOTAL(cpu_transcoder),
   8631   1.1  riastrad 		   (adjusted_mode->crtc_hdisplay - 1) |
   8632   1.1  riastrad 		   ((adjusted_mode->crtc_htotal - 1) << 16));
   8633   1.1  riastrad 	I915_WRITE(HBLANK(cpu_transcoder),
   8634   1.1  riastrad 		   (adjusted_mode->crtc_hblank_start - 1) |
   8635   1.1  riastrad 		   ((adjusted_mode->crtc_hblank_end - 1) << 16));
   8636   1.1  riastrad 	I915_WRITE(HSYNC(cpu_transcoder),
   8637   1.1  riastrad 		   (adjusted_mode->crtc_hsync_start - 1) |
   8638   1.1  riastrad 		   ((adjusted_mode->crtc_hsync_end - 1) << 16));
   8639   1.1  riastrad 
   8640   1.1  riastrad 	I915_WRITE(VTOTAL(cpu_transcoder),
   8641   1.1  riastrad 		   (adjusted_mode->crtc_vdisplay - 1) |
   8642   1.1  riastrad 		   ((crtc_vtotal - 1) << 16));
   8643   1.1  riastrad 	I915_WRITE(VBLANK(cpu_transcoder),
   8644   1.1  riastrad 		   (adjusted_mode->crtc_vblank_start - 1) |
   8645   1.1  riastrad 		   ((crtc_vblank_end - 1) << 16));
   8646   1.1  riastrad 	I915_WRITE(VSYNC(cpu_transcoder),
   8647   1.1  riastrad 		   (adjusted_mode->crtc_vsync_start - 1) |
   8648   1.1  riastrad 		   ((adjusted_mode->crtc_vsync_end - 1) << 16));
   8649   1.1  riastrad 
   8650   1.1  riastrad 	/* Workaround: when the EDP input selection is B, the VTOTAL_B must be
   8651   1.1  riastrad 	 * programmed with the VTOTAL_EDP value. Same for VTOTAL_C. This is
   8652   1.1  riastrad 	 * documented on the DDI_FUNC_CTL register description, EDP Input Select
   8653   1.1  riastrad 	 * bits. */
   8654   1.1  riastrad 	if (IS_HASWELL(dev_priv) && cpu_transcoder == TRANSCODER_EDP &&
   8655   1.1  riastrad 	    (pipe == PIPE_B || pipe == PIPE_C))
   8656   1.1  riastrad 		I915_WRITE(VTOTAL(pipe), I915_READ(VTOTAL(cpu_transcoder)));
   8657   1.1  riastrad 
   8658   1.1  riastrad }
   8659   1.1  riastrad 
   8660   1.1  riastrad static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state)
   8661   1.1  riastrad {
   8662   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   8663   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8664   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   8665   1.1  riastrad 
   8666   1.1  riastrad 	/* pipesrc controls the size that is scaled from, which should
   8667   1.1  riastrad 	 * always be the user's requested size.
   8668   1.1  riastrad 	 */
   8669   1.1  riastrad 	I915_WRITE(PIPESRC(pipe),
   8670   1.1  riastrad 		   ((crtc_state->pipe_src_w - 1) << 16) |
   8671   1.1  riastrad 		   (crtc_state->pipe_src_h - 1));
   8672   1.1  riastrad }
   8673   1.1  riastrad 
   8674   1.1  riastrad static bool intel_pipe_is_interlaced(const struct intel_crtc_state *crtc_state)
   8675   1.1  riastrad {
   8676   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   8677   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   8678   1.1  riastrad 
   8679   1.1  riastrad 	if (IS_GEN(dev_priv, 2))
   8680   1.1  riastrad 		return false;
   8681   1.1  riastrad 
   8682   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9 ||
   8683   1.1  riastrad 	    IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
   8684   1.1  riastrad 		return I915_READ(PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK_HSW;
   8685   1.1  riastrad 	else
   8686   1.1  riastrad 		return I915_READ(PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK;
   8687   1.1  riastrad }
   8688   1.1  riastrad 
   8689   1.1  riastrad static void intel_get_pipe_timings(struct intel_crtc *crtc,
   8690   1.1  riastrad 				   struct intel_crtc_state *pipe_config)
   8691   1.1  riastrad {
   8692   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8693   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8694   1.1  riastrad 	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
   8695   1.1  riastrad 	u32 tmp;
   8696   1.1  riastrad 
   8697   1.1  riastrad 	tmp = I915_READ(HTOTAL(cpu_transcoder));
   8698   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_hdisplay = (tmp & 0xffff) + 1;
   8699   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_htotal = ((tmp >> 16) & 0xffff) + 1;
   8700   1.1  riastrad 
   8701   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder)) {
   8702   1.1  riastrad 		tmp = I915_READ(HBLANK(cpu_transcoder));
   8703   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_hblank_start =
   8704   1.1  riastrad 							(tmp & 0xffff) + 1;
   8705   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_hblank_end =
   8706   1.1  riastrad 						((tmp >> 16) & 0xffff) + 1;
   8707   1.1  riastrad 	}
   8708   1.1  riastrad 	tmp = I915_READ(HSYNC(cpu_transcoder));
   8709   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_hsync_start = (tmp & 0xffff) + 1;
   8710   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_hsync_end = ((tmp >> 16) & 0xffff) + 1;
   8711   1.1  riastrad 
   8712   1.1  riastrad 	tmp = I915_READ(VTOTAL(cpu_transcoder));
   8713   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_vdisplay = (tmp & 0xffff) + 1;
   8714   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_vtotal = ((tmp >> 16) & 0xffff) + 1;
   8715   1.1  riastrad 
   8716   1.1  riastrad 	if (!transcoder_is_dsi(cpu_transcoder)) {
   8717   1.1  riastrad 		tmp = I915_READ(VBLANK(cpu_transcoder));
   8718   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_vblank_start =
   8719   1.1  riastrad 							(tmp & 0xffff) + 1;
   8720   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_vblank_end =
   8721   1.1  riastrad 						((tmp >> 16) & 0xffff) + 1;
   8722   1.1  riastrad 	}
   8723   1.1  riastrad 	tmp = I915_READ(VSYNC(cpu_transcoder));
   8724   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_vsync_start = (tmp & 0xffff) + 1;
   8725   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_vsync_end = ((tmp >> 16) & 0xffff) + 1;
   8726   1.1  riastrad 
   8727   1.1  riastrad 	if (intel_pipe_is_interlaced(pipe_config)) {
   8728   1.1  riastrad 		pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_INTERLACE;
   8729   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_vtotal += 1;
   8730   1.1  riastrad 		pipe_config->hw.adjusted_mode.crtc_vblank_end += 1;
   8731   1.1  riastrad 	}
   8732   1.1  riastrad }
   8733   1.1  riastrad 
   8734   1.1  riastrad static void intel_get_pipe_src_size(struct intel_crtc *crtc,
   8735   1.1  riastrad 				    struct intel_crtc_state *pipe_config)
   8736   1.1  riastrad {
   8737   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8738   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8739   1.1  riastrad 	u32 tmp;
   8740   1.1  riastrad 
   8741   1.1  riastrad 	tmp = I915_READ(PIPESRC(crtc->pipe));
   8742   1.1  riastrad 	pipe_config->pipe_src_h = (tmp & 0xffff) + 1;
   8743   1.1  riastrad 	pipe_config->pipe_src_w = ((tmp >> 16) & 0xffff) + 1;
   8744   1.1  riastrad 
   8745   1.1  riastrad 	pipe_config->hw.mode.vdisplay = pipe_config->pipe_src_h;
   8746   1.1  riastrad 	pipe_config->hw.mode.hdisplay = pipe_config->pipe_src_w;
   8747   1.1  riastrad }
   8748   1.1  riastrad 
   8749   1.1  riastrad void intel_mode_from_pipe_config(struct drm_display_mode *mode,
   8750   1.1  riastrad 				 struct intel_crtc_state *pipe_config)
   8751   1.1  riastrad {
   8752   1.1  riastrad 	mode->hdisplay = pipe_config->hw.adjusted_mode.crtc_hdisplay;
   8753   1.1  riastrad 	mode->htotal = pipe_config->hw.adjusted_mode.crtc_htotal;
   8754   1.1  riastrad 	mode->hsync_start = pipe_config->hw.adjusted_mode.crtc_hsync_start;
   8755   1.1  riastrad 	mode->hsync_end = pipe_config->hw.adjusted_mode.crtc_hsync_end;
   8756   1.1  riastrad 
   8757   1.1  riastrad 	mode->vdisplay = pipe_config->hw.adjusted_mode.crtc_vdisplay;
   8758   1.1  riastrad 	mode->vtotal = pipe_config->hw.adjusted_mode.crtc_vtotal;
   8759   1.1  riastrad 	mode->vsync_start = pipe_config->hw.adjusted_mode.crtc_vsync_start;
   8760   1.1  riastrad 	mode->vsync_end = pipe_config->hw.adjusted_mode.crtc_vsync_end;
   8761   1.1  riastrad 
   8762   1.1  riastrad 	mode->flags = pipe_config->hw.adjusted_mode.flags;
   8763   1.1  riastrad 	mode->type = DRM_MODE_TYPE_DRIVER;
   8764   1.1  riastrad 
   8765   1.1  riastrad 	mode->clock = pipe_config->hw.adjusted_mode.crtc_clock;
   8766   1.1  riastrad 
   8767   1.1  riastrad 	mode->hsync = drm_mode_hsync(mode);
   8768   1.1  riastrad 	mode->vrefresh = drm_mode_vrefresh(mode);
   8769   1.1  riastrad 	drm_mode_set_name(mode);
   8770   1.1  riastrad }
   8771   1.1  riastrad 
   8772   1.1  riastrad static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)
   8773   1.1  riastrad {
   8774   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   8775   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8776   1.1  riastrad 	u32 pipeconf;
   8777   1.1  riastrad 
   8778   1.1  riastrad 	pipeconf = 0;
   8779   1.1  riastrad 
   8780   1.1  riastrad 	/* we keep both pipes enabled on 830 */
   8781   1.1  riastrad 	if (IS_I830(dev_priv))
   8782   1.1  riastrad 		pipeconf |= I915_READ(PIPECONF(crtc->pipe)) & PIPECONF_ENABLE;
   8783   1.1  riastrad 
   8784   1.1  riastrad 	if (crtc_state->double_wide)
   8785   1.1  riastrad 		pipeconf |= PIPECONF_DOUBLE_WIDE;
   8786   1.1  riastrad 
   8787   1.1  riastrad 	/* only g4x and later have fancy bpc/dither controls */
   8788   1.1  riastrad 	if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
   8789   1.1  riastrad 	    IS_CHERRYVIEW(dev_priv)) {
   8790   1.1  riastrad 		/* Bspec claims that we can't use dithering for 30bpp pipes. */
   8791   1.1  riastrad 		if (crtc_state->dither && crtc_state->pipe_bpp != 30)
   8792   1.1  riastrad 			pipeconf |= PIPECONF_DITHER_EN |
   8793   1.1  riastrad 				    PIPECONF_DITHER_TYPE_SP;
   8794   1.1  riastrad 
   8795   1.1  riastrad 		switch (crtc_state->pipe_bpp) {
   8796   1.1  riastrad 		case 18:
   8797   1.1  riastrad 			pipeconf |= PIPECONF_6BPC;
   8798   1.1  riastrad 			break;
   8799   1.1  riastrad 		case 24:
   8800   1.1  riastrad 			pipeconf |= PIPECONF_8BPC;
   8801   1.1  riastrad 			break;
   8802   1.1  riastrad 		case 30:
   8803   1.1  riastrad 			pipeconf |= PIPECONF_10BPC;
   8804   1.1  riastrad 			break;
   8805   1.1  riastrad 		default:
   8806   1.1  riastrad 			/* Case prevented by intel_choose_pipe_bpp_dither. */
   8807   1.1  riastrad 			BUG();
   8808   1.1  riastrad 		}
   8809   1.1  riastrad 	}
   8810   1.1  riastrad 
   8811   1.1  riastrad 	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
   8812   1.1  riastrad 		if (INTEL_GEN(dev_priv) < 4 ||
   8813   1.1  riastrad 		    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
   8814   1.1  riastrad 			pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
   8815   1.1  riastrad 		else
   8816   1.1  riastrad 			pipeconf |= PIPECONF_INTERLACE_W_SYNC_SHIFT;
   8817   1.1  riastrad 	} else {
   8818   1.1  riastrad 		pipeconf |= PIPECONF_PROGRESSIVE;
   8819   1.1  riastrad 	}
   8820   1.1  riastrad 
   8821   1.1  riastrad 	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
   8822   1.1  riastrad 	     crtc_state->limited_color_range)
   8823   1.1  riastrad 		pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
   8824   1.1  riastrad 
   8825   1.1  riastrad 	pipeconf |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
   8826   1.1  riastrad 
   8827   1.1  riastrad 	pipeconf |= PIPECONF_FRAME_START_DELAY(0);
   8828   1.1  riastrad 
   8829   1.1  riastrad 	I915_WRITE(PIPECONF(crtc->pipe), pipeconf);
   8830   1.1  riastrad 	POSTING_READ(PIPECONF(crtc->pipe));
   8831   1.1  riastrad }
   8832   1.1  riastrad 
   8833   1.1  riastrad static int i8xx_crtc_compute_clock(struct intel_crtc *crtc,
   8834   1.1  riastrad 				   struct intel_crtc_state *crtc_state)
   8835   1.1  riastrad {
   8836   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8837   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8838   1.1  riastrad 	const struct intel_limit *limit;
   8839   1.1  riastrad 	int refclk = 48000;
   8840   1.1  riastrad 
   8841   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   8842   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   8843   1.1  riastrad 
   8844   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   8845   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv)) {
   8846   1.1  riastrad 			refclk = dev_priv->vbt.lvds_ssc_freq;
   8847   1.1  riastrad 			DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
   8848   1.1  riastrad 		}
   8849   1.1  riastrad 
   8850   1.1  riastrad 		limit = &intel_limits_i8xx_lvds;
   8851   1.1  riastrad 	} else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO)) {
   8852   1.1  riastrad 		limit = &intel_limits_i8xx_dvo;
   8853   1.1  riastrad 	} else {
   8854   1.1  riastrad 		limit = &intel_limits_i8xx_dac;
   8855   1.1  riastrad 	}
   8856   1.1  riastrad 
   8857   1.1  riastrad 	if (!crtc_state->clock_set &&
   8858   1.1  riastrad 	    !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   8859   1.1  riastrad 				 refclk, NULL, &crtc_state->dpll)) {
   8860   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   8861   1.1  riastrad 		return -EINVAL;
   8862   1.1  riastrad 	}
   8863   1.1  riastrad 
   8864   1.1  riastrad 	i8xx_compute_dpll(crtc, crtc_state, NULL);
   8865   1.1  riastrad 
   8866   1.1  riastrad 	return 0;
   8867   1.1  riastrad }
   8868   1.1  riastrad 
   8869   1.1  riastrad static int g4x_crtc_compute_clock(struct intel_crtc *crtc,
   8870   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   8871   1.1  riastrad {
   8872   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   8873   1.1  riastrad 	const struct intel_limit *limit;
   8874   1.1  riastrad 	int refclk = 96000;
   8875   1.1  riastrad 
   8876   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   8877   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   8878   1.1  riastrad 
   8879   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   8880   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv)) {
   8881   1.1  riastrad 			refclk = dev_priv->vbt.lvds_ssc_freq;
   8882   1.1  riastrad 			DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
   8883   1.1  riastrad 		}
   8884   1.1  riastrad 
   8885   1.1  riastrad 		if (intel_is_dual_link_lvds(dev_priv))
   8886   1.1  riastrad 			limit = &intel_limits_g4x_dual_channel_lvds;
   8887   1.1  riastrad 		else
   8888   1.1  riastrad 			limit = &intel_limits_g4x_single_channel_lvds;
   8889   1.1  riastrad 	} else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) ||
   8890   1.1  riastrad 		   intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
   8891   1.1  riastrad 		limit = &intel_limits_g4x_hdmi;
   8892   1.1  riastrad 	} else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO)) {
   8893   1.1  riastrad 		limit = &intel_limits_g4x_sdvo;
   8894   1.1  riastrad 	} else {
   8895   1.1  riastrad 		/* The option is for other outputs */
   8896   1.1  riastrad 		limit = &intel_limits_i9xx_sdvo;
   8897   1.1  riastrad 	}
   8898   1.1  riastrad 
   8899   1.1  riastrad 	if (!crtc_state->clock_set &&
   8900   1.1  riastrad 	    !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   8901   1.1  riastrad 				refclk, NULL, &crtc_state->dpll)) {
   8902   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   8903   1.1  riastrad 		return -EINVAL;
   8904   1.1  riastrad 	}
   8905   1.1  riastrad 
   8906   1.1  riastrad 	i9xx_compute_dpll(crtc, crtc_state, NULL);
   8907   1.1  riastrad 
   8908   1.1  riastrad 	return 0;
   8909   1.1  riastrad }
   8910   1.1  riastrad 
   8911   1.1  riastrad static int pnv_crtc_compute_clock(struct intel_crtc *crtc,
   8912   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   8913   1.1  riastrad {
   8914   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8915   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8916   1.1  riastrad 	const struct intel_limit *limit;
   8917   1.1  riastrad 	int refclk = 96000;
   8918   1.1  riastrad 
   8919   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   8920   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   8921   1.1  riastrad 
   8922   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   8923   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv)) {
   8924   1.1  riastrad 			refclk = dev_priv->vbt.lvds_ssc_freq;
   8925   1.1  riastrad 			DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
   8926   1.1  riastrad 		}
   8927   1.1  riastrad 
   8928   1.1  riastrad 		limit = &pnv_limits_lvds;
   8929   1.1  riastrad 	} else {
   8930   1.1  riastrad 		limit = &pnv_limits_sdvo;
   8931   1.1  riastrad 	}
   8932   1.1  riastrad 
   8933   1.1  riastrad 	if (!crtc_state->clock_set &&
   8934   1.1  riastrad 	    !pnv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   8935   1.1  riastrad 				refclk, NULL, &crtc_state->dpll)) {
   8936   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   8937   1.1  riastrad 		return -EINVAL;
   8938   1.1  riastrad 	}
   8939   1.1  riastrad 
   8940   1.1  riastrad 	i9xx_compute_dpll(crtc, crtc_state, NULL);
   8941   1.1  riastrad 
   8942   1.1  riastrad 	return 0;
   8943   1.1  riastrad }
   8944   1.1  riastrad 
   8945   1.1  riastrad static int i9xx_crtc_compute_clock(struct intel_crtc *crtc,
   8946   1.1  riastrad 				   struct intel_crtc_state *crtc_state)
   8947   1.1  riastrad {
   8948   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   8949   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   8950   1.1  riastrad 	const struct intel_limit *limit;
   8951   1.1  riastrad 	int refclk = 96000;
   8952   1.1  riastrad 
   8953   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   8954   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   8955   1.1  riastrad 
   8956   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   8957   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv)) {
   8958   1.1  riastrad 			refclk = dev_priv->vbt.lvds_ssc_freq;
   8959   1.1  riastrad 			DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
   8960   1.1  riastrad 		}
   8961   1.1  riastrad 
   8962   1.1  riastrad 		limit = &intel_limits_i9xx_lvds;
   8963   1.1  riastrad 	} else {
   8964   1.1  riastrad 		limit = &intel_limits_i9xx_sdvo;
   8965   1.1  riastrad 	}
   8966   1.1  riastrad 
   8967   1.1  riastrad 	if (!crtc_state->clock_set &&
   8968   1.1  riastrad 	    !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   8969   1.1  riastrad 				 refclk, NULL, &crtc_state->dpll)) {
   8970   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   8971   1.1  riastrad 		return -EINVAL;
   8972   1.1  riastrad 	}
   8973   1.1  riastrad 
   8974   1.1  riastrad 	i9xx_compute_dpll(crtc, crtc_state, NULL);
   8975   1.1  riastrad 
   8976   1.1  riastrad 	return 0;
   8977   1.1  riastrad }
   8978   1.1  riastrad 
   8979   1.1  riastrad static int chv_crtc_compute_clock(struct intel_crtc *crtc,
   8980   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   8981   1.1  riastrad {
   8982   1.1  riastrad 	int refclk = 100000;
   8983   1.1  riastrad 	const struct intel_limit *limit = &intel_limits_chv;
   8984   1.1  riastrad 
   8985   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   8986   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   8987   1.1  riastrad 
   8988   1.1  riastrad 	if (!crtc_state->clock_set &&
   8989   1.1  riastrad 	    !chv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   8990   1.1  riastrad 				refclk, NULL, &crtc_state->dpll)) {
   8991   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   8992   1.1  riastrad 		return -EINVAL;
   8993   1.1  riastrad 	}
   8994   1.1  riastrad 
   8995   1.1  riastrad 	chv_compute_dpll(crtc, crtc_state);
   8996   1.1  riastrad 
   8997   1.1  riastrad 	return 0;
   8998   1.1  riastrad }
   8999   1.1  riastrad 
   9000   1.1  riastrad static int vlv_crtc_compute_clock(struct intel_crtc *crtc,
   9001   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   9002   1.1  riastrad {
   9003   1.1  riastrad 	int refclk = 100000;
   9004   1.1  riastrad 	const struct intel_limit *limit = &intel_limits_vlv;
   9005   1.1  riastrad 
   9006   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   9007   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   9008   1.1  riastrad 
   9009   1.1  riastrad 	if (!crtc_state->clock_set &&
   9010   1.1  riastrad 	    !vlv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   9011   1.1  riastrad 				refclk, NULL, &crtc_state->dpll)) {
   9012   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   9013   1.1  riastrad 		return -EINVAL;
   9014   1.1  riastrad 	}
   9015   1.1  riastrad 
   9016   1.1  riastrad 	vlv_compute_dpll(crtc, crtc_state);
   9017   1.1  riastrad 
   9018   1.1  riastrad 	return 0;
   9019   1.1  riastrad }
   9020   1.1  riastrad 
   9021   1.1  riastrad static bool i9xx_has_pfit(struct drm_i915_private *dev_priv)
   9022   1.1  riastrad {
   9023   1.1  riastrad 	if (IS_I830(dev_priv))
   9024   1.1  riastrad 		return false;
   9025   1.1  riastrad 
   9026   1.1  riastrad 	return INTEL_GEN(dev_priv) >= 4 ||
   9027   1.1  riastrad 		IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
   9028   1.1  riastrad }
   9029   1.1  riastrad 
   9030   1.1  riastrad static void i9xx_get_pfit_config(struct intel_crtc *crtc,
   9031   1.1  riastrad 				 struct intel_crtc_state *pipe_config)
   9032   1.1  riastrad {
   9033   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9034   1.1  riastrad 	u32 tmp;
   9035   1.1  riastrad 
   9036   1.1  riastrad 	if (!i9xx_has_pfit(dev_priv))
   9037   1.1  riastrad 		return;
   9038   1.1  riastrad 
   9039   1.1  riastrad 	tmp = I915_READ(PFIT_CONTROL);
   9040   1.1  riastrad 	if (!(tmp & PFIT_ENABLE))
   9041   1.1  riastrad 		return;
   9042   1.1  riastrad 
   9043   1.1  riastrad 	/* Check whether the pfit is attached to our pipe. */
   9044   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4) {
   9045   1.1  riastrad 		if (crtc->pipe != PIPE_B)
   9046   1.1  riastrad 			return;
   9047   1.1  riastrad 	} else {
   9048   1.1  riastrad 		if ((tmp & PFIT_PIPE_MASK) != (crtc->pipe << PFIT_PIPE_SHIFT))
   9049   1.1  riastrad 			return;
   9050   1.1  riastrad 	}
   9051   1.1  riastrad 
   9052   1.1  riastrad 	pipe_config->gmch_pfit.control = tmp;
   9053   1.1  riastrad 	pipe_config->gmch_pfit.pgm_ratios = I915_READ(PFIT_PGM_RATIOS);
   9054   1.1  riastrad }
   9055   1.1  riastrad 
   9056   1.1  riastrad static void vlv_crtc_clock_get(struct intel_crtc *crtc,
   9057   1.1  riastrad 			       struct intel_crtc_state *pipe_config)
   9058   1.1  riastrad {
   9059   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   9060   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   9061   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   9062   1.1  riastrad 	struct dpll clock;
   9063   1.1  riastrad 	u32 mdiv;
   9064   1.1  riastrad 	int refclk = 100000;
   9065   1.1  riastrad 
   9066   1.1  riastrad 	/* In case of DSI, DPLL will not be used */
   9067   1.1  riastrad 	if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
   9068   1.1  riastrad 		return;
   9069   1.1  riastrad 
   9070   1.1  riastrad 	vlv_dpio_get(dev_priv);
   9071   1.1  riastrad 	mdiv = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW3(pipe));
   9072   1.1  riastrad 	vlv_dpio_put(dev_priv);
   9073   1.1  riastrad 
   9074   1.1  riastrad 	clock.m1 = (mdiv >> DPIO_M1DIV_SHIFT) & 7;
   9075   1.1  riastrad 	clock.m2 = mdiv & DPIO_M2DIV_MASK;
   9076   1.1  riastrad 	clock.n = (mdiv >> DPIO_N_SHIFT) & 0xf;
   9077   1.1  riastrad 	clock.p1 = (mdiv >> DPIO_P1_SHIFT) & 7;
   9078   1.1  riastrad 	clock.p2 = (mdiv >> DPIO_P2_SHIFT) & 0x1f;
   9079   1.1  riastrad 
   9080   1.1  riastrad 	pipe_config->port_clock = vlv_calc_dpll_params(refclk, &clock);
   9081   1.1  riastrad }
   9082   1.1  riastrad 
   9083   1.1  riastrad static void
   9084   1.1  riastrad i9xx_get_initial_plane_config(struct intel_crtc *crtc,
   9085   1.1  riastrad 			      struct intel_initial_plane_config *plane_config)
   9086   1.1  riastrad {
   9087   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   9088   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   9089   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
   9090   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   9091   1.1  riastrad 	enum pipe pipe;
   9092   1.3  riastrad 	u32 val, base, offset __unused;
   9093   1.1  riastrad 	int fourcc, pixel_format;
   9094   1.1  riastrad 	unsigned int aligned_height;
   9095   1.1  riastrad 	struct drm_framebuffer *fb;
   9096   1.1  riastrad 	struct intel_framebuffer *intel_fb;
   9097   1.1  riastrad 
   9098   1.1  riastrad 	if (!plane->get_hw_state(plane, &pipe))
   9099   1.1  riastrad 		return;
   9100   1.1  riastrad 
   9101   1.1  riastrad 	WARN_ON(pipe != crtc->pipe);
   9102   1.1  riastrad 
   9103   1.1  riastrad 	intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
   9104   1.1  riastrad 	if (!intel_fb) {
   9105   1.1  riastrad 		DRM_DEBUG_KMS("failed to alloc fb\n");
   9106   1.1  riastrad 		return;
   9107   1.1  riastrad 	}
   9108   1.1  riastrad 
   9109   1.1  riastrad 	fb = &intel_fb->base;
   9110   1.1  riastrad 
   9111   1.1  riastrad 	fb->dev = dev;
   9112   1.1  riastrad 
   9113   1.1  riastrad 	val = I915_READ(DSPCNTR(i9xx_plane));
   9114   1.1  riastrad 
   9115   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4) {
   9116   1.1  riastrad 		if (val & DISPPLANE_TILED) {
   9117   1.1  riastrad 			plane_config->tiling = I915_TILING_X;
   9118   1.1  riastrad 			fb->modifier = I915_FORMAT_MOD_X_TILED;
   9119   1.1  riastrad 		}
   9120   1.1  riastrad 
   9121   1.1  riastrad 		if (val & DISPPLANE_ROTATE_180)
   9122   1.1  riastrad 			plane_config->rotation = DRM_MODE_ROTATE_180;
   9123   1.1  riastrad 	}
   9124   1.1  riastrad 
   9125   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B &&
   9126   1.1  riastrad 	    val & DISPPLANE_MIRROR)
   9127   1.1  riastrad 		plane_config->rotation |= DRM_MODE_REFLECT_X;
   9128   1.1  riastrad 
   9129   1.1  riastrad 	pixel_format = val & DISPPLANE_PIXFORMAT_MASK;
   9130   1.1  riastrad 	fourcc = i9xx_format_to_fourcc(pixel_format);
   9131   1.1  riastrad 	fb->format = drm_format_info(fourcc);
   9132   1.1  riastrad 
   9133   1.1  riastrad 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
   9134   1.1  riastrad 		offset = I915_READ(DSPOFFSET(i9xx_plane));
   9135   1.1  riastrad 		base = I915_READ(DSPSURF(i9xx_plane)) & 0xfffff000;
   9136   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 4) {
   9137   1.1  riastrad 		if (plane_config->tiling)
   9138   1.1  riastrad 			offset = I915_READ(DSPTILEOFF(i9xx_plane));
   9139   1.1  riastrad 		else
   9140   1.1  riastrad 			offset = I915_READ(DSPLINOFF(i9xx_plane));
   9141   1.1  riastrad 		base = I915_READ(DSPSURF(i9xx_plane)) & 0xfffff000;
   9142   1.1  riastrad 	} else {
   9143   1.1  riastrad 		base = I915_READ(DSPADDR(i9xx_plane));
   9144   1.1  riastrad 	}
   9145   1.1  riastrad 	plane_config->base = base;
   9146   1.1  riastrad 
   9147   1.1  riastrad 	val = I915_READ(PIPESRC(pipe));
   9148   1.1  riastrad 	fb->width = ((val >> 16) & 0xfff) + 1;
   9149   1.1  riastrad 	fb->height = ((val >> 0) & 0xfff) + 1;
   9150   1.1  riastrad 
   9151   1.1  riastrad 	val = I915_READ(DSPSTRIDE(i9xx_plane));
   9152   1.1  riastrad 	fb->pitches[0] = val & 0xffffffc0;
   9153   1.1  riastrad 
   9154   1.1  riastrad 	aligned_height = intel_fb_align_height(fb, 0, fb->height);
   9155   1.1  riastrad 
   9156   1.1  riastrad 	plane_config->size = fb->pitches[0] * aligned_height;
   9157   1.1  riastrad 
   9158   1.1  riastrad 	DRM_DEBUG_KMS("%s/%s with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
   9159   1.1  riastrad 		      crtc->base.name, plane->base.name, fb->width, fb->height,
   9160   1.1  riastrad 		      fb->format->cpp[0] * 8, base, fb->pitches[0],
   9161   1.1  riastrad 		      plane_config->size);
   9162   1.1  riastrad 
   9163   1.1  riastrad 	plane_config->fb = intel_fb;
   9164   1.1  riastrad }
   9165   1.1  riastrad 
   9166   1.1  riastrad static void chv_crtc_clock_get(struct intel_crtc *crtc,
   9167   1.1  riastrad 			       struct intel_crtc_state *pipe_config)
   9168   1.1  riastrad {
   9169   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   9170   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   9171   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   9172   1.1  riastrad 	enum dpio_channel port = vlv_pipe_to_channel(pipe);
   9173   1.1  riastrad 	struct dpll clock;
   9174   1.1  riastrad 	u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2, pll_dw3;
   9175   1.1  riastrad 	int refclk = 100000;
   9176   1.1  riastrad 
   9177   1.1  riastrad 	/* In case of DSI, DPLL will not be used */
   9178   1.1  riastrad 	if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
   9179   1.1  riastrad 		return;
   9180   1.1  riastrad 
   9181   1.1  riastrad 	vlv_dpio_get(dev_priv);
   9182   1.1  riastrad 	cmn_dw13 = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW13(port));
   9183   1.1  riastrad 	pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port));
   9184   1.1  riastrad 	pll_dw1 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW1(port));
   9185   1.1  riastrad 	pll_dw2 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW2(port));
   9186   1.1  riastrad 	pll_dw3 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
   9187   1.1  riastrad 	vlv_dpio_put(dev_priv);
   9188   1.1  riastrad 
   9189   1.1  riastrad 	clock.m1 = (pll_dw1 & 0x7) == DPIO_CHV_M1_DIV_BY_2 ? 2 : 0;
   9190   1.1  riastrad 	clock.m2 = (pll_dw0 & 0xff) << 22;
   9191   1.1  riastrad 	if (pll_dw3 & DPIO_CHV_FRAC_DIV_EN)
   9192   1.1  riastrad 		clock.m2 |= pll_dw2 & 0x3fffff;
   9193   1.1  riastrad 	clock.n = (pll_dw1 >> DPIO_CHV_N_DIV_SHIFT) & 0xf;
   9194   1.1  riastrad 	clock.p1 = (cmn_dw13 >> DPIO_CHV_P1_DIV_SHIFT) & 0x7;
   9195   1.1  riastrad 	clock.p2 = (cmn_dw13 >> DPIO_CHV_P2_DIV_SHIFT) & 0x1f;
   9196   1.1  riastrad 
   9197   1.1  riastrad 	pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock);
   9198   1.1  riastrad }
   9199   1.1  riastrad 
   9200   1.1  riastrad static enum intel_output_format
   9201   1.1  riastrad bdw_get_pipemisc_output_format(struct intel_crtc *crtc)
   9202   1.1  riastrad {
   9203   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9204   1.1  riastrad 	u32 tmp;
   9205   1.1  riastrad 
   9206   1.1  riastrad 	tmp = I915_READ(PIPEMISC(crtc->pipe));
   9207   1.1  riastrad 
   9208   1.1  riastrad 	if (tmp & PIPEMISC_YUV420_ENABLE) {
   9209   1.1  riastrad 		/* We support 4:2:0 in full blend mode only */
   9210   1.1  riastrad 		WARN_ON((tmp & PIPEMISC_YUV420_MODE_FULL_BLEND) == 0);
   9211   1.1  riastrad 
   9212   1.1  riastrad 		return INTEL_OUTPUT_FORMAT_YCBCR420;
   9213   1.1  riastrad 	} else if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) {
   9214   1.1  riastrad 		return INTEL_OUTPUT_FORMAT_YCBCR444;
   9215   1.1  riastrad 	} else {
   9216   1.1  riastrad 		return INTEL_OUTPUT_FORMAT_RGB;
   9217   1.1  riastrad 	}
   9218   1.1  riastrad }
   9219   1.1  riastrad 
   9220   1.1  riastrad static void i9xx_get_pipe_color_config(struct intel_crtc_state *crtc_state)
   9221   1.1  riastrad {
   9222   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   9223   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
   9224   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9225   1.1  riastrad 	enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
   9226   1.1  riastrad 	u32 tmp;
   9227   1.1  riastrad 
   9228   1.1  riastrad 	tmp = I915_READ(DSPCNTR(i9xx_plane));
   9229   1.1  riastrad 
   9230   1.1  riastrad 	if (tmp & DISPPLANE_GAMMA_ENABLE)
   9231   1.1  riastrad 		crtc_state->gamma_enable = true;
   9232   1.1  riastrad 
   9233   1.1  riastrad 	if (!HAS_GMCH(dev_priv) &&
   9234   1.1  riastrad 	    tmp & DISPPLANE_PIPE_CSC_ENABLE)
   9235   1.1  riastrad 		crtc_state->csc_enable = true;
   9236   1.1  riastrad }
   9237   1.1  riastrad 
   9238   1.1  riastrad static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
   9239   1.1  riastrad 				 struct intel_crtc_state *pipe_config)
   9240   1.1  riastrad {
   9241   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9242   1.1  riastrad 	enum intel_display_power_domain power_domain;
   9243   1.1  riastrad 	intel_wakeref_t wakeref;
   9244   1.1  riastrad 	u32 tmp;
   9245   1.1  riastrad 	bool ret;
   9246   1.1  riastrad 
   9247   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
   9248   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   9249   1.1  riastrad 	if (!wakeref)
   9250   1.1  riastrad 		return false;
   9251   1.1  riastrad 
   9252   1.1  riastrad 	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   9253   1.1  riastrad 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
   9254   1.1  riastrad 	pipe_config->shared_dpll = NULL;
   9255   1.1  riastrad 	pipe_config->master_transcoder = INVALID_TRANSCODER;
   9256   1.1  riastrad 
   9257   1.1  riastrad 	ret = false;
   9258   1.1  riastrad 
   9259   1.1  riastrad 	tmp = I915_READ(PIPECONF(crtc->pipe));
   9260   1.1  riastrad 	if (!(tmp & PIPECONF_ENABLE))
   9261   1.1  riastrad 		goto out;
   9262   1.1  riastrad 
   9263   1.1  riastrad 	if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
   9264   1.1  riastrad 	    IS_CHERRYVIEW(dev_priv)) {
   9265   1.1  riastrad 		switch (tmp & PIPECONF_BPC_MASK) {
   9266   1.1  riastrad 		case PIPECONF_6BPC:
   9267   1.1  riastrad 			pipe_config->pipe_bpp = 18;
   9268   1.1  riastrad 			break;
   9269   1.1  riastrad 		case PIPECONF_8BPC:
   9270   1.1  riastrad 			pipe_config->pipe_bpp = 24;
   9271   1.1  riastrad 			break;
   9272   1.1  riastrad 		case PIPECONF_10BPC:
   9273   1.1  riastrad 			pipe_config->pipe_bpp = 30;
   9274   1.1  riastrad 			break;
   9275   1.1  riastrad 		default:
   9276   1.1  riastrad 			break;
   9277   1.1  riastrad 		}
   9278   1.1  riastrad 	}
   9279   1.1  riastrad 
   9280   1.1  riastrad 	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
   9281   1.1  riastrad 	    (tmp & PIPECONF_COLOR_RANGE_SELECT))
   9282   1.1  riastrad 		pipe_config->limited_color_range = true;
   9283   1.1  riastrad 
   9284   1.1  riastrad 	pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_I9XX) >>
   9285   1.1  riastrad 		PIPECONF_GAMMA_MODE_SHIFT;
   9286   1.1  riastrad 
   9287   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv))
   9288   1.1  riastrad 		pipe_config->cgm_mode = I915_READ(CGM_PIPE_MODE(crtc->pipe));
   9289   1.1  riastrad 
   9290   1.1  riastrad 	i9xx_get_pipe_color_config(pipe_config);
   9291   1.1  riastrad 	intel_color_get_config(pipe_config);
   9292   1.1  riastrad 
   9293   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4)
   9294   1.1  riastrad 		pipe_config->double_wide = tmp & PIPECONF_DOUBLE_WIDE;
   9295   1.1  riastrad 
   9296   1.1  riastrad 	intel_get_pipe_timings(crtc, pipe_config);
   9297   1.1  riastrad 	intel_get_pipe_src_size(crtc, pipe_config);
   9298   1.1  riastrad 
   9299   1.1  riastrad 	i9xx_get_pfit_config(crtc, pipe_config);
   9300   1.1  riastrad 
   9301   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4) {
   9302   1.1  riastrad 		/* No way to read it out on pipes B and C */
   9303   1.1  riastrad 		if (IS_CHERRYVIEW(dev_priv) && crtc->pipe != PIPE_A)
   9304   1.1  riastrad 			tmp = dev_priv->chv_dpll_md[crtc->pipe];
   9305   1.1  riastrad 		else
   9306   1.1  riastrad 			tmp = I915_READ(DPLL_MD(crtc->pipe));
   9307   1.1  riastrad 		pipe_config->pixel_multiplier =
   9308   1.1  riastrad 			((tmp & DPLL_MD_UDI_MULTIPLIER_MASK)
   9309   1.1  riastrad 			 >> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
   9310   1.1  riastrad 		pipe_config->dpll_hw_state.dpll_md = tmp;
   9311   1.1  riastrad 	} else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
   9312   1.1  riastrad 		   IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
   9313   1.1  riastrad 		tmp = I915_READ(DPLL(crtc->pipe));
   9314   1.1  riastrad 		pipe_config->pixel_multiplier =
   9315   1.1  riastrad 			((tmp & SDVO_MULTIPLIER_MASK)
   9316   1.1  riastrad 			 >> SDVO_MULTIPLIER_SHIFT_HIRES) + 1;
   9317   1.1  riastrad 	} else {
   9318   1.1  riastrad 		/* Note that on i915G/GM the pixel multiplier is in the sdvo
   9319   1.1  riastrad 		 * port and will be fixed up in the encoder->get_config
   9320   1.1  riastrad 		 * function. */
   9321   1.1  riastrad 		pipe_config->pixel_multiplier = 1;
   9322   1.1  riastrad 	}
   9323   1.1  riastrad 	pipe_config->dpll_hw_state.dpll = I915_READ(DPLL(crtc->pipe));
   9324   1.1  riastrad 	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
   9325   1.1  riastrad 		pipe_config->dpll_hw_state.fp0 = I915_READ(FP0(crtc->pipe));
   9326   1.1  riastrad 		pipe_config->dpll_hw_state.fp1 = I915_READ(FP1(crtc->pipe));
   9327   1.1  riastrad 	} else {
   9328   1.1  riastrad 		/* Mask out read-only status bits. */
   9329   1.1  riastrad 		pipe_config->dpll_hw_state.dpll &= ~(DPLL_LOCK_VLV |
   9330   1.1  riastrad 						     DPLL_PORTC_READY_MASK |
   9331   1.1  riastrad 						     DPLL_PORTB_READY_MASK);
   9332   1.1  riastrad 	}
   9333   1.1  riastrad 
   9334   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv))
   9335   1.1  riastrad 		chv_crtc_clock_get(crtc, pipe_config);
   9336   1.1  riastrad 	else if (IS_VALLEYVIEW(dev_priv))
   9337   1.1  riastrad 		vlv_crtc_clock_get(crtc, pipe_config);
   9338   1.1  riastrad 	else
   9339   1.1  riastrad 		i9xx_crtc_clock_get(crtc, pipe_config);
   9340   1.1  riastrad 
   9341   1.1  riastrad 	/*
   9342   1.1  riastrad 	 * Normally the dotclock is filled in by the encoder .get_config()
   9343   1.1  riastrad 	 * but in case the pipe is enabled w/o any ports we need a sane
   9344   1.1  riastrad 	 * default.
   9345   1.1  riastrad 	 */
   9346   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_clock =
   9347   1.1  riastrad 		pipe_config->port_clock / pipe_config->pixel_multiplier;
   9348   1.1  riastrad 
   9349   1.1  riastrad 	ret = true;
   9350   1.1  riastrad 
   9351   1.1  riastrad out:
   9352   1.1  riastrad 	intel_display_power_put(dev_priv, power_domain, wakeref);
   9353   1.1  riastrad 
   9354   1.1  riastrad 	return ret;
   9355   1.1  riastrad }
   9356   1.1  riastrad 
   9357   1.1  riastrad static void ilk_init_pch_refclk(struct drm_i915_private *dev_priv)
   9358   1.1  riastrad {
   9359   1.1  riastrad 	struct intel_encoder *encoder;
   9360   1.1  riastrad 	int i;
   9361   1.1  riastrad 	u32 val, final;
   9362   1.1  riastrad 	bool has_lvds = false;
   9363   1.1  riastrad 	bool has_cpu_edp = false;
   9364   1.1  riastrad 	bool has_panel = false;
   9365   1.1  riastrad 	bool has_ck505 = false;
   9366   1.1  riastrad 	bool can_ssc = false;
   9367   1.1  riastrad 	bool using_ssc_source = false;
   9368   1.1  riastrad 
   9369   1.1  riastrad 	/* We need to take the global config into account */
   9370   1.1  riastrad 	for_each_intel_encoder(&dev_priv->drm, encoder) {
   9371   1.1  riastrad 		switch (encoder->type) {
   9372   1.1  riastrad 		case INTEL_OUTPUT_LVDS:
   9373   1.1  riastrad 			has_panel = true;
   9374   1.1  riastrad 			has_lvds = true;
   9375   1.1  riastrad 			break;
   9376   1.1  riastrad 		case INTEL_OUTPUT_EDP:
   9377   1.1  riastrad 			has_panel = true;
   9378   1.1  riastrad 			if (encoder->port == PORT_A)
   9379   1.1  riastrad 				has_cpu_edp = true;
   9380   1.1  riastrad 			break;
   9381   1.1  riastrad 		default:
   9382   1.1  riastrad 			break;
   9383   1.1  riastrad 		}
   9384   1.1  riastrad 	}
   9385   1.1  riastrad 
   9386   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv)) {
   9387   1.1  riastrad 		has_ck505 = dev_priv->vbt.display_clock_mode;
   9388   1.1  riastrad 		can_ssc = has_ck505;
   9389   1.1  riastrad 	} else {
   9390   1.1  riastrad 		has_ck505 = false;
   9391   1.1  riastrad 		can_ssc = true;
   9392   1.1  riastrad 	}
   9393   1.1  riastrad 
   9394   1.1  riastrad 	/* Check if any DPLLs are using the SSC source */
   9395   1.1  riastrad 	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
   9396   1.1  riastrad 		u32 temp = I915_READ(PCH_DPLL(i));
   9397   1.1  riastrad 
   9398   1.1  riastrad 		if (!(temp & DPLL_VCO_ENABLE))
   9399   1.1  riastrad 			continue;
   9400   1.1  riastrad 
   9401   1.1  riastrad 		if ((temp & PLL_REF_INPUT_MASK) ==
   9402   1.1  riastrad 		    PLLB_REF_INPUT_SPREADSPECTRUMIN) {
   9403   1.1  riastrad 			using_ssc_source = true;
   9404   1.1  riastrad 			break;
   9405   1.1  riastrad 		}
   9406   1.1  riastrad 	}
   9407   1.1  riastrad 
   9408   1.1  riastrad 	DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source %d\n",
   9409   1.1  riastrad 		      has_panel, has_lvds, has_ck505, using_ssc_source);
   9410   1.1  riastrad 
   9411   1.1  riastrad 	/* Ironlake: try to setup display ref clock before DPLL
   9412   1.1  riastrad 	 * enabling. This is only under driver's control after
   9413   1.1  riastrad 	 * PCH B stepping, previous chipset stepping should be
   9414   1.1  riastrad 	 * ignoring this setting.
   9415   1.1  riastrad 	 */
   9416   1.1  riastrad 	val = I915_READ(PCH_DREF_CONTROL);
   9417   1.1  riastrad 
   9418   1.1  riastrad 	/* As we must carefully and slowly disable/enable each source in turn,
   9419   1.1  riastrad 	 * compute the final state we want first and check if we need to
   9420   1.1  riastrad 	 * make any changes at all.
   9421   1.1  riastrad 	 */
   9422   1.1  riastrad 	final = val;
   9423   1.1  riastrad 	final &= ~DREF_NONSPREAD_SOURCE_MASK;
   9424   1.1  riastrad 	if (has_ck505)
   9425   1.1  riastrad 		final |= DREF_NONSPREAD_CK505_ENABLE;
   9426   1.1  riastrad 	else
   9427   1.1  riastrad 		final |= DREF_NONSPREAD_SOURCE_ENABLE;
   9428   1.1  riastrad 
   9429   1.1  riastrad 	final &= ~DREF_SSC_SOURCE_MASK;
   9430   1.1  riastrad 	final &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
   9431   1.1  riastrad 	final &= ~DREF_SSC1_ENABLE;
   9432   1.1  riastrad 
   9433   1.1  riastrad 	if (has_panel) {
   9434   1.1  riastrad 		final |= DREF_SSC_SOURCE_ENABLE;
   9435   1.1  riastrad 
   9436   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv) && can_ssc)
   9437   1.1  riastrad 			final |= DREF_SSC1_ENABLE;
   9438   1.1  riastrad 
   9439   1.1  riastrad 		if (has_cpu_edp) {
   9440   1.1  riastrad 			if (intel_panel_use_ssc(dev_priv) && can_ssc)
   9441   1.1  riastrad 				final |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
   9442   1.1  riastrad 			else
   9443   1.1  riastrad 				final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
   9444   1.1  riastrad 		} else
   9445   1.1  riastrad 			final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
   9446   1.1  riastrad 	} else if (using_ssc_source) {
   9447   1.1  riastrad 		final |= DREF_SSC_SOURCE_ENABLE;
   9448   1.1  riastrad 		final |= DREF_SSC1_ENABLE;
   9449   1.1  riastrad 	}
   9450   1.1  riastrad 
   9451   1.1  riastrad 	if (final == val)
   9452   1.1  riastrad 		return;
   9453   1.1  riastrad 
   9454   1.1  riastrad 	/* Always enable nonspread source */
   9455   1.1  riastrad 	val &= ~DREF_NONSPREAD_SOURCE_MASK;
   9456   1.1  riastrad 
   9457   1.1  riastrad 	if (has_ck505)
   9458   1.1  riastrad 		val |= DREF_NONSPREAD_CK505_ENABLE;
   9459   1.1  riastrad 	else
   9460   1.1  riastrad 		val |= DREF_NONSPREAD_SOURCE_ENABLE;
   9461   1.1  riastrad 
   9462   1.1  riastrad 	if (has_panel) {
   9463   1.1  riastrad 		val &= ~DREF_SSC_SOURCE_MASK;
   9464   1.1  riastrad 		val |= DREF_SSC_SOURCE_ENABLE;
   9465   1.1  riastrad 
   9466   1.1  riastrad 		/* SSC must be turned on before enabling the CPU output  */
   9467   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv) && can_ssc) {
   9468   1.1  riastrad 			DRM_DEBUG_KMS("Using SSC on panel\n");
   9469   1.1  riastrad 			val |= DREF_SSC1_ENABLE;
   9470   1.1  riastrad 		} else
   9471   1.1  riastrad 			val &= ~DREF_SSC1_ENABLE;
   9472   1.1  riastrad 
   9473   1.1  riastrad 		/* Get SSC going before enabling the outputs */
   9474   1.1  riastrad 		I915_WRITE(PCH_DREF_CONTROL, val);
   9475   1.1  riastrad 		POSTING_READ(PCH_DREF_CONTROL);
   9476   1.1  riastrad 		udelay(200);
   9477   1.1  riastrad 
   9478   1.1  riastrad 		val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
   9479   1.1  riastrad 
   9480   1.1  riastrad 		/* Enable CPU source on CPU attached eDP */
   9481   1.1  riastrad 		if (has_cpu_edp) {
   9482   1.1  riastrad 			if (intel_panel_use_ssc(dev_priv) && can_ssc) {
   9483   1.1  riastrad 				DRM_DEBUG_KMS("Using SSC on eDP\n");
   9484   1.1  riastrad 				val |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
   9485   1.1  riastrad 			} else
   9486   1.1  riastrad 				val |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
   9487   1.1  riastrad 		} else
   9488   1.1  riastrad 			val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
   9489   1.1  riastrad 
   9490   1.1  riastrad 		I915_WRITE(PCH_DREF_CONTROL, val);
   9491   1.1  riastrad 		POSTING_READ(PCH_DREF_CONTROL);
   9492   1.1  riastrad 		udelay(200);
   9493   1.1  riastrad 	} else {
   9494   1.1  riastrad 		DRM_DEBUG_KMS("Disabling CPU source output\n");
   9495   1.1  riastrad 
   9496   1.1  riastrad 		val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
   9497   1.1  riastrad 
   9498   1.1  riastrad 		/* Turn off CPU output */
   9499   1.1  riastrad 		val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
   9500   1.1  riastrad 
   9501   1.1  riastrad 		I915_WRITE(PCH_DREF_CONTROL, val);
   9502   1.1  riastrad 		POSTING_READ(PCH_DREF_CONTROL);
   9503   1.1  riastrad 		udelay(200);
   9504   1.1  riastrad 
   9505   1.1  riastrad 		if (!using_ssc_source) {
   9506   1.1  riastrad 			DRM_DEBUG_KMS("Disabling SSC source\n");
   9507   1.1  riastrad 
   9508   1.1  riastrad 			/* Turn off the SSC source */
   9509   1.1  riastrad 			val &= ~DREF_SSC_SOURCE_MASK;
   9510   1.1  riastrad 			val |= DREF_SSC_SOURCE_DISABLE;
   9511   1.1  riastrad 
   9512   1.1  riastrad 			/* Turn off SSC1 */
   9513   1.1  riastrad 			val &= ~DREF_SSC1_ENABLE;
   9514   1.1  riastrad 
   9515   1.1  riastrad 			I915_WRITE(PCH_DREF_CONTROL, val);
   9516   1.1  riastrad 			POSTING_READ(PCH_DREF_CONTROL);
   9517   1.1  riastrad 			udelay(200);
   9518   1.1  riastrad 		}
   9519   1.1  riastrad 	}
   9520   1.1  riastrad 
   9521   1.1  riastrad 	BUG_ON(val != final);
   9522   1.1  riastrad }
   9523   1.1  riastrad 
   9524   1.1  riastrad static void lpt_reset_fdi_mphy(struct drm_i915_private *dev_priv)
   9525   1.1  riastrad {
   9526   1.1  riastrad 	u32 tmp;
   9527   1.1  riastrad 
   9528   1.1  riastrad 	tmp = I915_READ(SOUTH_CHICKEN2);
   9529   1.1  riastrad 	tmp |= FDI_MPHY_IOSFSB_RESET_CTL;
   9530   1.1  riastrad 	I915_WRITE(SOUTH_CHICKEN2, tmp);
   9531   1.1  riastrad 
   9532   1.1  riastrad 	if (wait_for_us(I915_READ(SOUTH_CHICKEN2) &
   9533   1.1  riastrad 			FDI_MPHY_IOSFSB_RESET_STATUS, 100))
   9534   1.1  riastrad 		DRM_ERROR("FDI mPHY reset assert timeout\n");
   9535   1.1  riastrad 
   9536   1.1  riastrad 	tmp = I915_READ(SOUTH_CHICKEN2);
   9537   1.1  riastrad 	tmp &= ~FDI_MPHY_IOSFSB_RESET_CTL;
   9538   1.1  riastrad 	I915_WRITE(SOUTH_CHICKEN2, tmp);
   9539   1.1  riastrad 
   9540   1.1  riastrad 	if (wait_for_us((I915_READ(SOUTH_CHICKEN2) &
   9541   1.1  riastrad 			 FDI_MPHY_IOSFSB_RESET_STATUS) == 0, 100))
   9542   1.1  riastrad 		DRM_ERROR("FDI mPHY reset de-assert timeout\n");
   9543   1.1  riastrad }
   9544   1.1  riastrad 
   9545   1.1  riastrad /* WaMPhyProgramming:hsw */
   9546   1.1  riastrad static void lpt_program_fdi_mphy(struct drm_i915_private *dev_priv)
   9547   1.1  riastrad {
   9548   1.1  riastrad 	u32 tmp;
   9549   1.1  riastrad 
   9550   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x8008, SBI_MPHY);
   9551   1.1  riastrad 	tmp &= ~(0xFF << 24);
   9552   1.1  riastrad 	tmp |= (0x12 << 24);
   9553   1.1  riastrad 	intel_sbi_write(dev_priv, 0x8008, tmp, SBI_MPHY);
   9554   1.1  riastrad 
   9555   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2008, SBI_MPHY);
   9556   1.1  riastrad 	tmp |= (1 << 11);
   9557   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2008, tmp, SBI_MPHY);
   9558   1.1  riastrad 
   9559   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2108, SBI_MPHY);
   9560   1.1  riastrad 	tmp |= (1 << 11);
   9561   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2108, tmp, SBI_MPHY);
   9562   1.1  riastrad 
   9563   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x206C, SBI_MPHY);
   9564   1.1  riastrad 	tmp |= (1 << 24) | (1 << 21) | (1 << 18);
   9565   1.1  riastrad 	intel_sbi_write(dev_priv, 0x206C, tmp, SBI_MPHY);
   9566   1.1  riastrad 
   9567   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x216C, SBI_MPHY);
   9568   1.1  riastrad 	tmp |= (1 << 24) | (1 << 21) | (1 << 18);
   9569   1.1  riastrad 	intel_sbi_write(dev_priv, 0x216C, tmp, SBI_MPHY);
   9570   1.1  riastrad 
   9571   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2080, SBI_MPHY);
   9572   1.1  riastrad 	tmp &= ~(7 << 13);
   9573   1.1  riastrad 	tmp |= (5 << 13);
   9574   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2080, tmp, SBI_MPHY);
   9575   1.1  riastrad 
   9576   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2180, SBI_MPHY);
   9577   1.1  riastrad 	tmp &= ~(7 << 13);
   9578   1.1  riastrad 	tmp |= (5 << 13);
   9579   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2180, tmp, SBI_MPHY);
   9580   1.1  riastrad 
   9581   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x208C, SBI_MPHY);
   9582   1.1  riastrad 	tmp &= ~0xFF;
   9583   1.1  riastrad 	tmp |= 0x1C;
   9584   1.1  riastrad 	intel_sbi_write(dev_priv, 0x208C, tmp, SBI_MPHY);
   9585   1.1  riastrad 
   9586   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x218C, SBI_MPHY);
   9587   1.1  riastrad 	tmp &= ~0xFF;
   9588   1.1  riastrad 	tmp |= 0x1C;
   9589   1.1  riastrad 	intel_sbi_write(dev_priv, 0x218C, tmp, SBI_MPHY);
   9590   1.1  riastrad 
   9591   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2098, SBI_MPHY);
   9592   1.1  riastrad 	tmp &= ~(0xFF << 16);
   9593   1.1  riastrad 	tmp |= (0x1C << 16);
   9594   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2098, tmp, SBI_MPHY);
   9595   1.1  riastrad 
   9596   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x2198, SBI_MPHY);
   9597   1.1  riastrad 	tmp &= ~(0xFF << 16);
   9598   1.1  riastrad 	tmp |= (0x1C << 16);
   9599   1.1  riastrad 	intel_sbi_write(dev_priv, 0x2198, tmp, SBI_MPHY);
   9600   1.1  riastrad 
   9601   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x20C4, SBI_MPHY);
   9602   1.1  riastrad 	tmp |= (1 << 27);
   9603   1.1  riastrad 	intel_sbi_write(dev_priv, 0x20C4, tmp, SBI_MPHY);
   9604   1.1  riastrad 
   9605   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x21C4, SBI_MPHY);
   9606   1.1  riastrad 	tmp |= (1 << 27);
   9607   1.1  riastrad 	intel_sbi_write(dev_priv, 0x21C4, tmp, SBI_MPHY);
   9608   1.1  riastrad 
   9609   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x20EC, SBI_MPHY);
   9610   1.1  riastrad 	tmp &= ~(0xF << 28);
   9611   1.1  riastrad 	tmp |= (4 << 28);
   9612   1.1  riastrad 	intel_sbi_write(dev_priv, 0x20EC, tmp, SBI_MPHY);
   9613   1.1  riastrad 
   9614   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, 0x21EC, SBI_MPHY);
   9615   1.1  riastrad 	tmp &= ~(0xF << 28);
   9616   1.1  riastrad 	tmp |= (4 << 28);
   9617   1.1  riastrad 	intel_sbi_write(dev_priv, 0x21EC, tmp, SBI_MPHY);
   9618   1.1  riastrad }
   9619   1.1  riastrad 
   9620   1.1  riastrad /* Implements 3 different sequences from BSpec chapter "Display iCLK
   9621   1.1  riastrad  * Programming" based on the parameters passed:
   9622   1.1  riastrad  * - Sequence to enable CLKOUT_DP
   9623   1.1  riastrad  * - Sequence to enable CLKOUT_DP without spread
   9624   1.1  riastrad  * - Sequence to enable CLKOUT_DP for FDI usage and configure PCH FDI I/O
   9625   1.1  riastrad  */
   9626   1.1  riastrad static void lpt_enable_clkout_dp(struct drm_i915_private *dev_priv,
   9627   1.1  riastrad 				 bool with_spread, bool with_fdi)
   9628   1.1  riastrad {
   9629   1.1  riastrad 	u32 reg, tmp;
   9630   1.1  riastrad 
   9631   1.1  riastrad 	if (WARN(with_fdi && !with_spread, "FDI requires downspread\n"))
   9632   1.1  riastrad 		with_spread = true;
   9633   1.1  riastrad 	if (WARN(HAS_PCH_LPT_LP(dev_priv) &&
   9634   1.1  riastrad 	    with_fdi, "LP PCH doesn't have FDI\n"))
   9635   1.1  riastrad 		with_fdi = false;
   9636   1.1  riastrad 
   9637   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   9638   1.1  riastrad 
   9639   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
   9640   1.1  riastrad 	tmp &= ~SBI_SSCCTL_DISABLE;
   9641   1.1  riastrad 	tmp |= SBI_SSCCTL_PATHALT;
   9642   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
   9643   1.1  riastrad 
   9644   1.1  riastrad 	udelay(24);
   9645   1.1  riastrad 
   9646   1.1  riastrad 	if (with_spread) {
   9647   1.1  riastrad 		tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
   9648   1.1  riastrad 		tmp &= ~SBI_SSCCTL_PATHALT;
   9649   1.1  riastrad 		intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
   9650   1.1  riastrad 
   9651   1.1  riastrad 		if (with_fdi) {
   9652   1.1  riastrad 			lpt_reset_fdi_mphy(dev_priv);
   9653   1.1  riastrad 			lpt_program_fdi_mphy(dev_priv);
   9654   1.1  riastrad 		}
   9655   1.1  riastrad 	}
   9656   1.1  riastrad 
   9657   1.1  riastrad 	reg = HAS_PCH_LPT_LP(dev_priv) ? SBI_GEN0 : SBI_DBUFF0;
   9658   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, reg, SBI_ICLK);
   9659   1.1  riastrad 	tmp |= SBI_GEN0_CFG_BUFFENABLE_DISABLE;
   9660   1.1  riastrad 	intel_sbi_write(dev_priv, reg, tmp, SBI_ICLK);
   9661   1.1  riastrad 
   9662   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   9663   1.1  riastrad }
   9664   1.1  riastrad 
   9665   1.1  riastrad /* Sequence to disable CLKOUT_DP */
   9666   1.1  riastrad void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv)
   9667   1.1  riastrad {
   9668   1.1  riastrad 	u32 reg, tmp;
   9669   1.1  riastrad 
   9670   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   9671   1.1  riastrad 
   9672   1.1  riastrad 	reg = HAS_PCH_LPT_LP(dev_priv) ? SBI_GEN0 : SBI_DBUFF0;
   9673   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, reg, SBI_ICLK);
   9674   1.1  riastrad 	tmp &= ~SBI_GEN0_CFG_BUFFENABLE_DISABLE;
   9675   1.1  riastrad 	intel_sbi_write(dev_priv, reg, tmp, SBI_ICLK);
   9676   1.1  riastrad 
   9677   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
   9678   1.1  riastrad 	if (!(tmp & SBI_SSCCTL_DISABLE)) {
   9679   1.1  riastrad 		if (!(tmp & SBI_SSCCTL_PATHALT)) {
   9680   1.1  riastrad 			tmp |= SBI_SSCCTL_PATHALT;
   9681   1.1  riastrad 			intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
   9682   1.1  riastrad 			udelay(32);
   9683   1.1  riastrad 		}
   9684   1.1  riastrad 		tmp |= SBI_SSCCTL_DISABLE;
   9685   1.1  riastrad 		intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
   9686   1.1  riastrad 	}
   9687   1.1  riastrad 
   9688   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   9689   1.1  riastrad }
   9690   1.1  riastrad 
   9691   1.1  riastrad #define BEND_IDX(steps) ((50 + (steps)) / 5)
   9692   1.1  riastrad 
   9693   1.1  riastrad static const u16 sscdivintphase[] = {
   9694   1.1  riastrad 	[BEND_IDX( 50)] = 0x3B23,
   9695   1.1  riastrad 	[BEND_IDX( 45)] = 0x3B23,
   9696   1.1  riastrad 	[BEND_IDX( 40)] = 0x3C23,
   9697   1.1  riastrad 	[BEND_IDX( 35)] = 0x3C23,
   9698   1.1  riastrad 	[BEND_IDX( 30)] = 0x3D23,
   9699   1.1  riastrad 	[BEND_IDX( 25)] = 0x3D23,
   9700   1.1  riastrad 	[BEND_IDX( 20)] = 0x3E23,
   9701   1.1  riastrad 	[BEND_IDX( 15)] = 0x3E23,
   9702   1.1  riastrad 	[BEND_IDX( 10)] = 0x3F23,
   9703   1.1  riastrad 	[BEND_IDX(  5)] = 0x3F23,
   9704   1.1  riastrad 	[BEND_IDX(  0)] = 0x0025,
   9705   1.1  riastrad 	[BEND_IDX( -5)] = 0x0025,
   9706   1.1  riastrad 	[BEND_IDX(-10)] = 0x0125,
   9707   1.1  riastrad 	[BEND_IDX(-15)] = 0x0125,
   9708   1.1  riastrad 	[BEND_IDX(-20)] = 0x0225,
   9709   1.1  riastrad 	[BEND_IDX(-25)] = 0x0225,
   9710   1.1  riastrad 	[BEND_IDX(-30)] = 0x0325,
   9711   1.1  riastrad 	[BEND_IDX(-35)] = 0x0325,
   9712   1.1  riastrad 	[BEND_IDX(-40)] = 0x0425,
   9713   1.1  riastrad 	[BEND_IDX(-45)] = 0x0425,
   9714   1.1  riastrad 	[BEND_IDX(-50)] = 0x0525,
   9715   1.1  riastrad };
   9716   1.1  riastrad 
   9717   1.1  riastrad /*
   9718   1.1  riastrad  * Bend CLKOUT_DP
   9719   1.1  riastrad  * steps -50 to 50 inclusive, in steps of 5
   9720   1.1  riastrad  * < 0 slow down the clock, > 0 speed up the clock, 0 == no bend (135MHz)
   9721   1.1  riastrad  * change in clock period = -(steps / 10) * 5.787 ps
   9722   1.1  riastrad  */
   9723   1.1  riastrad static void lpt_bend_clkout_dp(struct drm_i915_private *dev_priv, int steps)
   9724   1.1  riastrad {
   9725   1.1  riastrad 	u32 tmp;
   9726   1.1  riastrad 	int idx = BEND_IDX(steps);
   9727   1.1  riastrad 
   9728   1.1  riastrad 	if (WARN_ON(steps % 5 != 0))
   9729   1.1  riastrad 		return;
   9730   1.1  riastrad 
   9731   1.1  riastrad 	if (WARN_ON(idx >= ARRAY_SIZE(sscdivintphase)))
   9732   1.1  riastrad 		return;
   9733   1.1  riastrad 
   9734   1.1  riastrad 	mutex_lock(&dev_priv->sb_lock);
   9735   1.1  riastrad 
   9736   1.1  riastrad 	if (steps % 10 != 0)
   9737   1.1  riastrad 		tmp = 0xAAAAAAAB;
   9738   1.1  riastrad 	else
   9739   1.1  riastrad 		tmp = 0x00000000;
   9740   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCDITHPHASE, tmp, SBI_ICLK);
   9741   1.1  riastrad 
   9742   1.1  riastrad 	tmp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE, SBI_ICLK);
   9743   1.1  riastrad 	tmp &= 0xffff0000;
   9744   1.1  riastrad 	tmp |= sscdivintphase[idx];
   9745   1.1  riastrad 	intel_sbi_write(dev_priv, SBI_SSCDIVINTPHASE, tmp, SBI_ICLK);
   9746   1.1  riastrad 
   9747   1.1  riastrad 	mutex_unlock(&dev_priv->sb_lock);
   9748   1.1  riastrad }
   9749   1.1  riastrad 
   9750   1.1  riastrad #undef BEND_IDX
   9751   1.1  riastrad 
   9752   1.1  riastrad static bool spll_uses_pch_ssc(struct drm_i915_private *dev_priv)
   9753   1.1  riastrad {
   9754   1.1  riastrad 	u32 fuse_strap = I915_READ(FUSE_STRAP);
   9755   1.1  riastrad 	u32 ctl = I915_READ(SPLL_CTL);
   9756   1.1  riastrad 
   9757   1.1  riastrad 	if ((ctl & SPLL_PLL_ENABLE) == 0)
   9758   1.1  riastrad 		return false;
   9759   1.1  riastrad 
   9760   1.1  riastrad 	if ((ctl & SPLL_REF_MASK) == SPLL_REF_MUXED_SSC &&
   9761   1.1  riastrad 	    (fuse_strap & HSW_CPU_SSC_ENABLE) == 0)
   9762   1.1  riastrad 		return true;
   9763   1.1  riastrad 
   9764   1.1  riastrad 	if (IS_BROADWELL(dev_priv) &&
   9765   1.1  riastrad 	    (ctl & SPLL_REF_MASK) == SPLL_REF_PCH_SSC_BDW)
   9766   1.1  riastrad 		return true;
   9767   1.1  riastrad 
   9768   1.1  riastrad 	return false;
   9769   1.1  riastrad }
   9770   1.1  riastrad 
   9771   1.1  riastrad static bool wrpll_uses_pch_ssc(struct drm_i915_private *dev_priv,
   9772   1.1  riastrad 			       enum intel_dpll_id id)
   9773   1.1  riastrad {
   9774   1.1  riastrad 	u32 fuse_strap = I915_READ(FUSE_STRAP);
   9775   1.1  riastrad 	u32 ctl = I915_READ(WRPLL_CTL(id));
   9776   1.1  riastrad 
   9777   1.1  riastrad 	if ((ctl & WRPLL_PLL_ENABLE) == 0)
   9778   1.1  riastrad 		return false;
   9779   1.1  riastrad 
   9780   1.1  riastrad 	if ((ctl & WRPLL_REF_MASK) == WRPLL_REF_PCH_SSC)
   9781   1.1  riastrad 		return true;
   9782   1.1  riastrad 
   9783   1.1  riastrad 	if ((IS_BROADWELL(dev_priv) || IS_HSW_ULT(dev_priv)) &&
   9784   1.1  riastrad 	    (ctl & WRPLL_REF_MASK) == WRPLL_REF_MUXED_SSC_BDW &&
   9785   1.1  riastrad 	    (fuse_strap & HSW_CPU_SSC_ENABLE) == 0)
   9786   1.1  riastrad 		return true;
   9787   1.1  riastrad 
   9788   1.1  riastrad 	return false;
   9789   1.1  riastrad }
   9790   1.1  riastrad 
   9791   1.1  riastrad static void lpt_init_pch_refclk(struct drm_i915_private *dev_priv)
   9792   1.1  riastrad {
   9793   1.1  riastrad 	struct intel_encoder *encoder;
   9794   1.1  riastrad 	bool has_fdi = false;
   9795   1.1  riastrad 
   9796   1.1  riastrad 	for_each_intel_encoder(&dev_priv->drm, encoder) {
   9797   1.1  riastrad 		switch (encoder->type) {
   9798   1.1  riastrad 		case INTEL_OUTPUT_ANALOG:
   9799   1.1  riastrad 			has_fdi = true;
   9800   1.1  riastrad 			break;
   9801   1.1  riastrad 		default:
   9802   1.1  riastrad 			break;
   9803   1.1  riastrad 		}
   9804   1.1  riastrad 	}
   9805   1.1  riastrad 
   9806   1.1  riastrad 	/*
   9807   1.1  riastrad 	 * The BIOS may have decided to use the PCH SSC
   9808   1.1  riastrad 	 * reference so we must not disable it until the
   9809   1.1  riastrad 	 * relevant PLLs have stopped relying on it. We'll
   9810   1.1  riastrad 	 * just leave the PCH SSC reference enabled in case
   9811   1.1  riastrad 	 * any active PLL is using it. It will get disabled
   9812   1.1  riastrad 	 * after runtime suspend if we don't have FDI.
   9813   1.1  riastrad 	 *
   9814   1.1  riastrad 	 * TODO: Move the whole reference clock handling
   9815   1.1  riastrad 	 * to the modeset sequence proper so that we can
   9816   1.1  riastrad 	 * actually enable/disable/reconfigure these things
   9817   1.1  riastrad 	 * safely. To do that we need to introduce a real
   9818   1.1  riastrad 	 * clock hierarchy. That would also allow us to do
   9819   1.1  riastrad 	 * clock bending finally.
   9820   1.1  riastrad 	 */
   9821   1.1  riastrad 	dev_priv->pch_ssc_use = 0;
   9822   1.1  riastrad 
   9823   1.1  riastrad 	if (spll_uses_pch_ssc(dev_priv)) {
   9824   1.1  riastrad 		DRM_DEBUG_KMS("SPLL using PCH SSC\n");
   9825   1.1  riastrad 		dev_priv->pch_ssc_use |= BIT(DPLL_ID_SPLL);
   9826   1.1  riastrad 	}
   9827   1.1  riastrad 
   9828   1.1  riastrad 	if (wrpll_uses_pch_ssc(dev_priv, DPLL_ID_WRPLL1)) {
   9829   1.1  riastrad 		DRM_DEBUG_KMS("WRPLL1 using PCH SSC\n");
   9830   1.1  riastrad 		dev_priv->pch_ssc_use |= BIT(DPLL_ID_WRPLL1);
   9831   1.1  riastrad 	}
   9832   1.1  riastrad 
   9833   1.1  riastrad 	if (wrpll_uses_pch_ssc(dev_priv, DPLL_ID_WRPLL2)) {
   9834   1.1  riastrad 		DRM_DEBUG_KMS("WRPLL2 using PCH SSC\n");
   9835   1.1  riastrad 		dev_priv->pch_ssc_use |= BIT(DPLL_ID_WRPLL2);
   9836   1.1  riastrad 	}
   9837   1.1  riastrad 
   9838   1.1  riastrad 	if (dev_priv->pch_ssc_use)
   9839   1.1  riastrad 		return;
   9840   1.1  riastrad 
   9841   1.1  riastrad 	if (has_fdi) {
   9842   1.1  riastrad 		lpt_bend_clkout_dp(dev_priv, 0);
   9843   1.1  riastrad 		lpt_enable_clkout_dp(dev_priv, true, true);
   9844   1.1  riastrad 	} else {
   9845   1.1  riastrad 		lpt_disable_clkout_dp(dev_priv);
   9846   1.1  riastrad 	}
   9847   1.1  riastrad }
   9848   1.1  riastrad 
   9849   1.1  riastrad /*
   9850   1.1  riastrad  * Initialize reference clocks when the driver loads
   9851   1.1  riastrad  */
   9852   1.1  riastrad void intel_init_pch_refclk(struct drm_i915_private *dev_priv)
   9853   1.1  riastrad {
   9854   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
   9855   1.1  riastrad 		ilk_init_pch_refclk(dev_priv);
   9856   1.1  riastrad 	else if (HAS_PCH_LPT(dev_priv))
   9857   1.1  riastrad 		lpt_init_pch_refclk(dev_priv);
   9858   1.1  riastrad }
   9859   1.1  riastrad 
   9860   1.1  riastrad static void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)
   9861   1.1  riastrad {
   9862   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   9863   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9864   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   9865   1.1  riastrad 	u32 val;
   9866   1.1  riastrad 
   9867   1.1  riastrad 	val = 0;
   9868   1.1  riastrad 
   9869   1.1  riastrad 	switch (crtc_state->pipe_bpp) {
   9870   1.1  riastrad 	case 18:
   9871   1.1  riastrad 		val |= PIPECONF_6BPC;
   9872   1.1  riastrad 		break;
   9873   1.1  riastrad 	case 24:
   9874   1.1  riastrad 		val |= PIPECONF_8BPC;
   9875   1.1  riastrad 		break;
   9876   1.1  riastrad 	case 30:
   9877   1.1  riastrad 		val |= PIPECONF_10BPC;
   9878   1.1  riastrad 		break;
   9879   1.1  riastrad 	case 36:
   9880   1.1  riastrad 		val |= PIPECONF_12BPC;
   9881   1.1  riastrad 		break;
   9882   1.1  riastrad 	default:
   9883   1.1  riastrad 		/* Case prevented by intel_choose_pipe_bpp_dither. */
   9884   1.1  riastrad 		BUG();
   9885   1.1  riastrad 	}
   9886   1.1  riastrad 
   9887   1.1  riastrad 	if (crtc_state->dither)
   9888   1.1  riastrad 		val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
   9889   1.1  riastrad 
   9890   1.1  riastrad 	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
   9891   1.1  riastrad 		val |= PIPECONF_INTERLACED_ILK;
   9892   1.1  riastrad 	else
   9893   1.1  riastrad 		val |= PIPECONF_PROGRESSIVE;
   9894   1.1  riastrad 
   9895   1.1  riastrad 	/*
   9896   1.1  riastrad 	 * This would end up with an odd purple hue over
   9897   1.1  riastrad 	 * the entire display. Make sure we don't do it.
   9898   1.1  riastrad 	 */
   9899   1.1  riastrad 	WARN_ON(crtc_state->limited_color_range &&
   9900   1.1  riastrad 		crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
   9901   1.1  riastrad 
   9902   1.1  riastrad 	if (crtc_state->limited_color_range)
   9903   1.1  riastrad 		val |= PIPECONF_COLOR_RANGE_SELECT;
   9904   1.1  riastrad 
   9905   1.1  riastrad 	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
   9906   1.1  riastrad 		val |= PIPECONF_OUTPUT_COLORSPACE_YUV709;
   9907   1.1  riastrad 
   9908   1.1  riastrad 	val |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
   9909   1.1  riastrad 
   9910   1.1  riastrad 	val |= PIPECONF_FRAME_START_DELAY(0);
   9911   1.1  riastrad 
   9912   1.1  riastrad 	I915_WRITE(PIPECONF(pipe), val);
   9913   1.1  riastrad 	POSTING_READ(PIPECONF(pipe));
   9914   1.1  riastrad }
   9915   1.1  riastrad 
   9916   1.1  riastrad static void hsw_set_pipeconf(const struct intel_crtc_state *crtc_state)
   9917   1.1  riastrad {
   9918   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   9919   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9920   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   9921   1.1  riastrad 	u32 val = 0;
   9922   1.1  riastrad 
   9923   1.1  riastrad 	if (IS_HASWELL(dev_priv) && crtc_state->dither)
   9924   1.1  riastrad 		val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
   9925   1.1  riastrad 
   9926   1.1  riastrad 	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
   9927   1.1  riastrad 		val |= PIPECONF_INTERLACED_ILK;
   9928   1.1  riastrad 	else
   9929   1.1  riastrad 		val |= PIPECONF_PROGRESSIVE;
   9930   1.1  riastrad 
   9931   1.1  riastrad 	if (IS_HASWELL(dev_priv) &&
   9932   1.1  riastrad 	    crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
   9933   1.1  riastrad 		val |= PIPECONF_OUTPUT_COLORSPACE_YUV_HSW;
   9934   1.1  riastrad 
   9935   1.1  riastrad 	I915_WRITE(PIPECONF(cpu_transcoder), val);
   9936   1.1  riastrad 	POSTING_READ(PIPECONF(cpu_transcoder));
   9937   1.1  riastrad }
   9938   1.1  riastrad 
   9939   1.1  riastrad static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)
   9940   1.1  riastrad {
   9941   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   9942   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9943   1.1  riastrad 	u32 val = 0;
   9944   1.1  riastrad 
   9945   1.1  riastrad 	switch (crtc_state->pipe_bpp) {
   9946   1.1  riastrad 	case 18:
   9947   1.1  riastrad 		val |= PIPEMISC_DITHER_6_BPC;
   9948   1.1  riastrad 		break;
   9949   1.1  riastrad 	case 24:
   9950   1.1  riastrad 		val |= PIPEMISC_DITHER_8_BPC;
   9951   1.1  riastrad 		break;
   9952   1.1  riastrad 	case 30:
   9953   1.1  riastrad 		val |= PIPEMISC_DITHER_10_BPC;
   9954   1.1  riastrad 		break;
   9955   1.1  riastrad 	case 36:
   9956   1.1  riastrad 		val |= PIPEMISC_DITHER_12_BPC;
   9957   1.1  riastrad 		break;
   9958   1.1  riastrad 	default:
   9959   1.1  riastrad 		MISSING_CASE(crtc_state->pipe_bpp);
   9960   1.1  riastrad 		break;
   9961   1.1  riastrad 	}
   9962   1.1  riastrad 
   9963   1.1  riastrad 	if (crtc_state->dither)
   9964   1.1  riastrad 		val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
   9965   1.1  riastrad 
   9966   1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
   9967   1.1  riastrad 	    crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
   9968   1.1  riastrad 		val |= PIPEMISC_OUTPUT_COLORSPACE_YUV;
   9969   1.1  riastrad 
   9970   1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
   9971   1.1  riastrad 		val |= PIPEMISC_YUV420_ENABLE |
   9972   1.1  riastrad 			PIPEMISC_YUV420_MODE_FULL_BLEND;
   9973   1.1  riastrad 
   9974   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 &&
   9975   1.1  riastrad 	    (crtc_state->active_planes & ~(icl_hdr_plane_mask() |
   9976   1.1  riastrad 					   BIT(PLANE_CURSOR))) == 0)
   9977   1.1  riastrad 		val |= PIPEMISC_HDR_MODE_PRECISION;
   9978   1.1  riastrad 
   9979   1.1  riastrad 	I915_WRITE(PIPEMISC(crtc->pipe), val);
   9980   1.1  riastrad }
   9981   1.1  riastrad 
   9982   1.1  riastrad int bdw_get_pipemisc_bpp(struct intel_crtc *crtc)
   9983   1.1  riastrad {
   9984   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   9985   1.1  riastrad 	u32 tmp;
   9986   1.1  riastrad 
   9987   1.1  riastrad 	tmp = I915_READ(PIPEMISC(crtc->pipe));
   9988   1.1  riastrad 
   9989   1.1  riastrad 	switch (tmp & PIPEMISC_DITHER_BPC_MASK) {
   9990   1.1  riastrad 	case PIPEMISC_DITHER_6_BPC:
   9991   1.1  riastrad 		return 18;
   9992   1.1  riastrad 	case PIPEMISC_DITHER_8_BPC:
   9993   1.1  riastrad 		return 24;
   9994   1.1  riastrad 	case PIPEMISC_DITHER_10_BPC:
   9995   1.1  riastrad 		return 30;
   9996   1.1  riastrad 	case PIPEMISC_DITHER_12_BPC:
   9997   1.1  riastrad 		return 36;
   9998   1.1  riastrad 	default:
   9999   1.1  riastrad 		MISSING_CASE(tmp);
   10000   1.1  riastrad 		return 0;
   10001   1.1  riastrad 	}
   10002   1.1  riastrad }
   10003   1.1  riastrad 
   10004   1.1  riastrad int ilk_get_lanes_required(int target_clock, int link_bw, int bpp)
   10005   1.1  riastrad {
   10006   1.1  riastrad 	/*
   10007   1.1  riastrad 	 * Account for spread spectrum to avoid
   10008   1.1  riastrad 	 * oversubscribing the link. Max center spread
   10009   1.1  riastrad 	 * is 2.5%; use 5% for safety's sake.
   10010   1.1  riastrad 	 */
   10011   1.1  riastrad 	u32 bps = target_clock * bpp * 21 / 20;
   10012   1.1  riastrad 	return DIV_ROUND_UP(bps, link_bw * 8);
   10013   1.1  riastrad }
   10014   1.1  riastrad 
   10015   1.1  riastrad static bool ilk_needs_fb_cb_tune(struct dpll *dpll, int factor)
   10016   1.1  riastrad {
   10017   1.1  riastrad 	return i9xx_dpll_compute_m(dpll) < factor * dpll->n;
   10018   1.1  riastrad }
   10019   1.1  riastrad 
   10020   1.1  riastrad static void ilk_compute_dpll(struct intel_crtc *crtc,
   10021   1.1  riastrad 			     struct intel_crtc_state *crtc_state,
   10022   1.1  riastrad 			     struct dpll *reduced_clock)
   10023   1.1  riastrad {
   10024   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10025   1.1  riastrad 	u32 dpll, fp, fp2;
   10026   1.1  riastrad 	int factor;
   10027   1.1  riastrad 
   10028   1.1  riastrad 	/* Enable autotuning of the PLL clock (if permissible) */
   10029   1.1  riastrad 	factor = 21;
   10030   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   10031   1.1  riastrad 		if ((intel_panel_use_ssc(dev_priv) &&
   10032   1.1  riastrad 		     dev_priv->vbt.lvds_ssc_freq == 100000) ||
   10033   1.1  riastrad 		    (HAS_PCH_IBX(dev_priv) &&
   10034   1.1  riastrad 		     intel_is_dual_link_lvds(dev_priv)))
   10035   1.1  riastrad 			factor = 25;
   10036   1.1  riastrad 	} else if (crtc_state->sdvo_tv_clock) {
   10037   1.1  riastrad 		factor = 20;
   10038   1.1  riastrad 	}
   10039   1.1  riastrad 
   10040   1.1  riastrad 	fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
   10041   1.1  riastrad 
   10042   1.1  riastrad 	if (ilk_needs_fb_cb_tune(&crtc_state->dpll, factor))
   10043   1.1  riastrad 		fp |= FP_CB_TUNE;
   10044   1.1  riastrad 
   10045   1.1  riastrad 	if (reduced_clock) {
   10046   1.1  riastrad 		fp2 = i9xx_dpll_compute_fp(reduced_clock);
   10047   1.1  riastrad 
   10048   1.1  riastrad 		if (reduced_clock->m < factor * reduced_clock->n)
   10049   1.1  riastrad 			fp2 |= FP_CB_TUNE;
   10050   1.1  riastrad 	} else {
   10051   1.1  riastrad 		fp2 = fp;
   10052   1.1  riastrad 	}
   10053   1.1  riastrad 
   10054   1.1  riastrad 	dpll = 0;
   10055   1.1  riastrad 
   10056   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
   10057   1.1  riastrad 		dpll |= DPLLB_MODE_LVDS;
   10058   1.1  riastrad 	else
   10059   1.1  riastrad 		dpll |= DPLLB_MODE_DAC_SERIAL;
   10060   1.1  riastrad 
   10061   1.1  riastrad 	dpll |= (crtc_state->pixel_multiplier - 1)
   10062   1.1  riastrad 		<< PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT;
   10063   1.1  riastrad 
   10064   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO) ||
   10065   1.1  riastrad 	    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
   10066   1.1  riastrad 		dpll |= DPLL_SDVO_HIGH_SPEED;
   10067   1.1  riastrad 
   10068   1.1  riastrad 	if (intel_crtc_has_dp_encoder(crtc_state))
   10069   1.1  riastrad 		dpll |= DPLL_SDVO_HIGH_SPEED;
   10070   1.1  riastrad 
   10071   1.1  riastrad 	/*
   10072   1.1  riastrad 	 * The high speed IO clock is only really required for
   10073   1.1  riastrad 	 * SDVO/HDMI/DP, but we also enable it for CRT to make it
   10074   1.1  riastrad 	 * possible to share the DPLL between CRT and HDMI. Enabling
   10075   1.1  riastrad 	 * the clock needlessly does no real harm, except use up a
   10076   1.1  riastrad 	 * bit of power potentially.
   10077   1.1  riastrad 	 *
   10078   1.1  riastrad 	 * We'll limit this to IVB with 3 pipes, since it has only two
   10079   1.1  riastrad 	 * DPLLs and so DPLL sharing is the only way to get three pipes
   10080   1.1  riastrad 	 * driving PCH ports at the same time. On SNB we could do this,
   10081   1.1  riastrad 	 * and potentially avoid enabling the second DPLL, but it's not
   10082   1.1  riastrad 	 * clear if it''s a win or loss power wise. No point in doing
   10083   1.1  riastrad 	 * this on ILK at all since it has a fixed DPLL<->pipe mapping.
   10084   1.1  riastrad 	 */
   10085   1.1  riastrad 	if (INTEL_NUM_PIPES(dev_priv) == 3 &&
   10086   1.1  riastrad 	    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
   10087   1.1  riastrad 		dpll |= DPLL_SDVO_HIGH_SPEED;
   10088   1.1  riastrad 
   10089   1.1  riastrad 	/* compute bitmask from p1 value */
   10090   1.1  riastrad 	dpll |= (1 << (crtc_state->dpll.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
   10091   1.1  riastrad 	/* also FPA1 */
   10092   1.1  riastrad 	dpll |= (1 << (crtc_state->dpll.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
   10093   1.1  riastrad 
   10094   1.1  riastrad 	switch (crtc_state->dpll.p2) {
   10095   1.1  riastrad 	case 5:
   10096   1.1  riastrad 		dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
   10097   1.1  riastrad 		break;
   10098   1.1  riastrad 	case 7:
   10099   1.1  riastrad 		dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
   10100   1.1  riastrad 		break;
   10101   1.1  riastrad 	case 10:
   10102   1.1  riastrad 		dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
   10103   1.1  riastrad 		break;
   10104   1.1  riastrad 	case 14:
   10105   1.1  riastrad 		dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
   10106   1.1  riastrad 		break;
   10107   1.1  riastrad 	}
   10108   1.1  riastrad 
   10109   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
   10110   1.1  riastrad 	    intel_panel_use_ssc(dev_priv))
   10111   1.1  riastrad 		dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
   10112   1.1  riastrad 	else
   10113   1.1  riastrad 		dpll |= PLL_REF_INPUT_DREFCLK;
   10114   1.1  riastrad 
   10115   1.1  riastrad 	dpll |= DPLL_VCO_ENABLE;
   10116   1.1  riastrad 
   10117   1.1  riastrad 	crtc_state->dpll_hw_state.dpll = dpll;
   10118   1.1  riastrad 	crtc_state->dpll_hw_state.fp0 = fp;
   10119   1.1  riastrad 	crtc_state->dpll_hw_state.fp1 = fp2;
   10120   1.1  riastrad }
   10121   1.1  riastrad 
   10122   1.1  riastrad static int ilk_crtc_compute_clock(struct intel_crtc *crtc,
   10123   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   10124   1.1  riastrad {
   10125   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10126   1.1  riastrad 	struct intel_atomic_state *state =
   10127   1.1  riastrad 		to_intel_atomic_state(crtc_state->uapi.state);
   10128   1.1  riastrad 	const struct intel_limit *limit;
   10129   1.1  riastrad 	int refclk = 120000;
   10130   1.1  riastrad 
   10131   1.1  riastrad 	memset(&crtc_state->dpll_hw_state, 0,
   10132   1.1  riastrad 	       sizeof(crtc_state->dpll_hw_state));
   10133   1.1  riastrad 
   10134   1.1  riastrad 	/* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
   10135   1.1  riastrad 	if (!crtc_state->has_pch_encoder)
   10136   1.1  riastrad 		return 0;
   10137   1.1  riastrad 
   10138   1.1  riastrad 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
   10139   1.1  riastrad 		if (intel_panel_use_ssc(dev_priv)) {
   10140   1.1  riastrad 			DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n",
   10141   1.1  riastrad 				      dev_priv->vbt.lvds_ssc_freq);
   10142   1.1  riastrad 			refclk = dev_priv->vbt.lvds_ssc_freq;
   10143   1.1  riastrad 		}
   10144   1.1  riastrad 
   10145   1.1  riastrad 		if (intel_is_dual_link_lvds(dev_priv)) {
   10146   1.1  riastrad 			if (refclk == 100000)
   10147   1.1  riastrad 				limit = &ilk_limits_dual_lvds_100m;
   10148   1.1  riastrad 			else
   10149   1.1  riastrad 				limit = &ilk_limits_dual_lvds;
   10150   1.1  riastrad 		} else {
   10151   1.1  riastrad 			if (refclk == 100000)
   10152   1.1  riastrad 				limit = &ilk_limits_single_lvds_100m;
   10153   1.1  riastrad 			else
   10154   1.1  riastrad 				limit = &ilk_limits_single_lvds;
   10155   1.1  riastrad 		}
   10156   1.1  riastrad 	} else {
   10157   1.1  riastrad 		limit = &ilk_limits_dac;
   10158   1.1  riastrad 	}
   10159   1.1  riastrad 
   10160   1.1  riastrad 	if (!crtc_state->clock_set &&
   10161   1.1  riastrad 	    !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
   10162   1.1  riastrad 				refclk, NULL, &crtc_state->dpll)) {
   10163   1.1  riastrad 		DRM_ERROR("Couldn't find PLL settings for mode!\n");
   10164   1.1  riastrad 		return -EINVAL;
   10165   1.1  riastrad 	}
   10166   1.1  riastrad 
   10167   1.1  riastrad 	ilk_compute_dpll(crtc, crtc_state, NULL);
   10168   1.1  riastrad 
   10169   1.1  riastrad 	if (!intel_reserve_shared_dplls(state, crtc, NULL)) {
   10170   1.1  riastrad 		DRM_DEBUG_KMS("failed to find PLL for pipe %c\n",
   10171   1.1  riastrad 			      pipe_name(crtc->pipe));
   10172   1.1  riastrad 		return -EINVAL;
   10173   1.1  riastrad 	}
   10174   1.1  riastrad 
   10175   1.1  riastrad 	return 0;
   10176   1.1  riastrad }
   10177   1.1  riastrad 
   10178   1.1  riastrad static void intel_pch_transcoder_get_m_n(struct intel_crtc *crtc,
   10179   1.1  riastrad 					 struct intel_link_m_n *m_n)
   10180   1.1  riastrad {
   10181   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10182   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10183   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   10184   1.1  riastrad 
   10185   1.1  riastrad 	m_n->link_m = I915_READ(PCH_TRANS_LINK_M1(pipe));
   10186   1.1  riastrad 	m_n->link_n = I915_READ(PCH_TRANS_LINK_N1(pipe));
   10187   1.1  riastrad 	m_n->gmch_m = I915_READ(PCH_TRANS_DATA_M1(pipe))
   10188   1.1  riastrad 		& ~TU_SIZE_MASK;
   10189   1.1  riastrad 	m_n->gmch_n = I915_READ(PCH_TRANS_DATA_N1(pipe));
   10190   1.1  riastrad 	m_n->tu = ((I915_READ(PCH_TRANS_DATA_M1(pipe))
   10191   1.1  riastrad 		    & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10192   1.1  riastrad }
   10193   1.1  riastrad 
   10194   1.1  riastrad static void intel_cpu_transcoder_get_m_n(struct intel_crtc *crtc,
   10195   1.1  riastrad 					 enum transcoder transcoder,
   10196   1.1  riastrad 					 struct intel_link_m_n *m_n,
   10197   1.1  riastrad 					 struct intel_link_m_n *m2_n2)
   10198   1.1  riastrad {
   10199   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10200   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   10201   1.1  riastrad 
   10202   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5) {
   10203   1.1  riastrad 		m_n->link_m = I915_READ(PIPE_LINK_M1(transcoder));
   10204   1.1  riastrad 		m_n->link_n = I915_READ(PIPE_LINK_N1(transcoder));
   10205   1.1  riastrad 		m_n->gmch_m = I915_READ(PIPE_DATA_M1(transcoder))
   10206   1.1  riastrad 			& ~TU_SIZE_MASK;
   10207   1.1  riastrad 		m_n->gmch_n = I915_READ(PIPE_DATA_N1(transcoder));
   10208   1.1  riastrad 		m_n->tu = ((I915_READ(PIPE_DATA_M1(transcoder))
   10209   1.1  riastrad 			    & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10210   1.1  riastrad 
   10211   1.1  riastrad 		if (m2_n2 && transcoder_has_m2_n2(dev_priv, transcoder)) {
   10212   1.1  riastrad 			m2_n2->link_m = I915_READ(PIPE_LINK_M2(transcoder));
   10213   1.1  riastrad 			m2_n2->link_n =	I915_READ(PIPE_LINK_N2(transcoder));
   10214   1.1  riastrad 			m2_n2->gmch_m =	I915_READ(PIPE_DATA_M2(transcoder))
   10215   1.1  riastrad 					& ~TU_SIZE_MASK;
   10216   1.1  riastrad 			m2_n2->gmch_n =	I915_READ(PIPE_DATA_N2(transcoder));
   10217   1.1  riastrad 			m2_n2->tu = ((I915_READ(PIPE_DATA_M2(transcoder))
   10218   1.1  riastrad 					& TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10219   1.1  riastrad 		}
   10220   1.1  riastrad 	} else {
   10221   1.1  riastrad 		m_n->link_m = I915_READ(PIPE_LINK_M_G4X(pipe));
   10222   1.1  riastrad 		m_n->link_n = I915_READ(PIPE_LINK_N_G4X(pipe));
   10223   1.1  riastrad 		m_n->gmch_m = I915_READ(PIPE_DATA_M_G4X(pipe))
   10224   1.1  riastrad 			& ~TU_SIZE_MASK;
   10225   1.1  riastrad 		m_n->gmch_n = I915_READ(PIPE_DATA_N_G4X(pipe));
   10226   1.1  riastrad 		m_n->tu = ((I915_READ(PIPE_DATA_M_G4X(pipe))
   10227   1.1  riastrad 			    & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
   10228   1.1  riastrad 	}
   10229   1.1  riastrad }
   10230   1.1  riastrad 
   10231   1.1  riastrad void intel_dp_get_m_n(struct intel_crtc *crtc,
   10232   1.1  riastrad 		      struct intel_crtc_state *pipe_config)
   10233   1.1  riastrad {
   10234   1.1  riastrad 	if (pipe_config->has_pch_encoder)
   10235   1.1  riastrad 		intel_pch_transcoder_get_m_n(crtc, &pipe_config->dp_m_n);
   10236   1.1  riastrad 	else
   10237   1.1  riastrad 		intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
   10238   1.1  riastrad 					     &pipe_config->dp_m_n,
   10239   1.1  riastrad 					     &pipe_config->dp_m2_n2);
   10240   1.1  riastrad }
   10241   1.1  riastrad 
   10242   1.1  riastrad static void ilk_get_fdi_m_n_config(struct intel_crtc *crtc,
   10243   1.1  riastrad 				   struct intel_crtc_state *pipe_config)
   10244   1.1  riastrad {
   10245   1.1  riastrad 	intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
   10246   1.1  riastrad 				     &pipe_config->fdi_m_n, NULL);
   10247   1.1  riastrad }
   10248   1.1  riastrad 
   10249   1.1  riastrad static void skl_get_pfit_config(struct intel_crtc *crtc,
   10250   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   10251   1.1  riastrad {
   10252   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10253   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10254   1.1  riastrad 	struct intel_crtc_scaler_state *scaler_state = &pipe_config->scaler_state;
   10255   1.1  riastrad 	u32 ps_ctrl = 0;
   10256   1.1  riastrad 	int id = -1;
   10257   1.1  riastrad 	int i;
   10258   1.1  riastrad 
   10259   1.1  riastrad 	/* find scaler attached to this pipe */
   10260   1.1  riastrad 	for (i = 0; i < crtc->num_scalers; i++) {
   10261   1.1  riastrad 		ps_ctrl = I915_READ(SKL_PS_CTRL(crtc->pipe, i));
   10262   1.1  riastrad 		if (ps_ctrl & PS_SCALER_EN && !(ps_ctrl & PS_PLANE_SEL_MASK)) {
   10263   1.1  riastrad 			id = i;
   10264   1.1  riastrad 			pipe_config->pch_pfit.enabled = true;
   10265   1.1  riastrad 			pipe_config->pch_pfit.pos = I915_READ(SKL_PS_WIN_POS(crtc->pipe, i));
   10266   1.1  riastrad 			pipe_config->pch_pfit.size = I915_READ(SKL_PS_WIN_SZ(crtc->pipe, i));
   10267   1.1  riastrad 			scaler_state->scalers[i].in_use = true;
   10268   1.1  riastrad 			break;
   10269   1.1  riastrad 		}
   10270   1.1  riastrad 	}
   10271   1.1  riastrad 
   10272   1.1  riastrad 	scaler_state->scaler_id = id;
   10273   1.1  riastrad 	if (id >= 0) {
   10274   1.1  riastrad 		scaler_state->scaler_users |= (1 << SKL_CRTC_INDEX);
   10275   1.1  riastrad 	} else {
   10276   1.1  riastrad 		scaler_state->scaler_users &= ~(1 << SKL_CRTC_INDEX);
   10277   1.1  riastrad 	}
   10278   1.1  riastrad }
   10279   1.1  riastrad 
   10280   1.1  riastrad static void
   10281   1.1  riastrad skl_get_initial_plane_config(struct intel_crtc *crtc,
   10282   1.1  riastrad 			     struct intel_initial_plane_config *plane_config)
   10283   1.1  riastrad {
   10284   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10285   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10286   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
   10287   1.1  riastrad 	enum plane_id plane_id = plane->id;
   10288   1.1  riastrad 	enum pipe pipe;
   10289   1.3  riastrad 	u32 val, base, offset __unused, stride_mult, tiling, alpha;
   10290   1.1  riastrad 	int fourcc, pixel_format;
   10291   1.1  riastrad 	unsigned int aligned_height;
   10292   1.1  riastrad 	struct drm_framebuffer *fb;
   10293   1.1  riastrad 	struct intel_framebuffer *intel_fb;
   10294   1.1  riastrad 
   10295   1.1  riastrad 	if (!plane->get_hw_state(plane, &pipe))
   10296   1.1  riastrad 		return;
   10297   1.1  riastrad 
   10298   1.1  riastrad 	WARN_ON(pipe != crtc->pipe);
   10299   1.1  riastrad 
   10300   1.1  riastrad 	intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
   10301   1.1  riastrad 	if (!intel_fb) {
   10302   1.1  riastrad 		DRM_DEBUG_KMS("failed to alloc fb\n");
   10303   1.1  riastrad 		return;
   10304   1.1  riastrad 	}
   10305   1.1  riastrad 
   10306   1.1  riastrad 	fb = &intel_fb->base;
   10307   1.1  riastrad 
   10308   1.1  riastrad 	fb->dev = dev;
   10309   1.1  riastrad 
   10310   1.1  riastrad 	val = I915_READ(PLANE_CTL(pipe, plane_id));
   10311   1.1  riastrad 
   10312   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   10313   1.1  riastrad 		pixel_format = val & ICL_PLANE_CTL_FORMAT_MASK;
   10314   1.1  riastrad 	else
   10315   1.1  riastrad 		pixel_format = val & PLANE_CTL_FORMAT_MASK;
   10316   1.1  riastrad 
   10317   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) {
   10318   1.1  riastrad 		alpha = I915_READ(PLANE_COLOR_CTL(pipe, plane_id));
   10319   1.1  riastrad 		alpha &= PLANE_COLOR_ALPHA_MASK;
   10320   1.1  riastrad 	} else {
   10321   1.1  riastrad 		alpha = val & PLANE_CTL_ALPHA_MASK;
   10322   1.1  riastrad 	}
   10323   1.1  riastrad 
   10324   1.1  riastrad 	fourcc = skl_format_to_fourcc(pixel_format,
   10325   1.1  riastrad 				      val & PLANE_CTL_ORDER_RGBX, alpha);
   10326   1.1  riastrad 	fb->format = drm_format_info(fourcc);
   10327   1.1  riastrad 
   10328   1.1  riastrad 	tiling = val & PLANE_CTL_TILED_MASK;
   10329   1.1  riastrad 	switch (tiling) {
   10330   1.1  riastrad 	case PLANE_CTL_TILED_LINEAR:
   10331   1.1  riastrad 		fb->modifier = DRM_FORMAT_MOD_LINEAR;
   10332   1.1  riastrad 		break;
   10333   1.1  riastrad 	case PLANE_CTL_TILED_X:
   10334   1.1  riastrad 		plane_config->tiling = I915_TILING_X;
   10335   1.1  riastrad 		fb->modifier = I915_FORMAT_MOD_X_TILED;
   10336   1.1  riastrad 		break;
   10337   1.1  riastrad 	case PLANE_CTL_TILED_Y:
   10338   1.1  riastrad 		plane_config->tiling = I915_TILING_Y;
   10339   1.1  riastrad 		if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
   10340   1.1  riastrad 			fb->modifier = INTEL_GEN(dev_priv) >= 12 ?
   10341   1.1  riastrad 				I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS :
   10342   1.1  riastrad 				I915_FORMAT_MOD_Y_TILED_CCS;
   10343   1.1  riastrad 		else if (val & PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE)
   10344   1.1  riastrad 			fb->modifier = I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
   10345   1.1  riastrad 		else
   10346   1.1  riastrad 			fb->modifier = I915_FORMAT_MOD_Y_TILED;
   10347   1.1  riastrad 		break;
   10348   1.1  riastrad 	case PLANE_CTL_TILED_YF:
   10349   1.1  riastrad 		if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
   10350   1.1  riastrad 			fb->modifier = I915_FORMAT_MOD_Yf_TILED_CCS;
   10351   1.1  riastrad 		else
   10352   1.1  riastrad 			fb->modifier = I915_FORMAT_MOD_Yf_TILED;
   10353   1.1  riastrad 		break;
   10354   1.1  riastrad 	default:
   10355   1.1  riastrad 		MISSING_CASE(tiling);
   10356   1.1  riastrad 		goto error;
   10357   1.1  riastrad 	}
   10358   1.1  riastrad 
   10359   1.1  riastrad 	/*
   10360   1.1  riastrad 	 * DRM_MODE_ROTATE_ is counter clockwise to stay compatible with Xrandr
   10361   1.1  riastrad 	 * while i915 HW rotation is clockwise, thats why this swapping.
   10362   1.1  riastrad 	 */
   10363   1.1  riastrad 	switch (val & PLANE_CTL_ROTATE_MASK) {
   10364   1.1  riastrad 	case PLANE_CTL_ROTATE_0:
   10365   1.1  riastrad 		plane_config->rotation = DRM_MODE_ROTATE_0;
   10366   1.1  riastrad 		break;
   10367   1.1  riastrad 	case PLANE_CTL_ROTATE_90:
   10368   1.1  riastrad 		plane_config->rotation = DRM_MODE_ROTATE_270;
   10369   1.1  riastrad 		break;
   10370   1.1  riastrad 	case PLANE_CTL_ROTATE_180:
   10371   1.1  riastrad 		plane_config->rotation = DRM_MODE_ROTATE_180;
   10372   1.1  riastrad 		break;
   10373   1.1  riastrad 	case PLANE_CTL_ROTATE_270:
   10374   1.1  riastrad 		plane_config->rotation = DRM_MODE_ROTATE_90;
   10375   1.1  riastrad 		break;
   10376   1.1  riastrad 	}
   10377   1.1  riastrad 
   10378   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 &&
   10379   1.1  riastrad 	    val & PLANE_CTL_FLIP_HORIZONTAL)
   10380   1.1  riastrad 		plane_config->rotation |= DRM_MODE_REFLECT_X;
   10381   1.1  riastrad 
   10382   1.1  riastrad 	base = I915_READ(PLANE_SURF(pipe, plane_id)) & 0xfffff000;
   10383   1.1  riastrad 	plane_config->base = base;
   10384   1.1  riastrad 
   10385   1.1  riastrad 	offset = I915_READ(PLANE_OFFSET(pipe, plane_id));
   10386   1.1  riastrad 
   10387   1.1  riastrad 	val = I915_READ(PLANE_SIZE(pipe, plane_id));
   10388   1.1  riastrad 	fb->height = ((val >> 16) & 0xffff) + 1;
   10389   1.1  riastrad 	fb->width = ((val >> 0) & 0xffff) + 1;
   10390   1.1  riastrad 
   10391   1.1  riastrad 	val = I915_READ(PLANE_STRIDE(pipe, plane_id));
   10392   1.1  riastrad 	stride_mult = skl_plane_stride_mult(fb, 0, DRM_MODE_ROTATE_0);
   10393   1.1  riastrad 	fb->pitches[0] = (val & 0x3ff) * stride_mult;
   10394   1.1  riastrad 
   10395   1.1  riastrad 	aligned_height = intel_fb_align_height(fb, 0, fb->height);
   10396   1.1  riastrad 
   10397   1.1  riastrad 	plane_config->size = fb->pitches[0] * aligned_height;
   10398   1.1  riastrad 
   10399   1.1  riastrad 	DRM_DEBUG_KMS("%s/%s with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
   10400   1.1  riastrad 		      crtc->base.name, plane->base.name, fb->width, fb->height,
   10401   1.1  riastrad 		      fb->format->cpp[0] * 8, base, fb->pitches[0],
   10402   1.1  riastrad 		      plane_config->size);
   10403   1.1  riastrad 
   10404   1.1  riastrad 	plane_config->fb = intel_fb;
   10405   1.1  riastrad 	return;
   10406   1.1  riastrad 
   10407   1.1  riastrad error:
   10408   1.1  riastrad 	kfree(intel_fb);
   10409   1.1  riastrad }
   10410   1.1  riastrad 
   10411   1.1  riastrad static void ilk_get_pfit_config(struct intel_crtc *crtc,
   10412   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   10413   1.1  riastrad {
   10414   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10415   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10416   1.1  riastrad 	u32 tmp;
   10417   1.1  riastrad 
   10418   1.1  riastrad 	tmp = I915_READ(PF_CTL(crtc->pipe));
   10419   1.1  riastrad 
   10420   1.1  riastrad 	if (tmp & PF_ENABLE) {
   10421   1.1  riastrad 		pipe_config->pch_pfit.enabled = true;
   10422   1.1  riastrad 		pipe_config->pch_pfit.pos = I915_READ(PF_WIN_POS(crtc->pipe));
   10423   1.1  riastrad 		pipe_config->pch_pfit.size = I915_READ(PF_WIN_SZ(crtc->pipe));
   10424   1.1  riastrad 
   10425   1.1  riastrad 		/* We currently do not free assignements of panel fitters on
   10426   1.1  riastrad 		 * ivb/hsw (since we don't use the higher upscaling modes which
   10427   1.1  riastrad 		 * differentiates them) so just WARN about this case for now. */
   10428   1.1  riastrad 		if (IS_GEN(dev_priv, 7)) {
   10429   1.1  riastrad 			WARN_ON((tmp & PF_PIPE_SEL_MASK_IVB) !=
   10430   1.1  riastrad 				PF_PIPE_SEL_IVB(crtc->pipe));
   10431   1.1  riastrad 		}
   10432   1.1  riastrad 	}
   10433   1.1  riastrad }
   10434   1.1  riastrad 
   10435   1.1  riastrad static bool ilk_get_pipe_config(struct intel_crtc *crtc,
   10436   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   10437   1.1  riastrad {
   10438   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10439   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10440   1.1  riastrad 	enum intel_display_power_domain power_domain;
   10441   1.1  riastrad 	intel_wakeref_t wakeref;
   10442   1.1  riastrad 	u32 tmp;
   10443   1.1  riastrad 	bool ret;
   10444   1.1  riastrad 
   10445   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
   10446   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10447   1.1  riastrad 	if (!wakeref)
   10448   1.1  riastrad 		return false;
   10449   1.1  riastrad 
   10450   1.1  riastrad 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
   10451   1.1  riastrad 	pipe_config->shared_dpll = NULL;
   10452   1.1  riastrad 	pipe_config->master_transcoder = INVALID_TRANSCODER;
   10453   1.1  riastrad 
   10454   1.1  riastrad 	ret = false;
   10455   1.1  riastrad 	tmp = I915_READ(PIPECONF(crtc->pipe));
   10456   1.1  riastrad 	if (!(tmp & PIPECONF_ENABLE))
   10457   1.1  riastrad 		goto out;
   10458   1.1  riastrad 
   10459   1.1  riastrad 	switch (tmp & PIPECONF_BPC_MASK) {
   10460   1.1  riastrad 	case PIPECONF_6BPC:
   10461   1.1  riastrad 		pipe_config->pipe_bpp = 18;
   10462   1.1  riastrad 		break;
   10463   1.1  riastrad 	case PIPECONF_8BPC:
   10464   1.1  riastrad 		pipe_config->pipe_bpp = 24;
   10465   1.1  riastrad 		break;
   10466   1.1  riastrad 	case PIPECONF_10BPC:
   10467   1.1  riastrad 		pipe_config->pipe_bpp = 30;
   10468   1.1  riastrad 		break;
   10469   1.1  riastrad 	case PIPECONF_12BPC:
   10470   1.1  riastrad 		pipe_config->pipe_bpp = 36;
   10471   1.1  riastrad 		break;
   10472   1.1  riastrad 	default:
   10473   1.1  riastrad 		break;
   10474   1.1  riastrad 	}
   10475   1.1  riastrad 
   10476   1.1  riastrad 	if (tmp & PIPECONF_COLOR_RANGE_SELECT)
   10477   1.1  riastrad 		pipe_config->limited_color_range = true;
   10478   1.1  riastrad 
   10479   1.1  riastrad 	switch (tmp & PIPECONF_OUTPUT_COLORSPACE_MASK) {
   10480   1.1  riastrad 	case PIPECONF_OUTPUT_COLORSPACE_YUV601:
   10481   1.1  riastrad 	case PIPECONF_OUTPUT_COLORSPACE_YUV709:
   10482   1.1  riastrad 		pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
   10483   1.1  riastrad 		break;
   10484   1.1  riastrad 	default:
   10485   1.1  riastrad 		pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   10486   1.1  riastrad 		break;
   10487   1.1  riastrad 	}
   10488   1.1  riastrad 
   10489   1.1  riastrad 	pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_ILK) >>
   10490   1.1  riastrad 		PIPECONF_GAMMA_MODE_SHIFT;
   10491   1.1  riastrad 
   10492   1.1  riastrad 	pipe_config->csc_mode = I915_READ(PIPE_CSC_MODE(crtc->pipe));
   10493   1.1  riastrad 
   10494   1.1  riastrad 	i9xx_get_pipe_color_config(pipe_config);
   10495   1.1  riastrad 	intel_color_get_config(pipe_config);
   10496   1.1  riastrad 
   10497   1.1  riastrad 	if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
   10498   1.1  riastrad 		struct intel_shared_dpll *pll;
   10499   1.1  riastrad 		enum intel_dpll_id pll_id;
   10500   1.1  riastrad 
   10501   1.1  riastrad 		pipe_config->has_pch_encoder = true;
   10502   1.1  riastrad 
   10503   1.1  riastrad 		tmp = I915_READ(FDI_RX_CTL(crtc->pipe));
   10504   1.1  riastrad 		pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
   10505   1.1  riastrad 					  FDI_DP_PORT_WIDTH_SHIFT) + 1;
   10506   1.1  riastrad 
   10507   1.1  riastrad 		ilk_get_fdi_m_n_config(crtc, pipe_config);
   10508   1.1  riastrad 
   10509   1.1  riastrad 		if (HAS_PCH_IBX(dev_priv)) {
   10510   1.1  riastrad 			/*
   10511   1.1  riastrad 			 * The pipe->pch transcoder and pch transcoder->pll
   10512   1.1  riastrad 			 * mapping is fixed.
   10513   1.1  riastrad 			 */
   10514   1.1  riastrad 			pll_id = (enum intel_dpll_id) crtc->pipe;
   10515   1.1  riastrad 		} else {
   10516   1.1  riastrad 			tmp = I915_READ(PCH_DPLL_SEL);
   10517   1.1  riastrad 			if (tmp & TRANS_DPLLB_SEL(crtc->pipe))
   10518   1.1  riastrad 				pll_id = DPLL_ID_PCH_PLL_B;
   10519   1.1  riastrad 			else
   10520   1.1  riastrad 				pll_id= DPLL_ID_PCH_PLL_A;
   10521   1.1  riastrad 		}
   10522   1.1  riastrad 
   10523   1.1  riastrad 		pipe_config->shared_dpll =
   10524   1.1  riastrad 			intel_get_shared_dpll_by_id(dev_priv, pll_id);
   10525   1.1  riastrad 		pll = pipe_config->shared_dpll;
   10526   1.1  riastrad 
   10527   1.1  riastrad 		WARN_ON(!pll->info->funcs->get_hw_state(dev_priv, pll,
   10528   1.1  riastrad 						&pipe_config->dpll_hw_state));
   10529   1.1  riastrad 
   10530   1.1  riastrad 		tmp = pipe_config->dpll_hw_state.dpll;
   10531   1.1  riastrad 		pipe_config->pixel_multiplier =
   10532   1.1  riastrad 			((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
   10533   1.1  riastrad 			 >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
   10534   1.1  riastrad 
   10535   1.1  riastrad 		ilk_pch_clock_get(crtc, pipe_config);
   10536   1.1  riastrad 	} else {
   10537   1.1  riastrad 		pipe_config->pixel_multiplier = 1;
   10538   1.1  riastrad 	}
   10539   1.1  riastrad 
   10540   1.1  riastrad 	intel_get_pipe_timings(crtc, pipe_config);
   10541   1.1  riastrad 	intel_get_pipe_src_size(crtc, pipe_config);
   10542   1.1  riastrad 
   10543   1.1  riastrad 	ilk_get_pfit_config(crtc, pipe_config);
   10544   1.1  riastrad 
   10545   1.1  riastrad 	ret = true;
   10546   1.1  riastrad 
   10547   1.1  riastrad out:
   10548   1.1  riastrad 	intel_display_power_put(dev_priv, power_domain, wakeref);
   10549   1.1  riastrad 
   10550   1.1  riastrad 	return ret;
   10551   1.1  riastrad }
   10552   1.1  riastrad 
   10553   1.1  riastrad static int hsw_crtc_compute_clock(struct intel_crtc *crtc,
   10554   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   10555   1.1  riastrad {
   10556   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10557   1.1  riastrad 	struct intel_atomic_state *state =
   10558   1.1  riastrad 		to_intel_atomic_state(crtc_state->uapi.state);
   10559   1.1  riastrad 
   10560   1.1  riastrad 	if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) ||
   10561   1.1  riastrad 	    INTEL_GEN(dev_priv) >= 11) {
   10562   1.1  riastrad 		struct intel_encoder *encoder =
   10563   1.1  riastrad 			intel_get_crtc_new_encoder(state, crtc_state);
   10564   1.1  riastrad 
   10565   1.1  riastrad 		if (!intel_reserve_shared_dplls(state, crtc, encoder)) {
   10566   1.1  riastrad 			DRM_DEBUG_KMS("failed to find PLL for pipe %c\n",
   10567   1.1  riastrad 				      pipe_name(crtc->pipe));
   10568   1.1  riastrad 			return -EINVAL;
   10569   1.1  riastrad 		}
   10570   1.1  riastrad 	}
   10571   1.1  riastrad 
   10572   1.1  riastrad 	return 0;
   10573   1.1  riastrad }
   10574   1.1  riastrad 
   10575   1.1  riastrad static void cnl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10576   1.1  riastrad 			    struct intel_crtc_state *pipe_config)
   10577   1.1  riastrad {
   10578   1.1  riastrad 	enum intel_dpll_id id;
   10579   1.1  riastrad 	u32 temp;
   10580   1.1  riastrad 
   10581   1.1  riastrad 	temp = I915_READ(DPCLKA_CFGCR0) & DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port);
   10582   1.1  riastrad 	id = temp >> DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port);
   10583   1.1  riastrad 
   10584   1.1  riastrad 	if (WARN_ON(id < SKL_DPLL0 || id > SKL_DPLL2))
   10585   1.1  riastrad 		return;
   10586   1.1  riastrad 
   10587   1.1  riastrad 	pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10588   1.1  riastrad }
   10589   1.1  riastrad 
   10590   1.1  riastrad static void icl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10591   1.1  riastrad 			    struct intel_crtc_state *pipe_config)
   10592   1.1  riastrad {
   10593   1.1  riastrad 	enum phy phy = intel_port_to_phy(dev_priv, port);
   10594   1.1  riastrad 	enum icl_port_dpll_id port_dpll_id;
   10595   1.1  riastrad 	enum intel_dpll_id id;
   10596   1.1  riastrad 	u32 temp;
   10597   1.1  riastrad 
   10598   1.1  riastrad 	if (intel_phy_is_combo(dev_priv, phy)) {
   10599   1.1  riastrad 		temp = I915_READ(ICL_DPCLKA_CFGCR0) &
   10600   1.1  riastrad 			ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy);
   10601   1.1  riastrad 		id = temp >> ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy);
   10602   1.1  riastrad 		port_dpll_id = ICL_PORT_DPLL_DEFAULT;
   10603   1.1  riastrad 	} else if (intel_phy_is_tc(dev_priv, phy)) {
   10604   1.1  riastrad 		u32 clk_sel = I915_READ(DDI_CLK_SEL(port)) & DDI_CLK_SEL_MASK;
   10605   1.1  riastrad 
   10606   1.1  riastrad 		if (clk_sel == DDI_CLK_SEL_MG) {
   10607   1.1  riastrad 			id = icl_tc_port_to_pll_id(intel_port_to_tc(dev_priv,
   10608   1.1  riastrad 								    port));
   10609   1.1  riastrad 			port_dpll_id = ICL_PORT_DPLL_MG_PHY;
   10610   1.1  riastrad 		} else {
   10611   1.1  riastrad 			WARN_ON(clk_sel < DDI_CLK_SEL_TBT_162);
   10612   1.1  riastrad 			id = DPLL_ID_ICL_TBTPLL;
   10613   1.1  riastrad 			port_dpll_id = ICL_PORT_DPLL_DEFAULT;
   10614   1.1  riastrad 		}
   10615   1.1  riastrad 	} else {
   10616   1.1  riastrad 		WARN(1, "Invalid port %x\n", port);
   10617   1.1  riastrad 		return;
   10618   1.1  riastrad 	}
   10619   1.1  riastrad 
   10620   1.1  riastrad 	pipe_config->icl_port_dplls[port_dpll_id].pll =
   10621   1.1  riastrad 		intel_get_shared_dpll_by_id(dev_priv, id);
   10622   1.1  riastrad 
   10623   1.1  riastrad 	icl_set_active_port_dpll(pipe_config, port_dpll_id);
   10624   1.1  riastrad }
   10625   1.1  riastrad 
   10626   1.1  riastrad static void bxt_get_ddi_pll(struct drm_i915_private *dev_priv,
   10627   1.1  riastrad 				enum port port,
   10628   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   10629   1.1  riastrad {
   10630   1.1  riastrad 	enum intel_dpll_id id;
   10631   1.1  riastrad 
   10632   1.1  riastrad 	switch (port) {
   10633   1.1  riastrad 	case PORT_A:
   10634   1.1  riastrad 		id = DPLL_ID_SKL_DPLL0;
   10635   1.1  riastrad 		break;
   10636   1.1  riastrad 	case PORT_B:
   10637   1.1  riastrad 		id = DPLL_ID_SKL_DPLL1;
   10638   1.1  riastrad 		break;
   10639   1.1  riastrad 	case PORT_C:
   10640   1.1  riastrad 		id = DPLL_ID_SKL_DPLL2;
   10641   1.1  riastrad 		break;
   10642   1.1  riastrad 	default:
   10643   1.1  riastrad 		DRM_ERROR("Incorrect port type\n");
   10644   1.1  riastrad 		return;
   10645   1.1  riastrad 	}
   10646   1.1  riastrad 
   10647   1.1  riastrad 	pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10648   1.1  riastrad }
   10649   1.1  riastrad 
   10650   1.1  riastrad static void skl_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10651   1.1  riastrad 			    struct intel_crtc_state *pipe_config)
   10652   1.1  riastrad {
   10653   1.1  riastrad 	enum intel_dpll_id id;
   10654   1.1  riastrad 	u32 temp;
   10655   1.1  riastrad 
   10656   1.1  riastrad 	temp = I915_READ(DPLL_CTRL2) & DPLL_CTRL2_DDI_CLK_SEL_MASK(port);
   10657   1.1  riastrad 	id = temp >> (port * 3 + 1);
   10658   1.1  riastrad 
   10659   1.1  riastrad 	if (WARN_ON(id < SKL_DPLL0 || id > SKL_DPLL3))
   10660   1.1  riastrad 		return;
   10661   1.1  riastrad 
   10662   1.1  riastrad 	pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10663   1.1  riastrad }
   10664   1.1  riastrad 
   10665   1.1  riastrad static void hsw_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
   10666   1.1  riastrad 			    struct intel_crtc_state *pipe_config)
   10667   1.1  riastrad {
   10668   1.1  riastrad 	enum intel_dpll_id id;
   10669   1.1  riastrad 	u32 ddi_pll_sel = I915_READ(PORT_CLK_SEL(port));
   10670   1.1  riastrad 
   10671   1.1  riastrad 	switch (ddi_pll_sel) {
   10672   1.1  riastrad 	case PORT_CLK_SEL_WRPLL1:
   10673   1.1  riastrad 		id = DPLL_ID_WRPLL1;
   10674   1.1  riastrad 		break;
   10675   1.1  riastrad 	case PORT_CLK_SEL_WRPLL2:
   10676   1.1  riastrad 		id = DPLL_ID_WRPLL2;
   10677   1.1  riastrad 		break;
   10678   1.1  riastrad 	case PORT_CLK_SEL_SPLL:
   10679   1.1  riastrad 		id = DPLL_ID_SPLL;
   10680   1.1  riastrad 		break;
   10681   1.1  riastrad 	case PORT_CLK_SEL_LCPLL_810:
   10682   1.1  riastrad 		id = DPLL_ID_LCPLL_810;
   10683   1.1  riastrad 		break;
   10684   1.1  riastrad 	case PORT_CLK_SEL_LCPLL_1350:
   10685   1.1  riastrad 		id = DPLL_ID_LCPLL_1350;
   10686   1.1  riastrad 		break;
   10687   1.1  riastrad 	case PORT_CLK_SEL_LCPLL_2700:
   10688   1.1  riastrad 		id = DPLL_ID_LCPLL_2700;
   10689   1.1  riastrad 		break;
   10690   1.1  riastrad 	default:
   10691   1.1  riastrad 		MISSING_CASE(ddi_pll_sel);
   10692   1.1  riastrad 		/* fall through */
   10693   1.1  riastrad 	case PORT_CLK_SEL_NONE:
   10694   1.1  riastrad 		return;
   10695   1.1  riastrad 	}
   10696   1.1  riastrad 
   10697   1.1  riastrad 	pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
   10698   1.1  riastrad }
   10699   1.1  riastrad 
   10700   1.1  riastrad static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
   10701   1.1  riastrad 				     struct intel_crtc_state *pipe_config,
   10702   1.1  riastrad 				     u64 *power_domain_mask,
   10703   1.1  riastrad 				     intel_wakeref_t *wakerefs)
   10704   1.1  riastrad {
   10705   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10706   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10707   1.1  riastrad 	enum intel_display_power_domain power_domain;
   10708   1.1  riastrad 	unsigned long panel_transcoder_mask = 0;
   10709   1.1  riastrad 	unsigned long enabled_panel_transcoders = 0;
   10710   1.1  riastrad 	enum transcoder panel_transcoder;
   10711   1.1  riastrad 	intel_wakeref_t wf;
   10712   1.1  riastrad 	u32 tmp;
   10713   1.1  riastrad 
   10714   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   10715   1.1  riastrad 		panel_transcoder_mask |=
   10716   1.1  riastrad 			BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1);
   10717   1.1  riastrad 
   10718   1.1  riastrad 	if (HAS_TRANSCODER_EDP(dev_priv))
   10719   1.1  riastrad 		panel_transcoder_mask |= BIT(TRANSCODER_EDP);
   10720   1.1  riastrad 
   10721   1.1  riastrad 	/*
   10722   1.1  riastrad 	 * The pipe->transcoder mapping is fixed with the exception of the eDP
   10723   1.1  riastrad 	 * and DSI transcoders handled below.
   10724   1.1  riastrad 	 */
   10725   1.1  riastrad 	pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
   10726   1.1  riastrad 
   10727   1.1  riastrad 	/*
   10728   1.1  riastrad 	 * XXX: Do intel_display_power_get_if_enabled before reading this (for
   10729   1.1  riastrad 	 * consistency and less surprising code; it's in always on power).
   10730   1.1  riastrad 	 */
   10731   1.1  riastrad 	for_each_set_bit(panel_transcoder,
   10732   1.1  riastrad 			 &panel_transcoder_mask,
   10733   1.1  riastrad 			 ARRAY_SIZE(INTEL_INFO(dev_priv)->trans_offsets)) {
   10734   1.1  riastrad 		bool force_thru = false;
   10735   1.1  riastrad 		enum pipe trans_pipe;
   10736   1.1  riastrad 
   10737   1.1  riastrad 		tmp = I915_READ(TRANS_DDI_FUNC_CTL(panel_transcoder));
   10738   1.1  riastrad 		if (!(tmp & TRANS_DDI_FUNC_ENABLE))
   10739   1.1  riastrad 			continue;
   10740   1.1  riastrad 
   10741   1.1  riastrad 		/*
   10742   1.1  riastrad 		 * Log all enabled ones, only use the first one.
   10743   1.1  riastrad 		 *
   10744   1.1  riastrad 		 * FIXME: This won't work for two separate DSI displays.
   10745   1.1  riastrad 		 */
   10746   1.1  riastrad 		enabled_panel_transcoders |= BIT(panel_transcoder);
   10747   1.1  riastrad 		if (enabled_panel_transcoders != BIT(panel_transcoder))
   10748   1.1  riastrad 			continue;
   10749   1.1  riastrad 
   10750   1.1  riastrad 		switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
   10751   1.1  riastrad 		default:
   10752   1.1  riastrad 			WARN(1, "unknown pipe linked to transcoder %s\n",
   10753   1.1  riastrad 			     transcoder_name(panel_transcoder));
   10754   1.1  riastrad 			/* fall through */
   10755   1.1  riastrad 		case TRANS_DDI_EDP_INPUT_A_ONOFF:
   10756   1.1  riastrad 			force_thru = true;
   10757   1.1  riastrad 			/* fall through */
   10758   1.1  riastrad 		case TRANS_DDI_EDP_INPUT_A_ON:
   10759   1.1  riastrad 			trans_pipe = PIPE_A;
   10760   1.1  riastrad 			break;
   10761   1.1  riastrad 		case TRANS_DDI_EDP_INPUT_B_ONOFF:
   10762   1.1  riastrad 			trans_pipe = PIPE_B;
   10763   1.1  riastrad 			break;
   10764   1.1  riastrad 		case TRANS_DDI_EDP_INPUT_C_ONOFF:
   10765   1.1  riastrad 			trans_pipe = PIPE_C;
   10766   1.1  riastrad 			break;
   10767   1.1  riastrad 		case TRANS_DDI_EDP_INPUT_D_ONOFF:
   10768   1.1  riastrad 			trans_pipe = PIPE_D;
   10769   1.1  riastrad 			break;
   10770   1.1  riastrad 		}
   10771   1.1  riastrad 
   10772   1.1  riastrad 		if (trans_pipe == crtc->pipe) {
   10773   1.1  riastrad 			pipe_config->cpu_transcoder = panel_transcoder;
   10774   1.1  riastrad 			pipe_config->pch_pfit.force_thru = force_thru;
   10775   1.1  riastrad 		}
   10776   1.1  riastrad 	}
   10777   1.1  riastrad 
   10778   1.1  riastrad 	/*
   10779   1.1  riastrad 	 * Valid combos: none, eDP, DSI0, DSI1, DSI0+DSI1
   10780   1.1  riastrad 	 */
   10781   1.1  riastrad 	WARN_ON((enabled_panel_transcoders & BIT(TRANSCODER_EDP)) &&
   10782   1.1  riastrad 		enabled_panel_transcoders != BIT(TRANSCODER_EDP));
   10783   1.1  riastrad 
   10784   1.1  riastrad 	power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
   10785   1.1  riastrad 	WARN_ON(*power_domain_mask & BIT_ULL(power_domain));
   10786   1.1  riastrad 
   10787   1.1  riastrad 	wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10788   1.1  riastrad 	if (!wf)
   10789   1.1  riastrad 		return false;
   10790   1.1  riastrad 
   10791   1.1  riastrad 	wakerefs[power_domain] = wf;
   10792   1.1  riastrad 	*power_domain_mask |= BIT_ULL(power_domain);
   10793   1.1  riastrad 
   10794   1.1  riastrad 	tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
   10795   1.1  riastrad 
   10796   1.1  riastrad 	return tmp & PIPECONF_ENABLE;
   10797   1.1  riastrad }
   10798   1.1  riastrad 
   10799   1.1  riastrad static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
   10800   1.1  riastrad 					 struct intel_crtc_state *pipe_config,
   10801   1.1  riastrad 					 u64 *power_domain_mask,
   10802   1.1  riastrad 					 intel_wakeref_t *wakerefs)
   10803   1.1  riastrad {
   10804   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   10805   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   10806   1.1  riastrad 	enum intel_display_power_domain power_domain;
   10807   1.1  riastrad 	enum transcoder cpu_transcoder;
   10808   1.1  riastrad 	intel_wakeref_t wf;
   10809   1.1  riastrad 	enum port port;
   10810   1.1  riastrad 	u32 tmp;
   10811   1.1  riastrad 
   10812   1.1  riastrad 	for_each_port_masked(port, BIT(PORT_A) | BIT(PORT_C)) {
   10813   1.1  riastrad 		if (port == PORT_A)
   10814   1.1  riastrad 			cpu_transcoder = TRANSCODER_DSI_A;
   10815   1.1  riastrad 		else
   10816   1.1  riastrad 			cpu_transcoder = TRANSCODER_DSI_C;
   10817   1.1  riastrad 
   10818   1.1  riastrad 		power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
   10819   1.1  riastrad 		WARN_ON(*power_domain_mask & BIT_ULL(power_domain));
   10820   1.1  riastrad 
   10821   1.1  riastrad 		wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10822   1.1  riastrad 		if (!wf)
   10823   1.1  riastrad 			continue;
   10824   1.1  riastrad 
   10825   1.1  riastrad 		wakerefs[power_domain] = wf;
   10826   1.1  riastrad 		*power_domain_mask |= BIT_ULL(power_domain);
   10827   1.1  riastrad 
   10828   1.1  riastrad 		/*
   10829   1.1  riastrad 		 * The PLL needs to be enabled with a valid divider
   10830   1.1  riastrad 		 * configuration, otherwise accessing DSI registers will hang
   10831   1.1  riastrad 		 * the machine. See BSpec North Display Engine
   10832   1.1  riastrad 		 * registers/MIPI[BXT]. We can break out here early, since we
   10833   1.1  riastrad 		 * need the same DSI PLL to be enabled for both DSI ports.
   10834   1.1  riastrad 		 */
   10835   1.1  riastrad 		if (!bxt_dsi_pll_is_enabled(dev_priv))
   10836   1.1  riastrad 			break;
   10837   1.1  riastrad 
   10838   1.1  riastrad 		/* XXX: this works for video mode only */
   10839   1.1  riastrad 		tmp = I915_READ(BXT_MIPI_PORT_CTRL(port));
   10840   1.1  riastrad 		if (!(tmp & DPI_ENABLE))
   10841   1.1  riastrad 			continue;
   10842   1.1  riastrad 
   10843   1.1  riastrad 		tmp = I915_READ(MIPI_CTRL(port));
   10844   1.1  riastrad 		if ((tmp & BXT_PIPE_SELECT_MASK) != BXT_PIPE_SELECT(crtc->pipe))
   10845   1.1  riastrad 			continue;
   10846   1.1  riastrad 
   10847   1.1  riastrad 		pipe_config->cpu_transcoder = cpu_transcoder;
   10848   1.1  riastrad 		break;
   10849   1.1  riastrad 	}
   10850   1.1  riastrad 
   10851   1.1  riastrad 	return transcoder_is_dsi(pipe_config->cpu_transcoder);
   10852   1.1  riastrad }
   10853   1.1  riastrad 
   10854   1.1  riastrad static void hsw_get_ddi_port_state(struct intel_crtc *crtc,
   10855   1.1  riastrad 				   struct intel_crtc_state *pipe_config)
   10856   1.1  riastrad {
   10857   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10858   1.1  riastrad 	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
   10859   1.1  riastrad 	struct intel_shared_dpll *pll;
   10860   1.1  riastrad 	enum port port;
   10861   1.1  riastrad 	u32 tmp;
   10862   1.1  riastrad 
   10863   1.1  riastrad 	if (transcoder_is_dsi(cpu_transcoder)) {
   10864   1.1  riastrad 		port = (cpu_transcoder == TRANSCODER_DSI_A) ?
   10865   1.1  riastrad 						PORT_A : PORT_B;
   10866   1.1  riastrad 	} else {
   10867   1.1  riastrad 		tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
   10868   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 12)
   10869   1.1  riastrad 			port = TGL_TRANS_DDI_FUNC_CTL_VAL_TO_PORT(tmp);
   10870   1.1  riastrad 		else
   10871   1.1  riastrad 			port = TRANS_DDI_FUNC_CTL_VAL_TO_PORT(tmp);
   10872   1.1  riastrad 	}
   10873   1.1  riastrad 
   10874   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   10875   1.1  riastrad 		icl_get_ddi_pll(dev_priv, port, pipe_config);
   10876   1.1  riastrad 	else if (IS_CANNONLAKE(dev_priv))
   10877   1.1  riastrad 		cnl_get_ddi_pll(dev_priv, port, pipe_config);
   10878   1.1  riastrad 	else if (IS_GEN9_BC(dev_priv))
   10879   1.1  riastrad 		skl_get_ddi_pll(dev_priv, port, pipe_config);
   10880   1.1  riastrad 	else if (IS_GEN9_LP(dev_priv))
   10881   1.1  riastrad 		bxt_get_ddi_pll(dev_priv, port, pipe_config);
   10882   1.1  riastrad 	else
   10883   1.1  riastrad 		hsw_get_ddi_pll(dev_priv, port, pipe_config);
   10884   1.1  riastrad 
   10885   1.1  riastrad 	pll = pipe_config->shared_dpll;
   10886   1.1  riastrad 	if (pll) {
   10887   1.1  riastrad 		WARN_ON(!pll->info->funcs->get_hw_state(dev_priv, pll,
   10888   1.1  riastrad 						&pipe_config->dpll_hw_state));
   10889   1.1  riastrad 	}
   10890   1.1  riastrad 
   10891   1.1  riastrad 	/*
   10892   1.1  riastrad 	 * Haswell has only FDI/PCH transcoder A. It is which is connected to
   10893   1.1  riastrad 	 * DDI E. So just check whether this pipe is wired to DDI E and whether
   10894   1.1  riastrad 	 * the PCH transcoder is on.
   10895   1.1  riastrad 	 */
   10896   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9 &&
   10897   1.1  riastrad 	    (port == PORT_E) && I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) {
   10898   1.1  riastrad 		pipe_config->has_pch_encoder = true;
   10899   1.1  riastrad 
   10900   1.1  riastrad 		tmp = I915_READ(FDI_RX_CTL(PIPE_A));
   10901   1.1  riastrad 		pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
   10902   1.1  riastrad 					  FDI_DP_PORT_WIDTH_SHIFT) + 1;
   10903   1.1  riastrad 
   10904   1.1  riastrad 		ilk_get_fdi_m_n_config(crtc, pipe_config);
   10905   1.1  riastrad 	}
   10906   1.1  riastrad }
   10907   1.1  riastrad 
   10908   1.1  riastrad static enum transcoder transcoder_master_readout(struct drm_i915_private *dev_priv,
   10909   1.1  riastrad 						 enum transcoder cpu_transcoder)
   10910   1.1  riastrad {
   10911   1.1  riastrad 	u32 trans_port_sync, master_select;
   10912   1.1  riastrad 
   10913   1.1  riastrad 	trans_port_sync = I915_READ(TRANS_DDI_FUNC_CTL2(cpu_transcoder));
   10914   1.1  riastrad 
   10915   1.1  riastrad 	if ((trans_port_sync & PORT_SYNC_MODE_ENABLE) == 0)
   10916   1.1  riastrad 		return INVALID_TRANSCODER;
   10917   1.1  riastrad 
   10918   1.1  riastrad 	master_select = trans_port_sync &
   10919   1.1  riastrad 			PORT_SYNC_MODE_MASTER_SELECT_MASK;
   10920   1.1  riastrad 	if (master_select == 0)
   10921   1.1  riastrad 		return TRANSCODER_EDP;
   10922   1.1  riastrad 	else
   10923   1.1  riastrad 		return master_select - 1;
   10924   1.1  riastrad }
   10925   1.1  riastrad 
   10926   1.1  riastrad static void icl_get_trans_port_sync_config(struct intel_crtc_state *crtc_state)
   10927   1.1  riastrad {
   10928   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   10929   1.1  riastrad 	u32 transcoders;
   10930   1.1  riastrad 	enum transcoder cpu_transcoder;
   10931   1.1  riastrad 
   10932   1.1  riastrad 	crtc_state->master_transcoder = transcoder_master_readout(dev_priv,
   10933   1.1  riastrad 								  crtc_state->cpu_transcoder);
   10934   1.1  riastrad 
   10935   1.1  riastrad 	transcoders = BIT(TRANSCODER_A) |
   10936   1.1  riastrad 		BIT(TRANSCODER_B) |
   10937   1.1  riastrad 		BIT(TRANSCODER_C) |
   10938   1.1  riastrad 		BIT(TRANSCODER_D);
   10939   1.1  riastrad 	for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
   10940   1.1  riastrad 		enum intel_display_power_domain power_domain;
   10941   1.1  riastrad 		intel_wakeref_t trans_wakeref;
   10942   1.1  riastrad 
   10943   1.1  riastrad 		power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
   10944   1.1  riastrad 		trans_wakeref = intel_display_power_get_if_enabled(dev_priv,
   10945   1.1  riastrad 								   power_domain);
   10946   1.1  riastrad 
   10947   1.1  riastrad 		if (!trans_wakeref)
   10948   1.1  riastrad 			continue;
   10949   1.1  riastrad 
   10950   1.1  riastrad 		if (transcoder_master_readout(dev_priv, cpu_transcoder) ==
   10951   1.1  riastrad 		    crtc_state->cpu_transcoder)
   10952   1.1  riastrad 			crtc_state->sync_mode_slaves_mask |= BIT(cpu_transcoder);
   10953   1.1  riastrad 
   10954   1.1  riastrad 		intel_display_power_put(dev_priv, power_domain, trans_wakeref);
   10955   1.1  riastrad 	}
   10956   1.1  riastrad 
   10957   1.1  riastrad 	WARN_ON(crtc_state->master_transcoder != INVALID_TRANSCODER &&
   10958   1.1  riastrad 		crtc_state->sync_mode_slaves_mask);
   10959   1.1  riastrad }
   10960   1.1  riastrad 
   10961   1.1  riastrad static bool hsw_get_pipe_config(struct intel_crtc *crtc,
   10962   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   10963   1.1  riastrad {
   10964   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   10965   1.1  riastrad 	intel_wakeref_t wakerefs[POWER_DOMAIN_NUM], wf;
   10966   1.1  riastrad 	enum intel_display_power_domain power_domain;
   10967   1.1  riastrad 	u64 power_domain_mask;
   10968   1.1  riastrad 	bool active;
   10969   1.1  riastrad 
   10970   1.1  riastrad 	pipe_config->master_transcoder = INVALID_TRANSCODER;
   10971   1.1  riastrad 
   10972   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
   10973   1.1  riastrad 	wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   10974   1.1  riastrad 	if (!wf)
   10975   1.1  riastrad 		return false;
   10976   1.1  riastrad 
   10977   1.1  riastrad 	wakerefs[power_domain] = wf;
   10978   1.1  riastrad 	power_domain_mask = BIT_ULL(power_domain);
   10979   1.1  riastrad 
   10980   1.1  riastrad 	pipe_config->shared_dpll = NULL;
   10981   1.1  riastrad 
   10982   1.1  riastrad 	active = hsw_get_transcoder_state(crtc, pipe_config,
   10983   1.1  riastrad 					  &power_domain_mask, wakerefs);
   10984   1.1  riastrad 
   10985   1.1  riastrad 	if (IS_GEN9_LP(dev_priv) &&
   10986   1.1  riastrad 	    bxt_get_dsi_transcoder_state(crtc, pipe_config,
   10987   1.1  riastrad 					 &power_domain_mask, wakerefs)) {
   10988   1.1  riastrad 		WARN_ON(active);
   10989   1.1  riastrad 		active = true;
   10990   1.1  riastrad 	}
   10991   1.1  riastrad 
   10992   1.1  riastrad 	if (!active)
   10993   1.1  riastrad 		goto out;
   10994   1.1  riastrad 
   10995   1.1  riastrad 	if (!transcoder_is_dsi(pipe_config->cpu_transcoder) ||
   10996   1.1  riastrad 	    INTEL_GEN(dev_priv) >= 11) {
   10997   1.1  riastrad 		hsw_get_ddi_port_state(crtc, pipe_config);
   10998   1.1  riastrad 		intel_get_pipe_timings(crtc, pipe_config);
   10999   1.1  riastrad 	}
   11000   1.1  riastrad 
   11001   1.1  riastrad 	intel_get_pipe_src_size(crtc, pipe_config);
   11002   1.1  riastrad 
   11003   1.1  riastrad 	if (IS_HASWELL(dev_priv)) {
   11004   1.1  riastrad 		u32 tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
   11005   1.1  riastrad 
   11006   1.1  riastrad 		if (tmp & PIPECONF_OUTPUT_COLORSPACE_YUV_HSW)
   11007   1.1  riastrad 			pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
   11008   1.1  riastrad 		else
   11009   1.1  riastrad 			pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   11010   1.1  riastrad 	} else {
   11011   1.1  riastrad 		pipe_config->output_format =
   11012   1.1  riastrad 			bdw_get_pipemisc_output_format(crtc);
   11013   1.1  riastrad 
   11014   1.1  riastrad 		/*
   11015   1.1  riastrad 		 * Currently there is no interface defined to
   11016   1.1  riastrad 		 * check user preference between RGB/YCBCR444
   11017   1.1  riastrad 		 * or YCBCR420. So the only possible case for
   11018   1.1  riastrad 		 * YCBCR444 usage is driving YCBCR420 output
   11019   1.1  riastrad 		 * with LSPCON, when pipe is configured for
   11020   1.1  riastrad 		 * YCBCR444 output and LSPCON takes care of
   11021   1.1  riastrad 		 * downsampling it.
   11022   1.1  riastrad 		 */
   11023   1.1  riastrad 		pipe_config->lspcon_downsampling =
   11024   1.1  riastrad 			pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444;
   11025   1.1  riastrad 	}
   11026   1.1  riastrad 
   11027   1.1  riastrad 	pipe_config->gamma_mode = I915_READ(GAMMA_MODE(crtc->pipe));
   11028   1.1  riastrad 
   11029   1.1  riastrad 	pipe_config->csc_mode = I915_READ(PIPE_CSC_MODE(crtc->pipe));
   11030   1.1  riastrad 
   11031   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9) {
   11032   1.1  riastrad 		u32 tmp = I915_READ(SKL_BOTTOM_COLOR(crtc->pipe));
   11033   1.1  riastrad 
   11034   1.1  riastrad 		if (tmp & SKL_BOTTOM_COLOR_GAMMA_ENABLE)
   11035   1.1  riastrad 			pipe_config->gamma_enable = true;
   11036   1.1  riastrad 
   11037   1.1  riastrad 		if (tmp & SKL_BOTTOM_COLOR_CSC_ENABLE)
   11038   1.1  riastrad 			pipe_config->csc_enable = true;
   11039   1.1  riastrad 	} else {
   11040   1.1  riastrad 		i9xx_get_pipe_color_config(pipe_config);
   11041   1.1  riastrad 	}
   11042   1.1  riastrad 
   11043   1.1  riastrad 	intel_color_get_config(pipe_config);
   11044   1.1  riastrad 
   11045   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
   11046   1.1  riastrad 	WARN_ON(power_domain_mask & BIT_ULL(power_domain));
   11047   1.1  riastrad 
   11048   1.1  riastrad 	wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11049   1.1  riastrad 	if (wf) {
   11050   1.1  riastrad 		wakerefs[power_domain] = wf;
   11051   1.1  riastrad 		power_domain_mask |= BIT_ULL(power_domain);
   11052   1.1  riastrad 
   11053   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 9)
   11054   1.1  riastrad 			skl_get_pfit_config(crtc, pipe_config);
   11055   1.1  riastrad 		else
   11056   1.1  riastrad 			ilk_get_pfit_config(crtc, pipe_config);
   11057   1.1  riastrad 	}
   11058   1.1  riastrad 
   11059   1.1  riastrad 	if (hsw_crtc_supports_ips(crtc)) {
   11060   1.1  riastrad 		if (IS_HASWELL(dev_priv))
   11061   1.1  riastrad 			pipe_config->ips_enabled = I915_READ(IPS_CTL) & IPS_ENABLE;
   11062   1.1  riastrad 		else {
   11063   1.1  riastrad 			/*
   11064   1.1  riastrad 			 * We cannot readout IPS state on broadwell, set to
   11065   1.1  riastrad 			 * true so we can set it to a defined state on first
   11066   1.1  riastrad 			 * commit.
   11067   1.1  riastrad 			 */
   11068   1.1  riastrad 			pipe_config->ips_enabled = true;
   11069   1.1  riastrad 		}
   11070   1.1  riastrad 	}
   11071   1.1  riastrad 
   11072   1.1  riastrad 	if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
   11073   1.1  riastrad 	    !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
   11074   1.1  riastrad 		pipe_config->pixel_multiplier =
   11075   1.1  riastrad 			I915_READ(PIPE_MULT(pipe_config->cpu_transcoder)) + 1;
   11076   1.1  riastrad 	} else {
   11077   1.1  riastrad 		pipe_config->pixel_multiplier = 1;
   11078   1.1  riastrad 	}
   11079   1.1  riastrad 
   11080   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 &&
   11081   1.1  riastrad 	    !transcoder_is_dsi(pipe_config->cpu_transcoder))
   11082   1.1  riastrad 		icl_get_trans_port_sync_config(pipe_config);
   11083   1.1  riastrad 
   11084   1.1  riastrad out:
   11085   1.1  riastrad 	for_each_power_domain(power_domain, power_domain_mask)
   11086   1.1  riastrad 		intel_display_power_put(dev_priv,
   11087   1.1  riastrad 					power_domain, wakerefs[power_domain]);
   11088   1.1  riastrad 
   11089   1.1  riastrad 	return active;
   11090   1.1  riastrad }
   11091   1.1  riastrad 
   11092   1.1  riastrad static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
   11093   1.1  riastrad {
   11094   1.1  riastrad 	struct drm_i915_private *dev_priv =
   11095   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   11096   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   11097   1.1  riastrad 	const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   11098   1.1  riastrad 	u32 base;
   11099   1.1  riastrad 
   11100   1.1  riastrad 	if (INTEL_INFO(dev_priv)->display.cursor_needs_physical)
   11101   1.1  riastrad 		base = sg_dma_address(obj->mm.pages->sgl);
   11102   1.1  riastrad 	else
   11103   1.1  riastrad 		base = intel_plane_ggtt_offset(plane_state);
   11104   1.1  riastrad 
   11105   1.1  riastrad 	return base + plane_state->color_plane[0].offset;
   11106   1.1  riastrad }
   11107   1.1  riastrad 
   11108   1.1  riastrad static u32 intel_cursor_position(const struct intel_plane_state *plane_state)
   11109   1.1  riastrad {
   11110   1.1  riastrad 	int x = plane_state->uapi.dst.x1;
   11111   1.1  riastrad 	int y = plane_state->uapi.dst.y1;
   11112   1.1  riastrad 	u32 pos = 0;
   11113   1.1  riastrad 
   11114   1.1  riastrad 	if (x < 0) {
   11115   1.1  riastrad 		pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
   11116   1.1  riastrad 		x = -x;
   11117   1.1  riastrad 	}
   11118   1.1  riastrad 	pos |= x << CURSOR_X_SHIFT;
   11119   1.1  riastrad 
   11120   1.1  riastrad 	if (y < 0) {
   11121   1.1  riastrad 		pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
   11122   1.1  riastrad 		y = -y;
   11123   1.1  riastrad 	}
   11124   1.1  riastrad 	pos |= y << CURSOR_Y_SHIFT;
   11125   1.1  riastrad 
   11126   1.1  riastrad 	return pos;
   11127   1.1  riastrad }
   11128   1.1  riastrad 
   11129   1.1  riastrad static bool intel_cursor_size_ok(const struct intel_plane_state *plane_state)
   11130   1.1  riastrad {
   11131   1.1  riastrad 	const struct drm_mode_config *config =
   11132   1.1  riastrad 		&plane_state->uapi.plane->dev->mode_config;
   11133   1.1  riastrad 	int width = drm_rect_width(&plane_state->uapi.dst);
   11134   1.1  riastrad 	int height = drm_rect_height(&plane_state->uapi.dst);
   11135   1.1  riastrad 
   11136   1.1  riastrad 	return width > 0 && width <= config->cursor_width &&
   11137   1.1  riastrad 		height > 0 && height <= config->cursor_height;
   11138   1.1  riastrad }
   11139   1.1  riastrad 
   11140   1.1  riastrad static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
   11141   1.1  riastrad {
   11142   1.1  riastrad 	struct drm_i915_private *dev_priv =
   11143   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   11144   1.1  riastrad 	unsigned int rotation = plane_state->hw.rotation;
   11145   1.1  riastrad 	int src_x, src_y;
   11146   1.1  riastrad 	u32 offset;
   11147   1.1  riastrad 	int ret;
   11148   1.1  riastrad 
   11149   1.1  riastrad 	ret = intel_plane_compute_gtt(plane_state);
   11150   1.1  riastrad 	if (ret)
   11151   1.1  riastrad 		return ret;
   11152   1.1  riastrad 
   11153   1.1  riastrad 	if (!plane_state->uapi.visible)
   11154   1.1  riastrad 		return 0;
   11155   1.1  riastrad 
   11156   1.1  riastrad 	src_x = plane_state->uapi.src.x1 >> 16;
   11157   1.1  riastrad 	src_y = plane_state->uapi.src.y1 >> 16;
   11158   1.1  riastrad 
   11159   1.1  riastrad 	intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
   11160   1.1  riastrad 	offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
   11161   1.1  riastrad 						    plane_state, 0);
   11162   1.1  riastrad 
   11163   1.1  riastrad 	if (src_x != 0 || src_y != 0) {
   11164   1.1  riastrad 		DRM_DEBUG_KMS("Arbitrary cursor panning not supported\n");
   11165   1.1  riastrad 		return -EINVAL;
   11166   1.1  riastrad 	}
   11167   1.1  riastrad 
   11168   1.1  riastrad 	/*
   11169   1.1  riastrad 	 * Put the final coordinates back so that the src
   11170   1.1  riastrad 	 * coordinate checks will see the right values.
   11171   1.1  riastrad 	 */
   11172   1.1  riastrad 	drm_rect_translate_to(&plane_state->uapi.src,
   11173   1.1  riastrad 			      src_x << 16, src_y << 16);
   11174   1.1  riastrad 
   11175   1.1  riastrad 	/* ILK+ do this automagically in hardware */
   11176   1.1  riastrad 	if (HAS_GMCH(dev_priv) && rotation & DRM_MODE_ROTATE_180) {
   11177   1.1  riastrad 		const struct drm_framebuffer *fb = plane_state->hw.fb;
   11178   1.1  riastrad 		int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
   11179   1.1  riastrad 		int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
   11180   1.1  riastrad 
   11181   1.1  riastrad 		offset += (src_h * src_w - 1) * fb->format->cpp[0];
   11182   1.1  riastrad 	}
   11183   1.1  riastrad 
   11184   1.1  riastrad 	plane_state->color_plane[0].offset = offset;
   11185   1.1  riastrad 	plane_state->color_plane[0].x = src_x;
   11186   1.1  riastrad 	plane_state->color_plane[0].y = src_y;
   11187   1.1  riastrad 
   11188   1.1  riastrad 	return 0;
   11189   1.1  riastrad }
   11190   1.1  riastrad 
   11191   1.1  riastrad static int intel_check_cursor(struct intel_crtc_state *crtc_state,
   11192   1.1  riastrad 			      struct intel_plane_state *plane_state)
   11193   1.1  riastrad {
   11194   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   11195   1.1  riastrad 	int ret;
   11196   1.1  riastrad 
   11197   1.1  riastrad 	if (fb && fb->modifier != DRM_FORMAT_MOD_LINEAR) {
   11198   1.1  riastrad 		DRM_DEBUG_KMS("cursor cannot be tiled\n");
   11199   1.1  riastrad 		return -EINVAL;
   11200   1.1  riastrad 	}
   11201   1.1  riastrad 
   11202   1.1  riastrad 	ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
   11203   1.1  riastrad 						  &crtc_state->uapi,
   11204   1.1  riastrad 						  DRM_PLANE_HELPER_NO_SCALING,
   11205   1.1  riastrad 						  DRM_PLANE_HELPER_NO_SCALING,
   11206   1.1  riastrad 						  true, true);
   11207   1.1  riastrad 	if (ret)
   11208   1.1  riastrad 		return ret;
   11209   1.1  riastrad 
   11210   1.1  riastrad 	/* Use the unclipped src/dst rectangles, which we program to hw */
   11211   1.1  riastrad 	plane_state->uapi.src = drm_plane_state_src(&plane_state->uapi);
   11212   1.1  riastrad 	plane_state->uapi.dst = drm_plane_state_dest(&plane_state->uapi);
   11213   1.1  riastrad 
   11214   1.1  riastrad 	ret = intel_cursor_check_surface(plane_state);
   11215   1.1  riastrad 	if (ret)
   11216   1.1  riastrad 		return ret;
   11217   1.1  riastrad 
   11218   1.1  riastrad 	if (!plane_state->uapi.visible)
   11219   1.1  riastrad 		return 0;
   11220   1.1  riastrad 
   11221   1.1  riastrad 	ret = intel_plane_check_src_coordinates(plane_state);
   11222   1.1  riastrad 	if (ret)
   11223   1.1  riastrad 		return ret;
   11224   1.1  riastrad 
   11225   1.1  riastrad 	return 0;
   11226   1.1  riastrad }
   11227   1.1  riastrad 
   11228   1.1  riastrad static unsigned int
   11229   1.1  riastrad i845_cursor_max_stride(struct intel_plane *plane,
   11230   1.1  riastrad 		       u32 pixel_format, u64 modifier,
   11231   1.1  riastrad 		       unsigned int rotation)
   11232   1.1  riastrad {
   11233   1.1  riastrad 	return 2048;
   11234   1.1  riastrad }
   11235   1.1  riastrad 
   11236   1.1  riastrad static u32 i845_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
   11237   1.1  riastrad {
   11238   1.1  riastrad 	u32 cntl = 0;
   11239   1.1  riastrad 
   11240   1.1  riastrad 	if (crtc_state->gamma_enable)
   11241   1.1  riastrad 		cntl |= CURSOR_GAMMA_ENABLE;
   11242   1.1  riastrad 
   11243   1.1  riastrad 	return cntl;
   11244   1.1  riastrad }
   11245   1.1  riastrad 
   11246   1.1  riastrad static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
   11247   1.1  riastrad 			   const struct intel_plane_state *plane_state)
   11248   1.1  riastrad {
   11249   1.1  riastrad 	return CURSOR_ENABLE |
   11250   1.1  riastrad 		CURSOR_FORMAT_ARGB |
   11251   1.1  riastrad 		CURSOR_STRIDE(plane_state->color_plane[0].stride);
   11252   1.1  riastrad }
   11253   1.1  riastrad 
   11254   1.1  riastrad static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
   11255   1.1  riastrad {
   11256   1.1  riastrad 	int width = drm_rect_width(&plane_state->uapi.dst);
   11257   1.1  riastrad 
   11258   1.1  riastrad 	/*
   11259   1.1  riastrad 	 * 845g/865g are only limited by the width of their cursors,
   11260   1.1  riastrad 	 * the height is arbitrary up to the precision of the register.
   11261   1.1  riastrad 	 */
   11262   1.1  riastrad 	return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);
   11263   1.1  riastrad }
   11264   1.1  riastrad 
   11265   1.1  riastrad static int i845_check_cursor(struct intel_crtc_state *crtc_state,
   11266   1.1  riastrad 			     struct intel_plane_state *plane_state)
   11267   1.1  riastrad {
   11268   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   11269   1.1  riastrad 	int ret;
   11270   1.1  riastrad 
   11271   1.1  riastrad 	ret = intel_check_cursor(crtc_state, plane_state);
   11272   1.1  riastrad 	if (ret)
   11273   1.1  riastrad 		return ret;
   11274   1.1  riastrad 
   11275   1.1  riastrad 	/* if we want to turn off the cursor ignore width and height */
   11276   1.1  riastrad 	if (!fb)
   11277   1.1  riastrad 		return 0;
   11278   1.1  riastrad 
   11279   1.1  riastrad 	/* Check for which cursor types we support */
   11280   1.1  riastrad 	if (!i845_cursor_size_ok(plane_state)) {
   11281   1.1  riastrad 		DRM_DEBUG("Cursor dimension %dx%d not supported\n",
   11282   1.1  riastrad 			  drm_rect_width(&plane_state->uapi.dst),
   11283   1.1  riastrad 			  drm_rect_height(&plane_state->uapi.dst));
   11284   1.1  riastrad 		return -EINVAL;
   11285   1.1  riastrad 	}
   11286   1.1  riastrad 
   11287   1.1  riastrad 	WARN_ON(plane_state->uapi.visible &&
   11288   1.1  riastrad 		plane_state->color_plane[0].stride != fb->pitches[0]);
   11289   1.1  riastrad 
   11290   1.1  riastrad 	switch (fb->pitches[0]) {
   11291   1.1  riastrad 	case 256:
   11292   1.1  riastrad 	case 512:
   11293   1.1  riastrad 	case 1024:
   11294   1.1  riastrad 	case 2048:
   11295   1.1  riastrad 		break;
   11296   1.1  riastrad 	default:
   11297   1.1  riastrad 		DRM_DEBUG_KMS("Invalid cursor stride (%u)\n",
   11298   1.1  riastrad 			      fb->pitches[0]);
   11299   1.1  riastrad 		return -EINVAL;
   11300   1.1  riastrad 	}
   11301   1.1  riastrad 
   11302   1.1  riastrad 	plane_state->ctl = i845_cursor_ctl(crtc_state, plane_state);
   11303   1.1  riastrad 
   11304   1.1  riastrad 	return 0;
   11305   1.1  riastrad }
   11306   1.1  riastrad 
   11307   1.1  riastrad static void i845_update_cursor(struct intel_plane *plane,
   11308   1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   11309   1.1  riastrad 			       const struct intel_plane_state *plane_state)
   11310   1.1  riastrad {
   11311   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11312   1.1  riastrad 	u32 cntl = 0, base = 0, pos = 0, size = 0;
   11313   1.1  riastrad 	unsigned long irqflags;
   11314   1.1  riastrad 
   11315   1.1  riastrad 	if (plane_state && plane_state->uapi.visible) {
   11316   1.1  riastrad 		unsigned int width = drm_rect_width(&plane_state->uapi.dst);
   11317   1.1  riastrad 		unsigned int height = drm_rect_height(&plane_state->uapi.dst);
   11318   1.1  riastrad 
   11319   1.1  riastrad 		cntl = plane_state->ctl |
   11320   1.1  riastrad 			i845_cursor_ctl_crtc(crtc_state);
   11321   1.1  riastrad 
   11322   1.1  riastrad 		size = (height << 12) | width;
   11323   1.1  riastrad 
   11324   1.1  riastrad 		base = intel_cursor_base(plane_state);
   11325   1.1  riastrad 		pos = intel_cursor_position(plane_state);
   11326   1.1  riastrad 	}
   11327   1.1  riastrad 
   11328   1.1  riastrad 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   11329   1.1  riastrad 
   11330   1.1  riastrad 	/* On these chipsets we can only modify the base/size/stride
   11331   1.1  riastrad 	 * whilst the cursor is disabled.
   11332   1.1  riastrad 	 */
   11333   1.1  riastrad 	if (plane->cursor.base != base ||
   11334   1.1  riastrad 	    plane->cursor.size != size ||
   11335   1.1  riastrad 	    plane->cursor.cntl != cntl) {
   11336   1.1  riastrad 		I915_WRITE_FW(CURCNTR(PIPE_A), 0);
   11337   1.1  riastrad 		I915_WRITE_FW(CURBASE(PIPE_A), base);
   11338   1.1  riastrad 		I915_WRITE_FW(CURSIZE, size);
   11339   1.1  riastrad 		I915_WRITE_FW(CURPOS(PIPE_A), pos);
   11340   1.1  riastrad 		I915_WRITE_FW(CURCNTR(PIPE_A), cntl);
   11341   1.1  riastrad 
   11342   1.1  riastrad 		plane->cursor.base = base;
   11343   1.1  riastrad 		plane->cursor.size = size;
   11344   1.1  riastrad 		plane->cursor.cntl = cntl;
   11345   1.1  riastrad 	} else {
   11346   1.1  riastrad 		I915_WRITE_FW(CURPOS(PIPE_A), pos);
   11347   1.1  riastrad 	}
   11348   1.1  riastrad 
   11349   1.1  riastrad 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   11350   1.1  riastrad }
   11351   1.1  riastrad 
   11352   1.1  riastrad static void i845_disable_cursor(struct intel_plane *plane,
   11353   1.1  riastrad 				const struct intel_crtc_state *crtc_state)
   11354   1.1  riastrad {
   11355   1.1  riastrad 	i845_update_cursor(plane, crtc_state, NULL);
   11356   1.1  riastrad }
   11357   1.1  riastrad 
   11358   1.1  riastrad static bool i845_cursor_get_hw_state(struct intel_plane *plane,
   11359   1.1  riastrad 				     enum pipe *pipe)
   11360   1.1  riastrad {
   11361   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11362   1.1  riastrad 	enum intel_display_power_domain power_domain;
   11363   1.1  riastrad 	intel_wakeref_t wakeref;
   11364   1.1  riastrad 	bool ret;
   11365   1.1  riastrad 
   11366   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(PIPE_A);
   11367   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11368   1.1  riastrad 	if (!wakeref)
   11369   1.1  riastrad 		return false;
   11370   1.1  riastrad 
   11371   1.1  riastrad 	ret = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE;
   11372   1.1  riastrad 
   11373   1.1  riastrad 	*pipe = PIPE_A;
   11374   1.1  riastrad 
   11375   1.1  riastrad 	intel_display_power_put(dev_priv, power_domain, wakeref);
   11376   1.1  riastrad 
   11377   1.1  riastrad 	return ret;
   11378   1.1  riastrad }
   11379   1.1  riastrad 
   11380   1.1  riastrad static unsigned int
   11381   1.1  riastrad i9xx_cursor_max_stride(struct intel_plane *plane,
   11382   1.1  riastrad 		       u32 pixel_format, u64 modifier,
   11383   1.1  riastrad 		       unsigned int rotation)
   11384   1.1  riastrad {
   11385   1.1  riastrad 	return plane->base.dev->mode_config.cursor_width * 4;
   11386   1.1  riastrad }
   11387   1.1  riastrad 
   11388   1.1  riastrad static u32 i9xx_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
   11389   1.1  riastrad {
   11390   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   11391   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   11392   1.1  riastrad 	u32 cntl = 0;
   11393   1.1  riastrad 
   11394   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   11395   1.1  riastrad 		return cntl;
   11396   1.1  riastrad 
   11397   1.1  riastrad 	if (crtc_state->gamma_enable)
   11398   1.1  riastrad 		cntl = MCURSOR_GAMMA_ENABLE;
   11399   1.1  riastrad 
   11400   1.1  riastrad 	if (crtc_state->csc_enable)
   11401   1.1  riastrad 		cntl |= MCURSOR_PIPE_CSC_ENABLE;
   11402   1.1  riastrad 
   11403   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
   11404   1.1  riastrad 		cntl |= MCURSOR_PIPE_SELECT(crtc->pipe);
   11405   1.1  riastrad 
   11406   1.1  riastrad 	return cntl;
   11407   1.1  riastrad }
   11408   1.1  riastrad 
   11409   1.1  riastrad static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
   11410   1.1  riastrad 			   const struct intel_plane_state *plane_state)
   11411   1.1  riastrad {
   11412   1.1  riastrad 	struct drm_i915_private *dev_priv =
   11413   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   11414   1.1  riastrad 	u32 cntl = 0;
   11415   1.1  riastrad 
   11416   1.1  riastrad 	if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
   11417   1.1  riastrad 		cntl |= MCURSOR_TRICKLE_FEED_DISABLE;
   11418   1.1  riastrad 
   11419   1.1  riastrad 	switch (drm_rect_width(&plane_state->uapi.dst)) {
   11420   1.1  riastrad 	case 64:
   11421   1.1  riastrad 		cntl |= MCURSOR_MODE_64_ARGB_AX;
   11422   1.1  riastrad 		break;
   11423   1.1  riastrad 	case 128:
   11424   1.1  riastrad 		cntl |= MCURSOR_MODE_128_ARGB_AX;
   11425   1.1  riastrad 		break;
   11426   1.1  riastrad 	case 256:
   11427   1.1  riastrad 		cntl |= MCURSOR_MODE_256_ARGB_AX;
   11428   1.1  riastrad 		break;
   11429   1.1  riastrad 	default:
   11430   1.1  riastrad 		MISSING_CASE(drm_rect_width(&plane_state->uapi.dst));
   11431   1.1  riastrad 		return 0;
   11432   1.1  riastrad 	}
   11433   1.1  riastrad 
   11434   1.1  riastrad 	if (plane_state->hw.rotation & DRM_MODE_ROTATE_180)
   11435   1.1  riastrad 		cntl |= MCURSOR_ROTATE_180;
   11436   1.1  riastrad 
   11437   1.1  riastrad 	return cntl;
   11438   1.1  riastrad }
   11439   1.1  riastrad 
   11440   1.1  riastrad static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
   11441   1.1  riastrad {
   11442   1.1  riastrad 	struct drm_i915_private *dev_priv =
   11443   1.1  riastrad 		to_i915(plane_state->uapi.plane->dev);
   11444   1.1  riastrad 	int width = drm_rect_width(&plane_state->uapi.dst);
   11445   1.1  riastrad 	int height = drm_rect_height(&plane_state->uapi.dst);
   11446   1.1  riastrad 
   11447   1.1  riastrad 	if (!intel_cursor_size_ok(plane_state))
   11448   1.1  riastrad 		return false;
   11449   1.1  riastrad 
   11450   1.1  riastrad 	/* Cursor width is limited to a few power-of-two sizes */
   11451   1.1  riastrad 	switch (width) {
   11452   1.1  riastrad 	case 256:
   11453   1.1  riastrad 	case 128:
   11454   1.1  riastrad 	case 64:
   11455   1.1  riastrad 		break;
   11456   1.1  riastrad 	default:
   11457   1.1  riastrad 		return false;
   11458   1.1  riastrad 	}
   11459   1.1  riastrad 
   11460   1.1  riastrad 	/*
   11461   1.1  riastrad 	 * IVB+ have CUR_FBC_CTL which allows an arbitrary cursor
   11462   1.1  riastrad 	 * height from 8 lines up to the cursor width, when the
   11463   1.1  riastrad 	 * cursor is not rotated. Everything else requires square
   11464   1.1  riastrad 	 * cursors.
   11465   1.1  riastrad 	 */
   11466   1.1  riastrad 	if (HAS_CUR_FBC(dev_priv) &&
   11467   1.1  riastrad 	    plane_state->hw.rotation & DRM_MODE_ROTATE_0) {
   11468   1.1  riastrad 		if (height < 8 || height > width)
   11469   1.1  riastrad 			return false;
   11470   1.1  riastrad 	} else {
   11471   1.1  riastrad 		if (height != width)
   11472   1.1  riastrad 			return false;
   11473   1.1  riastrad 	}
   11474   1.1  riastrad 
   11475   1.1  riastrad 	return true;
   11476   1.1  riastrad }
   11477   1.1  riastrad 
   11478   1.1  riastrad static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
   11479   1.1  riastrad 			     struct intel_plane_state *plane_state)
   11480   1.1  riastrad {
   11481   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   11482   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11483   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   11484   1.1  riastrad 	enum pipe pipe = plane->pipe;
   11485   1.1  riastrad 	int ret;
   11486   1.1  riastrad 
   11487   1.1  riastrad 	ret = intel_check_cursor(crtc_state, plane_state);
   11488   1.1  riastrad 	if (ret)
   11489   1.1  riastrad 		return ret;
   11490   1.1  riastrad 
   11491   1.1  riastrad 	/* if we want to turn off the cursor ignore width and height */
   11492   1.1  riastrad 	if (!fb)
   11493   1.1  riastrad 		return 0;
   11494   1.1  riastrad 
   11495   1.1  riastrad 	/* Check for which cursor types we support */
   11496   1.1  riastrad 	if (!i9xx_cursor_size_ok(plane_state)) {
   11497   1.1  riastrad 		DRM_DEBUG("Cursor dimension %dx%d not supported\n",
   11498   1.1  riastrad 			  drm_rect_width(&plane_state->uapi.dst),
   11499   1.1  riastrad 			  drm_rect_height(&plane_state->uapi.dst));
   11500   1.1  riastrad 		return -EINVAL;
   11501   1.1  riastrad 	}
   11502   1.1  riastrad 
   11503   1.1  riastrad 	WARN_ON(plane_state->uapi.visible &&
   11504   1.1  riastrad 		plane_state->color_plane[0].stride != fb->pitches[0]);
   11505   1.1  riastrad 
   11506   1.1  riastrad 	if (fb->pitches[0] !=
   11507   1.1  riastrad 	    drm_rect_width(&plane_state->uapi.dst) * fb->format->cpp[0]) {
   11508   1.1  riastrad 		DRM_DEBUG_KMS("Invalid cursor stride (%u) (cursor width %d)\n",
   11509   1.1  riastrad 			      fb->pitches[0],
   11510   1.1  riastrad 			      drm_rect_width(&plane_state->uapi.dst));
   11511   1.1  riastrad 		return -EINVAL;
   11512   1.1  riastrad 	}
   11513   1.1  riastrad 
   11514   1.1  riastrad 	/*
   11515   1.1  riastrad 	 * There's something wrong with the cursor on CHV pipe C.
   11516   1.1  riastrad 	 * If it straddles the left edge of the screen then
   11517   1.1  riastrad 	 * moving it away from the edge or disabling it often
   11518   1.1  riastrad 	 * results in a pipe underrun, and often that can lead to
   11519   1.1  riastrad 	 * dead pipe (constant underrun reported, and it scans
   11520   1.1  riastrad 	 * out just a solid color). To recover from that, the
   11521   1.1  riastrad 	 * display power well must be turned off and on again.
   11522   1.1  riastrad 	 * Refuse the put the cursor into that compromised position.
   11523   1.1  riastrad 	 */
   11524   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_C &&
   11525   1.1  riastrad 	    plane_state->uapi.visible && plane_state->uapi.dst.x1 < 0) {
   11526   1.1  riastrad 		DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n");
   11527   1.1  riastrad 		return -EINVAL;
   11528   1.1  riastrad 	}
   11529   1.1  riastrad 
   11530   1.1  riastrad 	plane_state->ctl = i9xx_cursor_ctl(crtc_state, plane_state);
   11531   1.1  riastrad 
   11532   1.1  riastrad 	return 0;
   11533   1.1  riastrad }
   11534   1.1  riastrad 
   11535   1.1  riastrad static void i9xx_update_cursor(struct intel_plane *plane,
   11536   1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   11537   1.1  riastrad 			       const struct intel_plane_state *plane_state)
   11538   1.1  riastrad {
   11539   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11540   1.1  riastrad 	enum pipe pipe = plane->pipe;
   11541   1.1  riastrad 	u32 cntl = 0, base = 0, pos = 0, fbc_ctl = 0;
   11542   1.1  riastrad 	unsigned long irqflags;
   11543   1.1  riastrad 
   11544   1.1  riastrad 	if (plane_state && plane_state->uapi.visible) {
   11545   1.1  riastrad 		unsigned width = drm_rect_width(&plane_state->uapi.dst);
   11546   1.1  riastrad 		unsigned height = drm_rect_height(&plane_state->uapi.dst);
   11547   1.1  riastrad 
   11548   1.1  riastrad 		cntl = plane_state->ctl |
   11549   1.1  riastrad 			i9xx_cursor_ctl_crtc(crtc_state);
   11550   1.1  riastrad 
   11551   1.1  riastrad 		if (width != height)
   11552   1.1  riastrad 			fbc_ctl = CUR_FBC_CTL_EN | (height - 1);
   11553   1.1  riastrad 
   11554   1.1  riastrad 		base = intel_cursor_base(plane_state);
   11555   1.1  riastrad 		pos = intel_cursor_position(plane_state);
   11556   1.1  riastrad 	}
   11557   1.1  riastrad 
   11558   1.1  riastrad 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
   11559   1.1  riastrad 
   11560   1.1  riastrad 	/*
   11561   1.1  riastrad 	 * On some platforms writing CURCNTR first will also
   11562   1.1  riastrad 	 * cause CURPOS to be armed by the CURBASE write.
   11563   1.1  riastrad 	 * Without the CURCNTR write the CURPOS write would
   11564   1.1  riastrad 	 * arm itself. Thus we always update CURCNTR before
   11565   1.1  riastrad 	 * CURPOS.
   11566   1.1  riastrad 	 *
   11567   1.1  riastrad 	 * On other platforms CURPOS always requires the
   11568   1.1  riastrad 	 * CURBASE write to arm the update. Additonally
   11569   1.1  riastrad 	 * a write to any of the cursor register will cancel
   11570   1.1  riastrad 	 * an already armed cursor update. Thus leaving out
   11571   1.1  riastrad 	 * the CURBASE write after CURPOS could lead to a
   11572   1.1  riastrad 	 * cursor that doesn't appear to move, or even change
   11573   1.1  riastrad 	 * shape. Thus we always write CURBASE.
   11574   1.1  riastrad 	 *
   11575   1.1  riastrad 	 * The other registers are armed by by the CURBASE write
   11576   1.1  riastrad 	 * except when the plane is getting enabled at which time
   11577   1.1  riastrad 	 * the CURCNTR write arms the update.
   11578   1.1  riastrad 	 */
   11579   1.1  riastrad 
   11580   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   11581   1.1  riastrad 		skl_write_cursor_wm(plane, crtc_state);
   11582   1.1  riastrad 
   11583   1.1  riastrad 	if (plane->cursor.base != base ||
   11584   1.1  riastrad 	    plane->cursor.size != fbc_ctl ||
   11585   1.1  riastrad 	    plane->cursor.cntl != cntl) {
   11586   1.1  riastrad 		if (HAS_CUR_FBC(dev_priv))
   11587   1.1  riastrad 			I915_WRITE_FW(CUR_FBC_CTL(pipe), fbc_ctl);
   11588   1.1  riastrad 		I915_WRITE_FW(CURCNTR(pipe), cntl);
   11589   1.1  riastrad 		I915_WRITE_FW(CURPOS(pipe), pos);
   11590   1.1  riastrad 		I915_WRITE_FW(CURBASE(pipe), base);
   11591   1.1  riastrad 
   11592   1.1  riastrad 		plane->cursor.base = base;
   11593   1.1  riastrad 		plane->cursor.size = fbc_ctl;
   11594   1.1  riastrad 		plane->cursor.cntl = cntl;
   11595   1.1  riastrad 	} else {
   11596   1.1  riastrad 		I915_WRITE_FW(CURPOS(pipe), pos);
   11597   1.1  riastrad 		I915_WRITE_FW(CURBASE(pipe), base);
   11598   1.1  riastrad 	}
   11599   1.1  riastrad 
   11600   1.1  riastrad 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
   11601   1.1  riastrad }
   11602   1.1  riastrad 
   11603   1.1  riastrad static void i9xx_disable_cursor(struct intel_plane *plane,
   11604   1.1  riastrad 				const struct intel_crtc_state *crtc_state)
   11605   1.1  riastrad {
   11606   1.1  riastrad 	i9xx_update_cursor(plane, crtc_state, NULL);
   11607   1.1  riastrad }
   11608   1.1  riastrad 
   11609   1.1  riastrad static bool i9xx_cursor_get_hw_state(struct intel_plane *plane,
   11610   1.1  riastrad 				     enum pipe *pipe)
   11611   1.1  riastrad {
   11612   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   11613   1.1  riastrad 	enum intel_display_power_domain power_domain;
   11614   1.1  riastrad 	intel_wakeref_t wakeref;
   11615   1.1  riastrad 	bool ret;
   11616   1.1  riastrad 	u32 val;
   11617   1.1  riastrad 
   11618   1.1  riastrad 	/*
   11619   1.1  riastrad 	 * Not 100% correct for planes that can move between pipes,
   11620   1.1  riastrad 	 * but that's only the case for gen2-3 which don't have any
   11621   1.1  riastrad 	 * display power wells.
   11622   1.1  riastrad 	 */
   11623   1.1  riastrad 	power_domain = POWER_DOMAIN_PIPE(plane->pipe);
   11624   1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
   11625   1.1  riastrad 	if (!wakeref)
   11626   1.1  riastrad 		return false;
   11627   1.1  riastrad 
   11628   1.1  riastrad 	val = I915_READ(CURCNTR(plane->pipe));
   11629   1.1  riastrad 
   11630   1.1  riastrad 	ret = val & MCURSOR_MODE;
   11631   1.1  riastrad 
   11632   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
   11633   1.1  riastrad 		*pipe = plane->pipe;
   11634   1.1  riastrad 	else
   11635   1.1  riastrad 		*pipe = (val & MCURSOR_PIPE_SELECT_MASK) >>
   11636   1.1  riastrad 			MCURSOR_PIPE_SELECT_SHIFT;
   11637   1.1  riastrad 
   11638   1.1  riastrad 	intel_display_power_put(dev_priv, power_domain, wakeref);
   11639   1.1  riastrad 
   11640   1.1  riastrad 	return ret;
   11641   1.1  riastrad }
   11642   1.1  riastrad 
   11643   1.1  riastrad /* VESA 640x480x72Hz mode to set on the pipe */
   11644   1.1  riastrad static const struct drm_display_mode load_detect_mode = {
   11645   1.1  riastrad 	DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664,
   11646   1.1  riastrad 		 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
   11647   1.1  riastrad };
   11648   1.1  riastrad 
   11649   1.1  riastrad struct drm_framebuffer *
   11650   1.1  riastrad intel_framebuffer_create(struct drm_i915_gem_object *obj,
   11651   1.1  riastrad 			 struct drm_mode_fb_cmd2 *mode_cmd)
   11652   1.1  riastrad {
   11653   1.1  riastrad 	struct intel_framebuffer *intel_fb;
   11654   1.1  riastrad 	int ret;
   11655   1.1  riastrad 
   11656   1.1  riastrad 	intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
   11657   1.1  riastrad 	if (!intel_fb)
   11658   1.1  riastrad 		return ERR_PTR(-ENOMEM);
   11659   1.1  riastrad 
   11660   1.1  riastrad 	ret = intel_framebuffer_init(intel_fb, obj, mode_cmd);
   11661   1.1  riastrad 	if (ret)
   11662   1.1  riastrad 		goto err;
   11663   1.1  riastrad 
   11664   1.1  riastrad 	return &intel_fb->base;
   11665   1.1  riastrad 
   11666   1.1  riastrad err:
   11667   1.1  riastrad 	kfree(intel_fb);
   11668   1.1  riastrad 	return ERR_PTR(ret);
   11669   1.1  riastrad }
   11670   1.1  riastrad 
   11671   1.1  riastrad static int intel_modeset_disable_planes(struct drm_atomic_state *state,
   11672   1.1  riastrad 					struct drm_crtc *crtc)
   11673   1.1  riastrad {
   11674   1.1  riastrad 	struct drm_plane *plane;
   11675   1.1  riastrad 	struct drm_plane_state *plane_state;
   11676   1.1  riastrad 	int ret, i;
   11677   1.1  riastrad 
   11678   1.1  riastrad 	ret = drm_atomic_add_affected_planes(state, crtc);
   11679   1.1  riastrad 	if (ret)
   11680   1.1  riastrad 		return ret;
   11681   1.1  riastrad 
   11682   1.1  riastrad 	for_each_new_plane_in_state(state, plane, plane_state, i) {
   11683   1.1  riastrad 		if (plane_state->crtc != crtc)
   11684   1.1  riastrad 			continue;
   11685   1.1  riastrad 
   11686   1.1  riastrad 		ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
   11687   1.1  riastrad 		if (ret)
   11688   1.1  riastrad 			return ret;
   11689   1.1  riastrad 
   11690   1.1  riastrad 		drm_atomic_set_fb_for_plane(plane_state, NULL);
   11691   1.1  riastrad 	}
   11692   1.1  riastrad 
   11693   1.1  riastrad 	return 0;
   11694   1.1  riastrad }
   11695   1.1  riastrad 
   11696   1.1  riastrad int intel_get_load_detect_pipe(struct drm_connector *connector,
   11697   1.1  riastrad 			       struct intel_load_detect_pipe *old,
   11698   1.1  riastrad 			       struct drm_modeset_acquire_ctx *ctx)
   11699   1.1  riastrad {
   11700   1.1  riastrad 	struct intel_crtc *intel_crtc;
   11701   1.1  riastrad 	struct intel_encoder *intel_encoder =
   11702   1.1  riastrad 		intel_attached_encoder(to_intel_connector(connector));
   11703   1.1  riastrad 	struct drm_crtc *possible_crtc;
   11704   1.1  riastrad 	struct drm_encoder *encoder = &intel_encoder->base;
   11705   1.1  riastrad 	struct drm_crtc *crtc = NULL;
   11706   1.1  riastrad 	struct drm_device *dev = encoder->dev;
   11707   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   11708   1.1  riastrad 	struct drm_mode_config *config = &dev->mode_config;
   11709   1.1  riastrad 	struct drm_atomic_state *state = NULL, *restore_state = NULL;
   11710   1.1  riastrad 	struct drm_connector_state *connector_state;
   11711   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   11712   1.1  riastrad 	int ret, i = -1;
   11713   1.1  riastrad 
   11714   1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
   11715   1.1  riastrad 		      connector->base.id, connector->name,
   11716   1.1  riastrad 		      encoder->base.id, encoder->name);
   11717   1.1  riastrad 
   11718   1.1  riastrad 	old->restore_state = NULL;
   11719   1.1  riastrad 
   11720   1.1  riastrad 	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
   11721   1.1  riastrad 
   11722   1.1  riastrad 	/*
   11723   1.1  riastrad 	 * Algorithm gets a little messy:
   11724   1.1  riastrad 	 *
   11725   1.1  riastrad 	 *   - if the connector already has an assigned crtc, use it (but make
   11726   1.1  riastrad 	 *     sure it's on first)
   11727   1.1  riastrad 	 *
   11728   1.1  riastrad 	 *   - try to find the first unused crtc that can drive this connector,
   11729   1.1  riastrad 	 *     and use that if we find one
   11730   1.1  riastrad 	 */
   11731   1.1  riastrad 
   11732   1.1  riastrad 	/* See if we already have a CRTC for this connector */
   11733   1.1  riastrad 	if (connector->state->crtc) {
   11734   1.1  riastrad 		crtc = connector->state->crtc;
   11735   1.1  riastrad 
   11736   1.1  riastrad 		ret = drm_modeset_lock(&crtc->mutex, ctx);
   11737   1.1  riastrad 		if (ret)
   11738   1.1  riastrad 			goto fail;
   11739   1.1  riastrad 
   11740   1.1  riastrad 		/* Make sure the crtc and connector are running */
   11741   1.1  riastrad 		goto found;
   11742   1.1  riastrad 	}
   11743   1.1  riastrad 
   11744   1.1  riastrad 	/* Find an unused one (if possible) */
   11745   1.1  riastrad 	for_each_crtc(dev, possible_crtc) {
   11746   1.1  riastrad 		i++;
   11747   1.1  riastrad 		if (!(encoder->possible_crtcs & (1 << i)))
   11748   1.1  riastrad 			continue;
   11749   1.1  riastrad 
   11750   1.1  riastrad 		ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
   11751   1.1  riastrad 		if (ret)
   11752   1.1  riastrad 			goto fail;
   11753   1.1  riastrad 
   11754   1.1  riastrad 		if (possible_crtc->state->enable) {
   11755   1.1  riastrad 			drm_modeset_unlock(&possible_crtc->mutex);
   11756   1.1  riastrad 			continue;
   11757   1.1  riastrad 		}
   11758   1.1  riastrad 
   11759   1.1  riastrad 		crtc = possible_crtc;
   11760   1.1  riastrad 		break;
   11761   1.1  riastrad 	}
   11762   1.1  riastrad 
   11763   1.1  riastrad 	/*
   11764   1.1  riastrad 	 * If we didn't find an unused CRTC, don't use any.
   11765   1.1  riastrad 	 */
   11766   1.1  riastrad 	if (!crtc) {
   11767   1.1  riastrad 		DRM_DEBUG_KMS("no pipe available for load-detect\n");
   11768   1.1  riastrad 		ret = -ENODEV;
   11769   1.1  riastrad 		goto fail;
   11770   1.1  riastrad 	}
   11771   1.1  riastrad 
   11772   1.1  riastrad found:
   11773   1.1  riastrad 	intel_crtc = to_intel_crtc(crtc);
   11774   1.1  riastrad 
   11775   1.1  riastrad 	state = drm_atomic_state_alloc(dev);
   11776   1.1  riastrad 	restore_state = drm_atomic_state_alloc(dev);
   11777   1.1  riastrad 	if (!state || !restore_state) {
   11778   1.1  riastrad 		ret = -ENOMEM;
   11779   1.1  riastrad 		goto fail;
   11780   1.1  riastrad 	}
   11781   1.1  riastrad 
   11782   1.1  riastrad 	state->acquire_ctx = ctx;
   11783   1.1  riastrad 	restore_state->acquire_ctx = ctx;
   11784   1.1  riastrad 
   11785   1.1  riastrad 	connector_state = drm_atomic_get_connector_state(state, connector);
   11786   1.1  riastrad 	if (IS_ERR(connector_state)) {
   11787   1.1  riastrad 		ret = PTR_ERR(connector_state);
   11788   1.1  riastrad 		goto fail;
   11789   1.1  riastrad 	}
   11790   1.1  riastrad 
   11791   1.1  riastrad 	ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
   11792   1.1  riastrad 	if (ret)
   11793   1.1  riastrad 		goto fail;
   11794   1.1  riastrad 
   11795   1.1  riastrad 	crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
   11796   1.1  riastrad 	if (IS_ERR(crtc_state)) {
   11797   1.1  riastrad 		ret = PTR_ERR(crtc_state);
   11798   1.1  riastrad 		goto fail;
   11799   1.1  riastrad 	}
   11800   1.1  riastrad 
   11801   1.1  riastrad 	crtc_state->uapi.active = true;
   11802   1.1  riastrad 
   11803   1.1  riastrad 	ret = drm_atomic_set_mode_for_crtc(&crtc_state->uapi,
   11804   1.1  riastrad 					   &load_detect_mode);
   11805   1.1  riastrad 	if (ret)
   11806   1.1  riastrad 		goto fail;
   11807   1.1  riastrad 
   11808   1.1  riastrad 	ret = intel_modeset_disable_planes(state, crtc);
   11809   1.1  riastrad 	if (ret)
   11810   1.1  riastrad 		goto fail;
   11811   1.1  riastrad 
   11812   1.1  riastrad 	ret = PTR_ERR_OR_ZERO(drm_atomic_get_connector_state(restore_state, connector));
   11813   1.1  riastrad 	if (!ret)
   11814   1.1  riastrad 		ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, crtc));
   11815   1.1  riastrad 	if (!ret)
   11816   1.1  riastrad 		ret = drm_atomic_add_affected_planes(restore_state, crtc);
   11817   1.1  riastrad 	if (ret) {
   11818   1.1  riastrad 		DRM_DEBUG_KMS("Failed to create a copy of old state to restore: %i\n", ret);
   11819   1.1  riastrad 		goto fail;
   11820   1.1  riastrad 	}
   11821   1.1  riastrad 
   11822   1.1  riastrad 	ret = drm_atomic_commit(state);
   11823   1.1  riastrad 	if (ret) {
   11824   1.1  riastrad 		DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
   11825   1.1  riastrad 		goto fail;
   11826   1.1  riastrad 	}
   11827   1.1  riastrad 
   11828   1.1  riastrad 	old->restore_state = restore_state;
   11829   1.1  riastrad 	drm_atomic_state_put(state);
   11830   1.1  riastrad 
   11831   1.1  riastrad 	/* let the connector get through one full cycle before testing */
   11832   1.1  riastrad 	intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
   11833   1.1  riastrad 	return true;
   11834   1.1  riastrad 
   11835   1.1  riastrad fail:
   11836   1.1  riastrad 	if (state) {
   11837   1.1  riastrad 		drm_atomic_state_put(state);
   11838   1.1  riastrad 		state = NULL;
   11839   1.1  riastrad 	}
   11840   1.1  riastrad 	if (restore_state) {
   11841   1.1  riastrad 		drm_atomic_state_put(restore_state);
   11842   1.1  riastrad 		restore_state = NULL;
   11843   1.1  riastrad 	}
   11844   1.1  riastrad 
   11845   1.1  riastrad 	if (ret == -EDEADLK)
   11846   1.1  riastrad 		return ret;
   11847   1.1  riastrad 
   11848   1.1  riastrad 	return false;
   11849   1.1  riastrad }
   11850   1.1  riastrad 
   11851   1.1  riastrad void intel_release_load_detect_pipe(struct drm_connector *connector,
   11852   1.1  riastrad 				    struct intel_load_detect_pipe *old,
   11853   1.1  riastrad 				    struct drm_modeset_acquire_ctx *ctx)
   11854   1.1  riastrad {
   11855   1.1  riastrad 	struct intel_encoder *intel_encoder =
   11856   1.1  riastrad 		intel_attached_encoder(to_intel_connector(connector));
   11857   1.1  riastrad 	struct drm_encoder *encoder = &intel_encoder->base;
   11858   1.1  riastrad 	struct drm_atomic_state *state = old->restore_state;
   11859   1.1  riastrad 	int ret;
   11860   1.1  riastrad 
   11861   1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
   11862   1.1  riastrad 		      connector->base.id, connector->name,
   11863   1.1  riastrad 		      encoder->base.id, encoder->name);
   11864   1.1  riastrad 
   11865   1.1  riastrad 	if (!state)
   11866   1.1  riastrad 		return;
   11867   1.1  riastrad 
   11868   1.1  riastrad 	ret = drm_atomic_helper_commit_duplicated_state(state, ctx);
   11869   1.1  riastrad 	if (ret)
   11870   1.1  riastrad 		DRM_DEBUG_KMS("Couldn't release load detect pipe: %i\n", ret);
   11871   1.1  riastrad 	drm_atomic_state_put(state);
   11872   1.1  riastrad }
   11873   1.1  riastrad 
   11874   1.1  riastrad static int i9xx_pll_refclk(struct drm_device *dev,
   11875   1.1  riastrad 			   const struct intel_crtc_state *pipe_config)
   11876   1.1  riastrad {
   11877   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   11878   1.1  riastrad 	u32 dpll = pipe_config->dpll_hw_state.dpll;
   11879   1.1  riastrad 
   11880   1.1  riastrad 	if ((dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN)
   11881   1.1  riastrad 		return dev_priv->vbt.lvds_ssc_freq;
   11882   1.1  riastrad 	else if (HAS_PCH_SPLIT(dev_priv))
   11883   1.1  riastrad 		return 120000;
   11884   1.1  riastrad 	else if (!IS_GEN(dev_priv, 2))
   11885   1.1  riastrad 		return 96000;
   11886   1.1  riastrad 	else
   11887   1.1  riastrad 		return 48000;
   11888   1.1  riastrad }
   11889   1.1  riastrad 
   11890   1.1  riastrad /* Returns the clock of the currently programmed mode of the given pipe. */
   11891   1.1  riastrad static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
   11892   1.1  riastrad 				struct intel_crtc_state *pipe_config)
   11893   1.1  riastrad {
   11894   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   11895   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   11896   1.1  riastrad 	enum pipe pipe = crtc->pipe;
   11897   1.1  riastrad 	u32 dpll = pipe_config->dpll_hw_state.dpll;
   11898   1.1  riastrad 	u32 fp;
   11899   1.1  riastrad 	struct dpll clock;
   11900   1.1  riastrad 	int port_clock;
   11901   1.1  riastrad 	int refclk = i9xx_pll_refclk(dev, pipe_config);
   11902   1.1  riastrad 
   11903   1.1  riastrad 	if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
   11904   1.1  riastrad 		fp = pipe_config->dpll_hw_state.fp0;
   11905   1.1  riastrad 	else
   11906   1.1  riastrad 		fp = pipe_config->dpll_hw_state.fp1;
   11907   1.1  riastrad 
   11908   1.1  riastrad 	clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
   11909   1.1  riastrad 	if (IS_PINEVIEW(dev_priv)) {
   11910   1.1  riastrad 		clock.n = ffs((fp & FP_N_PINEVIEW_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
   11911   1.1  riastrad 		clock.m2 = (fp & FP_M2_PINEVIEW_DIV_MASK) >> FP_M2_DIV_SHIFT;
   11912   1.1  riastrad 	} else {
   11913   1.1  riastrad 		clock.n = (fp & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT;
   11914   1.1  riastrad 		clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT;
   11915   1.1  riastrad 	}
   11916   1.1  riastrad 
   11917   1.1  riastrad 	if (!IS_GEN(dev_priv, 2)) {
   11918   1.1  riastrad 		if (IS_PINEVIEW(dev_priv))
   11919   1.1  riastrad 			clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >>
   11920   1.1  riastrad 				DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW);
   11921   1.1  riastrad 		else
   11922   1.1  riastrad 			clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK) >>
   11923   1.1  riastrad 			       DPLL_FPA01_P1_POST_DIV_SHIFT);
   11924   1.1  riastrad 
   11925   1.1  riastrad 		switch (dpll & DPLL_MODE_MASK) {
   11926   1.1  riastrad 		case DPLLB_MODE_DAC_SERIAL:
   11927   1.1  riastrad 			clock.p2 = dpll & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ?
   11928   1.1  riastrad 				5 : 10;
   11929   1.1  riastrad 			break;
   11930   1.1  riastrad 		case DPLLB_MODE_LVDS:
   11931   1.1  riastrad 			clock.p2 = dpll & DPLLB_LVDS_P2_CLOCK_DIV_7 ?
   11932   1.1  riastrad 				7 : 14;
   11933   1.1  riastrad 			break;
   11934   1.1  riastrad 		default:
   11935   1.1  riastrad 			DRM_DEBUG_KMS("Unknown DPLL mode %08x in programmed "
   11936   1.1  riastrad 				  "mode\n", (int)(dpll & DPLL_MODE_MASK));
   11937   1.1  riastrad 			return;
   11938   1.1  riastrad 		}
   11939   1.1  riastrad 
   11940   1.1  riastrad 		if (IS_PINEVIEW(dev_priv))
   11941   1.1  riastrad 			port_clock = pnv_calc_dpll_params(refclk, &clock);
   11942   1.1  riastrad 		else
   11943   1.1  riastrad 			port_clock = i9xx_calc_dpll_params(refclk, &clock);
   11944   1.1  riastrad 	} else {
   11945   1.1  riastrad 		u32 lvds = IS_I830(dev_priv) ? 0 : I915_READ(LVDS);
   11946   1.1  riastrad 		bool is_lvds = (pipe == 1) && (lvds & LVDS_PORT_EN);
   11947   1.1  riastrad 
   11948   1.1  riastrad 		if (is_lvds) {
   11949   1.1  riastrad 			clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS) >>
   11950   1.1  riastrad 				       DPLL_FPA01_P1_POST_DIV_SHIFT);
   11951   1.1  riastrad 
   11952   1.1  riastrad 			if (lvds & LVDS_CLKB_POWER_UP)
   11953   1.1  riastrad 				clock.p2 = 7;
   11954   1.1  riastrad 			else
   11955   1.1  riastrad 				clock.p2 = 14;
   11956   1.1  riastrad 		} else {
   11957   1.1  riastrad 			if (dpll & PLL_P1_DIVIDE_BY_TWO)
   11958   1.1  riastrad 				clock.p1 = 2;
   11959   1.1  riastrad 			else {
   11960   1.1  riastrad 				clock.p1 = ((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830) >>
   11961   1.1  riastrad 					    DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
   11962   1.1  riastrad 			}
   11963   1.1  riastrad 			if (dpll & PLL_P2_DIVIDE_BY_4)
   11964   1.1  riastrad 				clock.p2 = 4;
   11965   1.1  riastrad 			else
   11966   1.1  riastrad 				clock.p2 = 2;
   11967   1.1  riastrad 		}
   11968   1.1  riastrad 
   11969   1.1  riastrad 		port_clock = i9xx_calc_dpll_params(refclk, &clock);
   11970   1.1  riastrad 	}
   11971   1.1  riastrad 
   11972   1.1  riastrad 	/*
   11973   1.1  riastrad 	 * This value includes pixel_multiplier. We will use
   11974   1.1  riastrad 	 * port_clock to compute adjusted_mode.crtc_clock in the
   11975   1.1  riastrad 	 * encoder's get_config() function.
   11976   1.1  riastrad 	 */
   11977   1.1  riastrad 	pipe_config->port_clock = port_clock;
   11978   1.1  riastrad }
   11979   1.1  riastrad 
   11980   1.1  riastrad int intel_dotclock_calculate(int link_freq,
   11981   1.1  riastrad 			     const struct intel_link_m_n *m_n)
   11982   1.1  riastrad {
   11983   1.1  riastrad 	/*
   11984   1.1  riastrad 	 * The calculation for the data clock is:
   11985   1.1  riastrad 	 * pixel_clock = ((m/n)*(link_clock * nr_lanes))/bpp
   11986   1.1  riastrad 	 * But we want to avoid losing precison if possible, so:
   11987   1.1  riastrad 	 * pixel_clock = ((m * link_clock * nr_lanes)/(n*bpp))
   11988   1.1  riastrad 	 *
   11989   1.1  riastrad 	 * and the link clock is simpler:
   11990   1.1  riastrad 	 * link_clock = (m * link_clock) / n
   11991   1.1  riastrad 	 */
   11992   1.1  riastrad 
   11993   1.1  riastrad 	if (!m_n->link_n)
   11994   1.1  riastrad 		return 0;
   11995   1.1  riastrad 
   11996   1.1  riastrad 	return div_u64(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
   11997   1.1  riastrad }
   11998   1.1  riastrad 
   11999   1.1  riastrad static void ilk_pch_clock_get(struct intel_crtc *crtc,
   12000   1.1  riastrad 			      struct intel_crtc_state *pipe_config)
   12001   1.1  riastrad {
   12002   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12003   1.1  riastrad 
   12004   1.1  riastrad 	/* read out port_clock from the DPLL */
   12005   1.1  riastrad 	i9xx_crtc_clock_get(crtc, pipe_config);
   12006   1.1  riastrad 
   12007   1.1  riastrad 	/*
   12008   1.1  riastrad 	 * In case there is an active pipe without active ports,
   12009   1.1  riastrad 	 * we may need some idea for the dotclock anyway.
   12010   1.1  riastrad 	 * Calculate one based on the FDI configuration.
   12011   1.1  riastrad 	 */
   12012   1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_clock =
   12013   1.1  riastrad 		intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
   12014   1.1  riastrad 					 &pipe_config->fdi_m_n);
   12015   1.1  riastrad }
   12016   1.1  riastrad 
   12017   1.1  riastrad static void intel_crtc_state_reset(struct intel_crtc_state *crtc_state,
   12018   1.1  riastrad 				   struct intel_crtc *crtc)
   12019   1.1  riastrad {
   12020   1.1  riastrad 	memset(crtc_state, 0, sizeof(*crtc_state));
   12021   1.1  riastrad 
   12022   1.1  riastrad 	__drm_atomic_helper_crtc_state_reset(&crtc_state->uapi, &crtc->base);
   12023   1.1  riastrad 
   12024   1.1  riastrad 	crtc_state->cpu_transcoder = INVALID_TRANSCODER;
   12025   1.1  riastrad 	crtc_state->master_transcoder = INVALID_TRANSCODER;
   12026   1.1  riastrad 	crtc_state->hsw_workaround_pipe = INVALID_PIPE;
   12027   1.1  riastrad 	crtc_state->output_format = INTEL_OUTPUT_FORMAT_INVALID;
   12028   1.1  riastrad 	crtc_state->scaler_state.scaler_id = -1;
   12029   1.1  riastrad 	crtc_state->mst_master_transcoder = INVALID_TRANSCODER;
   12030   1.1  riastrad }
   12031   1.1  riastrad 
   12032   1.1  riastrad static struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc)
   12033   1.1  riastrad {
   12034   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   12035   1.1  riastrad 
   12036   1.1  riastrad 	crtc_state = kmalloc(sizeof(*crtc_state), GFP_KERNEL);
   12037   1.1  riastrad 
   12038   1.1  riastrad 	if (crtc_state)
   12039   1.1  riastrad 		intel_crtc_state_reset(crtc_state, crtc);
   12040   1.1  riastrad 
   12041   1.1  riastrad 	return crtc_state;
   12042   1.1  riastrad }
   12043   1.1  riastrad 
   12044   1.1  riastrad /* Returns the currently programmed mode of the given encoder. */
   12045   1.1  riastrad struct drm_display_mode *
   12046   1.1  riastrad intel_encoder_current_mode(struct intel_encoder *encoder)
   12047   1.1  riastrad {
   12048   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   12049   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   12050   1.1  riastrad 	struct drm_display_mode *mode;
   12051   1.1  riastrad 	struct intel_crtc *crtc;
   12052   1.1  riastrad 	enum pipe pipe;
   12053   1.1  riastrad 
   12054   1.1  riastrad 	if (!encoder->get_hw_state(encoder, &pipe))
   12055   1.1  riastrad 		return NULL;
   12056   1.1  riastrad 
   12057   1.1  riastrad 	crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   12058   1.1  riastrad 
   12059   1.1  riastrad 	mode = kzalloc(sizeof(*mode), GFP_KERNEL);
   12060   1.1  riastrad 	if (!mode)
   12061   1.1  riastrad 		return NULL;
   12062   1.1  riastrad 
   12063   1.1  riastrad 	crtc_state = intel_crtc_state_alloc(crtc);
   12064   1.1  riastrad 	if (!crtc_state) {
   12065   1.1  riastrad 		kfree(mode);
   12066   1.1  riastrad 		return NULL;
   12067   1.1  riastrad 	}
   12068   1.1  riastrad 
   12069   1.1  riastrad 	if (!dev_priv->display.get_pipe_config(crtc, crtc_state)) {
   12070   1.1  riastrad 		kfree(crtc_state);
   12071   1.1  riastrad 		kfree(mode);
   12072   1.1  riastrad 		return NULL;
   12073   1.1  riastrad 	}
   12074   1.1  riastrad 
   12075   1.1  riastrad 	encoder->get_config(encoder, crtc_state);
   12076   1.1  riastrad 
   12077   1.1  riastrad 	intel_mode_from_pipe_config(mode, crtc_state);
   12078   1.1  riastrad 
   12079   1.1  riastrad 	kfree(crtc_state);
   12080   1.1  riastrad 
   12081   1.1  riastrad 	return mode;
   12082   1.1  riastrad }
   12083   1.1  riastrad 
   12084   1.1  riastrad static void intel_crtc_destroy(struct drm_crtc *crtc)
   12085   1.1  riastrad {
   12086   1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
   12087   1.1  riastrad 
   12088   1.1  riastrad 	drm_crtc_cleanup(crtc);
   12089   1.1  riastrad 	kfree(intel_crtc);
   12090   1.1  riastrad }
   12091   1.1  riastrad 
   12092   1.1  riastrad /**
   12093   1.1  riastrad  * intel_wm_need_update - Check whether watermarks need updating
   12094   1.1  riastrad  * @cur: current plane state
   12095   1.1  riastrad  * @new: new plane state
   12096   1.1  riastrad  *
   12097   1.1  riastrad  * Check current plane state versus the new one to determine whether
   12098   1.1  riastrad  * watermarks need to be recalculated.
   12099   1.1  riastrad  *
   12100   1.1  riastrad  * Returns true or false.
   12101   1.1  riastrad  */
   12102   1.1  riastrad static bool intel_wm_need_update(const struct intel_plane_state *cur,
   12103   1.1  riastrad 				 struct intel_plane_state *new)
   12104   1.1  riastrad {
   12105   1.1  riastrad 	/* Update watermarks on tiling or size changes. */
   12106   1.1  riastrad 	if (new->uapi.visible != cur->uapi.visible)
   12107   1.1  riastrad 		return true;
   12108   1.1  riastrad 
   12109   1.1  riastrad 	if (!cur->hw.fb || !new->hw.fb)
   12110   1.1  riastrad 		return false;
   12111   1.1  riastrad 
   12112   1.1  riastrad 	if (cur->hw.fb->modifier != new->hw.fb->modifier ||
   12113   1.1  riastrad 	    cur->hw.rotation != new->hw.rotation ||
   12114   1.1  riastrad 	    drm_rect_width(&new->uapi.src) != drm_rect_width(&cur->uapi.src) ||
   12115   1.1  riastrad 	    drm_rect_height(&new->uapi.src) != drm_rect_height(&cur->uapi.src) ||
   12116   1.1  riastrad 	    drm_rect_width(&new->uapi.dst) != drm_rect_width(&cur->uapi.dst) ||
   12117   1.1  riastrad 	    drm_rect_height(&new->uapi.dst) != drm_rect_height(&cur->uapi.dst))
   12118   1.1  riastrad 		return true;
   12119   1.1  riastrad 
   12120   1.1  riastrad 	return false;
   12121   1.1  riastrad }
   12122   1.1  riastrad 
   12123   1.1  riastrad static bool needs_scaling(const struct intel_plane_state *state)
   12124   1.1  riastrad {
   12125   1.1  riastrad 	int src_w = drm_rect_width(&state->uapi.src) >> 16;
   12126   1.1  riastrad 	int src_h = drm_rect_height(&state->uapi.src) >> 16;
   12127   1.1  riastrad 	int dst_w = drm_rect_width(&state->uapi.dst);
   12128   1.1  riastrad 	int dst_h = drm_rect_height(&state->uapi.dst);
   12129   1.1  riastrad 
   12130   1.1  riastrad 	return (src_w != dst_w || src_h != dst_h);
   12131   1.1  riastrad }
   12132   1.1  riastrad 
   12133   1.1  riastrad int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
   12134   1.1  riastrad 				    struct intel_crtc_state *crtc_state,
   12135   1.1  riastrad 				    const struct intel_plane_state *old_plane_state,
   12136   1.1  riastrad 				    struct intel_plane_state *plane_state)
   12137   1.1  riastrad {
   12138   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   12139   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   12140   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12141   1.1  riastrad 	bool mode_changed = needs_modeset(crtc_state);
   12142   1.1  riastrad 	bool was_crtc_enabled = old_crtc_state->hw.active;
   12143   1.1  riastrad 	bool is_crtc_enabled = crtc_state->hw.active;
   12144   1.1  riastrad 	bool turn_off, turn_on, visible, was_visible;
   12145   1.1  riastrad 	int ret;
   12146   1.1  riastrad 
   12147   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_CURSOR) {
   12148   1.1  riastrad 		ret = skl_update_scaler_plane(crtc_state, plane_state);
   12149   1.1  riastrad 		if (ret)
   12150   1.1  riastrad 			return ret;
   12151   1.1  riastrad 	}
   12152   1.1  riastrad 
   12153   1.1  riastrad 	was_visible = old_plane_state->uapi.visible;
   12154   1.1  riastrad 	visible = plane_state->uapi.visible;
   12155   1.1  riastrad 
   12156   1.1  riastrad 	if (!was_crtc_enabled && WARN_ON(was_visible))
   12157   1.1  riastrad 		was_visible = false;
   12158   1.1  riastrad 
   12159   1.1  riastrad 	/*
   12160   1.1  riastrad 	 * Visibility is calculated as if the crtc was on, but
   12161   1.1  riastrad 	 * after scaler setup everything depends on it being off
   12162   1.1  riastrad 	 * when the crtc isn't active.
   12163   1.1  riastrad 	 *
   12164   1.1  riastrad 	 * FIXME this is wrong for watermarks. Watermarks should also
   12165   1.1  riastrad 	 * be computed as if the pipe would be active. Perhaps move
   12166   1.1  riastrad 	 * per-plane wm computation to the .check_plane() hook, and
   12167   1.1  riastrad 	 * only combine the results from all planes in the current place?
   12168   1.1  riastrad 	 */
   12169   1.1  riastrad 	if (!is_crtc_enabled) {
   12170   1.1  riastrad 		plane_state->uapi.visible = visible = false;
   12171   1.1  riastrad 		crtc_state->active_planes &= ~BIT(plane->id);
   12172   1.1  riastrad 		crtc_state->data_rate[plane->id] = 0;
   12173   1.1  riastrad 		crtc_state->min_cdclk[plane->id] = 0;
   12174   1.1  riastrad 	}
   12175   1.1  riastrad 
   12176   1.1  riastrad 	if (!was_visible && !visible)
   12177   1.1  riastrad 		return 0;
   12178   1.1  riastrad 
   12179   1.1  riastrad 	turn_off = was_visible && (!visible || mode_changed);
   12180   1.1  riastrad 	turn_on = visible && (!was_visible || mode_changed);
   12181   1.1  riastrad 
   12182   1.1  riastrad 	DRM_DEBUG_ATOMIC("[CRTC:%d:%s] with [PLANE:%d:%s] visible %i -> %i, off %i, on %i, ms %i\n",
   12183   1.1  riastrad 			 crtc->base.base.id, crtc->base.name,
   12184   1.1  riastrad 			 plane->base.base.id, plane->base.name,
   12185   1.1  riastrad 			 was_visible, visible,
   12186   1.1  riastrad 			 turn_off, turn_on, mode_changed);
   12187   1.1  riastrad 
   12188   1.1  riastrad 	if (turn_on) {
   12189   1.1  riastrad 		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
   12190   1.1  riastrad 			crtc_state->update_wm_pre = true;
   12191   1.1  riastrad 
   12192   1.1  riastrad 		/* must disable cxsr around plane enable/disable */
   12193   1.1  riastrad 		if (plane->id != PLANE_CURSOR)
   12194   1.1  riastrad 			crtc_state->disable_cxsr = true;
   12195   1.1  riastrad 	} else if (turn_off) {
   12196   1.1  riastrad 		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
   12197   1.1  riastrad 			crtc_state->update_wm_post = true;
   12198   1.1  riastrad 
   12199   1.1  riastrad 		/* must disable cxsr around plane enable/disable */
   12200   1.1  riastrad 		if (plane->id != PLANE_CURSOR)
   12201   1.1  riastrad 			crtc_state->disable_cxsr = true;
   12202   1.1  riastrad 	} else if (intel_wm_need_update(old_plane_state, plane_state)) {
   12203   1.1  riastrad 		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv)) {
   12204   1.1  riastrad 			/* FIXME bollocks */
   12205   1.1  riastrad 			crtc_state->update_wm_pre = true;
   12206   1.1  riastrad 			crtc_state->update_wm_post = true;
   12207   1.1  riastrad 		}
   12208   1.1  riastrad 	}
   12209   1.1  riastrad 
   12210   1.1  riastrad 	if (visible || was_visible)
   12211   1.1  riastrad 		crtc_state->fb_bits |= plane->frontbuffer_bit;
   12212   1.1  riastrad 
   12213   1.1  riastrad 	/*
   12214   1.1  riastrad 	 * ILK/SNB DVSACNTR/Sprite Enable
   12215   1.1  riastrad 	 * IVB SPR_CTL/Sprite Enable
   12216   1.1  riastrad 	 * "When in Self Refresh Big FIFO mode, a write to enable the
   12217   1.1  riastrad 	 *  plane will be internally buffered and delayed while Big FIFO
   12218   1.1  riastrad 	 *  mode is exiting."
   12219   1.1  riastrad 	 *
   12220   1.1  riastrad 	 * Which means that enabling the sprite can take an extra frame
   12221   1.1  riastrad 	 * when we start in big FIFO mode (LP1+). Thus we need to drop
   12222   1.1  riastrad 	 * down to LP0 and wait for vblank in order to make sure the
   12223   1.1  riastrad 	 * sprite gets enabled on the next vblank after the register write.
   12224   1.1  riastrad 	 * Doing otherwise would risk enabling the sprite one frame after
   12225   1.1  riastrad 	 * we've already signalled flip completion. We can resume LP1+
   12226   1.1  riastrad 	 * once the sprite has been enabled.
   12227   1.1  riastrad 	 *
   12228   1.1  riastrad 	 *
   12229   1.1  riastrad 	 * WaCxSRDisabledForSpriteScaling:ivb
   12230   1.1  riastrad 	 * IVB SPR_SCALE/Scaling Enable
   12231   1.1  riastrad 	 * "Low Power watermarks must be disabled for at least one
   12232   1.1  riastrad 	 *  frame before enabling sprite scaling, and kept disabled
   12233   1.1  riastrad 	 *  until sprite scaling is disabled."
   12234   1.1  riastrad 	 *
   12235   1.1  riastrad 	 * ILK/SNB DVSASCALE/Scaling Enable
   12236   1.1  riastrad 	 * "When in Self Refresh Big FIFO mode, scaling enable will be
   12237   1.1  riastrad 	 *  masked off while Big FIFO mode is exiting."
   12238   1.1  riastrad 	 *
   12239   1.1  riastrad 	 * Despite the w/a only being listed for IVB we assume that
   12240   1.1  riastrad 	 * the ILK/SNB note has similar ramifications, hence we apply
   12241   1.1  riastrad 	 * the w/a on all three platforms.
   12242   1.1  riastrad 	 *
   12243   1.1  riastrad 	 * With experimental results seems this is needed also for primary
   12244   1.1  riastrad 	 * plane, not only sprite plane.
   12245   1.1  riastrad 	 */
   12246   1.1  riastrad 	if (plane->id != PLANE_CURSOR &&
   12247   1.1  riastrad 	    (IS_GEN_RANGE(dev_priv, 5, 6) ||
   12248   1.1  riastrad 	     IS_IVYBRIDGE(dev_priv)) &&
   12249   1.1  riastrad 	    (turn_on || (!needs_scaling(old_plane_state) &&
   12250   1.1  riastrad 			 needs_scaling(plane_state))))
   12251   1.1  riastrad 		crtc_state->disable_lp_wm = true;
   12252   1.1  riastrad 
   12253   1.1  riastrad 	return 0;
   12254   1.1  riastrad }
   12255   1.1  riastrad 
   12256   1.1  riastrad static bool encoders_cloneable(const struct intel_encoder *a,
   12257   1.1  riastrad 			       const struct intel_encoder *b)
   12258   1.1  riastrad {
   12259   1.1  riastrad 	/* masks could be asymmetric, so check both ways */
   12260   1.1  riastrad 	return a == b || (a->cloneable & (1 << b->type) &&
   12261   1.1  riastrad 			  b->cloneable & (1 << a->type));
   12262   1.1  riastrad }
   12263   1.1  riastrad 
   12264   1.1  riastrad static bool check_single_encoder_cloning(struct drm_atomic_state *state,
   12265   1.1  riastrad 					 struct intel_crtc *crtc,
   12266   1.1  riastrad 					 struct intel_encoder *encoder)
   12267   1.1  riastrad {
   12268   1.1  riastrad 	struct intel_encoder *source_encoder;
   12269   1.1  riastrad 	struct drm_connector *connector;
   12270   1.1  riastrad 	struct drm_connector_state *connector_state;
   12271   1.1  riastrad 	int i;
   12272   1.1  riastrad 
   12273   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   12274   1.1  riastrad 		if (connector_state->crtc != &crtc->base)
   12275   1.1  riastrad 			continue;
   12276   1.1  riastrad 
   12277   1.1  riastrad 		source_encoder =
   12278   1.1  riastrad 			to_intel_encoder(connector_state->best_encoder);
   12279   1.1  riastrad 		if (!encoders_cloneable(encoder, source_encoder))
   12280   1.1  riastrad 			return false;
   12281   1.1  riastrad 	}
   12282   1.1  riastrad 
   12283   1.1  riastrad 	return true;
   12284   1.1  riastrad }
   12285   1.1  riastrad 
   12286   1.1  riastrad static int icl_add_linked_planes(struct intel_atomic_state *state)
   12287   1.1  riastrad {
   12288   1.1  riastrad 	struct intel_plane *plane, *linked;
   12289   1.1  riastrad 	struct intel_plane_state *plane_state, *linked_plane_state;
   12290   1.1  riastrad 	int i;
   12291   1.1  riastrad 
   12292   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12293   1.1  riastrad 		linked = plane_state->planar_linked_plane;
   12294   1.1  riastrad 
   12295   1.1  riastrad 		if (!linked)
   12296   1.1  riastrad 			continue;
   12297   1.1  riastrad 
   12298   1.1  riastrad 		linked_plane_state = intel_atomic_get_plane_state(state, linked);
   12299   1.1  riastrad 		if (IS_ERR(linked_plane_state))
   12300   1.1  riastrad 			return PTR_ERR(linked_plane_state);
   12301   1.1  riastrad 
   12302   1.1  riastrad 		WARN_ON(linked_plane_state->planar_linked_plane != plane);
   12303   1.1  riastrad 		WARN_ON(linked_plane_state->planar_slave == plane_state->planar_slave);
   12304   1.1  riastrad 	}
   12305   1.1  riastrad 
   12306   1.1  riastrad 	return 0;
   12307   1.1  riastrad }
   12308   1.1  riastrad 
   12309   1.1  riastrad static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
   12310   1.1  riastrad {
   12311   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   12312   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12313   1.1  riastrad 	struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
   12314   1.1  riastrad 	struct intel_plane *plane, *linked;
   12315   1.1  riastrad 	struct intel_plane_state *plane_state;
   12316   1.1  riastrad 	int i;
   12317   1.1  riastrad 
   12318   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 11)
   12319   1.1  riastrad 		return 0;
   12320   1.1  riastrad 
   12321   1.1  riastrad 	/*
   12322   1.1  riastrad 	 * Destroy all old plane links and make the slave plane invisible
   12323   1.1  riastrad 	 * in the crtc_state->active_planes mask.
   12324   1.1  riastrad 	 */
   12325   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12326   1.1  riastrad 		if (plane->pipe != crtc->pipe || !plane_state->planar_linked_plane)
   12327   1.1  riastrad 			continue;
   12328   1.1  riastrad 
   12329   1.1  riastrad 		plane_state->planar_linked_plane = NULL;
   12330   1.1  riastrad 		if (plane_state->planar_slave && !plane_state->uapi.visible) {
   12331   1.1  riastrad 			crtc_state->active_planes &= ~BIT(plane->id);
   12332   1.1  riastrad 			crtc_state->update_planes |= BIT(plane->id);
   12333   1.1  riastrad 		}
   12334   1.1  riastrad 
   12335   1.1  riastrad 		plane_state->planar_slave = false;
   12336   1.1  riastrad 	}
   12337   1.1  riastrad 
   12338   1.1  riastrad 	if (!crtc_state->nv12_planes)
   12339   1.1  riastrad 		return 0;
   12340   1.1  riastrad 
   12341   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12342   1.1  riastrad 		struct intel_plane_state *linked_state = NULL;
   12343   1.1  riastrad 
   12344   1.1  riastrad 		if (plane->pipe != crtc->pipe ||
   12345   1.1  riastrad 		    !(crtc_state->nv12_planes & BIT(plane->id)))
   12346   1.1  riastrad 			continue;
   12347   1.1  riastrad 
   12348   1.1  riastrad 		for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, linked) {
   12349   1.1  riastrad 			if (!icl_is_nv12_y_plane(linked->id))
   12350   1.1  riastrad 				continue;
   12351   1.1  riastrad 
   12352   1.1  riastrad 			if (crtc_state->active_planes & BIT(linked->id))
   12353   1.1  riastrad 				continue;
   12354   1.1  riastrad 
   12355   1.1  riastrad 			linked_state = intel_atomic_get_plane_state(state, linked);
   12356   1.1  riastrad 			if (IS_ERR(linked_state))
   12357   1.1  riastrad 				return PTR_ERR(linked_state);
   12358   1.1  riastrad 
   12359   1.1  riastrad 			break;
   12360   1.1  riastrad 		}
   12361   1.1  riastrad 
   12362   1.1  riastrad 		if (!linked_state) {
   12363   1.1  riastrad 			DRM_DEBUG_KMS("Need %d free Y planes for planar YUV\n",
   12364   1.1  riastrad 				      hweight8(crtc_state->nv12_planes));
   12365   1.1  riastrad 
   12366   1.1  riastrad 			return -EINVAL;
   12367   1.1  riastrad 		}
   12368   1.1  riastrad 
   12369   1.1  riastrad 		plane_state->planar_linked_plane = linked;
   12370   1.1  riastrad 
   12371   1.1  riastrad 		linked_state->planar_slave = true;
   12372   1.1  riastrad 		linked_state->planar_linked_plane = plane;
   12373   1.1  riastrad 		crtc_state->active_planes |= BIT(linked->id);
   12374   1.1  riastrad 		crtc_state->update_planes |= BIT(linked->id);
   12375   1.1  riastrad 		DRM_DEBUG_KMS("Using %s as Y plane for %s\n", linked->base.name, plane->base.name);
   12376   1.1  riastrad 
   12377   1.1  riastrad 		/* Copy parameters to slave plane */
   12378   1.1  riastrad 		linked_state->ctl = plane_state->ctl | PLANE_CTL_YUV420_Y_PLANE;
   12379   1.1  riastrad 		linked_state->color_ctl = plane_state->color_ctl;
   12380   1.1  riastrad 		linked_state->view = plane_state->view;
   12381   1.1  riastrad 		memcpy(linked_state->color_plane, plane_state->color_plane,
   12382   1.1  riastrad 		       sizeof(linked_state->color_plane));
   12383   1.1  riastrad 
   12384   1.1  riastrad 		intel_plane_copy_uapi_to_hw_state(linked_state, plane_state);
   12385   1.1  riastrad 		linked_state->uapi.src = plane_state->uapi.src;
   12386   1.1  riastrad 		linked_state->uapi.dst = plane_state->uapi.dst;
   12387   1.1  riastrad 
   12388   1.1  riastrad 		if (icl_is_hdr_plane(dev_priv, plane->id)) {
   12389   1.1  riastrad 			if (linked->id == PLANE_SPRITE5)
   12390   1.1  riastrad 				plane_state->cus_ctl |= PLANE_CUS_PLANE_7;
   12391   1.1  riastrad 			else if (linked->id == PLANE_SPRITE4)
   12392   1.1  riastrad 				plane_state->cus_ctl |= PLANE_CUS_PLANE_6;
   12393   1.1  riastrad 			else
   12394   1.1  riastrad 				MISSING_CASE(linked->id);
   12395   1.1  riastrad 		}
   12396   1.1  riastrad 	}
   12397   1.1  riastrad 
   12398   1.1  riastrad 	return 0;
   12399   1.1  riastrad }
   12400   1.1  riastrad 
   12401   1.1  riastrad static bool c8_planes_changed(const struct intel_crtc_state *new_crtc_state)
   12402   1.1  riastrad {
   12403   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   12404   1.1  riastrad 	struct intel_atomic_state *state =
   12405   1.1  riastrad 		to_intel_atomic_state(new_crtc_state->uapi.state);
   12406   1.1  riastrad 	const struct intel_crtc_state *old_crtc_state =
   12407   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   12408   1.1  riastrad 
   12409   1.1  riastrad 	return !old_crtc_state->c8_planes != !new_crtc_state->c8_planes;
   12410   1.1  riastrad }
   12411   1.1  riastrad 
   12412   1.1  riastrad static bool
   12413   1.1  riastrad intel_atomic_is_master_connector(struct intel_crtc_state *crtc_state)
   12414   1.1  riastrad {
   12415   1.1  riastrad 	struct drm_crtc *crtc = crtc_state->uapi.crtc;
   12416   1.1  riastrad 	struct drm_atomic_state *state = crtc_state->uapi.state;
   12417   1.1  riastrad 	struct drm_connector *connector;
   12418   1.1  riastrad 	struct drm_connector_state *connector_state;
   12419   1.1  riastrad 	int i;
   12420   1.1  riastrad 
   12421   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   12422   1.1  riastrad 		if (connector_state->crtc != crtc)
   12423   1.1  riastrad 			continue;
   12424   1.1  riastrad 		if (connector->has_tile &&
   12425   1.1  riastrad 		    connector->tile_h_loc == connector->num_h_tile - 1 &&
   12426   1.1  riastrad 		    connector->tile_v_loc == connector->num_v_tile - 1)
   12427   1.1  riastrad 			return true;
   12428   1.1  riastrad 	}
   12429   1.1  riastrad 
   12430   1.1  riastrad 	return false;
   12431   1.1  riastrad }
   12432   1.1  riastrad 
   12433   1.1  riastrad static void reset_port_sync_mode_state(struct intel_crtc_state *crtc_state)
   12434   1.1  riastrad {
   12435   1.1  riastrad 	crtc_state->master_transcoder = INVALID_TRANSCODER;
   12436   1.1  riastrad 	crtc_state->sync_mode_slaves_mask = 0;
   12437   1.1  riastrad }
   12438   1.1  riastrad 
   12439   1.1  riastrad static int icl_compute_port_sync_crtc_state(struct drm_connector *connector,
   12440   1.1  riastrad 					    struct intel_crtc_state *crtc_state,
   12441   1.1  riastrad 					    int num_tiled_conns)
   12442   1.1  riastrad {
   12443   1.1  riastrad 	struct drm_crtc *crtc = crtc_state->uapi.crtc;
   12444   1.1  riastrad 	struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
   12445   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   12446   1.1  riastrad 	struct drm_connector *master_connector;
   12447   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   12448   1.1  riastrad 	struct drm_crtc *master_crtc = NULL;
   12449   1.1  riastrad 	struct drm_crtc_state *master_crtc_state;
   12450   1.1  riastrad 	struct intel_crtc_state *master_pipe_config;
   12451   1.1  riastrad 
   12452   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 11)
   12453   1.1  riastrad 		return 0;
   12454   1.1  riastrad 
   12455   1.1  riastrad 	if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
   12456   1.1  riastrad 		return 0;
   12457   1.1  riastrad 
   12458   1.1  riastrad 	/*
   12459   1.1  riastrad 	 * In case of tiled displays there could be one or more slaves but there is
   12460   1.1  riastrad 	 * only one master. Lets make the CRTC used by the connector corresponding
   12461   1.1  riastrad 	 * to the last horizonal and last vertical tile a master/genlock CRTC.
   12462   1.1  riastrad 	 * All the other CRTCs corresponding to other tiles of the same Tile group
   12463   1.1  riastrad 	 * are the slave CRTCs and hold a pointer to their genlock CRTC.
   12464   1.1  riastrad 	 * If all tiles not present do not make master slave assignments.
   12465   1.1  riastrad 	 */
   12466   1.1  riastrad 	if (!connector->has_tile ||
   12467   1.1  riastrad 	    crtc_state->hw.mode.hdisplay != connector->tile_h_size ||
   12468   1.1  riastrad 	    crtc_state->hw.mode.vdisplay != connector->tile_v_size ||
   12469   1.1  riastrad 	    num_tiled_conns < connector->num_h_tile * connector->num_v_tile) {
   12470   1.1  riastrad 		reset_port_sync_mode_state(crtc_state);
   12471   1.1  riastrad 		return 0;
   12472   1.1  riastrad 	}
   12473   1.1  riastrad 	/* Last Horizontal and last vertical tile connector is a master
   12474   1.1  riastrad 	 * Master's crtc state is already populated in slave for port sync
   12475   1.1  riastrad 	 */
   12476   1.1  riastrad 	if (connector->tile_h_loc == connector->num_h_tile - 1 &&
   12477   1.1  riastrad 	    connector->tile_v_loc == connector->num_v_tile - 1)
   12478   1.1  riastrad 		return 0;
   12479   1.1  riastrad 
   12480   1.1  riastrad 	/* Loop through all connectors and configure the Slave crtc_state
   12481   1.1  riastrad 	 * to point to the correct master.
   12482   1.1  riastrad 	 */
   12483   1.1  riastrad 	drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
   12484   1.1  riastrad 	drm_for_each_connector_iter(master_connector, &conn_iter) {
   12485   1.1  riastrad 		struct drm_connector_state *master_conn_state = NULL;
   12486   1.1  riastrad 
   12487   1.1  riastrad 		if (!(master_connector->has_tile &&
   12488   1.1  riastrad 		      master_connector->tile_group->id == connector->tile_group->id))
   12489   1.1  riastrad 			continue;
   12490   1.1  riastrad 		if (master_connector->tile_h_loc != master_connector->num_h_tile - 1 ||
   12491   1.1  riastrad 		    master_connector->tile_v_loc != master_connector->num_v_tile - 1)
   12492   1.1  riastrad 			continue;
   12493   1.1  riastrad 
   12494   1.1  riastrad 		master_conn_state = drm_atomic_get_connector_state(&state->base,
   12495   1.1  riastrad 								   master_connector);
   12496   1.1  riastrad 		if (IS_ERR(master_conn_state)) {
   12497   1.1  riastrad 			drm_connector_list_iter_end(&conn_iter);
   12498   1.1  riastrad 			return PTR_ERR(master_conn_state);
   12499   1.1  riastrad 		}
   12500   1.1  riastrad 		if (master_conn_state->crtc) {
   12501   1.1  riastrad 			master_crtc = master_conn_state->crtc;
   12502   1.1  riastrad 			break;
   12503   1.1  riastrad 		}
   12504   1.1  riastrad 	}
   12505   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   12506   1.1  riastrad 
   12507   1.1  riastrad 	if (!master_crtc) {
   12508   1.1  riastrad 		DRM_DEBUG_KMS("Could not find Master CRTC for Slave CRTC %d\n",
   12509   1.1  riastrad 			      crtc->base.id);
   12510   1.1  riastrad 		return -EINVAL;
   12511   1.1  riastrad 	}
   12512   1.1  riastrad 
   12513   1.1  riastrad 	master_crtc_state = drm_atomic_get_crtc_state(&state->base,
   12514   1.1  riastrad 						      master_crtc);
   12515   1.1  riastrad 	if (IS_ERR(master_crtc_state))
   12516   1.1  riastrad 		return PTR_ERR(master_crtc_state);
   12517   1.1  riastrad 
   12518   1.1  riastrad 	master_pipe_config = to_intel_crtc_state(master_crtc_state);
   12519   1.1  riastrad 	crtc_state->master_transcoder = master_pipe_config->cpu_transcoder;
   12520   1.1  riastrad 	master_pipe_config->sync_mode_slaves_mask |=
   12521   1.1  riastrad 		BIT(crtc_state->cpu_transcoder);
   12522   1.1  riastrad 	DRM_DEBUG_KMS("Master Transcoder = %s added for Slave CRTC = %d, slave transcoder bitmask = %d\n",
   12523   1.1  riastrad 		      transcoder_name(crtc_state->master_transcoder),
   12524   1.1  riastrad 		      crtc->base.id,
   12525   1.1  riastrad 		      master_pipe_config->sync_mode_slaves_mask);
   12526   1.1  riastrad 
   12527   1.1  riastrad 	return 0;
   12528   1.1  riastrad }
   12529   1.1  riastrad 
   12530   1.1  riastrad static int intel_crtc_atomic_check(struct intel_atomic_state *state,
   12531   1.1  riastrad 				   struct intel_crtc *crtc)
   12532   1.1  riastrad {
   12533   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12534   1.1  riastrad 	struct intel_crtc_state *crtc_state =
   12535   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   12536   1.1  riastrad 	bool mode_changed = needs_modeset(crtc_state);
   12537   1.1  riastrad 	int ret;
   12538   1.1  riastrad 
   12539   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) &&
   12540   1.1  riastrad 	    mode_changed && !crtc_state->hw.active)
   12541   1.1  riastrad 		crtc_state->update_wm_post = true;
   12542   1.1  riastrad 
   12543   1.1  riastrad 	if (mode_changed && crtc_state->hw.enable &&
   12544   1.1  riastrad 	    dev_priv->display.crtc_compute_clock &&
   12545   1.1  riastrad 	    !WARN_ON(crtc_state->shared_dpll)) {
   12546   1.1  riastrad 		ret = dev_priv->display.crtc_compute_clock(crtc, crtc_state);
   12547   1.1  riastrad 		if (ret)
   12548   1.1  riastrad 			return ret;
   12549   1.1  riastrad 	}
   12550   1.1  riastrad 
   12551   1.1  riastrad 	/*
   12552   1.1  riastrad 	 * May need to update pipe gamma enable bits
   12553   1.1  riastrad 	 * when C8 planes are getting enabled/disabled.
   12554   1.1  riastrad 	 */
   12555   1.1  riastrad 	if (c8_planes_changed(crtc_state))
   12556   1.1  riastrad 		crtc_state->uapi.color_mgmt_changed = true;
   12557   1.1  riastrad 
   12558   1.1  riastrad 	if (mode_changed || crtc_state->update_pipe ||
   12559   1.1  riastrad 	    crtc_state->uapi.color_mgmt_changed) {
   12560   1.1  riastrad 		ret = intel_color_check(crtc_state);
   12561   1.1  riastrad 		if (ret)
   12562   1.1  riastrad 			return ret;
   12563   1.1  riastrad 	}
   12564   1.1  riastrad 
   12565   1.1  riastrad 	ret = 0;
   12566   1.1  riastrad 	if (dev_priv->display.compute_pipe_wm) {
   12567   1.1  riastrad 		ret = dev_priv->display.compute_pipe_wm(crtc_state);
   12568   1.1  riastrad 		if (ret) {
   12569   1.1  riastrad 			DRM_DEBUG_KMS("Target pipe watermarks are invalid\n");
   12570   1.1  riastrad 			return ret;
   12571   1.1  riastrad 		}
   12572   1.1  riastrad 	}
   12573   1.1  riastrad 
   12574   1.1  riastrad 	if (dev_priv->display.compute_intermediate_wm) {
   12575   1.1  riastrad 		if (WARN_ON(!dev_priv->display.compute_pipe_wm))
   12576   1.1  riastrad 			return 0;
   12577   1.1  riastrad 
   12578   1.1  riastrad 		/*
   12579   1.1  riastrad 		 * Calculate 'intermediate' watermarks that satisfy both the
   12580   1.1  riastrad 		 * old state and the new state.  We can program these
   12581   1.1  riastrad 		 * immediately.
   12582   1.1  riastrad 		 */
   12583   1.1  riastrad 		ret = dev_priv->display.compute_intermediate_wm(crtc_state);
   12584   1.1  riastrad 		if (ret) {
   12585   1.1  riastrad 			DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n");
   12586   1.1  riastrad 			return ret;
   12587   1.1  riastrad 		}
   12588   1.1  riastrad 	}
   12589   1.1  riastrad 
   12590   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9) {
   12591   1.1  riastrad 		if (mode_changed || crtc_state->update_pipe)
   12592   1.1  riastrad 			ret = skl_update_scaler_crtc(crtc_state);
   12593   1.1  riastrad 		if (!ret)
   12594   1.1  riastrad 			ret = intel_atomic_setup_scalers(dev_priv, crtc,
   12595   1.1  riastrad 							 crtc_state);
   12596   1.1  riastrad 	}
   12597   1.1  riastrad 
   12598   1.1  riastrad 	if (HAS_IPS(dev_priv))
   12599   1.1  riastrad 		crtc_state->ips_enabled = hsw_compute_ips_config(crtc_state);
   12600   1.1  riastrad 
   12601   1.1  riastrad 	return ret;
   12602   1.1  riastrad }
   12603   1.1  riastrad 
   12604   1.1  riastrad static void intel_modeset_update_connector_atomic_state(struct drm_device *dev)
   12605   1.1  riastrad {
   12606   1.1  riastrad 	struct intel_connector *connector;
   12607   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   12608   1.1  riastrad 
   12609   1.1  riastrad 	drm_connector_list_iter_begin(dev, &conn_iter);
   12610   1.1  riastrad 	for_each_intel_connector_iter(connector, &conn_iter) {
   12611   1.1  riastrad 		if (connector->base.state->crtc)
   12612   1.1  riastrad 			drm_connector_put(&connector->base);
   12613   1.1  riastrad 
   12614   1.1  riastrad 		if (connector->base.encoder) {
   12615   1.1  riastrad 			connector->base.state->best_encoder =
   12616   1.1  riastrad 				connector->base.encoder;
   12617   1.1  riastrad 			connector->base.state->crtc =
   12618   1.1  riastrad 				connector->base.encoder->crtc;
   12619   1.1  riastrad 
   12620   1.1  riastrad 			drm_connector_get(&connector->base);
   12621   1.1  riastrad 		} else {
   12622   1.1  riastrad 			connector->base.state->best_encoder = NULL;
   12623   1.1  riastrad 			connector->base.state->crtc = NULL;
   12624   1.1  riastrad 		}
   12625   1.1  riastrad 	}
   12626   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   12627   1.1  riastrad }
   12628   1.1  riastrad 
   12629   1.1  riastrad static int
   12630   1.1  riastrad compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
   12631   1.1  riastrad 		      struct intel_crtc_state *pipe_config)
   12632   1.1  riastrad {
   12633   1.1  riastrad 	struct drm_connector *connector = conn_state->connector;
   12634   1.1  riastrad 	const struct drm_display_info *info = &connector->display_info;
   12635   1.1  riastrad 	int bpp;
   12636   1.1  riastrad 
   12637   1.1  riastrad 	switch (conn_state->max_bpc) {
   12638   1.1  riastrad 	case 6 ... 7:
   12639   1.1  riastrad 		bpp = 6 * 3;
   12640   1.1  riastrad 		break;
   12641   1.1  riastrad 	case 8 ... 9:
   12642   1.1  riastrad 		bpp = 8 * 3;
   12643   1.1  riastrad 		break;
   12644   1.1  riastrad 	case 10 ... 11:
   12645   1.1  riastrad 		bpp = 10 * 3;
   12646   1.1  riastrad 		break;
   12647   1.1  riastrad 	case 12:
   12648   1.1  riastrad 		bpp = 12 * 3;
   12649   1.1  riastrad 		break;
   12650   1.1  riastrad 	default:
   12651   1.1  riastrad 		return -EINVAL;
   12652   1.1  riastrad 	}
   12653   1.1  riastrad 
   12654   1.1  riastrad 	if (bpp < pipe_config->pipe_bpp) {
   12655   1.1  riastrad 		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Limiting display bpp to %d instead of "
   12656   1.1  riastrad 			      "EDID bpp %d, requested bpp %d, max platform bpp %d\n",
   12657   1.1  riastrad 			      connector->base.id, connector->name,
   12658   1.1  riastrad 			      bpp, 3 * info->bpc, 3 * conn_state->max_requested_bpc,
   12659   1.1  riastrad 			      pipe_config->pipe_bpp);
   12660   1.1  riastrad 
   12661   1.1  riastrad 		pipe_config->pipe_bpp = bpp;
   12662   1.1  riastrad 	}
   12663   1.1  riastrad 
   12664   1.1  riastrad 	return 0;
   12665   1.1  riastrad }
   12666   1.1  riastrad 
   12667   1.1  riastrad static int
   12668   1.1  riastrad compute_baseline_pipe_bpp(struct intel_crtc *crtc,
   12669   1.1  riastrad 			  struct intel_crtc_state *pipe_config)
   12670   1.1  riastrad {
   12671   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12672   1.1  riastrad 	struct drm_atomic_state *state = pipe_config->uapi.state;
   12673   1.1  riastrad 	struct drm_connector *connector;
   12674   1.1  riastrad 	struct drm_connector_state *connector_state;
   12675   1.1  riastrad 	int bpp, i;
   12676   1.1  riastrad 
   12677   1.1  riastrad 	if ((IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
   12678   1.1  riastrad 	    IS_CHERRYVIEW(dev_priv)))
   12679   1.1  riastrad 		bpp = 10*3;
   12680   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 5)
   12681   1.1  riastrad 		bpp = 12*3;
   12682   1.1  riastrad 	else
   12683   1.1  riastrad 		bpp = 8*3;
   12684   1.1  riastrad 
   12685   1.1  riastrad 	pipe_config->pipe_bpp = bpp;
   12686   1.1  riastrad 
   12687   1.1  riastrad 	/* Clamp display bpp to connector max bpp */
   12688   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   12689   1.1  riastrad 		int ret;
   12690   1.1  riastrad 
   12691   1.1  riastrad 		if (connector_state->crtc != &crtc->base)
   12692   1.1  riastrad 			continue;
   12693   1.1  riastrad 
   12694   1.1  riastrad 		ret = compute_sink_pipe_bpp(connector_state, pipe_config);
   12695   1.1  riastrad 		if (ret)
   12696   1.1  riastrad 			return ret;
   12697   1.1  riastrad 	}
   12698   1.1  riastrad 
   12699   1.1  riastrad 	return 0;
   12700   1.1  riastrad }
   12701   1.1  riastrad 
   12702   1.1  riastrad static void intel_dump_crtc_timings(const struct drm_display_mode *mode)
   12703   1.1  riastrad {
   12704   1.1  riastrad 	DRM_DEBUG_KMS("crtc timings: %d %d %d %d %d %d %d %d %d, "
   12705   1.1  riastrad 		      "type: 0x%x flags: 0x%x\n",
   12706   1.1  riastrad 		      mode->crtc_clock,
   12707   1.1  riastrad 		      mode->crtc_hdisplay, mode->crtc_hsync_start,
   12708   1.1  riastrad 		      mode->crtc_hsync_end, mode->crtc_htotal,
   12709   1.1  riastrad 		      mode->crtc_vdisplay, mode->crtc_vsync_start,
   12710   1.1  riastrad 		      mode->crtc_vsync_end, mode->crtc_vtotal,
   12711   1.1  riastrad 		      mode->type, mode->flags);
   12712   1.1  riastrad }
   12713   1.1  riastrad 
   12714   1.1  riastrad static inline void
   12715   1.1  riastrad intel_dump_m_n_config(const struct intel_crtc_state *pipe_config,
   12716   1.1  riastrad 		      const char *id, unsigned int lane_count,
   12717   1.1  riastrad 		      const struct intel_link_m_n *m_n)
   12718   1.1  riastrad {
   12719   1.1  riastrad 	DRM_DEBUG_KMS("%s: lanes: %i; gmch_m: %u, gmch_n: %u, link_m: %u, link_n: %u, tu: %u\n",
   12720   1.1  riastrad 		      id, lane_count,
   12721   1.1  riastrad 		      m_n->gmch_m, m_n->gmch_n,
   12722   1.1  riastrad 		      m_n->link_m, m_n->link_n, m_n->tu);
   12723   1.1  riastrad }
   12724   1.1  riastrad 
   12725   1.1  riastrad static void
   12726   1.1  riastrad intel_dump_infoframe(struct drm_i915_private *dev_priv,
   12727   1.1  riastrad 		     const union hdmi_infoframe *frame)
   12728   1.1  riastrad {
   12729   1.1  riastrad 	if (!drm_debug_enabled(DRM_UT_KMS))
   12730   1.1  riastrad 		return;
   12731   1.1  riastrad 
   12732   1.1  riastrad 	hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, frame);
   12733   1.1  riastrad }
   12734   1.1  riastrad 
   12735   1.1  riastrad #define OUTPUT_TYPE(x) [INTEL_OUTPUT_ ## x] = #x
   12736   1.1  riastrad 
   12737   1.1  riastrad static const char * const output_type_str[] = {
   12738   1.1  riastrad 	OUTPUT_TYPE(UNUSED),
   12739   1.1  riastrad 	OUTPUT_TYPE(ANALOG),
   12740   1.1  riastrad 	OUTPUT_TYPE(DVO),
   12741   1.1  riastrad 	OUTPUT_TYPE(SDVO),
   12742   1.1  riastrad 	OUTPUT_TYPE(LVDS),
   12743   1.1  riastrad 	OUTPUT_TYPE(TVOUT),
   12744   1.1  riastrad 	OUTPUT_TYPE(HDMI),
   12745   1.1  riastrad 	OUTPUT_TYPE(DP),
   12746   1.1  riastrad 	OUTPUT_TYPE(EDP),
   12747   1.1  riastrad 	OUTPUT_TYPE(DSI),
   12748   1.1  riastrad 	OUTPUT_TYPE(DDI),
   12749   1.1  riastrad 	OUTPUT_TYPE(DP_MST),
   12750   1.1  riastrad };
   12751   1.1  riastrad 
   12752   1.1  riastrad #undef OUTPUT_TYPE
   12753   1.1  riastrad 
   12754   1.1  riastrad static void snprintf_output_types(char *buf, size_t len,
   12755   1.1  riastrad 				  unsigned int output_types)
   12756   1.1  riastrad {
   12757   1.1  riastrad 	char *str = buf;
   12758   1.1  riastrad 	int i;
   12759   1.1  riastrad 
   12760   1.1  riastrad 	str[0] = '\0';
   12761   1.1  riastrad 
   12762   1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(output_type_str); i++) {
   12763   1.1  riastrad 		int r;
   12764   1.1  riastrad 
   12765   1.1  riastrad 		if ((output_types & BIT(i)) == 0)
   12766   1.1  riastrad 			continue;
   12767   1.1  riastrad 
   12768   1.1  riastrad 		r = snprintf(str, len, "%s%s",
   12769   1.1  riastrad 			     str != buf ? "," : "", output_type_str[i]);
   12770   1.1  riastrad 		if (r >= len)
   12771   1.1  riastrad 			break;
   12772   1.1  riastrad 		str += r;
   12773   1.1  riastrad 		len -= r;
   12774   1.1  riastrad 
   12775   1.1  riastrad 		output_types &= ~BIT(i);
   12776   1.1  riastrad 	}
   12777   1.1  riastrad 
   12778   1.1  riastrad 	WARN_ON_ONCE(output_types != 0);
   12779   1.1  riastrad }
   12780   1.1  riastrad 
   12781   1.1  riastrad static const char * const output_format_str[] = {
   12782   1.1  riastrad 	[INTEL_OUTPUT_FORMAT_INVALID] = "Invalid",
   12783   1.1  riastrad 	[INTEL_OUTPUT_FORMAT_RGB] = "RGB",
   12784   1.1  riastrad 	[INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
   12785   1.1  riastrad 	[INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
   12786   1.1  riastrad };
   12787   1.1  riastrad 
   12788   1.1  riastrad static const char *output_formats(enum intel_output_format format)
   12789   1.1  riastrad {
   12790   1.1  riastrad 	if (format >= ARRAY_SIZE(output_format_str))
   12791   1.1  riastrad 		format = INTEL_OUTPUT_FORMAT_INVALID;
   12792   1.1  riastrad 	return output_format_str[format];
   12793   1.1  riastrad }
   12794   1.1  riastrad 
   12795   1.1  riastrad static void intel_dump_plane_state(const struct intel_plane_state *plane_state)
   12796   1.1  riastrad {
   12797   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   12798   1.1  riastrad 	const struct drm_framebuffer *fb = plane_state->hw.fb;
   12799   1.1  riastrad 	struct drm_format_name_buf format_name;
   12800   1.1  riastrad 
   12801   1.1  riastrad 	if (!fb) {
   12802   1.1  riastrad 		DRM_DEBUG_KMS("[PLANE:%d:%s] fb: [NOFB], visible: %s\n",
   12803   1.1  riastrad 			      plane->base.base.id, plane->base.name,
   12804   1.1  riastrad 			      yesno(plane_state->uapi.visible));
   12805   1.1  riastrad 		return;
   12806   1.1  riastrad 	}
   12807   1.1  riastrad 
   12808   1.1  riastrad 	DRM_DEBUG_KMS("[PLANE:%d:%s] fb: [FB:%d] %ux%u format = %s, visible: %s\n",
   12809   1.1  riastrad 		      plane->base.base.id, plane->base.name,
   12810   1.1  riastrad 		      fb->base.id, fb->width, fb->height,
   12811   1.1  riastrad 		      drm_get_format_name(fb->format->format, &format_name),
   12812   1.1  riastrad 		      yesno(plane_state->uapi.visible));
   12813   1.1  riastrad 	DRM_DEBUG_KMS("\trotation: 0x%x, scaler: %d\n",
   12814   1.1  riastrad 		      plane_state->hw.rotation, plane_state->scaler_id);
   12815   1.1  riastrad 	if (plane_state->uapi.visible)
   12816   1.1  riastrad 		DRM_DEBUG_KMS("\tsrc: " DRM_RECT_FP_FMT " dst: " DRM_RECT_FMT "\n",
   12817   1.1  riastrad 			      DRM_RECT_FP_ARG(&plane_state->uapi.src),
   12818   1.1  riastrad 			      DRM_RECT_ARG(&plane_state->uapi.dst));
   12819   1.1  riastrad }
   12820   1.1  riastrad 
   12821   1.1  riastrad static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
   12822   1.1  riastrad 				   struct intel_atomic_state *state,
   12823   1.1  riastrad 				   const char *context)
   12824   1.1  riastrad {
   12825   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   12826   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   12827   1.1  riastrad 	const struct intel_plane_state *plane_state;
   12828   1.1  riastrad 	struct intel_plane *plane;
   12829   1.1  riastrad 	char buf[64];
   12830   1.1  riastrad 	int i;
   12831   1.1  riastrad 
   12832   1.1  riastrad 	DRM_DEBUG_KMS("[CRTC:%d:%s] enable: %s %s\n",
   12833   1.1  riastrad 		      crtc->base.base.id, crtc->base.name,
   12834   1.1  riastrad 		      yesno(pipe_config->hw.enable), context);
   12835   1.1  riastrad 
   12836   1.1  riastrad 	if (!pipe_config->hw.enable)
   12837   1.1  riastrad 		goto dump_planes;
   12838   1.1  riastrad 
   12839   1.1  riastrad 	snprintf_output_types(buf, sizeof(buf), pipe_config->output_types);
   12840   1.1  riastrad 	DRM_DEBUG_KMS("active: %s, output_types: %s (0x%x), output format: %s\n",
   12841   1.1  riastrad 		      yesno(pipe_config->hw.active),
   12842   1.1  riastrad 		      buf, pipe_config->output_types,
   12843   1.1  riastrad 		      output_formats(pipe_config->output_format));
   12844   1.1  riastrad 
   12845   1.1  riastrad 	DRM_DEBUG_KMS("cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
   12846   1.1  riastrad 		      transcoder_name(pipe_config->cpu_transcoder),
   12847   1.1  riastrad 		      pipe_config->pipe_bpp, pipe_config->dither);
   12848   1.1  riastrad 
   12849   1.1  riastrad 	if (pipe_config->has_pch_encoder)
   12850   1.1  riastrad 		intel_dump_m_n_config(pipe_config, "fdi",
   12851   1.1  riastrad 				      pipe_config->fdi_lanes,
   12852   1.1  riastrad 				      &pipe_config->fdi_m_n);
   12853   1.1  riastrad 
   12854   1.1  riastrad 	if (intel_crtc_has_dp_encoder(pipe_config)) {
   12855   1.1  riastrad 		intel_dump_m_n_config(pipe_config, "dp m_n",
   12856   1.1  riastrad 				pipe_config->lane_count, &pipe_config->dp_m_n);
   12857   1.1  riastrad 		if (pipe_config->has_drrs)
   12858   1.1  riastrad 			intel_dump_m_n_config(pipe_config, "dp m2_n2",
   12859   1.1  riastrad 					      pipe_config->lane_count,
   12860   1.1  riastrad 					      &pipe_config->dp_m2_n2);
   12861   1.1  riastrad 	}
   12862   1.1  riastrad 
   12863   1.1  riastrad 	DRM_DEBUG_KMS("audio: %i, infoframes: %i, infoframes enabled: 0x%x\n",
   12864   1.1  riastrad 		      pipe_config->has_audio, pipe_config->has_infoframe,
   12865   1.1  riastrad 		      pipe_config->infoframes.enable);
   12866   1.1  riastrad 
   12867   1.1  riastrad 	if (pipe_config->infoframes.enable &
   12868   1.1  riastrad 	    intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL))
   12869   1.1  riastrad 		DRM_DEBUG_KMS("GCP: 0x%x\n", pipe_config->infoframes.gcp);
   12870   1.1  riastrad 	if (pipe_config->infoframes.enable &
   12871   1.1  riastrad 	    intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI))
   12872   1.1  riastrad 		intel_dump_infoframe(dev_priv, &pipe_config->infoframes.avi);
   12873   1.1  riastrad 	if (pipe_config->infoframes.enable &
   12874   1.1  riastrad 	    intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD))
   12875   1.1  riastrad 		intel_dump_infoframe(dev_priv, &pipe_config->infoframes.spd);
   12876   1.1  riastrad 	if (pipe_config->infoframes.enable &
   12877   1.1  riastrad 	    intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR))
   12878   1.1  riastrad 		intel_dump_infoframe(dev_priv, &pipe_config->infoframes.hdmi);
   12879   1.1  riastrad 
   12880   1.1  riastrad 	DRM_DEBUG_KMS("requested mode:\n");
   12881   1.1  riastrad 	drm_mode_debug_printmodeline(&pipe_config->hw.mode);
   12882   1.1  riastrad 	DRM_DEBUG_KMS("adjusted mode:\n");
   12883   1.1  riastrad 	drm_mode_debug_printmodeline(&pipe_config->hw.adjusted_mode);
   12884   1.1  riastrad 	intel_dump_crtc_timings(&pipe_config->hw.adjusted_mode);
   12885   1.1  riastrad 	DRM_DEBUG_KMS("port clock: %d, pipe src size: %dx%d, pixel rate %d\n",
   12886   1.1  riastrad 		      pipe_config->port_clock,
   12887   1.1  riastrad 		      pipe_config->pipe_src_w, pipe_config->pipe_src_h,
   12888   1.1  riastrad 		      pipe_config->pixel_rate);
   12889   1.1  riastrad 
   12890   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   12891   1.1  riastrad 		DRM_DEBUG_KMS("num_scalers: %d, scaler_users: 0x%x, scaler_id: %d\n",
   12892   1.1  riastrad 			      crtc->num_scalers,
   12893   1.1  riastrad 			      pipe_config->scaler_state.scaler_users,
   12894   1.1  riastrad 		              pipe_config->scaler_state.scaler_id);
   12895   1.1  riastrad 
   12896   1.1  riastrad 	if (HAS_GMCH(dev_priv))
   12897   1.1  riastrad 		DRM_DEBUG_KMS("gmch pfit: control: 0x%08x, ratios: 0x%08x, lvds border: 0x%08x\n",
   12898   1.1  riastrad 			      pipe_config->gmch_pfit.control,
   12899   1.1  riastrad 			      pipe_config->gmch_pfit.pgm_ratios,
   12900   1.1  riastrad 			      pipe_config->gmch_pfit.lvds_border_bits);
   12901   1.1  riastrad 	else
   12902   1.1  riastrad 		DRM_DEBUG_KMS("pch pfit: pos: 0x%08x, size: 0x%08x, %s, force thru: %s\n",
   12903   1.1  riastrad 			      pipe_config->pch_pfit.pos,
   12904   1.1  riastrad 			      pipe_config->pch_pfit.size,
   12905   1.1  riastrad 			      enableddisabled(pipe_config->pch_pfit.enabled),
   12906   1.1  riastrad 			      yesno(pipe_config->pch_pfit.force_thru));
   12907   1.1  riastrad 
   12908   1.1  riastrad 	DRM_DEBUG_KMS("ips: %i, double wide: %i\n",
   12909   1.1  riastrad 		      pipe_config->ips_enabled, pipe_config->double_wide);
   12910   1.1  riastrad 
   12911   1.1  riastrad 	intel_dpll_dump_hw_state(dev_priv, &pipe_config->dpll_hw_state);
   12912   1.1  riastrad 
   12913   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv))
   12914   1.1  riastrad 		DRM_DEBUG_KMS("cgm_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d csc_enable: %d\n",
   12915   1.1  riastrad 			      pipe_config->cgm_mode, pipe_config->gamma_mode,
   12916   1.1  riastrad 			      pipe_config->gamma_enable, pipe_config->csc_enable);
   12917   1.1  riastrad 	else
   12918   1.1  riastrad 		DRM_DEBUG_KMS("csc_mode: 0x%x gamma_mode: 0x%x gamma_enable: %d csc_enable: %d\n",
   12919   1.1  riastrad 			      pipe_config->csc_mode, pipe_config->gamma_mode,
   12920   1.1  riastrad 			      pipe_config->gamma_enable, pipe_config->csc_enable);
   12921   1.1  riastrad 
   12922   1.1  riastrad 	DRM_DEBUG_KMS("MST master transcoder: %s\n",
   12923   1.1  riastrad 		      transcoder_name(pipe_config->mst_master_transcoder));
   12924   1.1  riastrad 
   12925   1.1  riastrad dump_planes:
   12926   1.1  riastrad 	if (!state)
   12927   1.1  riastrad 		return;
   12928   1.1  riastrad 
   12929   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   12930   1.1  riastrad 		if (plane->pipe == crtc->pipe)
   12931   1.1  riastrad 			intel_dump_plane_state(plane_state);
   12932   1.1  riastrad 	}
   12933   1.1  riastrad }
   12934   1.1  riastrad 
   12935   1.1  riastrad static bool check_digital_port_conflicts(struct intel_atomic_state *state)
   12936   1.1  riastrad {
   12937   1.1  riastrad 	struct drm_device *dev = state->base.dev;
   12938   1.1  riastrad 	struct drm_connector *connector;
   12939   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   12940   1.1  riastrad 	unsigned int used_ports = 0;
   12941   1.1  riastrad 	unsigned int used_mst_ports = 0;
   12942   1.1  riastrad 	bool ret = true;
   12943   1.1  riastrad 
   12944   1.1  riastrad 	/*
   12945   1.1  riastrad 	 * We're going to peek into connector->state,
   12946   1.1  riastrad 	 * hence connection_mutex must be held.
   12947   1.1  riastrad 	 */
   12948   1.1  riastrad 	drm_modeset_lock_assert_held(&dev->mode_config.connection_mutex);
   12949   1.1  riastrad 
   12950   1.1  riastrad 	/*
   12951   1.1  riastrad 	 * Walk the connector list instead of the encoder
   12952   1.1  riastrad 	 * list to detect the problem on ddi platforms
   12953   1.1  riastrad 	 * where there's just one encoder per digital port.
   12954   1.1  riastrad 	 */
   12955   1.1  riastrad 	drm_connector_list_iter_begin(dev, &conn_iter);
   12956   1.1  riastrad 	drm_for_each_connector_iter(connector, &conn_iter) {
   12957   1.1  riastrad 		struct drm_connector_state *connector_state;
   12958   1.1  riastrad 		struct intel_encoder *encoder;
   12959   1.1  riastrad 
   12960   1.1  riastrad 		connector_state =
   12961   1.1  riastrad 			drm_atomic_get_new_connector_state(&state->base,
   12962   1.1  riastrad 							   connector);
   12963   1.1  riastrad 		if (!connector_state)
   12964   1.1  riastrad 			connector_state = connector->state;
   12965   1.1  riastrad 
   12966   1.1  riastrad 		if (!connector_state->best_encoder)
   12967   1.1  riastrad 			continue;
   12968   1.1  riastrad 
   12969   1.1  riastrad 		encoder = to_intel_encoder(connector_state->best_encoder);
   12970   1.1  riastrad 
   12971   1.1  riastrad 		WARN_ON(!connector_state->crtc);
   12972   1.1  riastrad 
   12973   1.1  riastrad 		switch (encoder->type) {
   12974   1.1  riastrad 			unsigned int port_mask;
   12975   1.1  riastrad 		case INTEL_OUTPUT_DDI:
   12976   1.1  riastrad 			if (WARN_ON(!HAS_DDI(to_i915(dev))))
   12977   1.1  riastrad 				break;
   12978   1.1  riastrad 			/* else, fall through */
   12979   1.1  riastrad 		case INTEL_OUTPUT_DP:
   12980   1.1  riastrad 		case INTEL_OUTPUT_HDMI:
   12981   1.1  riastrad 		case INTEL_OUTPUT_EDP:
   12982   1.1  riastrad 			port_mask = 1 << encoder->port;
   12983   1.1  riastrad 
   12984   1.1  riastrad 			/* the same port mustn't appear more than once */
   12985   1.1  riastrad 			if (used_ports & port_mask)
   12986   1.1  riastrad 				ret = false;
   12987   1.1  riastrad 
   12988   1.1  riastrad 			used_ports |= port_mask;
   12989   1.1  riastrad 			break;
   12990   1.1  riastrad 		case INTEL_OUTPUT_DP_MST:
   12991   1.1  riastrad 			used_mst_ports |=
   12992   1.1  riastrad 				1 << encoder->port;
   12993   1.1  riastrad 			break;
   12994   1.1  riastrad 		default:
   12995   1.1  riastrad 			break;
   12996   1.1  riastrad 		}
   12997   1.1  riastrad 	}
   12998   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   12999   1.1  riastrad 
   13000   1.1  riastrad 	/* can't mix MST and SST/HDMI on the same port */
   13001   1.1  riastrad 	if (used_ports & used_mst_ports)
   13002   1.1  riastrad 		return false;
   13003   1.1  riastrad 
   13004   1.1  riastrad 	return ret;
   13005   1.1  riastrad }
   13006   1.1  riastrad 
   13007   1.1  riastrad static void
   13008   1.1  riastrad intel_crtc_copy_uapi_to_hw_state_nomodeset(struct intel_crtc_state *crtc_state)
   13009   1.1  riastrad {
   13010   1.1  riastrad 	intel_crtc_copy_color_blobs(crtc_state);
   13011   1.1  riastrad }
   13012   1.1  riastrad 
   13013   1.1  riastrad static void
   13014   1.1  riastrad intel_crtc_copy_uapi_to_hw_state(struct intel_crtc_state *crtc_state)
   13015   1.1  riastrad {
   13016   1.1  riastrad 	crtc_state->hw.enable = crtc_state->uapi.enable;
   13017   1.1  riastrad 	crtc_state->hw.active = crtc_state->uapi.active;
   13018   1.1  riastrad 	crtc_state->hw.mode = crtc_state->uapi.mode;
   13019   1.1  riastrad 	crtc_state->hw.adjusted_mode = crtc_state->uapi.adjusted_mode;
   13020   1.1  riastrad 	intel_crtc_copy_uapi_to_hw_state_nomodeset(crtc_state);
   13021   1.1  riastrad }
   13022   1.1  riastrad 
   13023   1.1  riastrad static void intel_crtc_copy_hw_to_uapi_state(struct intel_crtc_state *crtc_state)
   13024   1.1  riastrad {
   13025   1.1  riastrad 	crtc_state->uapi.enable = crtc_state->hw.enable;
   13026   1.1  riastrad 	crtc_state->uapi.active = crtc_state->hw.active;
   13027   1.1  riastrad 	WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
   13028   1.1  riastrad 
   13029   1.1  riastrad 	crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
   13030   1.1  riastrad 
   13031   1.1  riastrad 	/* copy color blobs to uapi */
   13032   1.1  riastrad 	drm_property_replace_blob(&crtc_state->uapi.degamma_lut,
   13033   1.1  riastrad 				  crtc_state->hw.degamma_lut);
   13034   1.1  riastrad 	drm_property_replace_blob(&crtc_state->uapi.gamma_lut,
   13035   1.1  riastrad 				  crtc_state->hw.gamma_lut);
   13036   1.1  riastrad 	drm_property_replace_blob(&crtc_state->uapi.ctm,
   13037   1.1  riastrad 				  crtc_state->hw.ctm);
   13038   1.1  riastrad }
   13039   1.1  riastrad 
   13040   1.1  riastrad static int
   13041   1.1  riastrad intel_crtc_prepare_cleared_state(struct intel_crtc_state *crtc_state)
   13042   1.1  riastrad {
   13043   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   13044   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   13045   1.1  riastrad 	struct intel_crtc_state *saved_state;
   13046   1.1  riastrad 
   13047   1.1  riastrad 	saved_state = intel_crtc_state_alloc(crtc);
   13048   1.1  riastrad 	if (!saved_state)
   13049   1.1  riastrad 		return -ENOMEM;
   13050   1.1  riastrad 
   13051   1.1  riastrad 	/* free the old crtc_state->hw members */
   13052   1.1  riastrad 	intel_crtc_free_hw_state(crtc_state);
   13053   1.1  riastrad 
   13054   1.1  riastrad 	/* FIXME: before the switch to atomic started, a new pipe_config was
   13055   1.1  riastrad 	 * kzalloc'd. Code that depends on any field being zero should be
   13056   1.1  riastrad 	 * fixed, so that the crtc_state can be safely duplicated. For now,
   13057   1.1  riastrad 	 * only fields that are know to not cause problems are preserved. */
   13058   1.1  riastrad 
   13059   1.1  riastrad 	saved_state->uapi = crtc_state->uapi;
   13060   1.1  riastrad 	saved_state->scaler_state = crtc_state->scaler_state;
   13061   1.1  riastrad 	saved_state->shared_dpll = crtc_state->shared_dpll;
   13062   1.1  riastrad 	saved_state->dpll_hw_state = crtc_state->dpll_hw_state;
   13063   1.1  riastrad 	memcpy(saved_state->icl_port_dplls, crtc_state->icl_port_dplls,
   13064   1.1  riastrad 	       sizeof(saved_state->icl_port_dplls));
   13065   1.1  riastrad 	saved_state->crc_enabled = crtc_state->crc_enabled;
   13066   1.1  riastrad 	if (IS_G4X(dev_priv) ||
   13067   1.1  riastrad 	    IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13068   1.1  riastrad 		saved_state->wm = crtc_state->wm;
   13069   1.1  riastrad 	/*
   13070   1.1  riastrad 	 * Save the slave bitmask which gets filled for master crtc state during
   13071   1.1  riastrad 	 * slave atomic check call. For all other CRTCs reset the port sync variables
   13072   1.1  riastrad 	 * crtc_state->master_transcoder needs to be set to INVALID
   13073   1.1  riastrad 	 */
   13074   1.1  riastrad 	reset_port_sync_mode_state(saved_state);
   13075   1.1  riastrad 	if (intel_atomic_is_master_connector(crtc_state))
   13076   1.1  riastrad 		saved_state->sync_mode_slaves_mask =
   13077   1.1  riastrad 			crtc_state->sync_mode_slaves_mask;
   13078   1.1  riastrad 
   13079   1.1  riastrad 	memcpy(crtc_state, saved_state, sizeof(*crtc_state));
   13080   1.1  riastrad 	kfree(saved_state);
   13081   1.1  riastrad 
   13082   1.1  riastrad 	intel_crtc_copy_uapi_to_hw_state(crtc_state);
   13083   1.1  riastrad 
   13084   1.1  riastrad 	return 0;
   13085   1.1  riastrad }
   13086   1.1  riastrad 
   13087   1.1  riastrad static int
   13088   1.1  riastrad intel_modeset_pipe_config(struct intel_crtc_state *pipe_config)
   13089   1.1  riastrad {
   13090   1.1  riastrad 	struct drm_crtc *crtc = pipe_config->uapi.crtc;
   13091   1.1  riastrad 	struct drm_atomic_state *state = pipe_config->uapi.state;
   13092   1.1  riastrad 	struct intel_encoder *encoder;
   13093   1.1  riastrad 	struct drm_connector *connector;
   13094   1.1  riastrad 	struct drm_connector_state *connector_state;
   13095   1.1  riastrad 	int base_bpp, ret;
   13096   1.1  riastrad 	int i, tile_group_id = -1, num_tiled_conns = 0;
   13097   1.1  riastrad 	bool retry = true;
   13098   1.1  riastrad 
   13099   1.1  riastrad 	pipe_config->cpu_transcoder =
   13100   1.1  riastrad 		(enum transcoder) to_intel_crtc(crtc)->pipe;
   13101   1.1  riastrad 
   13102   1.1  riastrad 	/*
   13103   1.1  riastrad 	 * Sanitize sync polarity flags based on requested ones. If neither
   13104   1.1  riastrad 	 * positive or negative polarity is requested, treat this as meaning
   13105   1.1  riastrad 	 * negative polarity.
   13106   1.1  riastrad 	 */
   13107   1.1  riastrad 	if (!(pipe_config->hw.adjusted_mode.flags &
   13108   1.1  riastrad 	      (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC)))
   13109   1.1  riastrad 		pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_NHSYNC;
   13110   1.1  riastrad 
   13111   1.1  riastrad 	if (!(pipe_config->hw.adjusted_mode.flags &
   13112   1.1  riastrad 	      (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC)))
   13113   1.1  riastrad 		pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_NVSYNC;
   13114   1.1  riastrad 
   13115   1.1  riastrad 	ret = compute_baseline_pipe_bpp(to_intel_crtc(crtc),
   13116   1.1  riastrad 					pipe_config);
   13117   1.1  riastrad 	if (ret)
   13118   1.1  riastrad 		return ret;
   13119   1.1  riastrad 
   13120   1.1  riastrad 	base_bpp = pipe_config->pipe_bpp;
   13121   1.1  riastrad 
   13122   1.1  riastrad 	/*
   13123   1.1  riastrad 	 * Determine the real pipe dimensions. Note that stereo modes can
   13124   1.1  riastrad 	 * increase the actual pipe size due to the frame doubling and
   13125   1.1  riastrad 	 * insertion of additional space for blanks between the frame. This
   13126   1.1  riastrad 	 * is stored in the crtc timings. We use the requested mode to do this
   13127   1.1  riastrad 	 * computation to clearly distinguish it from the adjusted mode, which
   13128   1.1  riastrad 	 * can be changed by the connectors in the below retry loop.
   13129   1.1  riastrad 	 */
   13130   1.1  riastrad 	drm_mode_get_hv_timing(&pipe_config->hw.mode,
   13131   1.1  riastrad 			       &pipe_config->pipe_src_w,
   13132   1.1  riastrad 			       &pipe_config->pipe_src_h);
   13133   1.1  riastrad 
   13134   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   13135   1.1  riastrad 		if (connector_state->crtc != crtc)
   13136   1.1  riastrad 			continue;
   13137   1.1  riastrad 
   13138   1.1  riastrad 		encoder = to_intel_encoder(connector_state->best_encoder);
   13139   1.1  riastrad 
   13140   1.1  riastrad 		if (!check_single_encoder_cloning(state, to_intel_crtc(crtc), encoder)) {
   13141   1.1  riastrad 			DRM_DEBUG_KMS("rejecting invalid cloning configuration\n");
   13142   1.1  riastrad 			return -EINVAL;
   13143   1.1  riastrad 		}
   13144   1.1  riastrad 
   13145   1.1  riastrad 		/*
   13146   1.1  riastrad 		 * Determine output_types before calling the .compute_config()
   13147   1.1  riastrad 		 * hooks so that the hooks can use this information safely.
   13148   1.1  riastrad 		 */
   13149   1.1  riastrad 		if (encoder->compute_output_type)
   13150   1.1  riastrad 			pipe_config->output_types |=
   13151   1.1  riastrad 				BIT(encoder->compute_output_type(encoder, pipe_config,
   13152   1.1  riastrad 								 connector_state));
   13153   1.1  riastrad 		else
   13154   1.1  riastrad 			pipe_config->output_types |= BIT(encoder->type);
   13155   1.1  riastrad 	}
   13156   1.1  riastrad 
   13157   1.1  riastrad encoder_retry:
   13158   1.1  riastrad 	/* Ensure the port clock defaults are reset when retrying. */
   13159   1.1  riastrad 	pipe_config->port_clock = 0;
   13160   1.1  riastrad 	pipe_config->pixel_multiplier = 1;
   13161   1.1  riastrad 
   13162   1.1  riastrad 	/* Fill in default crtc timings, allow encoders to overwrite them. */
   13163   1.1  riastrad 	drm_mode_set_crtcinfo(&pipe_config->hw.adjusted_mode,
   13164   1.1  riastrad 			      CRTC_STEREO_DOUBLE);
   13165   1.1  riastrad 
   13166   1.1  riastrad 	/* Get tile_group_id of tiled connector */
   13167   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   13168   1.1  riastrad 		if (connector_state->crtc == crtc &&
   13169   1.1  riastrad 		    connector->has_tile) {
   13170   1.1  riastrad 			tile_group_id = connector->tile_group->id;
   13171   1.1  riastrad 			break;
   13172   1.1  riastrad 		}
   13173   1.1  riastrad 	}
   13174   1.1  riastrad 
   13175   1.1  riastrad 	/* Get total number of tiled connectors in state that belong to
   13176   1.1  riastrad 	 * this tile group.
   13177   1.1  riastrad 	 */
   13178   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   13179   1.1  riastrad 		if (connector->has_tile &&
   13180   1.1  riastrad 		    connector->tile_group->id == tile_group_id)
   13181   1.1  riastrad 			num_tiled_conns++;
   13182   1.1  riastrad 	}
   13183   1.1  riastrad 
   13184   1.1  riastrad 	/* Pass our mode to the connectors and the CRTC to give them a chance to
   13185   1.1  riastrad 	 * adjust it according to limitations or connector properties, and also
   13186   1.1  riastrad 	 * a chance to reject the mode entirely.
   13187   1.1  riastrad 	 */
   13188   1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   13189   1.1  riastrad 		if (connector_state->crtc != crtc)
   13190   1.1  riastrad 			continue;
   13191   1.1  riastrad 
   13192   1.1  riastrad 		ret = icl_compute_port_sync_crtc_state(connector, pipe_config,
   13193   1.1  riastrad 						       num_tiled_conns);
   13194   1.1  riastrad 		if (ret) {
   13195   1.1  riastrad 			DRM_DEBUG_KMS("Cannot assign Sync Mode CRTCs: %d\n",
   13196   1.1  riastrad 				      ret);
   13197   1.1  riastrad 			return ret;
   13198   1.1  riastrad 		}
   13199   1.1  riastrad 
   13200   1.1  riastrad 		encoder = to_intel_encoder(connector_state->best_encoder);
   13201   1.1  riastrad 		ret = encoder->compute_config(encoder, pipe_config,
   13202   1.1  riastrad 					      connector_state);
   13203   1.1  riastrad 		if (ret < 0) {
   13204   1.1  riastrad 			if (ret != -EDEADLK)
   13205   1.1  riastrad 				DRM_DEBUG_KMS("Encoder config failure: %d\n",
   13206   1.1  riastrad 					      ret);
   13207   1.1  riastrad 			return ret;
   13208   1.1  riastrad 		}
   13209   1.1  riastrad 	}
   13210   1.1  riastrad 
   13211   1.1  riastrad 	/* Set default port clock if not overwritten by the encoder. Needs to be
   13212   1.1  riastrad 	 * done afterwards in case the encoder adjusts the mode. */
   13213   1.1  riastrad 	if (!pipe_config->port_clock)
   13214   1.1  riastrad 		pipe_config->port_clock = pipe_config->hw.adjusted_mode.crtc_clock
   13215   1.1  riastrad 			* pipe_config->pixel_multiplier;
   13216   1.1  riastrad 
   13217   1.1  riastrad 	ret = intel_crtc_compute_config(to_intel_crtc(crtc), pipe_config);
   13218   1.1  riastrad 	if (ret == -EDEADLK)
   13219   1.1  riastrad 		return ret;
   13220   1.1  riastrad 	if (ret < 0) {
   13221   1.1  riastrad 		DRM_DEBUG_KMS("CRTC fixup failed\n");
   13222   1.1  riastrad 		return ret;
   13223   1.1  riastrad 	}
   13224   1.1  riastrad 
   13225   1.1  riastrad 	if (ret == RETRY) {
   13226   1.1  riastrad 		if (WARN(!retry, "loop in pipe configuration computation\n"))
   13227   1.1  riastrad 			return -EINVAL;
   13228   1.1  riastrad 
   13229   1.1  riastrad 		DRM_DEBUG_KMS("CRTC bw constrained, retrying\n");
   13230   1.1  riastrad 		retry = false;
   13231   1.1  riastrad 		goto encoder_retry;
   13232   1.1  riastrad 	}
   13233   1.1  riastrad 
   13234   1.1  riastrad 	/* Dithering seems to not pass-through bits correctly when it should, so
   13235   1.1  riastrad 	 * only enable it on 6bpc panels and when its not a compliance
   13236   1.1  riastrad 	 * test requesting 6bpc video pattern.
   13237   1.1  riastrad 	 */
   13238   1.1  riastrad 	pipe_config->dither = (pipe_config->pipe_bpp == 6*3) &&
   13239   1.1  riastrad 		!pipe_config->dither_force_disable;
   13240   1.1  riastrad 	DRM_DEBUG_KMS("hw max bpp: %i, pipe bpp: %i, dithering: %i\n",
   13241   1.1  riastrad 		      base_bpp, pipe_config->pipe_bpp, pipe_config->dither);
   13242   1.1  riastrad 
   13243   1.1  riastrad 	/*
   13244   1.1  riastrad 	 * Make drm_calc_timestamping_constants in
   13245   1.1  riastrad 	 * drm_atomic_helper_update_legacy_modeset_state() happy
   13246   1.1  riastrad 	 */
   13247   1.1  riastrad 	pipe_config->uapi.adjusted_mode = pipe_config->hw.adjusted_mode;
   13248   1.1  riastrad 
   13249   1.1  riastrad 	return 0;
   13250   1.1  riastrad }
   13251   1.1  riastrad 
   13252   1.1  riastrad bool intel_fuzzy_clock_check(int clock1, int clock2)
   13253   1.1  riastrad {
   13254   1.1  riastrad 	int diff;
   13255   1.1  riastrad 
   13256   1.1  riastrad 	if (clock1 == clock2)
   13257   1.1  riastrad 		return true;
   13258   1.1  riastrad 
   13259   1.1  riastrad 	if (!clock1 || !clock2)
   13260   1.1  riastrad 		return false;
   13261   1.1  riastrad 
   13262   1.1  riastrad 	diff = abs(clock1 - clock2);
   13263   1.1  riastrad 
   13264   1.1  riastrad 	if (((((diff + clock1 + clock2) * 100)) / (clock1 + clock2)) < 105)
   13265   1.1  riastrad 		return true;
   13266   1.1  riastrad 
   13267   1.1  riastrad 	return false;
   13268   1.1  riastrad }
   13269   1.1  riastrad 
   13270   1.1  riastrad static bool
   13271   1.1  riastrad intel_compare_m_n(unsigned int m, unsigned int n,
   13272   1.1  riastrad 		  unsigned int m2, unsigned int n2,
   13273   1.1  riastrad 		  bool exact)
   13274   1.1  riastrad {
   13275   1.1  riastrad 	if (m == m2 && n == n2)
   13276   1.1  riastrad 		return true;
   13277   1.1  riastrad 
   13278   1.1  riastrad 	if (exact || !m || !n || !m2 || !n2)
   13279   1.1  riastrad 		return false;
   13280   1.1  riastrad 
   13281   1.1  riastrad 	BUILD_BUG_ON(DATA_LINK_M_N_MASK > INT_MAX);
   13282   1.1  riastrad 
   13283   1.1  riastrad 	if (n > n2) {
   13284   1.1  riastrad 		while (n > n2) {
   13285   1.1  riastrad 			m2 <<= 1;
   13286   1.1  riastrad 			n2 <<= 1;
   13287   1.1  riastrad 		}
   13288   1.1  riastrad 	} else if (n < n2) {
   13289   1.1  riastrad 		while (n < n2) {
   13290   1.1  riastrad 			m <<= 1;
   13291   1.1  riastrad 			n <<= 1;
   13292   1.1  riastrad 		}
   13293   1.1  riastrad 	}
   13294   1.1  riastrad 
   13295   1.1  riastrad 	if (n != n2)
   13296   1.1  riastrad 		return false;
   13297   1.1  riastrad 
   13298   1.1  riastrad 	return intel_fuzzy_clock_check(m, m2);
   13299   1.1  riastrad }
   13300   1.1  riastrad 
   13301   1.1  riastrad static bool
   13302   1.1  riastrad intel_compare_link_m_n(const struct intel_link_m_n *m_n,
   13303   1.1  riastrad 		       const struct intel_link_m_n *m2_n2,
   13304   1.1  riastrad 		       bool exact)
   13305   1.1  riastrad {
   13306   1.1  riastrad 	return m_n->tu == m2_n2->tu &&
   13307   1.1  riastrad 		intel_compare_m_n(m_n->gmch_m, m_n->gmch_n,
   13308   1.1  riastrad 				  m2_n2->gmch_m, m2_n2->gmch_n, exact) &&
   13309   1.1  riastrad 		intel_compare_m_n(m_n->link_m, m_n->link_n,
   13310   1.1  riastrad 				  m2_n2->link_m, m2_n2->link_n, exact);
   13311   1.1  riastrad }
   13312   1.1  riastrad 
   13313   1.1  riastrad static bool
   13314   1.1  riastrad intel_compare_infoframe(const union hdmi_infoframe *a,
   13315   1.1  riastrad 			const union hdmi_infoframe *b)
   13316   1.1  riastrad {
   13317   1.1  riastrad 	return memcmp(a, b, sizeof(*a)) == 0;
   13318   1.1  riastrad }
   13319   1.1  riastrad 
   13320   1.1  riastrad static void
   13321   1.1  riastrad pipe_config_infoframe_mismatch(struct drm_i915_private *dev_priv,
   13322   1.1  riastrad 			       bool fastset, const char *name,
   13323   1.1  riastrad 			       const union hdmi_infoframe *a,
   13324   1.1  riastrad 			       const union hdmi_infoframe *b)
   13325   1.1  riastrad {
   13326   1.1  riastrad 	if (fastset) {
   13327   1.1  riastrad 		if (!drm_debug_enabled(DRM_UT_KMS))
   13328   1.1  riastrad 			return;
   13329   1.1  riastrad 
   13330   1.1  riastrad 		DRM_DEBUG_KMS("fastset mismatch in %s infoframe\n", name);
   13331   1.1  riastrad 		DRM_DEBUG_KMS("expected:\n");
   13332   1.1  riastrad 		hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, a);
   13333   1.1  riastrad 		DRM_DEBUG_KMS("found:\n");
   13334   1.1  riastrad 		hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, b);
   13335   1.1  riastrad 	} else {
   13336   1.1  riastrad 		DRM_ERROR("mismatch in %s infoframe\n", name);
   13337   1.1  riastrad 		DRM_ERROR("expected:\n");
   13338   1.1  riastrad 		hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, a);
   13339   1.1  riastrad 		DRM_ERROR("found:\n");
   13340   1.1  riastrad 		hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, b);
   13341   1.1  riastrad 	}
   13342   1.1  riastrad }
   13343   1.1  riastrad 
   13344   1.1  riastrad static void __printf(4, 5)
   13345   1.1  riastrad pipe_config_mismatch(bool fastset, const struct intel_crtc *crtc,
   13346   1.1  riastrad 		     const char *name, const char *format, ...)
   13347   1.1  riastrad {
   13348   1.1  riastrad 	struct va_format vaf;
   13349   1.1  riastrad 	va_list args;
   13350   1.1  riastrad 
   13351   1.1  riastrad 	va_start(args, format);
   13352   1.1  riastrad 	vaf.fmt = format;
   13353   1.1  riastrad 	vaf.va = &args;
   13354   1.1  riastrad 
   13355   1.1  riastrad 	if (fastset)
   13356   1.1  riastrad 		DRM_DEBUG_KMS("[CRTC:%d:%s] fastset mismatch in %s %pV\n",
   13357   1.1  riastrad 			      crtc->base.base.id, crtc->base.name, name, &vaf);
   13358   1.1  riastrad 	else
   13359   1.1  riastrad 		DRM_ERROR("[CRTC:%d:%s] mismatch in %s %pV\n",
   13360   1.1  riastrad 			  crtc->base.base.id, crtc->base.name, name, &vaf);
   13361   1.1  riastrad 
   13362   1.1  riastrad 	va_end(args);
   13363   1.1  riastrad }
   13364   1.1  riastrad 
   13365   1.1  riastrad static bool fastboot_enabled(struct drm_i915_private *dev_priv)
   13366   1.1  riastrad {
   13367   1.1  riastrad 	if (i915_modparams.fastboot != -1)
   13368   1.1  riastrad 		return i915_modparams.fastboot;
   13369   1.1  riastrad 
   13370   1.1  riastrad 	/* Enable fastboot by default on Skylake and newer */
   13371   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   13372   1.1  riastrad 		return true;
   13373   1.1  riastrad 
   13374   1.1  riastrad 	/* Enable fastboot by default on VLV and CHV */
   13375   1.1  riastrad 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13376   1.1  riastrad 		return true;
   13377   1.1  riastrad 
   13378   1.1  riastrad 	/* Disabled by default on all others */
   13379   1.1  riastrad 	return false;
   13380   1.1  riastrad }
   13381   1.1  riastrad 
   13382   1.1  riastrad static bool
   13383   1.1  riastrad intel_pipe_config_compare(const struct intel_crtc_state *current_config,
   13384   1.1  riastrad 			  const struct intel_crtc_state *pipe_config,
   13385   1.1  riastrad 			  bool fastset)
   13386   1.1  riastrad {
   13387   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(current_config->uapi.crtc->dev);
   13388   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   13389   1.1  riastrad 	bool ret = true;
   13390   1.1  riastrad 	u32 bp_gamma = 0;
   13391   1.1  riastrad 	bool fixup_inherited = fastset &&
   13392   1.1  riastrad 		(current_config->hw.mode.private_flags & I915_MODE_FLAG_INHERITED) &&
   13393   1.1  riastrad 		!(pipe_config->hw.mode.private_flags & I915_MODE_FLAG_INHERITED);
   13394   1.1  riastrad 
   13395   1.1  riastrad 	if (fixup_inherited && !fastboot_enabled(dev_priv)) {
   13396   1.1  riastrad 		DRM_DEBUG_KMS("initial modeset and fastboot not set\n");
   13397   1.1  riastrad 		ret = false;
   13398   1.1  riastrad 	}
   13399   1.1  riastrad 
   13400   1.1  riastrad #define PIPE_CONF_CHECK_X(name) do { \
   13401   1.1  riastrad 	if (current_config->name != pipe_config->name) { \
   13402   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13403   1.1  riastrad 				     "(expected 0x%08x, found 0x%08x)", \
   13404   1.1  riastrad 				     current_config->name, \
   13405   1.1  riastrad 				     pipe_config->name); \
   13406   1.1  riastrad 		ret = false; \
   13407   1.1  riastrad 	} \
   13408   1.1  riastrad } while (0)
   13409   1.1  riastrad 
   13410   1.1  riastrad #define PIPE_CONF_CHECK_I(name) do { \
   13411   1.1  riastrad 	if (current_config->name != pipe_config->name) { \
   13412   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13413   1.1  riastrad 				     "(expected %i, found %i)", \
   13414   1.1  riastrad 				     current_config->name, \
   13415   1.1  riastrad 				     pipe_config->name); \
   13416   1.1  riastrad 		ret = false; \
   13417   1.1  riastrad 	} \
   13418   1.1  riastrad } while (0)
   13419   1.1  riastrad 
   13420   1.1  riastrad #define PIPE_CONF_CHECK_BOOL(name) do { \
   13421   1.1  riastrad 	if (current_config->name != pipe_config->name) { \
   13422   1.1  riastrad 		pipe_config_mismatch(fastset, crtc,  __stringify(name), \
   13423   1.1  riastrad 				     "(expected %s, found %s)", \
   13424   1.1  riastrad 				     yesno(current_config->name), \
   13425   1.1  riastrad 				     yesno(pipe_config->name)); \
   13426   1.1  riastrad 		ret = false; \
   13427   1.1  riastrad 	} \
   13428   1.1  riastrad } while (0)
   13429   1.1  riastrad 
   13430   1.1  riastrad /*
   13431   1.1  riastrad  * Checks state where we only read out the enabling, but not the entire
   13432   1.1  riastrad  * state itself (like full infoframes or ELD for audio). These states
   13433   1.1  riastrad  * require a full modeset on bootup to fix up.
   13434   1.1  riastrad  */
   13435   1.1  riastrad #define PIPE_CONF_CHECK_BOOL_INCOMPLETE(name) do { \
   13436   1.1  riastrad 	if (!fixup_inherited || (!current_config->name && !pipe_config->name)) { \
   13437   1.1  riastrad 		PIPE_CONF_CHECK_BOOL(name); \
   13438   1.1  riastrad 	} else { \
   13439   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13440   1.1  riastrad 				     "unable to verify whether state matches exactly, forcing modeset (expected %s, found %s)", \
   13441   1.1  riastrad 				     yesno(current_config->name), \
   13442   1.1  riastrad 				     yesno(pipe_config->name)); \
   13443   1.1  riastrad 		ret = false; \
   13444   1.1  riastrad 	} \
   13445   1.1  riastrad } while (0)
   13446   1.1  riastrad 
   13447   1.1  riastrad #define PIPE_CONF_CHECK_P(name) do { \
   13448   1.1  riastrad 	if (current_config->name != pipe_config->name) { \
   13449   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13450   1.1  riastrad 				     "(expected %p, found %p)", \
   13451   1.1  riastrad 				     current_config->name, \
   13452   1.1  riastrad 				     pipe_config->name); \
   13453   1.1  riastrad 		ret = false; \
   13454   1.1  riastrad 	} \
   13455   1.1  riastrad } while (0)
   13456   1.1  riastrad 
   13457   1.1  riastrad #define PIPE_CONF_CHECK_M_N(name) do { \
   13458   1.1  riastrad 	if (!intel_compare_link_m_n(&current_config->name, \
   13459   1.1  riastrad 				    &pipe_config->name,\
   13460   1.1  riastrad 				    !fastset)) { \
   13461   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13462   1.1  riastrad 				     "(expected tu %i gmch %i/%i link %i/%i, " \
   13463   1.1  riastrad 				     "found tu %i, gmch %i/%i link %i/%i)", \
   13464   1.1  riastrad 				     current_config->name.tu, \
   13465   1.1  riastrad 				     current_config->name.gmch_m, \
   13466   1.1  riastrad 				     current_config->name.gmch_n, \
   13467   1.1  riastrad 				     current_config->name.link_m, \
   13468   1.1  riastrad 				     current_config->name.link_n, \
   13469   1.1  riastrad 				     pipe_config->name.tu, \
   13470   1.1  riastrad 				     pipe_config->name.gmch_m, \
   13471   1.1  riastrad 				     pipe_config->name.gmch_n, \
   13472   1.1  riastrad 				     pipe_config->name.link_m, \
   13473   1.1  riastrad 				     pipe_config->name.link_n); \
   13474   1.1  riastrad 		ret = false; \
   13475   1.1  riastrad 	} \
   13476   1.1  riastrad } while (0)
   13477   1.1  riastrad 
   13478   1.1  riastrad /* This is required for BDW+ where there is only one set of registers for
   13479   1.1  riastrad  * switching between high and low RR.
   13480   1.1  riastrad  * This macro can be used whenever a comparison has to be made between one
   13481   1.1  riastrad  * hw state and multiple sw state variables.
   13482   1.1  riastrad  */
   13483   1.1  riastrad #define PIPE_CONF_CHECK_M_N_ALT(name, alt_name) do { \
   13484   1.1  riastrad 	if (!intel_compare_link_m_n(&current_config->name, \
   13485   1.1  riastrad 				    &pipe_config->name, !fastset) && \
   13486   1.1  riastrad 	    !intel_compare_link_m_n(&current_config->alt_name, \
   13487   1.1  riastrad 				    &pipe_config->name, !fastset)) { \
   13488   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13489   1.1  riastrad 				     "(expected tu %i gmch %i/%i link %i/%i, " \
   13490   1.1  riastrad 				     "or tu %i gmch %i/%i link %i/%i, " \
   13491   1.1  riastrad 				     "found tu %i, gmch %i/%i link %i/%i)", \
   13492   1.1  riastrad 				     current_config->name.tu, \
   13493   1.1  riastrad 				     current_config->name.gmch_m, \
   13494   1.1  riastrad 				     current_config->name.gmch_n, \
   13495   1.1  riastrad 				     current_config->name.link_m, \
   13496   1.1  riastrad 				     current_config->name.link_n, \
   13497   1.1  riastrad 				     current_config->alt_name.tu, \
   13498   1.1  riastrad 				     current_config->alt_name.gmch_m, \
   13499   1.1  riastrad 				     current_config->alt_name.gmch_n, \
   13500   1.1  riastrad 				     current_config->alt_name.link_m, \
   13501   1.1  riastrad 				     current_config->alt_name.link_n, \
   13502   1.1  riastrad 				     pipe_config->name.tu, \
   13503   1.1  riastrad 				     pipe_config->name.gmch_m, \
   13504   1.1  riastrad 				     pipe_config->name.gmch_n, \
   13505   1.1  riastrad 				     pipe_config->name.link_m, \
   13506   1.1  riastrad 				     pipe_config->name.link_n); \
   13507   1.1  riastrad 		ret = false; \
   13508   1.1  riastrad 	} \
   13509   1.1  riastrad } while (0)
   13510   1.1  riastrad 
   13511   1.1  riastrad #define PIPE_CONF_CHECK_FLAGS(name, mask) do { \
   13512   1.1  riastrad 	if ((current_config->name ^ pipe_config->name) & (mask)) { \
   13513   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13514   1.1  riastrad 				     "(%x) (expected %i, found %i)", \
   13515   1.1  riastrad 				     (mask), \
   13516   1.1  riastrad 				     current_config->name & (mask), \
   13517   1.1  riastrad 				     pipe_config->name & (mask)); \
   13518   1.1  riastrad 		ret = false; \
   13519   1.1  riastrad 	} \
   13520   1.1  riastrad } while (0)
   13521   1.1  riastrad 
   13522   1.1  riastrad #define PIPE_CONF_CHECK_CLOCK_FUZZY(name) do { \
   13523   1.1  riastrad 	if (!intel_fuzzy_clock_check(current_config->name, pipe_config->name)) { \
   13524   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name), \
   13525   1.1  riastrad 				     "(expected %i, found %i)", \
   13526   1.1  riastrad 				     current_config->name, \
   13527   1.1  riastrad 				     pipe_config->name); \
   13528   1.1  riastrad 		ret = false; \
   13529   1.1  riastrad 	} \
   13530   1.1  riastrad } while (0)
   13531   1.1  riastrad 
   13532   1.1  riastrad #define PIPE_CONF_CHECK_INFOFRAME(name) do { \
   13533   1.1  riastrad 	if (!intel_compare_infoframe(&current_config->infoframes.name, \
   13534   1.1  riastrad 				     &pipe_config->infoframes.name)) { \
   13535   1.1  riastrad 		pipe_config_infoframe_mismatch(dev_priv, fastset, __stringify(name), \
   13536   1.1  riastrad 					       &current_config->infoframes.name, \
   13537   1.1  riastrad 					       &pipe_config->infoframes.name); \
   13538   1.1  riastrad 		ret = false; \
   13539   1.1  riastrad 	} \
   13540   1.1  riastrad } while (0)
   13541   1.1  riastrad 
   13542   1.1  riastrad #define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \
   13543   1.1  riastrad 	if (current_config->name1 != pipe_config->name1) { \
   13544   1.1  riastrad 		pipe_config_mismatch(fastset, crtc, __stringify(name1), \
   13545   1.1  riastrad 				"(expected %i, found %i, won't compare lut values)", \
   13546   1.1  riastrad 				current_config->name1, \
   13547   1.1  riastrad 				pipe_config->name1); \
   13548   1.1  riastrad 		ret = false;\
   13549   1.1  riastrad 	} else { \
   13550   1.1  riastrad 		if (!intel_color_lut_equal(current_config->name2, \
   13551   1.1  riastrad 					pipe_config->name2, pipe_config->name1, \
   13552   1.1  riastrad 					bit_precision)) { \
   13553   1.1  riastrad 			pipe_config_mismatch(fastset, crtc, __stringify(name2), \
   13554   1.1  riastrad 					"hw_state doesn't match sw_state"); \
   13555   1.1  riastrad 			ret = false; \
   13556   1.1  riastrad 		} \
   13557   1.1  riastrad 	} \
   13558   1.1  riastrad } while (0)
   13559   1.1  riastrad 
   13560   1.1  riastrad #define PIPE_CONF_QUIRK(quirk) \
   13561   1.1  riastrad 	((current_config->quirks | pipe_config->quirks) & (quirk))
   13562   1.1  riastrad 
   13563   1.1  riastrad 	PIPE_CONF_CHECK_I(cpu_transcoder);
   13564   1.1  riastrad 
   13565   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(has_pch_encoder);
   13566   1.1  riastrad 	PIPE_CONF_CHECK_I(fdi_lanes);
   13567   1.1  riastrad 	PIPE_CONF_CHECK_M_N(fdi_m_n);
   13568   1.1  riastrad 
   13569   1.1  riastrad 	PIPE_CONF_CHECK_I(lane_count);
   13570   1.1  riastrad 	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
   13571   1.1  riastrad 
   13572   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 8) {
   13573   1.1  riastrad 		PIPE_CONF_CHECK_M_N(dp_m_n);
   13574   1.1  riastrad 
   13575   1.1  riastrad 		if (current_config->has_drrs)
   13576   1.1  riastrad 			PIPE_CONF_CHECK_M_N(dp_m2_n2);
   13577   1.1  riastrad 	} else
   13578   1.1  riastrad 		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
   13579   1.1  riastrad 
   13580   1.1  riastrad 	PIPE_CONF_CHECK_X(output_types);
   13581   1.1  riastrad 
   13582   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hdisplay);
   13583   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_htotal);
   13584   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hblank_start);
   13585   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hblank_end);
   13586   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hsync_start);
   13587   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_hsync_end);
   13588   1.1  riastrad 
   13589   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vdisplay);
   13590   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vtotal);
   13591   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vblank_start);
   13592   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vblank_end);
   13593   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vsync_start);
   13594   1.1  riastrad 	PIPE_CONF_CHECK_I(hw.adjusted_mode.crtc_vsync_end);
   13595   1.1  riastrad 
   13596   1.1  riastrad 	PIPE_CONF_CHECK_I(pixel_multiplier);
   13597   1.1  riastrad 	PIPE_CONF_CHECK_I(output_format);
   13598   1.1  riastrad 	PIPE_CONF_CHECK_I(dc3co_exitline);
   13599   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(has_hdmi_sink);
   13600   1.1  riastrad 	if ((INTEL_GEN(dev_priv) < 8 && !IS_HASWELL(dev_priv)) ||
   13601   1.1  riastrad 	    IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   13602   1.1  riastrad 		PIPE_CONF_CHECK_BOOL(limited_color_range);
   13603   1.1  riastrad 
   13604   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(hdmi_scrambling);
   13605   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio);
   13606   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(has_infoframe);
   13607   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(fec_enable);
   13608   1.1  riastrad 
   13609   1.1  riastrad 	PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio);
   13610   1.1  riastrad 
   13611   1.1  riastrad 	PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13612   1.1  riastrad 			      DRM_MODE_FLAG_INTERLACE);
   13613   1.1  riastrad 
   13614   1.1  riastrad 	if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS)) {
   13615   1.1  riastrad 		PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13616   1.1  riastrad 				      DRM_MODE_FLAG_PHSYNC);
   13617   1.1  riastrad 		PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13618   1.1  riastrad 				      DRM_MODE_FLAG_NHSYNC);
   13619   1.1  riastrad 		PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13620   1.1  riastrad 				      DRM_MODE_FLAG_PVSYNC);
   13621   1.1  riastrad 		PIPE_CONF_CHECK_FLAGS(hw.adjusted_mode.flags,
   13622   1.1  riastrad 				      DRM_MODE_FLAG_NVSYNC);
   13623   1.1  riastrad 	}
   13624   1.1  riastrad 
   13625   1.1  riastrad 	PIPE_CONF_CHECK_X(gmch_pfit.control);
   13626   1.1  riastrad 	/* pfit ratios are autocomputed by the hw on gen4+ */
   13627   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4)
   13628   1.1  riastrad 		PIPE_CONF_CHECK_X(gmch_pfit.pgm_ratios);
   13629   1.1  riastrad 	PIPE_CONF_CHECK_X(gmch_pfit.lvds_border_bits);
   13630   1.1  riastrad 
   13631   1.1  riastrad 	/*
   13632   1.1  riastrad 	 * Changing the EDP transcoder input mux
   13633   1.1  riastrad 	 * (A_ONOFF vs. A_ON) requires a full modeset.
   13634   1.1  riastrad 	 */
   13635   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(pch_pfit.force_thru);
   13636   1.1  riastrad 
   13637   1.1  riastrad 	if (!fastset) {
   13638   1.1  riastrad 		PIPE_CONF_CHECK_I(pipe_src_w);
   13639   1.1  riastrad 		PIPE_CONF_CHECK_I(pipe_src_h);
   13640   1.1  riastrad 
   13641   1.1  riastrad 		PIPE_CONF_CHECK_BOOL(pch_pfit.enabled);
   13642   1.1  riastrad 		if (current_config->pch_pfit.enabled) {
   13643   1.1  riastrad 			PIPE_CONF_CHECK_X(pch_pfit.pos);
   13644   1.1  riastrad 			PIPE_CONF_CHECK_X(pch_pfit.size);
   13645   1.1  riastrad 		}
   13646   1.1  riastrad 
   13647   1.1  riastrad 		PIPE_CONF_CHECK_I(scaler_state.scaler_id);
   13648   1.1  riastrad 		PIPE_CONF_CHECK_CLOCK_FUZZY(pixel_rate);
   13649   1.1  riastrad 
   13650   1.1  riastrad 		PIPE_CONF_CHECK_X(gamma_mode);
   13651   1.1  riastrad 		if (IS_CHERRYVIEW(dev_priv))
   13652   1.1  riastrad 			PIPE_CONF_CHECK_X(cgm_mode);
   13653   1.1  riastrad 		else
   13654   1.1  riastrad 			PIPE_CONF_CHECK_X(csc_mode);
   13655   1.1  riastrad 		PIPE_CONF_CHECK_BOOL(gamma_enable);
   13656   1.1  riastrad 		PIPE_CONF_CHECK_BOOL(csc_enable);
   13657   1.1  riastrad 
   13658   1.1  riastrad 		bp_gamma = intel_color_get_gamma_bit_precision(pipe_config);
   13659   1.1  riastrad 		if (bp_gamma)
   13660   1.1  riastrad 			PIPE_CONF_CHECK_COLOR_LUT(gamma_mode, hw.gamma_lut, bp_gamma);
   13661   1.1  riastrad 
   13662   1.1  riastrad 	}
   13663   1.1  riastrad 
   13664   1.1  riastrad 	PIPE_CONF_CHECK_BOOL(double_wide);
   13665   1.1  riastrad 
   13666   1.1  riastrad 	PIPE_CONF_CHECK_P(shared_dpll);
   13667   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
   13668   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md);
   13669   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
   13670   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.fp1);
   13671   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.wrpll);
   13672   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.spll);
   13673   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.ctrl1);
   13674   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr1);
   13675   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr2);
   13676   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr0);
   13677   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.ebb0);
   13678   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.ebb4);
   13679   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll0);
   13680   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll1);
   13681   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll2);
   13682   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll3);
   13683   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll6);
   13684   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll8);
   13685   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll9);
   13686   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pll10);
   13687   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.pcsdw12);
   13688   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_refclkin_ctl);
   13689   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_clktop2_coreclkctl1);
   13690   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_clktop2_hsclkctl);
   13691   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_div0);
   13692   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_div1);
   13693   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_lf);
   13694   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_frac_lock);
   13695   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_ssc);
   13696   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_bias);
   13697   1.1  riastrad 	PIPE_CONF_CHECK_X(dpll_hw_state.mg_pll_tdc_coldst_bias);
   13698   1.1  riastrad 
   13699   1.1  riastrad 	PIPE_CONF_CHECK_X(dsi_pll.ctrl);
   13700   1.1  riastrad 	PIPE_CONF_CHECK_X(dsi_pll.div);
   13701   1.1  riastrad 
   13702   1.1  riastrad 	if (IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5)
   13703   1.1  riastrad 		PIPE_CONF_CHECK_I(pipe_bpp);
   13704   1.1  riastrad 
   13705   1.1  riastrad 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
   13706   1.1  riastrad 	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
   13707   1.1  riastrad 
   13708   1.1  riastrad 	PIPE_CONF_CHECK_I(min_voltage_level);
   13709   1.1  riastrad 
   13710   1.1  riastrad 	PIPE_CONF_CHECK_X(infoframes.enable);
   13711   1.1  riastrad 	PIPE_CONF_CHECK_X(infoframes.gcp);
   13712   1.1  riastrad 	PIPE_CONF_CHECK_INFOFRAME(avi);
   13713   1.1  riastrad 	PIPE_CONF_CHECK_INFOFRAME(spd);
   13714   1.1  riastrad 	PIPE_CONF_CHECK_INFOFRAME(hdmi);
   13715   1.1  riastrad 	PIPE_CONF_CHECK_INFOFRAME(drm);
   13716   1.1  riastrad 
   13717   1.1  riastrad 	PIPE_CONF_CHECK_I(sync_mode_slaves_mask);
   13718   1.1  riastrad 	PIPE_CONF_CHECK_I(master_transcoder);
   13719   1.1  riastrad 
   13720   1.1  riastrad 	PIPE_CONF_CHECK_I(dsc.compression_enable);
   13721   1.1  riastrad 	PIPE_CONF_CHECK_I(dsc.dsc_split);
   13722   1.1  riastrad 	PIPE_CONF_CHECK_I(dsc.compressed_bpp);
   13723   1.1  riastrad 
   13724   1.1  riastrad 	PIPE_CONF_CHECK_I(mst_master_transcoder);
   13725   1.1  riastrad 
   13726   1.1  riastrad #undef PIPE_CONF_CHECK_X
   13727   1.1  riastrad #undef PIPE_CONF_CHECK_I
   13728   1.1  riastrad #undef PIPE_CONF_CHECK_BOOL
   13729   1.1  riastrad #undef PIPE_CONF_CHECK_BOOL_INCOMPLETE
   13730   1.1  riastrad #undef PIPE_CONF_CHECK_P
   13731   1.1  riastrad #undef PIPE_CONF_CHECK_FLAGS
   13732   1.1  riastrad #undef PIPE_CONF_CHECK_CLOCK_FUZZY
   13733   1.1  riastrad #undef PIPE_CONF_CHECK_COLOR_LUT
   13734   1.1  riastrad #undef PIPE_CONF_QUIRK
   13735   1.1  riastrad 
   13736   1.1  riastrad 	return ret;
   13737   1.1  riastrad }
   13738   1.1  riastrad 
   13739   1.1  riastrad static void intel_pipe_config_sanity_check(struct drm_i915_private *dev_priv,
   13740   1.1  riastrad 					   const struct intel_crtc_state *pipe_config)
   13741   1.1  riastrad {
   13742   1.1  riastrad 	if (pipe_config->has_pch_encoder) {
   13743   1.1  riastrad 		int fdi_dotclock = intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
   13744   1.1  riastrad 							    &pipe_config->fdi_m_n);
   13745   1.1  riastrad 		int dotclock = pipe_config->hw.adjusted_mode.crtc_clock;
   13746   1.1  riastrad 
   13747   1.1  riastrad 		/*
   13748   1.1  riastrad 		 * FDI already provided one idea for the dotclock.
   13749   1.1  riastrad 		 * Yell if the encoder disagrees.
   13750   1.1  riastrad 		 */
   13751   1.1  riastrad 		WARN(!intel_fuzzy_clock_check(fdi_dotclock, dotclock),
   13752   1.1  riastrad 		     "FDI dotclock and encoder dotclock mismatch, fdi: %i, encoder: %i\n",
   13753   1.1  riastrad 		     fdi_dotclock, dotclock);
   13754   1.1  riastrad 	}
   13755   1.1  riastrad }
   13756   1.1  riastrad 
   13757   1.1  riastrad static void verify_wm_state(struct intel_crtc *crtc,
   13758   1.1  riastrad 			    struct intel_crtc_state *new_crtc_state)
   13759   1.1  riastrad {
   13760   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   13761   1.1  riastrad 	struct skl_hw_state {
   13762   1.1  riastrad 		struct skl_ddb_entry ddb_y[I915_MAX_PLANES];
   13763   1.1  riastrad 		struct skl_ddb_entry ddb_uv[I915_MAX_PLANES];
   13764   1.1  riastrad 		struct skl_ddb_allocation ddb;
   13765   1.1  riastrad 		struct skl_pipe_wm wm;
   13766   1.1  riastrad 	} *hw;
   13767   1.1  riastrad 	struct skl_ddb_allocation *sw_ddb;
   13768   1.1  riastrad 	struct skl_pipe_wm *sw_wm;
   13769   1.1  riastrad 	struct skl_ddb_entry *hw_ddb_entry, *sw_ddb_entry;
   13770   1.1  riastrad 	const enum pipe pipe = crtc->pipe;
   13771   1.1  riastrad 	int plane, level, max_level = ilk_wm_max_level(dev_priv);
   13772   1.1  riastrad 
   13773   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9 || !new_crtc_state->hw.active)
   13774   1.1  riastrad 		return;
   13775   1.1  riastrad 
   13776   1.1  riastrad 	hw = kzalloc(sizeof(*hw), GFP_KERNEL);
   13777   1.1  riastrad 	if (!hw)
   13778   1.1  riastrad 		return;
   13779   1.1  riastrad 
   13780   1.1  riastrad 	skl_pipe_wm_get_hw_state(crtc, &hw->wm);
   13781   1.1  riastrad 	sw_wm = &new_crtc_state->wm.skl.optimal;
   13782   1.1  riastrad 
   13783   1.1  riastrad 	skl_pipe_ddb_get_hw_state(crtc, hw->ddb_y, hw->ddb_uv);
   13784   1.1  riastrad 
   13785   1.1  riastrad 	skl_ddb_get_hw_state(dev_priv, &hw->ddb);
   13786   1.1  riastrad 	sw_ddb = &dev_priv->wm.skl_hw.ddb;
   13787   1.1  riastrad 
   13788   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 &&
   13789   1.1  riastrad 	    hw->ddb.enabled_slices != sw_ddb->enabled_slices)
   13790   1.1  riastrad 		DRM_ERROR("mismatch in DBUF Slices (expected %u, got %u)\n",
   13791   1.1  riastrad 			  sw_ddb->enabled_slices,
   13792   1.1  riastrad 			  hw->ddb.enabled_slices);
   13793   1.1  riastrad 
   13794   1.1  riastrad 	/* planes */
   13795   1.1  riastrad 	for_each_universal_plane(dev_priv, pipe, plane) {
   13796   1.1  riastrad 		struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
   13797   1.1  riastrad 
   13798   1.1  riastrad 		hw_plane_wm = &hw->wm.planes[plane];
   13799   1.1  riastrad 		sw_plane_wm = &sw_wm->planes[plane];
   13800   1.1  riastrad 
   13801   1.1  riastrad 		/* Watermarks */
   13802   1.1  riastrad 		for (level = 0; level <= max_level; level++) {
   13803   1.1  riastrad 			if (skl_wm_level_equals(&hw_plane_wm->wm[level],
   13804   1.1  riastrad 						&sw_plane_wm->wm[level]))
   13805   1.1  riastrad 				continue;
   13806   1.1  riastrad 
   13807   1.1  riastrad 			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",
   13808   1.1  riastrad 				  pipe_name(pipe), plane + 1, level,
   13809   1.1  riastrad 				  sw_plane_wm->wm[level].plane_en,
   13810   1.1  riastrad 				  sw_plane_wm->wm[level].plane_res_b,
   13811   1.1  riastrad 				  sw_plane_wm->wm[level].plane_res_l,
   13812   1.1  riastrad 				  hw_plane_wm->wm[level].plane_en,
   13813   1.1  riastrad 				  hw_plane_wm->wm[level].plane_res_b,
   13814   1.1  riastrad 				  hw_plane_wm->wm[level].plane_res_l);
   13815   1.1  riastrad 		}
   13816   1.1  riastrad 
   13817   1.1  riastrad 		if (!skl_wm_level_equals(&hw_plane_wm->trans_wm,
   13818   1.1  riastrad 					 &sw_plane_wm->trans_wm)) {
   13819   1.1  riastrad 			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",
   13820   1.1  riastrad 				  pipe_name(pipe), plane + 1,
   13821   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_en,
   13822   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_res_b,
   13823   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_res_l,
   13824   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_en,
   13825   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_res_b,
   13826   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_res_l);
   13827   1.1  riastrad 		}
   13828   1.1  riastrad 
   13829   1.1  riastrad 		/* DDB */
   13830   1.1  riastrad 		hw_ddb_entry = &hw->ddb_y[plane];
   13831   1.1  riastrad 		sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb_y[plane];
   13832   1.1  riastrad 
   13833   1.1  riastrad 		if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
   13834   1.1  riastrad 			DRM_ERROR("mismatch in DDB state pipe %c plane %d (expected (%u,%u), found (%u,%u))\n",
   13835   1.1  riastrad 				  pipe_name(pipe), plane + 1,
   13836   1.1  riastrad 				  sw_ddb_entry->start, sw_ddb_entry->end,
   13837   1.1  riastrad 				  hw_ddb_entry->start, hw_ddb_entry->end);
   13838   1.1  riastrad 		}
   13839   1.1  riastrad 	}
   13840   1.1  riastrad 
   13841   1.1  riastrad 	/*
   13842   1.1  riastrad 	 * cursor
   13843   1.1  riastrad 	 * If the cursor plane isn't active, we may not have updated it's ddb
   13844   1.1  riastrad 	 * allocation. In that case since the ddb allocation will be updated
   13845   1.1  riastrad 	 * once the plane becomes visible, we can skip this check
   13846   1.1  riastrad 	 */
   13847   1.1  riastrad 	if (1) {
   13848   1.1  riastrad 		struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
   13849   1.1  riastrad 
   13850   1.1  riastrad 		hw_plane_wm = &hw->wm.planes[PLANE_CURSOR];
   13851   1.1  riastrad 		sw_plane_wm = &sw_wm->planes[PLANE_CURSOR];
   13852   1.1  riastrad 
   13853   1.1  riastrad 		/* Watermarks */
   13854   1.1  riastrad 		for (level = 0; level <= max_level; level++) {
   13855   1.1  riastrad 			if (skl_wm_level_equals(&hw_plane_wm->wm[level],
   13856   1.1  riastrad 						&sw_plane_wm->wm[level]))
   13857   1.1  riastrad 				continue;
   13858   1.1  riastrad 
   13859   1.1  riastrad 			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",
   13860   1.1  riastrad 				  pipe_name(pipe), level,
   13861   1.1  riastrad 				  sw_plane_wm->wm[level].plane_en,
   13862   1.1  riastrad 				  sw_plane_wm->wm[level].plane_res_b,
   13863   1.1  riastrad 				  sw_plane_wm->wm[level].plane_res_l,
   13864   1.1  riastrad 				  hw_plane_wm->wm[level].plane_en,
   13865   1.1  riastrad 				  hw_plane_wm->wm[level].plane_res_b,
   13866   1.1  riastrad 				  hw_plane_wm->wm[level].plane_res_l);
   13867   1.1  riastrad 		}
   13868   1.1  riastrad 
   13869   1.1  riastrad 		if (!skl_wm_level_equals(&hw_plane_wm->trans_wm,
   13870   1.1  riastrad 					 &sw_plane_wm->trans_wm)) {
   13871   1.1  riastrad 			DRM_ERROR("mismatch in trans WM pipe %c cursor (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
   13872   1.1  riastrad 				  pipe_name(pipe),
   13873   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_en,
   13874   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_res_b,
   13875   1.1  riastrad 				  sw_plane_wm->trans_wm.plane_res_l,
   13876   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_en,
   13877   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_res_b,
   13878   1.1  riastrad 				  hw_plane_wm->trans_wm.plane_res_l);
   13879   1.1  riastrad 		}
   13880   1.1  riastrad 
   13881   1.1  riastrad 		/* DDB */
   13882   1.1  riastrad 		hw_ddb_entry = &hw->ddb_y[PLANE_CURSOR];
   13883   1.1  riastrad 		sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR];
   13884   1.1  riastrad 
   13885   1.1  riastrad 		if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
   13886   1.1  riastrad 			DRM_ERROR("mismatch in DDB state pipe %c cursor (expected (%u,%u), found (%u,%u))\n",
   13887   1.1  riastrad 				  pipe_name(pipe),
   13888   1.1  riastrad 				  sw_ddb_entry->start, sw_ddb_entry->end,
   13889   1.1  riastrad 				  hw_ddb_entry->start, hw_ddb_entry->end);
   13890   1.1  riastrad 		}
   13891   1.1  riastrad 	}
   13892   1.1  riastrad 
   13893   1.1  riastrad 	kfree(hw);
   13894   1.1  riastrad }
   13895   1.1  riastrad 
   13896   1.1  riastrad static void
   13897   1.1  riastrad verify_connector_state(struct intel_atomic_state *state,
   13898   1.1  riastrad 		       struct intel_crtc *crtc)
   13899   1.1  riastrad {
   13900   1.1  riastrad 	struct drm_connector *connector;
   13901   1.1  riastrad 	struct drm_connector_state *new_conn_state;
   13902   1.1  riastrad 	int i;
   13903   1.1  riastrad 
   13904   1.1  riastrad 	for_each_new_connector_in_state(&state->base, connector, new_conn_state, i) {
   13905   1.1  riastrad 		struct drm_encoder *encoder = connector->encoder;
   13906   1.1  riastrad 		struct intel_crtc_state *crtc_state = NULL;
   13907   1.1  riastrad 
   13908   1.1  riastrad 		if (new_conn_state->crtc != &crtc->base)
   13909   1.1  riastrad 			continue;
   13910   1.1  riastrad 
   13911   1.1  riastrad 		if (crtc)
   13912   1.1  riastrad 			crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
   13913   1.1  riastrad 
   13914   1.1  riastrad 		intel_connector_verify_state(crtc_state, new_conn_state);
   13915   1.1  riastrad 
   13916   1.1  riastrad 		I915_STATE_WARN(new_conn_state->best_encoder != encoder,
   13917   1.1  riastrad 		     "connector's atomic encoder doesn't match legacy encoder\n");
   13918   1.1  riastrad 	}
   13919   1.1  riastrad }
   13920   1.1  riastrad 
   13921   1.1  riastrad static void
   13922   1.1  riastrad verify_encoder_state(struct drm_i915_private *dev_priv, struct intel_atomic_state *state)
   13923   1.1  riastrad {
   13924   1.1  riastrad 	struct intel_encoder *encoder;
   13925   1.1  riastrad 	struct drm_connector *connector;
   13926   1.1  riastrad 	struct drm_connector_state *old_conn_state, *new_conn_state;
   13927   1.1  riastrad 	int i;
   13928   1.1  riastrad 
   13929   1.1  riastrad 	for_each_intel_encoder(&dev_priv->drm, encoder) {
   13930   1.1  riastrad 		bool enabled = false, found = false;
   13931   1.1  riastrad 		enum pipe pipe;
   13932   1.1  riastrad 
   13933   1.1  riastrad 		DRM_DEBUG_KMS("[ENCODER:%d:%s]\n",
   13934   1.1  riastrad 			      encoder->base.base.id,
   13935   1.1  riastrad 			      encoder->base.name);
   13936   1.1  riastrad 
   13937   1.1  riastrad 		for_each_oldnew_connector_in_state(&state->base, connector, old_conn_state,
   13938   1.1  riastrad 						   new_conn_state, i) {
   13939   1.1  riastrad 			if (old_conn_state->best_encoder == &encoder->base)
   13940   1.1  riastrad 				found = true;
   13941   1.1  riastrad 
   13942   1.1  riastrad 			if (new_conn_state->best_encoder != &encoder->base)
   13943   1.1  riastrad 				continue;
   13944   1.1  riastrad 			found = enabled = true;
   13945   1.1  riastrad 
   13946   1.1  riastrad 			I915_STATE_WARN(new_conn_state->crtc !=
   13947   1.1  riastrad 					encoder->base.crtc,
   13948   1.1  riastrad 			     "connector's crtc doesn't match encoder crtc\n");
   13949   1.1  riastrad 		}
   13950   1.1  riastrad 
   13951   1.1  riastrad 		if (!found)
   13952   1.1  riastrad 			continue;
   13953   1.1  riastrad 
   13954   1.1  riastrad 		I915_STATE_WARN(!!encoder->base.crtc != enabled,
   13955   1.1  riastrad 		     "encoder's enabled state mismatch "
   13956   1.1  riastrad 		     "(expected %i, found %i)\n",
   13957   1.1  riastrad 		     !!encoder->base.crtc, enabled);
   13958   1.1  riastrad 
   13959   1.1  riastrad 		if (!encoder->base.crtc) {
   13960   1.1  riastrad 			bool active;
   13961   1.1  riastrad 
   13962   1.1  riastrad 			active = encoder->get_hw_state(encoder, &pipe);
   13963   1.1  riastrad 			I915_STATE_WARN(active,
   13964   1.1  riastrad 			     "encoder detached but still enabled on pipe %c.\n",
   13965   1.1  riastrad 			     pipe_name(pipe));
   13966   1.1  riastrad 		}
   13967   1.1  riastrad 	}
   13968   1.1  riastrad }
   13969   1.1  riastrad 
   13970   1.1  riastrad static void
   13971   1.1  riastrad verify_crtc_state(struct intel_crtc *crtc,
   13972   1.1  riastrad 		  struct intel_crtc_state *old_crtc_state,
   13973   1.1  riastrad 		  struct intel_crtc_state *new_crtc_state)
   13974   1.1  riastrad {
   13975   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   13976   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   13977   1.1  riastrad 	struct intel_encoder *encoder;
   13978   1.1  riastrad 	struct intel_crtc_state *pipe_config = old_crtc_state;
   13979   1.1  riastrad 	struct drm_atomic_state *state = old_crtc_state->uapi.state;
   13980   1.1  riastrad 	bool active;
   13981   1.1  riastrad 
   13982   1.1  riastrad 	__drm_atomic_helper_crtc_destroy_state(&old_crtc_state->uapi);
   13983   1.1  riastrad 	intel_crtc_free_hw_state(old_crtc_state);
   13984   1.1  riastrad 	intel_crtc_state_reset(old_crtc_state, crtc);
   13985   1.1  riastrad 	old_crtc_state->uapi.state = state;
   13986   1.1  riastrad 
   13987   1.1  riastrad 	DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.base.id, crtc->base.name);
   13988   1.1  riastrad 
   13989   1.1  riastrad 	active = dev_priv->display.get_pipe_config(crtc, pipe_config);
   13990   1.1  riastrad 
   13991   1.1  riastrad 	/* we keep both pipes enabled on 830 */
   13992   1.1  riastrad 	if (IS_I830(dev_priv))
   13993   1.1  riastrad 		active = new_crtc_state->hw.active;
   13994   1.1  riastrad 
   13995   1.1  riastrad 	I915_STATE_WARN(new_crtc_state->hw.active != active,
   13996   1.1  riastrad 			"crtc active state doesn't match with hw state "
   13997   1.1  riastrad 			"(expected %i, found %i)\n",
   13998   1.1  riastrad 			new_crtc_state->hw.active, active);
   13999   1.1  riastrad 
   14000   1.1  riastrad 	I915_STATE_WARN(crtc->active != new_crtc_state->hw.active,
   14001   1.1  riastrad 			"transitional active state does not match atomic hw state "
   14002   1.1  riastrad 			"(expected %i, found %i)\n",
   14003   1.1  riastrad 			new_crtc_state->hw.active, crtc->active);
   14004   1.1  riastrad 
   14005   1.1  riastrad 	for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
   14006   1.1  riastrad 		enum pipe pipe;
   14007   1.1  riastrad 
   14008   1.1  riastrad 		active = encoder->get_hw_state(encoder, &pipe);
   14009   1.1  riastrad 		I915_STATE_WARN(active != new_crtc_state->hw.active,
   14010   1.1  riastrad 				"[ENCODER:%i] active %i with crtc active %i\n",
   14011   1.1  riastrad 				encoder->base.base.id, active,
   14012   1.1  riastrad 				new_crtc_state->hw.active);
   14013   1.1  riastrad 
   14014   1.1  riastrad 		I915_STATE_WARN(active && crtc->pipe != pipe,
   14015   1.1  riastrad 				"Encoder connected to wrong pipe %c\n",
   14016   1.1  riastrad 				pipe_name(pipe));
   14017   1.1  riastrad 
   14018   1.1  riastrad 		if (active)
   14019   1.1  riastrad 			encoder->get_config(encoder, pipe_config);
   14020   1.1  riastrad 	}
   14021   1.1  riastrad 
   14022   1.1  riastrad 	intel_crtc_compute_pixel_rate(pipe_config);
   14023   1.1  riastrad 
   14024   1.1  riastrad 	if (!new_crtc_state->hw.active)
   14025   1.1  riastrad 		return;
   14026   1.1  riastrad 
   14027   1.1  riastrad 	intel_pipe_config_sanity_check(dev_priv, pipe_config);
   14028   1.1  riastrad 
   14029   1.1  riastrad 	if (!intel_pipe_config_compare(new_crtc_state,
   14030   1.1  riastrad 				       pipe_config, false)) {
   14031   1.1  riastrad 		I915_STATE_WARN(1, "pipe state doesn't match!\n");
   14032   1.1  riastrad 		intel_dump_pipe_config(pipe_config, NULL, "[hw state]");
   14033   1.1  riastrad 		intel_dump_pipe_config(new_crtc_state, NULL, "[sw state]");
   14034   1.1  riastrad 	}
   14035   1.1  riastrad }
   14036   1.1  riastrad 
   14037   1.1  riastrad static void
   14038   1.1  riastrad intel_verify_planes(struct intel_atomic_state *state)
   14039   1.1  riastrad {
   14040   1.1  riastrad 	struct intel_plane *plane;
   14041   1.1  riastrad 	const struct intel_plane_state *plane_state;
   14042   1.1  riastrad 	int i;
   14043   1.1  riastrad 
   14044   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane,
   14045   1.1  riastrad 					  plane_state, i)
   14046   1.1  riastrad 		assert_plane(plane, plane_state->planar_slave ||
   14047   1.1  riastrad 			     plane_state->uapi.visible);
   14048   1.1  riastrad }
   14049   1.1  riastrad 
   14050   1.1  riastrad static void
   14051   1.1  riastrad verify_single_dpll_state(struct drm_i915_private *dev_priv,
   14052   1.1  riastrad 			 struct intel_shared_dpll *pll,
   14053   1.1  riastrad 			 struct intel_crtc *crtc,
   14054   1.1  riastrad 			 struct intel_crtc_state *new_crtc_state)
   14055   1.1  riastrad {
   14056   1.1  riastrad 	struct intel_dpll_hw_state dpll_hw_state;
   14057   1.1  riastrad 	unsigned int crtc_mask;
   14058   1.1  riastrad 	bool active;
   14059   1.1  riastrad 
   14060   1.1  riastrad 	memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
   14061   1.1  riastrad 
   14062   1.1  riastrad 	DRM_DEBUG_KMS("%s\n", pll->info->name);
   14063   1.1  riastrad 
   14064   1.1  riastrad 	active = pll->info->funcs->get_hw_state(dev_priv, pll, &dpll_hw_state);
   14065   1.1  riastrad 
   14066   1.1  riastrad 	if (!(pll->info->flags & INTEL_DPLL_ALWAYS_ON)) {
   14067   1.1  riastrad 		I915_STATE_WARN(!pll->on && pll->active_mask,
   14068   1.1  riastrad 		     "pll in active use but not on in sw tracking\n");
   14069   1.1  riastrad 		I915_STATE_WARN(pll->on && !pll->active_mask,
   14070   1.1  riastrad 		     "pll is on but not used by any active crtc\n");
   14071   1.1  riastrad 		I915_STATE_WARN(pll->on != active,
   14072   1.1  riastrad 		     "pll on state mismatch (expected %i, found %i)\n",
   14073   1.1  riastrad 		     pll->on, active);
   14074   1.1  riastrad 	}
   14075   1.1  riastrad 
   14076   1.1  riastrad 	if (!crtc) {
   14077   1.1  riastrad 		I915_STATE_WARN(pll->active_mask & ~pll->state.crtc_mask,
   14078   1.1  riastrad 				"more active pll users than references: %x vs %x\n",
   14079   1.1  riastrad 				pll->active_mask, pll->state.crtc_mask);
   14080   1.1  riastrad 
   14081   1.1  riastrad 		return;
   14082   1.1  riastrad 	}
   14083   1.1  riastrad 
   14084   1.1  riastrad 	crtc_mask = drm_crtc_mask(&crtc->base);
   14085   1.1  riastrad 
   14086   1.1  riastrad 	if (new_crtc_state->hw.active)
   14087   1.1  riastrad 		I915_STATE_WARN(!(pll->active_mask & crtc_mask),
   14088   1.1  riastrad 				"pll active mismatch (expected pipe %c in active mask 0x%02x)\n",
   14089   1.1  riastrad 				pipe_name(drm_crtc_index(&crtc->base)), pll->active_mask);
   14090   1.1  riastrad 	else
   14091   1.1  riastrad 		I915_STATE_WARN(pll->active_mask & crtc_mask,
   14092   1.1  riastrad 				"pll active mismatch (didn't expect pipe %c in active mask 0x%02x)\n",
   14093   1.1  riastrad 				pipe_name(drm_crtc_index(&crtc->base)), pll->active_mask);
   14094   1.1  riastrad 
   14095   1.1  riastrad 	I915_STATE_WARN(!(pll->state.crtc_mask & crtc_mask),
   14096   1.1  riastrad 			"pll enabled crtcs mismatch (expected 0x%x in 0x%02x)\n",
   14097   1.1  riastrad 			crtc_mask, pll->state.crtc_mask);
   14098   1.1  riastrad 
   14099   1.1  riastrad 	I915_STATE_WARN(pll->on && memcmp(&pll->state.hw_state,
   14100   1.1  riastrad 					  &dpll_hw_state,
   14101   1.1  riastrad 					  sizeof(dpll_hw_state)),
   14102   1.1  riastrad 			"pll hw state mismatch\n");
   14103   1.1  riastrad }
   14104   1.1  riastrad 
   14105   1.1  riastrad static void
   14106   1.1  riastrad verify_shared_dpll_state(struct intel_crtc *crtc,
   14107   1.1  riastrad 			 struct intel_crtc_state *old_crtc_state,
   14108   1.1  riastrad 			 struct intel_crtc_state *new_crtc_state)
   14109   1.1  riastrad {
   14110   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14111   1.1  riastrad 
   14112   1.1  riastrad 	if (new_crtc_state->shared_dpll)
   14113   1.1  riastrad 		verify_single_dpll_state(dev_priv, new_crtc_state->shared_dpll, crtc, new_crtc_state);
   14114   1.1  riastrad 
   14115   1.1  riastrad 	if (old_crtc_state->shared_dpll &&
   14116   1.1  riastrad 	    old_crtc_state->shared_dpll != new_crtc_state->shared_dpll) {
   14117   1.1  riastrad 		unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
   14118   1.1  riastrad 		struct intel_shared_dpll *pll = old_crtc_state->shared_dpll;
   14119   1.1  riastrad 
   14120   1.1  riastrad 		I915_STATE_WARN(pll->active_mask & crtc_mask,
   14121   1.1  riastrad 				"pll active mismatch (didn't expect pipe %c in active mask)\n",
   14122   1.1  riastrad 				pipe_name(drm_crtc_index(&crtc->base)));
   14123   1.1  riastrad 		I915_STATE_WARN(pll->state.crtc_mask & crtc_mask,
   14124   1.1  riastrad 				"pll enabled crtcs mismatch (found %x in enabled mask)\n",
   14125   1.1  riastrad 				pipe_name(drm_crtc_index(&crtc->base)));
   14126   1.1  riastrad 	}
   14127   1.1  riastrad }
   14128   1.1  riastrad 
   14129   1.1  riastrad static void
   14130   1.1  riastrad intel_modeset_verify_crtc(struct intel_crtc *crtc,
   14131   1.1  riastrad 			  struct intel_atomic_state *state,
   14132   1.1  riastrad 			  struct intel_crtc_state *old_crtc_state,
   14133   1.1  riastrad 			  struct intel_crtc_state *new_crtc_state)
   14134   1.1  riastrad {
   14135   1.1  riastrad 	if (!needs_modeset(new_crtc_state) && !new_crtc_state->update_pipe)
   14136   1.1  riastrad 		return;
   14137   1.1  riastrad 
   14138   1.1  riastrad 	verify_wm_state(crtc, new_crtc_state);
   14139   1.1  riastrad 	verify_connector_state(state, crtc);
   14140   1.1  riastrad 	verify_crtc_state(crtc, old_crtc_state, new_crtc_state);
   14141   1.1  riastrad 	verify_shared_dpll_state(crtc, old_crtc_state, new_crtc_state);
   14142   1.1  riastrad }
   14143   1.1  riastrad 
   14144   1.1  riastrad static void
   14145   1.1  riastrad verify_disabled_dpll_state(struct drm_i915_private *dev_priv)
   14146   1.1  riastrad {
   14147   1.1  riastrad 	int i;
   14148   1.1  riastrad 
   14149   1.1  riastrad 	for (i = 0; i < dev_priv->num_shared_dpll; i++)
   14150   1.1  riastrad 		verify_single_dpll_state(dev_priv, &dev_priv->shared_dplls[i], NULL, NULL);
   14151   1.1  riastrad }
   14152   1.1  riastrad 
   14153   1.1  riastrad static void
   14154   1.1  riastrad intel_modeset_verify_disabled(struct drm_i915_private *dev_priv,
   14155   1.1  riastrad 			      struct intel_atomic_state *state)
   14156   1.1  riastrad {
   14157   1.1  riastrad 	verify_encoder_state(dev_priv, state);
   14158   1.1  riastrad 	verify_connector_state(state, NULL);
   14159   1.1  riastrad 	verify_disabled_dpll_state(dev_priv);
   14160   1.1  riastrad }
   14161   1.1  riastrad 
   14162   1.1  riastrad static void
   14163   1.1  riastrad intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state)
   14164   1.1  riastrad {
   14165   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   14166   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14167   1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
   14168   1.1  riastrad 		&crtc_state->hw.adjusted_mode;
   14169   1.1  riastrad 
   14170   1.1  riastrad 	drm_calc_timestamping_constants(&crtc->base, adjusted_mode);
   14171   1.1  riastrad 
   14172   1.1  riastrad 	/*
   14173   1.1  riastrad 	 * The scanline counter increments at the leading edge of hsync.
   14174   1.1  riastrad 	 *
   14175   1.1  riastrad 	 * On most platforms it starts counting from vtotal-1 on the
   14176   1.1  riastrad 	 * first active line. That means the scanline counter value is
   14177   1.1  riastrad 	 * always one less than what we would expect. Ie. just after
   14178   1.1  riastrad 	 * start of vblank, which also occurs at start of hsync (on the
   14179   1.1  riastrad 	 * last active line), the scanline counter will read vblank_start-1.
   14180   1.1  riastrad 	 *
   14181   1.1  riastrad 	 * On gen2 the scanline counter starts counting from 1 instead
   14182   1.1  riastrad 	 * of vtotal-1, so we have to subtract one (or rather add vtotal-1
   14183   1.1  riastrad 	 * to keep the value positive), instead of adding one.
   14184   1.1  riastrad 	 *
   14185   1.1  riastrad 	 * On HSW+ the behaviour of the scanline counter depends on the output
   14186   1.1  riastrad 	 * type. For DP ports it behaves like most other platforms, but on HDMI
   14187   1.1  riastrad 	 * there's an extra 1 line difference. So we need to add two instead of
   14188   1.1  riastrad 	 * one to the value.
   14189   1.1  riastrad 	 *
   14190   1.1  riastrad 	 * On VLV/CHV DSI the scanline counter would appear to increment
   14191   1.1  riastrad 	 * approx. 1/3 of a scanline before start of vblank. Unfortunately
   14192   1.1  riastrad 	 * that means we can't tell whether we're in vblank or not while
   14193   1.1  riastrad 	 * we're on that particular line. We must still set scanline_offset
   14194   1.1  riastrad 	 * to 1 so that the vblank timestamps come out correct when we query
   14195   1.1  riastrad 	 * the scanline counter from within the vblank interrupt handler.
   14196   1.1  riastrad 	 * However if queried just before the start of vblank we'll get an
   14197   1.1  riastrad 	 * answer that's slightly in the future.
   14198   1.1  riastrad 	 */
   14199   1.1  riastrad 	if (IS_GEN(dev_priv, 2)) {
   14200   1.1  riastrad 		int vtotal;
   14201   1.1  riastrad 
   14202   1.1  riastrad 		vtotal = adjusted_mode->crtc_vtotal;
   14203   1.1  riastrad 		if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
   14204   1.1  riastrad 			vtotal /= 2;
   14205   1.1  riastrad 
   14206   1.1  riastrad 		crtc->scanline_offset = vtotal - 1;
   14207   1.1  riastrad 	} else if (HAS_DDI(dev_priv) &&
   14208   1.1  riastrad 		   intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
   14209   1.1  riastrad 		crtc->scanline_offset = 2;
   14210   1.1  riastrad 	} else {
   14211   1.1  riastrad 		crtc->scanline_offset = 1;
   14212   1.1  riastrad 	}
   14213   1.1  riastrad }
   14214   1.1  riastrad 
   14215   1.1  riastrad static void intel_modeset_clear_plls(struct intel_atomic_state *state)
   14216   1.1  riastrad {
   14217   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14218   1.1  riastrad 	struct intel_crtc_state *new_crtc_state;
   14219   1.1  riastrad 	struct intel_crtc *crtc;
   14220   1.1  riastrad 	int i;
   14221   1.1  riastrad 
   14222   1.1  riastrad 	if (!dev_priv->display.crtc_compute_clock)
   14223   1.1  riastrad 		return;
   14224   1.1  riastrad 
   14225   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14226   1.1  riastrad 		if (!needs_modeset(new_crtc_state))
   14227   1.1  riastrad 			continue;
   14228   1.1  riastrad 
   14229   1.1  riastrad 		intel_release_shared_dplls(state, crtc);
   14230   1.1  riastrad 	}
   14231   1.1  riastrad }
   14232   1.1  riastrad 
   14233   1.1  riastrad /*
   14234   1.1  riastrad  * This implements the workaround described in the "notes" section of the mode
   14235   1.1  riastrad  * set sequence documentation. When going from no pipes or single pipe to
   14236   1.1  riastrad  * multiple pipes, and planes are enabled after the pipe, we need to wait at
   14237   1.1  riastrad  * least 2 vblanks on the first pipe before enabling planes on the second pipe.
   14238   1.1  riastrad  */
   14239   1.1  riastrad static int hsw_mode_set_planes_workaround(struct intel_atomic_state *state)
   14240   1.1  riastrad {
   14241   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   14242   1.1  riastrad 	struct intel_crtc *crtc;
   14243   1.1  riastrad 	struct intel_crtc_state *first_crtc_state = NULL;
   14244   1.1  riastrad 	struct intel_crtc_state *other_crtc_state = NULL;
   14245   1.1  riastrad 	enum pipe first_pipe = INVALID_PIPE, enabled_pipe = INVALID_PIPE;
   14246   1.1  riastrad 	int i;
   14247   1.1  riastrad 
   14248   1.1  riastrad 	/* look at all crtc's that are going to be enabled in during modeset */
   14249   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
   14250   1.1  riastrad 		if (!crtc_state->hw.active ||
   14251   1.1  riastrad 		    !needs_modeset(crtc_state))
   14252   1.1  riastrad 			continue;
   14253   1.1  riastrad 
   14254   1.1  riastrad 		if (first_crtc_state) {
   14255   1.1  riastrad 			other_crtc_state = crtc_state;
   14256   1.1  riastrad 			break;
   14257   1.1  riastrad 		} else {
   14258   1.1  riastrad 			first_crtc_state = crtc_state;
   14259   1.1  riastrad 			first_pipe = crtc->pipe;
   14260   1.1  riastrad 		}
   14261   1.1  riastrad 	}
   14262   1.1  riastrad 
   14263   1.1  riastrad 	/* No workaround needed? */
   14264   1.1  riastrad 	if (!first_crtc_state)
   14265   1.1  riastrad 		return 0;
   14266   1.1  riastrad 
   14267   1.1  riastrad 	/* w/a possibly needed, check how many crtc's are already enabled. */
   14268   1.1  riastrad 	for_each_intel_crtc(state->base.dev, crtc) {
   14269   1.1  riastrad 		crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
   14270   1.1  riastrad 		if (IS_ERR(crtc_state))
   14271   1.1  riastrad 			return PTR_ERR(crtc_state);
   14272   1.1  riastrad 
   14273   1.1  riastrad 		crtc_state->hsw_workaround_pipe = INVALID_PIPE;
   14274   1.1  riastrad 
   14275   1.1  riastrad 		if (!crtc_state->hw.active ||
   14276   1.1  riastrad 		    needs_modeset(crtc_state))
   14277   1.1  riastrad 			continue;
   14278   1.1  riastrad 
   14279   1.1  riastrad 		/* 2 or more enabled crtcs means no need for w/a */
   14280   1.1  riastrad 		if (enabled_pipe != INVALID_PIPE)
   14281   1.1  riastrad 			return 0;
   14282   1.1  riastrad 
   14283   1.1  riastrad 		enabled_pipe = crtc->pipe;
   14284   1.1  riastrad 	}
   14285   1.1  riastrad 
   14286   1.1  riastrad 	if (enabled_pipe != INVALID_PIPE)
   14287   1.1  riastrad 		first_crtc_state->hsw_workaround_pipe = enabled_pipe;
   14288   1.1  riastrad 	else if (other_crtc_state)
   14289   1.1  riastrad 		other_crtc_state->hsw_workaround_pipe = first_pipe;
   14290   1.1  riastrad 
   14291   1.1  riastrad 	return 0;
   14292   1.1  riastrad }
   14293   1.1  riastrad 
   14294   1.1  riastrad static int intel_modeset_checks(struct intel_atomic_state *state)
   14295   1.1  riastrad {
   14296   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14297   1.1  riastrad 	struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14298   1.1  riastrad 	struct intel_crtc *crtc;
   14299   1.1  riastrad 	int ret, i;
   14300   1.1  riastrad 
   14301   1.1  riastrad 	/* keep the current setting */
   14302   1.1  riastrad 	if (!state->cdclk.force_min_cdclk_changed)
   14303   1.1  riastrad 		state->cdclk.force_min_cdclk = dev_priv->cdclk.force_min_cdclk;
   14304   1.1  riastrad 
   14305   1.1  riastrad 	state->modeset = true;
   14306   1.1  riastrad 	state->active_pipes = dev_priv->active_pipes;
   14307   1.1  riastrad 	state->cdclk.logical = dev_priv->cdclk.logical;
   14308   1.1  riastrad 	state->cdclk.actual = dev_priv->cdclk.actual;
   14309   1.1  riastrad 
   14310   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14311   1.1  riastrad 					    new_crtc_state, i) {
   14312   1.1  riastrad 		if (new_crtc_state->hw.active)
   14313   1.1  riastrad 			state->active_pipes |= BIT(crtc->pipe);
   14314   1.1  riastrad 		else
   14315   1.1  riastrad 			state->active_pipes &= ~BIT(crtc->pipe);
   14316   1.1  riastrad 
   14317   1.1  riastrad 		if (old_crtc_state->hw.active != new_crtc_state->hw.active)
   14318   1.1  riastrad 			state->active_pipe_changes |= BIT(crtc->pipe);
   14319   1.1  riastrad 	}
   14320   1.1  riastrad 
   14321   1.1  riastrad 	if (state->active_pipe_changes) {
   14322   1.1  riastrad 		ret = intel_atomic_lock_global_state(state);
   14323   1.1  riastrad 		if (ret)
   14324   1.1  riastrad 			return ret;
   14325   1.1  riastrad 	}
   14326   1.1  riastrad 
   14327   1.1  riastrad 	ret = intel_modeset_calc_cdclk(state);
   14328   1.1  riastrad 	if (ret)
   14329   1.1  riastrad 		return ret;
   14330   1.1  riastrad 
   14331   1.1  riastrad 	intel_modeset_clear_plls(state);
   14332   1.1  riastrad 
   14333   1.1  riastrad 	if (IS_HASWELL(dev_priv))
   14334   1.1  riastrad 		return hsw_mode_set_planes_workaround(state);
   14335   1.1  riastrad 
   14336   1.1  riastrad 	return 0;
   14337   1.1  riastrad }
   14338   1.1  riastrad 
   14339   1.1  riastrad /*
   14340   1.1  riastrad  * Handle calculation of various watermark data at the end of the atomic check
   14341   1.1  riastrad  * phase.  The code here should be run after the per-crtc and per-plane 'check'
   14342   1.1  riastrad  * handlers to ensure that all derived state has been updated.
   14343   1.1  riastrad  */
   14344   1.1  riastrad static int calc_watermark_data(struct intel_atomic_state *state)
   14345   1.1  riastrad {
   14346   1.1  riastrad 	struct drm_device *dev = state->base.dev;
   14347   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   14348   1.1  riastrad 
   14349   1.1  riastrad 	/* Is there platform-specific watermark information to calculate? */
   14350   1.1  riastrad 	if (dev_priv->display.compute_global_watermarks)
   14351   1.1  riastrad 		return dev_priv->display.compute_global_watermarks(state);
   14352   1.1  riastrad 
   14353   1.1  riastrad 	return 0;
   14354   1.1  riastrad }
   14355   1.1  riastrad 
   14356   1.1  riastrad static void intel_crtc_check_fastset(const struct intel_crtc_state *old_crtc_state,
   14357   1.1  riastrad 				     struct intel_crtc_state *new_crtc_state)
   14358   1.1  riastrad {
   14359   1.1  riastrad 	if (!intel_pipe_config_compare(old_crtc_state, new_crtc_state, true))
   14360   1.1  riastrad 		return;
   14361   1.1  riastrad 
   14362   1.1  riastrad 	new_crtc_state->uapi.mode_changed = false;
   14363   1.1  riastrad 	new_crtc_state->update_pipe = true;
   14364   1.1  riastrad }
   14365   1.1  riastrad 
   14366   1.1  riastrad static void intel_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
   14367   1.1  riastrad 				    struct intel_crtc_state *new_crtc_state)
   14368   1.1  riastrad {
   14369   1.1  riastrad 	/*
   14370   1.1  riastrad 	 * If we're not doing the full modeset we want to
   14371   1.1  riastrad 	 * keep the current M/N values as they may be
   14372   1.1  riastrad 	 * sufficiently different to the computed values
   14373   1.1  riastrad 	 * to cause problems.
   14374   1.1  riastrad 	 *
   14375   1.1  riastrad 	 * FIXME: should really copy more fuzzy state here
   14376   1.1  riastrad 	 */
   14377   1.1  riastrad 	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
   14378   1.1  riastrad 	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
   14379   1.1  riastrad 	new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
   14380   1.1  riastrad 	new_crtc_state->has_drrs = old_crtc_state->has_drrs;
   14381   1.1  riastrad }
   14382   1.1  riastrad 
   14383   1.1  riastrad static int intel_crtc_add_planes_to_state(struct intel_atomic_state *state,
   14384   1.1  riastrad 					  struct intel_crtc *crtc,
   14385   1.1  riastrad 					  u8 plane_ids_mask)
   14386   1.1  riastrad {
   14387   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14388   1.1  riastrad 	struct intel_plane *plane;
   14389   1.1  riastrad 
   14390   1.1  riastrad 	for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
   14391   1.1  riastrad 		struct intel_plane_state *plane_state;
   14392   1.1  riastrad 
   14393   1.1  riastrad 		if ((plane_ids_mask & BIT(plane->id)) == 0)
   14394   1.1  riastrad 			continue;
   14395   1.1  riastrad 
   14396   1.1  riastrad 		plane_state = intel_atomic_get_plane_state(state, plane);
   14397   1.1  riastrad 		if (IS_ERR(plane_state))
   14398   1.1  riastrad 			return PTR_ERR(plane_state);
   14399   1.1  riastrad 	}
   14400   1.1  riastrad 
   14401   1.1  riastrad 	return 0;
   14402   1.1  riastrad }
   14403   1.1  riastrad 
   14404   1.1  riastrad static bool active_planes_affects_min_cdclk(struct drm_i915_private *dev_priv)
   14405   1.1  riastrad {
   14406   1.1  riastrad 	/* See {hsw,vlv,ivb}_plane_ratio() */
   14407   1.1  riastrad 	return IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv) ||
   14408   1.1  riastrad 		IS_CHERRYVIEW(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
   14409   1.1  riastrad 		IS_IVYBRIDGE(dev_priv);
   14410   1.1  riastrad }
   14411   1.1  riastrad 
   14412   1.1  riastrad static int intel_atomic_check_planes(struct intel_atomic_state *state,
   14413   1.1  riastrad 				     bool *need_modeset)
   14414   1.1  riastrad {
   14415   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14416   1.1  riastrad 	struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14417   1.3  riastrad 	struct intel_plane_state *plane_state __unused;
   14418   1.1  riastrad 	struct intel_plane *plane;
   14419   1.1  riastrad 	struct intel_crtc *crtc;
   14420   1.1  riastrad 	int i, ret;
   14421   1.1  riastrad 
   14422   1.1  riastrad 	ret = icl_add_linked_planes(state);
   14423   1.1  riastrad 	if (ret)
   14424   1.1  riastrad 		return ret;
   14425   1.1  riastrad 
   14426   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
   14427   1.1  riastrad 		ret = intel_plane_atomic_check(state, plane);
   14428   1.1  riastrad 		if (ret) {
   14429   1.1  riastrad 			DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
   14430   1.1  riastrad 					 plane->base.base.id, plane->base.name);
   14431   1.1  riastrad 			return ret;
   14432   1.1  riastrad 		}
   14433   1.1  riastrad 	}
   14434   1.1  riastrad 
   14435   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14436   1.1  riastrad 					    new_crtc_state, i) {
   14437   1.1  riastrad 		u8 old_active_planes, new_active_planes;
   14438   1.1  riastrad 
   14439   1.1  riastrad 		ret = icl_check_nv12_planes(new_crtc_state);
   14440   1.1  riastrad 		if (ret)
   14441   1.1  riastrad 			return ret;
   14442   1.1  riastrad 
   14443   1.1  riastrad 		/*
   14444   1.1  riastrad 		 * On some platforms the number of active planes affects
   14445   1.1  riastrad 		 * the planes' minimum cdclk calculation. Add such planes
   14446   1.1  riastrad 		 * to the state before we compute the minimum cdclk.
   14447   1.1  riastrad 		 */
   14448   1.1  riastrad 		if (!active_planes_affects_min_cdclk(dev_priv))
   14449   1.1  riastrad 			continue;
   14450   1.1  riastrad 
   14451   1.1  riastrad 		old_active_planes = old_crtc_state->active_planes & ~BIT(PLANE_CURSOR);
   14452   1.1  riastrad 		new_active_planes = new_crtc_state->active_planes & ~BIT(PLANE_CURSOR);
   14453   1.1  riastrad 
   14454   1.1  riastrad 		if (hweight8(old_active_planes) == hweight8(new_active_planes))
   14455   1.1  riastrad 			continue;
   14456   1.1  riastrad 
   14457   1.1  riastrad 		ret = intel_crtc_add_planes_to_state(state, crtc, new_active_planes);
   14458   1.1  riastrad 		if (ret)
   14459   1.1  riastrad 			return ret;
   14460   1.1  riastrad 	}
   14461   1.1  riastrad 
   14462   1.1  riastrad 	/*
   14463   1.1  riastrad 	 * active_planes bitmask has been updated, and potentially
   14464   1.1  riastrad 	 * affected planes are part of the state. We can now
   14465   1.1  riastrad 	 * compute the minimum cdclk for each plane.
   14466   1.1  riastrad 	 */
   14467   1.1  riastrad 	for_each_new_intel_plane_in_state(state, plane, plane_state, i)
   14468   1.1  riastrad 		*need_modeset |= intel_plane_calc_min_cdclk(state, plane);
   14469   1.1  riastrad 
   14470   1.1  riastrad 	return 0;
   14471   1.1  riastrad }
   14472   1.1  riastrad 
   14473   1.1  riastrad static int intel_atomic_check_crtcs(struct intel_atomic_state *state)
   14474   1.1  riastrad {
   14475   1.3  riastrad 	struct intel_crtc_state *crtc_state __unused;
   14476   1.1  riastrad 	struct intel_crtc *crtc;
   14477   1.1  riastrad 	int i;
   14478   1.1  riastrad 
   14479   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
   14480   1.1  riastrad 		int ret = intel_crtc_atomic_check(state, crtc);
   14481   1.1  riastrad 		if (ret) {
   14482   1.1  riastrad 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
   14483   1.1  riastrad 					 crtc->base.base.id, crtc->base.name);
   14484   1.1  riastrad 			return ret;
   14485   1.1  riastrad 		}
   14486   1.1  riastrad 	}
   14487   1.1  riastrad 
   14488   1.1  riastrad 	return 0;
   14489   1.1  riastrad }
   14490   1.1  riastrad 
   14491   1.1  riastrad static bool intel_cpu_transcoders_need_modeset(struct intel_atomic_state *state,
   14492   1.1  riastrad 					       u8 transcoders)
   14493   1.1  riastrad {
   14494   1.1  riastrad 	const struct intel_crtc_state *new_crtc_state;
   14495   1.1  riastrad 	struct intel_crtc *crtc;
   14496   1.1  riastrad 	int i;
   14497   1.1  riastrad 
   14498   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14499   1.1  riastrad 		if (new_crtc_state->hw.enable &&
   14500   1.1  riastrad 		    transcoders & BIT(new_crtc_state->cpu_transcoder) &&
   14501   1.1  riastrad 		    needs_modeset(new_crtc_state))
   14502   1.1  riastrad 			return true;
   14503   1.1  riastrad 	}
   14504   1.1  riastrad 
   14505   1.1  riastrad 	return false;
   14506   1.1  riastrad }
   14507   1.1  riastrad 
   14508   1.1  riastrad static int
   14509   1.1  riastrad intel_modeset_all_tiles(struct intel_atomic_state *state, int tile_grp_id)
   14510   1.1  riastrad {
   14511   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14512   1.1  riastrad 	struct drm_connector *connector;
   14513   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   14514   1.1  riastrad 	int ret = 0;
   14515   1.1  riastrad 
   14516   1.1  riastrad 	drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
   14517   1.1  riastrad 	drm_for_each_connector_iter(connector, &conn_iter) {
   14518   1.1  riastrad 		struct drm_connector_state *conn_state;
   14519   1.1  riastrad 		struct drm_crtc_state *crtc_state;
   14520   1.1  riastrad 
   14521   1.1  riastrad 		if (!connector->has_tile ||
   14522   1.1  riastrad 		    connector->tile_group->id != tile_grp_id)
   14523   1.1  riastrad 			continue;
   14524   1.1  riastrad 		conn_state = drm_atomic_get_connector_state(&state->base,
   14525   1.1  riastrad 							    connector);
   14526   1.1  riastrad 		if (IS_ERR(conn_state)) {
   14527   1.1  riastrad 			ret =  PTR_ERR(conn_state);
   14528   1.1  riastrad 			break;
   14529   1.1  riastrad 		}
   14530   1.1  riastrad 
   14531   1.1  riastrad 		if (!conn_state->crtc)
   14532   1.1  riastrad 			continue;
   14533   1.1  riastrad 
   14534   1.1  riastrad 		crtc_state = drm_atomic_get_crtc_state(&state->base,
   14535   1.1  riastrad 						       conn_state->crtc);
   14536   1.1  riastrad 		if (IS_ERR(crtc_state)) {
   14537   1.1  riastrad 			ret = PTR_ERR(crtc_state);
   14538   1.1  riastrad 			break;
   14539   1.1  riastrad 		}
   14540   1.1  riastrad 		crtc_state->mode_changed = true;
   14541   1.1  riastrad 		ret = drm_atomic_add_affected_connectors(&state->base,
   14542   1.1  riastrad 							 conn_state->crtc);
   14543   1.1  riastrad 		if (ret)
   14544   1.1  riastrad 			break;
   14545   1.1  riastrad 	}
   14546   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   14547   1.1  riastrad 
   14548   1.1  riastrad 	return ret;
   14549   1.1  riastrad }
   14550   1.1  riastrad 
   14551   1.1  riastrad static int
   14552   1.1  riastrad intel_atomic_check_tiled_conns(struct intel_atomic_state *state)
   14553   1.1  riastrad {
   14554   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14555   1.1  riastrad 	struct drm_connector *connector;
   14556   1.3  riastrad 	struct drm_connector_state *old_conn_state __unused, *new_conn_state __unused;
   14557   1.1  riastrad 	int i, ret;
   14558   1.1  riastrad 
   14559   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 11)
   14560   1.1  riastrad 		return 0;
   14561   1.1  riastrad 
   14562   1.1  riastrad 	/* Is tiled, mark all other tiled CRTCs as needing a modeset */
   14563   1.1  riastrad 	for_each_oldnew_connector_in_state(&state->base, connector,
   14564   1.1  riastrad 					   old_conn_state, new_conn_state, i) {
   14565   1.1  riastrad 		if (!connector->has_tile)
   14566   1.1  riastrad 			continue;
   14567   1.1  riastrad 		if (!intel_connector_needs_modeset(state, connector))
   14568   1.1  riastrad 			continue;
   14569   1.1  riastrad 
   14570   1.1  riastrad 		ret = intel_modeset_all_tiles(state, connector->tile_group->id);
   14571   1.1  riastrad 		if (ret)
   14572   1.1  riastrad 			return ret;
   14573   1.1  riastrad 	}
   14574   1.1  riastrad 
   14575   1.1  riastrad 	return 0;
   14576   1.1  riastrad }
   14577   1.1  riastrad 
   14578   1.1  riastrad /**
   14579   1.1  riastrad  * intel_atomic_check - validate state object
   14580   1.1  riastrad  * @dev: drm device
   14581   1.1  riastrad  * @_state: state to validate
   14582   1.1  riastrad  */
   14583   1.1  riastrad static int intel_atomic_check(struct drm_device *dev,
   14584   1.1  riastrad 			      struct drm_atomic_state *_state)
   14585   1.1  riastrad {
   14586   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   14587   1.1  riastrad 	struct intel_atomic_state *state = to_intel_atomic_state(_state);
   14588   1.1  riastrad 	struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   14589   1.1  riastrad 	struct intel_crtc *crtc;
   14590   1.1  riastrad 	int ret, i;
   14591   1.1  riastrad 	bool any_ms = false;
   14592   1.1  riastrad 
   14593   1.1  riastrad 	/* Catch I915_MODE_FLAG_INHERITED */
   14594   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14595   1.1  riastrad 					    new_crtc_state, i) {
   14596   1.1  riastrad 		if (new_crtc_state->hw.mode.private_flags !=
   14597   1.1  riastrad 		    old_crtc_state->hw.mode.private_flags)
   14598   1.1  riastrad 			new_crtc_state->uapi.mode_changed = true;
   14599   1.1  riastrad 	}
   14600   1.1  riastrad 
   14601   1.1  riastrad 	ret = drm_atomic_helper_check_modeset(dev, &state->base);
   14602   1.1  riastrad 	if (ret)
   14603   1.1  riastrad 		goto fail;
   14604   1.1  riastrad 
   14605   1.1  riastrad 	/**
   14606   1.1  riastrad 	 * This check adds all the connectors in current state that belong to
   14607   1.1  riastrad 	 * the same tile group to a full modeset.
   14608   1.1  riastrad 	 * This function directly sets the mode_changed to true and we also call
   14609   1.1  riastrad 	 * drm_atomic_add_affected_connectors(). Hence we are not explicitly
   14610   1.1  riastrad 	 * calling drm_atomic_helper_check_modeset() after this.
   14611   1.1  riastrad 	 *
   14612   1.1  riastrad 	 * Fixme: Handle some corner cases where one of the
   14613   1.1  riastrad 	 * tiled connectors gets disconnected and tile info is lost but since it
   14614   1.1  riastrad 	 * was previously synced to other conn, we need to add that to the modeset.
   14615   1.1  riastrad 	 */
   14616   1.1  riastrad 	ret = intel_atomic_check_tiled_conns(state);
   14617   1.1  riastrad 	if (ret)
   14618   1.1  riastrad 		goto fail;
   14619   1.1  riastrad 
   14620   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14621   1.1  riastrad 					    new_crtc_state, i) {
   14622   1.1  riastrad 		if (!needs_modeset(new_crtc_state)) {
   14623   1.1  riastrad 			/* Light copy */
   14624   1.1  riastrad 			intel_crtc_copy_uapi_to_hw_state_nomodeset(new_crtc_state);
   14625   1.1  riastrad 
   14626   1.1  riastrad 			continue;
   14627   1.1  riastrad 		}
   14628   1.1  riastrad 
   14629   1.1  riastrad 		if (!new_crtc_state->uapi.enable) {
   14630   1.1  riastrad 			intel_crtc_copy_uapi_to_hw_state(new_crtc_state);
   14631   1.1  riastrad 			continue;
   14632   1.1  riastrad 		}
   14633   1.1  riastrad 
   14634   1.1  riastrad 		ret = intel_crtc_prepare_cleared_state(new_crtc_state);
   14635   1.1  riastrad 		if (ret)
   14636   1.1  riastrad 			goto fail;
   14637   1.1  riastrad 
   14638   1.1  riastrad 		ret = intel_modeset_pipe_config(new_crtc_state);
   14639   1.1  riastrad 		if (ret)
   14640   1.1  riastrad 			goto fail;
   14641   1.1  riastrad 
   14642   1.1  riastrad 		intel_crtc_check_fastset(old_crtc_state, new_crtc_state);
   14643   1.1  riastrad 	}
   14644   1.1  riastrad 
   14645   1.1  riastrad 	/**
   14646   1.1  riastrad 	 * Check if fastset is allowed by external dependencies like other
   14647   1.1  riastrad 	 * pipes and transcoders.
   14648   1.1  riastrad 	 *
   14649   1.1  riastrad 	 * Right now it only forces a fullmodeset when the MST master
   14650   1.1  riastrad 	 * transcoder did not changed but the pipe of the master transcoder
   14651   1.1  riastrad 	 * needs a fullmodeset so all slaves also needs to do a fullmodeset or
   14652   1.1  riastrad 	 * in case of port synced crtcs, if one of the synced crtcs
   14653   1.1  riastrad 	 * needs a full modeset, all other synced crtcs should be
   14654   1.1  riastrad 	 * forced a full modeset.
   14655   1.1  riastrad 	 */
   14656   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   14657   1.1  riastrad 		if (!new_crtc_state->hw.enable || needs_modeset(new_crtc_state))
   14658   1.1  riastrad 			continue;
   14659   1.1  riastrad 
   14660   1.1  riastrad 		if (intel_dp_mst_is_slave_trans(new_crtc_state)) {
   14661   1.1  riastrad 			enum transcoder master = new_crtc_state->mst_master_transcoder;
   14662   1.1  riastrad 
   14663   1.1  riastrad 			if (intel_cpu_transcoders_need_modeset(state, BIT(master))) {
   14664   1.1  riastrad 				new_crtc_state->uapi.mode_changed = true;
   14665   1.1  riastrad 				new_crtc_state->update_pipe = false;
   14666   1.1  riastrad 			}
   14667   1.1  riastrad 		}
   14668   1.1  riastrad 
   14669   1.1  riastrad 		if (is_trans_port_sync_mode(new_crtc_state)) {
   14670   1.1  riastrad 			u8 trans = new_crtc_state->sync_mode_slaves_mask |
   14671   1.1  riastrad 				   BIT(new_crtc_state->master_transcoder);
   14672   1.1  riastrad 
   14673   1.1  riastrad 			if (intel_cpu_transcoders_need_modeset(state, trans)) {
   14674   1.1  riastrad 				new_crtc_state->uapi.mode_changed = true;
   14675   1.1  riastrad 				new_crtc_state->update_pipe = false;
   14676   1.1  riastrad 			}
   14677   1.1  riastrad 		}
   14678   1.1  riastrad 	}
   14679   1.1  riastrad 
   14680   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14681   1.1  riastrad 					    new_crtc_state, i) {
   14682   1.1  riastrad 		if (needs_modeset(new_crtc_state)) {
   14683   1.1  riastrad 			any_ms = true;
   14684   1.1  riastrad 			continue;
   14685   1.1  riastrad 		}
   14686   1.1  riastrad 
   14687   1.1  riastrad 		if (!new_crtc_state->update_pipe)
   14688   1.1  riastrad 			continue;
   14689   1.1  riastrad 
   14690   1.1  riastrad 		intel_crtc_copy_fastset(old_crtc_state, new_crtc_state);
   14691   1.1  riastrad 	}
   14692   1.1  riastrad 
   14693   1.1  riastrad 	if (any_ms && !check_digital_port_conflicts(state)) {
   14694   1.1  riastrad 		DRM_DEBUG_KMS("rejecting conflicting digital port configuration\n");
   14695   1.1  riastrad 		ret = EINVAL;
   14696   1.1  riastrad 		goto fail;
   14697   1.1  riastrad 	}
   14698   1.1  riastrad 
   14699   1.1  riastrad 	ret = drm_dp_mst_atomic_check(&state->base);
   14700   1.1  riastrad 	if (ret)
   14701   1.1  riastrad 		goto fail;
   14702   1.1  riastrad 
   14703   1.1  riastrad 	any_ms |= state->cdclk.force_min_cdclk_changed;
   14704   1.1  riastrad 
   14705   1.1  riastrad 	ret = intel_atomic_check_planes(state, &any_ms);
   14706   1.1  riastrad 	if (ret)
   14707   1.1  riastrad 		goto fail;
   14708   1.1  riastrad 
   14709   1.1  riastrad 	if (any_ms) {
   14710   1.1  riastrad 		ret = intel_modeset_checks(state);
   14711   1.1  riastrad 		if (ret)
   14712   1.1  riastrad 			goto fail;
   14713   1.1  riastrad 	} else {
   14714   1.1  riastrad 		state->cdclk.logical = dev_priv->cdclk.logical;
   14715   1.1  riastrad 	}
   14716   1.1  riastrad 
   14717   1.1  riastrad 	ret = intel_atomic_check_crtcs(state);
   14718   1.1  riastrad 	if (ret)
   14719   1.1  riastrad 		goto fail;
   14720   1.1  riastrad 
   14721   1.1  riastrad 	intel_fbc_choose_crtc(dev_priv, state);
   14722   1.1  riastrad 	ret = calc_watermark_data(state);
   14723   1.1  riastrad 	if (ret)
   14724   1.1  riastrad 		goto fail;
   14725   1.1  riastrad 
   14726   1.1  riastrad 	ret = intel_bw_atomic_check(state);
   14727   1.1  riastrad 	if (ret)
   14728   1.1  riastrad 		goto fail;
   14729   1.1  riastrad 
   14730   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14731   1.1  riastrad 					    new_crtc_state, i) {
   14732   1.1  riastrad 		if (!needs_modeset(new_crtc_state) &&
   14733   1.1  riastrad 		    !new_crtc_state->update_pipe)
   14734   1.1  riastrad 			continue;
   14735   1.1  riastrad 
   14736   1.1  riastrad 		intel_dump_pipe_config(new_crtc_state, state,
   14737   1.1  riastrad 				       needs_modeset(new_crtc_state) ?
   14738   1.1  riastrad 				       "[modeset]" : "[fastset]");
   14739   1.1  riastrad 	}
   14740   1.1  riastrad 
   14741   1.1  riastrad 	return 0;
   14742   1.1  riastrad 
   14743   1.1  riastrad  fail:
   14744   1.1  riastrad 	if (ret == -EDEADLK)
   14745   1.1  riastrad 		return ret;
   14746   1.1  riastrad 
   14747   1.1  riastrad 	/*
   14748   1.1  riastrad 	 * FIXME would probably be nice to know which crtc specifically
   14749   1.1  riastrad 	 * caused the failure, in cases where we can pinpoint it.
   14750   1.1  riastrad 	 */
   14751   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14752   1.1  riastrad 					    new_crtc_state, i)
   14753   1.1  riastrad 		intel_dump_pipe_config(new_crtc_state, state, "[failed]");
   14754   1.1  riastrad 
   14755   1.1  riastrad 	return ret;
   14756   1.1  riastrad }
   14757   1.1  riastrad 
   14758   1.1  riastrad static int intel_atomic_prepare_commit(struct intel_atomic_state *state)
   14759   1.1  riastrad {
   14760   1.1  riastrad 	return drm_atomic_helper_prepare_planes(state->base.dev,
   14761   1.1  riastrad 						&state->base);
   14762   1.1  riastrad }
   14763   1.1  riastrad 
   14764   1.1  riastrad u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
   14765   1.1  riastrad {
   14766   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   14767   1.1  riastrad 	struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(&crtc->base)];
   14768   1.1  riastrad 
   14769   1.1  riastrad 	if (!vblank->max_vblank_count)
   14770   1.1  riastrad 		return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
   14771   1.1  riastrad 
   14772   1.1  riastrad 	return crtc->base.funcs->get_vblank_counter(&crtc->base);
   14773   1.1  riastrad }
   14774   1.1  riastrad 
   14775   1.1  riastrad void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
   14776   1.1  riastrad 				  struct intel_crtc_state *crtc_state)
   14777   1.1  riastrad {
   14778   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14779   1.1  riastrad 
   14780   1.1  riastrad 	if (!IS_GEN(dev_priv, 2) || crtc_state->active_planes)
   14781   1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
   14782   1.1  riastrad 
   14783   1.1  riastrad 	if (crtc_state->has_pch_encoder) {
   14784   1.1  riastrad 		enum pipe pch_transcoder =
   14785   1.1  riastrad 			intel_crtc_pch_transcoder(crtc);
   14786   1.1  riastrad 
   14787   1.1  riastrad 		intel_set_pch_fifo_underrun_reporting(dev_priv, pch_transcoder, true);
   14788   1.1  riastrad 	}
   14789   1.1  riastrad }
   14790   1.1  riastrad 
   14791   1.1  riastrad static void intel_pipe_fastset(const struct intel_crtc_state *old_crtc_state,
   14792   1.1  riastrad 			       const struct intel_crtc_state *new_crtc_state)
   14793   1.1  riastrad {
   14794   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   14795   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   14796   1.1  riastrad 
   14797   1.1  riastrad 	/*
   14798   1.1  riastrad 	 * Update pipe size and adjust fitter if needed: the reason for this is
   14799   1.1  riastrad 	 * that in compute_mode_changes we check the native mode (not the pfit
   14800   1.1  riastrad 	 * mode) to see if we can flip rather than do a full mode set. In the
   14801   1.1  riastrad 	 * fastboot case, we'll flip, but if we don't update the pipesrc and
   14802   1.1  riastrad 	 * pfit state, we'll end up with a big fb scanned out into the wrong
   14803   1.1  riastrad 	 * sized surface.
   14804   1.1  riastrad 	 */
   14805   1.1  riastrad 	intel_set_pipe_src_size(new_crtc_state);
   14806   1.1  riastrad 
   14807   1.1  riastrad 	/* on skylake this is done by detaching scalers */
   14808   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9) {
   14809   1.1  riastrad 		skl_detach_scalers(new_crtc_state);
   14810   1.1  riastrad 
   14811   1.1  riastrad 		if (new_crtc_state->pch_pfit.enabled)
   14812   1.1  riastrad 			skl_pfit_enable(new_crtc_state);
   14813   1.1  riastrad 	} else if (HAS_PCH_SPLIT(dev_priv)) {
   14814   1.1  riastrad 		if (new_crtc_state->pch_pfit.enabled)
   14815   1.1  riastrad 			ilk_pfit_enable(new_crtc_state);
   14816   1.1  riastrad 		else if (old_crtc_state->pch_pfit.enabled)
   14817   1.1  riastrad 			ilk_pfit_disable(old_crtc_state);
   14818   1.1  riastrad 	}
   14819   1.1  riastrad 
   14820   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   14821   1.1  riastrad 		icl_set_pipe_chicken(crtc);
   14822   1.1  riastrad }
   14823   1.1  riastrad 
   14824   1.1  riastrad static void commit_pipe_config(struct intel_atomic_state *state,
   14825   1.1  riastrad 			       struct intel_crtc_state *old_crtc_state,
   14826   1.1  riastrad 			       struct intel_crtc_state *new_crtc_state)
   14827   1.1  riastrad {
   14828   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
   14829   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14830   1.1  riastrad 	bool modeset = needs_modeset(new_crtc_state);
   14831   1.1  riastrad 
   14832   1.1  riastrad 	/*
   14833   1.1  riastrad 	 * During modesets pipe configuration was programmed as the
   14834   1.1  riastrad 	 * CRTC was enabled.
   14835   1.1  riastrad 	 */
   14836   1.1  riastrad 	if (!modeset) {
   14837   1.1  riastrad 		if (new_crtc_state->uapi.color_mgmt_changed ||
   14838   1.1  riastrad 		    new_crtc_state->update_pipe)
   14839   1.1  riastrad 			intel_color_commit(new_crtc_state);
   14840   1.1  riastrad 
   14841   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 9)
   14842   1.1  riastrad 			skl_detach_scalers(new_crtc_state);
   14843   1.1  riastrad 
   14844   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
   14845   1.1  riastrad 			bdw_set_pipemisc(new_crtc_state);
   14846   1.1  riastrad 
   14847   1.1  riastrad 		if (new_crtc_state->update_pipe)
   14848   1.1  riastrad 			intel_pipe_fastset(old_crtc_state, new_crtc_state);
   14849   1.1  riastrad 	}
   14850   1.1  riastrad 
   14851   1.1  riastrad 	if (dev_priv->display.atomic_update_watermarks)
   14852   1.1  riastrad 		dev_priv->display.atomic_update_watermarks(state, crtc);
   14853   1.1  riastrad }
   14854   1.1  riastrad 
   14855   1.1  riastrad static void intel_update_crtc(struct intel_crtc *crtc,
   14856   1.1  riastrad 			      struct intel_atomic_state *state,
   14857   1.1  riastrad 			      struct intel_crtc_state *old_crtc_state,
   14858   1.1  riastrad 			      struct intel_crtc_state *new_crtc_state)
   14859   1.1  riastrad {
   14860   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14861   1.1  riastrad 	bool modeset = needs_modeset(new_crtc_state);
   14862   1.1  riastrad 	struct intel_plane_state *new_plane_state =
   14863   1.1  riastrad 		intel_atomic_get_new_plane_state(state,
   14864   1.1  riastrad 						 to_intel_plane(crtc->base.primary));
   14865   1.1  riastrad 
   14866   1.1  riastrad 	if (modeset) {
   14867   1.1  riastrad 		intel_crtc_update_active_timings(new_crtc_state);
   14868   1.1  riastrad 
   14869   1.1  riastrad 		dev_priv->display.crtc_enable(state, crtc);
   14870   1.1  riastrad 
   14871   1.1  riastrad 		/* vblanks work again, re-enable pipe CRC. */
   14872   1.1  riastrad 		intel_crtc_enable_pipe_crc(crtc);
   14873   1.1  riastrad 	} else {
   14874   1.1  riastrad 		if (new_crtc_state->preload_luts &&
   14875   1.1  riastrad 		    (new_crtc_state->uapi.color_mgmt_changed ||
   14876   1.1  riastrad 		     new_crtc_state->update_pipe))
   14877   1.1  riastrad 			intel_color_load_luts(new_crtc_state);
   14878   1.1  riastrad 
   14879   1.1  riastrad 		intel_pre_plane_update(state, crtc);
   14880   1.1  riastrad 
   14881   1.1  riastrad 		if (new_crtc_state->update_pipe)
   14882   1.1  riastrad 			intel_encoders_update_pipe(state, crtc);
   14883   1.1  riastrad 	}
   14884   1.1  riastrad 
   14885   1.1  riastrad 	if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
   14886   1.1  riastrad 		intel_fbc_disable(crtc);
   14887   1.1  riastrad 	else if (new_plane_state)
   14888   1.1  riastrad 		intel_fbc_enable(crtc, new_crtc_state, new_plane_state);
   14889   1.1  riastrad 
   14890   1.1  riastrad 	/* Perform vblank evasion around commit operation */
   14891   1.1  riastrad 	intel_pipe_update_start(new_crtc_state);
   14892   1.1  riastrad 
   14893   1.1  riastrad 	commit_pipe_config(state, old_crtc_state, new_crtc_state);
   14894   1.1  riastrad 
   14895   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   14896   1.1  riastrad 		skl_update_planes_on_crtc(state, crtc);
   14897   1.1  riastrad 	else
   14898   1.1  riastrad 		i9xx_update_planes_on_crtc(state, crtc);
   14899   1.1  riastrad 
   14900   1.1  riastrad 	intel_pipe_update_end(new_crtc_state);
   14901   1.1  riastrad 
   14902   1.1  riastrad 	/*
   14903   1.1  riastrad 	 * We usually enable FIFO underrun interrupts as part of the
   14904   1.1  riastrad 	 * CRTC enable sequence during modesets.  But when we inherit a
   14905   1.1  riastrad 	 * valid pipe configuration from the BIOS we need to take care
   14906   1.1  riastrad 	 * of enabling them on the CRTC's first fastset.
   14907   1.1  riastrad 	 */
   14908   1.1  riastrad 	if (new_crtc_state->update_pipe && !modeset &&
   14909   1.1  riastrad 	    old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
   14910   1.1  riastrad 		intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
   14911   1.1  riastrad }
   14912   1.1  riastrad 
   14913   1.1  riastrad static struct intel_crtc *intel_get_slave_crtc(const struct intel_crtc_state *new_crtc_state)
   14914   1.1  riastrad {
   14915   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(new_crtc_state->uapi.crtc->dev);
   14916   1.1  riastrad 	enum transcoder slave_transcoder;
   14917   1.1  riastrad 
   14918   1.1  riastrad 	WARN_ON(!is_power_of_2(new_crtc_state->sync_mode_slaves_mask));
   14919   1.1  riastrad 
   14920   1.1  riastrad 	slave_transcoder = ffs(new_crtc_state->sync_mode_slaves_mask) - 1;
   14921   1.1  riastrad 	return intel_get_crtc_for_pipe(dev_priv,
   14922   1.1  riastrad 				       (enum pipe)slave_transcoder);
   14923   1.1  riastrad }
   14924   1.1  riastrad 
   14925   1.1  riastrad static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
   14926   1.1  riastrad 					  struct intel_crtc_state *old_crtc_state,
   14927   1.1  riastrad 					  struct intel_crtc_state *new_crtc_state,
   14928   1.1  riastrad 					  struct intel_crtc *crtc)
   14929   1.1  riastrad {
   14930   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   14931   1.1  riastrad 
   14932   1.1  riastrad 	intel_crtc_disable_planes(state, crtc);
   14933   1.1  riastrad 
   14934   1.1  riastrad 	/*
   14935   1.1  riastrad 	 * We need to disable pipe CRC before disabling the pipe,
   14936   1.1  riastrad 	 * or we race against vblank off.
   14937   1.1  riastrad 	 */
   14938   1.1  riastrad 	intel_crtc_disable_pipe_crc(crtc);
   14939   1.1  riastrad 
   14940   1.1  riastrad 	dev_priv->display.crtc_disable(state, crtc);
   14941   1.1  riastrad 	crtc->active = false;
   14942   1.1  riastrad 	intel_fbc_disable(crtc);
   14943   1.1  riastrad 	intel_disable_shared_dpll(old_crtc_state);
   14944   1.1  riastrad 
   14945   1.1  riastrad 	/* FIXME unify this for all platforms */
   14946   1.1  riastrad 	if (!new_crtc_state->hw.active &&
   14947   1.1  riastrad 	    !HAS_GMCH(dev_priv) &&
   14948   1.1  riastrad 	    dev_priv->display.initial_watermarks)
   14949   1.1  riastrad 		dev_priv->display.initial_watermarks(state, crtc);
   14950   1.1  riastrad }
   14951   1.1  riastrad 
   14952   1.1  riastrad static void intel_commit_modeset_disables(struct intel_atomic_state *state)
   14953   1.1  riastrad {
   14954   1.1  riastrad 	struct intel_crtc_state *new_crtc_state, *old_crtc_state;
   14955   1.1  riastrad 	struct intel_crtc *crtc;
   14956   1.1  riastrad 	u32 handled = 0;
   14957   1.1  riastrad 	int i;
   14958   1.1  riastrad 
   14959   1.1  riastrad 	/* Only disable port sync and MST slaves */
   14960   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14961   1.1  riastrad 					    new_crtc_state, i) {
   14962   1.1  riastrad 		if (!needs_modeset(new_crtc_state))
   14963   1.1  riastrad 			continue;
   14964   1.1  riastrad 
   14965   1.1  riastrad 		if (!old_crtc_state->hw.active)
   14966   1.1  riastrad 			continue;
   14967   1.1  riastrad 
   14968   1.1  riastrad 		/* In case of Transcoder port Sync master slave CRTCs can be
   14969   1.1  riastrad 		 * assigned in any order and we need to make sure that
   14970   1.1  riastrad 		 * slave CRTCs are disabled first and then master CRTC since
   14971   1.1  riastrad 		 * Slave vblanks are masked till Master Vblanks.
   14972   1.1  riastrad 		 */
   14973   1.1  riastrad 		if (!is_trans_port_sync_slave(old_crtc_state) &&
   14974   1.1  riastrad 		    !intel_dp_mst_is_slave_trans(old_crtc_state))
   14975   1.1  riastrad 			continue;
   14976   1.1  riastrad 
   14977   1.1  riastrad 		intel_pre_plane_update(state, crtc);
   14978   1.1  riastrad 		intel_old_crtc_state_disables(state, old_crtc_state,
   14979   1.1  riastrad 					      new_crtc_state, crtc);
   14980   1.1  riastrad 		handled |= BIT(crtc->pipe);
   14981   1.1  riastrad 	}
   14982   1.1  riastrad 
   14983   1.1  riastrad 	/* Disable everything else left on */
   14984   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   14985   1.1  riastrad 					    new_crtc_state, i) {
   14986   1.1  riastrad 		if (!needs_modeset(new_crtc_state) ||
   14987   1.1  riastrad 		    (handled & BIT(crtc->pipe)))
   14988   1.1  riastrad 			continue;
   14989   1.1  riastrad 
   14990   1.1  riastrad 		intel_pre_plane_update(state, crtc);
   14991   1.1  riastrad 		if (old_crtc_state->hw.active)
   14992   1.1  riastrad 			intel_old_crtc_state_disables(state, old_crtc_state,
   14993   1.1  riastrad 						      new_crtc_state, crtc);
   14994   1.1  riastrad 	}
   14995   1.1  riastrad }
   14996   1.1  riastrad 
   14997   1.1  riastrad static void intel_commit_modeset_enables(struct intel_atomic_state *state)
   14998   1.1  riastrad {
   14999   1.1  riastrad 	struct intel_crtc *crtc;
   15000   1.1  riastrad 	struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   15001   1.1  riastrad 	int i;
   15002   1.1  riastrad 
   15003   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   15004   1.1  riastrad 		if (!new_crtc_state->hw.active)
   15005   1.1  riastrad 			continue;
   15006   1.1  riastrad 
   15007   1.1  riastrad 		intel_update_crtc(crtc, state, old_crtc_state,
   15008   1.1  riastrad 				  new_crtc_state);
   15009   1.1  riastrad 	}
   15010   1.1  riastrad }
   15011   1.1  riastrad 
   15012   1.1  riastrad static void intel_crtc_enable_trans_port_sync(struct intel_crtc *crtc,
   15013   1.1  riastrad 					      struct intel_atomic_state *state,
   15014   1.1  riastrad 					      struct intel_crtc_state *new_crtc_state)
   15015   1.1  riastrad {
   15016   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   15017   1.1  riastrad 
   15018   1.1  riastrad 	intel_crtc_update_active_timings(new_crtc_state);
   15019   1.1  riastrad 	dev_priv->display.crtc_enable(state, crtc);
   15020   1.1  riastrad 	intel_crtc_enable_pipe_crc(crtc);
   15021   1.1  riastrad }
   15022   1.1  riastrad 
   15023   1.1  riastrad static void intel_set_dp_tp_ctl_normal(struct intel_crtc *crtc,
   15024   1.1  riastrad 				       struct intel_atomic_state *state)
   15025   1.1  riastrad {
   15026   1.1  riastrad 	struct drm_connector *uninitialized_var(conn);
   15027   1.1  riastrad 	struct drm_connector_state *conn_state;
   15028   1.1  riastrad 	struct intel_dp *intel_dp;
   15029   1.1  riastrad 	int i;
   15030   1.1  riastrad 
   15031   1.1  riastrad 	for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
   15032   1.1  riastrad 		if (conn_state->crtc == &crtc->base)
   15033   1.1  riastrad 			break;
   15034   1.1  riastrad 	}
   15035   1.1  riastrad 	intel_dp = enc_to_intel_dp(intel_attached_encoder(to_intel_connector(conn)));
   15036   1.1  riastrad 	intel_dp_stop_link_train(intel_dp);
   15037   1.1  riastrad }
   15038   1.1  riastrad 
   15039   1.1  riastrad /*
   15040   1.1  riastrad  * TODO: This is only called from port sync and it is identical to what will be
   15041   1.1  riastrad  * executed again in intel_update_crtc() over port sync pipes
   15042   1.1  riastrad  */
   15043   1.1  riastrad static void intel_post_crtc_enable_updates(struct intel_crtc *crtc,
   15044   1.1  riastrad 					   struct intel_atomic_state *state)
   15045   1.1  riastrad {
   15046   1.1  riastrad 	struct intel_crtc_state *new_crtc_state =
   15047   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, crtc);
   15048   1.1  riastrad 	struct intel_crtc_state *old_crtc_state =
   15049   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, crtc);
   15050   1.1  riastrad 	struct intel_plane_state *new_plane_state =
   15051   1.1  riastrad 		intel_atomic_get_new_plane_state(state,
   15052   1.1  riastrad 						 to_intel_plane(crtc->base.primary));
   15053   1.1  riastrad 	bool modeset = needs_modeset(new_crtc_state);
   15054   1.1  riastrad 
   15055   1.1  riastrad 	if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
   15056   1.1  riastrad 		intel_fbc_disable(crtc);
   15057   1.1  riastrad 	else if (new_plane_state)
   15058   1.1  riastrad 		intel_fbc_enable(crtc, new_crtc_state, new_plane_state);
   15059   1.1  riastrad 
   15060   1.1  riastrad 	/* Perform vblank evasion around commit operation */
   15061   1.1  riastrad 	intel_pipe_update_start(new_crtc_state);
   15062   1.1  riastrad 	commit_pipe_config(state, old_crtc_state, new_crtc_state);
   15063   1.1  riastrad 	skl_update_planes_on_crtc(state, crtc);
   15064   1.1  riastrad 	intel_pipe_update_end(new_crtc_state);
   15065   1.1  riastrad 
   15066   1.1  riastrad 	/*
   15067   1.1  riastrad 	 * We usually enable FIFO underrun interrupts as part of the
   15068   1.1  riastrad 	 * CRTC enable sequence during modesets.  But when we inherit a
   15069   1.1  riastrad 	 * valid pipe configuration from the BIOS we need to take care
   15070   1.1  riastrad 	 * of enabling them on the CRTC's first fastset.
   15071   1.1  riastrad 	 */
   15072   1.1  riastrad 	if (new_crtc_state->update_pipe && !modeset &&
   15073   1.1  riastrad 	    old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
   15074   1.1  riastrad 		intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
   15075   1.1  riastrad }
   15076   1.1  riastrad 
   15077   1.1  riastrad static void intel_update_trans_port_sync_crtcs(struct intel_crtc *crtc,
   15078   1.1  riastrad 					       struct intel_atomic_state *state,
   15079   1.1  riastrad 					       struct intel_crtc_state *old_crtc_state,
   15080   1.1  riastrad 					       struct intel_crtc_state *new_crtc_state)
   15081   1.1  riastrad {
   15082   1.1  riastrad 	struct intel_crtc *slave_crtc = intel_get_slave_crtc(new_crtc_state);
   15083   1.1  riastrad 	struct intel_crtc_state *new_slave_crtc_state =
   15084   1.1  riastrad 		intel_atomic_get_new_crtc_state(state, slave_crtc);
   15085   1.1  riastrad 	struct intel_crtc_state *old_slave_crtc_state =
   15086   1.1  riastrad 		intel_atomic_get_old_crtc_state(state, slave_crtc);
   15087   1.1  riastrad 
   15088   1.1  riastrad 	WARN_ON(!slave_crtc || !new_slave_crtc_state ||
   15089   1.1  riastrad 		!old_slave_crtc_state);
   15090   1.1  riastrad 
   15091   1.1  riastrad 	DRM_DEBUG_KMS("Updating Transcoder Port Sync Master CRTC = %d %s and Slave CRTC %d %s\n",
   15092   1.1  riastrad 		      crtc->base.base.id, crtc->base.name, slave_crtc->base.base.id,
   15093   1.1  riastrad 		      slave_crtc->base.name);
   15094   1.1  riastrad 
   15095   1.1  riastrad 	/* Enable seq for slave with with DP_TP_CTL left Idle until the
   15096   1.1  riastrad 	 * master is ready
   15097   1.1  riastrad 	 */
   15098   1.1  riastrad 	intel_crtc_enable_trans_port_sync(slave_crtc,
   15099   1.1  riastrad 					  state,
   15100   1.1  riastrad 					  new_slave_crtc_state);
   15101   1.1  riastrad 
   15102   1.1  riastrad 	/* Enable seq for master with with DP_TP_CTL left Idle */
   15103   1.1  riastrad 	intel_crtc_enable_trans_port_sync(crtc,
   15104   1.1  riastrad 					  state,
   15105   1.1  riastrad 					  new_crtc_state);
   15106   1.1  riastrad 
   15107   1.1  riastrad 	/* Set Slave's DP_TP_CTL to Normal */
   15108   1.1  riastrad 	intel_set_dp_tp_ctl_normal(slave_crtc,
   15109   1.1  riastrad 				   state);
   15110   1.1  riastrad 
   15111   1.1  riastrad 	/* Set Master's DP_TP_CTL To Normal */
   15112   1.1  riastrad 	usleep_range(200, 400);
   15113   1.1  riastrad 	intel_set_dp_tp_ctl_normal(crtc,
   15114   1.1  riastrad 				   state);
   15115   1.1  riastrad 
   15116   1.1  riastrad 	/* Now do the post crtc enable for all master and slaves */
   15117   1.1  riastrad 	intel_post_crtc_enable_updates(slave_crtc,
   15118   1.1  riastrad 				       state);
   15119   1.1  riastrad 	intel_post_crtc_enable_updates(crtc,
   15120   1.1  riastrad 				       state);
   15121   1.1  riastrad }
   15122   1.1  riastrad 
   15123   1.1  riastrad static void skl_commit_modeset_enables(struct intel_atomic_state *state)
   15124   1.1  riastrad {
   15125   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
   15126   1.1  riastrad 	struct intel_crtc *crtc;
   15127   1.1  riastrad 	struct intel_crtc_state *old_crtc_state, *new_crtc_state;
   15128   1.1  riastrad 	u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices;
   15129   1.1  riastrad 	u8 required_slices = state->wm_results.ddb.enabled_slices;
   15130   1.1  riastrad 	struct skl_ddb_entry entries[I915_MAX_PIPES] = {};
   15131   1.1  riastrad 	const u8 num_pipes = INTEL_NUM_PIPES(dev_priv);
   15132   1.1  riastrad 	u8 update_pipes = 0, modeset_pipes = 0;
   15133   1.1  riastrad 	int i;
   15134   1.1  riastrad 
   15135   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   15136   1.1  riastrad 		if (!new_crtc_state->hw.active)
   15137   1.1  riastrad 			continue;
   15138   1.1  riastrad 
   15139   1.1  riastrad 		/* ignore allocations for crtc's that have been turned off. */
   15140   1.1  riastrad 		if (!needs_modeset(new_crtc_state)) {
   15141   1.1  riastrad 			entries[i] = old_crtc_state->wm.skl.ddb;
   15142   1.1  riastrad 			update_pipes |= BIT(crtc->pipe);
   15143   1.1  riastrad 		} else {
   15144   1.1  riastrad 			modeset_pipes |= BIT(crtc->pipe);
   15145   1.1  riastrad 		}
   15146   1.1  riastrad 	}
   15147   1.1  riastrad 
   15148   1.1  riastrad 	/* If 2nd DBuf slice required, enable it here */
   15149   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 && required_slices > hw_enabled_slices)
   15150   1.1  riastrad 		icl_dbuf_slices_update(dev_priv, required_slices);
   15151   1.1  riastrad 
   15152   1.1  riastrad 	/*
   15153   1.1  riastrad 	 * Whenever the number of active pipes changes, we need to make sure we
   15154   1.1  riastrad 	 * update the pipes in the right order so that their ddb allocations
   15155   1.1  riastrad 	 * never overlap with each other between CRTC updates. Otherwise we'll
   15156   1.1  riastrad 	 * cause pipe underruns and other bad stuff.
   15157   1.1  riastrad 	 *
   15158   1.1  riastrad 	 * So first lets enable all pipes that do not need a fullmodeset as
   15159   1.1  riastrad 	 * those don't have any external dependency.
   15160   1.1  riastrad 	 */
   15161   1.1  riastrad 	while (update_pipes) {
   15162   1.1  riastrad 		for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15163   1.1  riastrad 						    new_crtc_state, i) {
   15164   1.1  riastrad 			enum pipe pipe = crtc->pipe;
   15165   1.1  riastrad 
   15166   1.1  riastrad 			if ((update_pipes & BIT(pipe)) == 0)
   15167   1.1  riastrad 				continue;
   15168   1.1  riastrad 
   15169   1.1  riastrad 			if (skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15170   1.1  riastrad 							entries, num_pipes, i))
   15171   1.1  riastrad 				continue;
   15172   1.1  riastrad 
   15173   1.1  riastrad 			entries[i] = new_crtc_state->wm.skl.ddb;
   15174   1.1  riastrad 			update_pipes &= ~BIT(pipe);
   15175   1.1  riastrad 
   15176   1.1  riastrad 			intel_update_crtc(crtc, state, old_crtc_state,
   15177   1.1  riastrad 					  new_crtc_state);
   15178   1.1  riastrad 
   15179   1.1  riastrad 			/*
   15180   1.1  riastrad 			 * If this is an already active pipe, it's DDB changed,
   15181   1.1  riastrad 			 * and this isn't the last pipe that needs updating
   15182   1.1  riastrad 			 * then we need to wait for a vblank to pass for the
   15183   1.1  riastrad 			 * new ddb allocation to take effect.
   15184   1.1  riastrad 			 */
   15185   1.1  riastrad 			if (!skl_ddb_entry_equal(&new_crtc_state->wm.skl.ddb,
   15186   1.1  riastrad 						 &old_crtc_state->wm.skl.ddb) &&
   15187   1.1  riastrad 			    (update_pipes | modeset_pipes))
   15188   1.1  riastrad 				intel_wait_for_vblank(dev_priv, pipe);
   15189   1.1  riastrad 		}
   15190   1.1  riastrad 	}
   15191   1.1  riastrad 
   15192   1.1  riastrad 	/*
   15193   1.1  riastrad 	 * Enable all pipes that needs a modeset and do not depends on other
   15194   1.1  riastrad 	 * pipes
   15195   1.1  riastrad 	 */
   15196   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15197   1.1  riastrad 					    new_crtc_state, i) {
   15198   1.1  riastrad 		enum pipe pipe = crtc->pipe;
   15199   1.1  riastrad 
   15200   1.1  riastrad 		if ((modeset_pipes & BIT(pipe)) == 0)
   15201   1.1  riastrad 			continue;
   15202   1.1  riastrad 
   15203   1.1  riastrad 		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
   15204   1.1  riastrad 		    is_trans_port_sync_slave(new_crtc_state))
   15205   1.1  riastrad 			continue;
   15206   1.1  riastrad 
   15207   1.1  riastrad 		WARN_ON(skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15208   1.1  riastrad 						    entries, num_pipes, i));
   15209   1.1  riastrad 
   15210   1.1  riastrad 		entries[i] = new_crtc_state->wm.skl.ddb;
   15211   1.1  riastrad 		modeset_pipes &= ~BIT(pipe);
   15212   1.1  riastrad 
   15213   1.1  riastrad 		if (is_trans_port_sync_mode(new_crtc_state)) {
   15214   1.1  riastrad 			struct intel_crtc *slave_crtc;
   15215   1.1  riastrad 
   15216   1.1  riastrad 			intel_update_trans_port_sync_crtcs(crtc, state,
   15217   1.1  riastrad 							   old_crtc_state,
   15218   1.1  riastrad 							   new_crtc_state);
   15219   1.1  riastrad 
   15220   1.1  riastrad 			slave_crtc = intel_get_slave_crtc(new_crtc_state);
   15221   1.1  riastrad 			/* TODO: update entries[] of slave */
   15222   1.1  riastrad 			modeset_pipes &= ~BIT(slave_crtc->pipe);
   15223   1.1  riastrad 
   15224   1.1  riastrad 		} else {
   15225   1.1  riastrad 			intel_update_crtc(crtc, state, old_crtc_state,
   15226   1.1  riastrad 					  new_crtc_state);
   15227   1.1  riastrad 		}
   15228   1.1  riastrad 	}
   15229   1.1  riastrad 
   15230   1.1  riastrad 	/*
   15231   1.1  riastrad 	 * Finally enable all pipes that needs a modeset and depends on
   15232   1.1  riastrad 	 * other pipes, right now it is only MST slaves as both port sync slave
   15233   1.1  riastrad 	 * and master are enabled together
   15234   1.1  riastrad 	 */
   15235   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15236   1.1  riastrad 					    new_crtc_state, i) {
   15237   1.1  riastrad 		enum pipe pipe = crtc->pipe;
   15238   1.1  riastrad 
   15239   1.1  riastrad 		if ((modeset_pipes & BIT(pipe)) == 0)
   15240   1.1  riastrad 			continue;
   15241   1.1  riastrad 
   15242   1.1  riastrad 		WARN_ON(skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
   15243   1.1  riastrad 						    entries, num_pipes, i));
   15244   1.1  riastrad 
   15245   1.1  riastrad 		entries[i] = new_crtc_state->wm.skl.ddb;
   15246   1.1  riastrad 		modeset_pipes &= ~BIT(pipe);
   15247   1.1  riastrad 
   15248   1.1  riastrad 		intel_update_crtc(crtc, state, old_crtc_state, new_crtc_state);
   15249   1.1  riastrad 	}
   15250   1.1  riastrad 
   15251   1.1  riastrad 	WARN_ON(modeset_pipes);
   15252   1.1  riastrad 
   15253   1.1  riastrad 	/* If 2nd DBuf slice is no more required disable it */
   15254   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 && required_slices < hw_enabled_slices)
   15255   1.1  riastrad 		icl_dbuf_slices_update(dev_priv, required_slices);
   15256   1.1  riastrad }
   15257   1.1  riastrad 
   15258   1.1  riastrad static void intel_atomic_helper_free_state(struct drm_i915_private *dev_priv)
   15259   1.1  riastrad {
   15260   1.1  riastrad 	struct intel_atomic_state *state, *next;
   15261   1.1  riastrad 	struct llist_node *freed;
   15262   1.1  riastrad 
   15263   1.1  riastrad 	freed = llist_del_all(&dev_priv->atomic_helper.free_list);
   15264   1.1  riastrad 	llist_for_each_entry_safe(state, next, freed, freed)
   15265   1.1  riastrad 		drm_atomic_state_put(&state->base);
   15266   1.1  riastrad }
   15267   1.1  riastrad 
   15268   1.1  riastrad static void intel_atomic_helper_free_state_worker(struct work_struct *work)
   15269   1.1  riastrad {
   15270   1.1  riastrad 	struct drm_i915_private *dev_priv =
   15271   1.1  riastrad 		container_of(work, typeof(*dev_priv), atomic_helper.free_work);
   15272   1.1  riastrad 
   15273   1.1  riastrad 	intel_atomic_helper_free_state(dev_priv);
   15274   1.1  riastrad }
   15275   1.1  riastrad 
   15276   1.5  riastrad static int
   15277   1.5  riastrad intel_atomic_commit_fence_wake(struct i915_sw_fence_waiter *waiter,
   15278   1.9  riastrad     unsigned mode, int flags, void *not_a_cookie)
   15279   1.1  riastrad {
   15280   1.9  riastrad 	struct intel_atomic_state *intel_state = waiter->private;
   15281   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_state->base.dev);
   15282   1.1  riastrad 
   15283   1.5  riastrad 	spin_lock(&dev_priv->atomic_commit_lock);
   15284   1.5  riastrad 	DRM_SPIN_WAKEUP_ALL(&dev_priv->atomic_commit_wq,
   15285   1.5  riastrad 	    &dev_priv->atomic_commit_lock);
   15286   1.5  riastrad 	spin_unlock(&dev_priv->atomic_commit_lock);
   15287   1.1  riastrad 
   15288   1.5  riastrad 	return 0;
   15289   1.5  riastrad }
   15290   1.1  riastrad 
   15291   1.5  riastrad static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_state)
   15292   1.5  riastrad {
   15293   1.5  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_state->base.dev);
   15294   1.5  riastrad 	struct i915_sw_fence_waiter waiter;
   15295   1.5  riastrad 	int ret;
   15296   1.1  riastrad 
   15297   1.5  riastrad 	waiter.flags = 0;
   15298   1.5  riastrad 	waiter.func = intel_atomic_commit_fence_wake;
   15299   1.5  riastrad 	waiter.private = intel_state;
   15300   1.5  riastrad 
   15301   1.5  riastrad 	spin_lock(&intel_state->commit_ready.wait.lock);
   15302   1.5  riastrad 	list_add_tail(&waiter.entry, &intel_state->commit_ready.wait.head);
   15303   1.5  riastrad 	spin_unlock(&intel_state->commit_ready.wait.lock);
   15304   1.5  riastrad 
   15305   1.5  riastrad 	spin_lock(&dev_priv->atomic_commit_lock);
   15306   1.5  riastrad 	DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &dev_priv->atomic_commit_wq,
   15307   1.5  riastrad 	    &dev_priv->atomic_commit_lock,
   15308   1.5  riastrad 	    (i915_sw_fence_done(&intel_state->commit_ready) ||
   15309   1.5  riastrad 		test_bit(I915_RESET_MODESET, &dev_priv->gt.reset.flags)));
   15310   1.5  riastrad 	spin_unlock(&dev_priv->atomic_commit_lock);
   15311   1.8  riastrad 
   15312   1.8  riastrad 	spin_lock(&intel_state->commit_ready.wait.lock);
   15313   1.8  riastrad 	list_del(&waiter.entry);
   15314   1.8  riastrad 	spin_unlock(&intel_state->commit_ready.wait.lock);
   15315   1.1  riastrad }
   15316   1.1  riastrad 
   15317   1.1  riastrad static void intel_atomic_cleanup_work(struct work_struct *work)
   15318   1.1  riastrad {
   15319   1.1  riastrad 	struct drm_atomic_state *state =
   15320   1.1  riastrad 		container_of(work, struct drm_atomic_state, commit_work);
   15321   1.1  riastrad 	struct drm_i915_private *i915 = to_i915(state->dev);
   15322   1.1  riastrad 
   15323   1.1  riastrad 	drm_atomic_helper_cleanup_planes(&i915->drm, state);
   15324   1.1  riastrad 	drm_atomic_helper_commit_cleanup_done(state);
   15325   1.1  riastrad 	drm_atomic_state_put(state);
   15326   1.1  riastrad 
   15327   1.1  riastrad 	intel_atomic_helper_free_state(i915);
   15328   1.1  riastrad }
   15329   1.1  riastrad 
   15330   1.1  riastrad static void intel_atomic_commit_tail(struct intel_atomic_state *state)
   15331   1.1  riastrad {
   15332   1.1  riastrad 	struct drm_device *dev = state->base.dev;
   15333   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   15334   1.1  riastrad 	struct intel_crtc_state *new_crtc_state, *old_crtc_state;
   15335   1.1  riastrad 	struct intel_crtc *crtc;
   15336   1.1  riastrad 	u64 put_domains[I915_MAX_PIPES] = {};
   15337   1.1  riastrad 	intel_wakeref_t wakeref = 0;
   15338   1.1  riastrad 	int i;
   15339   1.1  riastrad 
   15340   1.1  riastrad 	intel_atomic_commit_fence_wait(state);
   15341   1.1  riastrad 
   15342   1.1  riastrad 	drm_atomic_helper_wait_for_dependencies(&state->base);
   15343   1.1  riastrad 
   15344   1.1  riastrad 	if (state->modeset)
   15345   1.1  riastrad 		wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
   15346   1.1  riastrad 
   15347   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15348   1.1  riastrad 					    new_crtc_state, i) {
   15349   1.1  riastrad 		if (needs_modeset(new_crtc_state) ||
   15350   1.1  riastrad 		    new_crtc_state->update_pipe) {
   15351   1.1  riastrad 
   15352   1.1  riastrad 			put_domains[crtc->pipe] =
   15353   1.1  riastrad 				modeset_get_crtc_power_domains(new_crtc_state);
   15354   1.1  riastrad 		}
   15355   1.1  riastrad 	}
   15356   1.1  riastrad 
   15357   1.1  riastrad 	intel_commit_modeset_disables(state);
   15358   1.1  riastrad 
   15359   1.1  riastrad 	/* FIXME: Eventually get rid of our crtc->config pointer */
   15360   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
   15361   1.1  riastrad 		crtc->config = new_crtc_state;
   15362   1.1  riastrad 
   15363   1.1  riastrad 	if (state->modeset) {
   15364   1.1  riastrad 		drm_atomic_helper_update_legacy_modeset_state(dev, &state->base);
   15365   1.1  riastrad 
   15366   1.1  riastrad 		intel_set_cdclk_pre_plane_update(dev_priv,
   15367   1.1  riastrad 						 &state->cdclk.actual,
   15368   1.1  riastrad 						 &dev_priv->cdclk.actual,
   15369   1.1  riastrad 						 state->cdclk.pipe);
   15370   1.1  riastrad 
   15371   1.1  riastrad 		/*
   15372   1.1  riastrad 		 * SKL workaround: bspec recommends we disable the SAGV when we
   15373   1.1  riastrad 		 * have more then one pipe enabled
   15374   1.1  riastrad 		 */
   15375   1.1  riastrad 		if (!intel_can_enable_sagv(state))
   15376   1.1  riastrad 			intel_disable_sagv(dev_priv);
   15377   1.1  riastrad 
   15378   1.1  riastrad 		intel_modeset_verify_disabled(dev_priv, state);
   15379   1.1  riastrad 	}
   15380   1.1  riastrad 
   15381   1.1  riastrad 	/* Complete the events for pipes that have now been disabled */
   15382   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   15383   1.1  riastrad 		bool modeset = needs_modeset(new_crtc_state);
   15384   1.1  riastrad 
   15385   1.1  riastrad 		/* Complete events for now disable pipes here. */
   15386   1.1  riastrad 		if (modeset && !new_crtc_state->hw.active && new_crtc_state->uapi.event) {
   15387   1.1  riastrad 			spin_lock_irq(&dev->event_lock);
   15388   1.1  riastrad 			drm_crtc_send_vblank_event(&crtc->base,
   15389   1.1  riastrad 						   new_crtc_state->uapi.event);
   15390   1.1  riastrad 			spin_unlock_irq(&dev->event_lock);
   15391   1.1  riastrad 
   15392   1.1  riastrad 			new_crtc_state->uapi.event = NULL;
   15393   1.1  riastrad 		}
   15394   1.1  riastrad 	}
   15395   1.1  riastrad 
   15396   1.1  riastrad 	if (state->modeset)
   15397   1.1  riastrad 		intel_encoders_update_prepare(state);
   15398   1.1  riastrad 
   15399   1.1  riastrad 	/* Now enable the clocks, plane, pipe, and connectors that we set up. */
   15400   1.1  riastrad 	dev_priv->display.commit_modeset_enables(state);
   15401   1.1  riastrad 
   15402   1.1  riastrad 	if (state->modeset) {
   15403   1.1  riastrad 		intel_encoders_update_complete(state);
   15404   1.1  riastrad 
   15405   1.1  riastrad 		intel_set_cdclk_post_plane_update(dev_priv,
   15406   1.1  riastrad 						  &state->cdclk.actual,
   15407   1.1  riastrad 						  &dev_priv->cdclk.actual,
   15408   1.1  riastrad 						  state->cdclk.pipe);
   15409   1.1  riastrad 	}
   15410   1.1  riastrad 
   15411   1.1  riastrad 	/* FIXME: We should call drm_atomic_helper_commit_hw_done() here
   15412   1.1  riastrad 	 * already, but still need the state for the delayed optimization. To
   15413   1.1  riastrad 	 * fix this:
   15414   1.1  riastrad 	 * - wrap the optimization/post_plane_update stuff into a per-crtc work.
   15415   1.1  riastrad 	 * - schedule that vblank worker _before_ calling hw_done
   15416   1.1  riastrad 	 * - at the start of commit_tail, cancel it _synchrously
   15417   1.1  riastrad 	 * - switch over to the vblank wait helper in the core after that since
   15418   1.1  riastrad 	 *   we don't need out special handling any more.
   15419   1.1  riastrad 	 */
   15420   1.1  riastrad 	drm_atomic_helper_wait_for_flip_done(dev, &state->base);
   15421   1.1  riastrad 
   15422   1.1  riastrad 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
   15423   1.1  riastrad 		if (new_crtc_state->hw.active &&
   15424   1.1  riastrad 		    !needs_modeset(new_crtc_state) &&
   15425   1.1  riastrad 		    !new_crtc_state->preload_luts &&
   15426   1.1  riastrad 		    (new_crtc_state->uapi.color_mgmt_changed ||
   15427   1.1  riastrad 		     new_crtc_state->update_pipe))
   15428   1.1  riastrad 			intel_color_load_luts(new_crtc_state);
   15429   1.1  riastrad 	}
   15430   1.1  riastrad 
   15431   1.1  riastrad 	/*
   15432   1.1  riastrad 	 * Now that the vblank has passed, we can go ahead and program the
   15433   1.1  riastrad 	 * optimal watermarks on platforms that need two-step watermark
   15434   1.1  riastrad 	 * programming.
   15435   1.1  riastrad 	 *
   15436   1.1  riastrad 	 * TODO: Move this (and other cleanup) to an async worker eventually.
   15437   1.1  riastrad 	 */
   15438   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
   15439   1.1  riastrad 					    new_crtc_state, i) {
   15440   1.1  riastrad 		/*
   15441   1.1  riastrad 		 * Gen2 reports pipe underruns whenever all planes are disabled.
   15442   1.1  riastrad 		 * So re-enable underrun reporting after some planes get enabled.
   15443   1.1  riastrad 		 *
   15444   1.1  riastrad 		 * We do this before .optimize_watermarks() so that we have a
   15445   1.1  riastrad 		 * chance of catching underruns with the intermediate watermarks
   15446   1.1  riastrad 		 * vs. the new plane configuration.
   15447   1.1  riastrad 		 */
   15448   1.1  riastrad 		if (IS_GEN(dev_priv, 2) && planes_enabling(old_crtc_state, new_crtc_state))
   15449   1.1  riastrad 			intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
   15450   1.1  riastrad 
   15451   1.1  riastrad 		if (dev_priv->display.optimize_watermarks)
   15452   1.1  riastrad 			dev_priv->display.optimize_watermarks(state, crtc);
   15453   1.1  riastrad 	}
   15454   1.1  riastrad 
   15455   1.1  riastrad 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
   15456   1.1  riastrad 		intel_post_plane_update(state, crtc);
   15457   1.1  riastrad 
   15458   1.1  riastrad 		if (put_domains[i])
   15459   1.1  riastrad 			modeset_put_power_domains(dev_priv, put_domains[i]);
   15460   1.1  riastrad 
   15461   1.1  riastrad 		intel_modeset_verify_crtc(crtc, state, old_crtc_state, new_crtc_state);
   15462   1.1  riastrad 	}
   15463   1.1  riastrad 
   15464   1.1  riastrad 	/* Underruns don't always raise interrupts, so check manually */
   15465   1.1  riastrad 	intel_check_cpu_fifo_underruns(dev_priv);
   15466   1.1  riastrad 	intel_check_pch_fifo_underruns(dev_priv);
   15467   1.1  riastrad 
   15468   1.1  riastrad 	if (state->modeset)
   15469   1.1  riastrad 		intel_verify_planes(state);
   15470   1.1  riastrad 
   15471   1.1  riastrad 	if (state->modeset && intel_can_enable_sagv(state))
   15472   1.1  riastrad 		intel_enable_sagv(dev_priv);
   15473   1.1  riastrad 
   15474   1.1  riastrad 	drm_atomic_helper_commit_hw_done(&state->base);
   15475   1.1  riastrad 
   15476   1.1  riastrad 	if (state->modeset) {
   15477   1.1  riastrad 		/* As one of the primary mmio accessors, KMS has a high
   15478   1.1  riastrad 		 * likelihood of triggering bugs in unclaimed access. After we
   15479   1.1  riastrad 		 * finish modesetting, see if an error has been flagged, and if
   15480   1.1  riastrad 		 * so enable debugging for the next modeset - and hope we catch
   15481   1.1  riastrad 		 * the culprit.
   15482   1.1  riastrad 		 */
   15483   1.1  riastrad 		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
   15484   1.1  riastrad 		intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
   15485   1.1  riastrad 	}
   15486   1.1  riastrad 	intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15487   1.1  riastrad 
   15488   1.1  riastrad 	/*
   15489   1.1  riastrad 	 * Defer the cleanup of the old state to a separate worker to not
   15490   1.1  riastrad 	 * impede the current task (userspace for blocking modesets) that
   15491   1.1  riastrad 	 * are executed inline. For out-of-line asynchronous modesets/flips,
   15492   1.1  riastrad 	 * deferring to a new worker seems overkill, but we would place a
   15493   1.1  riastrad 	 * schedule point (cond_resched()) here anyway to keep latencies
   15494   1.1  riastrad 	 * down.
   15495   1.1  riastrad 	 */
   15496   1.1  riastrad 	INIT_WORK(&state->base.commit_work, intel_atomic_cleanup_work);
   15497   1.1  riastrad 	queue_work(system_highpri_wq, &state->base.commit_work);
   15498   1.1  riastrad }
   15499   1.1  riastrad 
   15500   1.1  riastrad static void intel_atomic_commit_work(struct work_struct *work)
   15501   1.1  riastrad {
   15502   1.1  riastrad 	struct intel_atomic_state *state =
   15503   1.1  riastrad 		container_of(work, struct intel_atomic_state, base.commit_work);
   15504   1.1  riastrad 
   15505   1.1  riastrad 	intel_atomic_commit_tail(state);
   15506   1.1  riastrad }
   15507   1.1  riastrad 
   15508   1.6  riastrad int __i915_sw_fence_call
   15509   1.1  riastrad intel_atomic_commit_ready(struct i915_sw_fence *fence,
   15510   1.1  riastrad 			  enum i915_sw_fence_notify notify)
   15511   1.1  riastrad {
   15512   1.1  riastrad 	struct intel_atomic_state *state =
   15513   1.1  riastrad 		container_of(fence, struct intel_atomic_state, commit_ready);
   15514   1.1  riastrad 
   15515   1.1  riastrad 	switch (notify) {
   15516   1.1  riastrad 	case FENCE_COMPLETE:
   15517   1.1  riastrad 		/* we do blocking waits in the worker, nothing to do here */
   15518   1.1  riastrad 		break;
   15519   1.1  riastrad 	case FENCE_FREE:
   15520   1.1  riastrad 		{
   15521   1.1  riastrad 			struct intel_atomic_helper *helper =
   15522   1.1  riastrad 				&to_i915(state->base.dev)->atomic_helper;
   15523   1.1  riastrad 
   15524   1.1  riastrad 			if (llist_add(&state->freed, &helper->free_list))
   15525   1.1  riastrad 				schedule_work(&helper->free_work);
   15526   1.1  riastrad 			break;
   15527   1.1  riastrad 		}
   15528   1.1  riastrad 	}
   15529   1.1  riastrad 
   15530   1.1  riastrad 	return NOTIFY_DONE;
   15531   1.1  riastrad }
   15532   1.1  riastrad 
   15533   1.1  riastrad static void intel_atomic_track_fbs(struct intel_atomic_state *state)
   15534   1.1  riastrad {
   15535   1.1  riastrad 	struct intel_plane_state *old_plane_state, *new_plane_state;
   15536   1.1  riastrad 	struct intel_plane *plane;
   15537   1.1  riastrad 	int i;
   15538   1.1  riastrad 
   15539   1.1  riastrad 	for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
   15540   1.1  riastrad 					     new_plane_state, i)
   15541   1.1  riastrad 		intel_frontbuffer_track(to_intel_frontbuffer(old_plane_state->hw.fb),
   15542   1.1  riastrad 					to_intel_frontbuffer(new_plane_state->hw.fb),
   15543   1.1  riastrad 					plane->frontbuffer_bit);
   15544   1.1  riastrad }
   15545   1.1  riastrad 
   15546   1.1  riastrad static void assert_global_state_locked(struct drm_i915_private *dev_priv)
   15547   1.1  riastrad {
   15548   1.1  riastrad 	struct intel_crtc *crtc;
   15549   1.1  riastrad 
   15550   1.1  riastrad 	for_each_intel_crtc(&dev_priv->drm, crtc)
   15551   1.1  riastrad 		drm_modeset_lock_assert_held(&crtc->base.mutex);
   15552   1.1  riastrad }
   15553   1.1  riastrad 
   15554   1.1  riastrad static int intel_atomic_commit(struct drm_device *dev,
   15555   1.1  riastrad 			       struct drm_atomic_state *_state,
   15556   1.1  riastrad 			       bool nonblock)
   15557   1.1  riastrad {
   15558   1.1  riastrad 	struct intel_atomic_state *state = to_intel_atomic_state(_state);
   15559   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   15560   1.1  riastrad 	int ret = 0;
   15561   1.1  riastrad 
   15562   1.1  riastrad 	state->wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
   15563   1.1  riastrad 
   15564   1.1  riastrad 	drm_atomic_state_get(&state->base);
   15565   1.6  riastrad 	i915_sw_fence_reinit(&state->commit_ready);
   15566   1.1  riastrad 
   15567   1.1  riastrad 	/*
   15568   1.1  riastrad 	 * The intel_legacy_cursor_update() fast path takes care
   15569   1.1  riastrad 	 * of avoiding the vblank waits for simple cursor
   15570   1.1  riastrad 	 * movement and flips. For cursor on/off and size changes,
   15571   1.1  riastrad 	 * we want to perform the vblank waits so that watermark
   15572   1.1  riastrad 	 * updates happen during the correct frames. Gen9+ have
   15573   1.1  riastrad 	 * double buffered watermarks and so shouldn't need this.
   15574   1.1  riastrad 	 *
   15575   1.1  riastrad 	 * Unset state->legacy_cursor_update before the call to
   15576   1.1  riastrad 	 * drm_atomic_helper_setup_commit() because otherwise
   15577   1.1  riastrad 	 * drm_atomic_helper_wait_for_flip_done() is a noop and
   15578   1.1  riastrad 	 * we get FIFO underruns because we didn't wait
   15579   1.1  riastrad 	 * for vblank.
   15580   1.1  riastrad 	 *
   15581   1.1  riastrad 	 * FIXME doing watermarks and fb cleanup from a vblank worker
   15582   1.1  riastrad 	 * (assuming we had any) would solve these problems.
   15583   1.1  riastrad 	 */
   15584   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9 && state->base.legacy_cursor_update) {
   15585   1.1  riastrad 		struct intel_crtc_state *new_crtc_state;
   15586   1.1  riastrad 		struct intel_crtc *crtc;
   15587   1.1  riastrad 		int i;
   15588   1.1  riastrad 
   15589   1.1  riastrad 		for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
   15590   1.1  riastrad 			if (new_crtc_state->wm.need_postvbl_update ||
   15591   1.1  riastrad 			    new_crtc_state->update_wm_post)
   15592   1.1  riastrad 				state->base.legacy_cursor_update = false;
   15593   1.1  riastrad 	}
   15594   1.1  riastrad 
   15595   1.1  riastrad 	ret = intel_atomic_prepare_commit(state);
   15596   1.1  riastrad 	if (ret) {
   15597   1.1  riastrad 		DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
   15598   1.1  riastrad 		i915_sw_fence_commit(&state->commit_ready);
   15599   1.1  riastrad 		intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15600   1.1  riastrad 		return ret;
   15601   1.1  riastrad 	}
   15602   1.1  riastrad 
   15603   1.1  riastrad 	ret = drm_atomic_helper_setup_commit(&state->base, nonblock);
   15604   1.1  riastrad 	if (!ret)
   15605   1.1  riastrad 		ret = drm_atomic_helper_swap_state(&state->base, true);
   15606   1.1  riastrad 
   15607   1.1  riastrad 	if (ret) {
   15608   1.1  riastrad 		i915_sw_fence_commit(&state->commit_ready);
   15609   1.1  riastrad 
   15610   1.1  riastrad 		drm_atomic_helper_cleanup_planes(dev, &state->base);
   15611   1.1  riastrad 		intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
   15612   1.1  riastrad 		return ret;
   15613   1.1  riastrad 	}
   15614   1.1  riastrad 	dev_priv->wm.distrust_bios_wm = false;
   15615   1.1  riastrad 	intel_shared_dpll_swap_state(state);
   15616   1.1  riastrad 	intel_atomic_track_fbs(state);
   15617   1.1  riastrad 
   15618   1.1  riastrad 	if (state->global_state_changed) {
   15619   1.1  riastrad 		assert_global_state_locked(dev_priv);
   15620   1.1  riastrad 
   15621   1.1  riastrad 		memcpy(dev_priv->min_cdclk, state->min_cdclk,
   15622   1.1  riastrad 		       sizeof(state->min_cdclk));
   15623   1.1  riastrad 		memcpy(dev_priv->min_voltage_level, state->min_voltage_level,
   15624   1.1  riastrad 		       sizeof(state->min_voltage_level));
   15625   1.1  riastrad 		dev_priv->active_pipes = state->active_pipes;
   15626   1.1  riastrad 		dev_priv->cdclk.force_min_cdclk = state->cdclk.force_min_cdclk;
   15627   1.1  riastrad 
   15628   1.1  riastrad 		intel_cdclk_swap_state(state);
   15629   1.1  riastrad 	}
   15630   1.1  riastrad 
   15631   1.1  riastrad 	drm_atomic_state_get(&state->base);
   15632   1.1  riastrad 	INIT_WORK(&state->base.commit_work, intel_atomic_commit_work);
   15633   1.1  riastrad 
   15634   1.1  riastrad 	i915_sw_fence_commit(&state->commit_ready);
   15635   1.1  riastrad 	if (nonblock && state->modeset) {
   15636   1.1  riastrad 		queue_work(dev_priv->modeset_wq, &state->base.commit_work);
   15637   1.1  riastrad 	} else if (nonblock) {
   15638   1.1  riastrad 		queue_work(dev_priv->flip_wq, &state->base.commit_work);
   15639   1.1  riastrad 	} else {
   15640   1.1  riastrad 		if (state->modeset)
   15641   1.1  riastrad 			flush_workqueue(dev_priv->modeset_wq);
   15642   1.1  riastrad 		intel_atomic_commit_tail(state);
   15643   1.1  riastrad 	}
   15644   1.1  riastrad 
   15645   1.1  riastrad 	return 0;
   15646   1.1  riastrad }
   15647   1.1  riastrad 
   15648   1.3  riastrad #ifdef __NetBSD__
   15649   1.3  riastrad 
   15650   1.3  riastrad /* XXX */
   15651   1.3  riastrad 
   15652   1.3  riastrad #else
   15653   1.3  riastrad 
   15654   1.1  riastrad struct wait_rps_boost {
   15655   1.1  riastrad 	struct wait_queue_entry wait;
   15656   1.1  riastrad 
   15657   1.1  riastrad 	struct drm_crtc *crtc;
   15658   1.1  riastrad 	struct i915_request *request;
   15659   1.1  riastrad };
   15660   1.1  riastrad 
   15661   1.1  riastrad static int do_rps_boost(struct wait_queue_entry *_wait,
   15662   1.1  riastrad 			unsigned mode, int sync, void *key)
   15663   1.1  riastrad {
   15664   1.1  riastrad 	struct wait_rps_boost *wait = container_of(_wait, typeof(*wait), wait);
   15665   1.1  riastrad 	struct i915_request *rq = wait->request;
   15666   1.1  riastrad 
   15667   1.1  riastrad 	/*
   15668   1.1  riastrad 	 * If we missed the vblank, but the request is already running it
   15669   1.1  riastrad 	 * is reasonable to assume that it will complete before the next
   15670   1.1  riastrad 	 * vblank without our intervention, so leave RPS alone.
   15671   1.1  riastrad 	 */
   15672   1.1  riastrad 	if (!i915_request_started(rq))
   15673   1.1  riastrad 		intel_rps_boost(rq);
   15674   1.1  riastrad 	i915_request_put(rq);
   15675   1.1  riastrad 
   15676   1.1  riastrad 	drm_crtc_vblank_put(wait->crtc);
   15677   1.1  riastrad 
   15678   1.1  riastrad 	list_del(&wait->wait.entry);
   15679   1.1  riastrad 	kfree(wait);
   15680   1.1  riastrad 	return 1;
   15681   1.1  riastrad }
   15682   1.1  riastrad 
   15683   1.3  riastrad #endif
   15684   1.3  riastrad 
   15685   1.1  riastrad static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
   15686   1.1  riastrad 				       struct dma_fence *fence)
   15687   1.1  riastrad {
   15688   1.4  riastrad #ifndef __NetBSD__		/* XXX i915 rps boost */
   15689   1.1  riastrad 	struct wait_rps_boost *wait;
   15690   1.1  riastrad 
   15691   1.1  riastrad 	if (!dma_fence_is_i915(fence))
   15692   1.1  riastrad 		return;
   15693   1.1  riastrad 
   15694   1.1  riastrad 	if (INTEL_GEN(to_i915(crtc->dev)) < 6)
   15695   1.1  riastrad 		return;
   15696   1.1  riastrad 
   15697   1.1  riastrad 	if (drm_crtc_vblank_get(crtc))
   15698   1.1  riastrad 		return;
   15699   1.1  riastrad 
   15700   1.1  riastrad 	wait = kmalloc(sizeof(*wait), GFP_KERNEL);
   15701   1.1  riastrad 	if (!wait) {
   15702   1.1  riastrad 		drm_crtc_vblank_put(crtc);
   15703   1.1  riastrad 		return;
   15704   1.1  riastrad 	}
   15705   1.1  riastrad 
   15706   1.1  riastrad 	wait->request = to_request(dma_fence_get(fence));
   15707   1.1  riastrad 	wait->crtc = crtc;
   15708   1.1  riastrad 
   15709   1.1  riastrad 	wait->wait.func = do_rps_boost;
   15710   1.1  riastrad 	wait->wait.flags = 0;
   15711   1.1  riastrad 
   15712   1.1  riastrad 	add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
   15713   1.3  riastrad #endif
   15714   1.1  riastrad }
   15715   1.1  riastrad 
   15716   1.1  riastrad static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
   15717   1.1  riastrad {
   15718   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
   15719   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
   15720   1.1  riastrad 	struct drm_framebuffer *fb = plane_state->hw.fb;
   15721   1.1  riastrad 	struct i915_vma *vma;
   15722   1.1  riastrad 
   15723   1.1  riastrad 	if (plane->id == PLANE_CURSOR &&
   15724   1.1  riastrad 	    INTEL_INFO(dev_priv)->display.cursor_needs_physical) {
   15725   1.1  riastrad 		struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   15726   1.1  riastrad 		const int align = intel_cursor_alignment(dev_priv);
   15727   1.1  riastrad 		int err;
   15728   1.1  riastrad 
   15729   1.1  riastrad 		err = i915_gem_object_attach_phys(obj, align);
   15730   1.1  riastrad 		if (err)
   15731   1.1  riastrad 			return err;
   15732   1.1  riastrad 	}
   15733   1.1  riastrad 
   15734   1.1  riastrad 	vma = intel_pin_and_fence_fb_obj(fb,
   15735   1.1  riastrad 					 &plane_state->view,
   15736   1.1  riastrad 					 intel_plane_uses_fence(plane_state),
   15737   1.1  riastrad 					 &plane_state->flags);
   15738   1.1  riastrad 	if (IS_ERR(vma))
   15739   1.1  riastrad 		return PTR_ERR(vma);
   15740   1.1  riastrad 
   15741   1.1  riastrad 	plane_state->vma = vma;
   15742   1.1  riastrad 
   15743   1.1  riastrad 	return 0;
   15744   1.1  riastrad }
   15745   1.1  riastrad 
   15746   1.1  riastrad static void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
   15747   1.1  riastrad {
   15748   1.1  riastrad 	struct i915_vma *vma;
   15749   1.1  riastrad 
   15750   1.1  riastrad 	vma = fetch_and_zero(&old_plane_state->vma);
   15751   1.1  riastrad 	if (vma)
   15752   1.1  riastrad 		intel_unpin_fb_vma(vma, old_plane_state->flags);
   15753   1.1  riastrad }
   15754   1.1  riastrad 
   15755   1.1  riastrad static void fb_obj_bump_render_priority(struct drm_i915_gem_object *obj)
   15756   1.1  riastrad {
   15757   1.1  riastrad 	struct i915_sched_attr attr = {
   15758   1.1  riastrad 		.priority = I915_USER_PRIORITY(I915_PRIORITY_DISPLAY),
   15759   1.1  riastrad 	};
   15760   1.1  riastrad 
   15761   1.1  riastrad 	i915_gem_object_wait_priority(obj, 0, &attr);
   15762   1.1  riastrad }
   15763   1.1  riastrad 
   15764   1.1  riastrad /**
   15765   1.1  riastrad  * intel_prepare_plane_fb - Prepare fb for usage on plane
   15766   1.1  riastrad  * @plane: drm plane to prepare for
   15767   1.1  riastrad  * @_new_plane_state: the plane state being prepared
   15768   1.1  riastrad  *
   15769   1.1  riastrad  * Prepares a framebuffer for usage on a display plane.  Generally this
   15770   1.1  riastrad  * involves pinning the underlying object and updating the frontbuffer tracking
   15771   1.1  riastrad  * bits.  Some older platforms need special physical address handling for
   15772   1.1  riastrad  * cursor planes.
   15773   1.1  riastrad  *
   15774   1.1  riastrad  * Returns 0 on success, negative error code on failure.
   15775   1.1  riastrad  */
   15776   1.1  riastrad int
   15777   1.1  riastrad intel_prepare_plane_fb(struct drm_plane *plane,
   15778   1.1  riastrad 		       struct drm_plane_state *_new_plane_state)
   15779   1.1  riastrad {
   15780   1.1  riastrad 	struct intel_plane_state *new_plane_state =
   15781   1.1  riastrad 		to_intel_plane_state(_new_plane_state);
   15782   1.1  riastrad 	struct intel_atomic_state *intel_state =
   15783   1.1  riastrad 		to_intel_atomic_state(new_plane_state->uapi.state);
   15784   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->dev);
   15785   1.1  riastrad 	struct drm_framebuffer *fb = new_plane_state->hw.fb;
   15786   1.1  riastrad 	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   15787   1.1  riastrad 	struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->state->fb);
   15788   1.1  riastrad 	int ret;
   15789   1.1  riastrad 
   15790   1.1  riastrad 	if (old_obj) {
   15791   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   15792   1.1  riastrad 			intel_atomic_get_new_crtc_state(intel_state,
   15793   1.1  riastrad 							to_intel_crtc(plane->state->crtc));
   15794   1.1  riastrad 
   15795   1.1  riastrad 		/* Big Hammer, we also need to ensure that any pending
   15796   1.1  riastrad 		 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
   15797   1.1  riastrad 		 * current scanout is retired before unpinning the old
   15798   1.1  riastrad 		 * framebuffer. Note that we rely on userspace rendering
   15799   1.1  riastrad 		 * into the buffer attached to the pipe they are waiting
   15800   1.1  riastrad 		 * on. If not, userspace generates a GPU hang with IPEHR
   15801   1.1  riastrad 		 * point to the MI_WAIT_FOR_EVENT.
   15802   1.1  riastrad 		 *
   15803   1.1  riastrad 		 * This should only fail upon a hung GPU, in which case we
   15804   1.1  riastrad 		 * can safely continue.
   15805   1.1  riastrad 		 */
   15806   1.1  riastrad 		if (needs_modeset(crtc_state)) {
   15807   1.1  riastrad 			ret = i915_sw_fence_await_reservation(&intel_state->commit_ready,
   15808   1.1  riastrad 							      old_obj->base.resv, NULL,
   15809   1.1  riastrad 							      false, 0,
   15810   1.1  riastrad 							      GFP_KERNEL);
   15811   1.1  riastrad 			if (ret < 0)
   15812   1.1  riastrad 				return ret;
   15813   1.1  riastrad 		}
   15814   1.1  riastrad 	}
   15815   1.1  riastrad 
   15816   1.1  riastrad 	if (new_plane_state->uapi.fence) { /* explicit fencing */
   15817   1.1  riastrad 		ret = i915_sw_fence_await_dma_fence(&intel_state->commit_ready,
   15818   1.1  riastrad 						    new_plane_state->uapi.fence,
   15819   1.1  riastrad 						    I915_FENCE_TIMEOUT,
   15820   1.1  riastrad 						    GFP_KERNEL);
   15821   1.1  riastrad 		if (ret < 0)
   15822   1.1  riastrad 			return ret;
   15823   1.1  riastrad 	}
   15824   1.1  riastrad 
   15825   1.1  riastrad 	if (!obj)
   15826   1.1  riastrad 		return 0;
   15827   1.1  riastrad 
   15828   1.1  riastrad 	ret = i915_gem_object_pin_pages(obj);
   15829   1.1  riastrad 	if (ret)
   15830   1.1  riastrad 		return ret;
   15831   1.1  riastrad 
   15832   1.1  riastrad 	ret = intel_plane_pin_fb(new_plane_state);
   15833   1.1  riastrad 
   15834   1.1  riastrad 	i915_gem_object_unpin_pages(obj);
   15835   1.1  riastrad 	if (ret)
   15836   1.1  riastrad 		return ret;
   15837   1.1  riastrad 
   15838   1.1  riastrad 	fb_obj_bump_render_priority(obj);
   15839   1.1  riastrad 	i915_gem_object_flush_frontbuffer(obj, ORIGIN_DIRTYFB);
   15840   1.1  riastrad 
   15841   1.1  riastrad 	if (!new_plane_state->uapi.fence) { /* implicit fencing */
   15842   1.1  riastrad 		struct dma_fence *fence;
   15843   1.1  riastrad 
   15844   1.1  riastrad 		ret = i915_sw_fence_await_reservation(&intel_state->commit_ready,
   15845   1.1  riastrad 						      obj->base.resv, NULL,
   15846   1.1  riastrad 						      false, I915_FENCE_TIMEOUT,
   15847   1.1  riastrad 						      GFP_KERNEL);
   15848   1.1  riastrad 		if (ret < 0)
   15849   1.1  riastrad 			return ret;
   15850   1.1  riastrad 
   15851   1.1  riastrad 		fence = dma_resv_get_excl_rcu(obj->base.resv);
   15852   1.1  riastrad 		if (fence) {
   15853   1.1  riastrad 			add_rps_boost_after_vblank(new_plane_state->hw.crtc,
   15854   1.1  riastrad 						   fence);
   15855   1.1  riastrad 			dma_fence_put(fence);
   15856   1.1  riastrad 		}
   15857   1.1  riastrad 	} else {
   15858   1.1  riastrad 		add_rps_boost_after_vblank(new_plane_state->hw.crtc,
   15859   1.1  riastrad 					   new_plane_state->uapi.fence);
   15860   1.1  riastrad 	}
   15861   1.1  riastrad 
   15862   1.1  riastrad 	/*
   15863   1.1  riastrad 	 * We declare pageflips to be interactive and so merit a small bias
   15864   1.1  riastrad 	 * towards upclocking to deliver the frame on time. By only changing
   15865   1.1  riastrad 	 * the RPS thresholds to sample more regularly and aim for higher
   15866   1.1  riastrad 	 * clocks we can hopefully deliver low power workloads (like kodi)
   15867   1.1  riastrad 	 * that are not quite steady state without resorting to forcing
   15868   1.1  riastrad 	 * maximum clocks following a vblank miss (see do_rps_boost()).
   15869   1.1  riastrad 	 */
   15870   1.1  riastrad 	if (!intel_state->rps_interactive) {
   15871   1.1  riastrad 		intel_rps_mark_interactive(&dev_priv->gt.rps, true);
   15872   1.1  riastrad 		intel_state->rps_interactive = true;
   15873   1.1  riastrad 	}
   15874   1.1  riastrad 
   15875   1.1  riastrad 	return 0;
   15876   1.1  riastrad }
   15877   1.1  riastrad 
   15878   1.1  riastrad /**
   15879   1.1  riastrad  * intel_cleanup_plane_fb - Cleans up an fb after plane use
   15880   1.1  riastrad  * @plane: drm plane to clean up for
   15881   1.1  riastrad  * @_old_plane_state: the state from the previous modeset
   15882   1.1  riastrad  *
   15883   1.1  riastrad  * Cleans up a framebuffer that has just been removed from a plane.
   15884   1.1  riastrad  */
   15885   1.1  riastrad void
   15886   1.1  riastrad intel_cleanup_plane_fb(struct drm_plane *plane,
   15887   1.1  riastrad 		       struct drm_plane_state *_old_plane_state)
   15888   1.1  riastrad {
   15889   1.1  riastrad 	struct intel_plane_state *old_plane_state =
   15890   1.1  riastrad 		to_intel_plane_state(_old_plane_state);
   15891   1.1  riastrad 	struct intel_atomic_state *intel_state =
   15892   1.1  riastrad 		to_intel_atomic_state(old_plane_state->uapi.state);
   15893   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(plane->dev);
   15894   1.1  riastrad 
   15895   1.1  riastrad 	if (intel_state->rps_interactive) {
   15896   1.1  riastrad 		intel_rps_mark_interactive(&dev_priv->gt.rps, false);
   15897   1.1  riastrad 		intel_state->rps_interactive = false;
   15898   1.1  riastrad 	}
   15899   1.1  riastrad 
   15900   1.1  riastrad 	/* Should only be called after a successful intel_prepare_plane_fb()! */
   15901   1.1  riastrad 	intel_plane_unpin_fb(old_plane_state);
   15902   1.1  riastrad }
   15903   1.1  riastrad 
   15904   1.1  riastrad /**
   15905   1.1  riastrad  * intel_plane_destroy - destroy a plane
   15906   1.1  riastrad  * @plane: plane to destroy
   15907   1.1  riastrad  *
   15908   1.1  riastrad  * Common destruction function for all types of planes (primary, cursor,
   15909   1.1  riastrad  * sprite).
   15910   1.1  riastrad  */
   15911   1.1  riastrad void intel_plane_destroy(struct drm_plane *plane)
   15912   1.1  riastrad {
   15913   1.1  riastrad 	drm_plane_cleanup(plane);
   15914   1.1  riastrad 	kfree(to_intel_plane(plane));
   15915   1.1  riastrad }
   15916   1.1  riastrad 
   15917   1.1  riastrad static bool i8xx_plane_format_mod_supported(struct drm_plane *_plane,
   15918   1.1  riastrad 					    u32 format, u64 modifier)
   15919   1.1  riastrad {
   15920   1.1  riastrad 	switch (modifier) {
   15921   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   15922   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   15923   1.1  riastrad 		break;
   15924   1.1  riastrad 	default:
   15925   1.1  riastrad 		return false;
   15926   1.1  riastrad 	}
   15927   1.1  riastrad 
   15928   1.1  riastrad 	switch (format) {
   15929   1.1  riastrad 	case DRM_FORMAT_C8:
   15930   1.1  riastrad 	case DRM_FORMAT_RGB565:
   15931   1.1  riastrad 	case DRM_FORMAT_XRGB1555:
   15932   1.1  riastrad 	case DRM_FORMAT_XRGB8888:
   15933   1.1  riastrad 		return modifier == DRM_FORMAT_MOD_LINEAR ||
   15934   1.1  riastrad 			modifier == I915_FORMAT_MOD_X_TILED;
   15935   1.1  riastrad 	default:
   15936   1.1  riastrad 		return false;
   15937   1.1  riastrad 	}
   15938   1.1  riastrad }
   15939   1.1  riastrad 
   15940   1.1  riastrad static bool i965_plane_format_mod_supported(struct drm_plane *_plane,
   15941   1.1  riastrad 					    u32 format, u64 modifier)
   15942   1.1  riastrad {
   15943   1.1  riastrad 	switch (modifier) {
   15944   1.1  riastrad 	case DRM_FORMAT_MOD_LINEAR:
   15945   1.1  riastrad 	case I915_FORMAT_MOD_X_TILED:
   15946   1.1  riastrad 		break;
   15947   1.1  riastrad 	default:
   15948   1.1  riastrad 		return false;
   15949   1.1  riastrad 	}
   15950   1.1  riastrad 
   15951   1.1  riastrad 	switch (format) {
   15952   1.1  riastrad 	case DRM_FORMAT_C8:
   15953   1.1  riastrad 	case DRM_FORMAT_RGB565:
   15954   1.1  riastrad 	case DRM_FORMAT_XRGB8888:
   15955   1.1  riastrad 	case DRM_FORMAT_XBGR8888:
   15956   1.1  riastrad 	case DRM_FORMAT_ARGB8888:
   15957   1.1  riastrad 	case DRM_FORMAT_ABGR8888:
   15958   1.1  riastrad 	case DRM_FORMAT_XRGB2101010:
   15959   1.1  riastrad 	case DRM_FORMAT_XBGR2101010:
   15960   1.1  riastrad 	case DRM_FORMAT_ARGB2101010:
   15961   1.1  riastrad 	case DRM_FORMAT_ABGR2101010:
   15962   1.1  riastrad 	case DRM_FORMAT_XBGR16161616F:
   15963   1.1  riastrad 		return modifier == DRM_FORMAT_MOD_LINEAR ||
   15964   1.1  riastrad 			modifier == I915_FORMAT_MOD_X_TILED;
   15965   1.1  riastrad 	default:
   15966   1.1  riastrad 		return false;
   15967   1.1  riastrad 	}
   15968   1.1  riastrad }
   15969   1.1  riastrad 
   15970   1.1  riastrad static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
   15971   1.1  riastrad 					      u32 format, u64 modifier)
   15972   1.1  riastrad {
   15973   1.1  riastrad 	return modifier == DRM_FORMAT_MOD_LINEAR &&
   15974   1.1  riastrad 		format == DRM_FORMAT_ARGB8888;
   15975   1.1  riastrad }
   15976   1.1  riastrad 
   15977   1.1  riastrad static const struct drm_plane_funcs i965_plane_funcs = {
   15978   1.1  riastrad 	.update_plane = drm_atomic_helper_update_plane,
   15979   1.1  riastrad 	.disable_plane = drm_atomic_helper_disable_plane,
   15980   1.1  riastrad 	.destroy = intel_plane_destroy,
   15981   1.1  riastrad 	.atomic_duplicate_state = intel_plane_duplicate_state,
   15982   1.1  riastrad 	.atomic_destroy_state = intel_plane_destroy_state,
   15983   1.1  riastrad 	.format_mod_supported = i965_plane_format_mod_supported,
   15984   1.1  riastrad };
   15985   1.1  riastrad 
   15986   1.1  riastrad static const struct drm_plane_funcs i8xx_plane_funcs = {
   15987   1.1  riastrad 	.update_plane = drm_atomic_helper_update_plane,
   15988   1.1  riastrad 	.disable_plane = drm_atomic_helper_disable_plane,
   15989   1.1  riastrad 	.destroy = intel_plane_destroy,
   15990   1.1  riastrad 	.atomic_duplicate_state = intel_plane_duplicate_state,
   15991   1.1  riastrad 	.atomic_destroy_state = intel_plane_destroy_state,
   15992   1.1  riastrad 	.format_mod_supported = i8xx_plane_format_mod_supported,
   15993   1.1  riastrad };
   15994   1.1  riastrad 
   15995   1.1  riastrad static int
   15996   1.1  riastrad intel_legacy_cursor_update(struct drm_plane *_plane,
   15997   1.1  riastrad 			   struct drm_crtc *_crtc,
   15998   1.1  riastrad 			   struct drm_framebuffer *fb,
   15999   1.1  riastrad 			   int crtc_x, int crtc_y,
   16000   1.1  riastrad 			   unsigned int crtc_w, unsigned int crtc_h,
   16001   1.1  riastrad 			   u32 src_x, u32 src_y,
   16002   1.1  riastrad 			   u32 src_w, u32 src_h,
   16003   1.1  riastrad 			   struct drm_modeset_acquire_ctx *ctx)
   16004   1.1  riastrad {
   16005   1.1  riastrad 	struct intel_plane *plane = to_intel_plane(_plane);
   16006   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(_crtc);
   16007   1.1  riastrad 	struct intel_plane_state *old_plane_state =
   16008   1.1  riastrad 		to_intel_plane_state(plane->base.state);
   16009   1.1  riastrad 	struct intel_plane_state *new_plane_state;
   16010   1.1  riastrad 	struct intel_crtc_state *crtc_state =
   16011   1.1  riastrad 		to_intel_crtc_state(crtc->base.state);
   16012   1.1  riastrad 	struct intel_crtc_state *new_crtc_state;
   16013   1.1  riastrad 	int ret;
   16014   1.1  riastrad 
   16015   1.1  riastrad 	/*
   16016   1.1  riastrad 	 * When crtc is inactive or there is a modeset pending,
   16017   1.1  riastrad 	 * wait for it to complete in the slowpath
   16018   1.1  riastrad 	 */
   16019   1.1  riastrad 	if (!crtc_state->hw.active || needs_modeset(crtc_state) ||
   16020   1.1  riastrad 	    crtc_state->update_pipe)
   16021   1.1  riastrad 		goto slow;
   16022   1.1  riastrad 
   16023   1.1  riastrad 	/*
   16024   1.1  riastrad 	 * Don't do an async update if there is an outstanding commit modifying
   16025   1.1  riastrad 	 * the plane.  This prevents our async update's changes from getting
   16026   1.1  riastrad 	 * overridden by a previous synchronous update's state.
   16027   1.1  riastrad 	 */
   16028   1.1  riastrad 	if (old_plane_state->uapi.commit &&
   16029   1.1  riastrad 	    !try_wait_for_completion(&old_plane_state->uapi.commit->hw_done))
   16030   1.1  riastrad 		goto slow;
   16031   1.1  riastrad 
   16032   1.1  riastrad 	/*
   16033   1.1  riastrad 	 * If any parameters change that may affect watermarks,
   16034   1.1  riastrad 	 * take the slowpath. Only changing fb or position should be
   16035   1.1  riastrad 	 * in the fastpath.
   16036   1.1  riastrad 	 */
   16037   1.1  riastrad 	if (old_plane_state->uapi.crtc != &crtc->base ||
   16038   1.1  riastrad 	    old_plane_state->uapi.src_w != src_w ||
   16039   1.1  riastrad 	    old_plane_state->uapi.src_h != src_h ||
   16040   1.1  riastrad 	    old_plane_state->uapi.crtc_w != crtc_w ||
   16041   1.1  riastrad 	    old_plane_state->uapi.crtc_h != crtc_h ||
   16042   1.1  riastrad 	    !old_plane_state->uapi.fb != !fb)
   16043   1.1  riastrad 		goto slow;
   16044   1.1  riastrad 
   16045   1.1  riastrad 	new_plane_state = to_intel_plane_state(intel_plane_duplicate_state(&plane->base));
   16046   1.1  riastrad 	if (!new_plane_state)
   16047   1.1  riastrad 		return -ENOMEM;
   16048   1.1  riastrad 
   16049   1.1  riastrad 	new_crtc_state = to_intel_crtc_state(intel_crtc_duplicate_state(&crtc->base));
   16050   1.1  riastrad 	if (!new_crtc_state) {
   16051   1.1  riastrad 		ret = -ENOMEM;
   16052   1.1  riastrad 		goto out_free;
   16053   1.1  riastrad 	}
   16054   1.1  riastrad 
   16055   1.1  riastrad 	drm_atomic_set_fb_for_plane(&new_plane_state->uapi, fb);
   16056   1.1  riastrad 
   16057   1.1  riastrad 	new_plane_state->uapi.src_x = src_x;
   16058   1.1  riastrad 	new_plane_state->uapi.src_y = src_y;
   16059   1.1  riastrad 	new_plane_state->uapi.src_w = src_w;
   16060   1.1  riastrad 	new_plane_state->uapi.src_h = src_h;
   16061   1.1  riastrad 	new_plane_state->uapi.crtc_x = crtc_x;
   16062   1.1  riastrad 	new_plane_state->uapi.crtc_y = crtc_y;
   16063   1.1  riastrad 	new_plane_state->uapi.crtc_w = crtc_w;
   16064   1.1  riastrad 	new_plane_state->uapi.crtc_h = crtc_h;
   16065   1.1  riastrad 
   16066   1.1  riastrad 	ret = intel_plane_atomic_check_with_state(crtc_state, new_crtc_state,
   16067   1.1  riastrad 						  old_plane_state, new_plane_state);
   16068   1.1  riastrad 	if (ret)
   16069   1.1  riastrad 		goto out_free;
   16070   1.1  riastrad 
   16071   1.1  riastrad 	ret = intel_plane_pin_fb(new_plane_state);
   16072   1.1  riastrad 	if (ret)
   16073   1.1  riastrad 		goto out_free;
   16074   1.1  riastrad 
   16075   1.1  riastrad 	intel_frontbuffer_flush(to_intel_frontbuffer(new_plane_state->hw.fb),
   16076   1.1  riastrad 				ORIGIN_FLIP);
   16077   1.1  riastrad 	intel_frontbuffer_track(to_intel_frontbuffer(old_plane_state->hw.fb),
   16078   1.1  riastrad 				to_intel_frontbuffer(new_plane_state->hw.fb),
   16079   1.1  riastrad 				plane->frontbuffer_bit);
   16080   1.1  riastrad 
   16081   1.1  riastrad 	/* Swap plane state */
   16082   1.1  riastrad 	plane->base.state = &new_plane_state->uapi;
   16083   1.1  riastrad 
   16084   1.1  riastrad 	/*
   16085   1.1  riastrad 	 * We cannot swap crtc_state as it may be in use by an atomic commit or
   16086   1.1  riastrad 	 * page flip that's running simultaneously. If we swap crtc_state and
   16087   1.1  riastrad 	 * destroy the old state, we will cause a use-after-free there.
   16088   1.1  riastrad 	 *
   16089   1.1  riastrad 	 * Only update active_planes, which is needed for our internal
   16090   1.1  riastrad 	 * bookkeeping. Either value will do the right thing when updating
   16091   1.1  riastrad 	 * planes atomically. If the cursor was part of the atomic update then
   16092   1.1  riastrad 	 * we would have taken the slowpath.
   16093   1.1  riastrad 	 */
   16094   1.1  riastrad 	crtc_state->active_planes = new_crtc_state->active_planes;
   16095   1.1  riastrad 
   16096   1.1  riastrad 	if (new_plane_state->uapi.visible)
   16097   1.1  riastrad 		intel_update_plane(plane, crtc_state, new_plane_state);
   16098   1.1  riastrad 	else
   16099   1.1  riastrad 		intel_disable_plane(plane, crtc_state);
   16100   1.1  riastrad 
   16101   1.1  riastrad 	intel_plane_unpin_fb(old_plane_state);
   16102   1.1  riastrad 
   16103   1.1  riastrad out_free:
   16104   1.1  riastrad 	if (new_crtc_state)
   16105   1.1  riastrad 		intel_crtc_destroy_state(&crtc->base, &new_crtc_state->uapi);
   16106   1.1  riastrad 	if (ret)
   16107   1.1  riastrad 		intel_plane_destroy_state(&plane->base, &new_plane_state->uapi);
   16108   1.1  riastrad 	else
   16109   1.1  riastrad 		intel_plane_destroy_state(&plane->base, &old_plane_state->uapi);
   16110   1.1  riastrad 	return ret;
   16111   1.1  riastrad 
   16112   1.1  riastrad slow:
   16113   1.1  riastrad 	return drm_atomic_helper_update_plane(&plane->base, &crtc->base, fb,
   16114   1.1  riastrad 					      crtc_x, crtc_y, crtc_w, crtc_h,
   16115   1.1  riastrad 					      src_x, src_y, src_w, src_h, ctx);
   16116   1.1  riastrad }
   16117   1.1  riastrad 
   16118   1.1  riastrad static const struct drm_plane_funcs intel_cursor_plane_funcs = {
   16119   1.1  riastrad 	.update_plane = intel_legacy_cursor_update,
   16120   1.1  riastrad 	.disable_plane = drm_atomic_helper_disable_plane,
   16121   1.1  riastrad 	.destroy = intel_plane_destroy,
   16122   1.1  riastrad 	.atomic_duplicate_state = intel_plane_duplicate_state,
   16123   1.1  riastrad 	.atomic_destroy_state = intel_plane_destroy_state,
   16124   1.1  riastrad 	.format_mod_supported = intel_cursor_format_mod_supported,
   16125   1.1  riastrad };
   16126   1.1  riastrad 
   16127   1.1  riastrad static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
   16128   1.1  riastrad 			       enum i9xx_plane_id i9xx_plane)
   16129   1.1  riastrad {
   16130   1.1  riastrad 	if (!HAS_FBC(dev_priv))
   16131   1.1  riastrad 		return false;
   16132   1.1  riastrad 
   16133   1.1  riastrad 	if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
   16134   1.1  riastrad 		return i9xx_plane == PLANE_A; /* tied to pipe A */
   16135   1.1  riastrad 	else if (IS_IVYBRIDGE(dev_priv))
   16136   1.1  riastrad 		return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B ||
   16137   1.1  riastrad 			i9xx_plane == PLANE_C;
   16138   1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 4)
   16139   1.1  riastrad 		return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B;
   16140   1.1  riastrad 	else
   16141   1.1  riastrad 		return i9xx_plane == PLANE_A;
   16142   1.1  riastrad }
   16143   1.1  riastrad 
   16144   1.1  riastrad static struct intel_plane *
   16145   1.1  riastrad intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
   16146   1.1  riastrad {
   16147   1.1  riastrad 	struct intel_plane *plane;
   16148   1.1  riastrad 	const struct drm_plane_funcs *plane_funcs;
   16149   1.1  riastrad 	unsigned int supported_rotations;
   16150   1.1  riastrad 	unsigned int possible_crtcs;
   16151   1.1  riastrad 	const u32 *formats;
   16152   1.1  riastrad 	int num_formats;
   16153   1.1  riastrad 	int ret, zpos;
   16154   1.1  riastrad 
   16155   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   16156   1.1  riastrad 		return skl_universal_plane_create(dev_priv, pipe,
   16157   1.1  riastrad 						  PLANE_PRIMARY);
   16158   1.1  riastrad 
   16159   1.1  riastrad 	plane = intel_plane_alloc();
   16160   1.1  riastrad 	if (IS_ERR(plane))
   16161   1.1  riastrad 		return plane;
   16162   1.1  riastrad 
   16163   1.1  riastrad 	plane->pipe = pipe;
   16164   1.1  riastrad 	/*
   16165   1.1  riastrad 	 * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS
   16166   1.1  riastrad 	 * port is hooked to pipe B. Hence we want plane A feeding pipe B.
   16167   1.1  riastrad 	 */
   16168   1.1  riastrad 	if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) < 4)
   16169   1.1  riastrad 		plane->i9xx_plane = (enum i9xx_plane_id) !pipe;
   16170   1.1  riastrad 	else
   16171   1.1  riastrad 		plane->i9xx_plane = (enum i9xx_plane_id) pipe;
   16172   1.1  riastrad 	plane->id = PLANE_PRIMARY;
   16173   1.1  riastrad 	plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
   16174   1.1  riastrad 
   16175   1.1  riastrad 	plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
   16176   1.1  riastrad 	if (plane->has_fbc) {
   16177   1.1  riastrad 		struct intel_fbc *fbc = &dev_priv->fbc;
   16178   1.1  riastrad 
   16179   1.1  riastrad 		fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
   16180   1.1  riastrad 	}
   16181   1.1  riastrad 
   16182   1.1  riastrad 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   16183   1.1  riastrad 		formats = vlv_primary_formats;
   16184   1.1  riastrad 		num_formats = ARRAY_SIZE(vlv_primary_formats);
   16185   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 4) {
   16186   1.1  riastrad 		/*
   16187   1.1  riastrad 		 * WaFP16GammaEnabling:ivb
   16188   1.1  riastrad 		 * "Workaround : When using the 64-bit format, the plane
   16189   1.1  riastrad 		 *  output on each color channel has one quarter amplitude.
   16190   1.1  riastrad 		 *  It can be brought up to full amplitude by using pipe
   16191   1.1  riastrad 		 *  gamma correction or pipe color space conversion to
   16192   1.1  riastrad 		 *  multiply the plane output by four."
   16193   1.1  riastrad 		 *
   16194   1.1  riastrad 		 * There is no dedicated plane gamma for the primary plane,
   16195   1.1  riastrad 		 * and using the pipe gamma/csc could conflict with other
   16196   1.1  riastrad 		 * planes, so we choose not to expose fp16 on IVB primary
   16197   1.1  riastrad 		 * planes. HSW primary planes no longer have this problem.
   16198   1.1  riastrad 		 */
   16199   1.1  riastrad 		if (IS_IVYBRIDGE(dev_priv)) {
   16200   1.1  riastrad 			formats = ivb_primary_formats;
   16201   1.1  riastrad 			num_formats = ARRAY_SIZE(ivb_primary_formats);
   16202   1.1  riastrad 		} else {
   16203   1.1  riastrad 			formats = i965_primary_formats;
   16204   1.1  riastrad 			num_formats = ARRAY_SIZE(i965_primary_formats);
   16205   1.1  riastrad 		}
   16206   1.1  riastrad 	} else {
   16207   1.1  riastrad 		formats = i8xx_primary_formats;
   16208   1.1  riastrad 		num_formats = ARRAY_SIZE(i8xx_primary_formats);
   16209   1.1  riastrad 	}
   16210   1.1  riastrad 
   16211   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   16212   1.1  riastrad 		plane_funcs = &i965_plane_funcs;
   16213   1.1  riastrad 	else
   16214   1.1  riastrad 		plane_funcs = &i8xx_plane_funcs;
   16215   1.1  riastrad 
   16216   1.1  riastrad 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16217   1.1  riastrad 		plane->min_cdclk = vlv_plane_min_cdclk;
   16218   1.1  riastrad 	else if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
   16219   1.1  riastrad 		plane->min_cdclk = hsw_plane_min_cdclk;
   16220   1.1  riastrad 	else if (IS_IVYBRIDGE(dev_priv))
   16221   1.1  riastrad 		plane->min_cdclk = ivb_plane_min_cdclk;
   16222   1.1  riastrad 	else
   16223   1.1  riastrad 		plane->min_cdclk = i9xx_plane_min_cdclk;
   16224   1.1  riastrad 
   16225   1.1  riastrad 	plane->max_stride = i9xx_plane_max_stride;
   16226   1.1  riastrad 	plane->update_plane = i9xx_update_plane;
   16227   1.1  riastrad 	plane->disable_plane = i9xx_disable_plane;
   16228   1.1  riastrad 	plane->get_hw_state = i9xx_plane_get_hw_state;
   16229   1.1  riastrad 	plane->check_plane = i9xx_plane_check;
   16230   1.1  riastrad 
   16231   1.1  riastrad 	possible_crtcs = BIT(pipe);
   16232   1.1  riastrad 
   16233   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
   16234   1.1  riastrad 		ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
   16235   1.1  riastrad 					       possible_crtcs, plane_funcs,
   16236   1.1  riastrad 					       formats, num_formats,
   16237   1.1  riastrad 					       i9xx_format_modifiers,
   16238   1.1  riastrad 					       DRM_PLANE_TYPE_PRIMARY,
   16239   1.1  riastrad 					       "primary %c", pipe_name(pipe));
   16240   1.1  riastrad 	else
   16241   1.1  riastrad 		ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
   16242   1.1  riastrad 					       possible_crtcs, plane_funcs,
   16243   1.1  riastrad 					       formats, num_formats,
   16244   1.1  riastrad 					       i9xx_format_modifiers,
   16245   1.1  riastrad 					       DRM_PLANE_TYPE_PRIMARY,
   16246   1.1  riastrad 					       "plane %c",
   16247   1.1  riastrad 					       plane_name(plane->i9xx_plane));
   16248   1.1  riastrad 	if (ret)
   16249   1.1  riastrad 		goto fail;
   16250   1.1  riastrad 
   16251   1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
   16252   1.1  riastrad 		supported_rotations =
   16253   1.1  riastrad 			DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
   16254   1.1  riastrad 			DRM_MODE_REFLECT_X;
   16255   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 4) {
   16256   1.1  riastrad 		supported_rotations =
   16257   1.1  riastrad 			DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180;
   16258   1.1  riastrad 	} else {
   16259   1.1  riastrad 		supported_rotations = DRM_MODE_ROTATE_0;
   16260   1.1  riastrad 	}
   16261   1.1  riastrad 
   16262   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   16263   1.1  riastrad 		drm_plane_create_rotation_property(&plane->base,
   16264   1.1  riastrad 						   DRM_MODE_ROTATE_0,
   16265   1.1  riastrad 						   supported_rotations);
   16266   1.1  riastrad 
   16267   1.1  riastrad 	zpos = 0;
   16268   1.1  riastrad 	drm_plane_create_zpos_immutable_property(&plane->base, zpos);
   16269   1.1  riastrad 
   16270   1.1  riastrad 	drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
   16271   1.1  riastrad 
   16272   1.1  riastrad 	return plane;
   16273   1.1  riastrad 
   16274   1.1  riastrad fail:
   16275   1.1  riastrad 	intel_plane_free(plane);
   16276   1.1  riastrad 
   16277   1.1  riastrad 	return ERR_PTR(ret);
   16278   1.1  riastrad }
   16279   1.1  riastrad 
   16280   1.1  riastrad static struct intel_plane *
   16281   1.1  riastrad intel_cursor_plane_create(struct drm_i915_private *dev_priv,
   16282   1.1  riastrad 			  enum pipe pipe)
   16283   1.1  riastrad {
   16284   1.1  riastrad 	unsigned int possible_crtcs;
   16285   1.1  riastrad 	struct intel_plane *cursor;
   16286   1.1  riastrad 	int ret, zpos;
   16287   1.1  riastrad 
   16288   1.1  riastrad 	cursor = intel_plane_alloc();
   16289   1.1  riastrad 	if (IS_ERR(cursor))
   16290   1.1  riastrad 		return cursor;
   16291   1.1  riastrad 
   16292   1.1  riastrad 	cursor->pipe = pipe;
   16293   1.1  riastrad 	cursor->i9xx_plane = (enum i9xx_plane_id) pipe;
   16294   1.1  riastrad 	cursor->id = PLANE_CURSOR;
   16295   1.1  riastrad 	cursor->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, cursor->id);
   16296   1.1  riastrad 
   16297   1.1  riastrad 	if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) {
   16298   1.1  riastrad 		cursor->max_stride = i845_cursor_max_stride;
   16299   1.1  riastrad 		cursor->update_plane = i845_update_cursor;
   16300   1.1  riastrad 		cursor->disable_plane = i845_disable_cursor;
   16301   1.1  riastrad 		cursor->get_hw_state = i845_cursor_get_hw_state;
   16302   1.1  riastrad 		cursor->check_plane = i845_check_cursor;
   16303   1.1  riastrad 	} else {
   16304   1.1  riastrad 		cursor->max_stride = i9xx_cursor_max_stride;
   16305   1.1  riastrad 		cursor->update_plane = i9xx_update_cursor;
   16306   1.1  riastrad 		cursor->disable_plane = i9xx_disable_cursor;
   16307   1.1  riastrad 		cursor->get_hw_state = i9xx_cursor_get_hw_state;
   16308   1.1  riastrad 		cursor->check_plane = i9xx_check_cursor;
   16309   1.1  riastrad 	}
   16310   1.1  riastrad 
   16311   1.1  riastrad 	cursor->cursor.base = ~0;
   16312   1.1  riastrad 	cursor->cursor.cntl = ~0;
   16313   1.1  riastrad 
   16314   1.1  riastrad 	if (IS_I845G(dev_priv) || IS_I865G(dev_priv) || HAS_CUR_FBC(dev_priv))
   16315   1.1  riastrad 		cursor->cursor.size = ~0;
   16316   1.1  riastrad 
   16317   1.1  riastrad 	possible_crtcs = BIT(pipe);
   16318   1.1  riastrad 
   16319   1.1  riastrad 	ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base,
   16320   1.1  riastrad 				       possible_crtcs, &intel_cursor_plane_funcs,
   16321   1.1  riastrad 				       intel_cursor_formats,
   16322   1.1  riastrad 				       ARRAY_SIZE(intel_cursor_formats),
   16323   1.1  riastrad 				       cursor_format_modifiers,
   16324   1.1  riastrad 				       DRM_PLANE_TYPE_CURSOR,
   16325   1.1  riastrad 				       "cursor %c", pipe_name(pipe));
   16326   1.1  riastrad 	if (ret)
   16327   1.1  riastrad 		goto fail;
   16328   1.1  riastrad 
   16329   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   16330   1.1  riastrad 		drm_plane_create_rotation_property(&cursor->base,
   16331   1.1  riastrad 						   DRM_MODE_ROTATE_0,
   16332   1.1  riastrad 						   DRM_MODE_ROTATE_0 |
   16333   1.1  riastrad 						   DRM_MODE_ROTATE_180);
   16334   1.1  riastrad 
   16335   1.1  riastrad 	zpos = RUNTIME_INFO(dev_priv)->num_sprites[pipe] + 1;
   16336   1.1  riastrad 	drm_plane_create_zpos_immutable_property(&cursor->base, zpos);
   16337   1.1  riastrad 
   16338   1.1  riastrad 	drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs);
   16339   1.1  riastrad 
   16340   1.1  riastrad 	return cursor;
   16341   1.1  riastrad 
   16342   1.1  riastrad fail:
   16343   1.1  riastrad 	intel_plane_free(cursor);
   16344   1.1  riastrad 
   16345   1.1  riastrad 	return ERR_PTR(ret);
   16346   1.1  riastrad }
   16347   1.1  riastrad 
   16348   1.1  riastrad #define INTEL_CRTC_FUNCS \
   16349   1.1  riastrad 	.gamma_set = drm_atomic_helper_legacy_gamma_set, \
   16350   1.1  riastrad 	.set_config = drm_atomic_helper_set_config, \
   16351   1.1  riastrad 	.destroy = intel_crtc_destroy, \
   16352   1.1  riastrad 	.page_flip = drm_atomic_helper_page_flip, \
   16353   1.1  riastrad 	.atomic_duplicate_state = intel_crtc_duplicate_state, \
   16354   1.1  riastrad 	.atomic_destroy_state = intel_crtc_destroy_state, \
   16355   1.1  riastrad 	.set_crc_source = intel_crtc_set_crc_source, \
   16356   1.1  riastrad 	.verify_crc_source = intel_crtc_verify_crc_source, \
   16357   1.1  riastrad 	.get_crc_sources = intel_crtc_get_crc_sources
   16358   1.1  riastrad 
   16359   1.1  riastrad static const struct drm_crtc_funcs bdw_crtc_funcs = {
   16360   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16361   1.1  riastrad 
   16362   1.1  riastrad 	.get_vblank_counter = g4x_get_vblank_counter,
   16363   1.1  riastrad 	.enable_vblank = bdw_enable_vblank,
   16364   1.1  riastrad 	.disable_vblank = bdw_disable_vblank,
   16365   1.1  riastrad };
   16366   1.1  riastrad 
   16367   1.1  riastrad static const struct drm_crtc_funcs ilk_crtc_funcs = {
   16368   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16369   1.1  riastrad 
   16370   1.1  riastrad 	.get_vblank_counter = g4x_get_vblank_counter,
   16371   1.1  riastrad 	.enable_vblank = ilk_enable_vblank,
   16372   1.1  riastrad 	.disable_vblank = ilk_disable_vblank,
   16373   1.1  riastrad };
   16374   1.1  riastrad 
   16375   1.1  riastrad static const struct drm_crtc_funcs g4x_crtc_funcs = {
   16376   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16377   1.1  riastrad 
   16378   1.1  riastrad 	.get_vblank_counter = g4x_get_vblank_counter,
   16379   1.1  riastrad 	.enable_vblank = i965_enable_vblank,
   16380   1.1  riastrad 	.disable_vblank = i965_disable_vblank,
   16381   1.1  riastrad };
   16382   1.1  riastrad 
   16383   1.1  riastrad static const struct drm_crtc_funcs i965_crtc_funcs = {
   16384   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16385   1.1  riastrad 
   16386   1.1  riastrad 	.get_vblank_counter = i915_get_vblank_counter,
   16387   1.1  riastrad 	.enable_vblank = i965_enable_vblank,
   16388   1.1  riastrad 	.disable_vblank = i965_disable_vblank,
   16389   1.1  riastrad };
   16390   1.1  riastrad 
   16391   1.1  riastrad static const struct drm_crtc_funcs i915gm_crtc_funcs = {
   16392   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16393   1.1  riastrad 
   16394   1.1  riastrad 	.get_vblank_counter = i915_get_vblank_counter,
   16395   1.1  riastrad 	.enable_vblank = i915gm_enable_vblank,
   16396   1.1  riastrad 	.disable_vblank = i915gm_disable_vblank,
   16397   1.1  riastrad };
   16398   1.1  riastrad 
   16399   1.1  riastrad static const struct drm_crtc_funcs i915_crtc_funcs = {
   16400   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16401   1.1  riastrad 
   16402   1.1  riastrad 	.get_vblank_counter = i915_get_vblank_counter,
   16403   1.1  riastrad 	.enable_vblank = i8xx_enable_vblank,
   16404   1.1  riastrad 	.disable_vblank = i8xx_disable_vblank,
   16405   1.1  riastrad };
   16406   1.1  riastrad 
   16407   1.1  riastrad static const struct drm_crtc_funcs i8xx_crtc_funcs = {
   16408   1.1  riastrad 	INTEL_CRTC_FUNCS,
   16409   1.1  riastrad 
   16410   1.1  riastrad 	/* no hw vblank counter */
   16411   1.1  riastrad 	.enable_vblank = i8xx_enable_vblank,
   16412   1.1  riastrad 	.disable_vblank = i8xx_disable_vblank,
   16413   1.1  riastrad };
   16414   1.1  riastrad 
   16415   1.1  riastrad static struct intel_crtc *intel_crtc_alloc(void)
   16416   1.1  riastrad {
   16417   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   16418   1.1  riastrad 	struct intel_crtc *crtc;
   16419   1.1  riastrad 
   16420   1.1  riastrad 	crtc = kzalloc(sizeof(*crtc), GFP_KERNEL);
   16421   1.1  riastrad 	if (!crtc)
   16422   1.1  riastrad 		return ERR_PTR(-ENOMEM);
   16423   1.1  riastrad 
   16424   1.1  riastrad 	crtc_state = intel_crtc_state_alloc(crtc);
   16425   1.1  riastrad 	if (!crtc_state) {
   16426   1.1  riastrad 		kfree(crtc);
   16427   1.1  riastrad 		return ERR_PTR(-ENOMEM);
   16428   1.1  riastrad 	}
   16429   1.1  riastrad 
   16430   1.1  riastrad 	crtc->base.state = &crtc_state->uapi;
   16431   1.1  riastrad 	crtc->config = crtc_state;
   16432   1.1  riastrad 
   16433   1.1  riastrad 	return crtc;
   16434   1.1  riastrad }
   16435   1.1  riastrad 
   16436   1.1  riastrad static void intel_crtc_free(struct intel_crtc *crtc)
   16437   1.1  riastrad {
   16438   1.1  riastrad 	intel_crtc_destroy_state(&crtc->base, crtc->base.state);
   16439   1.1  riastrad 	kfree(crtc);
   16440   1.1  riastrad }
   16441   1.1  riastrad 
   16442   1.1  riastrad static int intel_crtc_init(struct drm_i915_private *dev_priv, enum pipe pipe)
   16443   1.1  riastrad {
   16444   1.1  riastrad 	struct intel_plane *primary, *cursor;
   16445   1.1  riastrad 	const struct drm_crtc_funcs *funcs;
   16446   1.1  riastrad 	struct intel_crtc *crtc;
   16447   1.1  riastrad 	int sprite, ret;
   16448   1.1  riastrad 
   16449   1.1  riastrad 	crtc = intel_crtc_alloc();
   16450   1.1  riastrad 	if (IS_ERR(crtc))
   16451   1.1  riastrad 		return PTR_ERR(crtc);
   16452   1.1  riastrad 
   16453   1.1  riastrad 	crtc->pipe = pipe;
   16454   1.1  riastrad 	crtc->num_scalers = RUNTIME_INFO(dev_priv)->num_scalers[pipe];
   16455   1.1  riastrad 
   16456   1.1  riastrad 	primary = intel_primary_plane_create(dev_priv, pipe);
   16457   1.1  riastrad 	if (IS_ERR(primary)) {
   16458   1.1  riastrad 		ret = PTR_ERR(primary);
   16459   1.1  riastrad 		goto fail;
   16460   1.1  riastrad 	}
   16461   1.1  riastrad 	crtc->plane_ids_mask |= BIT(primary->id);
   16462   1.1  riastrad 
   16463   1.1  riastrad 	for_each_sprite(dev_priv, pipe, sprite) {
   16464   1.1  riastrad 		struct intel_plane *plane;
   16465   1.1  riastrad 
   16466   1.1  riastrad 		plane = intel_sprite_plane_create(dev_priv, pipe, sprite);
   16467   1.1  riastrad 		if (IS_ERR(plane)) {
   16468   1.1  riastrad 			ret = PTR_ERR(plane);
   16469   1.1  riastrad 			goto fail;
   16470   1.1  riastrad 		}
   16471   1.1  riastrad 		crtc->plane_ids_mask |= BIT(plane->id);
   16472   1.1  riastrad 	}
   16473   1.1  riastrad 
   16474   1.1  riastrad 	cursor = intel_cursor_plane_create(dev_priv, pipe);
   16475   1.1  riastrad 	if (IS_ERR(cursor)) {
   16476   1.1  riastrad 		ret = PTR_ERR(cursor);
   16477   1.1  riastrad 		goto fail;
   16478   1.1  riastrad 	}
   16479   1.1  riastrad 	crtc->plane_ids_mask |= BIT(cursor->id);
   16480   1.1  riastrad 
   16481   1.1  riastrad 	if (HAS_GMCH(dev_priv)) {
   16482   1.1  riastrad 		if (IS_CHERRYVIEW(dev_priv) ||
   16483   1.1  riastrad 		    IS_VALLEYVIEW(dev_priv) || IS_G4X(dev_priv))
   16484   1.1  riastrad 			funcs = &g4x_crtc_funcs;
   16485   1.1  riastrad 		else if (IS_GEN(dev_priv, 4))
   16486   1.1  riastrad 			funcs = &i965_crtc_funcs;
   16487   1.1  riastrad 		else if (IS_I945GM(dev_priv) || IS_I915GM(dev_priv))
   16488   1.1  riastrad 			funcs = &i915gm_crtc_funcs;
   16489   1.1  riastrad 		else if (IS_GEN(dev_priv, 3))
   16490   1.1  riastrad 			funcs = &i915_crtc_funcs;
   16491   1.1  riastrad 		else
   16492   1.1  riastrad 			funcs = &i8xx_crtc_funcs;
   16493   1.1  riastrad 	} else {
   16494   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 8)
   16495   1.1  riastrad 			funcs = &bdw_crtc_funcs;
   16496   1.1  riastrad 		else
   16497   1.1  riastrad 			funcs = &ilk_crtc_funcs;
   16498   1.1  riastrad 	}
   16499   1.1  riastrad 
   16500   1.1  riastrad 	ret = drm_crtc_init_with_planes(&dev_priv->drm, &crtc->base,
   16501   1.1  riastrad 					&primary->base, &cursor->base,
   16502   1.1  riastrad 					funcs, "pipe %c", pipe_name(pipe));
   16503   1.1  riastrad 	if (ret)
   16504   1.1  riastrad 		goto fail;
   16505   1.1  riastrad 
   16506   1.1  riastrad 	BUG_ON(pipe >= ARRAY_SIZE(dev_priv->pipe_to_crtc_mapping) ||
   16507   1.1  riastrad 	       dev_priv->pipe_to_crtc_mapping[pipe] != NULL);
   16508   1.1  riastrad 	dev_priv->pipe_to_crtc_mapping[pipe] = crtc;
   16509   1.1  riastrad 
   16510   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9) {
   16511   1.1  riastrad 		enum i9xx_plane_id i9xx_plane = primary->i9xx_plane;
   16512   1.1  riastrad 
   16513   1.1  riastrad 		BUG_ON(i9xx_plane >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
   16514   1.1  riastrad 		       dev_priv->plane_to_crtc_mapping[i9xx_plane] != NULL);
   16515   1.1  riastrad 		dev_priv->plane_to_crtc_mapping[i9xx_plane] = crtc;
   16516   1.1  riastrad 	}
   16517   1.1  riastrad 
   16518   1.1  riastrad 	intel_color_init(crtc);
   16519   1.1  riastrad 
   16520   1.1  riastrad 	WARN_ON(drm_crtc_index(&crtc->base) != crtc->pipe);
   16521   1.1  riastrad 
   16522   1.1  riastrad 	return 0;
   16523   1.1  riastrad 
   16524   1.1  riastrad fail:
   16525   1.1  riastrad 	intel_crtc_free(crtc);
   16526   1.1  riastrad 
   16527   1.1  riastrad 	return ret;
   16528   1.1  riastrad }
   16529   1.1  riastrad 
   16530   1.1  riastrad int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
   16531   1.1  riastrad 				      struct drm_file *file)
   16532   1.1  riastrad {
   16533   1.1  riastrad 	struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
   16534   1.1  riastrad 	struct drm_crtc *drmmode_crtc;
   16535   1.1  riastrad 	struct intel_crtc *crtc;
   16536   1.1  riastrad 
   16537   1.1  riastrad 	drmmode_crtc = drm_crtc_find(dev, file, pipe_from_crtc_id->crtc_id);
   16538   1.1  riastrad 	if (!drmmode_crtc)
   16539   1.1  riastrad 		return -ENOENT;
   16540   1.1  riastrad 
   16541   1.1  riastrad 	crtc = to_intel_crtc(drmmode_crtc);
   16542   1.1  riastrad 	pipe_from_crtc_id->pipe = crtc->pipe;
   16543   1.1  riastrad 
   16544   1.1  riastrad 	return 0;
   16545   1.1  riastrad }
   16546   1.1  riastrad 
   16547   1.1  riastrad static u32 intel_encoder_possible_clones(struct intel_encoder *encoder)
   16548   1.1  riastrad {
   16549   1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   16550   1.1  riastrad 	struct intel_encoder *source_encoder;
   16551   1.1  riastrad 	u32 possible_clones = 0;
   16552   1.1  riastrad 
   16553   1.1  riastrad 	for_each_intel_encoder(dev, source_encoder) {
   16554   1.1  riastrad 		if (encoders_cloneable(encoder, source_encoder))
   16555   1.1  riastrad 			possible_clones |= drm_encoder_mask(&source_encoder->base);
   16556   1.1  riastrad 	}
   16557   1.1  riastrad 
   16558   1.1  riastrad 	return possible_clones;
   16559   1.1  riastrad }
   16560   1.1  riastrad 
   16561   1.1  riastrad static u32 intel_encoder_possible_crtcs(struct intel_encoder *encoder)
   16562   1.1  riastrad {
   16563   1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   16564   1.1  riastrad 	struct intel_crtc *crtc;
   16565   1.1  riastrad 	u32 possible_crtcs = 0;
   16566   1.1  riastrad 
   16567   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   16568   1.1  riastrad 		if (encoder->pipe_mask & BIT(crtc->pipe))
   16569   1.1  riastrad 			possible_crtcs |= drm_crtc_mask(&crtc->base);
   16570   1.1  riastrad 	}
   16571   1.1  riastrad 
   16572   1.1  riastrad 	return possible_crtcs;
   16573   1.1  riastrad }
   16574   1.1  riastrad 
   16575   1.1  riastrad static bool ilk_has_edp_a(struct drm_i915_private *dev_priv)
   16576   1.1  riastrad {
   16577   1.1  riastrad 	if (!IS_MOBILE(dev_priv))
   16578   1.1  riastrad 		return false;
   16579   1.1  riastrad 
   16580   1.1  riastrad 	if ((I915_READ(DP_A) & DP_DETECTED) == 0)
   16581   1.1  riastrad 		return false;
   16582   1.1  riastrad 
   16583   1.1  riastrad 	if (IS_GEN(dev_priv, 5) && (I915_READ(FUSE_STRAP) & ILK_eDP_A_DISABLE))
   16584   1.1  riastrad 		return false;
   16585   1.1  riastrad 
   16586   1.1  riastrad 	return true;
   16587   1.1  riastrad }
   16588   1.1  riastrad 
   16589   1.1  riastrad static bool intel_ddi_crt_present(struct drm_i915_private *dev_priv)
   16590   1.1  riastrad {
   16591   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   16592   1.1  riastrad 		return false;
   16593   1.1  riastrad 
   16594   1.1  riastrad 	if (IS_HSW_ULT(dev_priv) || IS_BDW_ULT(dev_priv))
   16595   1.1  riastrad 		return false;
   16596   1.1  riastrad 
   16597   1.1  riastrad 	if (HAS_PCH_LPT_H(dev_priv) &&
   16598   1.1  riastrad 	    I915_READ(SFUSE_STRAP) & SFUSE_STRAP_CRT_DISABLED)
   16599   1.1  riastrad 		return false;
   16600   1.1  riastrad 
   16601   1.1  riastrad 	/* DDI E can't be used if DDI A requires 4 lanes */
   16602   1.1  riastrad 	if (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES)
   16603   1.1  riastrad 		return false;
   16604   1.1  riastrad 
   16605   1.1  riastrad 	if (!dev_priv->vbt.int_crt_support)
   16606   1.1  riastrad 		return false;
   16607   1.1  riastrad 
   16608   1.1  riastrad 	return true;
   16609   1.1  riastrad }
   16610   1.1  riastrad 
   16611   1.1  riastrad void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv)
   16612   1.1  riastrad {
   16613   1.1  riastrad 	int pps_num;
   16614   1.1  riastrad 	int pps_idx;
   16615   1.1  riastrad 
   16616   1.1  riastrad 	if (HAS_DDI(dev_priv))
   16617   1.1  riastrad 		return;
   16618   1.1  riastrad 	/*
   16619   1.1  riastrad 	 * This w/a is needed at least on CPT/PPT, but to be sure apply it
   16620   1.1  riastrad 	 * everywhere where registers can be write protected.
   16621   1.1  riastrad 	 */
   16622   1.1  riastrad 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16623   1.1  riastrad 		pps_num = 2;
   16624   1.1  riastrad 	else
   16625   1.1  riastrad 		pps_num = 1;
   16626   1.1  riastrad 
   16627   1.1  riastrad 	for (pps_idx = 0; pps_idx < pps_num; pps_idx++) {
   16628   1.1  riastrad 		u32 val = I915_READ(PP_CONTROL(pps_idx));
   16629   1.1  riastrad 
   16630   1.1  riastrad 		val = (val & ~PANEL_UNLOCK_MASK) | PANEL_UNLOCK_REGS;
   16631   1.1  riastrad 		I915_WRITE(PP_CONTROL(pps_idx), val);
   16632   1.1  riastrad 	}
   16633   1.1  riastrad }
   16634   1.1  riastrad 
   16635   1.1  riastrad static void intel_pps_init(struct drm_i915_private *dev_priv)
   16636   1.1  riastrad {
   16637   1.1  riastrad 	if (HAS_PCH_SPLIT(dev_priv) || IS_GEN9_LP(dev_priv))
   16638   1.1  riastrad 		dev_priv->pps_mmio_base = PCH_PPS_BASE;
   16639   1.1  riastrad 	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   16640   1.1  riastrad 		dev_priv->pps_mmio_base = VLV_PPS_BASE;
   16641   1.1  riastrad 	else
   16642   1.1  riastrad 		dev_priv->pps_mmio_base = PPS_BASE;
   16643   1.1  riastrad 
   16644   1.1  riastrad 	intel_pps_unlock_regs_wa(dev_priv);
   16645   1.1  riastrad }
   16646   1.1  riastrad 
   16647   1.1  riastrad static void intel_setup_outputs(struct drm_i915_private *dev_priv)
   16648   1.1  riastrad {
   16649   1.1  riastrad 	struct intel_encoder *encoder;
   16650   1.1  riastrad 	bool dpd_is_edp = false;
   16651   1.1  riastrad 
   16652   1.1  riastrad 	intel_pps_init(dev_priv);
   16653   1.1  riastrad 
   16654   1.1  riastrad 	if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
   16655   1.1  riastrad 		return;
   16656   1.1  riastrad 
   16657   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 12) {
   16658   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_A);
   16659   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_B);
   16660   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_D);
   16661   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_E);
   16662   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_F);
   16663   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_G);
   16664   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_H);
   16665   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_I);
   16666   1.1  riastrad 		icl_dsi_init(dev_priv);
   16667   1.1  riastrad 	} else if (IS_ELKHARTLAKE(dev_priv)) {
   16668   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_A);
   16669   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_B);
   16670   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_C);
   16671   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_D);
   16672   1.1  riastrad 		icl_dsi_init(dev_priv);
   16673   1.1  riastrad 	} else if (IS_GEN(dev_priv, 11)) {
   16674   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_A);
   16675   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_B);
   16676   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_C);
   16677   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_D);
   16678   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_E);
   16679   1.1  riastrad 		/*
   16680   1.1  riastrad 		 * On some ICL SKUs port F is not present. No strap bits for
   16681   1.1  riastrad 		 * this, so rely on VBT.
   16682   1.1  riastrad 		 * Work around broken VBTs on SKUs known to have no port F.
   16683   1.1  riastrad 		 */
   16684   1.1  riastrad 		if (IS_ICL_WITH_PORT_F(dev_priv) &&
   16685   1.1  riastrad 		    intel_bios_is_port_present(dev_priv, PORT_F))
   16686   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_F);
   16687   1.1  riastrad 
   16688   1.1  riastrad 		icl_dsi_init(dev_priv);
   16689   1.1  riastrad 	} else if (IS_GEN9_LP(dev_priv)) {
   16690   1.1  riastrad 		/*
   16691   1.1  riastrad 		 * FIXME: Broxton doesn't support port detection via the
   16692   1.1  riastrad 		 * DDI_BUF_CTL_A or SFUSE_STRAP registers, find another way to
   16693   1.1  riastrad 		 * detect the ports.
   16694   1.1  riastrad 		 */
   16695   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_A);
   16696   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_B);
   16697   1.1  riastrad 		intel_ddi_init(dev_priv, PORT_C);
   16698   1.1  riastrad 
   16699   1.1  riastrad 		vlv_dsi_init(dev_priv);
   16700   1.1  riastrad 	} else if (HAS_DDI(dev_priv)) {
   16701   1.1  riastrad 		int found;
   16702   1.1  riastrad 
   16703   1.1  riastrad 		if (intel_ddi_crt_present(dev_priv))
   16704   1.1  riastrad 			intel_crt_init(dev_priv);
   16705   1.1  riastrad 
   16706   1.1  riastrad 		/*
   16707   1.1  riastrad 		 * Haswell uses DDI functions to detect digital outputs.
   16708   1.1  riastrad 		 * On SKL pre-D0 the strap isn't connected, so we assume
   16709   1.1  riastrad 		 * it's there.
   16710   1.1  riastrad 		 */
   16711   1.1  riastrad 		found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED;
   16712   1.1  riastrad 		/* WaIgnoreDDIAStrap: skl */
   16713   1.1  riastrad 		if (found || IS_GEN9_BC(dev_priv))
   16714   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_A);
   16715   1.1  riastrad 
   16716   1.1  riastrad 		/* DDI B, C, D, and F detection is indicated by the SFUSE_STRAP
   16717   1.1  riastrad 		 * register */
   16718   1.1  riastrad 		found = I915_READ(SFUSE_STRAP);
   16719   1.1  riastrad 
   16720   1.1  riastrad 		if (found & SFUSE_STRAP_DDIB_DETECTED)
   16721   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_B);
   16722   1.1  riastrad 		if (found & SFUSE_STRAP_DDIC_DETECTED)
   16723   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_C);
   16724   1.1  riastrad 		if (found & SFUSE_STRAP_DDID_DETECTED)
   16725   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_D);
   16726   1.1  riastrad 		if (found & SFUSE_STRAP_DDIF_DETECTED)
   16727   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_F);
   16728   1.1  riastrad 		/*
   16729   1.1  riastrad 		 * On SKL we don't have a way to detect DDI-E so we rely on VBT.
   16730   1.1  riastrad 		 */
   16731   1.1  riastrad 		if (IS_GEN9_BC(dev_priv) &&
   16732   1.1  riastrad 		    intel_bios_is_port_present(dev_priv, PORT_E))
   16733   1.1  riastrad 			intel_ddi_init(dev_priv, PORT_E);
   16734   1.1  riastrad 
   16735   1.1  riastrad 	} else if (HAS_PCH_SPLIT(dev_priv)) {
   16736   1.1  riastrad 		int found;
   16737   1.1  riastrad 
   16738   1.1  riastrad 		/*
   16739   1.1  riastrad 		 * intel_edp_init_connector() depends on this completing first,
   16740   1.1  riastrad 		 * to prevent the registration of both eDP and LVDS and the
   16741   1.1  riastrad 		 * incorrect sharing of the PPS.
   16742   1.1  riastrad 		 */
   16743   1.1  riastrad 		intel_lvds_init(dev_priv);
   16744   1.1  riastrad 		intel_crt_init(dev_priv);
   16745   1.1  riastrad 
   16746   1.1  riastrad 		dpd_is_edp = intel_dp_is_port_edp(dev_priv, PORT_D);
   16747   1.1  riastrad 
   16748   1.1  riastrad 		if (ilk_has_edp_a(dev_priv))
   16749   1.1  riastrad 			intel_dp_init(dev_priv, DP_A, PORT_A);
   16750   1.1  riastrad 
   16751   1.1  riastrad 		if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
   16752   1.1  riastrad 			/* PCH SDVOB multiplex with HDMIB */
   16753   1.1  riastrad 			found = intel_sdvo_init(dev_priv, PCH_SDVOB, PORT_B);
   16754   1.1  riastrad 			if (!found)
   16755   1.1  riastrad 				intel_hdmi_init(dev_priv, PCH_HDMIB, PORT_B);
   16756   1.1  riastrad 			if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
   16757   1.1  riastrad 				intel_dp_init(dev_priv, PCH_DP_B, PORT_B);
   16758   1.1  riastrad 		}
   16759   1.1  riastrad 
   16760   1.1  riastrad 		if (I915_READ(PCH_HDMIC) & SDVO_DETECTED)
   16761   1.1  riastrad 			intel_hdmi_init(dev_priv, PCH_HDMIC, PORT_C);
   16762   1.1  riastrad 
   16763   1.1  riastrad 		if (!dpd_is_edp && I915_READ(PCH_HDMID) & SDVO_DETECTED)
   16764   1.1  riastrad 			intel_hdmi_init(dev_priv, PCH_HDMID, PORT_D);
   16765   1.1  riastrad 
   16766   1.1  riastrad 		if (I915_READ(PCH_DP_C) & DP_DETECTED)
   16767   1.1  riastrad 			intel_dp_init(dev_priv, PCH_DP_C, PORT_C);
   16768   1.1  riastrad 
   16769   1.1  riastrad 		if (I915_READ(PCH_DP_D) & DP_DETECTED)
   16770   1.1  riastrad 			intel_dp_init(dev_priv, PCH_DP_D, PORT_D);
   16771   1.1  riastrad 	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   16772   1.1  riastrad 		bool has_edp, has_port;
   16773   1.1  riastrad 
   16774   1.1  riastrad 		if (IS_VALLEYVIEW(dev_priv) && dev_priv->vbt.int_crt_support)
   16775   1.1  riastrad 			intel_crt_init(dev_priv);
   16776   1.1  riastrad 
   16777   1.1  riastrad 		/*
   16778   1.1  riastrad 		 * The DP_DETECTED bit is the latched state of the DDC
   16779   1.1  riastrad 		 * SDA pin at boot. However since eDP doesn't require DDC
   16780   1.1  riastrad 		 * (no way to plug in a DP->HDMI dongle) the DDC pins for
   16781   1.1  riastrad 		 * eDP ports may have been muxed to an alternate function.
   16782   1.1  riastrad 		 * Thus we can't rely on the DP_DETECTED bit alone to detect
   16783   1.1  riastrad 		 * eDP ports. Consult the VBT as well as DP_DETECTED to
   16784   1.1  riastrad 		 * detect eDP ports.
   16785   1.1  riastrad 		 *
   16786   1.1  riastrad 		 * Sadly the straps seem to be missing sometimes even for HDMI
   16787   1.1  riastrad 		 * ports (eg. on Voyo V3 - CHT x7-Z8700), so check both strap
   16788   1.1  riastrad 		 * and VBT for the presence of the port. Additionally we can't
   16789   1.1  riastrad 		 * trust the port type the VBT declares as we've seen at least
   16790   1.1  riastrad 		 * HDMI ports that the VBT claim are DP or eDP.
   16791   1.1  riastrad 		 */
   16792   1.1  riastrad 		has_edp = intel_dp_is_port_edp(dev_priv, PORT_B);
   16793   1.1  riastrad 		has_port = intel_bios_is_port_present(dev_priv, PORT_B);
   16794   1.1  riastrad 		if (I915_READ(VLV_DP_B) & DP_DETECTED || has_port)
   16795   1.1  riastrad 			has_edp &= intel_dp_init(dev_priv, VLV_DP_B, PORT_B);
   16796   1.1  riastrad 		if ((I915_READ(VLV_HDMIB) & SDVO_DETECTED || has_port) && !has_edp)
   16797   1.1  riastrad 			intel_hdmi_init(dev_priv, VLV_HDMIB, PORT_B);
   16798   1.1  riastrad 
   16799   1.1  riastrad 		has_edp = intel_dp_is_port_edp(dev_priv, PORT_C);
   16800   1.1  riastrad 		has_port = intel_bios_is_port_present(dev_priv, PORT_C);
   16801   1.1  riastrad 		if (I915_READ(VLV_DP_C) & DP_DETECTED || has_port)
   16802   1.1  riastrad 			has_edp &= intel_dp_init(dev_priv, VLV_DP_C, PORT_C);
   16803   1.1  riastrad 		if ((I915_READ(VLV_HDMIC) & SDVO_DETECTED || has_port) && !has_edp)
   16804   1.1  riastrad 			intel_hdmi_init(dev_priv, VLV_HDMIC, PORT_C);
   16805   1.1  riastrad 
   16806   1.1  riastrad 		if (IS_CHERRYVIEW(dev_priv)) {
   16807   1.1  riastrad 			/*
   16808   1.1  riastrad 			 * eDP not supported on port D,
   16809   1.1  riastrad 			 * so no need to worry about it
   16810   1.1  riastrad 			 */
   16811   1.1  riastrad 			has_port = intel_bios_is_port_present(dev_priv, PORT_D);
   16812   1.1  riastrad 			if (I915_READ(CHV_DP_D) & DP_DETECTED || has_port)
   16813   1.1  riastrad 				intel_dp_init(dev_priv, CHV_DP_D, PORT_D);
   16814   1.1  riastrad 			if (I915_READ(CHV_HDMID) & SDVO_DETECTED || has_port)
   16815   1.1  riastrad 				intel_hdmi_init(dev_priv, CHV_HDMID, PORT_D);
   16816   1.1  riastrad 		}
   16817   1.1  riastrad 
   16818   1.1  riastrad 		vlv_dsi_init(dev_priv);
   16819   1.1  riastrad 	} else if (IS_PINEVIEW(dev_priv)) {
   16820   1.1  riastrad 		intel_lvds_init(dev_priv);
   16821   1.1  riastrad 		intel_crt_init(dev_priv);
   16822   1.1  riastrad 	} else if (IS_GEN_RANGE(dev_priv, 3, 4)) {
   16823   1.1  riastrad 		bool found = false;
   16824   1.1  riastrad 
   16825   1.1  riastrad 		if (IS_MOBILE(dev_priv))
   16826   1.1  riastrad 			intel_lvds_init(dev_priv);
   16827   1.1  riastrad 
   16828   1.1  riastrad 		intel_crt_init(dev_priv);
   16829   1.1  riastrad 
   16830   1.1  riastrad 		if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
   16831   1.1  riastrad 			DRM_DEBUG_KMS("probing SDVOB\n");
   16832   1.1  riastrad 			found = intel_sdvo_init(dev_priv, GEN3_SDVOB, PORT_B);
   16833   1.1  riastrad 			if (!found && IS_G4X(dev_priv)) {
   16834   1.1  riastrad 				DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
   16835   1.1  riastrad 				intel_hdmi_init(dev_priv, GEN4_HDMIB, PORT_B);
   16836   1.1  riastrad 			}
   16837   1.1  riastrad 
   16838   1.1  riastrad 			if (!found && IS_G4X(dev_priv))
   16839   1.1  riastrad 				intel_dp_init(dev_priv, DP_B, PORT_B);
   16840   1.1  riastrad 		}
   16841   1.1  riastrad 
   16842   1.1  riastrad 		/* Before G4X SDVOC doesn't have its own detect register */
   16843   1.1  riastrad 
   16844   1.1  riastrad 		if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
   16845   1.1  riastrad 			DRM_DEBUG_KMS("probing SDVOC\n");
   16846   1.1  riastrad 			found = intel_sdvo_init(dev_priv, GEN3_SDVOC, PORT_C);
   16847   1.1  riastrad 		}
   16848   1.1  riastrad 
   16849   1.1  riastrad 		if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
   16850   1.1  riastrad 
   16851   1.1  riastrad 			if (IS_G4X(dev_priv)) {
   16852   1.1  riastrad 				DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
   16853   1.1  riastrad 				intel_hdmi_init(dev_priv, GEN4_HDMIC, PORT_C);
   16854   1.1  riastrad 			}
   16855   1.1  riastrad 			if (IS_G4X(dev_priv))
   16856   1.1  riastrad 				intel_dp_init(dev_priv, DP_C, PORT_C);
   16857   1.1  riastrad 		}
   16858   1.1  riastrad 
   16859   1.1  riastrad 		if (IS_G4X(dev_priv) && (I915_READ(DP_D) & DP_DETECTED))
   16860   1.1  riastrad 			intel_dp_init(dev_priv, DP_D, PORT_D);
   16861   1.1  riastrad 
   16862   1.1  riastrad 		if (SUPPORTS_TV(dev_priv))
   16863   1.1  riastrad 			intel_tv_init(dev_priv);
   16864   1.1  riastrad 	} else if (IS_GEN(dev_priv, 2)) {
   16865   1.1  riastrad 		if (IS_I85X(dev_priv))
   16866   1.1  riastrad 			intel_lvds_init(dev_priv);
   16867   1.1  riastrad 
   16868   1.1  riastrad 		intel_crt_init(dev_priv);
   16869   1.1  riastrad 		intel_dvo_init(dev_priv);
   16870   1.1  riastrad 	}
   16871   1.1  riastrad 
   16872   1.1  riastrad 	intel_psr_init(dev_priv);
   16873   1.1  riastrad 
   16874   1.1  riastrad 	for_each_intel_encoder(&dev_priv->drm, encoder) {
   16875   1.1  riastrad 		encoder->base.possible_crtcs =
   16876   1.1  riastrad 			intel_encoder_possible_crtcs(encoder);
   16877   1.1  riastrad 		encoder->base.possible_clones =
   16878   1.1  riastrad 			intel_encoder_possible_clones(encoder);
   16879   1.1  riastrad 	}
   16880   1.1  riastrad 
   16881   1.1  riastrad 	intel_init_pch_refclk(dev_priv);
   16882   1.1  riastrad 
   16883   1.1  riastrad 	drm_helper_move_panel_connectors_to_head(&dev_priv->drm);
   16884   1.1  riastrad }
   16885   1.1  riastrad 
   16886   1.1  riastrad static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
   16887   1.1  riastrad {
   16888   1.1  riastrad 	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
   16889   1.1  riastrad 
   16890   1.1  riastrad 	drm_framebuffer_cleanup(fb);
   16891   1.1  riastrad 	intel_frontbuffer_put(intel_fb->frontbuffer);
   16892   1.1  riastrad 
   16893   1.1  riastrad 	kfree(intel_fb);
   16894   1.1  riastrad }
   16895   1.1  riastrad 
   16896   1.1  riastrad static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
   16897   1.1  riastrad 						struct drm_file *file,
   16898   1.1  riastrad 						unsigned int *handle)
   16899   1.1  riastrad {
   16900   1.1  riastrad 	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   16901   1.1  riastrad 
   16902   1.1  riastrad 	if (obj->userptr.mm) {
   16903   1.1  riastrad 		DRM_DEBUG("attempting to use a userptr for a framebuffer, denied\n");
   16904   1.1  riastrad 		return -EINVAL;
   16905   1.1  riastrad 	}
   16906   1.1  riastrad 
   16907   1.1  riastrad 	return drm_gem_handle_create(file, &obj->base, handle);
   16908   1.1  riastrad }
   16909   1.1  riastrad 
   16910   1.1  riastrad static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
   16911   1.1  riastrad 					struct drm_file *file,
   16912   1.1  riastrad 					unsigned flags, unsigned color,
   16913   1.1  riastrad 					struct drm_clip_rect *clips,
   16914   1.1  riastrad 					unsigned num_clips)
   16915   1.1  riastrad {
   16916   1.1  riastrad 	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
   16917   1.1  riastrad 
   16918   1.1  riastrad 	i915_gem_object_flush_if_display(obj);
   16919   1.1  riastrad 	intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB);
   16920   1.1  riastrad 
   16921   1.1  riastrad 	return 0;
   16922   1.1  riastrad }
   16923   1.1  riastrad 
   16924   1.1  riastrad static const struct drm_framebuffer_funcs intel_fb_funcs = {
   16925   1.1  riastrad 	.destroy = intel_user_framebuffer_destroy,
   16926   1.1  riastrad 	.create_handle = intel_user_framebuffer_create_handle,
   16927   1.1  riastrad 	.dirty = intel_user_framebuffer_dirty,
   16928   1.1  riastrad };
   16929   1.1  riastrad 
   16930   1.1  riastrad static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
   16931   1.1  riastrad 				  struct drm_i915_gem_object *obj,
   16932   1.1  riastrad 				  struct drm_mode_fb_cmd2 *mode_cmd)
   16933   1.1  riastrad {
   16934   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
   16935   1.1  riastrad 	struct drm_framebuffer *fb = &intel_fb->base;
   16936   1.1  riastrad 	u32 max_stride;
   16937   1.1  riastrad 	unsigned int tiling, stride;
   16938   1.1  riastrad 	int ret = -EINVAL;
   16939   1.1  riastrad 	int i;
   16940   1.1  riastrad 
   16941   1.1  riastrad 	intel_fb->frontbuffer = intel_frontbuffer_get(obj);
   16942   1.1  riastrad 	if (!intel_fb->frontbuffer)
   16943   1.1  riastrad 		return -ENOMEM;
   16944   1.1  riastrad 
   16945   1.1  riastrad 	i915_gem_object_lock(obj);
   16946   1.1  riastrad 	tiling = i915_gem_object_get_tiling(obj);
   16947   1.1  riastrad 	stride = i915_gem_object_get_stride(obj);
   16948   1.1  riastrad 	i915_gem_object_unlock(obj);
   16949   1.1  riastrad 
   16950   1.1  riastrad 	if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
   16951   1.1  riastrad 		/*
   16952   1.1  riastrad 		 * If there's a fence, enforce that
   16953   1.1  riastrad 		 * the fb modifier and tiling mode match.
   16954   1.1  riastrad 		 */
   16955   1.1  riastrad 		if (tiling != I915_TILING_NONE &&
   16956   1.1  riastrad 		    tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
   16957   1.1  riastrad 			DRM_DEBUG_KMS("tiling_mode doesn't match fb modifier\n");
   16958   1.1  riastrad 			goto err;
   16959   1.1  riastrad 		}
   16960   1.1  riastrad 	} else {
   16961   1.1  riastrad 		if (tiling == I915_TILING_X) {
   16962   1.1  riastrad 			mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED;
   16963   1.1  riastrad 		} else if (tiling == I915_TILING_Y) {
   16964   1.1  riastrad 			DRM_DEBUG_KMS("No Y tiling for legacy addfb\n");
   16965   1.1  riastrad 			goto err;
   16966   1.1  riastrad 		}
   16967   1.1  riastrad 	}
   16968   1.1  riastrad 
   16969   1.1  riastrad 	if (!drm_any_plane_has_format(&dev_priv->drm,
   16970   1.1  riastrad 				      mode_cmd->pixel_format,
   16971   1.1  riastrad 				      mode_cmd->modifier[0])) {
   16972   1.1  riastrad 		struct drm_format_name_buf format_name;
   16973   1.1  riastrad 
   16974   1.3  riastrad 		DRM_DEBUG_KMS("unsupported pixel format %s / modifier 0x%"PRIx64"\n",
   16975   1.1  riastrad 			      drm_get_format_name(mode_cmd->pixel_format,
   16976   1.1  riastrad 						  &format_name),
   16977   1.1  riastrad 			      mode_cmd->modifier[0]);
   16978   1.1  riastrad 		goto err;
   16979   1.1  riastrad 	}
   16980   1.1  riastrad 
   16981   1.1  riastrad 	/*
   16982   1.1  riastrad 	 * gen2/3 display engine uses the fence if present,
   16983   1.1  riastrad 	 * so the tiling mode must match the fb modifier exactly.
   16984   1.1  riastrad 	 */
   16985   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 4 &&
   16986   1.1  riastrad 	    tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
   16987   1.1  riastrad 		DRM_DEBUG_KMS("tiling_mode must match fb modifier exactly on gen2/3\n");
   16988   1.1  riastrad 		goto err;
   16989   1.1  riastrad 	}
   16990   1.1  riastrad 
   16991   1.1  riastrad 	max_stride = intel_fb_max_stride(dev_priv, mode_cmd->pixel_format,
   16992   1.1  riastrad 					 mode_cmd->modifier[0]);
   16993   1.1  riastrad 	if (mode_cmd->pitches[0] > max_stride) {
   16994   1.1  riastrad 		DRM_DEBUG_KMS("%s pitch (%u) must be at most %d\n",
   16995   1.1  riastrad 			      mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ?
   16996   1.1  riastrad 			      "tiled" : "linear",
   16997   1.1  riastrad 			      mode_cmd->pitches[0], max_stride);
   16998   1.1  riastrad 		goto err;
   16999   1.1  riastrad 	}
   17000   1.1  riastrad 
   17001   1.1  riastrad 	/*
   17002   1.1  riastrad 	 * If there's a fence, enforce that
   17003   1.1  riastrad 	 * the fb pitch and fence stride match.
   17004   1.1  riastrad 	 */
   17005   1.1  riastrad 	if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) {
   17006   1.1  riastrad 		DRM_DEBUG_KMS("pitch (%d) must match tiling stride (%d)\n",
   17007   1.1  riastrad 			      mode_cmd->pitches[0], stride);
   17008   1.1  riastrad 		goto err;
   17009   1.1  riastrad 	}
   17010   1.1  riastrad 
   17011   1.1  riastrad 	/* FIXME need to adjust LINOFF/TILEOFF accordingly. */
   17012   1.1  riastrad 	if (mode_cmd->offsets[0] != 0) {
   17013   1.1  riastrad 		DRM_DEBUG_KMS("plane 0 offset (0x%08x) must be 0\n",
   17014   1.1  riastrad 			      mode_cmd->offsets[0]);
   17015   1.1  riastrad 		goto err;
   17016   1.1  riastrad 	}
   17017   1.1  riastrad 
   17018   1.1  riastrad 	drm_helper_mode_fill_fb_struct(&dev_priv->drm, fb, mode_cmd);
   17019   1.1  riastrad 
   17020   1.1  riastrad 	for (i = 0; i < fb->format->num_planes; i++) {
   17021   1.1  riastrad 		u32 stride_alignment;
   17022   1.1  riastrad 
   17023   1.1  riastrad 		if (mode_cmd->handles[i] != mode_cmd->handles[0]) {
   17024   1.1  riastrad 			DRM_DEBUG_KMS("bad plane %d handle\n", i);
   17025   1.1  riastrad 			goto err;
   17026   1.1  riastrad 		}
   17027   1.1  riastrad 
   17028   1.1  riastrad 		stride_alignment = intel_fb_stride_alignment(fb, i);
   17029   1.1  riastrad 		if (fb->pitches[i] & (stride_alignment - 1)) {
   17030   1.1  riastrad 			DRM_DEBUG_KMS("plane %d pitch (%d) must be at least %u byte aligned\n",
   17031   1.1  riastrad 				      i, fb->pitches[i], stride_alignment);
   17032   1.1  riastrad 			goto err;
   17033   1.1  riastrad 		}
   17034   1.1  riastrad 
   17035   1.1  riastrad 		if (is_gen12_ccs_plane(fb, i)) {
   17036   1.1  riastrad 			int ccs_aux_stride = gen12_ccs_aux_stride(fb, i);
   17037   1.1  riastrad 
   17038   1.1  riastrad 			if (fb->pitches[i] != ccs_aux_stride) {
   17039   1.1  riastrad 				DRM_DEBUG_KMS("ccs aux plane %d pitch (%d) must be %d\n",
   17040   1.1  riastrad 					      i,
   17041   1.1  riastrad 					      fb->pitches[i], ccs_aux_stride);
   17042   1.1  riastrad 				goto err;
   17043   1.1  riastrad 			}
   17044   1.1  riastrad 		}
   17045   1.1  riastrad 
   17046   1.1  riastrad 		fb->obj[i] = &obj->base;
   17047   1.1  riastrad 	}
   17048   1.1  riastrad 
   17049   1.1  riastrad 	ret = intel_fill_fb_info(dev_priv, fb);
   17050   1.1  riastrad 	if (ret)
   17051   1.1  riastrad 		goto err;
   17052   1.1  riastrad 
   17053   1.1  riastrad 	ret = drm_framebuffer_init(&dev_priv->drm, fb, &intel_fb_funcs);
   17054   1.1  riastrad 	if (ret) {
   17055   1.1  riastrad 		DRM_ERROR("framebuffer init failed %d\n", ret);
   17056   1.1  riastrad 		goto err;
   17057   1.1  riastrad 	}
   17058   1.1  riastrad 
   17059   1.1  riastrad 	return 0;
   17060   1.1  riastrad 
   17061   1.1  riastrad err:
   17062   1.1  riastrad 	intel_frontbuffer_put(intel_fb->frontbuffer);
   17063   1.1  riastrad 	return ret;
   17064   1.1  riastrad }
   17065   1.1  riastrad 
   17066   1.1  riastrad static struct drm_framebuffer *
   17067   1.1  riastrad intel_user_framebuffer_create(struct drm_device *dev,
   17068   1.1  riastrad 			      struct drm_file *filp,
   17069   1.1  riastrad 			      const struct drm_mode_fb_cmd2 *user_mode_cmd)
   17070   1.1  riastrad {
   17071   1.1  riastrad 	struct drm_framebuffer *fb;
   17072   1.1  riastrad 	struct drm_i915_gem_object *obj;
   17073   1.1  riastrad 	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
   17074   1.1  riastrad 
   17075   1.1  riastrad 	obj = i915_gem_object_lookup(filp, mode_cmd.handles[0]);
   17076   1.1  riastrad 	if (!obj)
   17077   1.1  riastrad 		return ERR_PTR(-ENOENT);
   17078   1.1  riastrad 
   17079   1.1  riastrad 	fb = intel_framebuffer_create(obj, &mode_cmd);
   17080   1.1  riastrad 	i915_gem_object_put(obj);
   17081   1.1  riastrad 
   17082   1.1  riastrad 	return fb;
   17083   1.1  riastrad }
   17084   1.1  riastrad 
   17085   1.1  riastrad static void intel_atomic_state_free(struct drm_atomic_state *state)
   17086   1.1  riastrad {
   17087   1.1  riastrad 	struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
   17088   1.1  riastrad 
   17089   1.1  riastrad 	drm_atomic_state_default_release(state);
   17090   1.1  riastrad 
   17091   1.1  riastrad 	i915_sw_fence_fini(&intel_state->commit_ready);
   17092   1.1  riastrad 
   17093   1.1  riastrad 	kfree(state);
   17094   1.1  riastrad }
   17095   1.1  riastrad 
   17096   1.1  riastrad static enum drm_mode_status
   17097   1.1  riastrad intel_mode_valid(struct drm_device *dev,
   17098   1.1  riastrad 		 const struct drm_display_mode *mode)
   17099   1.1  riastrad {
   17100   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   17101   1.1  riastrad 	int hdisplay_max, htotal_max;
   17102   1.1  riastrad 	int vdisplay_max, vtotal_max;
   17103   1.1  riastrad 
   17104   1.1  riastrad 	/*
   17105   1.1  riastrad 	 * Can't reject DBLSCAN here because Xorg ddxen can add piles
   17106   1.1  riastrad 	 * of DBLSCAN modes to the output's mode list when they detect
   17107   1.1  riastrad 	 * the scaling mode property on the connector. And they don't
   17108   1.1  riastrad 	 * ask the kernel to validate those modes in any way until
   17109   1.1  riastrad 	 * modeset time at which point the client gets a protocol error.
   17110   1.1  riastrad 	 * So in order to not upset those clients we silently ignore the
   17111   1.1  riastrad 	 * DBLSCAN flag on such connectors. For other connectors we will
   17112   1.1  riastrad 	 * reject modes with the DBLSCAN flag in encoder->compute_config().
   17113   1.1  riastrad 	 * And we always reject DBLSCAN modes in connector->mode_valid()
   17114   1.1  riastrad 	 * as we never want such modes on the connector's mode list.
   17115   1.1  riastrad 	 */
   17116   1.1  riastrad 
   17117   1.1  riastrad 	if (mode->vscan > 1)
   17118   1.1  riastrad 		return MODE_NO_VSCAN;
   17119   1.1  riastrad 
   17120   1.1  riastrad 	if (mode->flags & DRM_MODE_FLAG_HSKEW)
   17121   1.1  riastrad 		return MODE_H_ILLEGAL;
   17122   1.1  riastrad 
   17123   1.1  riastrad 	if (mode->flags & (DRM_MODE_FLAG_CSYNC |
   17124   1.1  riastrad 			   DRM_MODE_FLAG_NCSYNC |
   17125   1.1  riastrad 			   DRM_MODE_FLAG_PCSYNC))
   17126   1.1  riastrad 		return MODE_HSYNC;
   17127   1.1  riastrad 
   17128   1.1  riastrad 	if (mode->flags & (DRM_MODE_FLAG_BCAST |
   17129   1.1  riastrad 			   DRM_MODE_FLAG_PIXMUX |
   17130   1.1  riastrad 			   DRM_MODE_FLAG_CLKDIV2))
   17131   1.1  riastrad 		return MODE_BAD;
   17132   1.1  riastrad 
   17133   1.1  riastrad 	/* Transcoder timing limits */
   17134   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11) {
   17135   1.1  riastrad 		hdisplay_max = 16384;
   17136   1.1  riastrad 		vdisplay_max = 8192;
   17137   1.1  riastrad 		htotal_max = 16384;
   17138   1.1  riastrad 		vtotal_max = 8192;
   17139   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 9 ||
   17140   1.1  riastrad 		   IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
   17141   1.1  riastrad 		hdisplay_max = 8192; /* FDI max 4096 handled elsewhere */
   17142   1.1  riastrad 		vdisplay_max = 4096;
   17143   1.1  riastrad 		htotal_max = 8192;
   17144   1.1  riastrad 		vtotal_max = 8192;
   17145   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 3) {
   17146   1.1  riastrad 		hdisplay_max = 4096;
   17147   1.1  riastrad 		vdisplay_max = 4096;
   17148   1.1  riastrad 		htotal_max = 8192;
   17149   1.1  riastrad 		vtotal_max = 8192;
   17150   1.1  riastrad 	} else {
   17151   1.1  riastrad 		hdisplay_max = 2048;
   17152   1.1  riastrad 		vdisplay_max = 2048;
   17153   1.1  riastrad 		htotal_max = 4096;
   17154   1.1  riastrad 		vtotal_max = 4096;
   17155   1.1  riastrad 	}
   17156   1.1  riastrad 
   17157   1.1  riastrad 	if (mode->hdisplay > hdisplay_max ||
   17158   1.1  riastrad 	    mode->hsync_start > htotal_max ||
   17159   1.1  riastrad 	    mode->hsync_end > htotal_max ||
   17160   1.1  riastrad 	    mode->htotal > htotal_max)
   17161   1.1  riastrad 		return MODE_H_ILLEGAL;
   17162   1.1  riastrad 
   17163   1.1  riastrad 	if (mode->vdisplay > vdisplay_max ||
   17164   1.1  riastrad 	    mode->vsync_start > vtotal_max ||
   17165   1.1  riastrad 	    mode->vsync_end > vtotal_max ||
   17166   1.1  riastrad 	    mode->vtotal > vtotal_max)
   17167   1.1  riastrad 		return MODE_V_ILLEGAL;
   17168   1.1  riastrad 
   17169   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 5) {
   17170   1.1  riastrad 		if (mode->hdisplay < 64 ||
   17171   1.1  riastrad 		    mode->htotal - mode->hdisplay < 32)
   17172   1.1  riastrad 			return MODE_H_ILLEGAL;
   17173   1.1  riastrad 
   17174   1.1  riastrad 		if (mode->vtotal - mode->vdisplay < 5)
   17175   1.1  riastrad 			return MODE_V_ILLEGAL;
   17176   1.1  riastrad 	} else {
   17177   1.1  riastrad 		if (mode->htotal - mode->hdisplay < 32)
   17178   1.1  riastrad 			return MODE_H_ILLEGAL;
   17179   1.1  riastrad 
   17180   1.1  riastrad 		if (mode->vtotal - mode->vdisplay < 3)
   17181   1.1  riastrad 			return MODE_V_ILLEGAL;
   17182   1.1  riastrad 	}
   17183   1.1  riastrad 
   17184   1.1  riastrad 	return MODE_OK;
   17185   1.1  riastrad }
   17186   1.1  riastrad 
   17187   1.1  riastrad enum drm_mode_status
   17188   1.1  riastrad intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv,
   17189   1.1  riastrad 				const struct drm_display_mode *mode)
   17190   1.1  riastrad {
   17191   1.1  riastrad 	int plane_width_max, plane_height_max;
   17192   1.1  riastrad 
   17193   1.1  riastrad 	/*
   17194   1.1  riastrad 	 * intel_mode_valid() should be
   17195   1.1  riastrad 	 * sufficient on older platforms.
   17196   1.1  riastrad 	 */
   17197   1.1  riastrad 	if (INTEL_GEN(dev_priv) < 9)
   17198   1.1  riastrad 		return MODE_OK;
   17199   1.1  riastrad 
   17200   1.1  riastrad 	/*
   17201   1.1  riastrad 	 * Most people will probably want a fullscreen
   17202   1.1  riastrad 	 * plane so let's not advertize modes that are
   17203   1.1  riastrad 	 * too big for that.
   17204   1.1  riastrad 	 */
   17205   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11) {
   17206   1.1  riastrad 		plane_width_max = 5120;
   17207   1.1  riastrad 		plane_height_max = 4320;
   17208   1.1  riastrad 	} else {
   17209   1.1  riastrad 		plane_width_max = 5120;
   17210   1.1  riastrad 		plane_height_max = 4096;
   17211   1.1  riastrad 	}
   17212   1.1  riastrad 
   17213   1.1  riastrad 	if (mode->hdisplay > plane_width_max)
   17214   1.1  riastrad 		return MODE_H_ILLEGAL;
   17215   1.1  riastrad 
   17216   1.1  riastrad 	if (mode->vdisplay > plane_height_max)
   17217   1.1  riastrad 		return MODE_V_ILLEGAL;
   17218   1.1  riastrad 
   17219   1.1  riastrad 	return MODE_OK;
   17220   1.1  riastrad }
   17221   1.1  riastrad 
   17222   1.1  riastrad static const struct drm_mode_config_funcs intel_mode_funcs = {
   17223   1.1  riastrad 	.fb_create = intel_user_framebuffer_create,
   17224   1.1  riastrad 	.get_format_info = intel_get_format_info,
   17225   1.1  riastrad 	.output_poll_changed = intel_fbdev_output_poll_changed,
   17226   1.1  riastrad 	.mode_valid = intel_mode_valid,
   17227   1.1  riastrad 	.atomic_check = intel_atomic_check,
   17228   1.1  riastrad 	.atomic_commit = intel_atomic_commit,
   17229   1.1  riastrad 	.atomic_state_alloc = intel_atomic_state_alloc,
   17230   1.1  riastrad 	.atomic_state_clear = intel_atomic_state_clear,
   17231   1.1  riastrad 	.atomic_state_free = intel_atomic_state_free,
   17232   1.1  riastrad };
   17233   1.1  riastrad 
   17234   1.1  riastrad /**
   17235   1.1  riastrad  * intel_init_display_hooks - initialize the display modesetting hooks
   17236   1.1  riastrad  * @dev_priv: device private
   17237   1.1  riastrad  */
   17238   1.1  riastrad void intel_init_display_hooks(struct drm_i915_private *dev_priv)
   17239   1.1  riastrad {
   17240   1.1  riastrad 	intel_init_cdclk_hooks(dev_priv);
   17241   1.1  riastrad 
   17242   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9) {
   17243   1.1  riastrad 		dev_priv->display.get_pipe_config = hsw_get_pipe_config;
   17244   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17245   1.1  riastrad 			skl_get_initial_plane_config;
   17246   1.1  riastrad 		dev_priv->display.crtc_compute_clock = hsw_crtc_compute_clock;
   17247   1.1  riastrad 		dev_priv->display.crtc_enable = hsw_crtc_enable;
   17248   1.1  riastrad 		dev_priv->display.crtc_disable = hsw_crtc_disable;
   17249   1.1  riastrad 	} else if (HAS_DDI(dev_priv)) {
   17250   1.1  riastrad 		dev_priv->display.get_pipe_config = hsw_get_pipe_config;
   17251   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17252   1.1  riastrad 			i9xx_get_initial_plane_config;
   17253   1.1  riastrad 		dev_priv->display.crtc_compute_clock =
   17254   1.1  riastrad 			hsw_crtc_compute_clock;
   17255   1.1  riastrad 		dev_priv->display.crtc_enable = hsw_crtc_enable;
   17256   1.1  riastrad 		dev_priv->display.crtc_disable = hsw_crtc_disable;
   17257   1.1  riastrad 	} else if (HAS_PCH_SPLIT(dev_priv)) {
   17258   1.1  riastrad 		dev_priv->display.get_pipe_config = ilk_get_pipe_config;
   17259   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17260   1.1  riastrad 			i9xx_get_initial_plane_config;
   17261   1.1  riastrad 		dev_priv->display.crtc_compute_clock =
   17262   1.1  riastrad 			ilk_crtc_compute_clock;
   17263   1.1  riastrad 		dev_priv->display.crtc_enable = ilk_crtc_enable;
   17264   1.1  riastrad 		dev_priv->display.crtc_disable = ilk_crtc_disable;
   17265   1.1  riastrad 	} else if (IS_CHERRYVIEW(dev_priv)) {
   17266   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17267   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17268   1.1  riastrad 			i9xx_get_initial_plane_config;
   17269   1.1  riastrad 		dev_priv->display.crtc_compute_clock = chv_crtc_compute_clock;
   17270   1.1  riastrad 		dev_priv->display.crtc_enable = valleyview_crtc_enable;
   17271   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17272   1.1  riastrad 	} else if (IS_VALLEYVIEW(dev_priv)) {
   17273   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17274   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17275   1.1  riastrad 			i9xx_get_initial_plane_config;
   17276   1.1  riastrad 		dev_priv->display.crtc_compute_clock = vlv_crtc_compute_clock;
   17277   1.1  riastrad 		dev_priv->display.crtc_enable = valleyview_crtc_enable;
   17278   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17279   1.1  riastrad 	} else if (IS_G4X(dev_priv)) {
   17280   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17281   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17282   1.1  riastrad 			i9xx_get_initial_plane_config;
   17283   1.1  riastrad 		dev_priv->display.crtc_compute_clock = g4x_crtc_compute_clock;
   17284   1.1  riastrad 		dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17285   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17286   1.1  riastrad 	} else if (IS_PINEVIEW(dev_priv)) {
   17287   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17288   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17289   1.1  riastrad 			i9xx_get_initial_plane_config;
   17290   1.1  riastrad 		dev_priv->display.crtc_compute_clock = pnv_crtc_compute_clock;
   17291   1.1  riastrad 		dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17292   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17293   1.1  riastrad 	} else if (!IS_GEN(dev_priv, 2)) {
   17294   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17295   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17296   1.1  riastrad 			i9xx_get_initial_plane_config;
   17297   1.1  riastrad 		dev_priv->display.crtc_compute_clock = i9xx_crtc_compute_clock;
   17298   1.1  riastrad 		dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17299   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17300   1.1  riastrad 	} else {
   17301   1.1  riastrad 		dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
   17302   1.1  riastrad 		dev_priv->display.get_initial_plane_config =
   17303   1.1  riastrad 			i9xx_get_initial_plane_config;
   17304   1.1  riastrad 		dev_priv->display.crtc_compute_clock = i8xx_crtc_compute_clock;
   17305   1.1  riastrad 		dev_priv->display.crtc_enable = i9xx_crtc_enable;
   17306   1.1  riastrad 		dev_priv->display.crtc_disable = i9xx_crtc_disable;
   17307   1.1  riastrad 	}
   17308   1.1  riastrad 
   17309   1.1  riastrad 	if (IS_GEN(dev_priv, 5)) {
   17310   1.1  riastrad 		dev_priv->display.fdi_link_train = ilk_fdi_link_train;
   17311   1.1  riastrad 	} else if (IS_GEN(dev_priv, 6)) {
   17312   1.1  riastrad 		dev_priv->display.fdi_link_train = gen6_fdi_link_train;
   17313   1.1  riastrad 	} else if (IS_IVYBRIDGE(dev_priv)) {
   17314   1.1  riastrad 		/* FIXME: detect B0+ stepping and use auto training */
   17315   1.1  riastrad 		dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
   17316   1.1  riastrad 	}
   17317   1.1  riastrad 
   17318   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9)
   17319   1.1  riastrad 		dev_priv->display.commit_modeset_enables = skl_commit_modeset_enables;
   17320   1.1  riastrad 	else
   17321   1.1  riastrad 		dev_priv->display.commit_modeset_enables = intel_commit_modeset_enables;
   17322   1.1  riastrad 
   17323   1.1  riastrad }
   17324   1.1  riastrad 
   17325   1.1  riastrad void intel_modeset_init_hw(struct drm_i915_private *i915)
   17326   1.1  riastrad {
   17327   1.1  riastrad 	intel_update_cdclk(i915);
   17328   1.1  riastrad 	intel_dump_cdclk_state(&i915->cdclk.hw, "Current CDCLK");
   17329   1.1  riastrad 	i915->cdclk.logical = i915->cdclk.actual = i915->cdclk.hw;
   17330   1.1  riastrad }
   17331   1.1  riastrad 
   17332  1.10  riastrad static int sanitize_watermarks_add_affected(struct drm_atomic_state *state)
   17333  1.10  riastrad {
   17334  1.10  riastrad 	struct drm_plane *plane;
   17335  1.10  riastrad 	struct drm_crtc *crtc;
   17336  1.10  riastrad 
   17337  1.10  riastrad 	drm_for_each_crtc(crtc, state->dev) {
   17338  1.10  riastrad 		struct drm_crtc_state *crtc_state;
   17339  1.10  riastrad 
   17340  1.10  riastrad 		crtc_state = drm_atomic_get_crtc_state(state, crtc);
   17341  1.10  riastrad 		if (IS_ERR(crtc_state))
   17342  1.10  riastrad 			return PTR_ERR(crtc_state);
   17343  1.10  riastrad 	}
   17344  1.10  riastrad 
   17345  1.10  riastrad 	drm_for_each_plane(plane, state->dev) {
   17346  1.10  riastrad 		struct drm_plane_state *plane_state;
   17347  1.10  riastrad 
   17348  1.10  riastrad 		plane_state = drm_atomic_get_plane_state(state, plane);
   17349  1.10  riastrad 		if (IS_ERR(plane_state))
   17350  1.10  riastrad 			return PTR_ERR(plane_state);
   17351  1.10  riastrad 	}
   17352  1.10  riastrad 
   17353  1.10  riastrad 	return 0;
   17354  1.10  riastrad }
   17355  1.10  riastrad 
   17356   1.1  riastrad /*
   17357   1.1  riastrad  * Calculate what we think the watermarks should be for the state we've read
   17358   1.1  riastrad  * out of the hardware and then immediately program those watermarks so that
   17359   1.1  riastrad  * we ensure the hardware settings match our internal state.
   17360   1.1  riastrad  *
   17361   1.1  riastrad  * We can calculate what we think WM's should be by creating a duplicate of the
   17362   1.1  riastrad  * current state (which was constructed during hardware readout) and running it
   17363   1.1  riastrad  * through the atomic check code to calculate new watermark values in the
   17364   1.1  riastrad  * state object.
   17365   1.1  riastrad  */
   17366  1.10  riastrad static void sanitize_watermarks(struct drm_i915_private *dev_priv)
   17367   1.1  riastrad {
   17368   1.1  riastrad 	struct drm_atomic_state *state;
   17369   1.1  riastrad 	struct intel_atomic_state *intel_state;
   17370   1.1  riastrad 	struct intel_crtc *crtc;
   17371   1.1  riastrad 	struct intel_crtc_state *crtc_state;
   17372   1.1  riastrad 	struct drm_modeset_acquire_ctx ctx;
   17373   1.1  riastrad 	int ret;
   17374   1.1  riastrad 	int i;
   17375   1.1  riastrad 
   17376   1.1  riastrad 	/* Only supported on platforms that use atomic watermark design */
   17377   1.1  riastrad 	if (!dev_priv->display.optimize_watermarks)
   17378   1.1  riastrad 		return;
   17379   1.1  riastrad 
   17380  1.10  riastrad 	state = drm_atomic_state_alloc(&dev_priv->drm);
   17381  1.10  riastrad 	if (WARN_ON(!state))
   17382  1.10  riastrad 		return;
   17383  1.10  riastrad 
   17384  1.10  riastrad 	intel_state = to_intel_atomic_state(state);
   17385  1.10  riastrad 
   17386   1.1  riastrad 	drm_modeset_acquire_init(&ctx, 0);
   17387  1.10  riastrad 
   17388   1.1  riastrad retry:
   17389  1.10  riastrad 	state->acquire_ctx = &ctx;
   17390   1.1  riastrad 
   17391   1.1  riastrad 	/*
   17392   1.1  riastrad 	 * Hardware readout is the only time we don't want to calculate
   17393   1.1  riastrad 	 * intermediate watermarks (since we don't trust the current
   17394   1.1  riastrad 	 * watermarks).
   17395   1.1  riastrad 	 */
   17396   1.1  riastrad 	if (!HAS_GMCH(dev_priv))
   17397   1.1  riastrad 		intel_state->skip_intermediate_wm = true;
   17398   1.1  riastrad 
   17399  1.10  riastrad 	ret = sanitize_watermarks_add_affected(state);
   17400  1.10  riastrad 	if (ret)
   17401  1.10  riastrad 		goto fail;
   17402  1.10  riastrad 
   17403  1.10  riastrad 	ret = intel_atomic_check(&dev_priv->drm, state);
   17404  1.10  riastrad 	if (ret)
   17405  1.10  riastrad 		goto fail;
   17406   1.1  riastrad 
   17407   1.1  riastrad 	/* Write calculated watermark values back */
   17408   1.1  riastrad 	for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
   17409   1.1  riastrad 		crtc_state->wm.need_postvbl_update = true;
   17410   1.1  riastrad 		dev_priv->display.optimize_watermarks(intel_state, crtc);
   17411   1.1  riastrad 
   17412   1.1  riastrad 		to_intel_crtc_state(crtc->base.state)->wm = crtc_state->wm;
   17413   1.1  riastrad 	}
   17414   1.1  riastrad 
   17415  1.10  riastrad fail:
   17416  1.10  riastrad 	if (ret == -EDEADLK) {
   17417  1.10  riastrad 		drm_atomic_state_clear(state);
   17418  1.10  riastrad 		drm_modeset_backoff(&ctx);
   17419  1.10  riastrad 		goto retry;
   17420  1.10  riastrad 	}
   17421  1.10  riastrad 
   17422  1.10  riastrad 	/*
   17423  1.10  riastrad 	 * If we fail here, it means that the hardware appears to be
   17424  1.10  riastrad 	 * programmed in a way that shouldn't be possible, given our
   17425  1.10  riastrad 	 * understanding of watermark requirements.  This might mean a
   17426  1.10  riastrad 	 * mistake in the hardware readout code or a mistake in the
   17427  1.10  riastrad 	 * watermark calculations for a given platform.  Raise a WARN
   17428  1.10  riastrad 	 * so that this is noticeable.
   17429  1.10  riastrad 	 *
   17430  1.10  riastrad 	 * If this actually happens, we'll have to just leave the
   17431  1.10  riastrad 	 * BIOS-programmed watermarks untouched and hope for the best.
   17432  1.10  riastrad 	 */
   17433  1.10  riastrad 	WARN(ret, "Could not determine valid watermarks for inherited state\n");
   17434  1.10  riastrad 
   17435   1.1  riastrad 	drm_atomic_state_put(state);
   17436  1.10  riastrad 
   17437   1.1  riastrad 	drm_modeset_drop_locks(&ctx);
   17438   1.1  riastrad 	drm_modeset_acquire_fini(&ctx);
   17439   1.1  riastrad }
   17440   1.1  riastrad 
   17441   1.1  riastrad static void intel_update_fdi_pll_freq(struct drm_i915_private *dev_priv)
   17442   1.1  riastrad {
   17443   1.1  riastrad 	if (IS_GEN(dev_priv, 5)) {
   17444   1.1  riastrad 		u32 fdi_pll_clk =
   17445   1.1  riastrad 			I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK;
   17446   1.1  riastrad 
   17447   1.1  riastrad 		dev_priv->fdi_pll_freq = (fdi_pll_clk + 2) * 10000;
   17448   1.1  riastrad 	} else if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv)) {
   17449   1.1  riastrad 		dev_priv->fdi_pll_freq = 270000;
   17450   1.1  riastrad 	} else {
   17451   1.1  riastrad 		return;
   17452   1.1  riastrad 	}
   17453   1.1  riastrad 
   17454   1.1  riastrad 	DRM_DEBUG_DRIVER("FDI PLL freq=%d\n", dev_priv->fdi_pll_freq);
   17455   1.1  riastrad }
   17456   1.1  riastrad 
   17457   1.1  riastrad static int intel_initial_commit(struct drm_device *dev)
   17458   1.1  riastrad {
   17459   1.1  riastrad 	struct drm_atomic_state *state = NULL;
   17460   1.1  riastrad 	struct drm_modeset_acquire_ctx ctx;
   17461   1.1  riastrad 	struct intel_crtc *crtc;
   17462   1.1  riastrad 	int ret = 0;
   17463   1.1  riastrad 
   17464   1.1  riastrad 	state = drm_atomic_state_alloc(dev);
   17465   1.1  riastrad 	if (!state)
   17466   1.1  riastrad 		return -ENOMEM;
   17467   1.1  riastrad 
   17468   1.1  riastrad 	drm_modeset_acquire_init(&ctx, 0);
   17469   1.1  riastrad 
   17470   1.1  riastrad retry:
   17471   1.1  riastrad 	state->acquire_ctx = &ctx;
   17472   1.1  riastrad 
   17473   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   17474   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   17475   1.1  riastrad 			intel_atomic_get_crtc_state(state, crtc);
   17476   1.1  riastrad 
   17477   1.1  riastrad 		if (IS_ERR(crtc_state)) {
   17478   1.1  riastrad 			ret = PTR_ERR(crtc_state);
   17479   1.1  riastrad 			goto out;
   17480   1.1  riastrad 		}
   17481   1.1  riastrad 
   17482   1.1  riastrad 		if (crtc_state->hw.active) {
   17483   1.1  riastrad 			ret = drm_atomic_add_affected_planes(state, &crtc->base);
   17484   1.1  riastrad 			if (ret)
   17485   1.1  riastrad 				goto out;
   17486   1.1  riastrad 
   17487   1.1  riastrad 			/*
   17488   1.1  riastrad 			 * FIXME hack to force a LUT update to avoid the
   17489   1.1  riastrad 			 * plane update forcing the pipe gamma on without
   17490   1.1  riastrad 			 * having a proper LUT loaded. Remove once we
   17491   1.1  riastrad 			 * have readout for pipe gamma enable.
   17492   1.1  riastrad 			 */
   17493   1.1  riastrad 			crtc_state->uapi.color_mgmt_changed = true;
   17494   1.1  riastrad 
   17495   1.1  riastrad 			/*
   17496   1.1  riastrad 			 * FIXME hack to force full modeset when DSC is being
   17497   1.1  riastrad 			 * used.
   17498   1.1  riastrad 			 *
   17499   1.1  riastrad 			 * As long as we do not have full state readout and
   17500   1.1  riastrad 			 * config comparison of crtc_state->dsc, we have no way
   17501   1.1  riastrad 			 * to ensure reliable fastset. Remove once we have
   17502   1.1  riastrad 			 * readout for DSC.
   17503   1.1  riastrad 			 */
   17504   1.1  riastrad 			if (crtc_state->dsc.compression_enable) {
   17505   1.1  riastrad 				ret = drm_atomic_add_affected_connectors(state,
   17506   1.1  riastrad 									 &crtc->base);
   17507   1.1  riastrad 				if (ret)
   17508   1.1  riastrad 					goto out;
   17509   1.1  riastrad 				crtc_state->uapi.mode_changed = true;
   17510   1.1  riastrad 				drm_dbg_kms(dev, "Force full modeset for DSC\n");
   17511   1.1  riastrad 			}
   17512   1.1  riastrad 		}
   17513   1.1  riastrad 	}
   17514   1.1  riastrad 
   17515   1.1  riastrad 	ret = drm_atomic_commit(state);
   17516   1.1  riastrad 
   17517   1.1  riastrad out:
   17518   1.1  riastrad 	if (ret == -EDEADLK) {
   17519   1.1  riastrad 		drm_atomic_state_clear(state);
   17520   1.1  riastrad 		drm_modeset_backoff(&ctx);
   17521   1.1  riastrad 		goto retry;
   17522   1.1  riastrad 	}
   17523   1.1  riastrad 
   17524   1.1  riastrad 	drm_atomic_state_put(state);
   17525   1.1  riastrad 
   17526   1.1  riastrad 	drm_modeset_drop_locks(&ctx);
   17527   1.1  riastrad 	drm_modeset_acquire_fini(&ctx);
   17528   1.1  riastrad 
   17529   1.1  riastrad 	return ret;
   17530   1.1  riastrad }
   17531   1.1  riastrad 
   17532   1.1  riastrad static void intel_mode_config_init(struct drm_i915_private *i915)
   17533   1.1  riastrad {
   17534   1.1  riastrad 	struct drm_mode_config *mode_config = &i915->drm.mode_config;
   17535   1.1  riastrad 
   17536   1.1  riastrad 	drm_mode_config_init(&i915->drm);
   17537   1.1  riastrad 
   17538   1.1  riastrad 	mode_config->min_width = 0;
   17539   1.1  riastrad 	mode_config->min_height = 0;
   17540   1.1  riastrad 
   17541   1.1  riastrad 	mode_config->preferred_depth = 24;
   17542   1.1  riastrad 	mode_config->prefer_shadow = 1;
   17543   1.1  riastrad 
   17544   1.1  riastrad 	mode_config->allow_fb_modifiers = true;
   17545   1.1  riastrad 
   17546   1.1  riastrad 	mode_config->funcs = &intel_mode_funcs;
   17547   1.1  riastrad 
   17548   1.1  riastrad 	/*
   17549   1.1  riastrad 	 * Maximum framebuffer dimensions, chosen to match
   17550   1.1  riastrad 	 * the maximum render engine surface size on gen4+.
   17551   1.1  riastrad 	 */
   17552   1.1  riastrad 	if (INTEL_GEN(i915) >= 7) {
   17553   1.1  riastrad 		mode_config->max_width = 16384;
   17554   1.1  riastrad 		mode_config->max_height = 16384;
   17555   1.1  riastrad 	} else if (INTEL_GEN(i915) >= 4) {
   17556   1.1  riastrad 		mode_config->max_width = 8192;
   17557   1.1  riastrad 		mode_config->max_height = 8192;
   17558   1.1  riastrad 	} else if (IS_GEN(i915, 3)) {
   17559   1.1  riastrad 		mode_config->max_width = 4096;
   17560   1.1  riastrad 		mode_config->max_height = 4096;
   17561   1.1  riastrad 	} else {
   17562   1.1  riastrad 		mode_config->max_width = 2048;
   17563   1.1  riastrad 		mode_config->max_height = 2048;
   17564   1.1  riastrad 	}
   17565   1.1  riastrad 
   17566   1.1  riastrad 	if (IS_I845G(i915) || IS_I865G(i915)) {
   17567   1.1  riastrad 		mode_config->cursor_width = IS_I845G(i915) ? 64 : 512;
   17568   1.1  riastrad 		mode_config->cursor_height = 1023;
   17569   1.1  riastrad 	} else if (IS_GEN(i915, 2)) {
   17570   1.1  riastrad 		mode_config->cursor_width = 64;
   17571   1.1  riastrad 		mode_config->cursor_height = 64;
   17572   1.1  riastrad 	} else {
   17573   1.1  riastrad 		mode_config->cursor_width = 256;
   17574   1.1  riastrad 		mode_config->cursor_height = 256;
   17575   1.1  riastrad 	}
   17576   1.1  riastrad }
   17577   1.1  riastrad 
   17578   1.1  riastrad int intel_modeset_init(struct drm_i915_private *i915)
   17579   1.1  riastrad {
   17580   1.1  riastrad 	struct drm_device *dev = &i915->drm;
   17581   1.1  riastrad 	enum pipe pipe;
   17582   1.1  riastrad 	struct intel_crtc *crtc;
   17583   1.1  riastrad 	int ret;
   17584   1.1  riastrad 
   17585   1.2  riastrad 	mutex_init(&i915->drrs.mutex);
   17586   1.2  riastrad 
   17587   1.1  riastrad 	i915->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
   17588   1.1  riastrad 	i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
   17589   1.1  riastrad 					WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
   17590   1.1  riastrad 
   17591   1.7  riastrad 	spin_lock_init(&i915->atomic_commit_lock);
   17592   1.7  riastrad 	DRM_INIT_WAITQUEUE(&i915->atomic_commit_wq, "i915cmit");
   17593   1.7  riastrad 
   17594   1.1  riastrad 	intel_mode_config_init(i915);
   17595   1.1  riastrad 
   17596   1.1  riastrad 	ret = intel_bw_init(i915);
   17597   1.1  riastrad 	if (ret)
   17598   1.1  riastrad 		return ret;
   17599   1.1  riastrad 
   17600   1.1  riastrad 	init_llist_head(&i915->atomic_helper.free_list);
   17601   1.1  riastrad 	INIT_WORK(&i915->atomic_helper.free_work,
   17602   1.1  riastrad 		  intel_atomic_helper_free_state_worker);
   17603   1.1  riastrad 
   17604   1.1  riastrad 	intel_init_quirks(i915);
   17605   1.1  riastrad 
   17606   1.1  riastrad 	intel_fbc_init(i915);
   17607   1.1  riastrad 
   17608   1.1  riastrad 	intel_init_pm(i915);
   17609   1.1  riastrad 
   17610   1.1  riastrad 	intel_panel_sanitize_ssc(i915);
   17611   1.1  riastrad 
   17612   1.1  riastrad 	intel_gmbus_setup(i915);
   17613   1.1  riastrad 
   17614   1.1  riastrad 	DRM_DEBUG_KMS("%d display pipe%s available.\n",
   17615   1.1  riastrad 		      INTEL_NUM_PIPES(i915),
   17616   1.1  riastrad 		      INTEL_NUM_PIPES(i915) > 1 ? "s" : "");
   17617   1.1  riastrad 
   17618   1.1  riastrad 	if (HAS_DISPLAY(i915) && INTEL_DISPLAY_ENABLED(i915)) {
   17619   1.1  riastrad 		for_each_pipe(i915, pipe) {
   17620   1.1  riastrad 			ret = intel_crtc_init(i915, pipe);
   17621   1.1  riastrad 			if (ret) {
   17622   1.1  riastrad 				drm_mode_config_cleanup(dev);
   17623   1.1  riastrad 				return ret;
   17624   1.1  riastrad 			}
   17625   1.1  riastrad 		}
   17626   1.1  riastrad 	}
   17627   1.1  riastrad 
   17628   1.1  riastrad 	intel_shared_dpll_init(dev);
   17629   1.1  riastrad 	intel_update_fdi_pll_freq(i915);
   17630   1.1  riastrad 
   17631   1.1  riastrad 	intel_update_czclk(i915);
   17632   1.1  riastrad 	intel_modeset_init_hw(i915);
   17633   1.1  riastrad 
   17634   1.1  riastrad 	intel_hdcp_component_init(i915);
   17635   1.1  riastrad 
   17636   1.1  riastrad 	if (i915->max_cdclk_freq == 0)
   17637   1.1  riastrad 		intel_update_max_cdclk(i915);
   17638   1.1  riastrad 
   17639   1.1  riastrad 	/* Just disable it once at startup */
   17640   1.2  riastrad #ifndef __NetBSD__		/* XXX We wait until intelfb is ready.  */
   17641   1.1  riastrad 	intel_vga_disable(i915);
   17642   1.2  riastrad #endif
   17643   1.1  riastrad 	intel_setup_outputs(i915);
   17644   1.1  riastrad 
   17645   1.1  riastrad 	drm_modeset_lock_all(dev);
   17646   1.1  riastrad 	intel_modeset_setup_hw_state(dev, dev->mode_config.acquire_ctx);
   17647   1.1  riastrad 	drm_modeset_unlock_all(dev);
   17648   1.1  riastrad 
   17649   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   17650   1.1  riastrad 		struct intel_initial_plane_config plane_config = {};
   17651   1.1  riastrad 
   17652   1.1  riastrad 		if (!crtc->active)
   17653   1.1  riastrad 			continue;
   17654   1.1  riastrad 
   17655   1.1  riastrad 		/*
   17656   1.1  riastrad 		 * Note that reserving the BIOS fb up front prevents us
   17657   1.1  riastrad 		 * from stuffing other stolen allocations like the ring
   17658   1.1  riastrad 		 * on top.  This prevents some ugliness at boot time, and
   17659   1.1  riastrad 		 * can even allow for smooth boot transitions if the BIOS
   17660   1.1  riastrad 		 * fb is large enough for the active pipe configuration.
   17661   1.1  riastrad 		 */
   17662   1.1  riastrad 		i915->display.get_initial_plane_config(crtc, &plane_config);
   17663   1.1  riastrad 
   17664   1.1  riastrad 		/*
   17665   1.1  riastrad 		 * If the fb is shared between multiple heads, we'll
   17666   1.1  riastrad 		 * just get the first one.
   17667   1.1  riastrad 		 */
   17668   1.1  riastrad 		intel_find_initial_plane_obj(crtc, &plane_config);
   17669   1.1  riastrad 	}
   17670   1.1  riastrad 
   17671   1.1  riastrad 	/*
   17672   1.1  riastrad 	 * Make sure hardware watermarks really match the state we read out.
   17673   1.1  riastrad 	 * Note that we need to do this after reconstructing the BIOS fb's
   17674   1.1  riastrad 	 * since the watermark calculation done here will use pstate->fb.
   17675   1.1  riastrad 	 */
   17676   1.1  riastrad 	if (!HAS_GMCH(i915))
   17677  1.10  riastrad 		sanitize_watermarks(i915);
   17678   1.1  riastrad 
   17679   1.1  riastrad 	/*
   17680   1.1  riastrad 	 * Force all active planes to recompute their states. So that on
   17681   1.1  riastrad 	 * mode_setcrtc after probe, all the intel_plane_state variables
   17682   1.1  riastrad 	 * are already calculated and there is no assert_plane warnings
   17683   1.1  riastrad 	 * during bootup.
   17684   1.1  riastrad 	 */
   17685   1.1  riastrad 	ret = intel_initial_commit(dev);
   17686   1.1  riastrad 	if (ret)
   17687   1.1  riastrad 		DRM_DEBUG_KMS("Initial commit in probe failed.\n");
   17688   1.1  riastrad 
   17689   1.1  riastrad 	return 0;
   17690   1.1  riastrad }
   17691   1.1  riastrad 
   17692   1.1  riastrad void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
   17693   1.1  riastrad {
   17694   1.1  riastrad 	struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17695   1.1  riastrad 	/* 640x480@60Hz, ~25175 kHz */
   17696   1.1  riastrad 	struct dpll clock = {
   17697   1.1  riastrad 		.m1 = 18,
   17698   1.1  riastrad 		.m2 = 7,
   17699   1.1  riastrad 		.p1 = 13,
   17700   1.1  riastrad 		.p2 = 4,
   17701   1.1  riastrad 		.n = 2,
   17702   1.1  riastrad 	};
   17703   1.1  riastrad 	u32 dpll, fp;
   17704   1.1  riastrad 	int i;
   17705   1.1  riastrad 
   17706   1.1  riastrad 	WARN_ON(i9xx_calc_dpll_params(48000, &clock) != 25154);
   17707   1.1  riastrad 
   17708   1.1  riastrad 	DRM_DEBUG_KMS("enabling pipe %c due to force quirk (vco=%d dot=%d)\n",
   17709   1.1  riastrad 		      pipe_name(pipe), clock.vco, clock.dot);
   17710   1.1  riastrad 
   17711   1.1  riastrad 	fp = i9xx_dpll_compute_fp(&clock);
   17712   1.1  riastrad 	dpll = DPLL_DVO_2X_MODE |
   17713   1.1  riastrad 		DPLL_VGA_MODE_DIS |
   17714   1.1  riastrad 		((clock.p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT) |
   17715   1.1  riastrad 		PLL_P2_DIVIDE_BY_4 |
   17716   1.1  riastrad 		PLL_REF_INPUT_DREFCLK |
   17717   1.1  riastrad 		DPLL_VCO_ENABLE;
   17718   1.1  riastrad 
   17719   1.1  riastrad 	I915_WRITE(FP0(pipe), fp);
   17720   1.1  riastrad 	I915_WRITE(FP1(pipe), fp);
   17721   1.1  riastrad 
   17722   1.1  riastrad 	I915_WRITE(HTOTAL(pipe), (640 - 1) | ((800 - 1) << 16));
   17723   1.1  riastrad 	I915_WRITE(HBLANK(pipe), (640 - 1) | ((800 - 1) << 16));
   17724   1.1  riastrad 	I915_WRITE(HSYNC(pipe), (656 - 1) | ((752 - 1) << 16));
   17725   1.1  riastrad 	I915_WRITE(VTOTAL(pipe), (480 - 1) | ((525 - 1) << 16));
   17726   1.1  riastrad 	I915_WRITE(VBLANK(pipe), (480 - 1) | ((525 - 1) << 16));
   17727   1.1  riastrad 	I915_WRITE(VSYNC(pipe), (490 - 1) | ((492 - 1) << 16));
   17728   1.1  riastrad 	I915_WRITE(PIPESRC(pipe), ((640 - 1) << 16) | (480 - 1));
   17729   1.1  riastrad 
   17730   1.1  riastrad 	/*
   17731   1.1  riastrad 	 * Apparently we need to have VGA mode enabled prior to changing
   17732   1.1  riastrad 	 * the P1/P2 dividers. Otherwise the DPLL will keep using the old
   17733   1.1  riastrad 	 * dividers, even though the register value does change.
   17734   1.1  riastrad 	 */
   17735   1.1  riastrad 	I915_WRITE(DPLL(pipe), dpll & ~DPLL_VGA_MODE_DIS);
   17736   1.1  riastrad 	I915_WRITE(DPLL(pipe), dpll);
   17737   1.1  riastrad 
   17738   1.1  riastrad 	/* Wait for the clocks to stabilize. */
   17739   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   17740   1.1  riastrad 	udelay(150);
   17741   1.1  riastrad 
   17742   1.1  riastrad 	/* The pixel multiplier can only be updated once the
   17743   1.1  riastrad 	 * DPLL is enabled and the clocks are stable.
   17744   1.1  riastrad 	 *
   17745   1.1  riastrad 	 * So write it again.
   17746   1.1  riastrad 	 */
   17747   1.1  riastrad 	I915_WRITE(DPLL(pipe), dpll);
   17748   1.1  riastrad 
   17749   1.1  riastrad 	/* We do this three times for luck */
   17750   1.1  riastrad 	for (i = 0; i < 3 ; i++) {
   17751   1.1  riastrad 		I915_WRITE(DPLL(pipe), dpll);
   17752   1.1  riastrad 		POSTING_READ(DPLL(pipe));
   17753   1.1  riastrad 		udelay(150); /* wait for warmup */
   17754   1.1  riastrad 	}
   17755   1.1  riastrad 
   17756   1.1  riastrad 	I915_WRITE(PIPECONF(pipe), PIPECONF_ENABLE | PIPECONF_PROGRESSIVE);
   17757   1.1  riastrad 	POSTING_READ(PIPECONF(pipe));
   17758   1.1  riastrad 
   17759   1.1  riastrad 	intel_wait_for_pipe_scanline_moving(crtc);
   17760   1.1  riastrad }
   17761   1.1  riastrad 
   17762   1.1  riastrad void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
   17763   1.1  riastrad {
   17764   1.1  riastrad 	struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17765   1.1  riastrad 
   17766   1.1  riastrad 	DRM_DEBUG_KMS("disabling pipe %c due to force quirk\n",
   17767   1.1  riastrad 		      pipe_name(pipe));
   17768   1.1  riastrad 
   17769   1.1  riastrad 	WARN_ON(I915_READ(DSPCNTR(PLANE_A)) & DISPLAY_PLANE_ENABLE);
   17770   1.1  riastrad 	WARN_ON(I915_READ(DSPCNTR(PLANE_B)) & DISPLAY_PLANE_ENABLE);
   17771   1.1  riastrad 	WARN_ON(I915_READ(DSPCNTR(PLANE_C)) & DISPLAY_PLANE_ENABLE);
   17772   1.1  riastrad 	WARN_ON(I915_READ(CURCNTR(PIPE_A)) & MCURSOR_MODE);
   17773   1.1  riastrad 	WARN_ON(I915_READ(CURCNTR(PIPE_B)) & MCURSOR_MODE);
   17774   1.1  riastrad 
   17775   1.1  riastrad 	I915_WRITE(PIPECONF(pipe), 0);
   17776   1.1  riastrad 	POSTING_READ(PIPECONF(pipe));
   17777   1.1  riastrad 
   17778   1.1  riastrad 	intel_wait_for_pipe_scanline_stopped(crtc);
   17779   1.1  riastrad 
   17780   1.1  riastrad 	I915_WRITE(DPLL(pipe), DPLL_VGA_MODE_DIS);
   17781   1.1  riastrad 	POSTING_READ(DPLL(pipe));
   17782   1.1  riastrad }
   17783   1.1  riastrad 
   17784   1.1  riastrad static void
   17785   1.1  riastrad intel_sanitize_plane_mapping(struct drm_i915_private *dev_priv)
   17786   1.1  riastrad {
   17787   1.1  riastrad 	struct intel_crtc *crtc;
   17788   1.1  riastrad 
   17789   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 4)
   17790   1.1  riastrad 		return;
   17791   1.1  riastrad 
   17792   1.1  riastrad 	for_each_intel_crtc(&dev_priv->drm, crtc) {
   17793   1.1  riastrad 		struct intel_plane *plane =
   17794   1.1  riastrad 			to_intel_plane(crtc->base.primary);
   17795   1.1  riastrad 		struct intel_crtc *plane_crtc;
   17796   1.1  riastrad 		enum pipe pipe;
   17797   1.1  riastrad 
   17798   1.1  riastrad 		if (!plane->get_hw_state(plane, &pipe))
   17799   1.1  riastrad 			continue;
   17800   1.1  riastrad 
   17801   1.1  riastrad 		if (pipe == crtc->pipe)
   17802   1.1  riastrad 			continue;
   17803   1.1  riastrad 
   17804   1.1  riastrad 		DRM_DEBUG_KMS("[PLANE:%d:%s] attached to the wrong pipe, disabling plane\n",
   17805   1.1  riastrad 			      plane->base.base.id, plane->base.name);
   17806   1.1  riastrad 
   17807   1.1  riastrad 		plane_crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   17808   1.1  riastrad 		intel_plane_disable_noatomic(plane_crtc, plane);
   17809   1.1  riastrad 	}
   17810   1.1  riastrad }
   17811   1.1  riastrad 
   17812   1.1  riastrad static bool intel_crtc_has_encoders(struct intel_crtc *crtc)
   17813   1.1  riastrad {
   17814   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   17815   1.1  riastrad 	struct intel_encoder *encoder;
   17816   1.1  riastrad 
   17817   1.1  riastrad 	for_each_encoder_on_crtc(dev, &crtc->base, encoder)
   17818   1.1  riastrad 		return true;
   17819   1.1  riastrad 
   17820   1.1  riastrad 	return false;
   17821   1.1  riastrad }
   17822   1.1  riastrad 
   17823   1.1  riastrad static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder)
   17824   1.1  riastrad {
   17825   1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   17826   1.1  riastrad 	struct intel_connector *connector;
   17827   1.1  riastrad 
   17828   1.1  riastrad 	for_each_connector_on_encoder(dev, &encoder->base, connector)
   17829   1.1  riastrad 		return connector;
   17830   1.1  riastrad 
   17831   1.1  riastrad 	return NULL;
   17832   1.1  riastrad }
   17833   1.1  riastrad 
   17834   1.1  riastrad static bool has_pch_trancoder(struct drm_i915_private *dev_priv,
   17835   1.1  riastrad 			      enum pipe pch_transcoder)
   17836   1.1  riastrad {
   17837   1.1  riastrad 	return HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
   17838   1.1  riastrad 		(HAS_PCH_LPT_H(dev_priv) && pch_transcoder == PIPE_A);
   17839   1.1  riastrad }
   17840   1.1  riastrad 
   17841   1.1  riastrad static void intel_sanitize_frame_start_delay(const struct intel_crtc_state *crtc_state)
   17842   1.1  riastrad {
   17843   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   17844   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
   17845   1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
   17846   1.1  riastrad 
   17847   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 9 ||
   17848   1.1  riastrad 	    IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
   17849   1.1  riastrad 		i915_reg_t reg = CHICKEN_TRANS(cpu_transcoder);
   17850   1.1  riastrad 		u32 val;
   17851   1.1  riastrad 
   17852   1.1  riastrad 		if (transcoder_is_dsi(cpu_transcoder))
   17853   1.1  riastrad 			return;
   17854   1.1  riastrad 
   17855   1.1  riastrad 		val = I915_READ(reg);
   17856   1.1  riastrad 		val &= ~HSW_FRAME_START_DELAY_MASK;
   17857   1.1  riastrad 		val |= HSW_FRAME_START_DELAY(0);
   17858   1.1  riastrad 		I915_WRITE(reg, val);
   17859   1.1  riastrad 	} else {
   17860   1.1  riastrad 		i915_reg_t reg = PIPECONF(cpu_transcoder);
   17861   1.1  riastrad 		u32 val;
   17862   1.1  riastrad 
   17863   1.1  riastrad 		val = I915_READ(reg);
   17864   1.1  riastrad 		val &= ~PIPECONF_FRAME_START_DELAY_MASK;
   17865   1.1  riastrad 		val |= PIPECONF_FRAME_START_DELAY(0);
   17866   1.1  riastrad 		I915_WRITE(reg, val);
   17867   1.1  riastrad 	}
   17868   1.1  riastrad 
   17869   1.1  riastrad 	if (!crtc_state->has_pch_encoder)
   17870   1.1  riastrad 		return;
   17871   1.1  riastrad 
   17872   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv)) {
   17873   1.1  riastrad 		i915_reg_t reg = PCH_TRANSCONF(crtc->pipe);
   17874   1.1  riastrad 		u32 val;
   17875   1.1  riastrad 
   17876   1.1  riastrad 		val = I915_READ(reg);
   17877   1.1  riastrad 		val &= ~TRANS_FRAME_START_DELAY_MASK;
   17878   1.1  riastrad 		val |= TRANS_FRAME_START_DELAY(0);
   17879   1.1  riastrad 		I915_WRITE(reg, val);
   17880   1.1  riastrad 	} else {
   17881   1.1  riastrad 		enum pipe pch_transcoder = intel_crtc_pch_transcoder(crtc);
   17882   1.1  riastrad 		i915_reg_t reg = TRANS_CHICKEN2(pch_transcoder);
   17883   1.1  riastrad 		u32 val;
   17884   1.1  riastrad 
   17885   1.1  riastrad 		val = I915_READ(reg);
   17886   1.1  riastrad 		val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
   17887   1.1  riastrad 		val |= TRANS_CHICKEN2_FRAME_START_DELAY(0);
   17888   1.1  riastrad 		I915_WRITE(reg, val);
   17889   1.1  riastrad 	}
   17890   1.1  riastrad }
   17891   1.1  riastrad 
   17892   1.1  riastrad static void intel_sanitize_crtc(struct intel_crtc *crtc,
   17893   1.1  riastrad 				struct drm_modeset_acquire_ctx *ctx)
   17894   1.1  riastrad {
   17895   1.1  riastrad 	struct drm_device *dev = crtc->base.dev;
   17896   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   17897   1.1  riastrad 	struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state);
   17898   1.1  riastrad 
   17899   1.1  riastrad 	if (crtc_state->hw.active) {
   17900   1.1  riastrad 		struct intel_plane *plane;
   17901   1.1  riastrad 
   17902   1.1  riastrad 		/* Clear any frame start delays used for debugging left by the BIOS */
   17903   1.1  riastrad 		intel_sanitize_frame_start_delay(crtc_state);
   17904   1.1  riastrad 
   17905   1.1  riastrad 		/* Disable everything but the primary plane */
   17906   1.1  riastrad 		for_each_intel_plane_on_crtc(dev, crtc, plane) {
   17907   1.1  riastrad 			const struct intel_plane_state *plane_state =
   17908   1.1  riastrad 				to_intel_plane_state(plane->base.state);
   17909   1.1  riastrad 
   17910   1.1  riastrad 			if (plane_state->uapi.visible &&
   17911   1.1  riastrad 			    plane->base.type != DRM_PLANE_TYPE_PRIMARY)
   17912   1.1  riastrad 				intel_plane_disable_noatomic(crtc, plane);
   17913   1.1  riastrad 		}
   17914   1.1  riastrad 
   17915   1.1  riastrad 		/*
   17916   1.1  riastrad 		 * Disable any background color set by the BIOS, but enable the
   17917   1.1  riastrad 		 * gamma and CSC to match how we program our planes.
   17918   1.1  riastrad 		 */
   17919   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 9)
   17920   1.1  riastrad 			I915_WRITE(SKL_BOTTOM_COLOR(crtc->pipe),
   17921   1.1  riastrad 				   SKL_BOTTOM_COLOR_GAMMA_ENABLE |
   17922   1.1  riastrad 				   SKL_BOTTOM_COLOR_CSC_ENABLE);
   17923   1.1  riastrad 	}
   17924   1.1  riastrad 
   17925   1.1  riastrad 	/* Adjust the state of the output pipe according to whether we
   17926   1.1  riastrad 	 * have active connectors/encoders. */
   17927   1.1  riastrad 	if (crtc_state->hw.active && !intel_crtc_has_encoders(crtc))
   17928   1.1  riastrad 		intel_crtc_disable_noatomic(crtc, ctx);
   17929   1.1  riastrad 
   17930   1.1  riastrad 	if (crtc_state->hw.active || HAS_GMCH(dev_priv)) {
   17931   1.1  riastrad 		/*
   17932   1.1  riastrad 		 * We start out with underrun reporting disabled to avoid races.
   17933   1.1  riastrad 		 * For correct bookkeeping mark this on active crtcs.
   17934   1.1  riastrad 		 *
   17935   1.1  riastrad 		 * Also on gmch platforms we dont have any hardware bits to
   17936   1.1  riastrad 		 * disable the underrun reporting. Which means we need to start
   17937   1.1  riastrad 		 * out with underrun reporting disabled also on inactive pipes,
   17938   1.1  riastrad 		 * since otherwise we'll complain about the garbage we read when
   17939   1.1  riastrad 		 * e.g. coming up after runtime pm.
   17940   1.1  riastrad 		 *
   17941   1.1  riastrad 		 * No protection against concurrent access is required - at
   17942   1.1  riastrad 		 * worst a fifo underrun happens which also sets this to false.
   17943   1.1  riastrad 		 */
   17944   1.1  riastrad 		crtc->cpu_fifo_underrun_disabled = true;
   17945   1.1  riastrad 		/*
   17946   1.1  riastrad 		 * We track the PCH trancoder underrun reporting state
   17947   1.1  riastrad 		 * within the crtc. With crtc for pipe A housing the underrun
   17948   1.1  riastrad 		 * reporting state for PCH transcoder A, crtc for pipe B housing
   17949   1.1  riastrad 		 * it for PCH transcoder B, etc. LPT-H has only PCH transcoder A,
   17950   1.1  riastrad 		 * and marking underrun reporting as disabled for the non-existing
   17951   1.1  riastrad 		 * PCH transcoders B and C would prevent enabling the south
   17952   1.1  riastrad 		 * error interrupt (see cpt_can_enable_serr_int()).
   17953   1.1  riastrad 		 */
   17954   1.1  riastrad 		if (has_pch_trancoder(dev_priv, crtc->pipe))
   17955   1.1  riastrad 			crtc->pch_fifo_underrun_disabled = true;
   17956   1.1  riastrad 	}
   17957   1.1  riastrad }
   17958   1.1  riastrad 
   17959   1.1  riastrad static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state)
   17960   1.1  riastrad {
   17961   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
   17962   1.1  riastrad 
   17963   1.1  riastrad 	/*
   17964   1.1  riastrad 	 * Some SNB BIOSen (eg. ASUS K53SV) are known to misprogram
   17965   1.1  riastrad 	 * the hardware when a high res displays plugged in. DPLL P
   17966   1.1  riastrad 	 * divider is zero, and the pipe timings are bonkers. We'll
   17967   1.1  riastrad 	 * try to disable everything in that case.
   17968   1.1  riastrad 	 *
   17969   1.1  riastrad 	 * FIXME would be nice to be able to sanitize this state
   17970   1.1  riastrad 	 * without several WARNs, but for now let's take the easy
   17971   1.1  riastrad 	 * road.
   17972   1.1  riastrad 	 */
   17973   1.1  riastrad 	return IS_GEN(dev_priv, 6) &&
   17974   1.1  riastrad 		crtc_state->hw.active &&
   17975   1.1  riastrad 		crtc_state->shared_dpll &&
   17976   1.1  riastrad 		crtc_state->port_clock == 0;
   17977   1.1  riastrad }
   17978   1.1  riastrad 
   17979   1.1  riastrad static void intel_sanitize_encoder(struct intel_encoder *encoder)
   17980   1.1  riastrad {
   17981   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   17982   1.1  riastrad 	struct intel_connector *connector;
   17983   1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
   17984   1.1  riastrad 	struct intel_crtc_state *crtc_state = crtc ?
   17985   1.1  riastrad 		to_intel_crtc_state(crtc->base.state) : NULL;
   17986   1.1  riastrad 
   17987   1.1  riastrad 	/* We need to check both for a crtc link (meaning that the
   17988   1.1  riastrad 	 * encoder is active and trying to read from a pipe) and the
   17989   1.1  riastrad 	 * pipe itself being active. */
   17990   1.1  riastrad 	bool has_active_crtc = crtc_state &&
   17991   1.1  riastrad 		crtc_state->hw.active;
   17992   1.1  riastrad 
   17993   1.1  riastrad 	if (crtc_state && has_bogus_dpll_config(crtc_state)) {
   17994   1.1  riastrad 		DRM_DEBUG_KMS("BIOS has misprogrammed the hardware. Disabling pipe %c\n",
   17995   1.1  riastrad 			      pipe_name(crtc->pipe));
   17996   1.1  riastrad 		has_active_crtc = false;
   17997   1.1  riastrad 	}
   17998   1.1  riastrad 
   17999   1.1  riastrad 	connector = intel_encoder_find_connector(encoder);
   18000   1.1  riastrad 	if (connector && !has_active_crtc) {
   18001   1.1  riastrad 		DRM_DEBUG_KMS("[ENCODER:%d:%s] has active connectors but no active pipe!\n",
   18002   1.1  riastrad 			      encoder->base.base.id,
   18003   1.1  riastrad 			      encoder->base.name);
   18004   1.1  riastrad 
   18005   1.1  riastrad 		/* Connector is active, but has no active pipe. This is
   18006   1.1  riastrad 		 * fallout from our resume register restoring. Disable
   18007   1.1  riastrad 		 * the encoder manually again. */
   18008   1.1  riastrad 		if (crtc_state) {
   18009   1.1  riastrad 			struct drm_encoder *best_encoder;
   18010   1.1  riastrad 
   18011   1.1  riastrad 			DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
   18012   1.1  riastrad 				      encoder->base.base.id,
   18013   1.1  riastrad 				      encoder->base.name);
   18014   1.1  riastrad 
   18015   1.1  riastrad 			/* avoid oopsing in case the hooks consult best_encoder */
   18016   1.1  riastrad 			best_encoder = connector->base.state->best_encoder;
   18017   1.1  riastrad 			connector->base.state->best_encoder = &encoder->base;
   18018   1.1  riastrad 
   18019   1.1  riastrad 			if (encoder->disable)
   18020   1.1  riastrad 				encoder->disable(encoder, crtc_state,
   18021   1.1  riastrad 						 connector->base.state);
   18022   1.1  riastrad 			if (encoder->post_disable)
   18023   1.1  riastrad 				encoder->post_disable(encoder, crtc_state,
   18024   1.1  riastrad 						      connector->base.state);
   18025   1.1  riastrad 
   18026   1.1  riastrad 			connector->base.state->best_encoder = best_encoder;
   18027   1.1  riastrad 		}
   18028   1.1  riastrad 		encoder->base.crtc = NULL;
   18029   1.1  riastrad 
   18030   1.1  riastrad 		/* Inconsistent output/port/pipe state happens presumably due to
   18031   1.1  riastrad 		 * a bug in one of the get_hw_state functions. Or someplace else
   18032   1.1  riastrad 		 * in our code, like the register restore mess on resume. Clamp
   18033   1.1  riastrad 		 * things to off as a safer default. */
   18034   1.1  riastrad 
   18035   1.1  riastrad 		connector->base.dpms = DRM_MODE_DPMS_OFF;
   18036   1.1  riastrad 		connector->base.encoder = NULL;
   18037   1.1  riastrad 	}
   18038   1.1  riastrad 
   18039   1.1  riastrad 	/* notify opregion of the sanitized encoder state */
   18040   1.1  riastrad 	intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
   18041   1.1  riastrad 
   18042   1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11)
   18043   1.1  riastrad 		icl_sanitize_encoder_pll_mapping(encoder);
   18044   1.1  riastrad }
   18045   1.1  riastrad 
   18046   1.1  riastrad /* FIXME read out full plane state for all planes */
   18047   1.1  riastrad static void readout_plane_state(struct drm_i915_private *dev_priv)
   18048   1.1  riastrad {
   18049   1.1  riastrad 	struct intel_plane *plane;
   18050   1.1  riastrad 	struct intel_crtc *crtc;
   18051   1.1  riastrad 
   18052   1.1  riastrad 	for_each_intel_plane(&dev_priv->drm, plane) {
   18053   1.1  riastrad 		struct intel_plane_state *plane_state =
   18054   1.1  riastrad 			to_intel_plane_state(plane->base.state);
   18055   1.1  riastrad 		struct intel_crtc_state *crtc_state;
   18056   1.1  riastrad 		enum pipe pipe = PIPE_A;
   18057   1.1  riastrad 		bool visible;
   18058   1.1  riastrad 
   18059   1.1  riastrad 		visible = plane->get_hw_state(plane, &pipe);
   18060   1.1  riastrad 
   18061   1.1  riastrad 		crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   18062   1.1  riastrad 		crtc_state = to_intel_crtc_state(crtc->base.state);
   18063   1.1  riastrad 
   18064   1.1  riastrad 		intel_set_plane_visible(crtc_state, plane_state, visible);
   18065   1.1  riastrad 
   18066   1.1  riastrad 		DRM_DEBUG_KMS("[PLANE:%d:%s] hw state readout: %s, pipe %c\n",
   18067   1.1  riastrad 			      plane->base.base.id, plane->base.name,
   18068   1.1  riastrad 			      enableddisabled(visible), pipe_name(pipe));
   18069   1.1  riastrad 	}
   18070   1.1  riastrad 
   18071   1.1  riastrad 	for_each_intel_crtc(&dev_priv->drm, crtc) {
   18072   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18073   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18074   1.1  riastrad 
   18075   1.1  riastrad 		fixup_active_planes(crtc_state);
   18076   1.1  riastrad 	}
   18077   1.1  riastrad }
   18078   1.1  riastrad 
   18079   1.1  riastrad static void intel_modeset_readout_hw_state(struct drm_device *dev)
   18080   1.1  riastrad {
   18081   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   18082   1.1  riastrad 	enum pipe pipe;
   18083   1.1  riastrad 	struct intel_crtc *crtc;
   18084   1.1  riastrad 	struct intel_encoder *encoder;
   18085   1.1  riastrad 	struct intel_connector *connector;
   18086   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   18087   1.1  riastrad 	int i;
   18088   1.1  riastrad 
   18089   1.1  riastrad 	dev_priv->active_pipes = 0;
   18090   1.1  riastrad 
   18091   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   18092   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18093   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18094   1.1  riastrad 
   18095   1.1  riastrad 		__drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
   18096   1.1  riastrad 		intel_crtc_free_hw_state(crtc_state);
   18097   1.1  riastrad 		intel_crtc_state_reset(crtc_state, crtc);
   18098   1.1  riastrad 
   18099   1.1  riastrad 		crtc_state->hw.active = crtc_state->hw.enable =
   18100   1.1  riastrad 			dev_priv->display.get_pipe_config(crtc, crtc_state);
   18101   1.1  riastrad 
   18102   1.1  riastrad 		crtc->base.enabled = crtc_state->hw.enable;
   18103   1.1  riastrad 		crtc->active = crtc_state->hw.active;
   18104   1.1  riastrad 
   18105   1.1  riastrad 		if (crtc_state->hw.active)
   18106   1.1  riastrad 			dev_priv->active_pipes |= BIT(crtc->pipe);
   18107   1.1  riastrad 
   18108   1.1  riastrad 		DRM_DEBUG_KMS("[CRTC:%d:%s] hw state readout: %s\n",
   18109   1.1  riastrad 			      crtc->base.base.id, crtc->base.name,
   18110   1.1  riastrad 			      enableddisabled(crtc_state->hw.active));
   18111   1.1  riastrad 	}
   18112   1.1  riastrad 
   18113   1.1  riastrad 	readout_plane_state(dev_priv);
   18114   1.1  riastrad 
   18115   1.1  riastrad 	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
   18116   1.1  riastrad 		struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
   18117   1.1  riastrad 
   18118   1.1  riastrad 		pll->on = pll->info->funcs->get_hw_state(dev_priv, pll,
   18119   1.1  riastrad 							&pll->state.hw_state);
   18120   1.1  riastrad 
   18121   1.1  riastrad 		if (IS_ELKHARTLAKE(dev_priv) && pll->on &&
   18122   1.1  riastrad 		    pll->info->id == DPLL_ID_EHL_DPLL4) {
   18123   1.1  riastrad 			pll->wakeref = intel_display_power_get(dev_priv,
   18124   1.1  riastrad 							       POWER_DOMAIN_DPLL_DC_OFF);
   18125   1.1  riastrad 		}
   18126   1.1  riastrad 
   18127   1.1  riastrad 		pll->state.crtc_mask = 0;
   18128   1.1  riastrad 		for_each_intel_crtc(dev, crtc) {
   18129   1.1  riastrad 			struct intel_crtc_state *crtc_state =
   18130   1.1  riastrad 				to_intel_crtc_state(crtc->base.state);
   18131   1.1  riastrad 
   18132   1.1  riastrad 			if (crtc_state->hw.active &&
   18133   1.1  riastrad 			    crtc_state->shared_dpll == pll)
   18134   1.1  riastrad 				pll->state.crtc_mask |= 1 << crtc->pipe;
   18135   1.1  riastrad 		}
   18136   1.1  riastrad 		pll->active_mask = pll->state.crtc_mask;
   18137   1.1  riastrad 
   18138   1.1  riastrad 		DRM_DEBUG_KMS("%s hw state readout: crtc_mask 0x%08x, on %i\n",
   18139   1.1  riastrad 			      pll->info->name, pll->state.crtc_mask, pll->on);
   18140   1.1  riastrad 	}
   18141   1.1  riastrad 
   18142   1.1  riastrad 	for_each_intel_encoder(dev, encoder) {
   18143   1.1  riastrad 		pipe = 0;
   18144   1.1  riastrad 
   18145   1.1  riastrad 		if (encoder->get_hw_state(encoder, &pipe)) {
   18146   1.1  riastrad 			struct intel_crtc_state *crtc_state;
   18147   1.1  riastrad 
   18148   1.1  riastrad 			crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
   18149   1.1  riastrad 			crtc_state = to_intel_crtc_state(crtc->base.state);
   18150   1.1  riastrad 
   18151   1.1  riastrad 			encoder->base.crtc = &crtc->base;
   18152   1.1  riastrad 			encoder->get_config(encoder, crtc_state);
   18153   1.1  riastrad 		} else {
   18154   1.1  riastrad 			encoder->base.crtc = NULL;
   18155   1.1  riastrad 		}
   18156   1.1  riastrad 
   18157   1.1  riastrad 		DRM_DEBUG_KMS("[ENCODER:%d:%s] hw state readout: %s, pipe %c\n",
   18158   1.1  riastrad 			      encoder->base.base.id, encoder->base.name,
   18159   1.1  riastrad 			      enableddisabled(encoder->base.crtc),
   18160   1.1  riastrad 			      pipe_name(pipe));
   18161   1.1  riastrad 	}
   18162   1.1  riastrad 
   18163   1.1  riastrad 	drm_connector_list_iter_begin(dev, &conn_iter);
   18164   1.1  riastrad 	for_each_intel_connector_iter(connector, &conn_iter) {
   18165   1.1  riastrad 		if (connector->get_hw_state(connector)) {
   18166   1.1  riastrad 			struct intel_crtc_state *crtc_state;
   18167   1.1  riastrad 			struct intel_crtc *crtc;
   18168   1.1  riastrad 
   18169   1.1  riastrad 			connector->base.dpms = DRM_MODE_DPMS_ON;
   18170   1.1  riastrad 
   18171   1.1  riastrad 			encoder = connector->encoder;
   18172   1.1  riastrad 			connector->base.encoder = &encoder->base;
   18173   1.1  riastrad 
   18174   1.1  riastrad 			crtc = to_intel_crtc(encoder->base.crtc);
   18175   1.1  riastrad 			crtc_state = crtc ? to_intel_crtc_state(crtc->base.state) : NULL;
   18176   1.1  riastrad 
   18177   1.1  riastrad 			if (crtc_state && crtc_state->hw.active) {
   18178   1.1  riastrad 				/*
   18179   1.1  riastrad 				 * This has to be done during hardware readout
   18180   1.1  riastrad 				 * because anything calling .crtc_disable may
   18181   1.1  riastrad 				 * rely on the connector_mask being accurate.
   18182   1.1  riastrad 				 */
   18183   1.1  riastrad 				crtc_state->uapi.connector_mask |=
   18184   1.1  riastrad 					drm_connector_mask(&connector->base);
   18185   1.1  riastrad 				crtc_state->uapi.encoder_mask |=
   18186   1.1  riastrad 					drm_encoder_mask(&encoder->base);
   18187   1.1  riastrad 			}
   18188   1.1  riastrad 		} else {
   18189   1.1  riastrad 			connector->base.dpms = DRM_MODE_DPMS_OFF;
   18190   1.1  riastrad 			connector->base.encoder = NULL;
   18191   1.1  riastrad 		}
   18192   1.1  riastrad 		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] hw state readout: %s\n",
   18193   1.1  riastrad 			      connector->base.base.id, connector->base.name,
   18194   1.1  riastrad 			      enableddisabled(connector->base.encoder));
   18195   1.1  riastrad 	}
   18196   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   18197   1.1  riastrad 
   18198   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   18199   1.1  riastrad 		struct intel_bw_state *bw_state =
   18200   1.1  riastrad 			to_intel_bw_state(dev_priv->bw_obj.state);
   18201   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18202   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18203   1.1  riastrad 		struct intel_plane *plane;
   18204   1.1  riastrad 		int min_cdclk = 0;
   18205   1.1  riastrad 
   18206   1.1  riastrad 		if (crtc_state->hw.active) {
   18207   1.1  riastrad 			struct drm_display_mode *mode = &crtc_state->hw.mode;
   18208   1.1  riastrad 
   18209   1.1  riastrad 			intel_mode_from_pipe_config(&crtc_state->hw.adjusted_mode,
   18210   1.1  riastrad 						    crtc_state);
   18211   1.1  riastrad 
   18212   1.1  riastrad 			*mode = crtc_state->hw.adjusted_mode;
   18213   1.1  riastrad 			mode->hdisplay = crtc_state->pipe_src_w;
   18214   1.1  riastrad 			mode->vdisplay = crtc_state->pipe_src_h;
   18215   1.1  riastrad 
   18216   1.1  riastrad 			/*
   18217   1.1  riastrad 			 * The initial mode needs to be set in order to keep
   18218   1.1  riastrad 			 * the atomic core happy. It wants a valid mode if the
   18219   1.1  riastrad 			 * crtc's enabled, so we do the above call.
   18220   1.1  riastrad 			 *
   18221   1.1  riastrad 			 * But we don't set all the derived state fully, hence
   18222   1.1  riastrad 			 * set a flag to indicate that a full recalculation is
   18223   1.1  riastrad 			 * needed on the next commit.
   18224   1.1  riastrad 			 */
   18225   1.1  riastrad 			mode->private_flags = I915_MODE_FLAG_INHERITED;
   18226   1.1  riastrad 
   18227   1.1  riastrad 			intel_crtc_compute_pixel_rate(crtc_state);
   18228   1.1  riastrad 
   18229   1.1  riastrad 			intel_crtc_update_active_timings(crtc_state);
   18230   1.1  riastrad 
   18231   1.1  riastrad 			intel_crtc_copy_hw_to_uapi_state(crtc_state);
   18232   1.1  riastrad 		}
   18233   1.1  riastrad 
   18234   1.1  riastrad 		for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
   18235   1.1  riastrad 			const struct intel_plane_state *plane_state =
   18236   1.1  riastrad 				to_intel_plane_state(plane->base.state);
   18237   1.1  riastrad 
   18238   1.1  riastrad 			/*
   18239   1.1  riastrad 			 * FIXME don't have the fb yet, so can't
   18240   1.1  riastrad 			 * use intel_plane_data_rate() :(
   18241   1.1  riastrad 			 */
   18242   1.1  riastrad 			if (plane_state->uapi.visible)
   18243   1.1  riastrad 				crtc_state->data_rate[plane->id] =
   18244   1.1  riastrad 					4 * crtc_state->pixel_rate;
   18245   1.1  riastrad 			/*
   18246   1.1  riastrad 			 * FIXME don't have the fb yet, so can't
   18247   1.1  riastrad 			 * use plane->min_cdclk() :(
   18248   1.1  riastrad 			 */
   18249   1.1  riastrad 			if (plane_state->uapi.visible && plane->min_cdclk) {
   18250   1.1  riastrad 				if (crtc_state->double_wide ||
   18251   1.1  riastrad 				    INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   18252   1.1  riastrad 					crtc_state->min_cdclk[plane->id] =
   18253   1.1  riastrad 						DIV_ROUND_UP(crtc_state->pixel_rate, 2);
   18254   1.1  riastrad 				else
   18255   1.1  riastrad 					crtc_state->min_cdclk[plane->id] =
   18256   1.1  riastrad 						crtc_state->pixel_rate;
   18257   1.1  riastrad 			}
   18258   1.1  riastrad 			DRM_DEBUG_KMS("[PLANE:%d:%s] min_cdclk %d kHz\n",
   18259   1.1  riastrad 				      plane->base.base.id, plane->base.name,
   18260   1.1  riastrad 				      crtc_state->min_cdclk[plane->id]);
   18261   1.1  riastrad 		}
   18262   1.1  riastrad 
   18263   1.1  riastrad 		if (crtc_state->hw.active) {
   18264   1.1  riastrad 			min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
   18265   1.1  riastrad 			if (WARN_ON(min_cdclk < 0))
   18266   1.1  riastrad 				min_cdclk = 0;
   18267   1.1  riastrad 		}
   18268   1.1  riastrad 
   18269   1.1  riastrad 		dev_priv->min_cdclk[crtc->pipe] = min_cdclk;
   18270   1.1  riastrad 		dev_priv->min_voltage_level[crtc->pipe] =
   18271   1.1  riastrad 			crtc_state->min_voltage_level;
   18272   1.1  riastrad 
   18273   1.1  riastrad 		intel_bw_crtc_update(bw_state, crtc_state);
   18274   1.1  riastrad 
   18275   1.1  riastrad 		intel_pipe_config_sanity_check(dev_priv, crtc_state);
   18276   1.1  riastrad 	}
   18277   1.1  riastrad }
   18278   1.1  riastrad 
   18279   1.1  riastrad static void
   18280   1.1  riastrad get_encoder_power_domains(struct drm_i915_private *dev_priv)
   18281   1.1  riastrad {
   18282   1.1  riastrad 	struct intel_encoder *encoder;
   18283   1.1  riastrad 
   18284   1.1  riastrad 	for_each_intel_encoder(&dev_priv->drm, encoder) {
   18285   1.1  riastrad 		struct intel_crtc_state *crtc_state;
   18286   1.1  riastrad 
   18287   1.1  riastrad 		if (!encoder->get_power_domains)
   18288   1.1  riastrad 			continue;
   18289   1.1  riastrad 
   18290   1.1  riastrad 		/*
   18291   1.1  riastrad 		 * MST-primary and inactive encoders don't have a crtc state
   18292   1.1  riastrad 		 * and neither of these require any power domain references.
   18293   1.1  riastrad 		 */
   18294   1.1  riastrad 		if (!encoder->base.crtc)
   18295   1.1  riastrad 			continue;
   18296   1.1  riastrad 
   18297   1.1  riastrad 		crtc_state = to_intel_crtc_state(encoder->base.crtc->state);
   18298   1.1  riastrad 		encoder->get_power_domains(encoder, crtc_state);
   18299   1.1  riastrad 	}
   18300   1.1  riastrad }
   18301   1.1  riastrad 
   18302   1.1  riastrad static void intel_early_display_was(struct drm_i915_private *dev_priv)
   18303   1.1  riastrad {
   18304   1.1  riastrad 	/*
   18305   1.1  riastrad 	 * Display WA #1185 WaDisableDARBFClkGating:cnl,glk,icl,ehl,tgl
   18306   1.1  riastrad 	 * Also known as Wa_14010480278.
   18307   1.1  riastrad 	 */
   18308   1.1  riastrad 	if (IS_GEN_RANGE(dev_priv, 10, 12) || IS_GEMINILAKE(dev_priv))
   18309   1.1  riastrad 		I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
   18310   1.1  riastrad 			   DARBF_GATING_DIS);
   18311   1.1  riastrad 
   18312   1.1  riastrad 	if (IS_HASWELL(dev_priv)) {
   18313   1.1  riastrad 		/*
   18314   1.1  riastrad 		 * WaRsPkgCStateDisplayPMReq:hsw
   18315   1.1  riastrad 		 * System hang if this isn't done before disabling all planes!
   18316   1.1  riastrad 		 */
   18317   1.1  riastrad 		I915_WRITE(CHICKEN_PAR1_1,
   18318   1.1  riastrad 			   I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
   18319   1.1  riastrad 	}
   18320   1.1  riastrad }
   18321   1.1  riastrad 
   18322   1.1  riastrad static void ibx_sanitize_pch_hdmi_port(struct drm_i915_private *dev_priv,
   18323   1.1  riastrad 				       enum port port, i915_reg_t hdmi_reg)
   18324   1.1  riastrad {
   18325   1.1  riastrad 	u32 val = I915_READ(hdmi_reg);
   18326   1.1  riastrad 
   18327   1.1  riastrad 	if (val & SDVO_ENABLE ||
   18328   1.1  riastrad 	    (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A))
   18329   1.1  riastrad 		return;
   18330   1.1  riastrad 
   18331   1.1  riastrad 	DRM_DEBUG_KMS("Sanitizing transcoder select for HDMI %c\n",
   18332   1.1  riastrad 		      port_name(port));
   18333   1.1  riastrad 
   18334   1.1  riastrad 	val &= ~SDVO_PIPE_SEL_MASK;
   18335   1.1  riastrad 	val |= SDVO_PIPE_SEL(PIPE_A);
   18336   1.1  riastrad 
   18337   1.1  riastrad 	I915_WRITE(hdmi_reg, val);
   18338   1.1  riastrad }
   18339   1.1  riastrad 
   18340   1.1  riastrad static void ibx_sanitize_pch_dp_port(struct drm_i915_private *dev_priv,
   18341   1.1  riastrad 				     enum port port, i915_reg_t dp_reg)
   18342   1.1  riastrad {
   18343   1.1  riastrad 	u32 val = I915_READ(dp_reg);
   18344   1.1  riastrad 
   18345   1.1  riastrad 	if (val & DP_PORT_EN ||
   18346   1.1  riastrad 	    (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A))
   18347   1.1  riastrad 		return;
   18348   1.1  riastrad 
   18349   1.1  riastrad 	DRM_DEBUG_KMS("Sanitizing transcoder select for DP %c\n",
   18350   1.1  riastrad 		      port_name(port));
   18351   1.1  riastrad 
   18352   1.1  riastrad 	val &= ~DP_PIPE_SEL_MASK;
   18353   1.1  riastrad 	val |= DP_PIPE_SEL(PIPE_A);
   18354   1.1  riastrad 
   18355   1.1  riastrad 	I915_WRITE(dp_reg, val);
   18356   1.1  riastrad }
   18357   1.1  riastrad 
   18358   1.1  riastrad static void ibx_sanitize_pch_ports(struct drm_i915_private *dev_priv)
   18359   1.1  riastrad {
   18360   1.1  riastrad 	/*
   18361   1.1  riastrad 	 * The BIOS may select transcoder B on some of the PCH
   18362   1.1  riastrad 	 * ports even it doesn't enable the port. This would trip
   18363   1.1  riastrad 	 * assert_pch_dp_disabled() and assert_pch_hdmi_disabled().
   18364   1.1  riastrad 	 * Sanitize the transcoder select bits to prevent that. We
   18365   1.1  riastrad 	 * assume that the BIOS never actually enabled the port,
   18366   1.1  riastrad 	 * because if it did we'd actually have to toggle the port
   18367   1.1  riastrad 	 * on and back off to make the transcoder A select stick
   18368   1.1  riastrad 	 * (see. intel_dp_link_down(), intel_disable_hdmi(),
   18369   1.1  riastrad 	 * intel_disable_sdvo()).
   18370   1.1  riastrad 	 */
   18371   1.1  riastrad 	ibx_sanitize_pch_dp_port(dev_priv, PORT_B, PCH_DP_B);
   18372   1.1  riastrad 	ibx_sanitize_pch_dp_port(dev_priv, PORT_C, PCH_DP_C);
   18373   1.1  riastrad 	ibx_sanitize_pch_dp_port(dev_priv, PORT_D, PCH_DP_D);
   18374   1.1  riastrad 
   18375   1.1  riastrad 	/* PCH SDVOB multiplex with HDMIB */
   18376   1.1  riastrad 	ibx_sanitize_pch_hdmi_port(dev_priv, PORT_B, PCH_HDMIB);
   18377   1.1  riastrad 	ibx_sanitize_pch_hdmi_port(dev_priv, PORT_C, PCH_HDMIC);
   18378   1.1  riastrad 	ibx_sanitize_pch_hdmi_port(dev_priv, PORT_D, PCH_HDMID);
   18379   1.1  riastrad }
   18380   1.1  riastrad 
   18381   1.1  riastrad /* Scan out the current hw modeset state,
   18382   1.1  riastrad  * and sanitizes it to the current state
   18383   1.1  riastrad  */
   18384   1.1  riastrad static void
   18385   1.1  riastrad intel_modeset_setup_hw_state(struct drm_device *dev,
   18386   1.1  riastrad 			     struct drm_modeset_acquire_ctx *ctx)
   18387   1.1  riastrad {
   18388   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   18389   1.1  riastrad 	struct intel_encoder *encoder;
   18390   1.1  riastrad 	struct intel_crtc *crtc;
   18391   1.1  riastrad 	intel_wakeref_t wakeref;
   18392   1.1  riastrad 	int i;
   18393   1.1  riastrad 
   18394   1.1  riastrad 	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
   18395   1.1  riastrad 
   18396   1.1  riastrad 	intel_early_display_was(dev_priv);
   18397   1.1  riastrad 	intel_modeset_readout_hw_state(dev);
   18398   1.1  riastrad 
   18399   1.1  riastrad 	/* HW state is read out, now we need to sanitize this mess. */
   18400   1.1  riastrad 
   18401   1.1  riastrad 	/* Sanitize the TypeC port mode upfront, encoders depend on this */
   18402   1.1  riastrad 	for_each_intel_encoder(dev, encoder) {
   18403   1.1  riastrad 		enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
   18404   1.1  riastrad 
   18405   1.1  riastrad 		/* We need to sanitize only the MST primary port. */
   18406   1.1  riastrad 		if (encoder->type != INTEL_OUTPUT_DP_MST &&
   18407   1.1  riastrad 		    intel_phy_is_tc(dev_priv, phy))
   18408   1.1  riastrad 			intel_tc_port_sanitize(enc_to_dig_port(encoder));
   18409   1.1  riastrad 	}
   18410   1.1  riastrad 
   18411   1.1  riastrad 	get_encoder_power_domains(dev_priv);
   18412   1.1  riastrad 
   18413   1.1  riastrad 	if (HAS_PCH_IBX(dev_priv))
   18414   1.1  riastrad 		ibx_sanitize_pch_ports(dev_priv);
   18415   1.1  riastrad 
   18416   1.1  riastrad 	/*
   18417   1.1  riastrad 	 * intel_sanitize_plane_mapping() may need to do vblank
   18418   1.1  riastrad 	 * waits, so we need vblank interrupts restored beforehand.
   18419   1.1  riastrad 	 */
   18420   1.1  riastrad 	for_each_intel_crtc(&dev_priv->drm, crtc) {
   18421   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18422   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18423   1.1  riastrad 
   18424   1.1  riastrad 		drm_crtc_vblank_reset(&crtc->base);
   18425   1.1  riastrad 
   18426   1.1  riastrad 		if (crtc_state->hw.active)
   18427   1.1  riastrad 			intel_crtc_vblank_on(crtc_state);
   18428   1.1  riastrad 	}
   18429   1.1  riastrad 
   18430   1.1  riastrad 	intel_sanitize_plane_mapping(dev_priv);
   18431   1.1  riastrad 
   18432   1.1  riastrad 	for_each_intel_encoder(dev, encoder)
   18433   1.1  riastrad 		intel_sanitize_encoder(encoder);
   18434   1.1  riastrad 
   18435   1.1  riastrad 	for_each_intel_crtc(&dev_priv->drm, crtc) {
   18436   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18437   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18438   1.1  riastrad 
   18439   1.1  riastrad 		intel_sanitize_crtc(crtc, ctx);
   18440   1.1  riastrad 		intel_dump_pipe_config(crtc_state, NULL, "[setup_hw_state]");
   18441   1.1  riastrad 	}
   18442   1.1  riastrad 
   18443   1.1  riastrad 	intel_modeset_update_connector_atomic_state(dev);
   18444   1.1  riastrad 
   18445   1.1  riastrad 	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
   18446   1.1  riastrad 		struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
   18447   1.1  riastrad 
   18448   1.1  riastrad 		if (!pll->on || pll->active_mask)
   18449   1.1  riastrad 			continue;
   18450   1.1  riastrad 
   18451   1.1  riastrad 		DRM_DEBUG_KMS("%s enabled but not in use, disabling\n",
   18452   1.1  riastrad 			      pll->info->name);
   18453   1.1  riastrad 
   18454   1.1  riastrad 		pll->info->funcs->disable(dev_priv, pll);
   18455   1.1  riastrad 		pll->on = false;
   18456   1.1  riastrad 	}
   18457   1.1  riastrad 
   18458   1.1  riastrad 	if (IS_G4X(dev_priv)) {
   18459   1.1  riastrad 		g4x_wm_get_hw_state(dev_priv);
   18460   1.1  riastrad 		g4x_wm_sanitize(dev_priv);
   18461   1.1  riastrad 	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   18462   1.1  riastrad 		vlv_wm_get_hw_state(dev_priv);
   18463   1.1  riastrad 		vlv_wm_sanitize(dev_priv);
   18464   1.1  riastrad 	} else if (INTEL_GEN(dev_priv) >= 9) {
   18465   1.1  riastrad 		skl_wm_get_hw_state(dev_priv);
   18466   1.1  riastrad 	} else if (HAS_PCH_SPLIT(dev_priv)) {
   18467   1.1  riastrad 		ilk_wm_get_hw_state(dev_priv);
   18468   1.1  riastrad 	}
   18469   1.1  riastrad 
   18470   1.1  riastrad 	for_each_intel_crtc(dev, crtc) {
   18471   1.1  riastrad 		struct intel_crtc_state *crtc_state =
   18472   1.1  riastrad 			to_intel_crtc_state(crtc->base.state);
   18473   1.1  riastrad 		u64 put_domains;
   18474   1.1  riastrad 
   18475   1.1  riastrad 		put_domains = modeset_get_crtc_power_domains(crtc_state);
   18476   1.1  riastrad 		if (WARN_ON(put_domains))
   18477   1.1  riastrad 			modeset_put_power_domains(dev_priv, put_domains);
   18478   1.1  riastrad 	}
   18479   1.1  riastrad 
   18480   1.1  riastrad 	intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
   18481   1.1  riastrad }
   18482   1.1  riastrad 
   18483   1.1  riastrad void intel_display_resume(struct drm_device *dev)
   18484   1.1  riastrad {
   18485   1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   18486   1.1  riastrad 	struct drm_atomic_state *state = dev_priv->modeset_restore_state;
   18487   1.1  riastrad 	struct drm_modeset_acquire_ctx ctx;
   18488   1.1  riastrad 	int ret;
   18489   1.1  riastrad 
   18490   1.1  riastrad 	dev_priv->modeset_restore_state = NULL;
   18491   1.1  riastrad 	if (state)
   18492   1.1  riastrad 		state->acquire_ctx = &ctx;
   18493   1.1  riastrad 
   18494   1.1  riastrad 	drm_modeset_acquire_init(&ctx, 0);
   18495   1.1  riastrad 
   18496   1.1  riastrad 	while (1) {
   18497   1.1  riastrad 		ret = drm_modeset_lock_all_ctx(dev, &ctx);
   18498   1.1  riastrad 		if (ret != -EDEADLK)
   18499   1.1  riastrad 			break;
   18500   1.1  riastrad 
   18501   1.1  riastrad 		drm_modeset_backoff(&ctx);
   18502   1.1  riastrad 	}
   18503   1.1  riastrad 
   18504   1.1  riastrad 	if (!ret)
   18505   1.1  riastrad 		ret = __intel_display_resume(dev, state, &ctx);
   18506   1.1  riastrad 
   18507   1.1  riastrad 	intel_enable_ipc(dev_priv);
   18508   1.1  riastrad 	drm_modeset_drop_locks(&ctx);
   18509   1.1  riastrad 	drm_modeset_acquire_fini(&ctx);
   18510   1.1  riastrad 
   18511   1.1  riastrad 	if (ret)
   18512   1.1  riastrad 		DRM_ERROR("Restoring old state failed with %i\n", ret);
   18513   1.1  riastrad 	if (state)
   18514   1.1  riastrad 		drm_atomic_state_put(state);
   18515   1.1  riastrad }
   18516   1.1  riastrad 
   18517   1.1  riastrad static void intel_hpd_poll_fini(struct drm_i915_private *i915)
   18518   1.1  riastrad {
   18519   1.1  riastrad 	struct intel_connector *connector;
   18520   1.1  riastrad 	struct drm_connector_list_iter conn_iter;
   18521   1.1  riastrad 
   18522   1.1  riastrad 	/* Kill all the work that may have been queued by hpd. */
   18523   1.1  riastrad 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
   18524   1.1  riastrad 	for_each_intel_connector_iter(connector, &conn_iter) {
   18525   1.1  riastrad 		if (connector->modeset_retry_work.func)
   18526   1.1  riastrad 			cancel_work_sync(&connector->modeset_retry_work);
   18527   1.1  riastrad 		if (connector->hdcp.shim) {
   18528   1.1  riastrad 			cancel_delayed_work_sync(&connector->hdcp.check_work);
   18529   1.1  riastrad 			cancel_work_sync(&connector->hdcp.prop_work);
   18530   1.1  riastrad 		}
   18531   1.1  riastrad 	}
   18532   1.1  riastrad 	drm_connector_list_iter_end(&conn_iter);
   18533   1.1  riastrad }
   18534   1.1  riastrad 
   18535   1.1  riastrad void intel_modeset_driver_remove(struct drm_i915_private *i915)
   18536   1.1  riastrad {
   18537   1.1  riastrad 	flush_workqueue(i915->flip_wq);
   18538   1.1  riastrad 	flush_workqueue(i915->modeset_wq);
   18539   1.1  riastrad 
   18540   1.1  riastrad 	flush_work(&i915->atomic_helper.free_work);
   18541   1.1  riastrad 	WARN_ON(!llist_empty(&i915->atomic_helper.free_list));
   18542   1.1  riastrad 
   18543   1.1  riastrad 	/*
   18544   1.1  riastrad 	 * Interrupts and polling as the first thing to avoid creating havoc.
   18545   1.1  riastrad 	 * Too much stuff here (turning of connectors, ...) would
   18546   1.1  riastrad 	 * experience fancy races otherwise.
   18547   1.1  riastrad 	 */
   18548   1.1  riastrad 	intel_irq_uninstall(i915);
   18549   1.1  riastrad 
   18550   1.1  riastrad 	/*
   18551   1.1  riastrad 	 * Due to the hpd irq storm handling the hotplug work can re-arm the
   18552   1.1  riastrad 	 * poll handlers. Hence disable polling after hpd handling is shut down.
   18553   1.1  riastrad 	 */
   18554   1.1  riastrad 	intel_hpd_poll_fini(i915);
   18555   1.1  riastrad 
   18556   1.1  riastrad 	/*
   18557   1.1  riastrad 	 * MST topology needs to be suspended so we don't have any calls to
   18558   1.1  riastrad 	 * fbdev after it's finalized. MST will be destroyed later as part of
   18559   1.1  riastrad 	 * drm_mode_config_cleanup()
   18560   1.1  riastrad 	 */
   18561   1.1  riastrad 	intel_dp_mst_suspend(i915);
   18562   1.1  riastrad 
   18563   1.1  riastrad 	/* poll work can call into fbdev, hence clean that up afterwards */
   18564   1.1  riastrad 	intel_fbdev_fini(i915);
   18565   1.1  riastrad 
   18566   1.1  riastrad 	intel_unregister_dsm_handler();
   18567   1.1  riastrad 
   18568   1.1  riastrad 	intel_fbc_global_disable(i915);
   18569   1.1  riastrad 
   18570   1.1  riastrad 	/* flush any delayed tasks or pending work */
   18571   1.1  riastrad 	flush_scheduled_work();
   18572   1.1  riastrad 
   18573   1.1  riastrad 	intel_hdcp_component_fini(i915);
   18574   1.1  riastrad 
   18575   1.1  riastrad 	drm_mode_config_cleanup(&i915->drm);
   18576   1.1  riastrad 
   18577   1.1  riastrad 	intel_overlay_cleanup(i915);
   18578   1.1  riastrad 
   18579  1.11  riastrad 	intel_shared_dpll_cleanup(&i915->drm);
   18580  1.11  riastrad 
   18581   1.1  riastrad 	intel_gmbus_teardown(i915);
   18582   1.1  riastrad 
   18583  1.11  riastrad 	intel_fbc_cleanup(i915);
   18584  1.11  riastrad 
   18585   1.1  riastrad 	intel_bw_cleanup(i915);
   18586   1.1  riastrad 
   18587   1.7  riastrad 	DRM_DESTROY_WAITQUEUE(&i915->atomic_commit_wq);
   18588   1.7  riastrad 	spin_lock_destroy(&i915->atomic_commit_lock);
   18589   1.7  riastrad 
   18590   1.1  riastrad 	destroy_workqueue(i915->flip_wq);
   18591   1.1  riastrad 	destroy_workqueue(i915->modeset_wq);
   18592   1.1  riastrad 
   18593   1.2  riastrad 	mutex_destroy(&i915->drrs.mutex);
   18594   1.2  riastrad 
   18595   1.1  riastrad 	intel_fbc_cleanup_cfb(i915);
   18596   1.1  riastrad }
   18597   1.1  riastrad 
   18598   1.1  riastrad #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
   18599   1.1  riastrad 
   18600   1.1  riastrad struct intel_display_error_state {
   18601   1.1  riastrad 
   18602   1.1  riastrad 	u32 power_well_driver;
   18603   1.1  riastrad 
   18604   1.1  riastrad 	struct intel_cursor_error_state {
   18605   1.1  riastrad 		u32 control;
   18606   1.1  riastrad 		u32 position;
   18607   1.1  riastrad 		u32 base;
   18608   1.1  riastrad 		u32 size;
   18609   1.1  riastrad 	} cursor[I915_MAX_PIPES];
   18610   1.1  riastrad 
   18611   1.1  riastrad 	struct intel_pipe_error_state {
   18612   1.1  riastrad 		bool power_domain_on;
   18613   1.1  riastrad 		u32 source;
   18614   1.1  riastrad 		u32 stat;
   18615   1.1  riastrad 	} pipe[I915_MAX_PIPES];
   18616   1.1  riastrad 
   18617   1.1  riastrad 	struct intel_plane_error_state {
   18618   1.1  riastrad 		u32 control;
   18619   1.1  riastrad 		u32 stride;
   18620   1.1  riastrad 		u32 size;
   18621   1.1  riastrad 		u32 pos;
   18622   1.1  riastrad 		u32 addr;
   18623   1.1  riastrad 		u32 surface;
   18624   1.1  riastrad 		u32 tile_offset;
   18625   1.1  riastrad 	} plane[I915_MAX_PIPES];
   18626   1.1  riastrad 
   18627   1.1  riastrad 	struct intel_transcoder_error_state {
   18628   1.1  riastrad 		bool available;
   18629   1.1  riastrad 		bool power_domain_on;
   18630   1.1  riastrad 		enum transcoder cpu_transcoder;
   18631   1.1  riastrad 
   18632   1.1  riastrad 		u32 conf;
   18633   1.1  riastrad 
   18634   1.1  riastrad 		u32 htotal;
   18635   1.1  riastrad 		u32 hblank;
   18636   1.1  riastrad 		u32 hsync;
   18637   1.1  riastrad 		u32 vtotal;
   18638   1.1  riastrad 		u32 vblank;
   18639   1.1  riastrad 		u32 vsync;
   18640   1.1  riastrad 	} transcoder[5];
   18641   1.1  riastrad };
   18642   1.1  riastrad 
   18643   1.1  riastrad struct intel_display_error_state *
   18644   1.1  riastrad intel_display_capture_error_state(struct drm_i915_private *dev_priv)
   18645   1.1  riastrad {
   18646   1.1  riastrad 	struct intel_display_error_state *error;
   18647   1.1  riastrad 	int transcoders[] = {
   18648   1.1  riastrad 		TRANSCODER_A,
   18649   1.1  riastrad 		TRANSCODER_B,
   18650   1.1  riastrad 		TRANSCODER_C,
   18651   1.1  riastrad 		TRANSCODER_D,
   18652   1.1  riastrad 		TRANSCODER_EDP,
   18653   1.1  riastrad 	};
   18654   1.1  riastrad 	int i;
   18655   1.1  riastrad 
   18656   1.1  riastrad 	BUILD_BUG_ON(ARRAY_SIZE(transcoders) != ARRAY_SIZE(error->transcoder));
   18657   1.1  riastrad 
   18658   1.1  riastrad 	if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
   18659   1.1  riastrad 		return NULL;
   18660   1.1  riastrad 
   18661   1.1  riastrad 	error = kzalloc(sizeof(*error), GFP_ATOMIC);
   18662   1.1  riastrad 	if (error == NULL)
   18663   1.1  riastrad 		return NULL;
   18664   1.1  riastrad 
   18665   1.1  riastrad 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
   18666   1.1  riastrad 		error->power_well_driver = I915_READ(HSW_PWR_WELL_CTL2);
   18667   1.1  riastrad 
   18668   1.1  riastrad 	for_each_pipe(dev_priv, i) {
   18669   1.1  riastrad 		error->pipe[i].power_domain_on =
   18670   1.1  riastrad 			__intel_display_power_is_enabled(dev_priv,
   18671   1.1  riastrad 							 POWER_DOMAIN_PIPE(i));
   18672   1.1  riastrad 		if (!error->pipe[i].power_domain_on)
   18673   1.1  riastrad 			continue;
   18674   1.1  riastrad 
   18675   1.1  riastrad 		error->cursor[i].control = I915_READ(CURCNTR(i));
   18676   1.1  riastrad 		error->cursor[i].position = I915_READ(CURPOS(i));
   18677   1.1  riastrad 		error->cursor[i].base = I915_READ(CURBASE(i));
   18678   1.1  riastrad 
   18679   1.1  riastrad 		error->plane[i].control = I915_READ(DSPCNTR(i));
   18680   1.1  riastrad 		error->plane[i].stride = I915_READ(DSPSTRIDE(i));
   18681   1.1  riastrad 		if (INTEL_GEN(dev_priv) <= 3) {
   18682   1.1  riastrad 			error->plane[i].size = I915_READ(DSPSIZE(i));
   18683   1.1  riastrad 			error->plane[i].pos = I915_READ(DSPPOS(i));
   18684   1.1  riastrad 		}
   18685   1.1  riastrad 		if (INTEL_GEN(dev_priv) <= 7 && !IS_HASWELL(dev_priv))
   18686   1.1  riastrad 			error->plane[i].addr = I915_READ(DSPADDR(i));
   18687   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 4) {
   18688   1.1  riastrad 			error->plane[i].surface = I915_READ(DSPSURF(i));
   18689   1.1  riastrad 			error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
   18690   1.1  riastrad 		}
   18691   1.1  riastrad 
   18692   1.1  riastrad 		error->pipe[i].source = I915_READ(PIPESRC(i));
   18693   1.1  riastrad 
   18694   1.1  riastrad 		if (HAS_GMCH(dev_priv))
   18695   1.1  riastrad 			error->pipe[i].stat = I915_READ(PIPESTAT(i));
   18696   1.1  riastrad 	}
   18697   1.1  riastrad 
   18698   1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
   18699   1.1  riastrad 		enum transcoder cpu_transcoder = transcoders[i];
   18700   1.1  riastrad 
   18701   1.1  riastrad 		if (!INTEL_INFO(dev_priv)->trans_offsets[cpu_transcoder])
   18702   1.1  riastrad 			continue;
   18703   1.1  riastrad 
   18704   1.1  riastrad 		error->transcoder[i].available = true;
   18705   1.1  riastrad 		error->transcoder[i].power_domain_on =
   18706   1.1  riastrad 			__intel_display_power_is_enabled(dev_priv,
   18707   1.1  riastrad 				POWER_DOMAIN_TRANSCODER(cpu_transcoder));
   18708   1.1  riastrad 		if (!error->transcoder[i].power_domain_on)
   18709   1.1  riastrad 			continue;
   18710   1.1  riastrad 
   18711   1.1  riastrad 		error->transcoder[i].cpu_transcoder = cpu_transcoder;
   18712   1.1  riastrad 
   18713   1.1  riastrad 		error->transcoder[i].conf = I915_READ(PIPECONF(cpu_transcoder));
   18714   1.1  riastrad 		error->transcoder[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
   18715   1.1  riastrad 		error->transcoder[i].hblank = I915_READ(HBLANK(cpu_transcoder));
   18716   1.1  riastrad 		error->transcoder[i].hsync = I915_READ(HSYNC(cpu_transcoder));
   18717   1.1  riastrad 		error->transcoder[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
   18718   1.1  riastrad 		error->transcoder[i].vblank = I915_READ(VBLANK(cpu_transcoder));
   18719   1.1  riastrad 		error->transcoder[i].vsync = I915_READ(VSYNC(cpu_transcoder));
   18720   1.1  riastrad 	}
   18721   1.1  riastrad 
   18722   1.1  riastrad 	return error;
   18723   1.1  riastrad }
   18724   1.1  riastrad 
   18725   1.1  riastrad #define err_printf(e, ...) i915_error_printf(e, __VA_ARGS__)
   18726   1.1  riastrad 
   18727   1.1  riastrad void
   18728   1.1  riastrad intel_display_print_error_state(struct drm_i915_error_state_buf *m,
   18729   1.1  riastrad 				struct intel_display_error_state *error)
   18730   1.1  riastrad {
   18731   1.1  riastrad 	struct drm_i915_private *dev_priv = m->i915;
   18732   1.1  riastrad 	int i;
   18733   1.1  riastrad 
   18734   1.1  riastrad 	if (!error)
   18735   1.1  riastrad 		return;
   18736   1.1  riastrad 
   18737   1.1  riastrad 	err_printf(m, "Num Pipes: %d\n", INTEL_NUM_PIPES(dev_priv));
   18738   1.1  riastrad 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
   18739   1.1  riastrad 		err_printf(m, "PWR_WELL_CTL2: %08x\n",
   18740   1.1  riastrad 			   error->power_well_driver);
   18741   1.1  riastrad 	for_each_pipe(dev_priv, i) {
   18742   1.1  riastrad 		err_printf(m, "Pipe [%d]:\n", i);
   18743   1.1  riastrad 		err_printf(m, "  Power: %s\n",
   18744   1.1  riastrad 			   onoff(error->pipe[i].power_domain_on));
   18745   1.1  riastrad 		err_printf(m, "  SRC: %08x\n", error->pipe[i].source);
   18746   1.1  riastrad 		err_printf(m, "  STAT: %08x\n", error->pipe[i].stat);
   18747   1.1  riastrad 
   18748   1.1  riastrad 		err_printf(m, "Plane [%d]:\n", i);
   18749   1.1  riastrad 		err_printf(m, "  CNTR: %08x\n", error->plane[i].control);
   18750   1.1  riastrad 		err_printf(m, "  STRIDE: %08x\n", error->plane[i].stride);
   18751   1.1  riastrad 		if (INTEL_GEN(dev_priv) <= 3) {
   18752   1.1  riastrad 			err_printf(m, "  SIZE: %08x\n", error->plane[i].size);
   18753   1.1  riastrad 			err_printf(m, "  POS: %08x\n", error->plane[i].pos);
   18754   1.1  riastrad 		}
   18755   1.1  riastrad 		if (INTEL_GEN(dev_priv) <= 7 && !IS_HASWELL(dev_priv))
   18756   1.1  riastrad 			err_printf(m, "  ADDR: %08x\n", error->plane[i].addr);
   18757   1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 4) {
   18758   1.1  riastrad 			err_printf(m, "  SURF: %08x\n", error->plane[i].surface);
   18759   1.1  riastrad 			err_printf(m, "  TILEOFF: %08x\n", error->plane[i].tile_offset);
   18760   1.1  riastrad 		}
   18761   1.1  riastrad 
   18762   1.1  riastrad 		err_printf(m, "Cursor [%d]:\n", i);
   18763   1.1  riastrad 		err_printf(m, "  CNTR: %08x\n", error->cursor[i].control);
   18764   1.1  riastrad 		err_printf(m, "  POS: %08x\n", error->cursor[i].position);
   18765   1.1  riastrad 		err_printf(m, "  BASE: %08x\n", error->cursor[i].base);
   18766   1.1  riastrad 	}
   18767   1.1  riastrad 
   18768   1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
   18769   1.1  riastrad 		if (!error->transcoder[i].available)
   18770   1.1  riastrad 			continue;
   18771   1.1  riastrad 
   18772   1.1  riastrad 		err_printf(m, "CPU transcoder: %s\n",
   18773   1.1  riastrad 			   transcoder_name(error->transcoder[i].cpu_transcoder));
   18774   1.1  riastrad 		err_printf(m, "  Power: %s\n",
   18775   1.1  riastrad 			   onoff(error->transcoder[i].power_domain_on));
   18776   1.1  riastrad 		err_printf(m, "  CONF: %08x\n", error->transcoder[i].conf);
   18777   1.1  riastrad 		err_printf(m, "  HTOTAL: %08x\n", error->transcoder[i].htotal);
   18778   1.1  riastrad 		err_printf(m, "  HBLANK: %08x\n", error->transcoder[i].hblank);
   18779   1.1  riastrad 		err_printf(m, "  HSYNC: %08x\n", error->transcoder[i].hsync);
   18780   1.1  riastrad 		err_printf(m, "  VTOTAL: %08x\n", error->transcoder[i].vtotal);
   18781   1.1  riastrad 		err_printf(m, "  VBLANK: %08x\n", error->transcoder[i].vblank);
   18782   1.1  riastrad 		err_printf(m, "  VSYNC: %08x\n", error->transcoder[i].vsync);
   18783   1.1  riastrad 	}
   18784   1.1  riastrad }
   18785   1.1  riastrad 
   18786   1.1  riastrad #endif
   18787