drm/i915: Update DRIVER_DATE to 20160214
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_drv.h
index f4af19a0d5696324c307617adfb0c86a3fdfed38..64cfd446453cbbf64ae15ef9e34998751e2567e7 100644 (file)
@@ -33,6 +33,8 @@
 #include <uapi/drm/i915_drm.h>
 #include <uapi/drm/drm_fourcc.h>
 
+#include <drm/drmP.h>
+#include "i915_params.h"
 #include "i915_reg.h"
 #include "intel_bios.h"
 #include "intel_ringbuffer.h"
@@ -57,7 +59,7 @@
 
 #define DRIVER_NAME            "i915"
 #define DRIVER_DESC            "Intel Graphics"
-#define DRIVER_DATE            "20151010"
+#define DRIVER_DATE            "20160214"
 
 #undef WARN_ON
 /* Many gcc seem to no see through this and fall over :( */
                BUILD_BUG_ON(__i915_warn_cond); \
        WARN(__i915_warn_cond, "WARN_ON(" #x ")"); })
 #else
-#define WARN_ON(x) WARN((x), "WARN_ON(%s)", #x )
+#define WARN_ON(x) WARN((x), "%s", "WARN_ON(" __stringify(x) ")")
 #endif
 
 #undef WARN_ON_ONCE
-#define WARN_ON_ONCE(x) WARN_ONCE((x), "WARN_ON_ONCE(%s)", #x )
+#define WARN_ON_ONCE(x) WARN_ONCE((x), "%s", "WARN_ON_ONCE(" __stringify(x) ")")
 
 #define MISSING_CASE(x) WARN(1, "Missing switch case (%lu) in %s\n", \
                             (long) (x), __func__);
  */
 #define I915_STATE_WARN(condition, format...) ({                       \
        int __ret_warn_on = !!(condition);                              \
-       if (unlikely(__ret_warn_on)) {                                  \
-               if (i915.verbose_state_checks)                          \
-                       WARN(1, format);                                \
-               else                                                    \
+       if (unlikely(__ret_warn_on))                                    \
+               if (!WARN(i915.verbose_state_checks, format))           \
                        DRM_ERROR(format);                              \
-       }                                                               \
        unlikely(__ret_warn_on);                                        \
 })
 
-#define I915_STATE_WARN_ON(condition) ({                               \
-       int __ret_warn_on = !!(condition);                              \
-       if (unlikely(__ret_warn_on)) {                                  \
-               if (i915.verbose_state_checks)                          \
-                       WARN(1, "WARN_ON(" #condition ")\n");           \
-               else                                                    \
-                       DRM_ERROR("WARN_ON(" #condition ")\n");         \
-       }                                                               \
-       unlikely(__ret_warn_on);                                        \
-})
+#define I915_STATE_WARN_ON(x)                                          \
+       I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")")
 
 static inline const char *yesno(bool v)
 {
        return v ? "yes" : "no";
 }
 
+static inline const char *onoff(bool v)
+{
+       return v ? "on" : "off";
+}
+
 enum pipe {
        INVALID_PIPE = -1,
        PIPE_A = 0,
@@ -180,15 +176,11 @@ enum intel_display_power_domain {
        POWER_DOMAIN_TRANSCODER_B,
        POWER_DOMAIN_TRANSCODER_C,
        POWER_DOMAIN_TRANSCODER_EDP,
-       POWER_DOMAIN_PORT_DDI_A_2_LANES,
-       POWER_DOMAIN_PORT_DDI_A_4_LANES,
-       POWER_DOMAIN_PORT_DDI_B_2_LANES,
-       POWER_DOMAIN_PORT_DDI_B_4_LANES,
-       POWER_DOMAIN_PORT_DDI_C_2_LANES,
-       POWER_DOMAIN_PORT_DDI_C_4_LANES,
-       POWER_DOMAIN_PORT_DDI_D_2_LANES,
-       POWER_DOMAIN_PORT_DDI_D_4_LANES,
-       POWER_DOMAIN_PORT_DDI_E_2_LANES,
+       POWER_DOMAIN_PORT_DDI_A_LANES,
+       POWER_DOMAIN_PORT_DDI_B_LANES,
+       POWER_DOMAIN_PORT_DDI_C_LANES,
+       POWER_DOMAIN_PORT_DDI_D_LANES,
+       POWER_DOMAIN_PORT_DDI_E_LANES,
        POWER_DOMAIN_PORT_DSI,
        POWER_DOMAIN_PORT_CRT,
        POWER_DOMAIN_PORT_OTHER,
@@ -200,6 +192,7 @@ enum intel_display_power_domain {
        POWER_DOMAIN_AUX_C,
        POWER_DOMAIN_AUX_D,
        POWER_DOMAIN_GMBUS,
+       POWER_DOMAIN_MODESET,
        POWER_DOMAIN_INIT,
 
        POWER_DOMAIN_NUM,
@@ -289,7 +282,7 @@ struct i915_hotplug {
        list_for_each_entry(intel_plane,                                \
                            &(dev)->mode_config.plane_list,             \
                            base.head)                                  \
-               if ((intel_plane)->pipe == (intel_crtc)->pipe)
+               for_each_if ((intel_plane)->pipe == (intel_crtc)->pipe)
 
 #define for_each_intel_crtc(dev, intel_crtc) \
        list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
@@ -306,15 +299,15 @@ struct i915_hotplug {
 
 #define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
        list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
-               if ((intel_encoder)->base.crtc == (__crtc))
+               for_each_if ((intel_encoder)->base.crtc == (__crtc))
 
 #define for_each_connector_on_encoder(dev, __encoder, intel_connector) \
        list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
-               if ((intel_connector)->base.encoder == (__encoder))
+               for_each_if ((intel_connector)->base.encoder == (__encoder))
 
 #define for_each_power_domain(domain, mask)                            \
        for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++)     \
-               if ((1 << (domain)) & (mask))
+               for_each_if ((1 << (domain)) & (mask))
 
 struct drm_i915_private;
 struct i915_mm_struct;
@@ -341,7 +334,7 @@ struct drm_i915_file_private {
                unsigned boosts;
        } rps;
 
-       struct intel_engine_cs *bsd_ring;
+       unsigned int bsd_ring;
 };
 
 enum intel_dpll_id {
@@ -460,7 +453,9 @@ struct intel_opregion {
        u32 swsci_gbda_sub_functions;
        u32 swsci_sbcb_sub_functions;
        struct opregion_asle *asle;
-       void *vbt;
+       void *rvda;
+       const void *vbt;
+       u32 vbt_size;
        u32 *lid_state;
        struct work_struct asle_work;
 };
@@ -631,11 +626,10 @@ struct drm_i915_display_funcs {
                          int target, int refclk,
                          struct dpll *match_clock,
                          struct dpll *best_clock);
+       int (*compute_pipe_wm)(struct intel_crtc *crtc,
+                              struct drm_atomic_state *state);
+       void (*program_watermarks)(struct intel_crtc_state *cstate);
        void (*update_wm)(struct drm_crtc *crtc);
-       void (*update_sprite_wm)(struct drm_plane *plane,
-                                struct drm_crtc *crtc,
-                                uint32_t sprite_width, uint32_t sprite_height,
-                                int pixel_size, bool enable, bool scaled);
        int (*modeset_calc_cdclk)(struct drm_atomic_state *state);
        void (*modeset_commit_cdclk)(struct drm_atomic_state *state);
        /* Returns the active state of the crtc, and if the crtc is active,
@@ -659,9 +653,6 @@ struct drm_i915_display_funcs {
                          struct drm_i915_gem_object *obj,
                          struct drm_i915_gem_request *req,
                          uint32_t flags);
-       void (*update_primary_plane)(struct drm_crtc *crtc,
-                                    struct drm_framebuffer *fb,
-                                    int x, int y);
        void (*hpd_irq_setup)(struct drm_device *dev);
        /* clock updates for mode set */
        /* cursor updates */
@@ -693,18 +684,18 @@ struct intel_uncore_funcs {
        void (*force_wake_put)(struct drm_i915_private *dev_priv,
                                                        enum forcewake_domains domains);
 
-       uint8_t  (*mmio_readb)(struct drm_i915_private *dev_priv, off_t offset, bool trace);
-       uint16_t (*mmio_readw)(struct drm_i915_private *dev_priv, off_t offset, bool trace);
-       uint32_t (*mmio_readl)(struct drm_i915_private *dev_priv, off_t offset, bool trace);
-       uint64_t (*mmio_readq)(struct drm_i915_private *dev_priv, off_t offset, bool trace);
+       uint8_t  (*mmio_readb)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
+       uint16_t (*mmio_readw)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
+       uint32_t (*mmio_readl)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
+       uint64_t (*mmio_readq)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
 
-       void (*mmio_writeb)(struct drm_i915_private *dev_priv, off_t offset,
+       void (*mmio_writeb)(struct drm_i915_private *dev_priv, i915_reg_t r,
                                uint8_t val, bool trace);
-       void (*mmio_writew)(struct drm_i915_private *dev_priv, off_t offset,
+       void (*mmio_writew)(struct drm_i915_private *dev_priv, i915_reg_t r,
                                uint16_t val, bool trace);
-       void (*mmio_writel)(struct drm_i915_private *dev_priv, off_t offset,
+       void (*mmio_writel)(struct drm_i915_private *dev_priv, i915_reg_t r,
                                uint32_t val, bool trace);
-       void (*mmio_writeq)(struct drm_i915_private *dev_priv, off_t offset,
+       void (*mmio_writeq)(struct drm_i915_private *dev_priv, i915_reg_t r,
                                uint64_t val, bool trace);
 };
 
@@ -721,13 +712,15 @@ struct intel_uncore {
                enum forcewake_domain_id id;
                unsigned wake_count;
                struct timer_list timer;
-               u32 reg_set;
+               i915_reg_t reg_set;
                u32 val_set;
                u32 val_clear;
-               u32 reg_ack;
-               u32 reg_post;
+               i915_reg_t reg_ack;
+               i915_reg_t reg_post;
                u32 val_reset;
        } fw_domain[FW_DOMAIN_ID_COUNT];
+
+       int unclaimed_mmio_check;
 };
 
 /* Iterate over initialised fw domains */
@@ -735,25 +728,24 @@ struct intel_uncore {
        for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
             (i__) < FW_DOMAIN_ID_COUNT; \
             (i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \
-               if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
+               for_each_if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
 
 #define for_each_fw_domain(domain__, dev_priv__, i__) \
        for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__)
 
-enum csr_state {
-       FW_UNINITIALIZED = 0,
-       FW_LOADED,
-       FW_FAILED
-};
+#define CSR_VERSION(major, minor)      ((major) << 16 | (minor))
+#define CSR_VERSION_MAJOR(version)     ((version) >> 16)
+#define CSR_VERSION_MINOR(version)     ((version) & 0xffff)
 
 struct intel_csr {
+       struct work_struct work;
        const char *fw_path;
        uint32_t *dmc_payload;
        uint32_t dmc_fw_size;
+       uint32_t version;
        uint32_t mmio_count;
-       uint32_t mmioaddr[8];
+       i915_reg_t mmioaddr[8];
        uint32_t mmiodata[8];
-       enum csr_state state;
 };
 
 #define DEV_INFO_FOR_EACH_FLAG(func, sep) \
@@ -769,8 +761,11 @@ struct intel_csr {
        func(is_crestline) sep \
        func(is_ivybridge) sep \
        func(is_valleyview) sep \
+       func(is_cherryview) sep \
        func(is_haswell) sep \
        func(is_skylake) sep \
+       func(is_broxton) sep \
+       func(is_kabylake) sep \
        func(is_preliminary) sep \
        func(has_fbc) sep \
        func(has_pipe_cxsr) sep \
@@ -889,6 +884,9 @@ struct intel_context {
                struct drm_i915_gem_object *state;
                struct intel_ringbuffer *ringbuf;
                int pin_count;
+               struct i915_vma *lrc_vma;
+               u64 lrc_desc;
+               uint32_t *lrc_reg_state;
        } engine[I915_NUM_RINGS];
 
        struct list_head link;
@@ -902,55 +900,70 @@ enum fb_op_origin {
        ORIGIN_DIRTYFB,
 };
 
-struct i915_fbc {
+struct intel_fbc {
        /* This is always the inner lock when overlapping with struct_mutex and
         * it's the outer lock when overlapping with stolen_lock. */
        struct mutex lock;
-       unsigned long uncompressed_size;
        unsigned threshold;
-       unsigned int fb_id;
        unsigned int possible_framebuffer_bits;
        unsigned int busy_bits;
+       unsigned int visible_pipes_mask;
        struct intel_crtc *crtc;
-       int y;
 
        struct drm_mm_node compressed_fb;
        struct drm_mm_node *compressed_llb;
 
        bool false_color;
 
-       /* Tracks whether the HW is actually enabled, not whether the feature is
-        * possible. */
        bool enabled;
+       bool active;
+
+       struct intel_fbc_state_cache {
+               struct {
+                       unsigned int mode_flags;
+                       uint32_t hsw_bdw_pixel_rate;
+               } crtc;
+
+               struct {
+                       unsigned int rotation;
+                       int src_w;
+                       int src_h;
+                       bool visible;
+               } plane;
+
+               struct {
+                       u64 ilk_ggtt_offset;
+                       uint32_t pixel_format;
+                       unsigned int stride;
+                       int fence_reg;
+                       unsigned int tiling_mode;
+               } fb;
+       } state_cache;
+
+       struct intel_fbc_reg_params {
+               struct {
+                       enum pipe pipe;
+                       enum plane plane;
+                       unsigned int fence_y_offset;
+               } crtc;
+
+               struct {
+                       u64 ggtt_offset;
+                       uint32_t pixel_format;
+                       unsigned int stride;
+                       int fence_reg;
+               } fb;
+
+               int cfb_size;
+       } params;
 
        struct intel_fbc_work {
-               struct delayed_work work;
-               struct intel_crtc *crtc;
-               struct drm_framebuffer *fb;
-       } *fbc_work;
-
-       enum no_fbc_reason {
-               FBC_OK, /* FBC is enabled */
-               FBC_UNSUPPORTED, /* FBC is not supported by this chipset */
-               FBC_NO_OUTPUT, /* no outputs enabled to compress */
-               FBC_STOLEN_TOO_SMALL, /* not enough space for buffers */
-               FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
-               FBC_MODE_TOO_LARGE, /* mode too large for compression */
-               FBC_BAD_PLANE, /* fbc not supported on plane */
-               FBC_NOT_TILED, /* buffer not tiled */
-               FBC_MULTIPLE_PIPES, /* more than one pipe active */
-               FBC_MODULE_PARAM,
-               FBC_CHIP_DEFAULT, /* disabled by default on this chip */
-               FBC_ROTATION, /* rotation is not supported */
-               FBC_IN_DBG_MASTER, /* kernel debugger is active */
-               FBC_BAD_STRIDE, /* stride is not supported */
-               FBC_PIXEL_RATE, /* pixel rate is too big */
-               FBC_PIXEL_FORMAT /* pixel format is invalid */
-       } no_fbc_reason;
-
-       bool (*fbc_enabled)(struct drm_i915_private *dev_priv);
-       void (*enable_fbc)(struct intel_crtc *crtc);
-       void (*disable_fbc)(struct drm_i915_private *dev_priv);
+               bool scheduled;
+               u32 scheduled_vblank;
+               struct work_struct work;
+       } work;
+
+       const char *no_fbc_reason;
 };
 
 /**
@@ -990,6 +1003,7 @@ struct i915_psr {
        unsigned busy_frontbuffer_bits;
        bool psr2_support;
        bool aux_frame_sync;
+       bool link_standby;
 };
 
 enum intel_pch {
@@ -1020,7 +1034,7 @@ struct intel_gmbus {
        struct i2c_adapter adapter;
        u32 force_bit;
        u32 reg0;
-       u32 gpio_reg;
+       i915_reg_t gpio_reg;
        struct i2c_algo_bit_data bit_algo;
        struct drm_i915_private *dev_priv;
 };
@@ -1319,7 +1333,7 @@ struct i915_gem_mm {
        bool busy;
 
        /* the indicator for dispatch video commands on two BSD rings */
-       int bsd_ring_dispatch_index;
+       unsigned int bsd_ring_dispatch_index;
 
        /** Bit 6 swizzling required for X tiling */
        uint32_t bit_6_swizzle_x;
@@ -1505,7 +1519,7 @@ struct intel_vbt_data {
                u8 seq_version;
                u32 size;
                u8 *data;
-               u8 *sequence[MIPI_SEQ_MAX];
+               const u8 *sequence[MIPI_SEQ_MAX];
        } dsi;
 
        int crt_ddc_pin;
@@ -1623,6 +1637,8 @@ struct skl_wm_level {
  * For more, read the Documentation/power/runtime_pm.txt.
  */
 struct i915_runtime_pm {
+       atomic_t wakeref_count;
+       atomic_t atomic_seq;
        bool suspended;
        bool irqs_enabled;
 };
@@ -1669,17 +1685,24 @@ struct i915_frontbuffer_tracking {
 };
 
 struct i915_wa_reg {
-       u32 addr;
+       i915_reg_t addr;
        u32 value;
        /* bitmask representing WA bits */
        u32 mask;
 };
 
-#define I915_MAX_WA_REGS 16
+/*
+ * RING_MAX_NONPRIV_SLOTS is per-engine but at this point we are only
+ * allowing it for RCS as we don't foresee any requirement of having
+ * a whitelist for other engines. When it is really required for
+ * other engines then the limit need to be increased.
+ */
+#define I915_MAX_WA_REGS (16 + RING_MAX_NONPRIV_SLOTS)
 
 struct i915_workarounds {
        struct i915_wa_reg reg[I915_MAX_WA_REGS];
        u32 count;
+       u32 hw_whitelist_count[I915_NUM_RINGS];
 };
 
 struct i915_virtual_gpu {
@@ -1698,6 +1721,13 @@ struct i915_execbuffer_params {
        struct drm_i915_gem_request     *request;
 };
 
+/* used in computing the new watermarks state */
+struct intel_wm_config {
+       unsigned int num_pipes_active;
+       bool sprites_enabled;
+       bool sprites_scaled;
+};
+
 struct drm_i915_private {
        struct drm_device *dev;
        struct kmem_cache *objects;
@@ -1718,9 +1748,6 @@ struct drm_i915_private {
 
        struct intel_csr csr;
 
-       /* Display CSR-related protection */
-       struct mutex csr_lock;
-
        struct intel_gmbus gmbus[GMBUS_NUM_PINS];
 
        /** gmbus_mutex protects against concurrent usage of the single hw gmbus
@@ -1735,6 +1762,8 @@ struct drm_i915_private {
        /* MMIO base address for MIPI regs */
        uint32_t mipi_mmio_base;
 
+       uint32_t psr_mmio_base;
+
        wait_queue_head_t gmbus_wait_queue;
 
        struct pci_dev *bridge_dev;
@@ -1770,7 +1799,7 @@ struct drm_i915_private {
        u32 pipestat_irq_mask[I915_MAX_PIPES];
 
        struct i915_hotplug hotplug;
-       struct i915_fbc fbc;
+       struct intel_fbc fbc;
        struct i915_drrs drrs;
        struct intel_opregion opregion;
        struct intel_vbt_data vbt;
@@ -1794,7 +1823,7 @@ struct drm_i915_private {
 
        unsigned int fsb_freq, mem_freq, is_ddr3;
        unsigned int skl_boot_cdclk;
-       unsigned int cdclk_freq, max_cdclk_freq;
+       unsigned int cdclk_freq, max_cdclk_freq, atomic_cdclk_freq;
        unsigned int max_dotclk_freq;
        unsigned int hpll_freq;
        unsigned int czclk_freq;
@@ -1839,8 +1868,13 @@ struct drm_i915_private {
        struct intel_pipe_crc pipe_crc[I915_MAX_PIPES];
 #endif
 
+       /* dpll and cdclk state is protected by connection_mutex */
        int num_shared_dpll;
        struct intel_shared_dpll shared_dplls[I915_NUM_PLLS];
+
+       unsigned int active_crtcs;
+       unsigned int min_pixclk[I915_MAX_PIPES];
+
        int dpio_phy_iosf_port[I915_NUM_PHYS_VLV];
 
        struct i915_workarounds workarounds;
@@ -1900,6 +1934,7 @@ struct drm_i915_private {
        u32 chv_phy_control;
 
        u32 suspend_count;
+       bool suspended_to_idle;
        struct i915_suspend_saved_registers regfile;
        struct vlv_s0ix_state vlv_s0ix_state;
 
@@ -1922,6 +1957,9 @@ struct drm_i915_private {
                 */
                uint16_t skl_latency[8];
 
+               /* Committed wm config */
+               struct intel_wm_config config;
+
                /*
                 * The skl_wm_values structure is a bit too big for stack
                 * allocation, so we keep the staging struct where we store
@@ -1951,11 +1989,15 @@ struct drm_i915_private {
                void (*stop_ring)(struct intel_engine_cs *ring);
        } gt;
 
+       struct intel_context *kernel_context;
+
        bool edp_low_vswing;
 
        /* perform PHY state sanity checks? */
        bool chv_phy_assert[2];
 
+       struct intel_encoder *dig_port_map[I915_MAX_PORTS];
+
        /*
         * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
         * will be rejected. Instead look for a better place.
@@ -1980,7 +2022,7 @@ static inline struct drm_i915_private *guc_to_i915(struct intel_guc *guc)
 /* Iterate over initialised rings */
 #define for_each_ring(ring__, dev_priv__, i__) \
        for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
-               if (((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__)))
+               for_each_if ((((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__))))
 
 enum hdmi_force_audio {
        HDMI_AUDIO_OFF_DVI = -2,        /* no aux data for HDMI-DVI converter */
@@ -1992,6 +2034,9 @@ enum hdmi_force_audio {
 #define I915_GTT_OFFSET_NONE ((u32)-1)
 
 struct drm_i915_gem_object_ops {
+       unsigned int flags;
+#define I915_GEM_OBJECT_HAS_STRUCT_PAGE 0x1
+
        /* Interface between the GEM object and its backing storage.
         * get_pages() is called once prior to the use of the associated set
         * of pages before to binding them into the GTT, and put_pages() is
@@ -2007,6 +2052,7 @@ struct drm_i915_gem_object_ops {
         */
        int (*get_pages)(struct drm_i915_gem_object *);
        void (*put_pages)(struct drm_i915_gem_object *);
+
        int (*dmabuf_export)(struct drm_i915_gem_object *);
        void (*release)(struct drm_i915_gem_object *);
 };
@@ -2269,9 +2315,9 @@ struct drm_i915_gem_request {
 
 };
 
-int i915_gem_request_alloc(struct intel_engine_cs *ring,
-                          struct intel_context *ctx,
-                          struct drm_i915_gem_request **req_out);
+struct drm_i915_gem_request * __must_check
+i915_gem_request_alloc(struct intel_engine_cs *engine,
+                      struct intel_context *ctx);
 void i915_gem_request_cancel(struct drm_i915_gem_request *req);
 void i915_gem_request_free(struct kref *req_ref);
 int i915_gem_request_add_to_client(struct drm_i915_gem_request *req,
@@ -2445,6 +2491,15 @@ struct drm_i915_cmd_table {
 #define INTEL_DEVID(p) (INTEL_INFO(p)->device_id)
 #define INTEL_REVID(p) (__I915__(p)->dev->pdev->revision)
 
+#define REVID_FOREVER          0xff
+/*
+ * Return true if revision is in range [since,until] inclusive.
+ *
+ * Use 0 for open-ended since, and REVID_FOREVER for open-ended until.
+ */
+#define IS_REVID(p, since, until) \
+       (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until))
+
 #define IS_I830(dev)           (INTEL_DEVID(dev) == 0x3577)
 #define IS_845G(dev)           (INTEL_DEVID(dev) == 0x2562)
 #define IS_I85X(dev)           (INTEL_INFO(dev)->is_i85x)
@@ -2467,11 +2522,12 @@ struct drm_i915_cmd_table {
                                 INTEL_DEVID(dev) == 0x0152 || \
                                 INTEL_DEVID(dev) == 0x015a)
 #define IS_VALLEYVIEW(dev)     (INTEL_INFO(dev)->is_valleyview)
-#define IS_CHERRYVIEW(dev)     (INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev))
+#define IS_CHERRYVIEW(dev)     (INTEL_INFO(dev)->is_cherryview)
 #define IS_HASWELL(dev)        (INTEL_INFO(dev)->is_haswell)
-#define IS_BROADWELL(dev)      (!INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev))
+#define IS_BROADWELL(dev)      (!INTEL_INFO(dev)->is_cherryview && IS_GEN8(dev))
 #define IS_SKYLAKE(dev)        (INTEL_INFO(dev)->is_skylake)
-#define IS_BROXTON(dev)        (!INTEL_INFO(dev)->is_skylake && IS_GEN9(dev))
+#define IS_BROXTON(dev)                (INTEL_INFO(dev)->is_broxton)
+#define IS_KABYLAKE(dev)       (INTEL_INFO(dev)->is_kabylake)
 #define IS_MOBILE(dev)         (INTEL_INFO(dev)->is_mobile)
 #define IS_HSW_EARLY_SDV(dev)  (IS_HASWELL(dev) && \
                                 (INTEL_DEVID(dev) & 0xFF00) == 0x0C00)
@@ -2499,6 +2555,14 @@ struct drm_i915_cmd_table {
 #define IS_SKL_ULX(dev)                (INTEL_DEVID(dev) == 0x190E || \
                                 INTEL_DEVID(dev) == 0x1915 || \
                                 INTEL_DEVID(dev) == 0x191E)
+#define IS_KBL_ULT(dev)                (INTEL_DEVID(dev) == 0x5906 || \
+                                INTEL_DEVID(dev) == 0x5913 || \
+                                INTEL_DEVID(dev) == 0x5916 || \
+                                INTEL_DEVID(dev) == 0x5921 || \
+                                INTEL_DEVID(dev) == 0x5926)
+#define IS_KBL_ULX(dev)                (INTEL_DEVID(dev) == 0x590E || \
+                                INTEL_DEVID(dev) == 0x5915 || \
+                                INTEL_DEVID(dev) == 0x591E)
 #define IS_SKL_GT3(dev)                (IS_SKYLAKE(dev) && \
                                 (INTEL_DEVID(dev) & 0x00F0) == 0x0020)
 #define IS_SKL_GT4(dev)                (IS_SKYLAKE(dev) && \
@@ -2506,16 +2570,21 @@ struct drm_i915_cmd_table {
 
 #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary)
 
-#define SKL_REVID_A0           (0x0)
-#define SKL_REVID_B0           (0x1)
-#define SKL_REVID_C0           (0x2)
-#define SKL_REVID_D0           (0x3)
-#define SKL_REVID_E0           (0x4)
-#define SKL_REVID_F0           (0x5)
+#define SKL_REVID_A0           0x0
+#define SKL_REVID_B0           0x1
+#define SKL_REVID_C0           0x2
+#define SKL_REVID_D0           0x3
+#define SKL_REVID_E0           0x4
+#define SKL_REVID_F0           0x5
+
+#define IS_SKL_REVID(p, since, until) (IS_SKYLAKE(p) && IS_REVID(p, since, until))
 
-#define BXT_REVID_A0           (0x0)
-#define BXT_REVID_B0           (0x3)
-#define BXT_REVID_C0           (0x9)
+#define BXT_REVID_A0           0x0
+#define BXT_REVID_A1           0x1
+#define BXT_REVID_B0           0x3
+#define BXT_REVID_C0           0x9
+
+#define IS_BXT_REVID(p, since, until) (IS_BROXTON(p) && IS_REVID(p, since, until))
 
 /*
  * The genX designation typically refers to the render engine, so render
@@ -2557,6 +2626,11 @@ struct drm_i915_cmd_table {
 
 /* Early gen2 have a totally busted CS tlb and require pinned batches. */
 #define HAS_BROKEN_CS_TLB(dev)         (IS_I830(dev) || IS_845G(dev))
+
+/* WaRsDisableCoarsePowerGating:skl,bxt */
+#define NEEDS_WaRsDisableCoarsePowerGating(dev) (IS_BXT_REVID(dev, 0, BXT_REVID_A1) || \
+                                                ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && \
+                                                 IS_SKL_REVID(dev, 0, SKL_REVID_F0)))
 /*
  * dp aux and gmbus irq on gen4 seems to be able to generate legacy interrupts
  * even when in MSI mode. This results in spurious interrupt warnings if the
@@ -2587,23 +2661,25 @@ struct drm_i915_cmd_table {
 #define HAS_FPGA_DBG_UNCLAIMED(dev)    (INTEL_INFO(dev)->has_fpga_dbg)
 #define HAS_PSR(dev)           (IS_HASWELL(dev) || IS_BROADWELL(dev) || \
                                 IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev) || \
-                                IS_SKYLAKE(dev))
+                                IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
 #define HAS_RUNTIME_PM(dev)    (IS_GEN6(dev) || IS_HASWELL(dev) || \
                                 IS_BROADWELL(dev) || IS_VALLEYVIEW(dev) || \
-                                IS_SKYLAKE(dev))
+                                IS_CHERRYVIEW(dev) || IS_SKYLAKE(dev) || \
+                                IS_KABYLAKE(dev))
 #define HAS_RC6(dev)           (INTEL_INFO(dev)->gen >= 6)
 #define HAS_RC6p(dev)          (INTEL_INFO(dev)->gen == 6 || IS_IVYBRIDGE(dev))
 
 #define HAS_CSR(dev)   (IS_GEN9(dev))
 
-#define HAS_GUC_UCODE(dev)     (IS_GEN9(dev))
-#define HAS_GUC_SCHED(dev)     (IS_GEN9(dev))
+#define HAS_GUC_UCODE(dev)     (IS_GEN9(dev) && !IS_KABYLAKE(dev))
+#define HAS_GUC_SCHED(dev)     (IS_GEN9(dev) && !IS_KABYLAKE(dev))
 
 #define HAS_RESOURCE_STREAMER(dev) (IS_HASWELL(dev) || \
                                    INTEL_INFO(dev)->gen >= 8)
 
 #define HAS_CORE_RING_FREQ(dev)        (INTEL_INFO(dev)->gen >= 6 && \
-                                !IS_VALLEYVIEW(dev) && !IS_BROXTON(dev))
+                                !IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev) && \
+                                !IS_BROXTON(dev))
 
 #define INTEL_PCH_DEVICE_ID_MASK               0xff00
 #define INTEL_PCH_IBX_DEVICE_ID_TYPE           0x3b00
@@ -2614,17 +2690,20 @@ struct drm_i915_cmd_table {
 #define INTEL_PCH_SPT_DEVICE_ID_TYPE           0xA100
 #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE                0x9D00
 #define INTEL_PCH_P2X_DEVICE_ID_TYPE           0x7100
+#define INTEL_PCH_QEMU_DEVICE_ID_TYPE          0x2900 /* qemu q35 has 2918 */
 
 #define INTEL_PCH_TYPE(dev) (__I915__(dev)->pch_type)
 #define HAS_PCH_SPT(dev) (INTEL_PCH_TYPE(dev) == PCH_SPT)
 #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT)
 #define HAS_PCH_LPT_LP(dev) (__I915__(dev)->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE)
+#define HAS_PCH_LPT_H(dev) (__I915__(dev)->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE)
 #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
 #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX)
 #define HAS_PCH_NOP(dev) (INTEL_PCH_TYPE(dev) == PCH_NOP)
 #define HAS_PCH_SPLIT(dev) (INTEL_PCH_TYPE(dev) != PCH_NONE)
 
-#define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->gen < 5 || IS_VALLEYVIEW(dev))
+#define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->gen < 5 || \
+                              IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
 
 /* DPF == dynamic parity feature */
 #define HAS_L3_DPF(dev) (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
@@ -2641,43 +2720,7 @@ extern int i915_max_ioctl;
 extern int i915_suspend_switcheroo(struct drm_device *dev, pm_message_t state);
 extern int i915_resume_switcheroo(struct drm_device *dev);
 
-/* i915_params.c */
-struct i915_params {
-       int modeset;
-       int panel_ignore_lid;
-       int semaphores;
-       int lvds_channel_mode;
-       int panel_use_ssc;
-       int vbt_sdvo_panel_type;
-       int enable_rc6;
-       int enable_fbc;
-       int enable_ppgtt;
-       int enable_execlists;
-       int enable_psr;
-       unsigned int preliminary_hw_support;
-       int disable_power_well;
-       int enable_ips;
-       int invert_brightness;
-       int enable_cmd_parser;
-       /* leave bools at the end to not create holes */
-       bool enable_hangcheck;
-       bool fastboot;
-       bool prefault_disable;
-       bool load_detect_test;
-       bool reset;
-       bool disable_display;
-       bool disable_vtd_wa;
-       bool enable_guc_submission;
-       int guc_log_level;
-       int use_mmio_flip;
-       int mmio_debug;
-       bool verbose_state_checks;
-       bool nuclear_pageflip;
-       int edp_vswing;
-};
-extern struct i915_params i915 __read_mostly;
-
-                               /* i915_dma.c */
+/* i915_dma.c */
 extern int i915_driver_load(struct drm_device *, unsigned long flags);
 extern int i915_driver_unload(struct drm_device *);
 extern int i915_driver_open(struct drm_device *dev, struct drm_file *file);
@@ -2698,7 +2741,6 @@ extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
 extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
 extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
 int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on);
-void i915_firmware_load_error_print(const char *fw_path, int err);
 
 /* intel_hotplug.c */
 void intel_hpd_irq_handler(struct drm_device *dev, u32 pin_mask, u32 long_mask);
@@ -2721,7 +2763,8 @@ extern void intel_uncore_sanitize(struct drm_device *dev);
 extern void intel_uncore_early_sanitize(struct drm_device *dev,
                                        bool restore_forcewake);
 extern void intel_uncore_init(struct drm_device *dev);
-extern void intel_uncore_check_errors(struct drm_device *dev);
+extern bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
+extern bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
 extern void intel_uncore_fini(struct drm_device *dev);
 extern void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore);
 const char *intel_uncore_forcewake_domain_to_str(const enum forcewake_domain_id id);
@@ -2755,17 +2798,47 @@ void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv);
 void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv,
                                   uint32_t mask,
                                   uint32_t bits);
-void
-ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask);
-void
-ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask);
+void ilk_update_display_irq(struct drm_i915_private *dev_priv,
+                           uint32_t interrupt_mask,
+                           uint32_t enabled_irq_mask);
+static inline void
+ilk_enable_display_irq(struct drm_i915_private *dev_priv, uint32_t bits)
+{
+       ilk_update_display_irq(dev_priv, bits, bits);
+}
+static inline void
+ilk_disable_display_irq(struct drm_i915_private *dev_priv, uint32_t bits)
+{
+       ilk_update_display_irq(dev_priv, bits, 0);
+}
+void bdw_update_pipe_irq(struct drm_i915_private *dev_priv,
+                        enum pipe pipe,
+                        uint32_t interrupt_mask,
+                        uint32_t enabled_irq_mask);
+static inline void bdw_enable_pipe_irq(struct drm_i915_private *dev_priv,
+                                      enum pipe pipe, uint32_t bits)
+{
+       bdw_update_pipe_irq(dev_priv, pipe, bits, bits);
+}
+static inline void bdw_disable_pipe_irq(struct drm_i915_private *dev_priv,
+                                       enum pipe pipe, uint32_t bits)
+{
+       bdw_update_pipe_irq(dev_priv, pipe, bits, 0);
+}
 void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
                                  uint32_t interrupt_mask,
                                  uint32_t enabled_irq_mask);
-#define ibx_enable_display_interrupt(dev_priv, bits) \
-       ibx_display_interrupt_update((dev_priv), (bits), (bits))
-#define ibx_disable_display_interrupt(dev_priv, bits) \
-       ibx_display_interrupt_update((dev_priv), (bits), 0)
+static inline void
+ibx_enable_display_interrupt(struct drm_i915_private *dev_priv, uint32_t bits)
+{
+       ibx_display_interrupt_update(dev_priv, bits, bits);
+}
+static inline void
+ibx_disable_display_interrupt(struct drm_i915_private *dev_priv, uint32_t bits)
+{
+       ibx_display_interrupt_update(dev_priv, bits, 0);
+}
+
 
 /* i915_gem.c */
 int i915_gem_create_ioctl(struct drm_device *dev, void *data,
@@ -2813,7 +2886,8 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv);
 int i915_gem_wait_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
-void i915_gem_load(struct drm_device *dev);
+void i915_gem_load_init(struct drm_device *dev);
+void i915_gem_load_cleanup(struct drm_device *dev);
 void *i915_gem_object_alloc(struct drm_device *dev);
 void i915_gem_object_free(struct drm_i915_gem_object *obj);
 void i915_gem_object_init(struct drm_i915_gem_object *obj,
@@ -2834,6 +2908,7 @@ void i915_gem_vma_destroy(struct i915_vma *vma);
 #define PIN_UPDATE     (1<<5)
 #define PIN_ZONE_4G    (1<<6)
 #define PIN_HIGH       (1<<7)
+#define PIN_OFFSET_FIXED       (1<<8)
 #define PIN_OFFSET_MASK (~4095)
 int __must_check
 i915_gem_object_pin(struct drm_i915_gem_object *obj,
@@ -2869,6 +2944,9 @@ static inline int __sg_page_count(struct scatterlist *sg)
        return sg->length >> PAGE_SHIFT;
 }
 
+struct page *
+i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, int n);
+
 static inline struct page *
 i915_gem_object_get_page(struct drm_i915_gem_object *obj, int n)
 {
@@ -2980,7 +3058,7 @@ int i915_gem_init_rings(struct drm_device *dev);
 int __must_check i915_gem_init_hw(struct drm_device *dev);
 int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice);
 void i915_gem_init_swizzling(struct drm_device *dev);
-void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
+void i915_gem_cleanup_engines(struct drm_device *dev);
 int __must_check i915_gpu_idle(struct drm_device *dev);
 int __must_check i915_gem_suspend(struct drm_device *dev);
 void __i915_add_request(struct drm_i915_gem_request *req,
@@ -3008,8 +3086,6 @@ i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write);
 int __must_check
 i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
                                     u32 alignment,
-                                    struct intel_engine_cs *pipelined,
-                                    struct drm_i915_gem_request **pipelined_request,
                                     const struct i915_ggtt_view *view);
 void i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj,
                                              const struct i915_ggtt_view *view);
@@ -3184,6 +3260,7 @@ int __must_check i915_gem_evict_something(struct drm_device *dev,
                                          unsigned long start,
                                          unsigned long end,
                                          unsigned flags);
+int __must_check i915_gem_evict_for_vma(struct i915_vma *target);
 int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle);
 
 /* belongs in i915_gem_gtt.h */
@@ -3223,6 +3300,7 @@ unsigned long i915_gem_shrink(struct drm_i915_private *dev_priv,
 #define I915_SHRINK_ACTIVE 0x8
 unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv);
 void i915_gem_shrinker_init(struct drm_i915_private *dev_priv);
+void i915_gem_shrinker_cleanup(struct drm_i915_private *dev_priv);
 
 
 /* i915_gem_tiling.c */
@@ -3312,6 +3390,10 @@ static inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
 }
 extern void intel_i2c_reset(struct drm_device *dev);
 
+/* intel_bios.c */
+int intel_bios_init(struct drm_i915_private *dev_priv);
+bool intel_bios_is_valid_vbt(const void *buf, size_t size);
+
 /* intel_opregion.c */
 #ifdef CONFIG_ACPI
 extern int intel_opregion_setup(struct drm_device *dev);
@@ -3364,7 +3446,6 @@ extern void intel_set_rps(struct drm_device *dev, u8 val);
 extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
                                  bool enable);
 extern void intel_detect_pch(struct drm_device *dev);
-extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);
 extern int intel_enable_rc6(const struct drm_device *dev);
 
 extern bool i915_semaphore_is_enabled(struct drm_device *dev);
@@ -3390,16 +3471,14 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val
 u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr);
 void vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val);
 u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
-u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
-void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
+u32 vlv_iosf_sb_read(struct drm_i915_private *dev_priv, u8 port, u32 reg);
+void vlv_iosf_sb_write(struct drm_i915_private *dev_priv, u8 port, u32 reg, u32 val);
 u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
 void vlv_cck_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
 u32 vlv_ccu_read(struct drm_i915_private *dev_priv, u32 reg);
 void vlv_ccu_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
 u32 vlv_bunit_read(struct drm_i915_private *dev_priv, u32 reg);
 void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
-u32 vlv_gps_core_read(struct drm_i915_private *dev_priv, u32 reg);
-void vlv_gps_core_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
 u32 vlv_dpio_read(struct drm_i915_private *dev_priv, enum pipe pipe, int reg);
 void vlv_dpio_write(struct drm_i915_private *dev_priv, enum pipe pipe, int reg, u32 val);
 u32 intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg,
@@ -3447,6 +3526,32 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
 #define POSTING_READ(reg)      (void)I915_READ_NOTRACE(reg)
 #define POSTING_READ16(reg)    (void)I915_READ16_NOTRACE(reg)
 
+#define __raw_read(x, s) \
+static inline uint##x##_t __raw_i915_read##x(struct drm_i915_private *dev_priv, \
+                                            i915_reg_t reg) \
+{ \
+       return read##s(dev_priv->regs + i915_mmio_reg_offset(reg)); \
+}
+
+#define __raw_write(x, s) \
+static inline void __raw_i915_write##x(struct drm_i915_private *dev_priv, \
+                                      i915_reg_t reg, uint##x##_t val) \
+{ \
+       write##s(val, dev_priv->regs + i915_mmio_reg_offset(reg)); \
+}
+__raw_read(8, b)
+__raw_read(16, w)
+__raw_read(32, l)
+__raw_read(64, q)
+
+__raw_write(8, b)
+__raw_write(16, w)
+__raw_write(32, l)
+__raw_write(64, q)
+
+#undef __raw_read
+#undef __raw_write
+
 /* These are untraced mmio-accessors that are only valid to be used inside
  * criticial sections inside IRQ handlers where forcewake is explicitly
  * controlled.
@@ -3454,8 +3559,8 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
  * Note: Should only be used between intel_uncore_forcewake_irqlock() and
  * intel_uncore_forcewake_irqunlock().
  */
-#define I915_READ_FW(reg__) readl(dev_priv->regs + (reg__))
-#define I915_WRITE_FW(reg__, val__) writel(val__, dev_priv->regs + (reg__))
+#define I915_READ_FW(reg__) __raw_i915_read32(dev_priv, (reg__))
+#define I915_WRITE_FW(reg__, val__) __raw_i915_write32(dev_priv, (reg__), (val__))
 #define POSTING_READ_FW(reg__) (void)I915_READ_FW(reg__)
 
 /* "Broadcast RGB" property */
@@ -3463,9 +3568,9 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
 #define INTEL_BROADCAST_RGB_FULL 1
 #define INTEL_BROADCAST_RGB_LIMITED 2
 
-static inline uint32_t i915_vgacntrl_reg(struct drm_device *dev)
+static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
 {
-       if (IS_VALLEYVIEW(dev))
+       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
                return VLV_VGACNTRL;
        else if (INTEL_INFO(dev)->gen >= 5)
                return CPU_VGACNTRL;
This page took 0.054963 seconds and 5 git commands to generate.