drm/i915: add intel_display_power_enabled
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / i915 / i915_drv.h
index 1246a31c02438a72b120d2fb9a6d3658e1b15844..c81100c54e247a8bc3d824f473e123cd582962a0 100644 (file)
@@ -76,6 +76,8 @@ enum plane {
 };
 #define plane_name(p) ((p) + 'A')
 
+#define sprite_name(p, s) ((p) * dev_priv->num_plane + (s) + 'A')
+
 enum port {
        PORT_A = 0,
        PORT_B,
@@ -86,6 +88,37 @@ enum port {
 };
 #define port_name(p) ((p) + 'A')
 
+enum intel_display_power_domain {
+       POWER_DOMAIN_PIPE_A,
+       POWER_DOMAIN_PIPE_B,
+       POWER_DOMAIN_PIPE_C,
+       POWER_DOMAIN_PIPE_A_PANEL_FITTER,
+       POWER_DOMAIN_PIPE_B_PANEL_FITTER,
+       POWER_DOMAIN_PIPE_C_PANEL_FITTER,
+       POWER_DOMAIN_TRANSCODER_A,
+       POWER_DOMAIN_TRANSCODER_B,
+       POWER_DOMAIN_TRANSCODER_C,
+       POWER_DOMAIN_TRANSCODER_EDP = POWER_DOMAIN_TRANSCODER_A + 0xF,
+};
+
+#define POWER_DOMAIN_PIPE(pipe) ((pipe) + POWER_DOMAIN_PIPE_A)
+#define POWER_DOMAIN_PIPE_PANEL_FITTER(pipe) \
+               ((pipe) + POWER_DOMAIN_PIPE_A_PANEL_FITTER)
+#define POWER_DOMAIN_TRANSCODER(tran) ((tran) + POWER_DOMAIN_TRANSCODER_A)
+
+enum hpd_pin {
+       HPD_NONE = 0,
+       HPD_PORT_A = HPD_NONE, /* PORT_A is internal */
+       HPD_TV = HPD_NONE,     /* TV is known to be unreliable */
+       HPD_CRT,
+       HPD_SDVO_B,
+       HPD_SDVO_C,
+       HPD_PORT_B,
+       HPD_PORT_C,
+       HPD_PORT_D,
+       HPD_NUM_PINS
+};
+
 #define I915_GEM_GPU_DOMAINS \
        (I915_GEM_DOMAIN_RENDER | \
         I915_GEM_DOMAIN_SAMPLER | \
@@ -93,7 +126,7 @@ enum port {
         I915_GEM_DOMAIN_INSTRUCTION | \
         I915_GEM_DOMAIN_VERTEX)
 
-#define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++)
+#define for_each_pipe(p) for ((p) = 0; (p) < INTEL_INFO(dev)->num_pipes; (p)++)
 
 #define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
        list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
@@ -182,9 +215,9 @@ struct drm_i915_master_private {
        struct _drm_i915_sarea *sarea_priv;
 };
 #define I915_FENCE_REG_NONE -1
-#define I915_MAX_NUM_FENCES 16
-/* 16 fences + sign bit for FENCE_REG_NONE */
-#define I915_MAX_NUM_FENCE_BITS 5
+#define I915_MAX_NUM_FENCES 32
+/* 32 fences + sign bit for FENCE_REG_NONE */
+#define I915_MAX_NUM_FENCE_BITS 6
 
 struct drm_i915_fence_reg {
        struct list_head lru_list;
@@ -271,6 +304,9 @@ struct drm_i915_error_state {
        struct intel_display_error_state *display;
 };
 
+struct intel_crtc_config;
+struct intel_crtc;
+
 struct drm_i915_display_funcs {
        bool (*fbc_enabled)(struct drm_device *dev);
        void (*enable_fbc)(struct drm_crtc *crtc, unsigned long interval);
@@ -283,9 +319,11 @@ struct drm_i915_display_funcs {
        void (*update_linetime_wm)(struct drm_device *dev, int pipe,
                                 struct drm_display_mode *mode);
        void (*modeset_global_resources)(struct drm_device *dev);
+       /* Returns the active state of the crtc, and if the crtc is active,
+        * fills out the pipe-config with the hw state. */
+       bool (*get_pipe_config)(struct intel_crtc *,
+                               struct intel_crtc_config *);
        int (*crtc_mode_set)(struct drm_crtc *crtc,
-                            struct drm_display_mode *mode,
-                            struct drm_display_mode *adjusted_mode,
                             int x, int y,
                             struct drm_framebuffer *old_fb);
        void (*crtc_enable)(struct drm_crtc *crtc);
@@ -313,67 +351,55 @@ struct drm_i915_gt_funcs {
        void (*force_wake_put)(struct drm_i915_private *dev_priv);
 };
 
-#define DEV_INFO_FLAGS \
-       DEV_INFO_FLAG(is_mobile) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_i85x) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_i915g) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_i945gm) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_g33) DEV_INFO_SEP \
-       DEV_INFO_FLAG(need_gfx_hws) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_g4x) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_pineview) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_broadwater) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_crestline) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_ivybridge) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_valleyview) DEV_INFO_SEP \
-       DEV_INFO_FLAG(is_haswell) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_force_wake) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_fbc) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_pipe_cxsr) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_hotplug) DEV_INFO_SEP \
-       DEV_INFO_FLAG(cursor_needs_physical) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_overlay) DEV_INFO_SEP \
-       DEV_INFO_FLAG(overlay_needs_physical) DEV_INFO_SEP \
-       DEV_INFO_FLAG(supports_tv) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_bsd_ring) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_blt_ring) DEV_INFO_SEP \
-       DEV_INFO_FLAG(has_llc)
+#define DEV_INFO_FOR_EACH_FLAG(func, sep) \
+       func(is_mobile) sep \
+       func(is_i85x) sep \
+       func(is_i915g) sep \
+       func(is_i945gm) sep \
+       func(is_g33) sep \
+       func(need_gfx_hws) sep \
+       func(is_g4x) sep \
+       func(is_pineview) sep \
+       func(is_broadwater) sep \
+       func(is_crestline) sep \
+       func(is_ivybridge) sep \
+       func(is_valleyview) sep \
+       func(is_haswell) sep \
+       func(has_force_wake) sep \
+       func(has_fbc) sep \
+       func(has_pipe_cxsr) sep \
+       func(has_hotplug) sep \
+       func(cursor_needs_physical) sep \
+       func(has_overlay) sep \
+       func(overlay_needs_physical) sep \
+       func(supports_tv) sep \
+       func(has_bsd_ring) sep \
+       func(has_blt_ring) sep \
+       func(has_llc) sep \
+       func(has_ddi) sep \
+       func(has_fpga_dbg)
+
+#define DEFINE_FLAG(name) u8 name:1
+#define SEP_SEMICOLON ;
 
 struct intel_device_info {
        u32 display_mmio_offset;
+       u8 num_pipes:3;
        u8 gen;
-       u8 is_mobile:1;
-       u8 is_i85x:1;
-       u8 is_i915g:1;
-       u8 is_i945gm:1;
-       u8 is_g33:1;
-       u8 need_gfx_hws:1;
-       u8 is_g4x:1;
-       u8 is_pineview:1;
-       u8 is_broadwater:1;
-       u8 is_crestline:1;
-       u8 is_ivybridge:1;
-       u8 is_valleyview:1;
-       u8 has_force_wake:1;
-       u8 is_haswell:1;
-       u8 has_fbc:1;
-       u8 has_pipe_cxsr:1;
-       u8 has_hotplug:1;
-       u8 cursor_needs_physical:1;
-       u8 has_overlay:1;
-       u8 overlay_needs_physical:1;
-       u8 supports_tv:1;
-       u8 has_bsd_ring:1;
-       u8 has_blt_ring:1;
-       u8 has_llc:1;
+       DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG, SEP_SEMICOLON);
 };
 
+#undef DEFINE_FLAG
+#undef SEP_SEMICOLON
+
 enum i915_cache_level {
        I915_CACHE_NONE = 0,
        I915_CACHE_LLC,
        I915_CACHE_LLC_MLC, /* gen6+, in docs at least! */
 };
 
+typedef uint32_t gen6_gtt_pte_t;
+
 /* The Graphics Translation Table is the way in which GEN hardware translates a
  * Graphics Virtual Address into a Physical Address. In addition to the normal
  * collateral associated with any va->pa translations GEN hardware also has a
@@ -409,6 +435,9 @@ struct i915_gtt {
                                   struct sg_table *st,
                                   unsigned int pg_start,
                                   enum i915_cache_level cache_level);
+       gen6_gtt_pte_t (*pte_encode)(struct drm_device *dev,
+                                    dma_addr_t addr,
+                                    enum i915_cache_level level);
 };
 #define gtt_total_entries(gtt) ((gtt).total >> PAGE_SHIFT)
 
@@ -430,6 +459,10 @@ struct i915_hw_ppgtt {
                               struct sg_table *st,
                               unsigned int pg_start,
                               enum i915_cache_level cache_level);
+       gen6_gtt_pte_t (*pte_encode)(struct drm_device *dev,
+                                    dma_addr_t addr,
+                                    enum i915_cache_level level);
+       int (*enable)(struct drm_device *dev);
        void (*cleanup)(struct i915_hw_ppgtt *ppgtt);
 };
 
@@ -437,6 +470,7 @@ struct i915_hw_ppgtt {
 /* This must match up with the value previously used for execbuf2.rsvd1. */
 #define DEFAULT_CONTEXT_ID 0
 struct i915_hw_context {
+       struct kref ref;
        int id;
        bool is_initialized;
        struct drm_i915_file_private *file_priv;
@@ -460,6 +494,7 @@ enum intel_pch {
        PCH_IBX,        /* Ibexpeak PCH */
        PCH_CPT,        /* Cougarpoint PCH */
        PCH_LPT,        /* Lynxpoint PCH */
+       PCH_NOP,
 };
 
 enum intel_sbi_destination {
@@ -637,6 +672,7 @@ struct i915_suspend_saved_registers {
 
 struct intel_gen6_power_mgmt {
        struct work_struct work;
+       struct delayed_work vlv_work;
        u32 pm_iir;
        /* lock - irqsave spinlock that protectects the work_struct and
         * pm_iir. */
@@ -647,6 +683,8 @@ struct intel_gen6_power_mgmt {
        u8 cur_delay;
        u8 min_delay;
        u8 max_delay;
+       u8 rpe_delay;
+       u8 hw_max;
 
        struct delayed_work delayed_resume_work;
 
@@ -908,12 +946,22 @@ typedef struct drm_i915_private {
        u32 irq_mask;
        u32 gt_irq_mask;
 
-       u32 hotplug_supported_mask;
        struct work_struct hotplug_work;
        bool enable_hotplug_processing;
+       struct {
+               unsigned long hpd_last_jiffies;
+               int hpd_cnt;
+               enum {
+                       HPD_ENABLED = 0,
+                       HPD_DISABLED = 1,
+                       HPD_MARK_DISABLED = 2
+               } hpd_mark;
+       } hpd_stats[HPD_NUM_PINS];
+       u32 hpd_event_bits;
+       struct timer_list hotplug_reenable_timer;
 
-       int num_pipe;
        int num_pch_pll;
+       int num_plane;
 
        unsigned long cfb_size;
        unsigned int cfb_fb;
@@ -927,9 +975,15 @@ typedef struct drm_i915_private {
        struct intel_overlay *overlay;
        unsigned int sprite_scaling_enabled;
 
+       /* backlight */
+       struct {
+               int level;
+               bool enabled;
+               spinlock_t lock; /* bl registers and the above bl fields */
+               struct backlight_device *device;
+       } backlight;
+
        /* LVDS info */
-       int backlight_level;  /* restore backlight to this value */
-       bool backlight_enabled;
        struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */
        struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */
 
@@ -940,6 +994,7 @@ typedef struct drm_i915_private {
        unsigned int int_crt_support:1;
        unsigned int lvds_use_ssc:1;
        unsigned int display_clock_mode:1;
+       unsigned int fdi_rx_polarity_inverted:1;
        int lvds_ssc_freq;
        unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */
        struct {
@@ -983,10 +1038,6 @@ typedef struct drm_i915_private {
        /* Kernel Modesetting */
 
        struct sdvo_device_mapping sdvo_mappings[2];
-       /* indicate whether the LVDS_BORDER should be enabled or not */
-       unsigned int lvds_border_bits;
-       /* Panel fitter placement and size for Ironlake+ */
-       u32 pch_pf_pos, pch_pf_size;
 
        struct drm_crtc *plane_to_crtc_mapping[3];
        struct drm_crtc *pipe_to_crtc_mapping[3];
@@ -1031,8 +1082,6 @@ typedef struct drm_i915_private {
         */
        struct work_struct console_resume_work;
 
-       struct backlight_device *backlight;
-
        struct drm_property *broadcast_rgb_property;
        struct drm_property *force_audio_property;
 
@@ -1239,6 +1288,9 @@ struct drm_i915_gem_request {
        /** Postion in the ringbuffer of the end of the request */
        u32 tail;
 
+       /** Context related to this request */
+       struct i915_hw_context *ctx;
+
        /** Time at which this request was emitted, in jiffies. */
        unsigned long emitted_jiffies;
 
@@ -1338,8 +1390,9 @@ struct drm_i915_file_private {
 
 #define HAS_PIPE_CONTROL(dev) (INTEL_INFO(dev)->gen >= 5)
 
-#define HAS_DDI(dev)           (IS_HASWELL(dev))
+#define HAS_DDI(dev)           (INTEL_INFO(dev)->has_ddi)
 #define HAS_POWER_WELL(dev)    (IS_HASWELL(dev))
+#define HAS_FPGA_DBG_UNCLAIMED(dev)    (INTEL_INFO(dev)->has_fpga_dbg)
 
 #define INTEL_PCH_DEVICE_ID_MASK               0xff00
 #define INTEL_PCH_IBX_DEVICE_ID_TYPE           0x3b00
@@ -1352,6 +1405,7 @@ struct drm_i915_file_private {
 #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT)
 #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_FORCE_WAKE(dev) (INTEL_INFO(dev)->has_force_wake)
@@ -1398,6 +1452,7 @@ extern int i915_enable_fbc __read_mostly;
 extern bool i915_enable_hangcheck __read_mostly;
 extern int i915_enable_ppgtt __read_mostly;
 extern unsigned int i915_preliminary_hw_support __read_mostly;
+extern int i915_disable_power_well __read_mostly;
 
 extern int i915_suspend(struct drm_device *dev, pm_message_t state);
 extern int i915_resume(struct drm_device *dev);
@@ -1449,8 +1504,6 @@ i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask);
 void
 i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask);
 
-void intel_enable_asle(struct drm_device *dev);
-
 #ifdef CONFIG_DEBUG_FS
 extern void i915_destroy_error_state(struct drm_device *dev);
 #else
@@ -1531,7 +1584,7 @@ static inline struct page *i915_gem_object_get_page(struct drm_i915_gem_object *
        struct sg_page_iter sg_iter;
 
        for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, n)
-               return sg_iter.page;
+               return sg_page_iter_page(&sg_iter);
 
        return NULL;
 }
@@ -1618,7 +1671,6 @@ int __must_check i915_gem_init(struct drm_device *dev);
 int __must_check i915_gem_init_hw(struct drm_device *dev);
 void i915_gem_l3_remap(struct drm_device *dev);
 void i915_gem_init_swizzling(struct drm_device *dev);
-void i915_gem_init_ppgtt(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_idle(struct drm_device *dev);
@@ -1667,6 +1719,17 @@ void i915_gem_context_fini(struct drm_device *dev);
 void i915_gem_context_close(struct drm_device *dev, struct drm_file *file);
 int i915_switch_context(struct intel_ring_buffer *ring,
                        struct drm_file *file, int to_id);
+void i915_gem_context_free(struct kref *ctx_ref);
+static inline void i915_gem_context_reference(struct i915_hw_context *ctx)
+{
+       kref_get(&ctx->ref);
+}
+
+static inline void i915_gem_context_unreference(struct i915_hw_context *ctx)
+{
+       kref_put(&ctx->ref, i915_gem_context_free);
+}
+
 int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
                                  struct drm_file *file);
 int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
@@ -1712,6 +1775,11 @@ 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);
+struct drm_i915_gem_object *
+i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
+                                              u32 stolen_offset,
+                                              u32 gtt_offset,
+                                              u32 size);
 void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
 
 /* i915_gem_tiling.c */
@@ -1759,7 +1827,7 @@ void i915_teardown_sysfs(struct drm_device *dev_priv);
 /* intel_i2c.c */
 extern int intel_setup_gmbus(struct drm_device *dev);
 extern void intel_teardown_gmbus(struct drm_device *dev);
-extern inline bool intel_gmbus_is_port_valid(unsigned port)
+static inline bool intel_gmbus_is_port_valid(unsigned port)
 {
        return (port >= GMBUS_PORT_SSC && port <= GMBUS_PORT_DPD);
 }
@@ -1768,7 +1836,7 @@ extern struct i2c_adapter *intel_gmbus_get_adapter(
                struct drm_i915_private *dev_priv, unsigned port);
 extern void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed);
 extern void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit);
-extern inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
+static inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
 {
        return container_of(adapter, struct intel_gmbus, adapter)->force_bit;
 }
@@ -1780,14 +1848,10 @@ extern int intel_opregion_setup(struct drm_device *dev);
 extern void intel_opregion_init(struct drm_device *dev);
 extern void intel_opregion_fini(struct drm_device *dev);
 extern void intel_opregion_asle_intr(struct drm_device *dev);
-extern void intel_opregion_gse_intr(struct drm_device *dev);
-extern void intel_opregion_enable_asle(struct drm_device *dev);
 #else
 static inline void intel_opregion_init(struct drm_device *dev) { return; }
 static inline void intel_opregion_fini(struct drm_device *dev) { return; }
 static inline void intel_opregion_asle_intr(struct drm_device *dev) { return; }
-static inline void intel_opregion_gse_intr(struct drm_device *dev) { return; }
-static inline void intel_opregion_enable_asle(struct drm_device *dev) { return; }
 #endif
 
 /* intel_acpi.c */
@@ -1813,6 +1877,9 @@ extern void intel_disable_fbc(struct drm_device *dev);
 extern bool ironlake_set_drps(struct drm_device *dev, u8 val);
 extern void intel_init_pch_refclk(struct drm_device *dev);
 extern void gen6_set_rps(struct drm_device *dev, u8 val);
+extern void valleyview_set_rps(struct drm_device *dev, u8 val);
+extern int valleyview_rps_max_freq(struct drm_i915_private *dev_priv);
+extern int valleyview_rps_min_freq(struct drm_i915_private *dev_priv);
 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);
@@ -1842,6 +1909,12 @@ int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
 
 int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u8 mbox, u32 *val);
 int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val);
+int valleyview_punit_read(struct drm_i915_private *dev_priv, u8 addr, u32 *val);
+int valleyview_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
+int valleyview_nc_read(struct drm_i915_private *dev_priv, u8 addr, u32 *val);
+
+int vlv_gpu_freq(int ddr_freq, int val);
+int vlv_freq_opcode(int ddr_freq, int val);
 
 #define __i915_read(x, y) \
        u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg);