drm/i915: Added BXT check in HAS_CORE_RING_FREQ macro
[linux-2.6-block.git] / drivers / gpu / drm / i915 / i915_drv.h
index b96d4b1a09780585782136416aa70c2f41d7cbd7..2714228e34561c215e85cd76ce687bf745fc727c 100644 (file)
@@ -56,7 +56,7 @@
 
 #define DRIVER_NAME            "i915"
 #define DRIVER_DESC            "Intel Graphics"
-#define DRIVER_DATE            "20150619"
+#define DRIVER_DATE            "20150703"
 
 #undef WARN_ON
 /* Many gcc seem to no see through this and fall over :( */
@@ -276,6 +276,12 @@ struct i915_hotplug {
                            &dev->mode_config.plane_list,       \
                            base.head)
 
+#define for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane)     \
+       list_for_each_entry(intel_plane,                                \
+                           &(dev)->mode_config.plane_list,             \
+                           base.head)                                  \
+               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)
 
@@ -366,7 +372,8 @@ struct intel_dpll_hw_state {
        uint32_t cfgcr1, cfgcr2;
 
        /* bxt */
-       uint32_t ebb0, pll0, pll1, pll2, pll3, pll6, pll8, pll10, pcsdw12;
+       uint32_t ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10,
+                pcsdw12;
 };
 
 struct intel_shared_dpll_config {
@@ -591,9 +598,6 @@ struct intel_limit;
 struct dpll;
 
 struct drm_i915_display_funcs {
-       bool (*fbc_enabled)(struct drm_device *dev);
-       void (*enable_fbc)(struct drm_crtc *crtc);
-       void (*disable_fbc)(struct drm_device *dev);
        int (*get_display_clock_speed)(struct drm_device *dev);
        int (*get_fifo_size)(struct drm_device *dev, int plane);
        /**
@@ -640,7 +644,7 @@ struct drm_i915_display_funcs {
        int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc,
                          struct drm_framebuffer *fb,
                          struct drm_i915_gem_object *obj,
-                         struct intel_engine_cs *ring,
+                         struct drm_i915_gem_request *req,
                          uint32_t flags);
        void (*update_primary_plane)(struct drm_crtc *crtc,
                                     struct drm_framebuffer *fb,
@@ -892,6 +896,9 @@ enum fb_op_origin {
 };
 
 struct i915_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;
@@ -911,7 +918,7 @@ struct i915_fbc {
 
        struct intel_fbc_work {
                struct delayed_work work;
-               struct drm_crtc *crtc;
+               struct intel_crtc *crtc;
                struct drm_framebuffer *fb;
        } *fbc_work;
 
@@ -928,7 +935,12 @@ struct i915_fbc {
                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 */
        } 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);
 };
 
 /**
@@ -1238,6 +1250,10 @@ struct intel_l3_parity {
 struct i915_gem_mm {
        /** Memory allocator for GTT stolen memory */
        struct drm_mm stolen;
+       /** Protects the usage of the GTT stolen memory allocator. This is
+        * always the inner lock when overlapping with struct_mutex. */
+       struct mutex stolen_lock;
+
        /** List of all objects in gtt_space. Used to restore gtt
         * mappings on resume */
        struct list_head bound_list;
@@ -1498,23 +1514,27 @@ struct ilk_wm_values {
        enum intel_ddb_partitioning partitioning;
 };
 
-struct vlv_wm_values {
-       struct {
-               uint16_t primary;
-               uint16_t sprite[2];
-               uint8_t cursor;
-       } pipe[3];
+struct vlv_pipe_wm {
+       uint16_t primary;
+       uint16_t sprite[2];
+       uint8_t cursor;
+};
 
-       struct {
-               uint16_t plane;
-               uint8_t cursor;
-       } sr;
+struct vlv_sr_wm {
+       uint16_t plane;
+       uint8_t cursor;
+};
 
+struct vlv_wm_values {
+       struct vlv_pipe_wm pipe[3];
+       struct vlv_sr_wm sr;
        struct {
                uint8_t cursor;
                uint8_t sprite[2];
                uint8_t primary;
        } ddl[3];
+       uint8_t level;
+       bool cxsr;
 };
 
 struct skl_ddb_entry {
@@ -1806,9 +1826,6 @@ struct drm_i915_private {
 
        /* Reclocking support */
        bool render_reclock_avail;
-       bool lvds_downclock_avail;
-       /* indicates the reduced downclock for LVDS*/
-       int lvds_downclock;
 
        struct i915_frontbuffer_tracking fb_tracking;
 
@@ -2212,6 +2229,8 @@ int i915_gem_request_alloc(struct intel_engine_cs *ring,
                           struct drm_i915_gem_request **req_out);
 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,
+                                  struct drm_file *file);
 
 static inline uint32_t
 i915_gem_request_get_seqno(struct drm_i915_gem_request *req)
@@ -2427,6 +2446,14 @@ struct drm_i915_cmd_table {
 /* ULX machines are also considered ULT. */
 #define IS_HSW_ULX(dev)                (INTEL_DEVID(dev) == 0x0A0E || \
                                 INTEL_DEVID(dev) == 0x0A1E)
+#define IS_SKL_ULT(dev)                (INTEL_DEVID(dev) == 0x1906 || \
+                                INTEL_DEVID(dev) == 0x1913 || \
+                                INTEL_DEVID(dev) == 0x1916 || \
+                                INTEL_DEVID(dev) == 0x1921 || \
+                                INTEL_DEVID(dev) == 0x1926)
+#define IS_SKL_ULX(dev)                (INTEL_DEVID(dev) == 0x190E || \
+                                INTEL_DEVID(dev) == 0x1915 || \
+                                INTEL_DEVID(dev) == 0x191E)
 #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary)
 
 #define SKL_REVID_A0           (0x0)
@@ -2493,9 +2520,6 @@ struct drm_i915_cmd_table {
  */
 #define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \
                                                      IS_I915GM(dev)))
-#define SUPPORTS_DIGITAL_OUTPUTS(dev)  (!IS_GEN2(dev) && !IS_PINEVIEW(dev))
-#define SUPPORTS_INTEGRATED_HDMI(dev)  (IS_G4X(dev) || IS_GEN5(dev))
-#define SUPPORTS_INTEGRATED_DP(dev)    (IS_G4X(dev) || IS_GEN5(dev))
 #define SUPPORTS_TV(dev)               (INTEL_INFO(dev)->supports_tv)
 #define I915_HAS_HOTPLUG(dev)           (INTEL_INFO(dev)->has_hotplug)
 
@@ -2521,6 +2545,12 @@ struct drm_i915_cmd_table {
 
 #define HAS_CSR(dev)   (IS_SKYLAKE(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))
+
 #define INTEL_PCH_DEVICE_ID_MASK               0xff00
 #define INTEL_PCH_IBX_DEVICE_ID_TYPE           0x3b00
 #define INTEL_PCH_CPT_DEVICE_ID_TYPE           0x1c00
@@ -2560,7 +2590,6 @@ struct i915_params {
        int modeset;
        int panel_ignore_lid;
        int semaphores;
-       unsigned int lvds_downclock;
        int lvds_channel_mode;
        int panel_use_ssc;
        int vbt_sdvo_panel_type;
@@ -2805,9 +2834,10 @@ static inline void i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
 
 int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
 int i915_gem_object_sync(struct drm_i915_gem_object *obj,
-                        struct intel_engine_cs *to);
+                        struct intel_engine_cs *to,
+                        struct drm_i915_gem_request **to_req);
 void i915_vma_move_to_active(struct i915_vma *vma,
-                            struct intel_engine_cs *ring);
+                            struct drm_i915_gem_request *req);
 int i915_gem_dumb_create(struct drm_file *file_priv,
                         struct drm_device *dev,
                         struct drm_mode_create_dumb *args);
@@ -2849,7 +2879,6 @@ bool i915_gem_retire_requests(struct drm_device *dev);
 void i915_gem_retire_requests_ring(struct intel_engine_cs *ring);
 int __must_check i915_gem_check_wedge(struct i915_gpu_error *error,
                                      bool interruptible);
-int __must_check i915_gem_check_olr(struct drm_i915_gem_request *req);
 
 static inline bool i915_reset_in_progress(struct i915_gpu_error *error)
 {
@@ -2884,19 +2913,18 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj, bool force);
 int __must_check i915_gem_init(struct drm_device *dev);
 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 intel_engine_cs *ring, int slice);
+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);
 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 intel_engine_cs *ring,
-                       struct drm_file *file,
+void __i915_add_request(struct drm_i915_gem_request *req,
                        struct drm_i915_gem_object *batch_obj,
                        bool flush_caches);
-#define i915_add_request(ring) \
-       __i915_add_request(ring, NULL, NULL, true)
-#define i915_add_request_no_flush(ring) \
-       __i915_add_request(ring, NULL, NULL, false)
+#define i915_add_request(req) \
+       __i915_add_request(req, NULL, true)
+#define i915_add_request_no_flush(req) \
+       __i915_add_request(req, NULL, false)
 int __i915_wait_request(struct drm_i915_gem_request *req,
                        unsigned reset_counter,
                        bool interruptible,
@@ -2916,6 +2944,7 @@ 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);
@@ -3092,9 +3121,12 @@ static inline void i915_gem_chipset_flush(struct drm_device *dev)
 }
 
 /* i915_gem_stolen.c */
+int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv,
+                               struct drm_mm_node *node, u64 size,
+                               unsigned alignment);
+void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
+                                struct drm_mm_node *node);
 int i915_gem_init_stolen(struct drm_device *dev);
-int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, int fb_cpp);
-void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
 void i915_gem_cleanup_stolen(struct drm_device *dev);
 struct drm_i915_gem_object *
 i915_gem_object_create_stolen(struct drm_device *dev, u32 size);
@@ -3248,8 +3280,7 @@ extern void intel_modeset_gem_init(struct drm_device *dev);
 extern void intel_modeset_cleanup(struct drm_device *dev);
 extern void intel_connector_unregister(struct intel_connector *);
 extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
-extern void intel_modeset_setup_hw_state(struct drm_device *dev,
-                                        bool force_restore);
+extern void intel_display_resume(struct drm_device *dev);
 extern void i915_redisable_vga(struct drm_device *dev);
 extern void i915_redisable_vga_power_on(struct drm_device *dev);
 extern bool ironlake_set_drps(struct drm_device *dev, u8 val);