]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/i915/i915_drv.h
drm/i915/guc: Skip suspend/resume GuC action on platforms w/o GuC submission
[linux.git] / drivers / gpu / drm / i915 / i915_drv.h
index faf6458027105aa09c43086c2e9421e205798537..bbf4dfdfa8ba025cb0f7b57cc2bc00d9471270d9 100644 (file)
 #include "i915_vma.h"
 #include "i915_irq.h"
 
+#include "intel_region_lmem.h"
+
 #include "intel_gvt.h"
 
 /* General customization:
 
 #define DRIVER_NAME            "i915"
 #define DRIVER_DESC            "Intel Graphics"
-#define DRIVER_DATE            "20191007"
-#define DRIVER_TIMESTAMP       1570451087
+#define DRIVER_DATE            "20191101"
+#define DRIVER_TIMESTAMP       1572604873
 
 struct drm_i915_gem_object;
 
@@ -543,99 +545,6 @@ struct i915_suspend_saved_registers {
 
 struct vlv_s0ix_state;
 
-struct intel_rps_ei {
-       ktime_t ktime;
-       u32 render_c0;
-       u32 media_c0;
-};
-
-struct intel_rps {
-       struct mutex lock; /* protects enabling and the worker */
-
-       /*
-        * work, interrupts_enabled and pm_iir are protected by
-        * dev_priv->irq_lock
-        */
-       struct work_struct work;
-       bool interrupts_enabled;
-       u32 pm_iir;
-
-       /* PM interrupt bits that should never be masked */
-       u32 pm_intrmsk_mbz;
-
-       /* Frequencies are stored in potentially platform dependent multiples.
-        * In other words, *_freq needs to be multiplied by X to be interesting.
-        * Soft limits are those which are used for the dynamic reclocking done
-        * by the driver (raise frequencies under heavy loads, and lower for
-        * lighter loads). Hard limits are those imposed by the hardware.
-        *
-        * A distinction is made for overclocking, which is never enabled by
-        * default, and is considered to be above the hard limit if it's
-        * possible at all.
-        */
-       u8 cur_freq;            /* Current frequency (cached, may not == HW) */
-       u8 min_freq_softlimit;  /* Minimum frequency permitted by the driver */
-       u8 max_freq_softlimit;  /* Max frequency permitted by the driver */
-       u8 max_freq;            /* Maximum frequency, RP0 if not overclocking */
-       u8 min_freq;            /* AKA RPn. Minimum frequency */
-       u8 boost_freq;          /* Frequency to request when wait boosting */
-       u8 idle_freq;           /* Frequency to request when we are idle */
-       u8 efficient_freq;      /* AKA RPe. Pre-determined balanced frequency */
-       u8 rp1_freq;            /* "less than" RP0 power/freqency */
-       u8 rp0_freq;            /* Non-overclocked max frequency. */
-       u16 gpll_ref_freq;      /* vlv/chv GPLL reference frequency */
-
-       int last_adj;
-
-       struct {
-               struct mutex mutex;
-
-               enum { LOW_POWER, BETWEEN, HIGH_POWER } mode;
-               unsigned int interactive;
-
-               u8 up_threshold; /* Current %busy required to uplock */
-               u8 down_threshold; /* Current %busy required to downclock */
-       } power;
-
-       bool enabled;
-       atomic_t num_waiters;
-       atomic_t boosts;
-
-       /* manual wa residency calculations */
-       struct intel_rps_ei ei;
-};
-
-struct intel_llc_pstate {
-       bool enabled;
-};
-
-struct intel_gen6_power_mgmt {
-       struct intel_rps rps;
-       struct intel_llc_pstate llc_pstate;
-};
-
-/* defined intel_pm.c */
-extern spinlock_t mchdev_lock;
-
-struct intel_ilk_power_mgmt {
-       u8 cur_delay;
-       u8 min_delay;
-       u8 max_delay;
-       u8 fmax;
-       u8 fstart;
-
-       u64 last_count1;
-       unsigned long last_time1;
-       unsigned long chipset_power;
-       u64 last_count2;
-       u64 last_time2;
-       unsigned long gfx_power;
-       u8 corr;
-
-       int c_m;
-       int r_t;
-};
-
 #define MAX_L3_SLICES 2
 struct intel_l3_parity {
        u32 *remap_info[MAX_L3_SLICES];
@@ -718,13 +627,9 @@ struct ddi_vbt_port_info {
 
        int max_tmds_clock;
 
-       /*
-        * This is an index in the HDMI/DVI DDI buffer translation table.
-        * The special value HDMI_LEVEL_SHIFT_UNKNOWN means the VBT didn't
-        * populate this field.
-        */
-#define HDMI_LEVEL_SHIFT_UNKNOWN       0xff
+       /* This is an index in the HDMI/DVI DDI buffer translation table. */
        u8 hdmi_level_shift;
+       u8 hdmi_level_shift_set:1;
 
        u8 supports_dvi:1;
        u8 supports_hdmi:1;
@@ -815,8 +720,7 @@ struct intel_vbt_data {
 
        int crt_ddc_pin;
 
-       int child_dev_num;
-       struct child_device_config *child_dev;
+       struct list_head display_devices;
 
        struct ddi_vbt_port_info ddi_port_info[I915_MAX_PORTS];
        struct sdvo_device_mapping sdvo_mappings[2];
@@ -982,6 +886,10 @@ struct intel_cdclk_state {
        u8 voltage_level;
 };
 
+struct i915_selftest_stash {
+       atomic_t counter;
+};
+
 struct drm_i915_private {
        struct drm_device drm;
 
@@ -1072,7 +980,6 @@ struct drm_i915_private {
                u32 irq_mask;
                u32 de_irq_mask[I915_MAX_PIPES];
        };
-       u32 pm_rps_events;
        u32 pipestat_irq_mask[I915_MAX_PIPES];
 
        struct i915_hotplug hotplug;
@@ -1102,13 +1009,14 @@ struct drm_i915_private {
        unsigned int fdi_pll_freq;
        unsigned int czclk_freq;
 
+       /*
+        * For reading holding any crtc lock is sufficient,
+        * for writing must hold all of them.
+        */
        struct {
                /*
                 * The current logical cdclk state.
                 * See intel_atomic_state.cdclk.logical
-                *
-                * For reading holding any crtc lock is sufficient,
-                * for writing must hold all of them.
                 */
                struct intel_cdclk_state logical;
                /*
@@ -1178,6 +1086,10 @@ struct drm_i915_private {
         */
        struct mutex dpll_lock;
 
+       /*
+        * For reading active_pipes, min_cdclk, min_voltage_level holding
+        * any crtc lock is sufficient, for writing must hold all of them.
+        */
        u8 active_pipes;
        /* minimum acceptable cdclk for each pipe */
        int min_cdclk[I915_MAX_PIPES];
@@ -1207,13 +1119,6 @@ struct drm_i915_private {
         */
        u32 edram_size_mb;
 
-       /* gen6+ GT PM state */
-       struct intel_gen6_power_mgmt gt_pm;
-
-       /* ilk-only ips/rps state. Everything in here is protected by the global
-        * mchdev_lock in intel_pm.c */
-       struct intel_ilk_power_mgmt ips;
-
        struct i915_power_domains power_domains;
 
        struct i915_psr psr;
@@ -1342,8 +1247,6 @@ struct drm_i915_private {
        struct intel_gt gt;
 
        struct {
-               struct notifier_block pm_notifier;
-
                struct i915_gem_contexts {
                        spinlock_t lock; /* locks list */
                        struct list_head list;
@@ -1353,6 +1256,8 @@ struct drm_i915_private {
                } contexts;
        } gem;
 
+       u8 pch_ssc_use;
+
        /* For i915gm/i945gm vblank irq workaround */
        u8 vblank_enabled;
 
@@ -1378,6 +1283,8 @@ struct drm_i915_private {
        /* Mutex to protect the above hdcp component related values. */
        struct mutex hdcp_comp_mutex;
 
+       I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;)
+
        /*
         * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
         * will be rejected. Instead look for a better place.
@@ -1549,6 +1456,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 }
 
 #define IS_MOBILE(dev_priv)    (INTEL_INFO(dev_priv)->is_mobile)
+#define IS_DGFX(dev_priv)   (INTEL_INFO(dev_priv)->is_dgfx)
 
 #define IS_I830(dev_priv)      IS_PLATFORM(dev_priv, INTEL_I830)
 #define IS_I845G(dev_priv)     IS_PLATFORM(dev_priv, INTEL_I845G)
@@ -1705,9 +1613,16 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 #define VEBOX_MASK(dev_priv) \
        ENGINE_INSTANCES_MASK(dev_priv, VECS0, I915_MAX_VECS)
 
+/*
+ * The Gen7 cmdparser copies the scanned buffer to the ggtt for execution
+ * All later gens can run the final buffer from the ppgtt
+ */
+#define CMDPARSER_USES_GGTT(dev_priv) IS_GEN(dev_priv, 7)
+
 #define HAS_LLC(dev_priv)      (INTEL_INFO(dev_priv)->has_llc)
 #define HAS_SNOOP(dev_priv)    (INTEL_INFO(dev_priv)->has_snoop)
 #define HAS_EDRAM(dev_priv)    ((dev_priv)->edram_size_mb)
+#define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6)
 #define HAS_WT(dev_priv)       ((IS_HASWELL(dev_priv) || \
                                 IS_BROADWELL(dev_priv)) && HAS_EDRAM(dev_priv))
 
@@ -1740,10 +1655,12 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 /* Early gen2 have a totally busted CS tlb and require pinned batches. */
 #define HAS_BROKEN_CS_TLB(dev_priv)    (IS_I830(dev_priv) || IS_I845G(dev_priv))
 
+#define NEEDS_RC6_CTX_CORRUPTION_WA(dev_priv)  \
+       (IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9))
+
 /* WaRsDisableCoarsePowerGating:skl,cnl */
 #define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \
-       (IS_CANNONLAKE(dev_priv) || \
-        IS_SKL_GT3(dev_priv) || IS_SKL_GT4(dev_priv))
+       IS_GEN_RANGE(dev_priv, 9, 10)
 
 #define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
 #define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
@@ -1786,6 +1703,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 #define HAS_IPC(dev_priv)               (INTEL_INFO(dev_priv)->display.has_ipc)
 
 #define HAS_REGION(i915, i) (INTEL_INFO(i915)->memory_regions & (i))
+#define HAS_LMEM(i915) HAS_REGION(i915, REGION_LMEM)
 
 #define HAS_GT_UC(dev_priv)    (INTEL_INFO(dev_priv)->has_gt_uc)
 
@@ -1851,7 +1769,6 @@ void i915_driver_remove(struct drm_i915_private *i915);
 int i915_resume_switcheroo(struct drm_i915_private *i915);
 int i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state);
 
-void intel_engine_init_hangcheck(struct intel_engine_cs *engine);
 int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on);
 
 static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)
@@ -1870,12 +1787,13 @@ int i915_getparam_ioctl(struct drm_device *dev, void *data,
 /* i915_gem.c */
 int i915_gem_init_userptr(struct drm_i915_private *dev_priv);
 void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv);
-void i915_gem_sanitize(struct drm_i915_private *i915);
 void i915_gem_init_early(struct drm_i915_private *dev_priv);
 void i915_gem_cleanup_early(struct drm_i915_private *dev_priv);
 int i915_gem_freeze(struct drm_i915_private *dev_priv);
 int i915_gem_freeze_late(struct drm_i915_private *dev_priv);
 
+struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915);
+
 static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915)
 {
        /*
@@ -1952,7 +1870,6 @@ static inline u32 i915_reset_engine_count(struct i915_gpu_error *error,
        return atomic_read(&error->reset_engine_count[engine->uabi_class]);
 }
 
-void i915_gem_init_mmio(struct drm_i915_private *i915);
 int __must_check i915_gem_init(struct drm_i915_private *dev_priv);
 void i915_gem_driver_register(struct drm_i915_private *i915);
 void i915_gem_driver_unregister(struct drm_i915_private *i915);
@@ -2005,9 +1922,6 @@ int __must_check i915_gem_evict_for_node(struct i915_address_space *vm,
                                         unsigned int flags);
 int i915_gem_evict_vm(struct i915_address_space *vm);
 
-void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915);
-int i915_gem_init_memory_regions(struct drm_i915_private *i915);
-
 /* i915_gem_internal.c */
 struct drm_i915_gem_object *
 i915_gem_object_create_internal(struct drm_i915_private *dev_priv,
@@ -2033,12 +1947,14 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type);
 int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
 void intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
 void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
-int intel_engine_cmd_parser(struct intel_engine_cs *engine,
+int intel_engine_cmd_parser(struct i915_gem_context *cxt,
+                           struct intel_engine_cs *engine,
                            struct drm_i915_gem_object *batch_obj,
-                           struct drm_i915_gem_object *shadow_batch_obj,
+                           u64 user_batch_start,
                            u32 batch_start_offset,
                            u32 batch_len,
-                           bool is_master);
+                           struct drm_i915_gem_object *shadow_batch_obj,
+                           u64 shadow_batch_start);
 
 /* intel_device_info.c */
 static inline struct intel_device_info *
@@ -2120,4 +2036,10 @@ i915_coherent_map_type(struct drm_i915_private *i915)
        return HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC;
 }
 
+static inline bool intel_guc_submission_is_enabled(struct intel_guc *guc)
+{
+       return intel_guc_is_submission_supported(guc) &&
+               intel_guc_is_running(guc);
+}
+
 #endif