| .. | .. |
|---|
| 45 | 45 | #include <linux/mm_types.h> |
|---|
| 46 | 46 | #include <linux/perf_event.h> |
|---|
| 47 | 47 | #include <linux/pm_qos.h> |
|---|
| 48 | | -#include <linux/reservation.h> |
|---|
| 48 | +#include <linux/dma-resv.h> |
|---|
| 49 | 49 | #include <linux/shmem_fs.h> |
|---|
| 50 | +#include <linux/stackdepot.h> |
|---|
| 51 | +#include <linux/xarray.h> |
|---|
| 50 | 52 | |
|---|
| 51 | | -#include <drm/drmP.h> |
|---|
| 52 | 53 | #include <drm/intel-gtt.h> |
|---|
| 53 | 54 | #include <drm/drm_legacy.h> /* for struct drm_dma_handle */ |
|---|
| 54 | 55 | #include <drm/drm_gem.h> |
|---|
| 55 | 56 | #include <drm/drm_auth.h> |
|---|
| 56 | 57 | #include <drm/drm_cache.h> |
|---|
| 58 | +#include <drm/drm_util.h> |
|---|
| 59 | +#include <drm/drm_dsc.h> |
|---|
| 60 | +#include <drm/drm_atomic.h> |
|---|
| 61 | +#include <drm/drm_connector.h> |
|---|
| 62 | +#include <drm/i915_mei_hdcp_interface.h> |
|---|
| 57 | 63 | |
|---|
| 58 | 64 | #include "i915_params.h" |
|---|
| 59 | 65 | #include "i915_reg.h" |
|---|
| 60 | 66 | #include "i915_utils.h" |
|---|
| 61 | 67 | |
|---|
| 62 | | -#include "intel_bios.h" |
|---|
| 68 | +#include "display/intel_bios.h" |
|---|
| 69 | +#include "display/intel_display.h" |
|---|
| 70 | +#include "display/intel_display_power.h" |
|---|
| 71 | +#include "display/intel_dpll_mgr.h" |
|---|
| 72 | +#include "display/intel_dsb.h" |
|---|
| 73 | +#include "display/intel_frontbuffer.h" |
|---|
| 74 | +#include "display/intel_global_state.h" |
|---|
| 75 | +#include "display/intel_gmbus.h" |
|---|
| 76 | +#include "display/intel_opregion.h" |
|---|
| 77 | + |
|---|
| 78 | +#include "gem/i915_gem_context_types.h" |
|---|
| 79 | +#include "gem/i915_gem_shrinker.h" |
|---|
| 80 | +#include "gem/i915_gem_stolen.h" |
|---|
| 81 | + |
|---|
| 82 | +#include "gt/intel_lrc.h" |
|---|
| 83 | +#include "gt/intel_engine.h" |
|---|
| 84 | +#include "gt/intel_gt_types.h" |
|---|
| 85 | +#include "gt/intel_workarounds.h" |
|---|
| 86 | +#include "gt/uc/intel_uc.h" |
|---|
| 87 | + |
|---|
| 63 | 88 | #include "intel_device_info.h" |
|---|
| 64 | | -#include "intel_display.h" |
|---|
| 65 | | -#include "intel_dpll_mgr.h" |
|---|
| 66 | | -#include "intel_lrc.h" |
|---|
| 67 | | -#include "intel_opregion.h" |
|---|
| 68 | | -#include "intel_ringbuffer.h" |
|---|
| 89 | +#include "intel_pch.h" |
|---|
| 90 | +#include "intel_runtime_pm.h" |
|---|
| 91 | +#include "intel_memory_region.h" |
|---|
| 69 | 92 | #include "intel_uncore.h" |
|---|
| 93 | +#include "intel_wakeref.h" |
|---|
| 70 | 94 | #include "intel_wopcm.h" |
|---|
| 71 | | -#include "intel_uc.h" |
|---|
| 72 | 95 | |
|---|
| 73 | 96 | #include "i915_gem.h" |
|---|
| 74 | | -#include "i915_gem_context.h" |
|---|
| 75 | | -#include "i915_gem_fence_reg.h" |
|---|
| 76 | | -#include "i915_gem_object.h" |
|---|
| 77 | 97 | #include "i915_gem_gtt.h" |
|---|
| 78 | 98 | #include "i915_gpu_error.h" |
|---|
| 99 | +#include "i915_perf_types.h" |
|---|
| 79 | 100 | #include "i915_request.h" |
|---|
| 80 | 101 | #include "i915_scheduler.h" |
|---|
| 81 | | -#include "i915_timeline.h" |
|---|
| 102 | +#include "gt/intel_timeline.h" |
|---|
| 82 | 103 | #include "i915_vma.h" |
|---|
| 104 | +#include "i915_irq.h" |
|---|
| 83 | 105 | |
|---|
| 84 | | -#include "intel_gvt.h" |
|---|
| 106 | +#include "intel_region_lmem.h" |
|---|
| 85 | 107 | |
|---|
| 86 | 108 | /* General customization: |
|---|
| 87 | 109 | */ |
|---|
| 88 | 110 | |
|---|
| 89 | 111 | #define DRIVER_NAME "i915" |
|---|
| 90 | 112 | #define DRIVER_DESC "Intel Graphics" |
|---|
| 91 | | -#define DRIVER_DATE "20180719" |
|---|
| 92 | | -#define DRIVER_TIMESTAMP 1532015279 |
|---|
| 113 | +#define DRIVER_DATE "20200917" |
|---|
| 114 | +#define DRIVER_TIMESTAMP 1600375437 |
|---|
| 93 | 115 | |
|---|
| 94 | | -/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and |
|---|
| 95 | | - * WARN_ON()) for hw state sanity checks to check for unexpected conditions |
|---|
| 96 | | - * which may not necessarily be a user visible problem. This will either |
|---|
| 97 | | - * WARN() or DRM_ERROR() depending on the verbose_checks moduleparam, to |
|---|
| 98 | | - * enable distros and users to tailor their preferred amount of i915 abrt |
|---|
| 99 | | - * spam. |
|---|
| 100 | | - */ |
|---|
| 101 | | -#define I915_STATE_WARN(condition, format...) ({ \ |
|---|
| 102 | | - int __ret_warn_on = !!(condition); \ |
|---|
| 103 | | - if (unlikely(__ret_warn_on)) \ |
|---|
| 104 | | - if (!WARN(i915_modparams.verbose_state_checks, format)) \ |
|---|
| 105 | | - DRM_ERROR(format); \ |
|---|
| 106 | | - unlikely(__ret_warn_on); \ |
|---|
| 107 | | -}) |
|---|
| 108 | | - |
|---|
| 109 | | -#define I915_STATE_WARN_ON(x) \ |
|---|
| 110 | | - I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")") |
|---|
| 111 | | - |
|---|
| 112 | | -#if IS_ENABLED(CONFIG_DRM_I915_DEBUG) |
|---|
| 113 | | - |
|---|
| 114 | | -bool __i915_inject_load_failure(const char *func, int line); |
|---|
| 115 | | -#define i915_inject_load_failure() \ |
|---|
| 116 | | - __i915_inject_load_failure(__func__, __LINE__) |
|---|
| 117 | | - |
|---|
| 118 | | -bool i915_error_injected(void); |
|---|
| 119 | | - |
|---|
| 120 | | -#else |
|---|
| 121 | | - |
|---|
| 122 | | -#define i915_inject_load_failure() false |
|---|
| 123 | | -#define i915_error_injected() false |
|---|
| 124 | | - |
|---|
| 125 | | -#endif |
|---|
| 126 | | - |
|---|
| 127 | | -#define i915_load_error(i915, fmt, ...) \ |
|---|
| 128 | | - __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \ |
|---|
| 129 | | - fmt, ##__VA_ARGS__) |
|---|
| 130 | | - |
|---|
| 131 | | -typedef struct { |
|---|
| 132 | | - uint32_t val; |
|---|
| 133 | | -} uint_fixed_16_16_t; |
|---|
| 134 | | - |
|---|
| 135 | | -#define FP_16_16_MAX ({ \ |
|---|
| 136 | | - uint_fixed_16_16_t fp; \ |
|---|
| 137 | | - fp.val = UINT_MAX; \ |
|---|
| 138 | | - fp; \ |
|---|
| 139 | | -}) |
|---|
| 140 | | - |
|---|
| 141 | | -static inline bool is_fixed16_zero(uint_fixed_16_16_t val) |
|---|
| 142 | | -{ |
|---|
| 143 | | - if (val.val == 0) |
|---|
| 144 | | - return true; |
|---|
| 145 | | - return false; |
|---|
| 146 | | -} |
|---|
| 147 | | - |
|---|
| 148 | | -static inline uint_fixed_16_16_t u32_to_fixed16(uint32_t val) |
|---|
| 149 | | -{ |
|---|
| 150 | | - uint_fixed_16_16_t fp; |
|---|
| 151 | | - |
|---|
| 152 | | - WARN_ON(val > U16_MAX); |
|---|
| 153 | | - |
|---|
| 154 | | - fp.val = val << 16; |
|---|
| 155 | | - return fp; |
|---|
| 156 | | -} |
|---|
| 157 | | - |
|---|
| 158 | | -static inline uint32_t fixed16_to_u32_round_up(uint_fixed_16_16_t fp) |
|---|
| 159 | | -{ |
|---|
| 160 | | - return DIV_ROUND_UP(fp.val, 1 << 16); |
|---|
| 161 | | -} |
|---|
| 162 | | - |
|---|
| 163 | | -static inline uint32_t fixed16_to_u32(uint_fixed_16_16_t fp) |
|---|
| 164 | | -{ |
|---|
| 165 | | - return fp.val >> 16; |
|---|
| 166 | | -} |
|---|
| 167 | | - |
|---|
| 168 | | -static inline uint_fixed_16_16_t min_fixed16(uint_fixed_16_16_t min1, |
|---|
| 169 | | - uint_fixed_16_16_t min2) |
|---|
| 170 | | -{ |
|---|
| 171 | | - uint_fixed_16_16_t min; |
|---|
| 172 | | - |
|---|
| 173 | | - min.val = min(min1.val, min2.val); |
|---|
| 174 | | - return min; |
|---|
| 175 | | -} |
|---|
| 176 | | - |
|---|
| 177 | | -static inline uint_fixed_16_16_t max_fixed16(uint_fixed_16_16_t max1, |
|---|
| 178 | | - uint_fixed_16_16_t max2) |
|---|
| 179 | | -{ |
|---|
| 180 | | - uint_fixed_16_16_t max; |
|---|
| 181 | | - |
|---|
| 182 | | - max.val = max(max1.val, max2.val); |
|---|
| 183 | | - return max; |
|---|
| 184 | | -} |
|---|
| 185 | | - |
|---|
| 186 | | -static inline uint_fixed_16_16_t clamp_u64_to_fixed16(uint64_t val) |
|---|
| 187 | | -{ |
|---|
| 188 | | - uint_fixed_16_16_t fp; |
|---|
| 189 | | - WARN_ON(val > U32_MAX); |
|---|
| 190 | | - fp.val = (uint32_t) val; |
|---|
| 191 | | - return fp; |
|---|
| 192 | | -} |
|---|
| 193 | | - |
|---|
| 194 | | -static inline uint32_t div_round_up_fixed16(uint_fixed_16_16_t val, |
|---|
| 195 | | - uint_fixed_16_16_t d) |
|---|
| 196 | | -{ |
|---|
| 197 | | - return DIV_ROUND_UP(val.val, d.val); |
|---|
| 198 | | -} |
|---|
| 199 | | - |
|---|
| 200 | | -static inline uint32_t mul_round_up_u32_fixed16(uint32_t val, |
|---|
| 201 | | - uint_fixed_16_16_t mul) |
|---|
| 202 | | -{ |
|---|
| 203 | | - uint64_t intermediate_val; |
|---|
| 204 | | - |
|---|
| 205 | | - intermediate_val = (uint64_t) val * mul.val; |
|---|
| 206 | | - intermediate_val = DIV_ROUND_UP_ULL(intermediate_val, 1 << 16); |
|---|
| 207 | | - WARN_ON(intermediate_val > U32_MAX); |
|---|
| 208 | | - return (uint32_t) intermediate_val; |
|---|
| 209 | | -} |
|---|
| 210 | | - |
|---|
| 211 | | -static inline uint_fixed_16_16_t mul_fixed16(uint_fixed_16_16_t val, |
|---|
| 212 | | - uint_fixed_16_16_t mul) |
|---|
| 213 | | -{ |
|---|
| 214 | | - uint64_t intermediate_val; |
|---|
| 215 | | - |
|---|
| 216 | | - intermediate_val = (uint64_t) val.val * mul.val; |
|---|
| 217 | | - intermediate_val = intermediate_val >> 16; |
|---|
| 218 | | - return clamp_u64_to_fixed16(intermediate_val); |
|---|
| 219 | | -} |
|---|
| 220 | | - |
|---|
| 221 | | -static inline uint_fixed_16_16_t div_fixed16(uint32_t val, uint32_t d) |
|---|
| 222 | | -{ |
|---|
| 223 | | - uint64_t interm_val; |
|---|
| 224 | | - |
|---|
| 225 | | - interm_val = (uint64_t)val << 16; |
|---|
| 226 | | - interm_val = DIV_ROUND_UP_ULL(interm_val, d); |
|---|
| 227 | | - return clamp_u64_to_fixed16(interm_val); |
|---|
| 228 | | -} |
|---|
| 229 | | - |
|---|
| 230 | | -static inline uint32_t div_round_up_u32_fixed16(uint32_t val, |
|---|
| 231 | | - uint_fixed_16_16_t d) |
|---|
| 232 | | -{ |
|---|
| 233 | | - uint64_t interm_val; |
|---|
| 234 | | - |
|---|
| 235 | | - interm_val = (uint64_t)val << 16; |
|---|
| 236 | | - interm_val = DIV_ROUND_UP_ULL(interm_val, d.val); |
|---|
| 237 | | - WARN_ON(interm_val > U32_MAX); |
|---|
| 238 | | - return (uint32_t) interm_val; |
|---|
| 239 | | -} |
|---|
| 240 | | - |
|---|
| 241 | | -static inline uint_fixed_16_16_t mul_u32_fixed16(uint32_t val, |
|---|
| 242 | | - uint_fixed_16_16_t mul) |
|---|
| 243 | | -{ |
|---|
| 244 | | - uint64_t intermediate_val; |
|---|
| 245 | | - |
|---|
| 246 | | - intermediate_val = (uint64_t) val * mul.val; |
|---|
| 247 | | - return clamp_u64_to_fixed16(intermediate_val); |
|---|
| 248 | | -} |
|---|
| 249 | | - |
|---|
| 250 | | -static inline uint_fixed_16_16_t add_fixed16(uint_fixed_16_16_t add1, |
|---|
| 251 | | - uint_fixed_16_16_t add2) |
|---|
| 252 | | -{ |
|---|
| 253 | | - uint64_t interm_sum; |
|---|
| 254 | | - |
|---|
| 255 | | - interm_sum = (uint64_t) add1.val + add2.val; |
|---|
| 256 | | - return clamp_u64_to_fixed16(interm_sum); |
|---|
| 257 | | -} |
|---|
| 258 | | - |
|---|
| 259 | | -static inline uint_fixed_16_16_t add_fixed16_u32(uint_fixed_16_16_t add1, |
|---|
| 260 | | - uint32_t add2) |
|---|
| 261 | | -{ |
|---|
| 262 | | - uint64_t interm_sum; |
|---|
| 263 | | - uint_fixed_16_16_t interm_add2 = u32_to_fixed16(add2); |
|---|
| 264 | | - |
|---|
| 265 | | - interm_sum = (uint64_t) add1.val + interm_add2.val; |
|---|
| 266 | | - return clamp_u64_to_fixed16(interm_sum); |
|---|
| 267 | | -} |
|---|
| 116 | +struct drm_i915_gem_object; |
|---|
| 268 | 117 | |
|---|
| 269 | 118 | enum hpd_pin { |
|---|
| 270 | 119 | HPD_NONE = 0, |
|---|
| .. | .. |
|---|
| 277 | 126 | HPD_PORT_C, |
|---|
| 278 | 127 | HPD_PORT_D, |
|---|
| 279 | 128 | HPD_PORT_E, |
|---|
| 280 | | - HPD_PORT_F, |
|---|
| 129 | + HPD_PORT_TC1, |
|---|
| 130 | + HPD_PORT_TC2, |
|---|
| 131 | + HPD_PORT_TC3, |
|---|
| 132 | + HPD_PORT_TC4, |
|---|
| 133 | + HPD_PORT_TC5, |
|---|
| 134 | + HPD_PORT_TC6, |
|---|
| 135 | + |
|---|
| 281 | 136 | HPD_NUM_PINS |
|---|
| 282 | 137 | }; |
|---|
| 283 | 138 | |
|---|
| 284 | 139 | #define for_each_hpd_pin(__pin) \ |
|---|
| 285 | 140 | for ((__pin) = (HPD_NONE + 1); (__pin) < HPD_NUM_PINS; (__pin)++) |
|---|
| 286 | 141 | |
|---|
| 287 | | -#define HPD_STORM_DEFAULT_THRESHOLD 5 |
|---|
| 142 | +/* Threshold == 5 for long IRQs, 50 for short */ |
|---|
| 143 | +#define HPD_STORM_DEFAULT_THRESHOLD 50 |
|---|
| 288 | 144 | |
|---|
| 289 | 145 | struct i915_hotplug { |
|---|
| 290 | | - struct work_struct hotplug_work; |
|---|
| 146 | + struct delayed_work hotplug_work; |
|---|
| 147 | + |
|---|
| 148 | + const u32 *hpd, *pch_hpd; |
|---|
| 291 | 149 | |
|---|
| 292 | 150 | struct { |
|---|
| 293 | 151 | unsigned long last_jiffies; |
|---|
| .. | .. |
|---|
| 299 | 157 | } state; |
|---|
| 300 | 158 | } stats[HPD_NUM_PINS]; |
|---|
| 301 | 159 | u32 event_bits; |
|---|
| 160 | + u32 retry_bits; |
|---|
| 302 | 161 | struct delayed_work reenable_work; |
|---|
| 303 | 162 | |
|---|
| 304 | 163 | u32 long_port_mask; |
|---|
| .. | .. |
|---|
| 309 | 168 | bool poll_enabled; |
|---|
| 310 | 169 | |
|---|
| 311 | 170 | unsigned int hpd_storm_threshold; |
|---|
| 171 | + /* Whether or not to count short HPD IRQs in HPD storms */ |
|---|
| 172 | + u8 hpd_short_storm_enabled; |
|---|
| 312 | 173 | |
|---|
| 313 | 174 | /* |
|---|
| 314 | 175 | * if we get a HPD irq from DP and a HPD irq from non-DP |
|---|
| .. | .. |
|---|
| 333 | 194 | |
|---|
| 334 | 195 | struct drm_i915_file_private { |
|---|
| 335 | 196 | struct drm_i915_private *dev_priv; |
|---|
| 336 | | - struct drm_file *file; |
|---|
| 337 | 197 | |
|---|
| 338 | | - struct { |
|---|
| 339 | | - spinlock_t lock; |
|---|
| 340 | | - struct list_head request_list; |
|---|
| 341 | | -/* 20ms is a fairly arbitrary limit (greater than the average frame time) |
|---|
| 342 | | - * chosen to prevent the CPU getting more than a frame ahead of the GPU |
|---|
| 343 | | - * (when using lax throttling for the frontbuffer). We also use it to |
|---|
| 344 | | - * offer free GPU waitboosts for severely congested workloads. |
|---|
| 345 | | - */ |
|---|
| 346 | | -#define DRM_I915_THROTTLE_JIFFIES msecs_to_jiffies(20) |
|---|
| 347 | | - } mm; |
|---|
| 348 | | - struct idr context_idr; |
|---|
| 198 | + union { |
|---|
| 199 | + struct drm_file *file; |
|---|
| 200 | + struct rcu_head rcu; |
|---|
| 201 | + }; |
|---|
| 349 | 202 | |
|---|
| 350 | | - struct intel_rps_client { |
|---|
| 351 | | - atomic_t boosts; |
|---|
| 352 | | - } rps_client; |
|---|
| 203 | + struct xarray context_xa; |
|---|
| 204 | + struct xarray vm_xa; |
|---|
| 353 | 205 | |
|---|
| 354 | 206 | unsigned int bsd_engine; |
|---|
| 355 | 207 | |
|---|
| .. | .. |
|---|
| 399 | 251 | struct intel_connector; |
|---|
| 400 | 252 | struct intel_encoder; |
|---|
| 401 | 253 | struct intel_atomic_state; |
|---|
| 402 | | -struct intel_crtc_state; |
|---|
| 254 | +struct intel_cdclk_config; |
|---|
| 255 | +struct intel_cdclk_state; |
|---|
| 256 | +struct intel_cdclk_vals; |
|---|
| 403 | 257 | struct intel_initial_plane_config; |
|---|
| 404 | 258 | struct intel_crtc; |
|---|
| 405 | 259 | struct intel_limit; |
|---|
| 406 | 260 | struct dpll; |
|---|
| 407 | | -struct intel_cdclk_state; |
|---|
| 408 | 261 | |
|---|
| 409 | 262 | struct drm_i915_display_funcs { |
|---|
| 410 | 263 | void (*get_cdclk)(struct drm_i915_private *dev_priv, |
|---|
| 411 | | - struct intel_cdclk_state *cdclk_state); |
|---|
| 264 | + struct intel_cdclk_config *cdclk_config); |
|---|
| 412 | 265 | void (*set_cdclk)(struct drm_i915_private *dev_priv, |
|---|
| 413 | | - const struct intel_cdclk_state *cdclk_state); |
|---|
| 266 | + const struct intel_cdclk_config *cdclk_config, |
|---|
| 267 | + enum pipe pipe); |
|---|
| 268 | + int (*bw_calc_min_cdclk)(struct intel_atomic_state *state); |
|---|
| 414 | 269 | int (*get_fifo_size)(struct drm_i915_private *dev_priv, |
|---|
| 415 | 270 | enum i9xx_plane_id i9xx_plane); |
|---|
| 416 | | - int (*compute_pipe_wm)(struct intel_crtc_state *cstate); |
|---|
| 417 | | - int (*compute_intermediate_wm)(struct drm_device *dev, |
|---|
| 418 | | - struct intel_crtc *intel_crtc, |
|---|
| 419 | | - struct intel_crtc_state *newstate); |
|---|
| 271 | + int (*compute_pipe_wm)(struct intel_crtc_state *crtc_state); |
|---|
| 272 | + int (*compute_intermediate_wm)(struct intel_crtc_state *crtc_state); |
|---|
| 420 | 273 | void (*initial_watermarks)(struct intel_atomic_state *state, |
|---|
| 421 | | - struct intel_crtc_state *cstate); |
|---|
| 274 | + struct intel_crtc *crtc); |
|---|
| 422 | 275 | void (*atomic_update_watermarks)(struct intel_atomic_state *state, |
|---|
| 423 | | - struct intel_crtc_state *cstate); |
|---|
| 276 | + struct intel_crtc *crtc); |
|---|
| 424 | 277 | void (*optimize_watermarks)(struct intel_atomic_state *state, |
|---|
| 425 | | - struct intel_crtc_state *cstate); |
|---|
| 426 | | - int (*compute_global_watermarks)(struct drm_atomic_state *state); |
|---|
| 278 | + struct intel_crtc *crtc); |
|---|
| 279 | + int (*compute_global_watermarks)(struct intel_atomic_state *state); |
|---|
| 427 | 280 | void (*update_wm)(struct intel_crtc *crtc); |
|---|
| 428 | | - int (*modeset_calc_cdclk)(struct drm_atomic_state *state); |
|---|
| 281 | + int (*modeset_calc_cdclk)(struct intel_cdclk_state *state); |
|---|
| 282 | + u8 (*calc_voltage_level)(int cdclk); |
|---|
| 429 | 283 | /* Returns the active state of the crtc, and if the crtc is active, |
|---|
| 430 | 284 | * fills out the pipe-config with the hw state. */ |
|---|
| 431 | 285 | bool (*get_pipe_config)(struct intel_crtc *, |
|---|
| .. | .. |
|---|
| 434 | 288 | struct intel_initial_plane_config *); |
|---|
| 435 | 289 | int (*crtc_compute_clock)(struct intel_crtc *crtc, |
|---|
| 436 | 290 | struct intel_crtc_state *crtc_state); |
|---|
| 437 | | - void (*crtc_enable)(struct intel_crtc_state *pipe_config, |
|---|
| 438 | | - struct drm_atomic_state *old_state); |
|---|
| 439 | | - void (*crtc_disable)(struct intel_crtc_state *old_crtc_state, |
|---|
| 440 | | - struct drm_atomic_state *old_state); |
|---|
| 441 | | - void (*update_crtcs)(struct drm_atomic_state *state); |
|---|
| 291 | + void (*crtc_enable)(struct intel_atomic_state *state, |
|---|
| 292 | + struct intel_crtc *crtc); |
|---|
| 293 | + void (*crtc_disable)(struct intel_atomic_state *state, |
|---|
| 294 | + struct intel_crtc *crtc); |
|---|
| 295 | + void (*commit_modeset_enables)(struct intel_atomic_state *state); |
|---|
| 296 | + void (*commit_modeset_disables)(struct intel_atomic_state *state); |
|---|
| 442 | 297 | void (*audio_codec_enable)(struct intel_encoder *encoder, |
|---|
| 443 | 298 | const struct intel_crtc_state *crtc_state, |
|---|
| 444 | 299 | const struct drm_connector_state *conn_state); |
|---|
| .. | .. |
|---|
| 455 | 310 | /* display clock increase/decrease */ |
|---|
| 456 | 311 | /* pll clock increase/decrease */ |
|---|
| 457 | 312 | |
|---|
| 458 | | - void (*load_csc_matrix)(struct drm_crtc_state *crtc_state); |
|---|
| 459 | | - void (*load_luts)(struct drm_crtc_state *crtc_state); |
|---|
| 313 | + int (*color_check)(struct intel_crtc_state *crtc_state); |
|---|
| 314 | + /* |
|---|
| 315 | + * Program double buffered color management registers during |
|---|
| 316 | + * vblank evasion. The registers should then latch during the |
|---|
| 317 | + * next vblank start, alongside any other double buffered registers |
|---|
| 318 | + * involved with the same commit. |
|---|
| 319 | + */ |
|---|
| 320 | + void (*color_commit)(const struct intel_crtc_state *crtc_state); |
|---|
| 321 | + /* |
|---|
| 322 | + * Load LUTs (and other single buffered color management |
|---|
| 323 | + * registers). Will (hopefully) be called during the vblank |
|---|
| 324 | + * following the latching of any double buffered registers |
|---|
| 325 | + * involved with the same commit. |
|---|
| 326 | + */ |
|---|
| 327 | + void (*load_luts)(const struct intel_crtc_state *crtc_state); |
|---|
| 328 | + void (*read_luts)(struct intel_crtc_state *crtc_state); |
|---|
| 460 | 329 | }; |
|---|
| 461 | | - |
|---|
| 462 | | -#define CSR_VERSION(major, minor) ((major) << 16 | (minor)) |
|---|
| 463 | | -#define CSR_VERSION_MAJOR(version) ((version) >> 16) |
|---|
| 464 | | -#define CSR_VERSION_MINOR(version) ((version) & 0xffff) |
|---|
| 465 | 330 | |
|---|
| 466 | 331 | struct intel_csr { |
|---|
| 467 | 332 | struct work_struct work; |
|---|
| 468 | 333 | const char *fw_path; |
|---|
| 469 | | - uint32_t *dmc_payload; |
|---|
| 470 | | - uint32_t dmc_fw_size; |
|---|
| 471 | | - uint32_t version; |
|---|
| 472 | | - uint32_t mmio_count; |
|---|
| 473 | | - i915_reg_t mmioaddr[8]; |
|---|
| 474 | | - uint32_t mmiodata[8]; |
|---|
| 475 | | - uint32_t dc_state; |
|---|
| 476 | | - uint32_t allowed_dc_mask; |
|---|
| 334 | + u32 required_version; |
|---|
| 335 | + u32 max_fw_size; /* bytes */ |
|---|
| 336 | + u32 *dmc_payload; |
|---|
| 337 | + u32 dmc_fw_size; /* dwords */ |
|---|
| 338 | + u32 version; |
|---|
| 339 | + u32 mmio_count; |
|---|
| 340 | + i915_reg_t mmioaddr[20]; |
|---|
| 341 | + u32 mmiodata[20]; |
|---|
| 342 | + u32 dc_state; |
|---|
| 343 | + u32 target_dc_state; |
|---|
| 344 | + u32 allowed_dc_mask; |
|---|
| 345 | + intel_wakeref_t wakeref; |
|---|
| 477 | 346 | }; |
|---|
| 478 | 347 | |
|---|
| 479 | 348 | enum i915_cache_level { |
|---|
| .. | .. |
|---|
| 488 | 357 | |
|---|
| 489 | 358 | #define I915_COLOR_UNEVICTABLE (-1) /* a non-vma sharing the address space */ |
|---|
| 490 | 359 | |
|---|
| 491 | | -enum fb_op_origin { |
|---|
| 492 | | - ORIGIN_GTT, |
|---|
| 493 | | - ORIGIN_CPU, |
|---|
| 494 | | - ORIGIN_CS, |
|---|
| 495 | | - ORIGIN_FLIP, |
|---|
| 496 | | - ORIGIN_DIRTYFB, |
|---|
| 497 | | -}; |
|---|
| 498 | | - |
|---|
| 499 | 360 | struct intel_fbc { |
|---|
| 500 | 361 | /* This is always the inner lock when overlapping with struct_mutex and |
|---|
| 501 | 362 | * it's the outer lock when overlapping with stolen_lock. */ |
|---|
| .. | .. |
|---|
| 503 | 364 | unsigned threshold; |
|---|
| 504 | 365 | unsigned int possible_framebuffer_bits; |
|---|
| 505 | 366 | unsigned int busy_bits; |
|---|
| 506 | | - unsigned int visible_pipes_mask; |
|---|
| 507 | 367 | struct intel_crtc *crtc; |
|---|
| 508 | 368 | |
|---|
| 509 | 369 | struct drm_mm_node compressed_fb; |
|---|
| .. | .. |
|---|
| 511 | 371 | |
|---|
| 512 | 372 | bool false_color; |
|---|
| 513 | 373 | |
|---|
| 514 | | - bool enabled; |
|---|
| 515 | 374 | bool active; |
|---|
| 375 | + bool activated; |
|---|
| 516 | 376 | bool flip_pending; |
|---|
| 517 | 377 | |
|---|
| 518 | 378 | bool underrun_detected; |
|---|
| .. | .. |
|---|
| 524 | 384 | * these problems. |
|---|
| 525 | 385 | */ |
|---|
| 526 | 386 | struct intel_fbc_state_cache { |
|---|
| 527 | | - struct i915_vma *vma; |
|---|
| 528 | | - unsigned long flags; |
|---|
| 529 | | - |
|---|
| 530 | 387 | struct { |
|---|
| 531 | 388 | unsigned int mode_flags; |
|---|
| 532 | | - uint32_t hsw_bdw_pixel_rate; |
|---|
| 389 | + u32 hsw_bdw_pixel_rate; |
|---|
| 533 | 390 | } crtc; |
|---|
| 534 | 391 | |
|---|
| 535 | 392 | struct { |
|---|
| .. | .. |
|---|
| 546 | 403 | int adjusted_x; |
|---|
| 547 | 404 | int adjusted_y; |
|---|
| 548 | 405 | |
|---|
| 549 | | - int y; |
|---|
| 406 | + u16 pixel_blend_mode; |
|---|
| 550 | 407 | } plane; |
|---|
| 551 | 408 | |
|---|
| 552 | 409 | struct { |
|---|
| 553 | 410 | const struct drm_format_info *format; |
|---|
| 554 | 411 | unsigned int stride; |
|---|
| 412 | + u64 modifier; |
|---|
| 555 | 413 | } fb; |
|---|
| 414 | + |
|---|
| 415 | + unsigned int fence_y_offset; |
|---|
| 416 | + u16 gen9_wa_cfb_stride; |
|---|
| 417 | + u16 interval; |
|---|
| 418 | + s8 fence_id; |
|---|
| 556 | 419 | } state_cache; |
|---|
| 557 | 420 | |
|---|
| 558 | 421 | /* |
|---|
| .. | .. |
|---|
| 563 | 426 | * are supposed to read from it in order to program the registers. |
|---|
| 564 | 427 | */ |
|---|
| 565 | 428 | struct intel_fbc_reg_params { |
|---|
| 566 | | - struct i915_vma *vma; |
|---|
| 567 | | - unsigned long flags; |
|---|
| 568 | | - |
|---|
| 569 | 429 | struct { |
|---|
| 570 | 430 | enum pipe pipe; |
|---|
| 571 | 431 | enum i9xx_plane_id i9xx_plane; |
|---|
| 572 | | - unsigned int fence_y_offset; |
|---|
| 573 | 432 | } crtc; |
|---|
| 574 | 433 | |
|---|
| 575 | 434 | struct { |
|---|
| 576 | 435 | const struct drm_format_info *format; |
|---|
| 577 | 436 | unsigned int stride; |
|---|
| 437 | + u64 modifier; |
|---|
| 578 | 438 | } fb; |
|---|
| 579 | 439 | |
|---|
| 580 | 440 | int cfb_size; |
|---|
| 581 | | - unsigned int gen9_wa_cfb_stride; |
|---|
| 441 | + unsigned int fence_y_offset; |
|---|
| 442 | + u16 gen9_wa_cfb_stride; |
|---|
| 443 | + u16 interval; |
|---|
| 444 | + s8 fence_id; |
|---|
| 445 | + bool plane_visible; |
|---|
| 582 | 446 | } params; |
|---|
| 583 | 447 | |
|---|
| 584 | 448 | const char *no_fbc_reason; |
|---|
| .. | .. |
|---|
| 613 | 477 | |
|---|
| 614 | 478 | struct i915_psr { |
|---|
| 615 | 479 | struct mutex lock; |
|---|
| 480 | + |
|---|
| 481 | +#define I915_PSR_DEBUG_MODE_MASK 0x0f |
|---|
| 482 | +#define I915_PSR_DEBUG_DEFAULT 0x00 |
|---|
| 483 | +#define I915_PSR_DEBUG_DISABLE 0x01 |
|---|
| 484 | +#define I915_PSR_DEBUG_ENABLE 0x02 |
|---|
| 485 | +#define I915_PSR_DEBUG_FORCE_PSR1 0x03 |
|---|
| 486 | +#define I915_PSR_DEBUG_IRQ 0x10 |
|---|
| 487 | + |
|---|
| 488 | + u32 debug; |
|---|
| 616 | 489 | bool sink_support; |
|---|
| 617 | | - struct intel_dp *enabled; |
|---|
| 490 | + bool enabled; |
|---|
| 491 | + struct intel_dp *dp; |
|---|
| 492 | + enum pipe pipe; |
|---|
| 493 | + enum transcoder transcoder; |
|---|
| 618 | 494 | bool active; |
|---|
| 619 | 495 | struct work_struct work; |
|---|
| 620 | 496 | unsigned busy_frontbuffer_bits; |
|---|
| 621 | 497 | bool sink_psr2_support; |
|---|
| 622 | 498 | bool link_standby; |
|---|
| 623 | 499 | bool colorimetry_support; |
|---|
| 624 | | - bool alpm; |
|---|
| 625 | 500 | bool psr2_enabled; |
|---|
| 501 | + bool psr2_sel_fetch_enabled; |
|---|
| 626 | 502 | u8 sink_sync_latency; |
|---|
| 627 | | - bool debug; |
|---|
| 628 | 503 | ktime_t last_entry_attempt; |
|---|
| 629 | 504 | ktime_t last_exit; |
|---|
| 630 | | -}; |
|---|
| 631 | | - |
|---|
| 632 | | -enum intel_pch { |
|---|
| 633 | | - PCH_NONE = 0, /* No PCH present */ |
|---|
| 634 | | - PCH_IBX, /* Ibexpeak PCH */ |
|---|
| 635 | | - PCH_CPT, /* Cougarpoint/Pantherpoint PCH */ |
|---|
| 636 | | - PCH_LPT, /* Lynxpoint/Wildcatpoint PCH */ |
|---|
| 637 | | - PCH_SPT, /* Sunrisepoint PCH */ |
|---|
| 638 | | - PCH_KBP, /* Kaby Lake PCH */ |
|---|
| 639 | | - PCH_CNP, /* Cannon Lake PCH */ |
|---|
| 640 | | - PCH_ICP, /* Ice Lake PCH */ |
|---|
| 641 | | - PCH_NOP, /* PCH without south display */ |
|---|
| 642 | | -}; |
|---|
| 643 | | - |
|---|
| 644 | | -enum intel_sbi_destination { |
|---|
| 645 | | - SBI_ICLK, |
|---|
| 646 | | - SBI_MPHY, |
|---|
| 505 | + bool sink_not_reliable; |
|---|
| 506 | + bool irq_aux_error; |
|---|
| 507 | + u16 su_x_granularity; |
|---|
| 508 | + bool dc3co_enabled; |
|---|
| 509 | + u32 dc3co_exit_delay; |
|---|
| 510 | + struct delayed_work dc3co_work; |
|---|
| 511 | + bool force_mode_changed; |
|---|
| 512 | + struct drm_dp_vsc_sdp vsc; |
|---|
| 647 | 513 | }; |
|---|
| 648 | 514 | |
|---|
| 649 | 515 | #define QUIRK_LVDS_SSC_DISABLE (1<<1) |
|---|
| .. | .. |
|---|
| 668 | 534 | |
|---|
| 669 | 535 | struct i915_suspend_saved_registers { |
|---|
| 670 | 536 | u32 saveDSPARB; |
|---|
| 671 | | - u32 saveFBC_CONTROL; |
|---|
| 672 | | - u32 saveCACHE_MODE_0; |
|---|
| 673 | | - u32 saveMI_ARB_STATE; |
|---|
| 674 | 537 | u32 saveSWF0[16]; |
|---|
| 675 | 538 | u32 saveSWF1[16]; |
|---|
| 676 | 539 | u32 saveSWF3[3]; |
|---|
| 677 | | - uint64_t saveFENCE[I915_MAX_NUM_FENCES]; |
|---|
| 678 | | - u32 savePCH_PORT_HOTPLUG; |
|---|
| 679 | 540 | u16 saveGCDGMBUS; |
|---|
| 680 | 541 | }; |
|---|
| 681 | 542 | |
|---|
| 682 | | -struct vlv_s0ix_state { |
|---|
| 683 | | - /* GAM */ |
|---|
| 684 | | - u32 wr_watermark; |
|---|
| 685 | | - u32 gfx_prio_ctrl; |
|---|
| 686 | | - u32 arb_mode; |
|---|
| 687 | | - u32 gfx_pend_tlb0; |
|---|
| 688 | | - u32 gfx_pend_tlb1; |
|---|
| 689 | | - u32 lra_limits[GEN7_LRA_LIMITS_REG_NUM]; |
|---|
| 690 | | - u32 media_max_req_count; |
|---|
| 691 | | - u32 gfx_max_req_count; |
|---|
| 692 | | - u32 render_hwsp; |
|---|
| 693 | | - u32 ecochk; |
|---|
| 694 | | - u32 bsd_hwsp; |
|---|
| 695 | | - u32 blt_hwsp; |
|---|
| 696 | | - u32 tlb_rd_addr; |
|---|
| 697 | | - |
|---|
| 698 | | - /* MBC */ |
|---|
| 699 | | - u32 g3dctl; |
|---|
| 700 | | - u32 gsckgctl; |
|---|
| 701 | | - u32 mbctl; |
|---|
| 702 | | - |
|---|
| 703 | | - /* GCP */ |
|---|
| 704 | | - u32 ucgctl1; |
|---|
| 705 | | - u32 ucgctl3; |
|---|
| 706 | | - u32 rcgctl1; |
|---|
| 707 | | - u32 rcgctl2; |
|---|
| 708 | | - u32 rstctl; |
|---|
| 709 | | - u32 misccpctl; |
|---|
| 710 | | - |
|---|
| 711 | | - /* GPM */ |
|---|
| 712 | | - u32 gfxpause; |
|---|
| 713 | | - u32 rpdeuhwtc; |
|---|
| 714 | | - u32 rpdeuc; |
|---|
| 715 | | - u32 ecobus; |
|---|
| 716 | | - u32 pwrdwnupctl; |
|---|
| 717 | | - u32 rp_down_timeout; |
|---|
| 718 | | - u32 rp_deucsw; |
|---|
| 719 | | - u32 rcubmabdtmr; |
|---|
| 720 | | - u32 rcedata; |
|---|
| 721 | | - u32 spare2gh; |
|---|
| 722 | | - |
|---|
| 723 | | - /* Display 1 CZ domain */ |
|---|
| 724 | | - u32 gt_imr; |
|---|
| 725 | | - u32 gt_ier; |
|---|
| 726 | | - u32 pm_imr; |
|---|
| 727 | | - u32 pm_ier; |
|---|
| 728 | | - u32 gt_scratch[GEN7_GT_SCRATCH_REG_NUM]; |
|---|
| 729 | | - |
|---|
| 730 | | - /* GT SA CZ domain */ |
|---|
| 731 | | - u32 tilectl; |
|---|
| 732 | | - u32 gt_fifoctl; |
|---|
| 733 | | - u32 gtlc_wake_ctrl; |
|---|
| 734 | | - u32 gtlc_survive; |
|---|
| 735 | | - u32 pmwgicz; |
|---|
| 736 | | - |
|---|
| 737 | | - /* Display 2 CZ domain */ |
|---|
| 738 | | - u32 gu_ctl0; |
|---|
| 739 | | - u32 gu_ctl1; |
|---|
| 740 | | - u32 pcbr; |
|---|
| 741 | | - u32 clock_gate_dis2; |
|---|
| 742 | | -}; |
|---|
| 743 | | - |
|---|
| 744 | | -struct intel_rps_ei { |
|---|
| 745 | | - ktime_t ktime; |
|---|
| 746 | | - u32 render_c0; |
|---|
| 747 | | - u32 media_c0; |
|---|
| 748 | | -}; |
|---|
| 749 | | - |
|---|
| 750 | | -struct intel_rps { |
|---|
| 751 | | - /* |
|---|
| 752 | | - * work, interrupts_enabled and pm_iir are protected by |
|---|
| 753 | | - * dev_priv->irq_lock |
|---|
| 754 | | - */ |
|---|
| 755 | | - struct work_struct work; |
|---|
| 756 | | - bool interrupts_enabled; |
|---|
| 757 | | - u32 pm_iir; |
|---|
| 758 | | - |
|---|
| 759 | | - /* PM interrupt bits that should never be masked */ |
|---|
| 760 | | - u32 pm_intrmsk_mbz; |
|---|
| 761 | | - |
|---|
| 762 | | - /* Frequencies are stored in potentially platform dependent multiples. |
|---|
| 763 | | - * In other words, *_freq needs to be multiplied by X to be interesting. |
|---|
| 764 | | - * Soft limits are those which are used for the dynamic reclocking done |
|---|
| 765 | | - * by the driver (raise frequencies under heavy loads, and lower for |
|---|
| 766 | | - * lighter loads). Hard limits are those imposed by the hardware. |
|---|
| 767 | | - * |
|---|
| 768 | | - * A distinction is made for overclocking, which is never enabled by |
|---|
| 769 | | - * default, and is considered to be above the hard limit if it's |
|---|
| 770 | | - * possible at all. |
|---|
| 771 | | - */ |
|---|
| 772 | | - u8 cur_freq; /* Current frequency (cached, may not == HW) */ |
|---|
| 773 | | - u8 min_freq_softlimit; /* Minimum frequency permitted by the driver */ |
|---|
| 774 | | - u8 max_freq_softlimit; /* Max frequency permitted by the driver */ |
|---|
| 775 | | - u8 max_freq; /* Maximum frequency, RP0 if not overclocking */ |
|---|
| 776 | | - u8 min_freq; /* AKA RPn. Minimum frequency */ |
|---|
| 777 | | - u8 boost_freq; /* Frequency to request when wait boosting */ |
|---|
| 778 | | - u8 idle_freq; /* Frequency to request when we are idle */ |
|---|
| 779 | | - u8 efficient_freq; /* AKA RPe. Pre-determined balanced frequency */ |
|---|
| 780 | | - u8 rp1_freq; /* "less than" RP0 power/freqency */ |
|---|
| 781 | | - u8 rp0_freq; /* Non-overclocked max frequency. */ |
|---|
| 782 | | - u16 gpll_ref_freq; /* vlv/chv GPLL reference frequency */ |
|---|
| 783 | | - |
|---|
| 784 | | - int last_adj; |
|---|
| 785 | | - |
|---|
| 786 | | - struct { |
|---|
| 787 | | - struct mutex mutex; |
|---|
| 788 | | - |
|---|
| 789 | | - enum { LOW_POWER, BETWEEN, HIGH_POWER } mode; |
|---|
| 790 | | - unsigned int interactive; |
|---|
| 791 | | - |
|---|
| 792 | | - u8 up_threshold; /* Current %busy required to uplock */ |
|---|
| 793 | | - u8 down_threshold; /* Current %busy required to downclock */ |
|---|
| 794 | | - } power; |
|---|
| 795 | | - |
|---|
| 796 | | - bool enabled; |
|---|
| 797 | | - atomic_t num_waiters; |
|---|
| 798 | | - atomic_t boosts; |
|---|
| 799 | | - |
|---|
| 800 | | - /* manual wa residency calculations */ |
|---|
| 801 | | - struct intel_rps_ei ei; |
|---|
| 802 | | -}; |
|---|
| 803 | | - |
|---|
| 804 | | -struct intel_rc6 { |
|---|
| 805 | | - bool enabled; |
|---|
| 806 | | - bool ctx_corrupted; |
|---|
| 807 | | - u64 prev_hw_residency[4]; |
|---|
| 808 | | - u64 cur_residency[4]; |
|---|
| 809 | | -}; |
|---|
| 810 | | - |
|---|
| 811 | | -struct intel_llc_pstate { |
|---|
| 812 | | - bool enabled; |
|---|
| 813 | | -}; |
|---|
| 814 | | - |
|---|
| 815 | | -struct intel_gen6_power_mgmt { |
|---|
| 816 | | - struct intel_rps rps; |
|---|
| 817 | | - struct intel_rc6 rc6; |
|---|
| 818 | | - struct intel_llc_pstate llc_pstate; |
|---|
| 819 | | -}; |
|---|
| 820 | | - |
|---|
| 821 | | -/* defined intel_pm.c */ |
|---|
| 822 | | -extern spinlock_t mchdev_lock; |
|---|
| 823 | | - |
|---|
| 824 | | -struct intel_ilk_power_mgmt { |
|---|
| 825 | | - u8 cur_delay; |
|---|
| 826 | | - u8 min_delay; |
|---|
| 827 | | - u8 max_delay; |
|---|
| 828 | | - u8 fmax; |
|---|
| 829 | | - u8 fstart; |
|---|
| 830 | | - |
|---|
| 831 | | - u64 last_count1; |
|---|
| 832 | | - unsigned long last_time1; |
|---|
| 833 | | - unsigned long chipset_power; |
|---|
| 834 | | - u64 last_count2; |
|---|
| 835 | | - u64 last_time2; |
|---|
| 836 | | - unsigned long gfx_power; |
|---|
| 837 | | - u8 corr; |
|---|
| 838 | | - |
|---|
| 839 | | - int c_m; |
|---|
| 840 | | - int r_t; |
|---|
| 841 | | -}; |
|---|
| 842 | | - |
|---|
| 843 | | -struct drm_i915_private; |
|---|
| 844 | | -struct i915_power_well; |
|---|
| 845 | | - |
|---|
| 846 | | -struct i915_power_well_ops { |
|---|
| 847 | | - /* |
|---|
| 848 | | - * Synchronize the well's hw state to match the current sw state, for |
|---|
| 849 | | - * example enable/disable it based on the current refcount. Called |
|---|
| 850 | | - * during driver init and resume time, possibly after first calling |
|---|
| 851 | | - * the enable/disable handlers. |
|---|
| 852 | | - */ |
|---|
| 853 | | - void (*sync_hw)(struct drm_i915_private *dev_priv, |
|---|
| 854 | | - struct i915_power_well *power_well); |
|---|
| 855 | | - /* |
|---|
| 856 | | - * Enable the well and resources that depend on it (for example |
|---|
| 857 | | - * interrupts located on the well). Called after the 0->1 refcount |
|---|
| 858 | | - * transition. |
|---|
| 859 | | - */ |
|---|
| 860 | | - void (*enable)(struct drm_i915_private *dev_priv, |
|---|
| 861 | | - struct i915_power_well *power_well); |
|---|
| 862 | | - /* |
|---|
| 863 | | - * Disable the well and resources that depend on it. Called after |
|---|
| 864 | | - * the 1->0 refcount transition. |
|---|
| 865 | | - */ |
|---|
| 866 | | - void (*disable)(struct drm_i915_private *dev_priv, |
|---|
| 867 | | - struct i915_power_well *power_well); |
|---|
| 868 | | - /* Returns the hw enabled state. */ |
|---|
| 869 | | - bool (*is_enabled)(struct drm_i915_private *dev_priv, |
|---|
| 870 | | - struct i915_power_well *power_well); |
|---|
| 871 | | -}; |
|---|
| 872 | | - |
|---|
| 873 | | -/* Power well structure for haswell */ |
|---|
| 874 | | -struct i915_power_well { |
|---|
| 875 | | - const char *name; |
|---|
| 876 | | - bool always_on; |
|---|
| 877 | | - /* power well enable/disable usage count */ |
|---|
| 878 | | - int count; |
|---|
| 879 | | - /* cached hw enabled state */ |
|---|
| 880 | | - bool hw_enabled; |
|---|
| 881 | | - u64 domains; |
|---|
| 882 | | - /* unique identifier for this power well */ |
|---|
| 883 | | - enum i915_power_well_id id; |
|---|
| 884 | | - /* |
|---|
| 885 | | - * Arbitraty data associated with this power well. Platform and power |
|---|
| 886 | | - * well specific. |
|---|
| 887 | | - */ |
|---|
| 888 | | - union { |
|---|
| 889 | | - struct { |
|---|
| 890 | | - enum dpio_phy phy; |
|---|
| 891 | | - } bxt; |
|---|
| 892 | | - struct { |
|---|
| 893 | | - /* Mask of pipes whose IRQ logic is backed by the pw */ |
|---|
| 894 | | - u8 irq_pipe_mask; |
|---|
| 895 | | - /* The pw is backing the VGA functionality */ |
|---|
| 896 | | - bool has_vga:1; |
|---|
| 897 | | - bool has_fuses:1; |
|---|
| 898 | | - } hsw; |
|---|
| 899 | | - }; |
|---|
| 900 | | - const struct i915_power_well_ops *ops; |
|---|
| 901 | | -}; |
|---|
| 902 | | - |
|---|
| 903 | | -struct i915_power_domains { |
|---|
| 904 | | - /* |
|---|
| 905 | | - * Power wells needed for initialization at driver init and suspend |
|---|
| 906 | | - * time are on. They are kept on until after the first modeset. |
|---|
| 907 | | - */ |
|---|
| 908 | | - bool init_power_on; |
|---|
| 909 | | - bool initializing; |
|---|
| 910 | | - int power_well_count; |
|---|
| 911 | | - |
|---|
| 912 | | - struct mutex lock; |
|---|
| 913 | | - int domain_use_count[POWER_DOMAIN_NUM]; |
|---|
| 914 | | - struct i915_power_well *power_wells; |
|---|
| 915 | | -}; |
|---|
| 543 | +struct vlv_s0ix_state; |
|---|
| 916 | 544 | |
|---|
| 917 | 545 | #define MAX_L3_SLICES 2 |
|---|
| 918 | 546 | struct intel_l3_parity { |
|---|
| .. | .. |
|---|
| 931 | 559 | /* Protects bound_list/unbound_list and #drm_i915_gem_object.mm.link */ |
|---|
| 932 | 560 | spinlock_t obj_lock; |
|---|
| 933 | 561 | |
|---|
| 934 | | - /** List of all objects in gtt_space. Used to restore gtt |
|---|
| 935 | | - * mappings on resume */ |
|---|
| 936 | | - struct list_head bound_list; |
|---|
| 937 | 562 | /** |
|---|
| 938 | | - * List of objects which are not bound to the GTT (thus |
|---|
| 939 | | - * are idle and not used by the GPU). These objects may or may |
|---|
| 940 | | - * not actually have any pages attached. |
|---|
| 563 | + * List of objects which are purgeable. |
|---|
| 941 | 564 | */ |
|---|
| 942 | | - struct list_head unbound_list; |
|---|
| 565 | + struct list_head purge_list; |
|---|
| 943 | 566 | |
|---|
| 944 | | - /** List of all objects in gtt_space, currently mmaped by userspace. |
|---|
| 945 | | - * All objects within this list must also be on bound_list. |
|---|
| 567 | + /** |
|---|
| 568 | + * List of objects which have allocated pages and are shrinkable. |
|---|
| 946 | 569 | */ |
|---|
| 947 | | - struct list_head userfault_list; |
|---|
| 570 | + struct list_head shrink_list; |
|---|
| 948 | 571 | |
|---|
| 949 | 572 | /** |
|---|
| 950 | 573 | * List of objects which are pending destruction. |
|---|
| 951 | 574 | */ |
|---|
| 952 | 575 | struct llist_head free_list; |
|---|
| 953 | 576 | struct work_struct free_work; |
|---|
| 954 | | - spinlock_t free_lock; |
|---|
| 955 | 577 | /** |
|---|
| 956 | 578 | * Count of objects pending destructions. Used to skip needlessly |
|---|
| 957 | 579 | * waiting on an RCU barrier if no objects are waiting to be freed. |
|---|
| .. | .. |
|---|
| 959 | 581 | atomic_t free_count; |
|---|
| 960 | 582 | |
|---|
| 961 | 583 | /** |
|---|
| 962 | | - * Small stash of WC pages |
|---|
| 963 | | - */ |
|---|
| 964 | | - struct pagestash wc_stash; |
|---|
| 965 | | - |
|---|
| 966 | | - /** |
|---|
| 967 | 584 | * tmpfs instance used for shmem backed objects |
|---|
| 968 | 585 | */ |
|---|
| 969 | 586 | struct vfsmount *gemfs; |
|---|
| 970 | 587 | |
|---|
| 971 | | - /** PPGTT used for aliasing the PPGTT with the GTT */ |
|---|
| 972 | | - struct i915_hw_ppgtt *aliasing_ppgtt; |
|---|
| 588 | + struct intel_memory_region *regions[INTEL_REGION_UNKNOWN]; |
|---|
| 973 | 589 | |
|---|
| 974 | 590 | struct notifier_block oom_notifier; |
|---|
| 975 | 591 | struct notifier_block vmap_notifier; |
|---|
| 976 | 592 | struct shrinker shrinker; |
|---|
| 977 | | - |
|---|
| 978 | | - /** LRU list of objects with fence regs on them. */ |
|---|
| 979 | | - struct list_head fence_list; |
|---|
| 980 | 593 | |
|---|
| 981 | 594 | /** |
|---|
| 982 | 595 | * Workqueue to fault in userptr pages, flushed by the execbuf |
|---|
| .. | .. |
|---|
| 985 | 598 | */ |
|---|
| 986 | 599 | struct workqueue_struct *userptr_wq; |
|---|
| 987 | 600 | |
|---|
| 988 | | - u64 unordered_timeline; |
|---|
| 989 | | - |
|---|
| 990 | | - /* the indicator for dispatch video commands on two BSD rings */ |
|---|
| 991 | | - atomic_t bsd_engine_dispatch_index; |
|---|
| 992 | | - |
|---|
| 993 | | - /** Bit 6 swizzling required for X tiling */ |
|---|
| 994 | | - uint32_t bit_6_swizzle_x; |
|---|
| 995 | | - /** Bit 6 swizzling required for Y tiling */ |
|---|
| 996 | | - uint32_t bit_6_swizzle_y; |
|---|
| 997 | | - |
|---|
| 998 | | - /* accounting, useful for userland debugging */ |
|---|
| 999 | | - spinlock_t object_stat_lock; |
|---|
| 1000 | | - u64 object_memory; |
|---|
| 1001 | | - u32 object_count; |
|---|
| 601 | + /* shrinker accounting, also useful for userland debugging */ |
|---|
| 602 | + u64 shrink_memory; |
|---|
| 603 | + u32 shrink_count; |
|---|
| 1002 | 604 | }; |
|---|
| 1003 | 605 | |
|---|
| 1004 | 606 | #define I915_IDLE_ENGINES_TIMEOUT (200) /* in ms */ |
|---|
| 1005 | 607 | |
|---|
| 1006 | | -#define I915_RESET_TIMEOUT (10 * HZ) /* 10s */ |
|---|
| 1007 | | -#define I915_FENCE_TIMEOUT (10 * HZ) /* 10s */ |
|---|
| 608 | +unsigned long i915_fence_context_timeout(const struct drm_i915_private *i915, |
|---|
| 609 | + u64 context); |
|---|
| 1008 | 610 | |
|---|
| 1009 | | -#define I915_ENGINE_DEAD_TIMEOUT (4 * HZ) /* Seqno, head and subunits dead */ |
|---|
| 1010 | | -#define I915_SEQNO_DEAD_TIMEOUT (12 * HZ) /* Seqno dead with active head */ |
|---|
| 611 | +static inline unsigned long |
|---|
| 612 | +i915_fence_timeout(const struct drm_i915_private *i915) |
|---|
| 613 | +{ |
|---|
| 614 | + return i915_fence_context_timeout(i915, U64_MAX); |
|---|
| 615 | +} |
|---|
| 1011 | 616 | |
|---|
| 1012 | | -#define I915_ENGINE_WEDGED_TIMEOUT (60 * HZ) /* Reset but no recovery? */ |
|---|
| 1013 | | - |
|---|
| 1014 | | -#define DP_AUX_A 0x40 |
|---|
| 1015 | | -#define DP_AUX_B 0x10 |
|---|
| 1016 | | -#define DP_AUX_C 0x20 |
|---|
| 1017 | | -#define DP_AUX_D 0x30 |
|---|
| 1018 | | -#define DP_AUX_E 0x50 |
|---|
| 1019 | | -#define DP_AUX_F 0x60 |
|---|
| 1020 | | - |
|---|
| 1021 | | -#define DDC_PIN_B 0x05 |
|---|
| 1022 | | -#define DDC_PIN_C 0x04 |
|---|
| 1023 | | -#define DDC_PIN_D 0x06 |
|---|
| 617 | +/* Amount of SAGV/QGV points, BSpec precisely defines this */ |
|---|
| 618 | +#define I915_NUM_QGV_POINTS 8 |
|---|
| 1024 | 619 | |
|---|
| 1025 | 620 | struct ddi_vbt_port_info { |
|---|
| 621 | + /* Non-NULL if port present. */ |
|---|
| 622 | + const struct child_device_config *child; |
|---|
| 623 | + |
|---|
| 1026 | 624 | int max_tmds_clock; |
|---|
| 1027 | 625 | |
|---|
| 1028 | | - /* |
|---|
| 1029 | | - * This is an index in the HDMI/DVI DDI buffer translation table. |
|---|
| 1030 | | - * The special value HDMI_LEVEL_SHIFT_UNKNOWN means the VBT didn't |
|---|
| 1031 | | - * populate this field. |
|---|
| 1032 | | - */ |
|---|
| 1033 | | -#define HDMI_LEVEL_SHIFT_UNKNOWN 0xff |
|---|
| 1034 | | - uint8_t hdmi_level_shift; |
|---|
| 626 | + /* This is an index in the HDMI/DVI DDI buffer translation table. */ |
|---|
| 627 | + u8 hdmi_level_shift; |
|---|
| 628 | + u8 hdmi_level_shift_set:1; |
|---|
| 1035 | 629 | |
|---|
| 1036 | | - uint8_t supports_dvi:1; |
|---|
| 1037 | | - uint8_t supports_hdmi:1; |
|---|
| 1038 | | - uint8_t supports_dp:1; |
|---|
| 1039 | | - uint8_t supports_edp:1; |
|---|
| 630 | + u8 supports_dvi:1; |
|---|
| 631 | + u8 supports_hdmi:1; |
|---|
| 632 | + u8 supports_dp:1; |
|---|
| 633 | + u8 supports_edp:1; |
|---|
| 634 | + u8 supports_typec_usb:1; |
|---|
| 635 | + u8 supports_tbt:1; |
|---|
| 1040 | 636 | |
|---|
| 1041 | | - uint8_t alternate_aux_channel; |
|---|
| 1042 | | - uint8_t alternate_ddc_pin; |
|---|
| 637 | + u8 alternate_aux_channel; |
|---|
| 638 | + u8 alternate_ddc_pin; |
|---|
| 1043 | 639 | |
|---|
| 1044 | | - uint8_t dp_boost_level; |
|---|
| 1045 | | - uint8_t hdmi_boost_level; |
|---|
| 640 | + u8 dp_boost_level; |
|---|
| 641 | + u8 hdmi_boost_level; |
|---|
| 1046 | 642 | int dp_max_link_rate; /* 0 for not limited by VBT */ |
|---|
| 1047 | 643 | }; |
|---|
| 1048 | 644 | |
|---|
| .. | .. |
|---|
| 1068 | 664 | unsigned int panel_type:4; |
|---|
| 1069 | 665 | int lvds_ssc_freq; |
|---|
| 1070 | 666 | unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ |
|---|
| 667 | + enum drm_panel_orientation orientation; |
|---|
| 1071 | 668 | |
|---|
| 1072 | 669 | enum drrs_support_type drrs_type; |
|---|
| 1073 | 670 | |
|---|
| .. | .. |
|---|
| 1080 | 677 | bool initialized; |
|---|
| 1081 | 678 | int bpp; |
|---|
| 1082 | 679 | struct edp_power_seq pps; |
|---|
| 680 | + bool hobl; |
|---|
| 1083 | 681 | } edp; |
|---|
| 1084 | 682 | |
|---|
| 1085 | 683 | struct { |
|---|
| .. | .. |
|---|
| 1090 | 688 | enum psr_lines_to_wait lines_to_wait; |
|---|
| 1091 | 689 | int tp1_wakeup_time_us; |
|---|
| 1092 | 690 | int tp2_tp3_wakeup_time_us; |
|---|
| 691 | + int psr2_tp2_tp3_wakeup_time_us; |
|---|
| 1093 | 692 | } psr; |
|---|
| 1094 | 693 | |
|---|
| 1095 | 694 | struct { |
|---|
| .. | .. |
|---|
| 1113 | 712 | u8 *data; |
|---|
| 1114 | 713 | const u8 *sequence[MIPI_SEQ_MAX]; |
|---|
| 1115 | 714 | u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ |
|---|
| 715 | + enum drm_panel_orientation orientation; |
|---|
| 1116 | 716 | } dsi; |
|---|
| 1117 | 717 | |
|---|
| 1118 | 718 | int crt_ddc_pin; |
|---|
| 1119 | 719 | |
|---|
| 1120 | | - int child_dev_num; |
|---|
| 1121 | | - struct child_device_config *child_dev; |
|---|
| 720 | + struct list_head display_devices; |
|---|
| 1122 | 721 | |
|---|
| 1123 | 722 | struct ddi_vbt_port_info ddi_port_info[I915_MAX_PORTS]; |
|---|
| 1124 | 723 | struct sdvo_device_mapping sdvo_mappings[2]; |
|---|
| .. | .. |
|---|
| 1129 | 728 | INTEL_DDB_PART_5_6, /* IVB+ */ |
|---|
| 1130 | 729 | }; |
|---|
| 1131 | 730 | |
|---|
| 1132 | | -struct intel_wm_level { |
|---|
| 1133 | | - bool enable; |
|---|
| 1134 | | - uint32_t pri_val; |
|---|
| 1135 | | - uint32_t spr_val; |
|---|
| 1136 | | - uint32_t cur_val; |
|---|
| 1137 | | - uint32_t fbc_val; |
|---|
| 1138 | | -}; |
|---|
| 1139 | | - |
|---|
| 1140 | 731 | struct ilk_wm_values { |
|---|
| 1141 | | - uint32_t wm_pipe[3]; |
|---|
| 1142 | | - uint32_t wm_lp[3]; |
|---|
| 1143 | | - uint32_t wm_lp_spr[3]; |
|---|
| 1144 | | - uint32_t wm_linetime[3]; |
|---|
| 732 | + u32 wm_pipe[3]; |
|---|
| 733 | + u32 wm_lp[3]; |
|---|
| 734 | + u32 wm_lp_spr[3]; |
|---|
| 1145 | 735 | bool enable_fbc_wm; |
|---|
| 1146 | 736 | enum intel_ddb_partitioning partitioning; |
|---|
| 1147 | 737 | }; |
|---|
| 1148 | 738 | |
|---|
| 1149 | 739 | struct g4x_pipe_wm { |
|---|
| 1150 | | - uint16_t plane[I915_MAX_PLANES]; |
|---|
| 1151 | | - uint16_t fbc; |
|---|
| 740 | + u16 plane[I915_MAX_PLANES]; |
|---|
| 741 | + u16 fbc; |
|---|
| 1152 | 742 | }; |
|---|
| 1153 | 743 | |
|---|
| 1154 | 744 | struct g4x_sr_wm { |
|---|
| 1155 | | - uint16_t plane; |
|---|
| 1156 | | - uint16_t cursor; |
|---|
| 1157 | | - uint16_t fbc; |
|---|
| 745 | + u16 plane; |
|---|
| 746 | + u16 cursor; |
|---|
| 747 | + u16 fbc; |
|---|
| 1158 | 748 | }; |
|---|
| 1159 | 749 | |
|---|
| 1160 | 750 | struct vlv_wm_ddl_values { |
|---|
| 1161 | | - uint8_t plane[I915_MAX_PLANES]; |
|---|
| 751 | + u8 plane[I915_MAX_PLANES]; |
|---|
| 1162 | 752 | }; |
|---|
| 1163 | 753 | |
|---|
| 1164 | 754 | struct vlv_wm_values { |
|---|
| 1165 | 755 | struct g4x_pipe_wm pipe[3]; |
|---|
| 1166 | 756 | struct g4x_sr_wm sr; |
|---|
| 1167 | 757 | struct vlv_wm_ddl_values ddl[3]; |
|---|
| 1168 | | - uint8_t level; |
|---|
| 758 | + u8 level; |
|---|
| 1169 | 759 | bool cxsr; |
|---|
| 1170 | 760 | }; |
|---|
| 1171 | 761 | |
|---|
| .. | .. |
|---|
| 1179 | 769 | }; |
|---|
| 1180 | 770 | |
|---|
| 1181 | 771 | struct skl_ddb_entry { |
|---|
| 1182 | | - uint16_t start, end; /* in number of blocks, 'end' is exclusive */ |
|---|
| 772 | + u16 start, end; /* in number of blocks, 'end' is exclusive */ |
|---|
| 1183 | 773 | }; |
|---|
| 1184 | 774 | |
|---|
| 1185 | | -static inline uint16_t skl_ddb_entry_size(const struct skl_ddb_entry *entry) |
|---|
| 775 | +static inline u16 skl_ddb_entry_size(const struct skl_ddb_entry *entry) |
|---|
| 1186 | 776 | { |
|---|
| 1187 | 777 | return entry->end - entry->start; |
|---|
| 1188 | 778 | } |
|---|
| .. | .. |
|---|
| 1196 | 786 | return false; |
|---|
| 1197 | 787 | } |
|---|
| 1198 | 788 | |
|---|
| 1199 | | -struct skl_ddb_allocation { |
|---|
| 1200 | | - /* packed/y */ |
|---|
| 1201 | | - struct skl_ddb_entry plane[I915_MAX_PIPES][I915_MAX_PLANES]; |
|---|
| 1202 | | - struct skl_ddb_entry uv_plane[I915_MAX_PIPES][I915_MAX_PLANES]; |
|---|
| 1203 | | - u8 enabled_slices; /* GEN11 has configurable 2 slices */ |
|---|
| 1204 | | -}; |
|---|
| 1205 | | - |
|---|
| 1206 | | -struct skl_ddb_values { |
|---|
| 1207 | | - unsigned dirty_pipes; |
|---|
| 1208 | | - struct skl_ddb_allocation ddb; |
|---|
| 1209 | | -}; |
|---|
| 1210 | | - |
|---|
| 1211 | | -struct skl_wm_level { |
|---|
| 1212 | | - bool plane_en; |
|---|
| 1213 | | - uint16_t plane_res_b; |
|---|
| 1214 | | - uint8_t plane_res_l; |
|---|
| 1215 | | -}; |
|---|
| 1216 | | - |
|---|
| 1217 | | -/* Stores plane specific WM parameters */ |
|---|
| 1218 | | -struct skl_wm_params { |
|---|
| 1219 | | - bool x_tiled, y_tiled; |
|---|
| 1220 | | - bool rc_surface; |
|---|
| 1221 | | - bool is_planar; |
|---|
| 1222 | | - uint32_t width; |
|---|
| 1223 | | - uint8_t cpp; |
|---|
| 1224 | | - uint32_t plane_pixel_rate; |
|---|
| 1225 | | - uint32_t y_min_scanlines; |
|---|
| 1226 | | - uint32_t plane_bytes_per_line; |
|---|
| 1227 | | - uint_fixed_16_16_t plane_blocks_per_line; |
|---|
| 1228 | | - uint_fixed_16_16_t y_tile_minimum; |
|---|
| 1229 | | - uint32_t linetime_us; |
|---|
| 1230 | | - uint32_t dbuf_block_size; |
|---|
| 1231 | | -}; |
|---|
| 1232 | | - |
|---|
| 1233 | | -/* |
|---|
| 1234 | | - * This struct helps tracking the state needed for runtime PM, which puts the |
|---|
| 1235 | | - * device in PCI D3 state. Notice that when this happens, nothing on the |
|---|
| 1236 | | - * graphics device works, even register access, so we don't get interrupts nor |
|---|
| 1237 | | - * anything else. |
|---|
| 1238 | | - * |
|---|
| 1239 | | - * Every piece of our code that needs to actually touch the hardware needs to |
|---|
| 1240 | | - * either call intel_runtime_pm_get or call intel_display_power_get with the |
|---|
| 1241 | | - * appropriate power domain. |
|---|
| 1242 | | - * |
|---|
| 1243 | | - * Our driver uses the autosuspend delay feature, which means we'll only really |
|---|
| 1244 | | - * suspend if we stay with zero refcount for a certain amount of time. The |
|---|
| 1245 | | - * default value is currently very conservative (see intel_runtime_pm_enable), but |
|---|
| 1246 | | - * it can be changed with the standard runtime PM files from sysfs. |
|---|
| 1247 | | - * |
|---|
| 1248 | | - * The irqs_disabled variable becomes true exactly after we disable the IRQs and |
|---|
| 1249 | | - * goes back to false exactly before we reenable the IRQs. We use this variable |
|---|
| 1250 | | - * to check if someone is trying to enable/disable IRQs while they're supposed |
|---|
| 1251 | | - * to be disabled. This shouldn't happen and we'll print some error messages in |
|---|
| 1252 | | - * case it happens. |
|---|
| 1253 | | - * |
|---|
| 1254 | | - * For more, read the Documentation/power/runtime_pm.txt. |
|---|
| 1255 | | - */ |
|---|
| 1256 | | -struct i915_runtime_pm { |
|---|
| 1257 | | - atomic_t wakeref_count; |
|---|
| 1258 | | - bool suspended; |
|---|
| 1259 | | - bool irqs_enabled; |
|---|
| 1260 | | -}; |
|---|
| 1261 | | - |
|---|
| 1262 | | -enum intel_pipe_crc_source { |
|---|
| 1263 | | - INTEL_PIPE_CRC_SOURCE_NONE, |
|---|
| 1264 | | - INTEL_PIPE_CRC_SOURCE_PLANE1, |
|---|
| 1265 | | - INTEL_PIPE_CRC_SOURCE_PLANE2, |
|---|
| 1266 | | - INTEL_PIPE_CRC_SOURCE_PF, |
|---|
| 1267 | | - INTEL_PIPE_CRC_SOURCE_PIPE, |
|---|
| 1268 | | - /* TV/DP on pre-gen5/vlv can't use the pipe source. */ |
|---|
| 1269 | | - INTEL_PIPE_CRC_SOURCE_TV, |
|---|
| 1270 | | - INTEL_PIPE_CRC_SOURCE_DP_B, |
|---|
| 1271 | | - INTEL_PIPE_CRC_SOURCE_DP_C, |
|---|
| 1272 | | - INTEL_PIPE_CRC_SOURCE_DP_D, |
|---|
| 1273 | | - INTEL_PIPE_CRC_SOURCE_AUTO, |
|---|
| 1274 | | - INTEL_PIPE_CRC_SOURCE_MAX, |
|---|
| 1275 | | -}; |
|---|
| 1276 | | - |
|---|
| 1277 | | -#define INTEL_PIPE_CRC_ENTRIES_NR 128 |
|---|
| 1278 | | -struct intel_pipe_crc { |
|---|
| 1279 | | - spinlock_t lock; |
|---|
| 1280 | | - int skipped; |
|---|
| 1281 | | - enum intel_pipe_crc_source source; |
|---|
| 1282 | | -}; |
|---|
| 1283 | | - |
|---|
| 1284 | 789 | struct i915_frontbuffer_tracking { |
|---|
| 1285 | 790 | spinlock_t lock; |
|---|
| 1286 | 791 | |
|---|
| .. | .. |
|---|
| 1292 | 797 | unsigned flip_bits; |
|---|
| 1293 | 798 | }; |
|---|
| 1294 | 799 | |
|---|
| 1295 | | -struct i915_wa_reg { |
|---|
| 1296 | | - u32 addr; |
|---|
| 1297 | | - u32 value; |
|---|
| 1298 | | - /* bitmask representing WA bits */ |
|---|
| 1299 | | - u32 mask; |
|---|
| 1300 | | -}; |
|---|
| 1301 | | - |
|---|
| 1302 | | -#define I915_MAX_WA_REGS 16 |
|---|
| 1303 | | - |
|---|
| 1304 | | -struct i915_workarounds { |
|---|
| 1305 | | - struct i915_wa_reg reg[I915_MAX_WA_REGS]; |
|---|
| 1306 | | - u32 count; |
|---|
| 1307 | | -}; |
|---|
| 1308 | | - |
|---|
| 1309 | 800 | struct i915_virtual_gpu { |
|---|
| 801 | + struct mutex lock; /* serialises sending of g2v_notify command pkts */ |
|---|
| 1310 | 802 | bool active; |
|---|
| 1311 | 803 | u32 caps; |
|---|
| 1312 | 804 | }; |
|---|
| 1313 | 805 | |
|---|
| 1314 | | -/* used in computing the new watermarks state */ |
|---|
| 1315 | | -struct intel_wm_config { |
|---|
| 1316 | | - unsigned int num_pipes_active; |
|---|
| 1317 | | - bool sprites_enabled; |
|---|
| 1318 | | - bool sprites_scaled; |
|---|
| 1319 | | -}; |
|---|
| 1320 | | - |
|---|
| 1321 | | -struct i915_oa_format { |
|---|
| 1322 | | - u32 format; |
|---|
| 1323 | | - int size; |
|---|
| 1324 | | -}; |
|---|
| 1325 | | - |
|---|
| 1326 | | -struct i915_oa_reg { |
|---|
| 1327 | | - i915_reg_t addr; |
|---|
| 1328 | | - u32 value; |
|---|
| 1329 | | -}; |
|---|
| 1330 | | - |
|---|
| 1331 | | -struct i915_oa_config { |
|---|
| 1332 | | - char uuid[UUID_STRING_LEN + 1]; |
|---|
| 1333 | | - int id; |
|---|
| 1334 | | - |
|---|
| 1335 | | - const struct i915_oa_reg *mux_regs; |
|---|
| 1336 | | - u32 mux_regs_len; |
|---|
| 1337 | | - const struct i915_oa_reg *b_counter_regs; |
|---|
| 1338 | | - u32 b_counter_regs_len; |
|---|
| 1339 | | - const struct i915_oa_reg *flex_regs; |
|---|
| 1340 | | - u32 flex_regs_len; |
|---|
| 1341 | | - |
|---|
| 1342 | | - struct attribute_group sysfs_metric; |
|---|
| 1343 | | - struct attribute *attrs[2]; |
|---|
| 1344 | | - struct device_attribute sysfs_metric_id; |
|---|
| 1345 | | - |
|---|
| 1346 | | - atomic_t ref_count; |
|---|
| 1347 | | -}; |
|---|
| 1348 | | - |
|---|
| 1349 | | -struct i915_perf_stream; |
|---|
| 1350 | | - |
|---|
| 1351 | | -/** |
|---|
| 1352 | | - * struct i915_perf_stream_ops - the OPs to support a specific stream type |
|---|
| 1353 | | - */ |
|---|
| 1354 | | -struct i915_perf_stream_ops { |
|---|
| 1355 | | - /** |
|---|
| 1356 | | - * @enable: Enables the collection of HW samples, either in response to |
|---|
| 1357 | | - * `I915_PERF_IOCTL_ENABLE` or implicitly called when stream is opened |
|---|
| 1358 | | - * without `I915_PERF_FLAG_DISABLED`. |
|---|
| 1359 | | - */ |
|---|
| 1360 | | - void (*enable)(struct i915_perf_stream *stream); |
|---|
| 1361 | | - |
|---|
| 1362 | | - /** |
|---|
| 1363 | | - * @disable: Disables the collection of HW samples, either in response |
|---|
| 1364 | | - * to `I915_PERF_IOCTL_DISABLE` or implicitly called before destroying |
|---|
| 1365 | | - * the stream. |
|---|
| 1366 | | - */ |
|---|
| 1367 | | - void (*disable)(struct i915_perf_stream *stream); |
|---|
| 1368 | | - |
|---|
| 1369 | | - /** |
|---|
| 1370 | | - * @poll_wait: Call poll_wait, passing a wait queue that will be woken |
|---|
| 1371 | | - * once there is something ready to read() for the stream |
|---|
| 1372 | | - */ |
|---|
| 1373 | | - void (*poll_wait)(struct i915_perf_stream *stream, |
|---|
| 1374 | | - struct file *file, |
|---|
| 1375 | | - poll_table *wait); |
|---|
| 1376 | | - |
|---|
| 1377 | | - /** |
|---|
| 1378 | | - * @wait_unlocked: For handling a blocking read, wait until there is |
|---|
| 1379 | | - * something to ready to read() for the stream. E.g. wait on the same |
|---|
| 1380 | | - * wait queue that would be passed to poll_wait(). |
|---|
| 1381 | | - */ |
|---|
| 1382 | | - int (*wait_unlocked)(struct i915_perf_stream *stream); |
|---|
| 1383 | | - |
|---|
| 1384 | | - /** |
|---|
| 1385 | | - * @read: Copy buffered metrics as records to userspace |
|---|
| 1386 | | - * **buf**: the userspace, destination buffer |
|---|
| 1387 | | - * **count**: the number of bytes to copy, requested by userspace |
|---|
| 1388 | | - * **offset**: zero at the start of the read, updated as the read |
|---|
| 1389 | | - * proceeds, it represents how many bytes have been copied so far and |
|---|
| 1390 | | - * the buffer offset for copying the next record. |
|---|
| 1391 | | - * |
|---|
| 1392 | | - * Copy as many buffered i915 perf samples and records for this stream |
|---|
| 1393 | | - * to userspace as will fit in the given buffer. |
|---|
| 1394 | | - * |
|---|
| 1395 | | - * Only write complete records; returning -%ENOSPC if there isn't room |
|---|
| 1396 | | - * for a complete record. |
|---|
| 1397 | | - * |
|---|
| 1398 | | - * Return any error condition that results in a short read such as |
|---|
| 1399 | | - * -%ENOSPC or -%EFAULT, even though these may be squashed before |
|---|
| 1400 | | - * returning to userspace. |
|---|
| 1401 | | - */ |
|---|
| 1402 | | - int (*read)(struct i915_perf_stream *stream, |
|---|
| 1403 | | - char __user *buf, |
|---|
| 1404 | | - size_t count, |
|---|
| 1405 | | - size_t *offset); |
|---|
| 1406 | | - |
|---|
| 1407 | | - /** |
|---|
| 1408 | | - * @destroy: Cleanup any stream specific resources. |
|---|
| 1409 | | - * |
|---|
| 1410 | | - * The stream will always be disabled before this is called. |
|---|
| 1411 | | - */ |
|---|
| 1412 | | - void (*destroy)(struct i915_perf_stream *stream); |
|---|
| 1413 | | -}; |
|---|
| 1414 | | - |
|---|
| 1415 | | -/** |
|---|
| 1416 | | - * struct i915_perf_stream - state for a single open stream FD |
|---|
| 1417 | | - */ |
|---|
| 1418 | | -struct i915_perf_stream { |
|---|
| 1419 | | - /** |
|---|
| 1420 | | - * @dev_priv: i915 drm device |
|---|
| 1421 | | - */ |
|---|
| 1422 | | - struct drm_i915_private *dev_priv; |
|---|
| 1423 | | - |
|---|
| 1424 | | - /** |
|---|
| 1425 | | - * @link: Links the stream into ``&drm_i915_private->streams`` |
|---|
| 1426 | | - */ |
|---|
| 1427 | | - struct list_head link; |
|---|
| 1428 | | - |
|---|
| 1429 | | - /** |
|---|
| 1430 | | - * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*` |
|---|
| 1431 | | - * properties given when opening a stream, representing the contents |
|---|
| 1432 | | - * of a single sample as read() by userspace. |
|---|
| 1433 | | - */ |
|---|
| 1434 | | - u32 sample_flags; |
|---|
| 1435 | | - |
|---|
| 1436 | | - /** |
|---|
| 1437 | | - * @sample_size: Considering the configured contents of a sample |
|---|
| 1438 | | - * combined with the required header size, this is the total size |
|---|
| 1439 | | - * of a single sample record. |
|---|
| 1440 | | - */ |
|---|
| 1441 | | - int sample_size; |
|---|
| 1442 | | - |
|---|
| 1443 | | - /** |
|---|
| 1444 | | - * @ctx: %NULL if measuring system-wide across all contexts or a |
|---|
| 1445 | | - * specific context that is being monitored. |
|---|
| 1446 | | - */ |
|---|
| 1447 | | - struct i915_gem_context *ctx; |
|---|
| 1448 | | - |
|---|
| 1449 | | - /** |
|---|
| 1450 | | - * @enabled: Whether the stream is currently enabled, considering |
|---|
| 1451 | | - * whether the stream was opened in a disabled state and based |
|---|
| 1452 | | - * on `I915_PERF_IOCTL_ENABLE` and `I915_PERF_IOCTL_DISABLE` calls. |
|---|
| 1453 | | - */ |
|---|
| 1454 | | - bool enabled; |
|---|
| 1455 | | - |
|---|
| 1456 | | - /** |
|---|
| 1457 | | - * @ops: The callbacks providing the implementation of this specific |
|---|
| 1458 | | - * type of configured stream. |
|---|
| 1459 | | - */ |
|---|
| 1460 | | - const struct i915_perf_stream_ops *ops; |
|---|
| 1461 | | - |
|---|
| 1462 | | - /** |
|---|
| 1463 | | - * @oa_config: The OA configuration used by the stream. |
|---|
| 1464 | | - */ |
|---|
| 1465 | | - struct i915_oa_config *oa_config; |
|---|
| 1466 | | -}; |
|---|
| 1467 | | - |
|---|
| 1468 | | -/** |
|---|
| 1469 | | - * struct i915_oa_ops - Gen specific implementation of an OA unit stream |
|---|
| 1470 | | - */ |
|---|
| 1471 | | -struct i915_oa_ops { |
|---|
| 1472 | | - /** |
|---|
| 1473 | | - * @is_valid_b_counter_reg: Validates register's address for |
|---|
| 1474 | | - * programming boolean counters for a particular platform. |
|---|
| 1475 | | - */ |
|---|
| 1476 | | - bool (*is_valid_b_counter_reg)(struct drm_i915_private *dev_priv, |
|---|
| 1477 | | - u32 addr); |
|---|
| 1478 | | - |
|---|
| 1479 | | - /** |
|---|
| 1480 | | - * @is_valid_mux_reg: Validates register's address for programming mux |
|---|
| 1481 | | - * for a particular platform. |
|---|
| 1482 | | - */ |
|---|
| 1483 | | - bool (*is_valid_mux_reg)(struct drm_i915_private *dev_priv, u32 addr); |
|---|
| 1484 | | - |
|---|
| 1485 | | - /** |
|---|
| 1486 | | - * @is_valid_flex_reg: Validates register's address for programming |
|---|
| 1487 | | - * flex EU filtering for a particular platform. |
|---|
| 1488 | | - */ |
|---|
| 1489 | | - bool (*is_valid_flex_reg)(struct drm_i915_private *dev_priv, u32 addr); |
|---|
| 1490 | | - |
|---|
| 1491 | | - /** |
|---|
| 1492 | | - * @init_oa_buffer: Resets the head and tail pointers of the |
|---|
| 1493 | | - * circular buffer for periodic OA reports. |
|---|
| 1494 | | - * |
|---|
| 1495 | | - * Called when first opening a stream for OA metrics, but also may be |
|---|
| 1496 | | - * called in response to an OA buffer overflow or other error |
|---|
| 1497 | | - * condition. |
|---|
| 1498 | | - * |
|---|
| 1499 | | - * Note it may be necessary to clear the full OA buffer here as part of |
|---|
| 1500 | | - * maintaining the invariable that new reports must be written to |
|---|
| 1501 | | - * zeroed memory for us to be able to reliable detect if an expected |
|---|
| 1502 | | - * report has not yet landed in memory. (At least on Haswell the OA |
|---|
| 1503 | | - * buffer tail pointer is not synchronized with reports being visible |
|---|
| 1504 | | - * to the CPU) |
|---|
| 1505 | | - */ |
|---|
| 1506 | | - void (*init_oa_buffer)(struct drm_i915_private *dev_priv); |
|---|
| 1507 | | - |
|---|
| 1508 | | - /** |
|---|
| 1509 | | - * @enable_metric_set: Selects and applies any MUX configuration to set |
|---|
| 1510 | | - * up the Boolean and Custom (B/C) counters that are part of the |
|---|
| 1511 | | - * counter reports being sampled. May apply system constraints such as |
|---|
| 1512 | | - * disabling EU clock gating as required. |
|---|
| 1513 | | - */ |
|---|
| 1514 | | - int (*enable_metric_set)(struct drm_i915_private *dev_priv, |
|---|
| 1515 | | - const struct i915_oa_config *oa_config); |
|---|
| 1516 | | - |
|---|
| 1517 | | - /** |
|---|
| 1518 | | - * @disable_metric_set: Remove system constraints associated with using |
|---|
| 1519 | | - * the OA unit. |
|---|
| 1520 | | - */ |
|---|
| 1521 | | - void (*disable_metric_set)(struct drm_i915_private *dev_priv); |
|---|
| 1522 | | - |
|---|
| 1523 | | - /** |
|---|
| 1524 | | - * @oa_enable: Enable periodic sampling |
|---|
| 1525 | | - */ |
|---|
| 1526 | | - void (*oa_enable)(struct drm_i915_private *dev_priv); |
|---|
| 1527 | | - |
|---|
| 1528 | | - /** |
|---|
| 1529 | | - * @oa_disable: Disable periodic sampling |
|---|
| 1530 | | - */ |
|---|
| 1531 | | - void (*oa_disable)(struct drm_i915_private *dev_priv); |
|---|
| 1532 | | - |
|---|
| 1533 | | - /** |
|---|
| 1534 | | - * @read: Copy data from the circular OA buffer into a given userspace |
|---|
| 1535 | | - * buffer. |
|---|
| 1536 | | - */ |
|---|
| 1537 | | - int (*read)(struct i915_perf_stream *stream, |
|---|
| 1538 | | - char __user *buf, |
|---|
| 1539 | | - size_t count, |
|---|
| 1540 | | - size_t *offset); |
|---|
| 1541 | | - |
|---|
| 1542 | | - /** |
|---|
| 1543 | | - * @oa_hw_tail_read: read the OA tail pointer register |
|---|
| 1544 | | - * |
|---|
| 1545 | | - * In particular this enables us to share all the fiddly code for |
|---|
| 1546 | | - * handling the OA unit tail pointer race that affects multiple |
|---|
| 1547 | | - * generations. |
|---|
| 1548 | | - */ |
|---|
| 1549 | | - u32 (*oa_hw_tail_read)(struct drm_i915_private *dev_priv); |
|---|
| 1550 | | -}; |
|---|
| 1551 | | - |
|---|
| 1552 | | -struct intel_cdclk_state { |
|---|
| 806 | +struct intel_cdclk_config { |
|---|
| 1553 | 807 | unsigned int cdclk, vco, ref, bypass; |
|---|
| 1554 | 808 | u8 voltage_level; |
|---|
| 809 | +}; |
|---|
| 810 | + |
|---|
| 811 | +struct i915_selftest_stash { |
|---|
| 812 | + atomic_t counter; |
|---|
| 1555 | 813 | }; |
|---|
| 1556 | 814 | |
|---|
| 1557 | 815 | struct drm_i915_private { |
|---|
| 1558 | 816 | struct drm_device drm; |
|---|
| 1559 | 817 | |
|---|
| 1560 | | - struct kmem_cache *objects; |
|---|
| 1561 | | - struct kmem_cache *vmas; |
|---|
| 1562 | | - struct kmem_cache *luts; |
|---|
| 1563 | | - struct kmem_cache *requests; |
|---|
| 1564 | | - struct kmem_cache *dependencies; |
|---|
| 1565 | | - struct kmem_cache *priorities; |
|---|
| 818 | + /* FIXME: Device release actions should all be moved to drmm_ */ |
|---|
| 819 | + bool do_release; |
|---|
| 1566 | 820 | |
|---|
| 1567 | | - const struct intel_device_info info; |
|---|
| 821 | + /* i915 device parameters */ |
|---|
| 822 | + struct i915_params params; |
|---|
| 823 | + |
|---|
| 824 | + const struct intel_device_info __info; /* Use INTEL_INFO() to access. */ |
|---|
| 825 | + struct intel_runtime_info __runtime; /* Use RUNTIME_INFO() to access. */ |
|---|
| 1568 | 826 | struct intel_driver_caps caps; |
|---|
| 1569 | 827 | |
|---|
| 1570 | 828 | /** |
|---|
| .. | .. |
|---|
| 1591 | 849 | */ |
|---|
| 1592 | 850 | resource_size_t stolen_usable_size; /* Total size minus reserved ranges */ |
|---|
| 1593 | 851 | |
|---|
| 1594 | | - void __iomem *regs; |
|---|
| 1595 | | - |
|---|
| 1596 | 852 | struct intel_uncore uncore; |
|---|
| 1597 | | - |
|---|
| 1598 | | - struct mutex tlb_invalidate_lock; |
|---|
| 853 | + struct intel_uncore_mmio_debug mmio_debug; |
|---|
| 1599 | 854 | |
|---|
| 1600 | 855 | struct i915_virtual_gpu vgpu; |
|---|
| 1601 | 856 | |
|---|
| 1602 | 857 | struct intel_gvt *gvt; |
|---|
| 1603 | 858 | |
|---|
| 1604 | 859 | struct intel_wopcm wopcm; |
|---|
| 1605 | | - |
|---|
| 1606 | | - struct intel_huc huc; |
|---|
| 1607 | | - struct intel_guc guc; |
|---|
| 1608 | 860 | |
|---|
| 1609 | 861 | struct intel_csr csr; |
|---|
| 1610 | 862 | |
|---|
| .. | .. |
|---|
| 1615 | 867 | struct mutex gmbus_mutex; |
|---|
| 1616 | 868 | |
|---|
| 1617 | 869 | /** |
|---|
| 1618 | | - * Base address of the gmbus and gpio block. |
|---|
| 870 | + * Base address of where the gmbus and gpio blocks are located (either |
|---|
| 871 | + * on PCH or on SoC for platforms without PCH). |
|---|
| 1619 | 872 | */ |
|---|
| 1620 | | - uint32_t gpio_mmio_base; |
|---|
| 873 | + u32 gpio_mmio_base; |
|---|
| 874 | + |
|---|
| 875 | + u32 hsw_psr_mmio_adjust; |
|---|
| 1621 | 876 | |
|---|
| 1622 | 877 | /* MMIO base address for MIPI regs */ |
|---|
| 1623 | | - uint32_t mipi_mmio_base; |
|---|
| 878 | + u32 mipi_mmio_base; |
|---|
| 1624 | 879 | |
|---|
| 1625 | | - uint32_t psr_mmio_base; |
|---|
| 1626 | | - |
|---|
| 1627 | | - uint32_t pps_mmio_base; |
|---|
| 880 | + u32 pps_mmio_base; |
|---|
| 1628 | 881 | |
|---|
| 1629 | 882 | wait_queue_head_t gmbus_wait_queue; |
|---|
| 1630 | 883 | |
|---|
| 1631 | 884 | struct pci_dev *bridge_dev; |
|---|
| 1632 | | - struct intel_engine_cs *engine[I915_NUM_ENGINES]; |
|---|
| 1633 | | - /* Context used internally to idle the GPU and setup initial state */ |
|---|
| 1634 | | - struct i915_gem_context *kernel_context; |
|---|
| 1635 | | - /* Context only to be used for injecting preemption commands */ |
|---|
| 1636 | | - struct i915_gem_context *preempt_context; |
|---|
| 1637 | | - struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1] |
|---|
| 1638 | | - [MAX_ENGINE_INSTANCE + 1]; |
|---|
| 1639 | 885 | |
|---|
| 1640 | | - struct drm_dma_handle *status_page_dmah; |
|---|
| 886 | + struct rb_root uabi_engines; |
|---|
| 887 | + |
|---|
| 1641 | 888 | struct resource mch_res; |
|---|
| 1642 | 889 | |
|---|
| 1643 | 890 | /* protects the irq masks */ |
|---|
| .. | .. |
|---|
| 1645 | 892 | |
|---|
| 1646 | 893 | bool display_irqs_enabled; |
|---|
| 1647 | 894 | |
|---|
| 1648 | | - /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */ |
|---|
| 1649 | | - struct pm_qos_request pm_qos; |
|---|
| 1650 | | - |
|---|
| 1651 | 895 | /* Sideband mailbox protection */ |
|---|
| 1652 | 896 | struct mutex sb_lock; |
|---|
| 897 | + struct pm_qos_request sb_qos; |
|---|
| 1653 | 898 | |
|---|
| 1654 | 899 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
|---|
| 1655 | 900 | union { |
|---|
| 1656 | 901 | u32 irq_mask; |
|---|
| 1657 | 902 | u32 de_irq_mask[I915_MAX_PIPES]; |
|---|
| 1658 | 903 | }; |
|---|
| 1659 | | - u32 gt_irq_mask; |
|---|
| 1660 | | - u32 pm_imr; |
|---|
| 1661 | | - u32 pm_ier; |
|---|
| 1662 | | - u32 pm_rps_events; |
|---|
| 1663 | | - u32 pm_guc_events; |
|---|
| 1664 | 904 | u32 pipestat_irq_mask[I915_MAX_PIPES]; |
|---|
| 1665 | 905 | |
|---|
| 1666 | 906 | struct i915_hotplug hotplug; |
|---|
| .. | .. |
|---|
| 1677 | 917 | /* backlight registers and fields in struct intel_panel */ |
|---|
| 1678 | 918 | struct mutex backlight_lock; |
|---|
| 1679 | 919 | |
|---|
| 1680 | | - /* LVDS info */ |
|---|
| 1681 | | - bool no_aux_handshake; |
|---|
| 1682 | | - |
|---|
| 1683 | 920 | /* protects panel power sequencer state */ |
|---|
| 1684 | 921 | struct mutex pps_mutex; |
|---|
| 1685 | | - |
|---|
| 1686 | | - struct drm_i915_fence_reg fence_regs[I915_MAX_NUM_FENCES]; /* assume 965 */ |
|---|
| 1687 | | - int num_fence_regs; /* 8 on pre-965, 16 otherwise */ |
|---|
| 1688 | 922 | |
|---|
| 1689 | 923 | unsigned int fsb_freq, mem_freq, is_ddr3; |
|---|
| 1690 | 924 | unsigned int skl_preferred_vco_freq; |
|---|
| 1691 | 925 | unsigned int max_cdclk_freq; |
|---|
| 1692 | 926 | |
|---|
| 1693 | 927 | unsigned int max_dotclk_freq; |
|---|
| 1694 | | - unsigned int rawclk_freq; |
|---|
| 1695 | 928 | unsigned int hpll_freq; |
|---|
| 1696 | 929 | unsigned int fdi_pll_freq; |
|---|
| 1697 | 930 | unsigned int czclk_freq; |
|---|
| 1698 | 931 | |
|---|
| 1699 | 932 | struct { |
|---|
| 1700 | | - /* |
|---|
| 1701 | | - * The current logical cdclk state. |
|---|
| 1702 | | - * See intel_atomic_state.cdclk.logical |
|---|
| 1703 | | - * |
|---|
| 1704 | | - * For reading holding any crtc lock is sufficient, |
|---|
| 1705 | | - * for writing must hold all of them. |
|---|
| 1706 | | - */ |
|---|
| 1707 | | - struct intel_cdclk_state logical; |
|---|
| 1708 | | - /* |
|---|
| 1709 | | - * The current actual cdclk state. |
|---|
| 1710 | | - * See intel_atomic_state.cdclk.actual |
|---|
| 1711 | | - */ |
|---|
| 1712 | | - struct intel_cdclk_state actual; |
|---|
| 1713 | | - /* The current hardware cdclk state */ |
|---|
| 1714 | | - struct intel_cdclk_state hw; |
|---|
| 933 | + /* The current hardware cdclk configuration */ |
|---|
| 934 | + struct intel_cdclk_config hw; |
|---|
| 935 | + |
|---|
| 936 | + /* cdclk, divider, and ratio table from bspec */ |
|---|
| 937 | + const struct intel_cdclk_vals *table; |
|---|
| 938 | + |
|---|
| 939 | + struct intel_global_obj obj; |
|---|
| 1715 | 940 | } cdclk; |
|---|
| 941 | + |
|---|
| 942 | + struct { |
|---|
| 943 | + /* The current hardware dbuf configuration */ |
|---|
| 944 | + u8 enabled_slices; |
|---|
| 945 | + |
|---|
| 946 | + struct intel_global_obj obj; |
|---|
| 947 | + } dbuf; |
|---|
| 1716 | 948 | |
|---|
| 1717 | 949 | /** |
|---|
| 1718 | 950 | * wq - Driver workqueue for GEM. |
|---|
| .. | .. |
|---|
| 1725 | 957 | |
|---|
| 1726 | 958 | /* ordered wq for modesets */ |
|---|
| 1727 | 959 | struct workqueue_struct *modeset_wq; |
|---|
| 960 | + /* unbound hipri wq for page flips/plane updates */ |
|---|
| 961 | + struct workqueue_struct *flip_wq; |
|---|
| 1728 | 962 | |
|---|
| 1729 | 963 | /* Display functions */ |
|---|
| 1730 | 964 | struct drm_i915_display_funcs display; |
|---|
| .. | .. |
|---|
| 1742 | 976 | |
|---|
| 1743 | 977 | struct i915_gem_mm mm; |
|---|
| 1744 | 978 | DECLARE_HASHTABLE(mm_structs, 7); |
|---|
| 1745 | | - struct mutex mm_lock; |
|---|
| 1746 | | - |
|---|
| 1747 | | - struct intel_ppat ppat; |
|---|
| 979 | + spinlock_t mm_lock; |
|---|
| 1748 | 980 | |
|---|
| 1749 | 981 | /* Kernel Modesetting */ |
|---|
| 1750 | 982 | |
|---|
| 1751 | 983 | struct intel_crtc *plane_to_crtc_mapping[I915_MAX_PIPES]; |
|---|
| 1752 | 984 | struct intel_crtc *pipe_to_crtc_mapping[I915_MAX_PIPES]; |
|---|
| 1753 | 985 | |
|---|
| 1754 | | -#ifdef CONFIG_DEBUG_FS |
|---|
| 1755 | | - struct intel_pipe_crc pipe_crc[I915_MAX_PIPES]; |
|---|
| 1756 | | -#endif |
|---|
| 986 | + /** |
|---|
| 987 | + * dpll and cdclk state is protected by connection_mutex |
|---|
| 988 | + * dpll.lock serializes intel_{prepare,enable,disable}_shared_dpll. |
|---|
| 989 | + * Must be global rather than per dpll, because on some platforms plls |
|---|
| 990 | + * share registers. |
|---|
| 991 | + */ |
|---|
| 992 | + struct { |
|---|
| 993 | + struct mutex lock; |
|---|
| 1757 | 994 | |
|---|
| 1758 | | - /* dpll and cdclk state is protected by connection_mutex */ |
|---|
| 1759 | | - int num_shared_dpll; |
|---|
| 1760 | | - struct intel_shared_dpll shared_dplls[I915_NUM_PLLS]; |
|---|
| 1761 | | - const struct intel_dpll_mgr *dpll_mgr; |
|---|
| 995 | + int num_shared_dpll; |
|---|
| 996 | + struct intel_shared_dpll shared_dplls[I915_NUM_PLLS]; |
|---|
| 997 | + const struct intel_dpll_mgr *mgr; |
|---|
| 998 | + |
|---|
| 999 | + struct { |
|---|
| 1000 | + int nssc; |
|---|
| 1001 | + int ssc; |
|---|
| 1002 | + } ref_clks; |
|---|
| 1003 | + } dpll; |
|---|
| 1004 | + |
|---|
| 1005 | + struct list_head global_obj_list; |
|---|
| 1762 | 1006 | |
|---|
| 1763 | 1007 | /* |
|---|
| 1764 | | - * dpll_lock serializes intel_{prepare,enable,disable}_shared_dpll. |
|---|
| 1765 | | - * Must be global rather than per dpll, because on some platforms |
|---|
| 1766 | | - * plls share registers. |
|---|
| 1008 | + * For reading active_pipes holding any crtc lock is |
|---|
| 1009 | + * sufficient, for writing must hold all of them. |
|---|
| 1767 | 1010 | */ |
|---|
| 1768 | | - struct mutex dpll_lock; |
|---|
| 1011 | + u8 active_pipes; |
|---|
| 1769 | 1012 | |
|---|
| 1770 | | - unsigned int active_crtcs; |
|---|
| 1771 | | - /* minimum acceptable cdclk for each pipe */ |
|---|
| 1772 | | - int min_cdclk[I915_MAX_PIPES]; |
|---|
| 1773 | | - /* minimum acceptable voltage level for each pipe */ |
|---|
| 1774 | | - u8 min_voltage_level[I915_MAX_PIPES]; |
|---|
| 1775 | | - |
|---|
| 1776 | | - int dpio_phy_iosf_port[I915_NUM_PHYS_VLV]; |
|---|
| 1777 | | - |
|---|
| 1778 | | - struct i915_workarounds workarounds; |
|---|
| 1013 | + struct i915_wa_list gt_wa_list; |
|---|
| 1779 | 1014 | |
|---|
| 1780 | 1015 | struct i915_frontbuffer_tracking fb_tracking; |
|---|
| 1781 | 1016 | |
|---|
| .. | .. |
|---|
| 1784 | 1019 | struct work_struct free_work; |
|---|
| 1785 | 1020 | } atomic_helper; |
|---|
| 1786 | 1021 | |
|---|
| 1787 | | - u16 orig_clock; |
|---|
| 1788 | | - |
|---|
| 1789 | 1022 | bool mchbar_need_disable; |
|---|
| 1790 | 1023 | |
|---|
| 1791 | 1024 | struct intel_l3_parity l3_parity; |
|---|
| 1792 | 1025 | |
|---|
| 1793 | | - /* Cannot be determined by PCIID. You must always read a register. */ |
|---|
| 1794 | | - u32 edram_cap; |
|---|
| 1026 | + /* |
|---|
| 1027 | + * HTI (aka HDPORT) state read during initial hw readout. Most |
|---|
| 1028 | + * platforms don't have HTI, so this will just stay 0. Those that do |
|---|
| 1029 | + * will use this later to figure out which PLLs and PHYs are unavailable |
|---|
| 1030 | + * for driver usage. |
|---|
| 1031 | + */ |
|---|
| 1032 | + u32 hti_state; |
|---|
| 1795 | 1033 | |
|---|
| 1796 | 1034 | /* |
|---|
| 1797 | | - * Protects RPS/RC6 register access and PCU communication. |
|---|
| 1798 | | - * Must be taken after struct_mutex if nested. Note that |
|---|
| 1799 | | - * this lock may be held for long periods of time when |
|---|
| 1800 | | - * talking to hw - so only take it when talking to hw! |
|---|
| 1035 | + * edram size in MB. |
|---|
| 1036 | + * Cannot be determined by PCIID. You must always read a register. |
|---|
| 1801 | 1037 | */ |
|---|
| 1802 | | - struct mutex pcu_lock; |
|---|
| 1803 | | - |
|---|
| 1804 | | - /* gen6+ GT PM state */ |
|---|
| 1805 | | - struct intel_gen6_power_mgmt gt_pm; |
|---|
| 1806 | | - |
|---|
| 1807 | | - /* ilk-only ips/rps state. Everything in here is protected by the global |
|---|
| 1808 | | - * mchdev_lock in intel_pm.c */ |
|---|
| 1809 | | - struct intel_ilk_power_mgmt ips; |
|---|
| 1038 | + u32 edram_size_mb; |
|---|
| 1810 | 1039 | |
|---|
| 1811 | 1040 | struct i915_power_domains power_domains; |
|---|
| 1812 | 1041 | |
|---|
| .. | .. |
|---|
| 1831 | 1060 | * |
|---|
| 1832 | 1061 | */ |
|---|
| 1833 | 1062 | struct mutex av_mutex; |
|---|
| 1834 | | - |
|---|
| 1835 | | - struct { |
|---|
| 1836 | | - struct list_head list; |
|---|
| 1837 | | - struct llist_head free_list; |
|---|
| 1838 | | - struct work_struct free_work; |
|---|
| 1839 | | - |
|---|
| 1840 | | - /* The hw wants to have a stable context identifier for the |
|---|
| 1841 | | - * lifetime of the context (for OA, PASID, faults, etc). |
|---|
| 1842 | | - * This is limited in execlists to 21 bits. |
|---|
| 1843 | | - */ |
|---|
| 1844 | | - struct ida hw_ida; |
|---|
| 1845 | | -#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */ |
|---|
| 1846 | | -#define MAX_GUC_CONTEXT_HW_ID (1 << 20) /* exclusive */ |
|---|
| 1847 | | -#define GEN11_MAX_CONTEXT_HW_ID (1<<11) /* exclusive */ |
|---|
| 1848 | | - } contexts; |
|---|
| 1063 | + int audio_power_refcount; |
|---|
| 1064 | + u32 audio_freq_cntrl; |
|---|
| 1849 | 1065 | |
|---|
| 1850 | 1066 | u32 fdi_rx_config; |
|---|
| 1851 | 1067 | |
|---|
| .. | .. |
|---|
| 1862 | 1078 | u32 suspend_count; |
|---|
| 1863 | 1079 | bool power_domains_suspended; |
|---|
| 1864 | 1080 | struct i915_suspend_saved_registers regfile; |
|---|
| 1865 | | - struct vlv_s0ix_state vlv_s0ix_state; |
|---|
| 1081 | + struct vlv_s0ix_state *vlv_s0ix_state; |
|---|
| 1866 | 1082 | |
|---|
| 1867 | 1083 | enum { |
|---|
| 1868 | 1084 | I915_SAGV_UNKNOWN = 0, |
|---|
| .. | .. |
|---|
| 1871 | 1087 | I915_SAGV_NOT_CONTROLLED |
|---|
| 1872 | 1088 | } sagv_status; |
|---|
| 1873 | 1089 | |
|---|
| 1090 | + u32 sagv_block_time_us; |
|---|
| 1091 | + |
|---|
| 1874 | 1092 | struct { |
|---|
| 1875 | 1093 | /* |
|---|
| 1876 | 1094 | * Raw watermark latency values: |
|---|
| .. | .. |
|---|
| 1878 | 1096 | * in 0.5us units for WM1+. |
|---|
| 1879 | 1097 | */ |
|---|
| 1880 | 1098 | /* primary */ |
|---|
| 1881 | | - uint16_t pri_latency[5]; |
|---|
| 1099 | + u16 pri_latency[5]; |
|---|
| 1882 | 1100 | /* sprite */ |
|---|
| 1883 | | - uint16_t spr_latency[5]; |
|---|
| 1101 | + u16 spr_latency[5]; |
|---|
| 1884 | 1102 | /* cursor */ |
|---|
| 1885 | | - uint16_t cur_latency[5]; |
|---|
| 1103 | + u16 cur_latency[5]; |
|---|
| 1886 | 1104 | /* |
|---|
| 1887 | 1105 | * Raw watermark memory latency values |
|---|
| 1888 | 1106 | * for SKL for all 8 levels |
|---|
| 1889 | 1107 | * in 1us units. |
|---|
| 1890 | 1108 | */ |
|---|
| 1891 | | - uint16_t skl_latency[8]; |
|---|
| 1109 | + u16 skl_latency[8]; |
|---|
| 1892 | 1110 | |
|---|
| 1893 | 1111 | /* current hardware state */ |
|---|
| 1894 | 1112 | union { |
|---|
| 1895 | 1113 | struct ilk_wm_values hw; |
|---|
| 1896 | | - struct skl_ddb_values skl_hw; |
|---|
| 1897 | 1114 | struct vlv_wm_values vlv; |
|---|
| 1898 | 1115 | struct g4x_wm_values g4x; |
|---|
| 1899 | 1116 | }; |
|---|
| 1900 | 1117 | |
|---|
| 1901 | | - uint8_t max_level; |
|---|
| 1118 | + u8 max_level; |
|---|
| 1902 | 1119 | |
|---|
| 1903 | 1120 | /* |
|---|
| 1904 | 1121 | * Should be held around atomic WM register writing; also |
|---|
| 1905 | 1122 | * protects * intel_crtc->wm.active and |
|---|
| 1906 | | - * cstate->wm.need_postvbl_update. |
|---|
| 1123 | + * crtc_state->wm.need_postvbl_update. |
|---|
| 1907 | 1124 | */ |
|---|
| 1908 | 1125 | struct mutex wm_mutex; |
|---|
| 1909 | 1126 | |
|---|
| .. | .. |
|---|
| 1911 | 1128 | * Set during HW readout of watermarks/DDB. Some platforms |
|---|
| 1912 | 1129 | * need to know when we're still using BIOS-provided values |
|---|
| 1913 | 1130 | * (which we don't fully trust). |
|---|
| 1131 | + * |
|---|
| 1132 | + * FIXME get rid of this. |
|---|
| 1914 | 1133 | */ |
|---|
| 1915 | 1134 | bool distrust_bios_wm; |
|---|
| 1916 | 1135 | } wm; |
|---|
| 1917 | 1136 | |
|---|
| 1918 | | - struct i915_runtime_pm runtime_pm; |
|---|
| 1137 | + struct dram_info { |
|---|
| 1138 | + bool valid; |
|---|
| 1139 | + bool is_16gb_dimm; |
|---|
| 1140 | + u8 num_channels; |
|---|
| 1141 | + u8 ranks; |
|---|
| 1142 | + u32 bandwidth_kbps; |
|---|
| 1143 | + bool symmetric_memory; |
|---|
| 1144 | + enum intel_dram_type { |
|---|
| 1145 | + INTEL_DRAM_UNKNOWN, |
|---|
| 1146 | + INTEL_DRAM_DDR3, |
|---|
| 1147 | + INTEL_DRAM_DDR4, |
|---|
| 1148 | + INTEL_DRAM_LPDDR3, |
|---|
| 1149 | + INTEL_DRAM_LPDDR4 |
|---|
| 1150 | + } type; |
|---|
| 1151 | + u8 num_qgv_points; |
|---|
| 1152 | + } dram_info; |
|---|
| 1919 | 1153 | |
|---|
| 1920 | | - struct { |
|---|
| 1921 | | - bool initialized; |
|---|
| 1154 | + struct intel_bw_info { |
|---|
| 1155 | + /* for each QGV point */ |
|---|
| 1156 | + unsigned int deratedbw[I915_NUM_QGV_POINTS]; |
|---|
| 1157 | + u8 num_qgv_points; |
|---|
| 1158 | + u8 num_planes; |
|---|
| 1159 | + } max_bw[6]; |
|---|
| 1922 | 1160 | |
|---|
| 1923 | | - struct kobject *metrics_kobj; |
|---|
| 1924 | | - struct ctl_table_header *sysctl_header; |
|---|
| 1161 | + struct intel_global_obj bw_obj; |
|---|
| 1925 | 1162 | |
|---|
| 1926 | | - /* |
|---|
| 1927 | | - * Lock associated with adding/modifying/removing OA configs |
|---|
| 1928 | | - * in dev_priv->perf.metrics_idr. |
|---|
| 1929 | | - */ |
|---|
| 1930 | | - struct mutex metrics_lock; |
|---|
| 1163 | + struct intel_runtime_pm runtime_pm; |
|---|
| 1931 | 1164 | |
|---|
| 1932 | | - /* |
|---|
| 1933 | | - * List of dynamic configurations, you need to hold |
|---|
| 1934 | | - * dev_priv->perf.metrics_lock to access it. |
|---|
| 1935 | | - */ |
|---|
| 1936 | | - struct idr metrics_idr; |
|---|
| 1937 | | - |
|---|
| 1938 | | - /* |
|---|
| 1939 | | - * Lock associated with anything below within this structure |
|---|
| 1940 | | - * except exclusive_stream. |
|---|
| 1941 | | - */ |
|---|
| 1942 | | - struct mutex lock; |
|---|
| 1943 | | - struct list_head streams; |
|---|
| 1944 | | - |
|---|
| 1945 | | - struct { |
|---|
| 1946 | | - /* |
|---|
| 1947 | | - * The stream currently using the OA unit. If accessed |
|---|
| 1948 | | - * outside a syscall associated to its file |
|---|
| 1949 | | - * descriptor, you need to hold |
|---|
| 1950 | | - * dev_priv->drm.struct_mutex. |
|---|
| 1951 | | - */ |
|---|
| 1952 | | - struct i915_perf_stream *exclusive_stream; |
|---|
| 1953 | | - |
|---|
| 1954 | | - struct intel_context *pinned_ctx; |
|---|
| 1955 | | - u32 specific_ctx_id; |
|---|
| 1956 | | - u32 specific_ctx_id_mask; |
|---|
| 1957 | | - |
|---|
| 1958 | | - struct hrtimer poll_check_timer; |
|---|
| 1959 | | - wait_queue_head_t poll_wq; |
|---|
| 1960 | | - bool pollin; |
|---|
| 1961 | | - |
|---|
| 1962 | | - /** |
|---|
| 1963 | | - * For rate limiting any notifications of spurious |
|---|
| 1964 | | - * invalid OA reports |
|---|
| 1965 | | - */ |
|---|
| 1966 | | - struct ratelimit_state spurious_report_rs; |
|---|
| 1967 | | - |
|---|
| 1968 | | - bool periodic; |
|---|
| 1969 | | - int period_exponent; |
|---|
| 1970 | | - |
|---|
| 1971 | | - struct i915_oa_config test_config; |
|---|
| 1972 | | - |
|---|
| 1973 | | - struct { |
|---|
| 1974 | | - struct i915_vma *vma; |
|---|
| 1975 | | - u8 *vaddr; |
|---|
| 1976 | | - u32 last_ctx_id; |
|---|
| 1977 | | - int format; |
|---|
| 1978 | | - int format_size; |
|---|
| 1979 | | - |
|---|
| 1980 | | - /** |
|---|
| 1981 | | - * Locks reads and writes to all head/tail state |
|---|
| 1982 | | - * |
|---|
| 1983 | | - * Consider: the head and tail pointer state |
|---|
| 1984 | | - * needs to be read consistently from a hrtimer |
|---|
| 1985 | | - * callback (atomic context) and read() fop |
|---|
| 1986 | | - * (user context) with tail pointer updates |
|---|
| 1987 | | - * happening in atomic context and head updates |
|---|
| 1988 | | - * in user context and the (unlikely) |
|---|
| 1989 | | - * possibility of read() errors needing to |
|---|
| 1990 | | - * reset all head/tail state. |
|---|
| 1991 | | - * |
|---|
| 1992 | | - * Note: Contention or performance aren't |
|---|
| 1993 | | - * currently a significant concern here |
|---|
| 1994 | | - * considering the relatively low frequency of |
|---|
| 1995 | | - * hrtimer callbacks (5ms period) and that |
|---|
| 1996 | | - * reads typically only happen in response to a |
|---|
| 1997 | | - * hrtimer event and likely complete before the |
|---|
| 1998 | | - * next callback. |
|---|
| 1999 | | - * |
|---|
| 2000 | | - * Note: This lock is not held *while* reading |
|---|
| 2001 | | - * and copying data to userspace so the value |
|---|
| 2002 | | - * of head observed in htrimer callbacks won't |
|---|
| 2003 | | - * represent any partial consumption of data. |
|---|
| 2004 | | - */ |
|---|
| 2005 | | - spinlock_t ptr_lock; |
|---|
| 2006 | | - |
|---|
| 2007 | | - /** |
|---|
| 2008 | | - * One 'aging' tail pointer and one 'aged' |
|---|
| 2009 | | - * tail pointer ready to used for reading. |
|---|
| 2010 | | - * |
|---|
| 2011 | | - * Initial values of 0xffffffff are invalid |
|---|
| 2012 | | - * and imply that an update is required |
|---|
| 2013 | | - * (and should be ignored by an attempted |
|---|
| 2014 | | - * read) |
|---|
| 2015 | | - */ |
|---|
| 2016 | | - struct { |
|---|
| 2017 | | - u32 offset; |
|---|
| 2018 | | - } tails[2]; |
|---|
| 2019 | | - |
|---|
| 2020 | | - /** |
|---|
| 2021 | | - * Index for the aged tail ready to read() |
|---|
| 2022 | | - * data up to. |
|---|
| 2023 | | - */ |
|---|
| 2024 | | - unsigned int aged_tail_idx; |
|---|
| 2025 | | - |
|---|
| 2026 | | - /** |
|---|
| 2027 | | - * A monotonic timestamp for when the current |
|---|
| 2028 | | - * aging tail pointer was read; used to |
|---|
| 2029 | | - * determine when it is old enough to trust. |
|---|
| 2030 | | - */ |
|---|
| 2031 | | - u64 aging_timestamp; |
|---|
| 2032 | | - |
|---|
| 2033 | | - /** |
|---|
| 2034 | | - * Although we can always read back the head |
|---|
| 2035 | | - * pointer register, we prefer to avoid |
|---|
| 2036 | | - * trusting the HW state, just to avoid any |
|---|
| 2037 | | - * risk that some hardware condition could |
|---|
| 2038 | | - * somehow bump the head pointer unpredictably |
|---|
| 2039 | | - * and cause us to forward the wrong OA buffer |
|---|
| 2040 | | - * data to userspace. |
|---|
| 2041 | | - */ |
|---|
| 2042 | | - u32 head; |
|---|
| 2043 | | - } oa_buffer; |
|---|
| 2044 | | - |
|---|
| 2045 | | - u32 gen7_latched_oastatus1; |
|---|
| 2046 | | - u32 ctx_oactxctrl_offset; |
|---|
| 2047 | | - u32 ctx_flexeu0_offset; |
|---|
| 2048 | | - |
|---|
| 2049 | | - /** |
|---|
| 2050 | | - * The RPT_ID/reason field for Gen8+ includes a bit |
|---|
| 2051 | | - * to determine if the CTX ID in the report is valid |
|---|
| 2052 | | - * but the specific bit differs between Gen 8 and 9 |
|---|
| 2053 | | - */ |
|---|
| 2054 | | - u32 gen8_valid_ctx_bit; |
|---|
| 2055 | | - |
|---|
| 2056 | | - struct i915_oa_ops ops; |
|---|
| 2057 | | - const struct i915_oa_format *oa_formats; |
|---|
| 2058 | | - } oa; |
|---|
| 2059 | | - } perf; |
|---|
| 1165 | + struct i915_perf perf; |
|---|
| 2060 | 1166 | |
|---|
| 2061 | 1167 | /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ |
|---|
| 1168 | + struct intel_gt gt; |
|---|
| 1169 | + |
|---|
| 2062 | 1170 | struct { |
|---|
| 2063 | | - void (*resume)(struct drm_i915_private *); |
|---|
| 2064 | | - void (*cleanup_engine)(struct intel_engine_cs *engine); |
|---|
| 1171 | + struct i915_gem_contexts { |
|---|
| 1172 | + spinlock_t lock; /* locks list */ |
|---|
| 1173 | + struct list_head list; |
|---|
| 2065 | 1174 | |
|---|
| 2066 | | - struct list_head timelines; |
|---|
| 1175 | + struct llist_head free_list; |
|---|
| 1176 | + struct work_struct free_work; |
|---|
| 1177 | + } contexts; |
|---|
| 2067 | 1178 | |
|---|
| 2068 | | - struct list_head active_rings; |
|---|
| 2069 | | - struct list_head closed_vma; |
|---|
| 2070 | | - u32 active_requests; |
|---|
| 2071 | | - u32 request_serial; |
|---|
| 2072 | | - |
|---|
| 2073 | | - /** |
|---|
| 2074 | | - * Is the GPU currently considered idle, or busy executing |
|---|
| 2075 | | - * userspace requests? Whilst idle, we allow runtime power |
|---|
| 2076 | | - * management to power down the hardware and display clocks. |
|---|
| 2077 | | - * In order to reduce the effect on performance, there |
|---|
| 2078 | | - * is a slight delay before we do so. |
|---|
| 1179 | + /* |
|---|
| 1180 | + * We replace the local file with a global mappings as the |
|---|
| 1181 | + * backing storage for the mmap is on the device and not |
|---|
| 1182 | + * on the struct file, and we do not want to prolong the |
|---|
| 1183 | + * lifetime of the local fd. To minimise the number of |
|---|
| 1184 | + * anonymous inodes we create, we use a global singleton to |
|---|
| 1185 | + * share the global mapping. |
|---|
| 2079 | 1186 | */ |
|---|
| 2080 | | - bool awake; |
|---|
| 1187 | + struct file *mmap_singleton; |
|---|
| 1188 | + } gem; |
|---|
| 2081 | 1189 | |
|---|
| 2082 | | - /** |
|---|
| 2083 | | - * The number of times we have woken up. |
|---|
| 2084 | | - */ |
|---|
| 2085 | | - unsigned int epoch; |
|---|
| 2086 | | -#define I915_EPOCH_INVALID 0 |
|---|
| 1190 | + u8 pch_ssc_use; |
|---|
| 2087 | 1191 | |
|---|
| 2088 | | - /** |
|---|
| 2089 | | - * We leave the user IRQ off as much as possible, |
|---|
| 2090 | | - * but this means that requests will finish and never |
|---|
| 2091 | | - * be retired once the system goes idle. Set a timer to |
|---|
| 2092 | | - * fire periodically while the ring is running. When it |
|---|
| 2093 | | - * fires, go retire requests. |
|---|
| 2094 | | - */ |
|---|
| 2095 | | - struct delayed_work retire_work; |
|---|
| 2096 | | - |
|---|
| 2097 | | - /** |
|---|
| 2098 | | - * When we detect an idle GPU, we want to turn on |
|---|
| 2099 | | - * powersaving features. So once we see that there |
|---|
| 2100 | | - * are no more requests outstanding and no more |
|---|
| 2101 | | - * arrive within a small period of time, we fire |
|---|
| 2102 | | - * off the idle_work. |
|---|
| 2103 | | - */ |
|---|
| 2104 | | - struct delayed_work idle_work; |
|---|
| 2105 | | - |
|---|
| 2106 | | - ktime_t last_init_time; |
|---|
| 2107 | | - } gt; |
|---|
| 1192 | + /* For i915gm/i945gm vblank irq workaround */ |
|---|
| 1193 | + u8 vblank_enabled; |
|---|
| 2108 | 1194 | |
|---|
| 2109 | 1195 | /* perform PHY state sanity checks? */ |
|---|
| 2110 | 1196 | bool chv_phy_assert[2]; |
|---|
| .. | .. |
|---|
| 2122 | 1208 | |
|---|
| 2123 | 1209 | struct i915_pmu pmu; |
|---|
| 2124 | 1210 | |
|---|
| 1211 | + struct i915_hdcp_comp_master *hdcp_master; |
|---|
| 1212 | + bool hdcp_comp_added; |
|---|
| 1213 | + |
|---|
| 1214 | + /* Mutex to protect the above hdcp component related values. */ |
|---|
| 1215 | + struct mutex hdcp_comp_mutex; |
|---|
| 1216 | + |
|---|
| 1217 | + I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;) |
|---|
| 1218 | + |
|---|
| 2125 | 1219 | /* |
|---|
| 2126 | 1220 | * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch |
|---|
| 2127 | 1221 | * will be rejected. Instead look for a better place. |
|---|
| .. | .. |
|---|
| 2135 | 1229 | |
|---|
| 2136 | 1230 | static inline struct drm_i915_private *kdev_to_i915(struct device *kdev) |
|---|
| 2137 | 1231 | { |
|---|
| 2138 | | - return to_i915(dev_get_drvdata(kdev)); |
|---|
| 1232 | + return dev_get_drvdata(kdev); |
|---|
| 2139 | 1233 | } |
|---|
| 2140 | 1234 | |
|---|
| 2141 | | -static inline struct drm_i915_private *wopcm_to_i915(struct intel_wopcm *wopcm) |
|---|
| 1235 | +static inline struct drm_i915_private *pdev_to_i915(struct pci_dev *pdev) |
|---|
| 2142 | 1236 | { |
|---|
| 2143 | | - return container_of(wopcm, struct drm_i915_private, wopcm); |
|---|
| 2144 | | -} |
|---|
| 2145 | | - |
|---|
| 2146 | | -static inline struct drm_i915_private *guc_to_i915(struct intel_guc *guc) |
|---|
| 2147 | | -{ |
|---|
| 2148 | | - return container_of(guc, struct drm_i915_private, guc); |
|---|
| 2149 | | -} |
|---|
| 2150 | | - |
|---|
| 2151 | | -static inline struct drm_i915_private *huc_to_i915(struct intel_huc *huc) |
|---|
| 2152 | | -{ |
|---|
| 2153 | | - return container_of(huc, struct drm_i915_private, huc); |
|---|
| 1237 | + return pci_get_drvdata(pdev); |
|---|
| 2154 | 1238 | } |
|---|
| 2155 | 1239 | |
|---|
| 2156 | 1240 | /* Simple iterator over all initialised engines */ |
|---|
| .. | .. |
|---|
| 2161 | 1245 | for_each_if ((engine__) = (dev_priv__)->engine[(id__)]) |
|---|
| 2162 | 1246 | |
|---|
| 2163 | 1247 | /* Iterator over subset of engines selected by mask */ |
|---|
| 2164 | | -#define for_each_engine_masked(engine__, dev_priv__, mask__, tmp__) \ |
|---|
| 2165 | | - for ((tmp__) = (mask__) & INTEL_INFO(dev_priv__)->ring_mask; \ |
|---|
| 1248 | +#define for_each_engine_masked(engine__, gt__, mask__, tmp__) \ |
|---|
| 1249 | + for ((tmp__) = (mask__) & (gt__)->info.engine_mask; \ |
|---|
| 2166 | 1250 | (tmp__) ? \ |
|---|
| 2167 | | - ((engine__) = (dev_priv__)->engine[__mask_next_bit(tmp__)]), 1 : \ |
|---|
| 1251 | + ((engine__) = (gt__)->engine[__mask_next_bit(tmp__)]), 1 : \ |
|---|
| 2168 | 1252 | 0;) |
|---|
| 2169 | 1253 | |
|---|
| 2170 | | -enum hdmi_force_audio { |
|---|
| 2171 | | - HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */ |
|---|
| 2172 | | - HDMI_AUDIO_OFF, /* force turn off HDMI audio */ |
|---|
| 2173 | | - HDMI_AUDIO_AUTO, /* trust EDID */ |
|---|
| 2174 | | - HDMI_AUDIO_ON, /* force turn on HDMI audio */ |
|---|
| 2175 | | -}; |
|---|
| 1254 | +#define rb_to_uabi_engine(rb) \ |
|---|
| 1255 | + rb_entry_safe(rb, struct intel_engine_cs, uabi_node) |
|---|
| 1256 | + |
|---|
| 1257 | +#define for_each_uabi_engine(engine__, i915__) \ |
|---|
| 1258 | + for ((engine__) = rb_to_uabi_engine(rb_first(&(i915__)->uabi_engines));\ |
|---|
| 1259 | + (engine__); \ |
|---|
| 1260 | + (engine__) = rb_to_uabi_engine(rb_next(&(engine__)->uabi_node))) |
|---|
| 1261 | + |
|---|
| 1262 | +#define for_each_uabi_class_engine(engine__, class__, i915__) \ |
|---|
| 1263 | + for ((engine__) = intel_engine_lookup_user((i915__), (class__), 0); \ |
|---|
| 1264 | + (engine__) && (engine__)->uabi_class == (class__); \ |
|---|
| 1265 | + (engine__) = rb_to_uabi_engine(rb_next(&(engine__)->uabi_node))) |
|---|
| 2176 | 1266 | |
|---|
| 2177 | 1267 | #define I915_GTT_OFFSET_NONE ((u32)-1) |
|---|
| 2178 | 1268 | |
|---|
| .. | .. |
|---|
| 2196 | 1286 | GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1, \ |
|---|
| 2197 | 1287 | INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)) |
|---|
| 2198 | 1288 | |
|---|
| 2199 | | -/* |
|---|
| 2200 | | - * Optimised SGL iterator for GEM objects |
|---|
| 2201 | | - */ |
|---|
| 2202 | | -static __always_inline struct sgt_iter { |
|---|
| 2203 | | - struct scatterlist *sgp; |
|---|
| 2204 | | - union { |
|---|
| 2205 | | - unsigned long pfn; |
|---|
| 2206 | | - dma_addr_t dma; |
|---|
| 2207 | | - }; |
|---|
| 2208 | | - unsigned int curr; |
|---|
| 2209 | | - unsigned int max; |
|---|
| 2210 | | -} __sgt_iter(struct scatterlist *sgl, bool dma) { |
|---|
| 2211 | | - struct sgt_iter s = { .sgp = sgl }; |
|---|
| 2212 | | - |
|---|
| 2213 | | - if (s.sgp) { |
|---|
| 2214 | | - s.max = s.curr = s.sgp->offset; |
|---|
| 2215 | | - s.max += s.sgp->length; |
|---|
| 2216 | | - if (dma) |
|---|
| 2217 | | - s.dma = sg_dma_address(s.sgp); |
|---|
| 2218 | | - else |
|---|
| 2219 | | - s.pfn = page_to_pfn(sg_page(s.sgp)); |
|---|
| 2220 | | - } |
|---|
| 2221 | | - |
|---|
| 2222 | | - return s; |
|---|
| 2223 | | -} |
|---|
| 2224 | | - |
|---|
| 2225 | | -static inline struct scatterlist *____sg_next(struct scatterlist *sg) |
|---|
| 2226 | | -{ |
|---|
| 2227 | | - ++sg; |
|---|
| 2228 | | - if (unlikely(sg_is_chain(sg))) |
|---|
| 2229 | | - sg = sg_chain_ptr(sg); |
|---|
| 2230 | | - return sg; |
|---|
| 2231 | | -} |
|---|
| 2232 | | - |
|---|
| 2233 | | -/** |
|---|
| 2234 | | - * __sg_next - return the next scatterlist entry in a list |
|---|
| 2235 | | - * @sg: The current sg entry |
|---|
| 2236 | | - * |
|---|
| 2237 | | - * Description: |
|---|
| 2238 | | - * If the entry is the last, return NULL; otherwise, step to the next |
|---|
| 2239 | | - * element in the array (@sg@+1). If that's a chain pointer, follow it; |
|---|
| 2240 | | - * otherwise just return the pointer to the current element. |
|---|
| 2241 | | - **/ |
|---|
| 2242 | | -static inline struct scatterlist *__sg_next(struct scatterlist *sg) |
|---|
| 2243 | | -{ |
|---|
| 2244 | | - return sg_is_last(sg) ? NULL : ____sg_next(sg); |
|---|
| 2245 | | -} |
|---|
| 2246 | | - |
|---|
| 2247 | | -/** |
|---|
| 2248 | | - * for_each_sgt_dma - iterate over the DMA addresses of the given sg_table |
|---|
| 2249 | | - * @__dmap: DMA address (output) |
|---|
| 2250 | | - * @__iter: 'struct sgt_iter' (iterator state, internal) |
|---|
| 2251 | | - * @__sgt: sg_table to iterate over (input) |
|---|
| 2252 | | - */ |
|---|
| 2253 | | -#define for_each_sgt_dma(__dmap, __iter, __sgt) \ |
|---|
| 2254 | | - for ((__iter) = __sgt_iter((__sgt)->sgl, true); \ |
|---|
| 2255 | | - ((__dmap) = (__iter).dma + (__iter).curr); \ |
|---|
| 2256 | | - (((__iter).curr += I915_GTT_PAGE_SIZE) >= (__iter).max) ? \ |
|---|
| 2257 | | - (__iter) = __sgt_iter(__sg_next((__iter).sgp), true), 0 : 0) |
|---|
| 2258 | | - |
|---|
| 2259 | | -/** |
|---|
| 2260 | | - * for_each_sgt_page - iterate over the pages of the given sg_table |
|---|
| 2261 | | - * @__pp: page pointer (output) |
|---|
| 2262 | | - * @__iter: 'struct sgt_iter' (iterator state, internal) |
|---|
| 2263 | | - * @__sgt: sg_table to iterate over (input) |
|---|
| 2264 | | - */ |
|---|
| 2265 | | -#define for_each_sgt_page(__pp, __iter, __sgt) \ |
|---|
| 2266 | | - for ((__iter) = __sgt_iter((__sgt)->sgl, false); \ |
|---|
| 2267 | | - ((__pp) = (__iter).pfn == 0 ? NULL : \ |
|---|
| 2268 | | - pfn_to_page((__iter).pfn + ((__iter).curr >> PAGE_SHIFT))); \ |
|---|
| 2269 | | - (((__iter).curr += PAGE_SIZE) >= (__iter).max) ? \ |
|---|
| 2270 | | - (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0) |
|---|
| 2271 | | - |
|---|
| 2272 | | -static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg) |
|---|
| 2273 | | -{ |
|---|
| 2274 | | - unsigned int page_sizes; |
|---|
| 2275 | | - |
|---|
| 2276 | | - page_sizes = 0; |
|---|
| 2277 | | - while (sg) { |
|---|
| 2278 | | - GEM_BUG_ON(sg->offset); |
|---|
| 2279 | | - GEM_BUG_ON(!IS_ALIGNED(sg->length, PAGE_SIZE)); |
|---|
| 2280 | | - page_sizes |= sg->length; |
|---|
| 2281 | | - sg = __sg_next(sg); |
|---|
| 2282 | | - } |
|---|
| 2283 | | - |
|---|
| 2284 | | - return page_sizes; |
|---|
| 2285 | | -} |
|---|
| 2286 | | - |
|---|
| 2287 | | -static inline unsigned int i915_sg_segment_size(void) |
|---|
| 2288 | | -{ |
|---|
| 2289 | | - unsigned int size = swiotlb_max_segment(); |
|---|
| 2290 | | - |
|---|
| 2291 | | - if (size == 0) |
|---|
| 2292 | | - return SCATTERLIST_MAX_SEGMENT; |
|---|
| 2293 | | - |
|---|
| 2294 | | - size = rounddown(size, PAGE_SIZE); |
|---|
| 2295 | | - /* swiotlb_max_segment_size can return 1 byte when it means one page. */ |
|---|
| 2296 | | - if (size < PAGE_SIZE) |
|---|
| 2297 | | - size = PAGE_SIZE; |
|---|
| 2298 | | - |
|---|
| 2299 | | - return size; |
|---|
| 2300 | | -} |
|---|
| 2301 | | - |
|---|
| 2302 | | -static inline const struct intel_device_info * |
|---|
| 2303 | | -intel_info(const struct drm_i915_private *dev_priv) |
|---|
| 2304 | | -{ |
|---|
| 2305 | | - return &dev_priv->info; |
|---|
| 2306 | | -} |
|---|
| 2307 | | - |
|---|
| 2308 | | -#define INTEL_INFO(dev_priv) intel_info((dev_priv)) |
|---|
| 1289 | +#define INTEL_INFO(dev_priv) (&(dev_priv)->__info) |
|---|
| 1290 | +#define RUNTIME_INFO(dev_priv) (&(dev_priv)->__runtime) |
|---|
| 2309 | 1291 | #define DRIVER_CAPS(dev_priv) (&(dev_priv)->caps) |
|---|
| 2310 | 1292 | |
|---|
| 2311 | | -#define INTEL_GEN(dev_priv) ((dev_priv)->info.gen) |
|---|
| 2312 | | -#define INTEL_DEVID(dev_priv) ((dev_priv)->info.device_id) |
|---|
| 1293 | +#define INTEL_GEN(dev_priv) (INTEL_INFO(dev_priv)->gen) |
|---|
| 1294 | +#define INTEL_DEVID(dev_priv) (RUNTIME_INFO(dev_priv)->device_id) |
|---|
| 2313 | 1295 | |
|---|
| 2314 | 1296 | #define REVID_FOREVER 0xff |
|---|
| 2315 | 1297 | #define INTEL_REVID(dev_priv) ((dev_priv)->drm.pdev->revision) |
|---|
| 2316 | 1298 | |
|---|
| 2317 | | -#define GEN_FOREVER (0) |
|---|
| 2318 | | - |
|---|
| 2319 | 1299 | #define INTEL_GEN_MASK(s, e) ( \ |
|---|
| 2320 | 1300 | BUILD_BUG_ON_ZERO(!__builtin_constant_p(s)) + \ |
|---|
| 2321 | 1301 | BUILD_BUG_ON_ZERO(!__builtin_constant_p(e)) + \ |
|---|
| 2322 | | - GENMASK((e) != GEN_FOREVER ? (e) - 1 : BITS_PER_LONG - 1, \ |
|---|
| 2323 | | - (s) != GEN_FOREVER ? (s) - 1 : 0) \ |
|---|
| 2324 | | -) |
|---|
| 1302 | + GENMASK((e) - 1, (s) - 1)) |
|---|
| 2325 | 1303 | |
|---|
| 2326 | | -/* |
|---|
| 2327 | | - * Returns true if Gen is in inclusive range [Start, End]. |
|---|
| 2328 | | - * |
|---|
| 2329 | | - * Use GEN_FOREVER for unbound start and or end. |
|---|
| 2330 | | - */ |
|---|
| 2331 | | -#define IS_GEN(dev_priv, s, e) \ |
|---|
| 2332 | | - (!!((dev_priv)->info.gen_mask & INTEL_GEN_MASK((s), (e)))) |
|---|
| 1304 | +/* Returns true if Gen is in inclusive range [Start, End] */ |
|---|
| 1305 | +#define IS_GEN_RANGE(dev_priv, s, e) \ |
|---|
| 1306 | + (!!(INTEL_INFO(dev_priv)->gen_mask & INTEL_GEN_MASK((s), (e)))) |
|---|
| 1307 | + |
|---|
| 1308 | +#define IS_GEN(dev_priv, n) \ |
|---|
| 1309 | + (BUILD_BUG_ON_ZERO(!__builtin_constant_p(n)) + \ |
|---|
| 1310 | + INTEL_INFO(dev_priv)->gen == (n)) |
|---|
| 1311 | + |
|---|
| 1312 | +#define HAS_DSB(dev_priv) (INTEL_INFO(dev_priv)->display.has_dsb) |
|---|
| 2333 | 1313 | |
|---|
| 2334 | 1314 | /* |
|---|
| 2335 | 1315 | * Return true if revision is in range [since,until] inclusive. |
|---|
| .. | .. |
|---|
| 2339 | 1319 | #define IS_REVID(p, since, until) \ |
|---|
| 2340 | 1320 | (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until)) |
|---|
| 2341 | 1321 | |
|---|
| 2342 | | -#define IS_PLATFORM(dev_priv, p) ((dev_priv)->info.platform_mask & BIT(p)) |
|---|
| 1322 | +static __always_inline unsigned int |
|---|
| 1323 | +__platform_mask_index(const struct intel_runtime_info *info, |
|---|
| 1324 | + enum intel_platform p) |
|---|
| 1325 | +{ |
|---|
| 1326 | + const unsigned int pbits = |
|---|
| 1327 | + BITS_PER_TYPE(info->platform_mask[0]) - INTEL_SUBPLATFORM_BITS; |
|---|
| 1328 | + |
|---|
| 1329 | + /* Expand the platform_mask array if this fails. */ |
|---|
| 1330 | + BUILD_BUG_ON(INTEL_MAX_PLATFORMS > |
|---|
| 1331 | + pbits * ARRAY_SIZE(info->platform_mask)); |
|---|
| 1332 | + |
|---|
| 1333 | + return p / pbits; |
|---|
| 1334 | +} |
|---|
| 1335 | + |
|---|
| 1336 | +static __always_inline unsigned int |
|---|
| 1337 | +__platform_mask_bit(const struct intel_runtime_info *info, |
|---|
| 1338 | + enum intel_platform p) |
|---|
| 1339 | +{ |
|---|
| 1340 | + const unsigned int pbits = |
|---|
| 1341 | + BITS_PER_TYPE(info->platform_mask[0]) - INTEL_SUBPLATFORM_BITS; |
|---|
| 1342 | + |
|---|
| 1343 | + return p % pbits + INTEL_SUBPLATFORM_BITS; |
|---|
| 1344 | +} |
|---|
| 1345 | + |
|---|
| 1346 | +static inline u32 |
|---|
| 1347 | +intel_subplatform(const struct intel_runtime_info *info, enum intel_platform p) |
|---|
| 1348 | +{ |
|---|
| 1349 | + const unsigned int pi = __platform_mask_index(info, p); |
|---|
| 1350 | + |
|---|
| 1351 | + return info->platform_mask[pi] & ((1 << INTEL_SUBPLATFORM_BITS) - 1); |
|---|
| 1352 | +} |
|---|
| 1353 | + |
|---|
| 1354 | +static __always_inline bool |
|---|
| 1355 | +IS_PLATFORM(const struct drm_i915_private *i915, enum intel_platform p) |
|---|
| 1356 | +{ |
|---|
| 1357 | + const struct intel_runtime_info *info = RUNTIME_INFO(i915); |
|---|
| 1358 | + const unsigned int pi = __platform_mask_index(info, p); |
|---|
| 1359 | + const unsigned int pb = __platform_mask_bit(info, p); |
|---|
| 1360 | + |
|---|
| 1361 | + BUILD_BUG_ON(!__builtin_constant_p(p)); |
|---|
| 1362 | + |
|---|
| 1363 | + return info->platform_mask[pi] & BIT(pb); |
|---|
| 1364 | +} |
|---|
| 1365 | + |
|---|
| 1366 | +static __always_inline bool |
|---|
| 1367 | +IS_SUBPLATFORM(const struct drm_i915_private *i915, |
|---|
| 1368 | + enum intel_platform p, unsigned int s) |
|---|
| 1369 | +{ |
|---|
| 1370 | + const struct intel_runtime_info *info = RUNTIME_INFO(i915); |
|---|
| 1371 | + const unsigned int pi = __platform_mask_index(info, p); |
|---|
| 1372 | + const unsigned int pb = __platform_mask_bit(info, p); |
|---|
| 1373 | + const unsigned int msb = BITS_PER_TYPE(info->platform_mask[0]) - 1; |
|---|
| 1374 | + const u32 mask = info->platform_mask[pi]; |
|---|
| 1375 | + |
|---|
| 1376 | + BUILD_BUG_ON(!__builtin_constant_p(p)); |
|---|
| 1377 | + BUILD_BUG_ON(!__builtin_constant_p(s)); |
|---|
| 1378 | + BUILD_BUG_ON((s) >= INTEL_SUBPLATFORM_BITS); |
|---|
| 1379 | + |
|---|
| 1380 | + /* Shift and test on the MSB position so sign flag can be used. */ |
|---|
| 1381 | + return ((mask << (msb - pb)) & (mask << (msb - s))) & BIT(msb); |
|---|
| 1382 | +} |
|---|
| 1383 | + |
|---|
| 1384 | +#define IS_MOBILE(dev_priv) (INTEL_INFO(dev_priv)->is_mobile) |
|---|
| 1385 | +#define IS_DGFX(dev_priv) (INTEL_INFO(dev_priv)->is_dgfx) |
|---|
| 2343 | 1386 | |
|---|
| 2344 | 1387 | #define IS_I830(dev_priv) IS_PLATFORM(dev_priv, INTEL_I830) |
|---|
| 2345 | 1388 | #define IS_I845G(dev_priv) IS_PLATFORM(dev_priv, INTEL_I845G) |
|---|
| .. | .. |
|---|
| 2354 | 1397 | #define IS_G45(dev_priv) IS_PLATFORM(dev_priv, INTEL_G45) |
|---|
| 2355 | 1398 | #define IS_GM45(dev_priv) IS_PLATFORM(dev_priv, INTEL_GM45) |
|---|
| 2356 | 1399 | #define IS_G4X(dev_priv) (IS_G45(dev_priv) || IS_GM45(dev_priv)) |
|---|
| 2357 | | -#define IS_PINEVIEW_G(dev_priv) (INTEL_DEVID(dev_priv) == 0xa001) |
|---|
| 2358 | | -#define IS_PINEVIEW_M(dev_priv) (INTEL_DEVID(dev_priv) == 0xa011) |
|---|
| 2359 | 1400 | #define IS_PINEVIEW(dev_priv) IS_PLATFORM(dev_priv, INTEL_PINEVIEW) |
|---|
| 2360 | 1401 | #define IS_G33(dev_priv) IS_PLATFORM(dev_priv, INTEL_G33) |
|---|
| 2361 | | -#define IS_IRONLAKE_M(dev_priv) (INTEL_DEVID(dev_priv) == 0x0046) |
|---|
| 1402 | +#define IS_IRONLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_IRONLAKE) |
|---|
| 1403 | +#define IS_IRONLAKE_M(dev_priv) \ |
|---|
| 1404 | + (IS_PLATFORM(dev_priv, INTEL_IRONLAKE) && IS_MOBILE(dev_priv)) |
|---|
| 2362 | 1405 | #define IS_IVYBRIDGE(dev_priv) IS_PLATFORM(dev_priv, INTEL_IVYBRIDGE) |
|---|
| 2363 | 1406 | #define IS_IVB_GT1(dev_priv) (IS_IVYBRIDGE(dev_priv) && \ |
|---|
| 2364 | | - (dev_priv)->info.gt == 1) |
|---|
| 1407 | + INTEL_INFO(dev_priv)->gt == 1) |
|---|
| 2365 | 1408 | #define IS_VALLEYVIEW(dev_priv) IS_PLATFORM(dev_priv, INTEL_VALLEYVIEW) |
|---|
| 2366 | 1409 | #define IS_CHERRYVIEW(dev_priv) IS_PLATFORM(dev_priv, INTEL_CHERRYVIEW) |
|---|
| 2367 | 1410 | #define IS_HASWELL(dev_priv) IS_PLATFORM(dev_priv, INTEL_HASWELL) |
|---|
| .. | .. |
|---|
| 2371 | 1414 | #define IS_KABYLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_KABYLAKE) |
|---|
| 2372 | 1415 | #define IS_GEMINILAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_GEMINILAKE) |
|---|
| 2373 | 1416 | #define IS_COFFEELAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_COFFEELAKE) |
|---|
| 1417 | +#define IS_COMETLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_COMETLAKE) |
|---|
| 2374 | 1418 | #define IS_CANNONLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_CANNONLAKE) |
|---|
| 2375 | 1419 | #define IS_ICELAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_ICELAKE) |
|---|
| 2376 | | -#define IS_MOBILE(dev_priv) ((dev_priv)->info.is_mobile) |
|---|
| 1420 | +#define IS_ELKHARTLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE) |
|---|
| 1421 | +#define IS_TIGERLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_TIGERLAKE) |
|---|
| 1422 | +#define IS_ROCKETLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_ROCKETLAKE) |
|---|
| 1423 | +#define IS_DG1(dev_priv) IS_PLATFORM(dev_priv, INTEL_DG1) |
|---|
| 2377 | 1424 | #define IS_HSW_EARLY_SDV(dev_priv) (IS_HASWELL(dev_priv) && \ |
|---|
| 2378 | 1425 | (INTEL_DEVID(dev_priv) & 0xFF00) == 0x0C00) |
|---|
| 2379 | | -#define IS_BDW_ULT(dev_priv) (IS_BROADWELL(dev_priv) && \ |
|---|
| 2380 | | - ((INTEL_DEVID(dev_priv) & 0xf) == 0x6 || \ |
|---|
| 2381 | | - (INTEL_DEVID(dev_priv) & 0xf) == 0xb || \ |
|---|
| 2382 | | - (INTEL_DEVID(dev_priv) & 0xf) == 0xe)) |
|---|
| 2383 | | -/* ULX machines are also considered ULT. */ |
|---|
| 2384 | | -#define IS_BDW_ULX(dev_priv) (IS_BROADWELL(dev_priv) && \ |
|---|
| 2385 | | - (INTEL_DEVID(dev_priv) & 0xf) == 0xe) |
|---|
| 1426 | +#define IS_BDW_ULT(dev_priv) \ |
|---|
| 1427 | + IS_SUBPLATFORM(dev_priv, INTEL_BROADWELL, INTEL_SUBPLATFORM_ULT) |
|---|
| 1428 | +#define IS_BDW_ULX(dev_priv) \ |
|---|
| 1429 | + IS_SUBPLATFORM(dev_priv, INTEL_BROADWELL, INTEL_SUBPLATFORM_ULX) |
|---|
| 2386 | 1430 | #define IS_BDW_GT3(dev_priv) (IS_BROADWELL(dev_priv) && \ |
|---|
| 2387 | | - (dev_priv)->info.gt == 3) |
|---|
| 2388 | | -#define IS_HSW_ULT(dev_priv) (IS_HASWELL(dev_priv) && \ |
|---|
| 2389 | | - (INTEL_DEVID(dev_priv) & 0xFF00) == 0x0A00) |
|---|
| 1431 | + INTEL_INFO(dev_priv)->gt == 3) |
|---|
| 1432 | +#define IS_HSW_ULT(dev_priv) \ |
|---|
| 1433 | + IS_SUBPLATFORM(dev_priv, INTEL_HASWELL, INTEL_SUBPLATFORM_ULT) |
|---|
| 2390 | 1434 | #define IS_HSW_GT3(dev_priv) (IS_HASWELL(dev_priv) && \ |
|---|
| 2391 | | - (dev_priv)->info.gt == 3) |
|---|
| 1435 | + INTEL_INFO(dev_priv)->gt == 3) |
|---|
| 1436 | +#define IS_HSW_GT1(dev_priv) (IS_HASWELL(dev_priv) && \ |
|---|
| 1437 | + INTEL_INFO(dev_priv)->gt == 1) |
|---|
| 2392 | 1438 | /* ULX machines are also considered ULT. */ |
|---|
| 2393 | | -#define IS_HSW_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x0A0E || \ |
|---|
| 2394 | | - INTEL_DEVID(dev_priv) == 0x0A1E) |
|---|
| 2395 | | -#define IS_SKL_ULT(dev_priv) (INTEL_DEVID(dev_priv) == 0x1906 || \ |
|---|
| 2396 | | - INTEL_DEVID(dev_priv) == 0x1913 || \ |
|---|
| 2397 | | - INTEL_DEVID(dev_priv) == 0x1916 || \ |
|---|
| 2398 | | - INTEL_DEVID(dev_priv) == 0x1921 || \ |
|---|
| 2399 | | - INTEL_DEVID(dev_priv) == 0x1926) |
|---|
| 2400 | | -#define IS_SKL_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x190E || \ |
|---|
| 2401 | | - INTEL_DEVID(dev_priv) == 0x1915 || \ |
|---|
| 2402 | | - INTEL_DEVID(dev_priv) == 0x191E) |
|---|
| 2403 | | -#define IS_KBL_ULT(dev_priv) (INTEL_DEVID(dev_priv) == 0x5906 || \ |
|---|
| 2404 | | - INTEL_DEVID(dev_priv) == 0x5913 || \ |
|---|
| 2405 | | - INTEL_DEVID(dev_priv) == 0x5916 || \ |
|---|
| 2406 | | - INTEL_DEVID(dev_priv) == 0x5921 || \ |
|---|
| 2407 | | - INTEL_DEVID(dev_priv) == 0x5926) |
|---|
| 2408 | | -#define IS_KBL_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x590E || \ |
|---|
| 2409 | | - INTEL_DEVID(dev_priv) == 0x5915 || \ |
|---|
| 2410 | | - INTEL_DEVID(dev_priv) == 0x591E) |
|---|
| 1439 | +#define IS_HSW_ULX(dev_priv) \ |
|---|
| 1440 | + IS_SUBPLATFORM(dev_priv, INTEL_HASWELL, INTEL_SUBPLATFORM_ULX) |
|---|
| 1441 | +#define IS_SKL_ULT(dev_priv) \ |
|---|
| 1442 | + IS_SUBPLATFORM(dev_priv, INTEL_SKYLAKE, INTEL_SUBPLATFORM_ULT) |
|---|
| 1443 | +#define IS_SKL_ULX(dev_priv) \ |
|---|
| 1444 | + IS_SUBPLATFORM(dev_priv, INTEL_SKYLAKE, INTEL_SUBPLATFORM_ULX) |
|---|
| 1445 | +#define IS_KBL_ULT(dev_priv) \ |
|---|
| 1446 | + IS_SUBPLATFORM(dev_priv, INTEL_KABYLAKE, INTEL_SUBPLATFORM_ULT) |
|---|
| 1447 | +#define IS_KBL_ULX(dev_priv) \ |
|---|
| 1448 | + IS_SUBPLATFORM(dev_priv, INTEL_KABYLAKE, INTEL_SUBPLATFORM_ULX) |
|---|
| 2411 | 1449 | #define IS_SKL_GT2(dev_priv) (IS_SKYLAKE(dev_priv) && \ |
|---|
| 2412 | | - (dev_priv)->info.gt == 2) |
|---|
| 1450 | + INTEL_INFO(dev_priv)->gt == 2) |
|---|
| 2413 | 1451 | #define IS_SKL_GT3(dev_priv) (IS_SKYLAKE(dev_priv) && \ |
|---|
| 2414 | | - (dev_priv)->info.gt == 3) |
|---|
| 1452 | + INTEL_INFO(dev_priv)->gt == 3) |
|---|
| 2415 | 1453 | #define IS_SKL_GT4(dev_priv) (IS_SKYLAKE(dev_priv) && \ |
|---|
| 2416 | | - (dev_priv)->info.gt == 4) |
|---|
| 1454 | + INTEL_INFO(dev_priv)->gt == 4) |
|---|
| 2417 | 1455 | #define IS_KBL_GT2(dev_priv) (IS_KABYLAKE(dev_priv) && \ |
|---|
| 2418 | | - (dev_priv)->info.gt == 2) |
|---|
| 1456 | + INTEL_INFO(dev_priv)->gt == 2) |
|---|
| 2419 | 1457 | #define IS_KBL_GT3(dev_priv) (IS_KABYLAKE(dev_priv) && \ |
|---|
| 2420 | | - (dev_priv)->info.gt == 3) |
|---|
| 2421 | | -#define IS_CFL_ULT(dev_priv) (IS_COFFEELAKE(dev_priv) && \ |
|---|
| 2422 | | - (INTEL_DEVID(dev_priv) & 0x00F0) == 0x00A0) |
|---|
| 1458 | + INTEL_INFO(dev_priv)->gt == 3) |
|---|
| 1459 | +#define IS_CFL_ULT(dev_priv) \ |
|---|
| 1460 | + IS_SUBPLATFORM(dev_priv, INTEL_COFFEELAKE, INTEL_SUBPLATFORM_ULT) |
|---|
| 1461 | +#define IS_CFL_ULX(dev_priv) \ |
|---|
| 1462 | + IS_SUBPLATFORM(dev_priv, INTEL_COFFEELAKE, INTEL_SUBPLATFORM_ULX) |
|---|
| 2423 | 1463 | #define IS_CFL_GT2(dev_priv) (IS_COFFEELAKE(dev_priv) && \ |
|---|
| 2424 | | - (dev_priv)->info.gt == 2) |
|---|
| 1464 | + INTEL_INFO(dev_priv)->gt == 2) |
|---|
| 2425 | 1465 | #define IS_CFL_GT3(dev_priv) (IS_COFFEELAKE(dev_priv) && \ |
|---|
| 2426 | | - (dev_priv)->info.gt == 3) |
|---|
| 2427 | | -#define IS_CNL_WITH_PORT_F(dev_priv) (IS_CANNONLAKE(dev_priv) && \ |
|---|
| 2428 | | - (INTEL_DEVID(dev_priv) & 0x0004) == 0x0004) |
|---|
| 1466 | + INTEL_INFO(dev_priv)->gt == 3) |
|---|
| 2429 | 1467 | |
|---|
| 2430 | | -#define IS_ALPHA_SUPPORT(intel_info) ((intel_info)->is_alpha_support) |
|---|
| 1468 | +#define IS_CML_ULT(dev_priv) \ |
|---|
| 1469 | + IS_SUBPLATFORM(dev_priv, INTEL_COMETLAKE, INTEL_SUBPLATFORM_ULT) |
|---|
| 1470 | +#define IS_CML_ULX(dev_priv) \ |
|---|
| 1471 | + IS_SUBPLATFORM(dev_priv, INTEL_COMETLAKE, INTEL_SUBPLATFORM_ULX) |
|---|
| 1472 | +#define IS_CML_GT2(dev_priv) (IS_COMETLAKE(dev_priv) && \ |
|---|
| 1473 | + INTEL_INFO(dev_priv)->gt == 2) |
|---|
| 1474 | + |
|---|
| 1475 | +#define IS_CNL_WITH_PORT_F(dev_priv) \ |
|---|
| 1476 | + IS_SUBPLATFORM(dev_priv, INTEL_CANNONLAKE, INTEL_SUBPLATFORM_PORTF) |
|---|
| 1477 | +#define IS_ICL_WITH_PORT_F(dev_priv) \ |
|---|
| 1478 | + IS_SUBPLATFORM(dev_priv, INTEL_ICELAKE, INTEL_SUBPLATFORM_PORTF) |
|---|
| 1479 | + |
|---|
| 1480 | +#define IS_TGL_U(dev_priv) \ |
|---|
| 1481 | + IS_SUBPLATFORM(dev_priv, INTEL_TIGERLAKE, INTEL_SUBPLATFORM_ULT) |
|---|
| 1482 | + |
|---|
| 1483 | +#define IS_TGL_Y(dev_priv) \ |
|---|
| 1484 | + IS_SUBPLATFORM(dev_priv, INTEL_TIGERLAKE, INTEL_SUBPLATFORM_ULX) |
|---|
| 2431 | 1485 | |
|---|
| 2432 | 1486 | #define SKL_REVID_A0 0x0 |
|---|
| 2433 | 1487 | #define SKL_REVID_B0 0x1 |
|---|
| .. | .. |
|---|
| 2449 | 1503 | #define IS_BXT_REVID(dev_priv, since, until) \ |
|---|
| 2450 | 1504 | (IS_BROXTON(dev_priv) && IS_REVID(dev_priv, since, until)) |
|---|
| 2451 | 1505 | |
|---|
| 2452 | | -#define KBL_REVID_A0 0x0 |
|---|
| 2453 | | -#define KBL_REVID_B0 0x1 |
|---|
| 2454 | | -#define KBL_REVID_C0 0x2 |
|---|
| 2455 | | -#define KBL_REVID_D0 0x3 |
|---|
| 2456 | | -#define KBL_REVID_E0 0x4 |
|---|
| 1506 | +enum { |
|---|
| 1507 | + KBL_REVID_A0, |
|---|
| 1508 | + KBL_REVID_B0, |
|---|
| 1509 | + KBL_REVID_B1, |
|---|
| 1510 | + KBL_REVID_C0, |
|---|
| 1511 | + KBL_REVID_D0, |
|---|
| 1512 | + KBL_REVID_D1, |
|---|
| 1513 | + KBL_REVID_E0, |
|---|
| 1514 | + KBL_REVID_F0, |
|---|
| 1515 | + KBL_REVID_G0, |
|---|
| 1516 | +}; |
|---|
| 2457 | 1517 | |
|---|
| 2458 | | -#define IS_KBL_REVID(dev_priv, since, until) \ |
|---|
| 2459 | | - (IS_KABYLAKE(dev_priv) && IS_REVID(dev_priv, since, until)) |
|---|
| 1518 | +struct i915_rev_steppings { |
|---|
| 1519 | + u8 gt_stepping; |
|---|
| 1520 | + u8 disp_stepping; |
|---|
| 1521 | +}; |
|---|
| 1522 | + |
|---|
| 1523 | +/* Defined in intel_workarounds.c */ |
|---|
| 1524 | +extern const struct i915_rev_steppings kbl_revids[]; |
|---|
| 1525 | + |
|---|
| 1526 | +#define IS_KBL_GT_REVID(dev_priv, since, until) \ |
|---|
| 1527 | + (IS_KABYLAKE(dev_priv) && \ |
|---|
| 1528 | + kbl_revids[INTEL_REVID(dev_priv)].gt_stepping >= since && \ |
|---|
| 1529 | + kbl_revids[INTEL_REVID(dev_priv)].gt_stepping <= until) |
|---|
| 1530 | +#define IS_KBL_DISP_REVID(dev_priv, since, until) \ |
|---|
| 1531 | + (IS_KABYLAKE(dev_priv) && \ |
|---|
| 1532 | + kbl_revids[INTEL_REVID(dev_priv)].disp_stepping >= since && \ |
|---|
| 1533 | + kbl_revids[INTEL_REVID(dev_priv)].disp_stepping <= until) |
|---|
| 2460 | 1534 | |
|---|
| 2461 | 1535 | #define GLK_REVID_A0 0x0 |
|---|
| 2462 | 1536 | #define GLK_REVID_A1 0x1 |
|---|
| 1537 | +#define GLK_REVID_A2 0x2 |
|---|
| 1538 | +#define GLK_REVID_B0 0x3 |
|---|
| 2463 | 1539 | |
|---|
| 2464 | 1540 | #define IS_GLK_REVID(dev_priv, since, until) \ |
|---|
| 2465 | 1541 | (IS_GEMINILAKE(dev_priv) && IS_REVID(dev_priv, since, until)) |
|---|
| .. | .. |
|---|
| 2480 | 1556 | #define IS_ICL_REVID(p, since, until) \ |
|---|
| 2481 | 1557 | (IS_ICELAKE(p) && IS_REVID(p, since, until)) |
|---|
| 2482 | 1558 | |
|---|
| 2483 | | -/* |
|---|
| 2484 | | - * The genX designation typically refers to the render engine, so render |
|---|
| 2485 | | - * capability related checks should use IS_GEN, while display and other checks |
|---|
| 2486 | | - * have their own (e.g. HAS_PCH_SPLIT for ILK+ display, IS_foo for particular |
|---|
| 2487 | | - * chips, etc.). |
|---|
| 2488 | | - */ |
|---|
| 2489 | | -#define IS_GEN2(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(1))) |
|---|
| 2490 | | -#define IS_GEN3(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(2))) |
|---|
| 2491 | | -#define IS_GEN4(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(3))) |
|---|
| 2492 | | -#define IS_GEN5(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(4))) |
|---|
| 2493 | | -#define IS_GEN6(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(5))) |
|---|
| 2494 | | -#define IS_GEN7(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(6))) |
|---|
| 2495 | | -#define IS_GEN8(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(7))) |
|---|
| 2496 | | -#define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8))) |
|---|
| 2497 | | -#define IS_GEN10(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(9))) |
|---|
| 2498 | | -#define IS_GEN11(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(10))) |
|---|
| 1559 | +#define EHL_REVID_A0 0x0 |
|---|
| 1560 | + |
|---|
| 1561 | +#define IS_EHL_REVID(p, since, until) \ |
|---|
| 1562 | + (IS_ELKHARTLAKE(p) && IS_REVID(p, since, until)) |
|---|
| 1563 | + |
|---|
| 1564 | +enum { |
|---|
| 1565 | + TGL_REVID_A0, |
|---|
| 1566 | + TGL_REVID_B0, |
|---|
| 1567 | + TGL_REVID_B1, |
|---|
| 1568 | + TGL_REVID_C0, |
|---|
| 1569 | + TGL_REVID_D0, |
|---|
| 1570 | +}; |
|---|
| 1571 | + |
|---|
| 1572 | +extern const struct i915_rev_steppings tgl_uy_revids[]; |
|---|
| 1573 | +extern const struct i915_rev_steppings tgl_revids[]; |
|---|
| 1574 | + |
|---|
| 1575 | +static inline const struct i915_rev_steppings * |
|---|
| 1576 | +tgl_revids_get(struct drm_i915_private *dev_priv) |
|---|
| 1577 | +{ |
|---|
| 1578 | + if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) |
|---|
| 1579 | + return tgl_uy_revids; |
|---|
| 1580 | + else |
|---|
| 1581 | + return tgl_revids; |
|---|
| 1582 | +} |
|---|
| 1583 | + |
|---|
| 1584 | +#define IS_TGL_DISP_REVID(p, since, until) \ |
|---|
| 1585 | + (IS_TIGERLAKE(p) && \ |
|---|
| 1586 | + tgl_revids_get(p)->disp_stepping >= (since) && \ |
|---|
| 1587 | + tgl_revids_get(p)->disp_stepping <= (until)) |
|---|
| 1588 | + |
|---|
| 1589 | +#define IS_TGL_UY_GT_REVID(p, since, until) \ |
|---|
| 1590 | + ((IS_TGL_U(p) || IS_TGL_Y(p)) && \ |
|---|
| 1591 | + tgl_uy_revids->gt_stepping >= (since) && \ |
|---|
| 1592 | + tgl_uy_revids->gt_stepping <= (until)) |
|---|
| 1593 | + |
|---|
| 1594 | +#define IS_TGL_GT_REVID(p, since, until) \ |
|---|
| 1595 | + (IS_TIGERLAKE(p) && \ |
|---|
| 1596 | + !(IS_TGL_U(p) || IS_TGL_Y(p)) && \ |
|---|
| 1597 | + tgl_revids->gt_stepping >= (since) && \ |
|---|
| 1598 | + tgl_revids->gt_stepping <= (until)) |
|---|
| 1599 | + |
|---|
| 1600 | +#define RKL_REVID_A0 0x0 |
|---|
| 1601 | +#define RKL_REVID_B0 0x1 |
|---|
| 1602 | +#define RKL_REVID_C0 0x4 |
|---|
| 1603 | + |
|---|
| 1604 | +#define IS_RKL_REVID(p, since, until) \ |
|---|
| 1605 | + (IS_ROCKETLAKE(p) && IS_REVID(p, since, until)) |
|---|
| 1606 | + |
|---|
| 1607 | +#define DG1_REVID_A0 0x0 |
|---|
| 1608 | +#define DG1_REVID_B0 0x1 |
|---|
| 1609 | + |
|---|
| 1610 | +#define IS_DG1_REVID(p, since, until) \ |
|---|
| 1611 | + (IS_DG1(p) && IS_REVID(p, since, until)) |
|---|
| 2499 | 1612 | |
|---|
| 2500 | 1613 | #define IS_LP(dev_priv) (INTEL_INFO(dev_priv)->is_lp) |
|---|
| 2501 | | -#define IS_GEN9_LP(dev_priv) (IS_GEN9(dev_priv) && IS_LP(dev_priv)) |
|---|
| 2502 | | -#define IS_GEN9_BC(dev_priv) (IS_GEN9(dev_priv) && !IS_LP(dev_priv)) |
|---|
| 1614 | +#define IS_GEN9_LP(dev_priv) (IS_GEN(dev_priv, 9) && IS_LP(dev_priv)) |
|---|
| 1615 | +#define IS_GEN9_BC(dev_priv) (IS_GEN(dev_priv, 9) && !IS_LP(dev_priv)) |
|---|
| 1616 | + |
|---|
| 1617 | +#define __HAS_ENGINE(engine_mask, id) ((engine_mask) & BIT(id)) |
|---|
| 1618 | +#define HAS_ENGINE(gt, id) __HAS_ENGINE((gt)->info.engine_mask, id) |
|---|
| 1619 | + |
|---|
| 1620 | +#define ENGINE_INSTANCES_MASK(gt, first, count) ({ \ |
|---|
| 1621 | + unsigned int first__ = (first); \ |
|---|
| 1622 | + unsigned int count__ = (count); \ |
|---|
| 1623 | + ((gt)->info.engine_mask & \ |
|---|
| 1624 | + GENMASK(first__ + count__ - 1, first__)) >> first__; \ |
|---|
| 1625 | +}) |
|---|
| 1626 | +#define VDBOX_MASK(gt) \ |
|---|
| 1627 | + ENGINE_INSTANCES_MASK(gt, VCS0, I915_MAX_VCS) |
|---|
| 1628 | +#define VEBOX_MASK(gt) \ |
|---|
| 1629 | + ENGINE_INSTANCES_MASK(gt, VECS0, I915_MAX_VECS) |
|---|
| 2503 | 1630 | |
|---|
| 2504 | 1631 | /* |
|---|
| 2505 | 1632 | * The Gen7 cmdparser copies the scanned buffer to the ggtt for execution |
|---|
| 2506 | 1633 | * All later gens can run the final buffer from the ppgtt |
|---|
| 2507 | 1634 | */ |
|---|
| 2508 | | -#define CMDPARSER_USES_GGTT(dev_priv) IS_GEN7(dev_priv) |
|---|
| 1635 | +#define CMDPARSER_USES_GGTT(dev_priv) IS_GEN(dev_priv, 7) |
|---|
| 2509 | 1636 | |
|---|
| 2510 | | -#define ENGINE_MASK(id) BIT(id) |
|---|
| 2511 | | -#define RENDER_RING ENGINE_MASK(RCS) |
|---|
| 2512 | | -#define BSD_RING ENGINE_MASK(VCS) |
|---|
| 2513 | | -#define BLT_RING ENGINE_MASK(BCS) |
|---|
| 2514 | | -#define VEBOX_RING ENGINE_MASK(VECS) |
|---|
| 2515 | | -#define BSD2_RING ENGINE_MASK(VCS2) |
|---|
| 2516 | | -#define BSD3_RING ENGINE_MASK(VCS3) |
|---|
| 2517 | | -#define BSD4_RING ENGINE_MASK(VCS4) |
|---|
| 2518 | | -#define VEBOX2_RING ENGINE_MASK(VECS2) |
|---|
| 2519 | | -#define ALL_ENGINES (~0) |
|---|
| 2520 | | - |
|---|
| 2521 | | -#define HAS_ENGINE(dev_priv, id) \ |
|---|
| 2522 | | - (!!((dev_priv)->info.ring_mask & ENGINE_MASK(id))) |
|---|
| 2523 | | - |
|---|
| 2524 | | -#define HAS_BSD(dev_priv) HAS_ENGINE(dev_priv, VCS) |
|---|
| 2525 | | -#define HAS_BSD2(dev_priv) HAS_ENGINE(dev_priv, VCS2) |
|---|
| 2526 | | -#define HAS_BLT(dev_priv) HAS_ENGINE(dev_priv, BCS) |
|---|
| 2527 | | -#define HAS_VEBOX(dev_priv) HAS_ENGINE(dev_priv, VECS) |
|---|
| 2528 | | - |
|---|
| 2529 | | -#define HAS_LEGACY_SEMAPHORES(dev_priv) IS_GEN7(dev_priv) |
|---|
| 2530 | | - |
|---|
| 1637 | +#define HAS_LLC(dev_priv) (INTEL_INFO(dev_priv)->has_llc) |
|---|
| 1638 | +#define HAS_SNOOP(dev_priv) (INTEL_INFO(dev_priv)->has_snoop) |
|---|
| 1639 | +#define HAS_EDRAM(dev_priv) ((dev_priv)->edram_size_mb) |
|---|
| 2531 | 1640 | #define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6) |
|---|
| 2532 | | - |
|---|
| 2533 | | -#define HAS_LLC(dev_priv) ((dev_priv)->info.has_llc) |
|---|
| 2534 | | -#define HAS_SNOOP(dev_priv) ((dev_priv)->info.has_snoop) |
|---|
| 2535 | | -#define HAS_EDRAM(dev_priv) (!!((dev_priv)->edram_cap & EDRAM_ENABLED)) |
|---|
| 2536 | 1641 | #define HAS_WT(dev_priv) ((IS_HASWELL(dev_priv) || \ |
|---|
| 2537 | 1642 | IS_BROADWELL(dev_priv)) && HAS_EDRAM(dev_priv)) |
|---|
| 2538 | 1643 | |
|---|
| 2539 | | -#define HWS_NEEDS_PHYSICAL(dev_priv) ((dev_priv)->info.hws_needs_physical) |
|---|
| 1644 | +#define HWS_NEEDS_PHYSICAL(dev_priv) (INTEL_INFO(dev_priv)->hws_needs_physical) |
|---|
| 2540 | 1645 | |
|---|
| 2541 | 1646 | #define HAS_LOGICAL_RING_CONTEXTS(dev_priv) \ |
|---|
| 2542 | | - ((dev_priv)->info.has_logical_ring_contexts) |
|---|
| 1647 | + (INTEL_INFO(dev_priv)->has_logical_ring_contexts) |
|---|
| 2543 | 1648 | #define HAS_LOGICAL_RING_ELSQ(dev_priv) \ |
|---|
| 2544 | | - ((dev_priv)->info.has_logical_ring_elsq) |
|---|
| 1649 | + (INTEL_INFO(dev_priv)->has_logical_ring_elsq) |
|---|
| 2545 | 1650 | #define HAS_LOGICAL_RING_PREEMPTION(dev_priv) \ |
|---|
| 2546 | | - ((dev_priv)->info.has_logical_ring_preemption) |
|---|
| 1651 | + (INTEL_INFO(dev_priv)->has_logical_ring_preemption) |
|---|
| 1652 | + |
|---|
| 1653 | +#define HAS_MASTER_UNIT_IRQ(dev_priv) (INTEL_INFO(dev_priv)->has_master_unit_irq) |
|---|
| 2547 | 1654 | |
|---|
| 2548 | 1655 | #define HAS_EXECLISTS(dev_priv) HAS_LOGICAL_RING_CONTEXTS(dev_priv) |
|---|
| 2549 | 1656 | |
|---|
| 2550 | | -#define USES_PPGTT(dev_priv) (i915_modparams.enable_ppgtt) |
|---|
| 2551 | | -#define USES_FULL_PPGTT(dev_priv) (i915_modparams.enable_ppgtt >= 2) |
|---|
| 2552 | | -#define USES_FULL_48BIT_PPGTT(dev_priv) (i915_modparams.enable_ppgtt == 3) |
|---|
| 1657 | +#define INTEL_PPGTT(dev_priv) (INTEL_INFO(dev_priv)->ppgtt_type) |
|---|
| 1658 | +#define HAS_PPGTT(dev_priv) \ |
|---|
| 1659 | + (INTEL_PPGTT(dev_priv) != INTEL_PPGTT_NONE) |
|---|
| 1660 | +#define HAS_FULL_PPGTT(dev_priv) \ |
|---|
| 1661 | + (INTEL_PPGTT(dev_priv) >= INTEL_PPGTT_FULL) |
|---|
| 1662 | + |
|---|
| 2553 | 1663 | #define HAS_PAGE_SIZES(dev_priv, sizes) ({ \ |
|---|
| 2554 | 1664 | GEM_BUG_ON((sizes) == 0); \ |
|---|
| 2555 | | - ((sizes) & ~(dev_priv)->info.page_sizes) == 0; \ |
|---|
| 1665 | + ((sizes) & ~INTEL_INFO(dev_priv)->page_sizes) == 0; \ |
|---|
| 2556 | 1666 | }) |
|---|
| 2557 | 1667 | |
|---|
| 2558 | | -#define HAS_OVERLAY(dev_priv) ((dev_priv)->info.has_overlay) |
|---|
| 1668 | +#define HAS_OVERLAY(dev_priv) (INTEL_INFO(dev_priv)->display.has_overlay) |
|---|
| 2559 | 1669 | #define OVERLAY_NEEDS_PHYSICAL(dev_priv) \ |
|---|
| 2560 | | - ((dev_priv)->info.overlay_needs_physical) |
|---|
| 1670 | + (INTEL_INFO(dev_priv)->display.overlay_needs_physical) |
|---|
| 2561 | 1671 | |
|---|
| 2562 | 1672 | /* Early gen2 have a totally busted CS tlb and require pinned batches. */ |
|---|
| 2563 | 1673 | #define HAS_BROKEN_CS_TLB(dev_priv) (IS_I830(dev_priv) || IS_I845G(dev_priv)) |
|---|
| 2564 | 1674 | |
|---|
| 2565 | 1675 | #define NEEDS_RC6_CTX_CORRUPTION_WA(dev_priv) \ |
|---|
| 2566 | | - (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) == 9) |
|---|
| 1676 | + (IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9)) |
|---|
| 2567 | 1677 | |
|---|
| 2568 | 1678 | /* WaRsDisableCoarsePowerGating:skl,cnl */ |
|---|
| 2569 | | -#define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \ |
|---|
| 2570 | | - (IS_CANNONLAKE(dev_priv) || INTEL_GEN(dev_priv) == 9) |
|---|
| 1679 | +#define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \ |
|---|
| 1680 | + (IS_CANNONLAKE(dev_priv) || \ |
|---|
| 1681 | + IS_SKL_GT3(dev_priv) || \ |
|---|
| 1682 | + IS_SKL_GT4(dev_priv)) |
|---|
| 2571 | 1683 | |
|---|
| 2572 | 1684 | #define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4) |
|---|
| 2573 | 1685 | #define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \ |
|---|
| .. | .. |
|---|
| 2577 | 1689 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte |
|---|
| 2578 | 1690 | * rows, which changed the alignment requirements and fence programming. |
|---|
| 2579 | 1691 | */ |
|---|
| 2580 | | -#define HAS_128_BYTE_Y_TILING(dev_priv) (!IS_GEN2(dev_priv) && \ |
|---|
| 1692 | +#define HAS_128_BYTE_Y_TILING(dev_priv) (!IS_GEN(dev_priv, 2) && \ |
|---|
| 2581 | 1693 | !(IS_I915G(dev_priv) || \ |
|---|
| 2582 | 1694 | IS_I915GM(dev_priv))) |
|---|
| 2583 | | -#define SUPPORTS_TV(dev_priv) ((dev_priv)->info.supports_tv) |
|---|
| 2584 | | -#define I915_HAS_HOTPLUG(dev_priv) ((dev_priv)->info.has_hotplug) |
|---|
| 1695 | +#define SUPPORTS_TV(dev_priv) (INTEL_INFO(dev_priv)->display.supports_tv) |
|---|
| 1696 | +#define I915_HAS_HOTPLUG(dev_priv) (INTEL_INFO(dev_priv)->display.has_hotplug) |
|---|
| 2585 | 1697 | |
|---|
| 2586 | 1698 | #define HAS_FW_BLC(dev_priv) (INTEL_GEN(dev_priv) > 2) |
|---|
| 2587 | | -#define HAS_FBC(dev_priv) ((dev_priv)->info.has_fbc) |
|---|
| 2588 | | -#define HAS_CUR_FBC(dev_priv) (!HAS_GMCH_DISPLAY(dev_priv) && INTEL_GEN(dev_priv) >= 7) |
|---|
| 1699 | +#define HAS_FBC(dev_priv) (INTEL_INFO(dev_priv)->display.has_fbc) |
|---|
| 1700 | +#define HAS_CUR_FBC(dev_priv) (!HAS_GMCH(dev_priv) && INTEL_GEN(dev_priv) >= 7) |
|---|
| 2589 | 1701 | |
|---|
| 2590 | 1702 | #define HAS_IPS(dev_priv) (IS_HSW_ULT(dev_priv) || IS_BROADWELL(dev_priv)) |
|---|
| 2591 | 1703 | |
|---|
| 2592 | | -#define HAS_DP_MST(dev_priv) ((dev_priv)->info.has_dp_mst) |
|---|
| 1704 | +#define HAS_DP_MST(dev_priv) (INTEL_INFO(dev_priv)->display.has_dp_mst) |
|---|
| 2593 | 1705 | |
|---|
| 2594 | | -#define HAS_DDI(dev_priv) ((dev_priv)->info.has_ddi) |
|---|
| 2595 | | -#define HAS_FPGA_DBG_UNCLAIMED(dev_priv) ((dev_priv)->info.has_fpga_dbg) |
|---|
| 2596 | | -#define HAS_PSR(dev_priv) ((dev_priv)->info.has_psr) |
|---|
| 1706 | +#define HAS_DDI(dev_priv) (INTEL_INFO(dev_priv)->display.has_ddi) |
|---|
| 1707 | +#define HAS_FPGA_DBG_UNCLAIMED(dev_priv) (INTEL_INFO(dev_priv)->has_fpga_dbg) |
|---|
| 1708 | +#define HAS_PSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_psr) |
|---|
| 1709 | +#define HAS_PSR_HW_TRACKING(dev_priv) \ |
|---|
| 1710 | + (INTEL_INFO(dev_priv)->display.has_psr_hw_tracking) |
|---|
| 1711 | +#define HAS_PSR2_SEL_FETCH(dev_priv) (INTEL_GEN(dev_priv) >= 12) |
|---|
| 1712 | +#define HAS_TRANSCODER(dev_priv, trans) ((INTEL_INFO(dev_priv)->cpu_transcoder_mask & BIT(trans)) != 0) |
|---|
| 2597 | 1713 | |
|---|
| 2598 | | -#define HAS_RC6(dev_priv) ((dev_priv)->info.has_rc6) |
|---|
| 2599 | | -#define HAS_RC6p(dev_priv) ((dev_priv)->info.has_rc6p) |
|---|
| 1714 | +#define HAS_RC6(dev_priv) (INTEL_INFO(dev_priv)->has_rc6) |
|---|
| 1715 | +#define HAS_RC6p(dev_priv) (INTEL_INFO(dev_priv)->has_rc6p) |
|---|
| 2600 | 1716 | #define HAS_RC6pp(dev_priv) (false) /* HW was never validated */ |
|---|
| 2601 | 1717 | |
|---|
| 2602 | | -#define HAS_CSR(dev_priv) ((dev_priv)->info.has_csr) |
|---|
| 1718 | +#define HAS_RPS(dev_priv) (INTEL_INFO(dev_priv)->has_rps) |
|---|
| 2603 | 1719 | |
|---|
| 2604 | | -#define HAS_RUNTIME_PM(dev_priv) ((dev_priv)->info.has_runtime_pm) |
|---|
| 2605 | | -#define HAS_64BIT_RELOC(dev_priv) ((dev_priv)->info.has_64bit_reloc) |
|---|
| 1720 | +#define HAS_CSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_csr) |
|---|
| 2606 | 1721 | |
|---|
| 2607 | | -#define HAS_IPC(dev_priv) ((dev_priv)->info.has_ipc) |
|---|
| 1722 | +#define HAS_RUNTIME_PM(dev_priv) (INTEL_INFO(dev_priv)->has_runtime_pm) |
|---|
| 1723 | +#define HAS_64BIT_RELOC(dev_priv) (INTEL_INFO(dev_priv)->has_64bit_reloc) |
|---|
| 2608 | 1724 | |
|---|
| 2609 | | -/* |
|---|
| 2610 | | - * For now, anything with a GuC requires uCode loading, and then supports |
|---|
| 2611 | | - * command submission once loaded. But these are logically independent |
|---|
| 2612 | | - * properties, so we have separate macros to test them. |
|---|
| 2613 | | - */ |
|---|
| 2614 | | -#define HAS_GUC(dev_priv) ((dev_priv)->info.has_guc) |
|---|
| 2615 | | -#define HAS_GUC_CT(dev_priv) ((dev_priv)->info.has_guc_ct) |
|---|
| 2616 | | -#define HAS_GUC_UCODE(dev_priv) (HAS_GUC(dev_priv)) |
|---|
| 2617 | | -#define HAS_GUC_SCHED(dev_priv) (HAS_GUC(dev_priv)) |
|---|
| 1725 | +#define HAS_IPC(dev_priv) (INTEL_INFO(dev_priv)->display.has_ipc) |
|---|
| 2618 | 1726 | |
|---|
| 2619 | | -/* For now, anything with a GuC has also HuC */ |
|---|
| 2620 | | -#define HAS_HUC(dev_priv) (HAS_GUC(dev_priv)) |
|---|
| 2621 | | -#define HAS_HUC_UCODE(dev_priv) (HAS_GUC(dev_priv)) |
|---|
| 1727 | +#define HAS_REGION(i915, i) (INTEL_INFO(i915)->memory_regions & (i)) |
|---|
| 1728 | +#define HAS_LMEM(i915) HAS_REGION(i915, REGION_LMEM) |
|---|
| 2622 | 1729 | |
|---|
| 2623 | | -/* Having a GuC is not the same as using a GuC */ |
|---|
| 2624 | | -#define USES_GUC(dev_priv) intel_uc_is_using_guc() |
|---|
| 2625 | | -#define USES_GUC_SUBMISSION(dev_priv) intel_uc_is_using_guc_submission() |
|---|
| 2626 | | -#define USES_HUC(dev_priv) intel_uc_is_using_huc() |
|---|
| 1730 | +#define HAS_GT_UC(dev_priv) (INTEL_INFO(dev_priv)->has_gt_uc) |
|---|
| 2627 | 1731 | |
|---|
| 2628 | | -#define HAS_RESOURCE_STREAMER(dev_priv) ((dev_priv)->info.has_resource_streamer) |
|---|
| 1732 | +#define HAS_POOLED_EU(dev_priv) (INTEL_INFO(dev_priv)->has_pooled_eu) |
|---|
| 2629 | 1733 | |
|---|
| 2630 | | -#define HAS_POOLED_EU(dev_priv) ((dev_priv)->info.has_pooled_eu) |
|---|
| 1734 | +#define HAS_GLOBAL_MOCS_REGISTERS(dev_priv) (INTEL_INFO(dev_priv)->has_global_mocs) |
|---|
| 2631 | 1735 | |
|---|
| 2632 | | -#define INTEL_PCH_DEVICE_ID_MASK 0xff80 |
|---|
| 2633 | | -#define INTEL_PCH_IBX_DEVICE_ID_TYPE 0x3b00 |
|---|
| 2634 | | -#define INTEL_PCH_CPT_DEVICE_ID_TYPE 0x1c00 |
|---|
| 2635 | | -#define INTEL_PCH_PPT_DEVICE_ID_TYPE 0x1e00 |
|---|
| 2636 | | -#define INTEL_PCH_LPT_DEVICE_ID_TYPE 0x8c00 |
|---|
| 2637 | | -#define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE 0x9c00 |
|---|
| 2638 | | -#define INTEL_PCH_WPT_DEVICE_ID_TYPE 0x8c80 |
|---|
| 2639 | | -#define INTEL_PCH_WPT_LP_DEVICE_ID_TYPE 0x9c80 |
|---|
| 2640 | | -#define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100 |
|---|
| 2641 | | -#define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00 |
|---|
| 2642 | | -#define INTEL_PCH_KBP_DEVICE_ID_TYPE 0xA280 |
|---|
| 2643 | | -#define INTEL_PCH_CNP_DEVICE_ID_TYPE 0xA300 |
|---|
| 2644 | | -#define INTEL_PCH_CNP_LP_DEVICE_ID_TYPE 0x9D80 |
|---|
| 2645 | | -#define INTEL_PCH_ICP_DEVICE_ID_TYPE 0x3480 |
|---|
| 2646 | | -#define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 |
|---|
| 2647 | | -#define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000 |
|---|
| 2648 | | -#define INTEL_PCH_QEMU_DEVICE_ID_TYPE 0x2900 /* qemu q35 has 2918 */ |
|---|
| 2649 | 1736 | |
|---|
| 2650 | | -#define INTEL_PCH_TYPE(dev_priv) ((dev_priv)->pch_type) |
|---|
| 2651 | | -#define INTEL_PCH_ID(dev_priv) ((dev_priv)->pch_id) |
|---|
| 2652 | | -#define HAS_PCH_ICP(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_ICP) |
|---|
| 2653 | | -#define HAS_PCH_CNP(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_CNP) |
|---|
| 2654 | | -#define HAS_PCH_CNP_LP(dev_priv) \ |
|---|
| 2655 | | - (INTEL_PCH_ID(dev_priv) == INTEL_PCH_CNP_LP_DEVICE_ID_TYPE) |
|---|
| 2656 | | -#define HAS_PCH_KBP(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_KBP) |
|---|
| 2657 | | -#define HAS_PCH_SPT(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_SPT) |
|---|
| 2658 | | -#define HAS_PCH_LPT(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_LPT) |
|---|
| 2659 | | -#define HAS_PCH_LPT_LP(dev_priv) \ |
|---|
| 2660 | | - (INTEL_PCH_ID(dev_priv) == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE || \ |
|---|
| 2661 | | - INTEL_PCH_ID(dev_priv) == INTEL_PCH_WPT_LP_DEVICE_ID_TYPE) |
|---|
| 2662 | | -#define HAS_PCH_LPT_H(dev_priv) \ |
|---|
| 2663 | | - (INTEL_PCH_ID(dev_priv) == INTEL_PCH_LPT_DEVICE_ID_TYPE || \ |
|---|
| 2664 | | - INTEL_PCH_ID(dev_priv) == INTEL_PCH_WPT_DEVICE_ID_TYPE) |
|---|
| 2665 | | -#define HAS_PCH_CPT(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_CPT) |
|---|
| 2666 | | -#define HAS_PCH_IBX(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_IBX) |
|---|
| 2667 | | -#define HAS_PCH_NOP(dev_priv) (INTEL_PCH_TYPE(dev_priv) == PCH_NOP) |
|---|
| 2668 | | -#define HAS_PCH_SPLIT(dev_priv) (INTEL_PCH_TYPE(dev_priv) != PCH_NONE) |
|---|
| 2669 | | - |
|---|
| 2670 | | -#define HAS_GMCH_DISPLAY(dev_priv) ((dev_priv)->info.has_gmch_display) |
|---|
| 1737 | +#define HAS_GMCH(dev_priv) (INTEL_INFO(dev_priv)->display.has_gmch) |
|---|
| 2671 | 1738 | |
|---|
| 2672 | 1739 | #define HAS_LSPCON(dev_priv) (INTEL_GEN(dev_priv) >= 9) |
|---|
| 2673 | 1740 | |
|---|
| 2674 | 1741 | /* DPF == dynamic parity feature */ |
|---|
| 2675 | | -#define HAS_L3_DPF(dev_priv) ((dev_priv)->info.has_l3_dpf) |
|---|
| 1742 | +#define HAS_L3_DPF(dev_priv) (INTEL_INFO(dev_priv)->has_l3_dpf) |
|---|
| 2676 | 1743 | #define NUM_L3_SLICES(dev_priv) (IS_HSW_GT3(dev_priv) ? \ |
|---|
| 2677 | 1744 | 2 : HAS_L3_DPF(dev_priv)) |
|---|
| 2678 | 1745 | |
|---|
| 2679 | 1746 | #define GT_FREQUENCY_MULTIPLIER 50 |
|---|
| 2680 | 1747 | #define GEN9_FREQ_SCALER 3 |
|---|
| 2681 | 1748 | |
|---|
| 2682 | | -#include "i915_trace.h" |
|---|
| 1749 | +#define INTEL_NUM_PIPES(dev_priv) (hweight8(INTEL_INFO(dev_priv)->pipe_mask)) |
|---|
| 1750 | + |
|---|
| 1751 | +#define HAS_DISPLAY(dev_priv) (INTEL_INFO(dev_priv)->pipe_mask != 0) |
|---|
| 1752 | + |
|---|
| 1753 | +/* Only valid when HAS_DISPLAY() is true */ |
|---|
| 1754 | +#define INTEL_DISPLAY_ENABLED(dev_priv) \ |
|---|
| 1755 | + (drm_WARN_ON(&(dev_priv)->drm, !HAS_DISPLAY(dev_priv)), !(dev_priv)->params.disable_display) |
|---|
| 2683 | 1756 | |
|---|
| 2684 | 1757 | static inline bool intel_vtd_active(void) |
|---|
| 2685 | 1758 | { |
|---|
| .. | .. |
|---|
| 2703 | 1776 | return IS_BROXTON(dev_priv) && intel_vtd_active(); |
|---|
| 2704 | 1777 | } |
|---|
| 2705 | 1778 | |
|---|
| 2706 | | -int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv, |
|---|
| 2707 | | - int enable_ppgtt); |
|---|
| 2708 | | - |
|---|
| 2709 | 1779 | /* i915_drv.c */ |
|---|
| 2710 | | -void __printf(3, 4) |
|---|
| 2711 | | -__i915_printk(struct drm_i915_private *dev_priv, const char *level, |
|---|
| 2712 | | - const char *fmt, ...); |
|---|
| 2713 | | - |
|---|
| 2714 | | -#define i915_report_error(dev_priv, fmt, ...) \ |
|---|
| 2715 | | - __i915_printk(dev_priv, KERN_ERR, fmt, ##__VA_ARGS__) |
|---|
| 2716 | | - |
|---|
| 2717 | | -#ifdef CONFIG_COMPAT |
|---|
| 2718 | | -extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, |
|---|
| 2719 | | - unsigned long arg); |
|---|
| 2720 | | -#else |
|---|
| 2721 | | -#define i915_compat_ioctl NULL |
|---|
| 2722 | | -#endif |
|---|
| 2723 | 1780 | extern const struct dev_pm_ops i915_pm_ops; |
|---|
| 2724 | 1781 | |
|---|
| 2725 | | -extern int i915_driver_load(struct pci_dev *pdev, |
|---|
| 2726 | | - const struct pci_device_id *ent); |
|---|
| 2727 | | -extern void i915_driver_unload(struct drm_device *dev); |
|---|
| 2728 | | -extern int intel_gpu_reset(struct drm_i915_private *dev_priv, u32 engine_mask); |
|---|
| 2729 | | -extern bool intel_has_gpu_reset(struct drm_i915_private *dev_priv); |
|---|
| 1782 | +int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent); |
|---|
| 1783 | +void i915_driver_remove(struct drm_i915_private *i915); |
|---|
| 2730 | 1784 | |
|---|
| 2731 | | -extern void i915_reset(struct drm_i915_private *i915, |
|---|
| 2732 | | - unsigned int stalled_mask, |
|---|
| 2733 | | - const char *reason); |
|---|
| 2734 | | -extern int i915_reset_engine(struct intel_engine_cs *engine, |
|---|
| 2735 | | - const char *reason); |
|---|
| 1785 | +int i915_resume_switcheroo(struct drm_i915_private *i915); |
|---|
| 1786 | +int i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state); |
|---|
| 2736 | 1787 | |
|---|
| 2737 | | -extern bool intel_has_reset_engine(struct drm_i915_private *dev_priv); |
|---|
| 2738 | | -extern int intel_reset_guc(struct drm_i915_private *dev_priv); |
|---|
| 2739 | | -extern int intel_guc_reset_engine(struct intel_guc *guc, |
|---|
| 2740 | | - struct intel_engine_cs *engine); |
|---|
| 2741 | | -extern void intel_engine_init_hangcheck(struct intel_engine_cs *engine); |
|---|
| 2742 | | -extern void intel_hangcheck_init(struct drm_i915_private *dev_priv); |
|---|
| 2743 | | -extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); |
|---|
| 2744 | | -extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv); |
|---|
| 2745 | | -extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); |
|---|
| 2746 | | -extern void i915_update_gfx_val(struct drm_i915_private *dev_priv); |
|---|
| 2747 | | -int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on); |
|---|
| 2748 | | - |
|---|
| 2749 | | -int intel_engines_init_mmio(struct drm_i915_private *dev_priv); |
|---|
| 2750 | | -int intel_engines_init(struct drm_i915_private *dev_priv); |
|---|
| 2751 | | - |
|---|
| 2752 | | -u32 intel_calculate_mcr_s_ss_select(struct drm_i915_private *dev_priv); |
|---|
| 2753 | | - |
|---|
| 2754 | | -/* intel_hotplug.c */ |
|---|
| 2755 | | -void intel_hpd_irq_handler(struct drm_i915_private *dev_priv, |
|---|
| 2756 | | - u32 pin_mask, u32 long_mask); |
|---|
| 2757 | | -void intel_hpd_init(struct drm_i915_private *dev_priv); |
|---|
| 2758 | | -void intel_hpd_init_work(struct drm_i915_private *dev_priv); |
|---|
| 2759 | | -void intel_hpd_cancel_work(struct drm_i915_private *dev_priv); |
|---|
| 2760 | | -enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv, |
|---|
| 2761 | | - enum port port); |
|---|
| 2762 | | -bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin); |
|---|
| 2763 | | -void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin); |
|---|
| 2764 | | - |
|---|
| 2765 | | -/* i915_irq.c */ |
|---|
| 2766 | | -static inline void i915_queue_hangcheck(struct drm_i915_private *dev_priv) |
|---|
| 2767 | | -{ |
|---|
| 2768 | | - unsigned long delay; |
|---|
| 2769 | | - |
|---|
| 2770 | | - if (unlikely(!i915_modparams.enable_hangcheck)) |
|---|
| 2771 | | - return; |
|---|
| 2772 | | - |
|---|
| 2773 | | - /* Don't continually defer the hangcheck so that it is always run at |
|---|
| 2774 | | - * least once after work has been scheduled on any ring. Otherwise, |
|---|
| 2775 | | - * we will ignore a hung ring if a second ring is kept busy. |
|---|
| 2776 | | - */ |
|---|
| 2777 | | - |
|---|
| 2778 | | - delay = round_jiffies_up_relative(DRM_I915_HANGCHECK_JIFFIES); |
|---|
| 2779 | | - queue_delayed_work(system_long_wq, |
|---|
| 2780 | | - &dev_priv->gpu_error.hangcheck_work, delay); |
|---|
| 2781 | | -} |
|---|
| 2782 | | - |
|---|
| 2783 | | -__printf(4, 5) |
|---|
| 2784 | | -void i915_handle_error(struct drm_i915_private *dev_priv, |
|---|
| 2785 | | - u32 engine_mask, |
|---|
| 2786 | | - unsigned long flags, |
|---|
| 2787 | | - const char *fmt, ...); |
|---|
| 2788 | | -#define I915_ERROR_CAPTURE BIT(0) |
|---|
| 2789 | | - |
|---|
| 2790 | | -extern void intel_irq_init(struct drm_i915_private *dev_priv); |
|---|
| 2791 | | -extern void intel_irq_fini(struct drm_i915_private *dev_priv); |
|---|
| 2792 | | -int intel_irq_install(struct drm_i915_private *dev_priv); |
|---|
| 2793 | | -void intel_irq_uninstall(struct drm_i915_private *dev_priv); |
|---|
| 2794 | | - |
|---|
| 2795 | | -static inline bool intel_gvt_active(struct drm_i915_private *dev_priv) |
|---|
| 2796 | | -{ |
|---|
| 2797 | | - return dev_priv->gvt; |
|---|
| 2798 | | -} |
|---|
| 2799 | | - |
|---|
| 2800 | | -static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv) |
|---|
| 2801 | | -{ |
|---|
| 2802 | | - return dev_priv->vgpu.active; |
|---|
| 2803 | | -} |
|---|
| 2804 | | - |
|---|
| 2805 | | -u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv, |
|---|
| 2806 | | - enum pipe pipe); |
|---|
| 2807 | | -void |
|---|
| 2808 | | -i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
|---|
| 2809 | | - u32 status_mask); |
|---|
| 2810 | | - |
|---|
| 2811 | | -void |
|---|
| 2812 | | -i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
|---|
| 2813 | | - u32 status_mask); |
|---|
| 2814 | | - |
|---|
| 2815 | | -void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv); |
|---|
| 2816 | | -void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv); |
|---|
| 2817 | | -void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv, |
|---|
| 2818 | | - uint32_t mask, |
|---|
| 2819 | | - uint32_t bits); |
|---|
| 2820 | | -void ilk_update_display_irq(struct drm_i915_private *dev_priv, |
|---|
| 2821 | | - uint32_t interrupt_mask, |
|---|
| 2822 | | - uint32_t enabled_irq_mask); |
|---|
| 2823 | | -static inline void |
|---|
| 2824 | | -ilk_enable_display_irq(struct drm_i915_private *dev_priv, uint32_t bits) |
|---|
| 2825 | | -{ |
|---|
| 2826 | | - ilk_update_display_irq(dev_priv, bits, bits); |
|---|
| 2827 | | -} |
|---|
| 2828 | | -static inline void |
|---|
| 2829 | | -ilk_disable_display_irq(struct drm_i915_private *dev_priv, uint32_t bits) |
|---|
| 2830 | | -{ |
|---|
| 2831 | | - ilk_update_display_irq(dev_priv, bits, 0); |
|---|
| 2832 | | -} |
|---|
| 2833 | | -void bdw_update_pipe_irq(struct drm_i915_private *dev_priv, |
|---|
| 2834 | | - enum pipe pipe, |
|---|
| 2835 | | - uint32_t interrupt_mask, |
|---|
| 2836 | | - uint32_t enabled_irq_mask); |
|---|
| 2837 | | -static inline void bdw_enable_pipe_irq(struct drm_i915_private *dev_priv, |
|---|
| 2838 | | - enum pipe pipe, uint32_t bits) |
|---|
| 2839 | | -{ |
|---|
| 2840 | | - bdw_update_pipe_irq(dev_priv, pipe, bits, bits); |
|---|
| 2841 | | -} |
|---|
| 2842 | | -static inline void bdw_disable_pipe_irq(struct drm_i915_private *dev_priv, |
|---|
| 2843 | | - enum pipe pipe, uint32_t bits) |
|---|
| 2844 | | -{ |
|---|
| 2845 | | - bdw_update_pipe_irq(dev_priv, pipe, bits, 0); |
|---|
| 2846 | | -} |
|---|
| 2847 | | -void ibx_display_interrupt_update(struct drm_i915_private *dev_priv, |
|---|
| 2848 | | - uint32_t interrupt_mask, |
|---|
| 2849 | | - uint32_t enabled_irq_mask); |
|---|
| 2850 | | -static inline void |
|---|
| 2851 | | -ibx_enable_display_interrupt(struct drm_i915_private *dev_priv, uint32_t bits) |
|---|
| 2852 | | -{ |
|---|
| 2853 | | - ibx_display_interrupt_update(dev_priv, bits, bits); |
|---|
| 2854 | | -} |
|---|
| 2855 | | -static inline void |
|---|
| 2856 | | -ibx_disable_display_interrupt(struct drm_i915_private *dev_priv, uint32_t bits) |
|---|
| 2857 | | -{ |
|---|
| 2858 | | - ibx_display_interrupt_update(dev_priv, bits, 0); |
|---|
| 2859 | | -} |
|---|
| 1788 | +int i915_getparam_ioctl(struct drm_device *dev, void *data, |
|---|
| 1789 | + struct drm_file *file_priv); |
|---|
| 2860 | 1790 | |
|---|
| 2861 | 1791 | /* i915_gem.c */ |
|---|
| 2862 | | -int i915_gem_create_ioctl(struct drm_device *dev, void *data, |
|---|
| 2863 | | - struct drm_file *file_priv); |
|---|
| 2864 | | -int i915_gem_pread_ioctl(struct drm_device *dev, void *data, |
|---|
| 2865 | | - struct drm_file *file_priv); |
|---|
| 2866 | | -int i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, |
|---|
| 2867 | | - struct drm_file *file_priv); |
|---|
| 2868 | | -int i915_gem_mmap_ioctl(struct drm_device *dev, void *data, |
|---|
| 2869 | | - struct drm_file *file_priv); |
|---|
| 2870 | | -int i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, |
|---|
| 2871 | | - struct drm_file *file_priv); |
|---|
| 2872 | | -int i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, |
|---|
| 2873 | | - struct drm_file *file_priv); |
|---|
| 2874 | | -int i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, |
|---|
| 2875 | | - struct drm_file *file_priv); |
|---|
| 2876 | | -int i915_gem_execbuffer_ioctl(struct drm_device *dev, void *data, |
|---|
| 2877 | | - struct drm_file *file_priv); |
|---|
| 2878 | | -int i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data, |
|---|
| 2879 | | - struct drm_file *file_priv); |
|---|
| 2880 | | -int i915_gem_busy_ioctl(struct drm_device *dev, void *data, |
|---|
| 2881 | | - struct drm_file *file_priv); |
|---|
| 2882 | | -int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data, |
|---|
| 2883 | | - struct drm_file *file); |
|---|
| 2884 | | -int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, |
|---|
| 2885 | | - struct drm_file *file); |
|---|
| 2886 | | -int i915_gem_throttle_ioctl(struct drm_device *dev, void *data, |
|---|
| 2887 | | - struct drm_file *file_priv); |
|---|
| 2888 | | -int i915_gem_madvise_ioctl(struct drm_device *dev, void *data, |
|---|
| 2889 | | - struct drm_file *file_priv); |
|---|
| 2890 | | -int i915_gem_set_tiling_ioctl(struct drm_device *dev, void *data, |
|---|
| 2891 | | - struct drm_file *file_priv); |
|---|
| 2892 | | -int i915_gem_get_tiling_ioctl(struct drm_device *dev, void *data, |
|---|
| 2893 | | - struct drm_file *file_priv); |
|---|
| 2894 | 1792 | int i915_gem_init_userptr(struct drm_i915_private *dev_priv); |
|---|
| 2895 | 1793 | void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv); |
|---|
| 2896 | | -int i915_gem_userptr_ioctl(struct drm_device *dev, void *data, |
|---|
| 2897 | | - struct drm_file *file); |
|---|
| 2898 | | -int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
|---|
| 2899 | | - struct drm_file *file_priv); |
|---|
| 2900 | | -int i915_gem_wait_ioctl(struct drm_device *dev, void *data, |
|---|
| 2901 | | - struct drm_file *file_priv); |
|---|
| 2902 | | -void i915_gem_sanitize(struct drm_i915_private *i915); |
|---|
| 2903 | | -int i915_gem_init_early(struct drm_i915_private *dev_priv); |
|---|
| 1794 | +void i915_gem_init_early(struct drm_i915_private *dev_priv); |
|---|
| 2904 | 1795 | void i915_gem_cleanup_early(struct drm_i915_private *dev_priv); |
|---|
| 2905 | | -void i915_gem_load_init_fences(struct drm_i915_private *dev_priv); |
|---|
| 2906 | 1796 | int i915_gem_freeze(struct drm_i915_private *dev_priv); |
|---|
| 2907 | 1797 | int i915_gem_freeze_late(struct drm_i915_private *dev_priv); |
|---|
| 2908 | 1798 | |
|---|
| 2909 | | -void *i915_gem_object_alloc(struct drm_i915_private *dev_priv); |
|---|
| 2910 | | -void i915_gem_object_free(struct drm_i915_gem_object *obj); |
|---|
| 2911 | | -void i915_gem_object_init(struct drm_i915_gem_object *obj, |
|---|
| 2912 | | - const struct drm_i915_gem_object_ops *ops); |
|---|
| 2913 | | -struct drm_i915_gem_object * |
|---|
| 2914 | | -i915_gem_object_create(struct drm_i915_private *dev_priv, u64 size); |
|---|
| 2915 | | -struct drm_i915_gem_object * |
|---|
| 2916 | | -i915_gem_object_create_from_data(struct drm_i915_private *dev_priv, |
|---|
| 2917 | | - const void *data, size_t size); |
|---|
| 2918 | | -void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file); |
|---|
| 2919 | | -void i915_gem_free_object(struct drm_gem_object *obj); |
|---|
| 1799 | +struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915); |
|---|
| 2920 | 1800 | |
|---|
| 2921 | 1801 | static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) |
|---|
| 2922 | 1802 | { |
|---|
| 2923 | | - if (!atomic_read(&i915->mm.free_count)) |
|---|
| 2924 | | - return; |
|---|
| 2925 | | - |
|---|
| 2926 | | - /* A single pass should suffice to release all the freed objects (along |
|---|
| 1803 | + /* |
|---|
| 1804 | + * A single pass should suffice to release all the freed objects (along |
|---|
| 2927 | 1805 | * most call paths) , but be a little more paranoid in that freeing |
|---|
| 2928 | 1806 | * the objects does take a little amount of time, during which the rcu |
|---|
| 2929 | 1807 | * callbacks could have added new objects into the freed list, and |
|---|
| 2930 | 1808 | * armed the work again. |
|---|
| 2931 | 1809 | */ |
|---|
| 2932 | | - do { |
|---|
| 1810 | + while (atomic_read(&i915->mm.free_count)) { |
|---|
| 1811 | + flush_work(&i915->mm.free_work); |
|---|
| 2933 | 1812 | rcu_barrier(); |
|---|
| 2934 | | - } while (flush_work(&i915->mm.free_work)); |
|---|
| 1813 | + } |
|---|
| 2935 | 1814 | } |
|---|
| 2936 | 1815 | |
|---|
| 2937 | 1816 | static inline void i915_gem_drain_workqueue(struct drm_i915_private *i915) |
|---|
| .. | .. |
|---|
| 2944 | 1823 | * grace period so that we catch work queued via RCU from the first |
|---|
| 2945 | 1824 | * pass. As neither drain_workqueue() nor flush_workqueue() report |
|---|
| 2946 | 1825 | * a result, we make an assumption that we only don't require more |
|---|
| 2947 | | - * than 2 passes to catch all recursive RCU delayed work. |
|---|
| 1826 | + * than 3 passes to catch all _recursive_ RCU delayed work. |
|---|
| 2948 | 1827 | * |
|---|
| 2949 | 1828 | */ |
|---|
| 2950 | | - int pass = 2; |
|---|
| 1829 | + int pass = 3; |
|---|
| 2951 | 1830 | do { |
|---|
| 1831 | + flush_workqueue(i915->wq); |
|---|
| 2952 | 1832 | rcu_barrier(); |
|---|
| 2953 | | - drain_workqueue(i915->wq); |
|---|
| 1833 | + i915_gem_drain_freed_objects(i915); |
|---|
| 2954 | 1834 | } while (--pass); |
|---|
| 1835 | + drain_workqueue(i915->wq); |
|---|
| 2955 | 1836 | } |
|---|
| 2956 | 1837 | |
|---|
| 2957 | 1838 | struct i915_vma * __must_check |
|---|
| 1839 | +i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj, |
|---|
| 1840 | + struct i915_gem_ww_ctx *ww, |
|---|
| 1841 | + const struct i915_ggtt_view *view, |
|---|
| 1842 | + u64 size, u64 alignment, u64 flags); |
|---|
| 1843 | + |
|---|
| 1844 | +static inline struct i915_vma * __must_check |
|---|
| 2958 | 1845 | i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, |
|---|
| 2959 | 1846 | const struct i915_ggtt_view *view, |
|---|
| 2960 | | - u64 size, |
|---|
| 2961 | | - u64 alignment, |
|---|
| 2962 | | - u64 flags); |
|---|
| 1847 | + u64 size, u64 alignment, u64 flags) |
|---|
| 1848 | +{ |
|---|
| 1849 | + return i915_gem_object_ggtt_pin_ww(obj, NULL, view, size, alignment, flags); |
|---|
| 1850 | +} |
|---|
| 2963 | 1851 | |
|---|
| 2964 | | -struct i915_vma * __must_check |
|---|
| 2965 | | -i915_gem_object_pin(struct drm_i915_gem_object *obj, |
|---|
| 2966 | | - struct i915_address_space *vm, |
|---|
| 2967 | | - const struct i915_ggtt_view *view, |
|---|
| 2968 | | - u64 size, |
|---|
| 2969 | | - u64 alignment, |
|---|
| 2970 | | - u64 flags); |
|---|
| 2971 | | - |
|---|
| 2972 | | -int i915_gem_object_unbind(struct drm_i915_gem_object *obj); |
|---|
| 2973 | | -void i915_gem_release_mmap(struct drm_i915_gem_object *obj); |
|---|
| 1852 | +int i915_gem_object_unbind(struct drm_i915_gem_object *obj, |
|---|
| 1853 | + unsigned long flags); |
|---|
| 1854 | +#define I915_GEM_OBJECT_UNBIND_ACTIVE BIT(0) |
|---|
| 1855 | +#define I915_GEM_OBJECT_UNBIND_BARRIER BIT(1) |
|---|
| 1856 | +#define I915_GEM_OBJECT_UNBIND_TEST BIT(2) |
|---|
| 2974 | 1857 | |
|---|
| 2975 | 1858 | void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv); |
|---|
| 2976 | 1859 | |
|---|
| 2977 | | -static inline int __sg_page_count(const struct scatterlist *sg) |
|---|
| 2978 | | -{ |
|---|
| 2979 | | - return sg->length >> PAGE_SHIFT; |
|---|
| 2980 | | -} |
|---|
| 2981 | | - |
|---|
| 2982 | | -struct scatterlist * |
|---|
| 2983 | | -i915_gem_object_get_sg(struct drm_i915_gem_object *obj, |
|---|
| 2984 | | - unsigned int n, unsigned int *offset); |
|---|
| 2985 | | - |
|---|
| 2986 | | -struct page * |
|---|
| 2987 | | -i915_gem_object_get_page(struct drm_i915_gem_object *obj, |
|---|
| 2988 | | - unsigned int n); |
|---|
| 2989 | | - |
|---|
| 2990 | | -struct page * |
|---|
| 2991 | | -i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, |
|---|
| 2992 | | - unsigned int n); |
|---|
| 2993 | | - |
|---|
| 2994 | | -dma_addr_t |
|---|
| 2995 | | -i915_gem_object_get_dma_address(struct drm_i915_gem_object *obj, |
|---|
| 2996 | | - unsigned long n); |
|---|
| 2997 | | - |
|---|
| 2998 | | -void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj, |
|---|
| 2999 | | - struct sg_table *pages, |
|---|
| 3000 | | - unsigned int sg_page_sizes); |
|---|
| 3001 | | -int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj); |
|---|
| 3002 | | - |
|---|
| 3003 | | -static inline int __must_check |
|---|
| 3004 | | -i915_gem_object_pin_pages(struct drm_i915_gem_object *obj) |
|---|
| 3005 | | -{ |
|---|
| 3006 | | - might_lock(&obj->mm.lock); |
|---|
| 3007 | | - |
|---|
| 3008 | | - if (atomic_inc_not_zero(&obj->mm.pages_pin_count)) |
|---|
| 3009 | | - return 0; |
|---|
| 3010 | | - |
|---|
| 3011 | | - return __i915_gem_object_get_pages(obj); |
|---|
| 3012 | | -} |
|---|
| 3013 | | - |
|---|
| 3014 | | -static inline bool |
|---|
| 3015 | | -i915_gem_object_has_pages(struct drm_i915_gem_object *obj) |
|---|
| 3016 | | -{ |
|---|
| 3017 | | - return !IS_ERR_OR_NULL(READ_ONCE(obj->mm.pages)); |
|---|
| 3018 | | -} |
|---|
| 3019 | | - |
|---|
| 3020 | | -static inline void |
|---|
| 3021 | | -__i915_gem_object_pin_pages(struct drm_i915_gem_object *obj) |
|---|
| 3022 | | -{ |
|---|
| 3023 | | - GEM_BUG_ON(!i915_gem_object_has_pages(obj)); |
|---|
| 3024 | | - |
|---|
| 3025 | | - atomic_inc(&obj->mm.pages_pin_count); |
|---|
| 3026 | | -} |
|---|
| 3027 | | - |
|---|
| 3028 | | -static inline bool |
|---|
| 3029 | | -i915_gem_object_has_pinned_pages(struct drm_i915_gem_object *obj) |
|---|
| 3030 | | -{ |
|---|
| 3031 | | - return atomic_read(&obj->mm.pages_pin_count); |
|---|
| 3032 | | -} |
|---|
| 3033 | | - |
|---|
| 3034 | | -static inline void |
|---|
| 3035 | | -__i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj) |
|---|
| 3036 | | -{ |
|---|
| 3037 | | - GEM_BUG_ON(!i915_gem_object_has_pages(obj)); |
|---|
| 3038 | | - GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj)); |
|---|
| 3039 | | - |
|---|
| 3040 | | - atomic_dec(&obj->mm.pages_pin_count); |
|---|
| 3041 | | -} |
|---|
| 3042 | | - |
|---|
| 3043 | | -static inline void |
|---|
| 3044 | | -i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj) |
|---|
| 3045 | | -{ |
|---|
| 3046 | | - __i915_gem_object_unpin_pages(obj); |
|---|
| 3047 | | -} |
|---|
| 3048 | | - |
|---|
| 3049 | | -enum i915_mm_subclass { /* lockdep subclass for obj->mm.lock */ |
|---|
| 3050 | | - I915_MM_NORMAL = 0, |
|---|
| 3051 | | - I915_MM_SHRINKER |
|---|
| 3052 | | -}; |
|---|
| 3053 | | - |
|---|
| 3054 | | -void __i915_gem_object_put_pages(struct drm_i915_gem_object *obj, |
|---|
| 3055 | | - enum i915_mm_subclass subclass); |
|---|
| 3056 | | -void __i915_gem_object_invalidate(struct drm_i915_gem_object *obj); |
|---|
| 3057 | | - |
|---|
| 3058 | | -enum i915_map_type { |
|---|
| 3059 | | - I915_MAP_WB = 0, |
|---|
| 3060 | | - I915_MAP_WC, |
|---|
| 3061 | | -#define I915_MAP_OVERRIDE BIT(31) |
|---|
| 3062 | | - I915_MAP_FORCE_WB = I915_MAP_WB | I915_MAP_OVERRIDE, |
|---|
| 3063 | | - I915_MAP_FORCE_WC = I915_MAP_WC | I915_MAP_OVERRIDE, |
|---|
| 3064 | | -}; |
|---|
| 3065 | | - |
|---|
| 3066 | | -/** |
|---|
| 3067 | | - * i915_gem_object_pin_map - return a contiguous mapping of the entire object |
|---|
| 3068 | | - * @obj: the object to map into kernel address space |
|---|
| 3069 | | - * @type: the type of mapping, used to select pgprot_t |
|---|
| 3070 | | - * |
|---|
| 3071 | | - * Calls i915_gem_object_pin_pages() to prevent reaping of the object's |
|---|
| 3072 | | - * pages and then returns a contiguous mapping of the backing storage into |
|---|
| 3073 | | - * the kernel address space. Based on the @type of mapping, the PTE will be |
|---|
| 3074 | | - * set to either WriteBack or WriteCombine (via pgprot_t). |
|---|
| 3075 | | - * |
|---|
| 3076 | | - * The caller is responsible for calling i915_gem_object_unpin_map() when the |
|---|
| 3077 | | - * mapping is no longer required. |
|---|
| 3078 | | - * |
|---|
| 3079 | | - * Returns the pointer through which to access the mapped object, or an |
|---|
| 3080 | | - * ERR_PTR() on error. |
|---|
| 3081 | | - */ |
|---|
| 3082 | | -void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj, |
|---|
| 3083 | | - enum i915_map_type type); |
|---|
| 3084 | | - |
|---|
| 3085 | | -/** |
|---|
| 3086 | | - * i915_gem_object_unpin_map - releases an earlier mapping |
|---|
| 3087 | | - * @obj: the object to unmap |
|---|
| 3088 | | - * |
|---|
| 3089 | | - * After pinning the object and mapping its pages, once you are finished |
|---|
| 3090 | | - * with your access, call i915_gem_object_unpin_map() to release the pin |
|---|
| 3091 | | - * upon the mapping. Once the pin count reaches zero, that mapping may be |
|---|
| 3092 | | - * removed. |
|---|
| 3093 | | - */ |
|---|
| 3094 | | -static inline void i915_gem_object_unpin_map(struct drm_i915_gem_object *obj) |
|---|
| 3095 | | -{ |
|---|
| 3096 | | - i915_gem_object_unpin_pages(obj); |
|---|
| 3097 | | -} |
|---|
| 3098 | | - |
|---|
| 3099 | | -int i915_gem_obj_prepare_shmem_read(struct drm_i915_gem_object *obj, |
|---|
| 3100 | | - unsigned int *needs_clflush); |
|---|
| 3101 | | -int i915_gem_obj_prepare_shmem_write(struct drm_i915_gem_object *obj, |
|---|
| 3102 | | - unsigned int *needs_clflush); |
|---|
| 3103 | | -#define CLFLUSH_BEFORE BIT(0) |
|---|
| 3104 | | -#define CLFLUSH_AFTER BIT(1) |
|---|
| 3105 | | -#define CLFLUSH_FLAGS (CLFLUSH_BEFORE | CLFLUSH_AFTER) |
|---|
| 3106 | | - |
|---|
| 3107 | | -static inline void |
|---|
| 3108 | | -i915_gem_obj_finish_shmem_access(struct drm_i915_gem_object *obj) |
|---|
| 3109 | | -{ |
|---|
| 3110 | | - i915_gem_object_unpin_pages(obj); |
|---|
| 3111 | | -} |
|---|
| 3112 | | - |
|---|
| 3113 | | -int __must_check i915_mutex_lock_interruptible(struct drm_device *dev); |
|---|
| 3114 | 1860 | int i915_gem_dumb_create(struct drm_file *file_priv, |
|---|
| 3115 | 1861 | struct drm_device *dev, |
|---|
| 3116 | 1862 | struct drm_mode_create_dumb *args); |
|---|
| 3117 | | -int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev, |
|---|
| 3118 | | - uint32_t handle, uint64_t *offset); |
|---|
| 3119 | | -int i915_gem_mmap_gtt_version(void); |
|---|
| 3120 | | - |
|---|
| 3121 | | -void i915_gem_track_fb(struct drm_i915_gem_object *old, |
|---|
| 3122 | | - struct drm_i915_gem_object *new, |
|---|
| 3123 | | - unsigned frontbuffer_bits); |
|---|
| 3124 | 1863 | |
|---|
| 3125 | 1864 | int __must_check i915_gem_set_global_seqno(struct drm_device *dev, u32 seqno); |
|---|
| 3126 | 1865 | |
|---|
| 3127 | | -struct i915_request * |
|---|
| 3128 | | -i915_gem_find_active_request(struct intel_engine_cs *engine); |
|---|
| 3129 | | - |
|---|
| 3130 | | -static inline bool i915_reset_backoff(struct i915_gpu_error *error) |
|---|
| 3131 | | -{ |
|---|
| 3132 | | - return unlikely(test_bit(I915_RESET_BACKOFF, &error->flags)); |
|---|
| 3133 | | -} |
|---|
| 3134 | | - |
|---|
| 3135 | | -static inline bool i915_reset_handoff(struct i915_gpu_error *error) |
|---|
| 3136 | | -{ |
|---|
| 3137 | | - return unlikely(test_bit(I915_RESET_HANDOFF, &error->flags)); |
|---|
| 3138 | | -} |
|---|
| 3139 | | - |
|---|
| 3140 | | -static inline bool i915_terminally_wedged(struct i915_gpu_error *error) |
|---|
| 3141 | | -{ |
|---|
| 3142 | | - return unlikely(test_bit(I915_WEDGED, &error->flags)); |
|---|
| 3143 | | -} |
|---|
| 3144 | | - |
|---|
| 3145 | | -static inline bool i915_reset_backoff_or_wedged(struct i915_gpu_error *error) |
|---|
| 3146 | | -{ |
|---|
| 3147 | | - return i915_reset_backoff(error) | i915_terminally_wedged(error); |
|---|
| 3148 | | -} |
|---|
| 3149 | | - |
|---|
| 3150 | 1866 | static inline u32 i915_reset_count(struct i915_gpu_error *error) |
|---|
| 3151 | 1867 | { |
|---|
| 3152 | | - return READ_ONCE(error->reset_count); |
|---|
| 1868 | + return atomic_read(&error->reset_count); |
|---|
| 3153 | 1869 | } |
|---|
| 3154 | 1870 | |
|---|
| 3155 | 1871 | static inline u32 i915_reset_engine_count(struct i915_gpu_error *error, |
|---|
| 3156 | | - struct intel_engine_cs *engine) |
|---|
| 1872 | + const struct intel_engine_cs *engine) |
|---|
| 3157 | 1873 | { |
|---|
| 3158 | | - return READ_ONCE(error->reset_engine_count[engine->id]); |
|---|
| 1874 | + return atomic_read(&error->reset_engine_count[engine->uabi_class]); |
|---|
| 3159 | 1875 | } |
|---|
| 3160 | 1876 | |
|---|
| 3161 | | -struct i915_request * |
|---|
| 3162 | | -i915_gem_reset_prepare_engine(struct intel_engine_cs *engine); |
|---|
| 3163 | | -int i915_gem_reset_prepare(struct drm_i915_private *dev_priv); |
|---|
| 3164 | | -void i915_gem_reset(struct drm_i915_private *dev_priv, |
|---|
| 3165 | | - unsigned int stalled_mask); |
|---|
| 3166 | | -void i915_gem_reset_finish_engine(struct intel_engine_cs *engine); |
|---|
| 3167 | | -void i915_gem_reset_finish(struct drm_i915_private *dev_priv); |
|---|
| 3168 | | -void i915_gem_set_wedged(struct drm_i915_private *dev_priv); |
|---|
| 3169 | | -bool i915_gem_unset_wedged(struct drm_i915_private *dev_priv); |
|---|
| 3170 | | -void i915_gem_reset_engine(struct intel_engine_cs *engine, |
|---|
| 3171 | | - struct i915_request *request, |
|---|
| 3172 | | - bool stalled); |
|---|
| 3173 | | - |
|---|
| 3174 | | -void i915_gem_init_mmio(struct drm_i915_private *i915); |
|---|
| 3175 | 1877 | int __must_check i915_gem_init(struct drm_i915_private *dev_priv); |
|---|
| 3176 | | -int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv); |
|---|
| 3177 | | -void i915_gem_init_swizzling(struct drm_i915_private *dev_priv); |
|---|
| 3178 | | -void i915_gem_fini(struct drm_i915_private *dev_priv); |
|---|
| 3179 | | -void i915_gem_cleanup_engines(struct drm_i915_private *dev_priv); |
|---|
| 3180 | | -int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv, |
|---|
| 3181 | | - unsigned int flags, long timeout); |
|---|
| 3182 | | -int __must_check i915_gem_suspend(struct drm_i915_private *dev_priv); |
|---|
| 1878 | +void i915_gem_driver_register(struct drm_i915_private *i915); |
|---|
| 1879 | +void i915_gem_driver_unregister(struct drm_i915_private *i915); |
|---|
| 1880 | +void i915_gem_driver_remove(struct drm_i915_private *dev_priv); |
|---|
| 1881 | +void i915_gem_driver_release(struct drm_i915_private *dev_priv); |
|---|
| 1882 | +void i915_gem_suspend(struct drm_i915_private *dev_priv); |
|---|
| 3183 | 1883 | void i915_gem_suspend_late(struct drm_i915_private *dev_priv); |
|---|
| 3184 | 1884 | void i915_gem_resume(struct drm_i915_private *dev_priv); |
|---|
| 3185 | | -vm_fault_t i915_gem_fault(struct vm_fault *vmf); |
|---|
| 3186 | | -int i915_gem_object_wait(struct drm_i915_gem_object *obj, |
|---|
| 3187 | | - unsigned int flags, |
|---|
| 3188 | | - long timeout, |
|---|
| 3189 | | - struct intel_rps_client *rps); |
|---|
| 3190 | | -int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj, |
|---|
| 3191 | | - unsigned int flags, |
|---|
| 3192 | | - const struct i915_sched_attr *attr); |
|---|
| 3193 | | -#define I915_PRIORITY_DISPLAY I915_PRIORITY_MAX |
|---|
| 3194 | 1885 | |
|---|
| 3195 | | -int __must_check |
|---|
| 3196 | | -i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write); |
|---|
| 3197 | | -int __must_check |
|---|
| 3198 | | -i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write); |
|---|
| 3199 | | -int __must_check |
|---|
| 3200 | | -i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write); |
|---|
| 3201 | | -struct i915_vma * __must_check |
|---|
| 3202 | | -i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, |
|---|
| 3203 | | - u32 alignment, |
|---|
| 3204 | | - const struct i915_ggtt_view *view, |
|---|
| 3205 | | - unsigned int flags); |
|---|
| 3206 | | -void i915_gem_object_unpin_from_display_plane(struct i915_vma *vma); |
|---|
| 3207 | | -int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, |
|---|
| 3208 | | - int align); |
|---|
| 3209 | 1886 | int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file); |
|---|
| 3210 | | -void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
|---|
| 3211 | 1887 | |
|---|
| 3212 | 1888 | int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, |
|---|
| 3213 | 1889 | enum i915_cache_level cache_level); |
|---|
| .. | .. |
|---|
| 3215 | 1891 | struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev, |
|---|
| 3216 | 1892 | struct dma_buf *dma_buf); |
|---|
| 3217 | 1893 | |
|---|
| 3218 | | -struct dma_buf *i915_gem_prime_export(struct drm_device *dev, |
|---|
| 3219 | | - struct drm_gem_object *gem_obj, int flags); |
|---|
| 3220 | | - |
|---|
| 3221 | | -static inline struct i915_hw_ppgtt * |
|---|
| 3222 | | -i915_vm_to_ppgtt(struct i915_address_space *vm) |
|---|
| 3223 | | -{ |
|---|
| 3224 | | - return container_of(vm, struct i915_hw_ppgtt, vm); |
|---|
| 3225 | | -} |
|---|
| 3226 | | - |
|---|
| 3227 | | -/* i915_gem_fence_reg.c */ |
|---|
| 3228 | | -struct drm_i915_fence_reg * |
|---|
| 3229 | | -i915_reserve_fence(struct drm_i915_private *dev_priv); |
|---|
| 3230 | | -void i915_unreserve_fence(struct drm_i915_fence_reg *fence); |
|---|
| 3231 | | - |
|---|
| 3232 | | -void i915_gem_revoke_fences(struct drm_i915_private *dev_priv); |
|---|
| 3233 | | -void i915_gem_restore_fences(struct drm_i915_private *dev_priv); |
|---|
| 3234 | | - |
|---|
| 3235 | | -void i915_gem_detect_bit_6_swizzle(struct drm_i915_private *dev_priv); |
|---|
| 3236 | | -void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, |
|---|
| 3237 | | - struct sg_table *pages); |
|---|
| 3238 | | -void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, |
|---|
| 3239 | | - struct sg_table *pages); |
|---|
| 1894 | +struct dma_buf *i915_gem_prime_export(struct drm_gem_object *gem_obj, int flags); |
|---|
| 3240 | 1895 | |
|---|
| 3241 | 1896 | static inline struct i915_gem_context * |
|---|
| 3242 | 1897 | __i915_gem_context_lookup_rcu(struct drm_i915_file_private *file_priv, u32 id) |
|---|
| 3243 | 1898 | { |
|---|
| 3244 | | - return idr_find(&file_priv->context_idr, id); |
|---|
| 1899 | + return xa_load(&file_priv->context_xa, id); |
|---|
| 3245 | 1900 | } |
|---|
| 3246 | 1901 | |
|---|
| 3247 | 1902 | static inline struct i915_gem_context * |
|---|
| .. | .. |
|---|
| 3258 | 1913 | return ctx; |
|---|
| 3259 | 1914 | } |
|---|
| 3260 | 1915 | |
|---|
| 3261 | | -int i915_perf_open_ioctl(struct drm_device *dev, void *data, |
|---|
| 3262 | | - struct drm_file *file); |
|---|
| 3263 | | -int i915_perf_add_config_ioctl(struct drm_device *dev, void *data, |
|---|
| 3264 | | - struct drm_file *file); |
|---|
| 3265 | | -int i915_perf_remove_config_ioctl(struct drm_device *dev, void *data, |
|---|
| 3266 | | - struct drm_file *file); |
|---|
| 3267 | | -void i915_oa_init_reg_state(struct intel_engine_cs *engine, |
|---|
| 3268 | | - struct i915_gem_context *ctx, |
|---|
| 3269 | | - uint32_t *reg_state); |
|---|
| 3270 | | - |
|---|
| 3271 | 1916 | /* i915_gem_evict.c */ |
|---|
| 3272 | 1917 | int __must_check i915_gem_evict_something(struct i915_address_space *vm, |
|---|
| 3273 | 1918 | u64 min_size, u64 alignment, |
|---|
| 3274 | | - unsigned cache_level, |
|---|
| 1919 | + unsigned long color, |
|---|
| 3275 | 1920 | u64 start, u64 end, |
|---|
| 3276 | 1921 | unsigned flags); |
|---|
| 3277 | 1922 | int __must_check i915_gem_evict_for_node(struct i915_address_space *vm, |
|---|
| .. | .. |
|---|
| 3279 | 1924 | unsigned int flags); |
|---|
| 3280 | 1925 | int i915_gem_evict_vm(struct i915_address_space *vm); |
|---|
| 3281 | 1926 | |
|---|
| 3282 | | -void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv); |
|---|
| 3283 | | - |
|---|
| 3284 | | -/* belongs in i915_gem_gtt.h */ |
|---|
| 3285 | | -static inline void i915_gem_chipset_flush(struct drm_i915_private *dev_priv) |
|---|
| 3286 | | -{ |
|---|
| 3287 | | - wmb(); |
|---|
| 3288 | | - if (INTEL_GEN(dev_priv) < 6) |
|---|
| 3289 | | - intel_gtt_chipset_flush(); |
|---|
| 3290 | | -} |
|---|
| 3291 | | - |
|---|
| 3292 | | -/* i915_gem_stolen.c */ |
|---|
| 3293 | | -int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv, |
|---|
| 3294 | | - struct drm_mm_node *node, u64 size, |
|---|
| 3295 | | - unsigned alignment); |
|---|
| 3296 | | -int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv, |
|---|
| 3297 | | - struct drm_mm_node *node, u64 size, |
|---|
| 3298 | | - unsigned alignment, u64 start, |
|---|
| 3299 | | - u64 end); |
|---|
| 3300 | | -void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv, |
|---|
| 3301 | | - struct drm_mm_node *node); |
|---|
| 3302 | | -int i915_gem_init_stolen(struct drm_i915_private *dev_priv); |
|---|
| 3303 | | -void i915_gem_cleanup_stolen(struct drm_device *dev); |
|---|
| 3304 | | -struct drm_i915_gem_object * |
|---|
| 3305 | | -i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, |
|---|
| 3306 | | - resource_size_t size); |
|---|
| 3307 | | -struct drm_i915_gem_object * |
|---|
| 3308 | | -i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv, |
|---|
| 3309 | | - resource_size_t stolen_offset, |
|---|
| 3310 | | - resource_size_t gtt_offset, |
|---|
| 3311 | | - resource_size_t size); |
|---|
| 3312 | | - |
|---|
| 3313 | 1927 | /* i915_gem_internal.c */ |
|---|
| 3314 | 1928 | struct drm_i915_gem_object * |
|---|
| 3315 | 1929 | i915_gem_object_create_internal(struct drm_i915_private *dev_priv, |
|---|
| 3316 | 1930 | phys_addr_t size); |
|---|
| 3317 | 1931 | |
|---|
| 3318 | | -/* i915_gem_shrinker.c */ |
|---|
| 3319 | | -unsigned long i915_gem_shrink(struct drm_i915_private *i915, |
|---|
| 3320 | | - unsigned long target, |
|---|
| 3321 | | - unsigned long *nr_scanned, |
|---|
| 3322 | | - unsigned flags); |
|---|
| 3323 | | -#define I915_SHRINK_PURGEABLE 0x1 |
|---|
| 3324 | | -#define I915_SHRINK_UNBOUND 0x2 |
|---|
| 3325 | | -#define I915_SHRINK_BOUND 0x4 |
|---|
| 3326 | | -#define I915_SHRINK_ACTIVE 0x8 |
|---|
| 3327 | | -#define I915_SHRINK_VMAPS 0x10 |
|---|
| 3328 | | -unsigned long i915_gem_shrink_all(struct drm_i915_private *i915); |
|---|
| 3329 | | -void i915_gem_shrinker_register(struct drm_i915_private *i915); |
|---|
| 3330 | | -void i915_gem_shrinker_unregister(struct drm_i915_private *i915); |
|---|
| 3331 | | -void i915_gem_shrinker_taints_mutex(struct mutex *mutex); |
|---|
| 3332 | | - |
|---|
| 3333 | 1932 | /* i915_gem_tiling.c */ |
|---|
| 3334 | 1933 | static inline bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj) |
|---|
| 3335 | 1934 | { |
|---|
| 3336 | | - struct drm_i915_private *dev_priv = to_i915(obj->base.dev); |
|---|
| 1935 | + struct drm_i915_private *i915 = to_i915(obj->base.dev); |
|---|
| 3337 | 1936 | |
|---|
| 3338 | | - return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 && |
|---|
| 1937 | + return i915->ggtt.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 && |
|---|
| 3339 | 1938 | i915_gem_object_is_tiled(obj); |
|---|
| 3340 | 1939 | } |
|---|
| 3341 | 1940 | |
|---|
| .. | .. |
|---|
| 3344 | 1943 | u32 i915_gem_fence_alignment(struct drm_i915_private *dev_priv, u32 size, |
|---|
| 3345 | 1944 | unsigned int tiling, unsigned int stride); |
|---|
| 3346 | 1945 | |
|---|
| 3347 | | -/* i915_debugfs.c */ |
|---|
| 3348 | | -#ifdef CONFIG_DEBUG_FS |
|---|
| 3349 | | -int i915_debugfs_register(struct drm_i915_private *dev_priv); |
|---|
| 3350 | | -int i915_debugfs_connector_add(struct drm_connector *connector); |
|---|
| 3351 | | -void intel_display_crc_init(struct drm_i915_private *dev_priv); |
|---|
| 3352 | | -#else |
|---|
| 3353 | | -static inline int i915_debugfs_register(struct drm_i915_private *dev_priv) {return 0;} |
|---|
| 3354 | | -static inline int i915_debugfs_connector_add(struct drm_connector *connector) |
|---|
| 3355 | | -{ return 0; } |
|---|
| 3356 | | -static inline void intel_display_crc_init(struct drm_i915_private *dev_priv) {} |
|---|
| 3357 | | -#endif |
|---|
| 3358 | | - |
|---|
| 3359 | 1946 | const char *i915_cache_level_str(struct drm_i915_private *i915, int type); |
|---|
| 3360 | 1947 | |
|---|
| 3361 | 1948 | /* i915_cmd_parser.c */ |
|---|
| 3362 | 1949 | int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv); |
|---|
| 3363 | | -void intel_engine_init_cmd_parser(struct intel_engine_cs *engine); |
|---|
| 1950 | +int intel_engine_init_cmd_parser(struct intel_engine_cs *engine); |
|---|
| 3364 | 1951 | void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine); |
|---|
| 3365 | | -int intel_engine_cmd_parser(struct i915_gem_context *cxt, |
|---|
| 3366 | | - struct intel_engine_cs *engine, |
|---|
| 3367 | | - struct drm_i915_gem_object *batch_obj, |
|---|
| 3368 | | - u64 user_batch_start, |
|---|
| 3369 | | - u32 batch_start_offset, |
|---|
| 3370 | | - u32 batch_len, |
|---|
| 3371 | | - struct drm_i915_gem_object *shadow_batch_obj, |
|---|
| 3372 | | - u64 shadow_batch_start); |
|---|
| 3373 | | - |
|---|
| 3374 | | -/* i915_perf.c */ |
|---|
| 3375 | | -extern void i915_perf_init(struct drm_i915_private *dev_priv); |
|---|
| 3376 | | -extern void i915_perf_fini(struct drm_i915_private *dev_priv); |
|---|
| 3377 | | -extern void i915_perf_register(struct drm_i915_private *dev_priv); |
|---|
| 3378 | | -extern void i915_perf_unregister(struct drm_i915_private *dev_priv); |
|---|
| 3379 | | - |
|---|
| 3380 | | -/* i915_suspend.c */ |
|---|
| 3381 | | -extern int i915_save_state(struct drm_i915_private *dev_priv); |
|---|
| 3382 | | -extern int i915_restore_state(struct drm_i915_private *dev_priv); |
|---|
| 3383 | | - |
|---|
| 3384 | | -/* i915_sysfs.c */ |
|---|
| 3385 | | -void i915_setup_sysfs(struct drm_i915_private *dev_priv); |
|---|
| 3386 | | -void i915_teardown_sysfs(struct drm_i915_private *dev_priv); |
|---|
| 3387 | | - |
|---|
| 3388 | | -/* intel_lpe_audio.c */ |
|---|
| 3389 | | -int intel_lpe_audio_init(struct drm_i915_private *dev_priv); |
|---|
| 3390 | | -void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv); |
|---|
| 3391 | | -void intel_lpe_audio_irq_handler(struct drm_i915_private *dev_priv); |
|---|
| 3392 | | -void intel_lpe_audio_notify(struct drm_i915_private *dev_priv, |
|---|
| 3393 | | - enum pipe pipe, enum port port, |
|---|
| 3394 | | - const void *eld, int ls_clock, bool dp_output); |
|---|
| 3395 | | - |
|---|
| 3396 | | -/* intel_i2c.c */ |
|---|
| 3397 | | -extern int intel_setup_gmbus(struct drm_i915_private *dev_priv); |
|---|
| 3398 | | -extern void intel_teardown_gmbus(struct drm_i915_private *dev_priv); |
|---|
| 3399 | | -extern bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv, |
|---|
| 3400 | | - unsigned int pin); |
|---|
| 3401 | | -extern int intel_gmbus_output_aksv(struct i2c_adapter *adapter); |
|---|
| 3402 | | - |
|---|
| 3403 | | -extern struct i2c_adapter * |
|---|
| 3404 | | -intel_gmbus_get_adapter(struct drm_i915_private *dev_priv, unsigned int pin); |
|---|
| 3405 | | -extern void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed); |
|---|
| 3406 | | -extern void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit); |
|---|
| 3407 | | -static inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter) |
|---|
| 3408 | | -{ |
|---|
| 3409 | | - return container_of(adapter, struct intel_gmbus, adapter)->force_bit; |
|---|
| 3410 | | -} |
|---|
| 3411 | | -extern void intel_i2c_reset(struct drm_i915_private *dev_priv); |
|---|
| 3412 | | - |
|---|
| 3413 | | -/* intel_bios.c */ |
|---|
| 3414 | | -void intel_bios_init(struct drm_i915_private *dev_priv); |
|---|
| 3415 | | -void intel_bios_cleanup(struct drm_i915_private *dev_priv); |
|---|
| 3416 | | -bool intel_bios_is_valid_vbt(const void *buf, size_t size); |
|---|
| 3417 | | -bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv); |
|---|
| 3418 | | -bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin); |
|---|
| 3419 | | -bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port); |
|---|
| 3420 | | -bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port); |
|---|
| 3421 | | -bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port); |
|---|
| 3422 | | -bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, enum port *port); |
|---|
| 3423 | | -bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv, |
|---|
| 3424 | | - enum port port); |
|---|
| 3425 | | -bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv, |
|---|
| 3426 | | - enum port port); |
|---|
| 3427 | | - |
|---|
| 3428 | | -/* intel_acpi.c */ |
|---|
| 3429 | | -#ifdef CONFIG_ACPI |
|---|
| 3430 | | -extern void intel_register_dsm_handler(void); |
|---|
| 3431 | | -extern void intel_unregister_dsm_handler(void); |
|---|
| 3432 | | -#else |
|---|
| 3433 | | -static inline void intel_register_dsm_handler(void) { return; } |
|---|
| 3434 | | -static inline void intel_unregister_dsm_handler(void) { return; } |
|---|
| 3435 | | -#endif /* CONFIG_ACPI */ |
|---|
| 1952 | +int intel_engine_cmd_parser(struct intel_engine_cs *engine, |
|---|
| 1953 | + struct i915_vma *batch, |
|---|
| 1954 | + unsigned long batch_offset, |
|---|
| 1955 | + unsigned long batch_length, |
|---|
| 1956 | + struct i915_vma *shadow, |
|---|
| 1957 | + bool trampoline); |
|---|
| 1958 | +#define I915_CMD_PARSER_TRAMPOLINE_SIZE 8 |
|---|
| 3436 | 1959 | |
|---|
| 3437 | 1960 | /* intel_device_info.c */ |
|---|
| 3438 | 1961 | static inline struct intel_device_info * |
|---|
| 3439 | 1962 | mkwrite_device_info(struct drm_i915_private *dev_priv) |
|---|
| 3440 | 1963 | { |
|---|
| 3441 | | - return (struct intel_device_info *)&dev_priv->info; |
|---|
| 1964 | + return (struct intel_device_info *)INTEL_INFO(dev_priv); |
|---|
| 3442 | 1965 | } |
|---|
| 3443 | | - |
|---|
| 3444 | | -/* modesetting */ |
|---|
| 3445 | | -extern void intel_modeset_init_hw(struct drm_device *dev); |
|---|
| 3446 | | -extern int intel_modeset_init(struct drm_device *dev); |
|---|
| 3447 | | -extern void intel_modeset_cleanup(struct drm_device *dev); |
|---|
| 3448 | | -extern int intel_connector_register(struct drm_connector *); |
|---|
| 3449 | | -extern void intel_connector_unregister(struct drm_connector *); |
|---|
| 3450 | | -extern int intel_modeset_vga_set_state(struct drm_i915_private *dev_priv, |
|---|
| 3451 | | - bool state); |
|---|
| 3452 | | -extern void intel_display_resume(struct drm_device *dev); |
|---|
| 3453 | | -extern void i915_redisable_vga(struct drm_i915_private *dev_priv); |
|---|
| 3454 | | -extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv); |
|---|
| 3455 | | -extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val); |
|---|
| 3456 | | -extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv); |
|---|
| 3457 | | -extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val); |
|---|
| 3458 | | -extern void intel_rps_mark_interactive(struct drm_i915_private *i915, |
|---|
| 3459 | | - bool interactive); |
|---|
| 3460 | | -extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, |
|---|
| 3461 | | - bool enable); |
|---|
| 3462 | 1966 | |
|---|
| 3463 | 1967 | int i915_reg_read_ioctl(struct drm_device *dev, void *data, |
|---|
| 3464 | 1968 | struct drm_file *file); |
|---|
| 3465 | 1969 | |
|---|
| 3466 | | -/* overlay */ |
|---|
| 3467 | | -extern struct intel_overlay_error_state * |
|---|
| 3468 | | -intel_overlay_capture_error_state(struct drm_i915_private *dev_priv); |
|---|
| 3469 | | -extern void intel_overlay_print_error_state(struct drm_i915_error_state_buf *e, |
|---|
| 3470 | | - struct intel_overlay_error_state *error); |
|---|
| 1970 | +#define __I915_REG_OP(op__, dev_priv__, ...) \ |
|---|
| 1971 | + intel_uncore_##op__(&(dev_priv__)->uncore, __VA_ARGS__) |
|---|
| 3471 | 1972 | |
|---|
| 3472 | | -extern struct intel_display_error_state * |
|---|
| 3473 | | -intel_display_capture_error_state(struct drm_i915_private *dev_priv); |
|---|
| 3474 | | -extern void intel_display_print_error_state(struct drm_i915_error_state_buf *e, |
|---|
| 3475 | | - struct intel_display_error_state *error); |
|---|
| 1973 | +#define I915_READ(reg__) __I915_REG_OP(read, dev_priv, (reg__)) |
|---|
| 1974 | +#define I915_WRITE(reg__, val__) __I915_REG_OP(write, dev_priv, (reg__), (val__)) |
|---|
| 3476 | 1975 | |
|---|
| 3477 | | -int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); |
|---|
| 3478 | | -int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, u32 mbox, |
|---|
| 3479 | | - u32 val, int fast_timeout_us, |
|---|
| 3480 | | - int slow_timeout_ms); |
|---|
| 3481 | | -#define sandybridge_pcode_write(dev_priv, mbox, val) \ |
|---|
| 3482 | | - sandybridge_pcode_write_timeout(dev_priv, mbox, val, 500, 0) |
|---|
| 3483 | | - |
|---|
| 3484 | | -int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request, |
|---|
| 3485 | | - u32 reply_mask, u32 reply, int timeout_base_ms); |
|---|
| 3486 | | - |
|---|
| 3487 | | -/* intel_sideband.c */ |
|---|
| 3488 | | -u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr); |
|---|
| 3489 | | -int vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val); |
|---|
| 3490 | | -u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr); |
|---|
| 3491 | | -u32 vlv_iosf_sb_read(struct drm_i915_private *dev_priv, u8 port, u32 reg); |
|---|
| 3492 | | -void vlv_iosf_sb_write(struct drm_i915_private *dev_priv, u8 port, u32 reg, u32 val); |
|---|
| 3493 | | -u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg); |
|---|
| 3494 | | -void vlv_cck_write(struct drm_i915_private *dev_priv, u32 reg, u32 val); |
|---|
| 3495 | | -u32 vlv_ccu_read(struct drm_i915_private *dev_priv, u32 reg); |
|---|
| 3496 | | -void vlv_ccu_write(struct drm_i915_private *dev_priv, u32 reg, u32 val); |
|---|
| 3497 | | -u32 vlv_bunit_read(struct drm_i915_private *dev_priv, u32 reg); |
|---|
| 3498 | | -void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val); |
|---|
| 3499 | | -u32 vlv_dpio_read(struct drm_i915_private *dev_priv, enum pipe pipe, int reg); |
|---|
| 3500 | | -void vlv_dpio_write(struct drm_i915_private *dev_priv, enum pipe pipe, int reg, u32 val); |
|---|
| 3501 | | -u32 intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg, |
|---|
| 3502 | | - enum intel_sbi_destination destination); |
|---|
| 3503 | | -void intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value, |
|---|
| 3504 | | - enum intel_sbi_destination destination); |
|---|
| 3505 | | -u32 vlv_flisdsi_read(struct drm_i915_private *dev_priv, u32 reg); |
|---|
| 3506 | | -void vlv_flisdsi_write(struct drm_i915_private *dev_priv, u32 reg, u32 val); |
|---|
| 3507 | | - |
|---|
| 3508 | | -/* intel_dpio_phy.c */ |
|---|
| 3509 | | -void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port, |
|---|
| 3510 | | - enum dpio_phy *phy, enum dpio_channel *ch); |
|---|
| 3511 | | -void bxt_ddi_phy_set_signal_level(struct drm_i915_private *dev_priv, |
|---|
| 3512 | | - enum port port, u32 margin, u32 scale, |
|---|
| 3513 | | - u32 enable, u32 deemphasis); |
|---|
| 3514 | | -void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy); |
|---|
| 3515 | | -void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy); |
|---|
| 3516 | | -bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv, |
|---|
| 3517 | | - enum dpio_phy phy); |
|---|
| 3518 | | -bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv, |
|---|
| 3519 | | - enum dpio_phy phy); |
|---|
| 3520 | | -uint8_t bxt_ddi_phy_calc_lane_lat_optim_mask(uint8_t lane_count); |
|---|
| 3521 | | -void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder, |
|---|
| 3522 | | - uint8_t lane_lat_optim_mask); |
|---|
| 3523 | | -uint8_t bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder); |
|---|
| 3524 | | - |
|---|
| 3525 | | -void chv_set_phy_signal_level(struct intel_encoder *encoder, |
|---|
| 3526 | | - u32 deemph_reg_value, u32 margin_reg_value, |
|---|
| 3527 | | - bool uniq_trans_scale); |
|---|
| 3528 | | -void chv_data_lane_soft_reset(struct intel_encoder *encoder, |
|---|
| 3529 | | - const struct intel_crtc_state *crtc_state, |
|---|
| 3530 | | - bool reset); |
|---|
| 3531 | | -void chv_phy_pre_pll_enable(struct intel_encoder *encoder, |
|---|
| 3532 | | - const struct intel_crtc_state *crtc_state); |
|---|
| 3533 | | -void chv_phy_pre_encoder_enable(struct intel_encoder *encoder, |
|---|
| 3534 | | - const struct intel_crtc_state *crtc_state); |
|---|
| 3535 | | -void chv_phy_release_cl2_override(struct intel_encoder *encoder); |
|---|
| 3536 | | -void chv_phy_post_pll_disable(struct intel_encoder *encoder, |
|---|
| 3537 | | - const struct intel_crtc_state *old_crtc_state); |
|---|
| 3538 | | - |
|---|
| 3539 | | -void vlv_set_phy_signal_level(struct intel_encoder *encoder, |
|---|
| 3540 | | - u32 demph_reg_value, u32 preemph_reg_value, |
|---|
| 3541 | | - u32 uniqtranscale_reg_value, u32 tx3_demph); |
|---|
| 3542 | | -void vlv_phy_pre_pll_enable(struct intel_encoder *encoder, |
|---|
| 3543 | | - const struct intel_crtc_state *crtc_state); |
|---|
| 3544 | | -void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder, |
|---|
| 3545 | | - const struct intel_crtc_state *crtc_state); |
|---|
| 3546 | | -void vlv_phy_reset_lanes(struct intel_encoder *encoder, |
|---|
| 3547 | | - const struct intel_crtc_state *old_crtc_state); |
|---|
| 3548 | | - |
|---|
| 3549 | | -int intel_gpu_freq(struct drm_i915_private *dev_priv, int val); |
|---|
| 3550 | | -int intel_freq_opcode(struct drm_i915_private *dev_priv, int val); |
|---|
| 3551 | | -u64 intel_rc6_residency_ns(struct drm_i915_private *dev_priv, |
|---|
| 3552 | | - const i915_reg_t reg); |
|---|
| 3553 | | - |
|---|
| 3554 | | -u32 intel_get_cagf(struct drm_i915_private *dev_priv, u32 rpstat1); |
|---|
| 3555 | | - |
|---|
| 3556 | | -static inline u64 intel_rc6_residency_us(struct drm_i915_private *dev_priv, |
|---|
| 3557 | | - const i915_reg_t reg) |
|---|
| 3558 | | -{ |
|---|
| 3559 | | - return DIV_ROUND_UP_ULL(intel_rc6_residency_ns(dev_priv, reg), 1000); |
|---|
| 3560 | | -} |
|---|
| 3561 | | - |
|---|
| 3562 | | -#define I915_READ8(reg) dev_priv->uncore.funcs.mmio_readb(dev_priv, (reg), true) |
|---|
| 3563 | | -#define I915_WRITE8(reg, val) dev_priv->uncore.funcs.mmio_writeb(dev_priv, (reg), (val), true) |
|---|
| 3564 | | - |
|---|
| 3565 | | -#define I915_READ16(reg) dev_priv->uncore.funcs.mmio_readw(dev_priv, (reg), true) |
|---|
| 3566 | | -#define I915_WRITE16(reg, val) dev_priv->uncore.funcs.mmio_writew(dev_priv, (reg), (val), true) |
|---|
| 3567 | | -#define I915_READ16_NOTRACE(reg) dev_priv->uncore.funcs.mmio_readw(dev_priv, (reg), false) |
|---|
| 3568 | | -#define I915_WRITE16_NOTRACE(reg, val) dev_priv->uncore.funcs.mmio_writew(dev_priv, (reg), (val), false) |
|---|
| 3569 | | - |
|---|
| 3570 | | -#define I915_READ(reg) dev_priv->uncore.funcs.mmio_readl(dev_priv, (reg), true) |
|---|
| 3571 | | -#define I915_WRITE(reg, val) dev_priv->uncore.funcs.mmio_writel(dev_priv, (reg), (val), true) |
|---|
| 3572 | | -#define I915_READ_NOTRACE(reg) dev_priv->uncore.funcs.mmio_readl(dev_priv, (reg), false) |
|---|
| 3573 | | -#define I915_WRITE_NOTRACE(reg, val) dev_priv->uncore.funcs.mmio_writel(dev_priv, (reg), (val), false) |
|---|
| 3574 | | - |
|---|
| 3575 | | -/* Be very careful with read/write 64-bit values. On 32-bit machines, they |
|---|
| 3576 | | - * will be implemented using 2 32-bit writes in an arbitrary order with |
|---|
| 3577 | | - * an arbitrary delay between them. This can cause the hardware to |
|---|
| 3578 | | - * act upon the intermediate value, possibly leading to corruption and |
|---|
| 3579 | | - * machine death. For this reason we do not support I915_WRITE64, or |
|---|
| 3580 | | - * dev_priv->uncore.funcs.mmio_writeq. |
|---|
| 3581 | | - * |
|---|
| 3582 | | - * When reading a 64-bit value as two 32-bit values, the delay may cause |
|---|
| 3583 | | - * the two reads to mismatch, e.g. a timestamp overflowing. Also note that |
|---|
| 3584 | | - * occasionally a 64-bit register does not actualy support a full readq |
|---|
| 3585 | | - * and must be read using two 32-bit reads. |
|---|
| 3586 | | - * |
|---|
| 3587 | | - * You have been warned. |
|---|
| 3588 | | - */ |
|---|
| 3589 | | -#define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) |
|---|
| 3590 | | - |
|---|
| 3591 | | -#define I915_READ64_2x32(lower_reg, upper_reg) ({ \ |
|---|
| 3592 | | - u32 upper, lower, old_upper, loop = 0; \ |
|---|
| 3593 | | - upper = I915_READ(upper_reg); \ |
|---|
| 3594 | | - do { \ |
|---|
| 3595 | | - old_upper = upper; \ |
|---|
| 3596 | | - lower = I915_READ(lower_reg); \ |
|---|
| 3597 | | - upper = I915_READ(upper_reg); \ |
|---|
| 3598 | | - } while (upper != old_upper && loop++ < 2); \ |
|---|
| 3599 | | - (u64)upper << 32 | lower; }) |
|---|
| 3600 | | - |
|---|
| 3601 | | -#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) |
|---|
| 3602 | | -#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) |
|---|
| 3603 | | - |
|---|
| 3604 | | -#define __raw_read(x, s) \ |
|---|
| 3605 | | -static inline uint##x##_t __raw_i915_read##x(const struct drm_i915_private *dev_priv, \ |
|---|
| 3606 | | - i915_reg_t reg) \ |
|---|
| 3607 | | -{ \ |
|---|
| 3608 | | - return read##s(dev_priv->regs + i915_mmio_reg_offset(reg)); \ |
|---|
| 3609 | | -} |
|---|
| 3610 | | - |
|---|
| 3611 | | -#define __raw_write(x, s) \ |
|---|
| 3612 | | -static inline void __raw_i915_write##x(const struct drm_i915_private *dev_priv, \ |
|---|
| 3613 | | - i915_reg_t reg, uint##x##_t val) \ |
|---|
| 3614 | | -{ \ |
|---|
| 3615 | | - write##s(val, dev_priv->regs + i915_mmio_reg_offset(reg)); \ |
|---|
| 3616 | | -} |
|---|
| 3617 | | -__raw_read(8, b) |
|---|
| 3618 | | -__raw_read(16, w) |
|---|
| 3619 | | -__raw_read(32, l) |
|---|
| 3620 | | -__raw_read(64, q) |
|---|
| 3621 | | - |
|---|
| 3622 | | -__raw_write(8, b) |
|---|
| 3623 | | -__raw_write(16, w) |
|---|
| 3624 | | -__raw_write(32, l) |
|---|
| 3625 | | -__raw_write(64, q) |
|---|
| 3626 | | - |
|---|
| 3627 | | -#undef __raw_read |
|---|
| 3628 | | -#undef __raw_write |
|---|
| 1976 | +#define POSTING_READ(reg__) __I915_REG_OP(posting_read, dev_priv, (reg__)) |
|---|
| 3629 | 1977 | |
|---|
| 3630 | 1978 | /* These are untraced mmio-accessors that are only valid to be used inside |
|---|
| 3631 | 1979 | * critical sections, such as inside IRQ handlers, where forcewake is explicitly |
|---|
| .. | .. |
|---|
| 3653 | 2001 | * therefore generally be serialised, by either the dev_priv->uncore.lock or |
|---|
| 3654 | 2002 | * a more localised lock guarding all access to that bank of registers. |
|---|
| 3655 | 2003 | */ |
|---|
| 3656 | | -#define I915_READ_FW(reg__) __raw_i915_read32(dev_priv, (reg__)) |
|---|
| 3657 | | -#define I915_WRITE_FW(reg__, val__) __raw_i915_write32(dev_priv, (reg__), (val__)) |
|---|
| 3658 | | -#define I915_WRITE64_FW(reg__, val__) __raw_i915_write64(dev_priv, (reg__), (val__)) |
|---|
| 3659 | | -#define POSTING_READ_FW(reg__) (void)I915_READ_FW(reg__) |
|---|
| 3660 | | - |
|---|
| 3661 | | -/* "Broadcast RGB" property */ |
|---|
| 3662 | | -#define INTEL_BROADCAST_RGB_AUTO 0 |
|---|
| 3663 | | -#define INTEL_BROADCAST_RGB_FULL 1 |
|---|
| 3664 | | -#define INTEL_BROADCAST_RGB_LIMITED 2 |
|---|
| 3665 | | - |
|---|
| 3666 | | -static inline i915_reg_t i915_vgacntrl_reg(struct drm_i915_private *dev_priv) |
|---|
| 3667 | | -{ |
|---|
| 3668 | | - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
|---|
| 3669 | | - return VLV_VGACNTRL; |
|---|
| 3670 | | - else if (INTEL_GEN(dev_priv) >= 5) |
|---|
| 3671 | | - return CPU_VGACNTRL; |
|---|
| 3672 | | - else |
|---|
| 3673 | | - return VGACNTRL; |
|---|
| 3674 | | -} |
|---|
| 3675 | | - |
|---|
| 3676 | | -static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m) |
|---|
| 3677 | | -{ |
|---|
| 3678 | | - unsigned long j = msecs_to_jiffies(m); |
|---|
| 3679 | | - |
|---|
| 3680 | | - return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1); |
|---|
| 3681 | | -} |
|---|
| 3682 | | - |
|---|
| 3683 | | -static inline unsigned long nsecs_to_jiffies_timeout(const u64 n) |
|---|
| 3684 | | -{ |
|---|
| 3685 | | - /* nsecs_to_jiffies64() does not guard against overflow */ |
|---|
| 3686 | | - if (NSEC_PER_SEC % HZ && |
|---|
| 3687 | | - div_u64(n, NSEC_PER_SEC) >= MAX_JIFFY_OFFSET / HZ) |
|---|
| 3688 | | - return MAX_JIFFY_OFFSET; |
|---|
| 3689 | | - |
|---|
| 3690 | | - return min_t(u64, MAX_JIFFY_OFFSET, nsecs_to_jiffies64(n) + 1); |
|---|
| 3691 | | -} |
|---|
| 3692 | | - |
|---|
| 3693 | | -/* |
|---|
| 3694 | | - * If you need to wait X milliseconds between events A and B, but event B |
|---|
| 3695 | | - * doesn't happen exactly after event A, you record the timestamp (jiffies) of |
|---|
| 3696 | | - * when event A happened, then just before event B you call this function and |
|---|
| 3697 | | - * pass the timestamp as the first argument, and X as the second argument. |
|---|
| 3698 | | - */ |
|---|
| 3699 | | -static inline void |
|---|
| 3700 | | -wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms) |
|---|
| 3701 | | -{ |
|---|
| 3702 | | - unsigned long target_jiffies, tmp_jiffies, remaining_jiffies; |
|---|
| 3703 | | - |
|---|
| 3704 | | - /* |
|---|
| 3705 | | - * Don't re-read the value of "jiffies" every time since it may change |
|---|
| 3706 | | - * behind our back and break the math. |
|---|
| 3707 | | - */ |
|---|
| 3708 | | - tmp_jiffies = jiffies; |
|---|
| 3709 | | - target_jiffies = timestamp_jiffies + |
|---|
| 3710 | | - msecs_to_jiffies_timeout(to_wait_ms); |
|---|
| 3711 | | - |
|---|
| 3712 | | - if (time_after(target_jiffies, tmp_jiffies)) { |
|---|
| 3713 | | - remaining_jiffies = target_jiffies - tmp_jiffies; |
|---|
| 3714 | | - while (remaining_jiffies) |
|---|
| 3715 | | - remaining_jiffies = |
|---|
| 3716 | | - schedule_timeout_uninterruptible(remaining_jiffies); |
|---|
| 3717 | | - } |
|---|
| 3718 | | -} |
|---|
| 3719 | | - |
|---|
| 3720 | | -static inline bool |
|---|
| 3721 | | -__i915_request_irq_complete(const struct i915_request *rq) |
|---|
| 3722 | | -{ |
|---|
| 3723 | | - struct intel_engine_cs *engine = rq->engine; |
|---|
| 3724 | | - u32 seqno; |
|---|
| 3725 | | - |
|---|
| 3726 | | - /* Note that the engine may have wrapped around the seqno, and |
|---|
| 3727 | | - * so our request->global_seqno will be ahead of the hardware, |
|---|
| 3728 | | - * even though it completed the request before wrapping. We catch |
|---|
| 3729 | | - * this by kicking all the waiters before resetting the seqno |
|---|
| 3730 | | - * in hardware, and also signal the fence. |
|---|
| 3731 | | - */ |
|---|
| 3732 | | - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags)) |
|---|
| 3733 | | - return true; |
|---|
| 3734 | | - |
|---|
| 3735 | | - /* The request was dequeued before we were awoken. We check after |
|---|
| 3736 | | - * inspecting the hw to confirm that this was the same request |
|---|
| 3737 | | - * that generated the HWS update. The memory barriers within |
|---|
| 3738 | | - * the request execution are sufficient to ensure that a check |
|---|
| 3739 | | - * after reading the value from hw matches this request. |
|---|
| 3740 | | - */ |
|---|
| 3741 | | - seqno = i915_request_global_seqno(rq); |
|---|
| 3742 | | - if (!seqno) |
|---|
| 3743 | | - return false; |
|---|
| 3744 | | - |
|---|
| 3745 | | - /* Before we do the heavier coherent read of the seqno, |
|---|
| 3746 | | - * check the value (hopefully) in the CPU cacheline. |
|---|
| 3747 | | - */ |
|---|
| 3748 | | - if (__i915_request_completed(rq, seqno)) |
|---|
| 3749 | | - return true; |
|---|
| 3750 | | - |
|---|
| 3751 | | - /* Ensure our read of the seqno is coherent so that we |
|---|
| 3752 | | - * do not "miss an interrupt" (i.e. if this is the last |
|---|
| 3753 | | - * request and the seqno write from the GPU is not visible |
|---|
| 3754 | | - * by the time the interrupt fires, we will see that the |
|---|
| 3755 | | - * request is incomplete and go back to sleep awaiting |
|---|
| 3756 | | - * another interrupt that will never come.) |
|---|
| 3757 | | - * |
|---|
| 3758 | | - * Strictly, we only need to do this once after an interrupt, |
|---|
| 3759 | | - * but it is easier and safer to do it every time the waiter |
|---|
| 3760 | | - * is woken. |
|---|
| 3761 | | - */ |
|---|
| 3762 | | - if (engine->irq_seqno_barrier && |
|---|
| 3763 | | - test_and_clear_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted)) { |
|---|
| 3764 | | - struct intel_breadcrumbs *b = &engine->breadcrumbs; |
|---|
| 3765 | | - |
|---|
| 3766 | | - /* The ordering of irq_posted versus applying the barrier |
|---|
| 3767 | | - * is crucial. The clearing of the current irq_posted must |
|---|
| 3768 | | - * be visible before we perform the barrier operation, |
|---|
| 3769 | | - * such that if a subsequent interrupt arrives, irq_posted |
|---|
| 3770 | | - * is reasserted and our task rewoken (which causes us to |
|---|
| 3771 | | - * do another __i915_request_irq_complete() immediately |
|---|
| 3772 | | - * and reapply the barrier). Conversely, if the clear |
|---|
| 3773 | | - * occurs after the barrier, then an interrupt that arrived |
|---|
| 3774 | | - * whilst we waited on the barrier would not trigger a |
|---|
| 3775 | | - * barrier on the next pass, and the read may not see the |
|---|
| 3776 | | - * seqno update. |
|---|
| 3777 | | - */ |
|---|
| 3778 | | - engine->irq_seqno_barrier(engine); |
|---|
| 3779 | | - |
|---|
| 3780 | | - /* If we consume the irq, but we are no longer the bottom-half, |
|---|
| 3781 | | - * the real bottom-half may not have serialised their own |
|---|
| 3782 | | - * seqno check with the irq-barrier (i.e. may have inspected |
|---|
| 3783 | | - * the seqno before we believe it coherent since they see |
|---|
| 3784 | | - * irq_posted == false but we are still running). |
|---|
| 3785 | | - */ |
|---|
| 3786 | | - spin_lock_irq(&b->irq_lock); |
|---|
| 3787 | | - if (b->irq_wait && b->irq_wait->tsk != current) |
|---|
| 3788 | | - /* Note that if the bottom-half is changed as we |
|---|
| 3789 | | - * are sending the wake-up, the new bottom-half will |
|---|
| 3790 | | - * be woken by whomever made the change. We only have |
|---|
| 3791 | | - * to worry about when we steal the irq-posted for |
|---|
| 3792 | | - * ourself. |
|---|
| 3793 | | - */ |
|---|
| 3794 | | - wake_up_process(b->irq_wait->tsk); |
|---|
| 3795 | | - spin_unlock_irq(&b->irq_lock); |
|---|
| 3796 | | - |
|---|
| 3797 | | - if (__i915_request_completed(rq, seqno)) |
|---|
| 3798 | | - return true; |
|---|
| 3799 | | - } |
|---|
| 3800 | | - |
|---|
| 3801 | | - return false; |
|---|
| 3802 | | -} |
|---|
| 3803 | | - |
|---|
| 3804 | | -void i915_memcpy_init_early(struct drm_i915_private *dev_priv); |
|---|
| 3805 | | -bool i915_memcpy_from_wc(void *dst, const void *src, unsigned long len); |
|---|
| 3806 | | - |
|---|
| 3807 | | -/* The movntdqa instructions used for memcpy-from-wc require 16-byte alignment, |
|---|
| 3808 | | - * as well as SSE4.1 support. i915_memcpy_from_wc() will report if it cannot |
|---|
| 3809 | | - * perform the operation. To check beforehand, pass in the parameters to |
|---|
| 3810 | | - * to i915_can_memcpy_from_wc() - since we only care about the low 4 bits, |
|---|
| 3811 | | - * you only need to pass in the minor offsets, page-aligned pointers are |
|---|
| 3812 | | - * always valid. |
|---|
| 3813 | | - * |
|---|
| 3814 | | - * For just checking for SSE4.1, in the foreknowledge that the future use |
|---|
| 3815 | | - * will be correctly aligned, just use i915_has_memcpy_from_wc(). |
|---|
| 3816 | | - */ |
|---|
| 3817 | | -#define i915_can_memcpy_from_wc(dst, src, len) \ |
|---|
| 3818 | | - i915_memcpy_from_wc((void *)((unsigned long)(dst) | (unsigned long)(src) | (len)), NULL, 0) |
|---|
| 3819 | | - |
|---|
| 3820 | | -#define i915_has_memcpy_from_wc() \ |
|---|
| 3821 | | - i915_memcpy_from_wc(NULL, NULL, 0) |
|---|
| 2004 | +#define I915_READ_FW(reg__) __I915_REG_OP(read_fw, dev_priv, (reg__)) |
|---|
| 2005 | +#define I915_WRITE_FW(reg__, val__) __I915_REG_OP(write_fw, dev_priv, (reg__), (val__)) |
|---|
| 3822 | 2006 | |
|---|
| 3823 | 2007 | /* i915_mm.c */ |
|---|
| 3824 | 2008 | int remap_io_mapping(struct vm_area_struct *vma, |
|---|
| 3825 | 2009 | unsigned long addr, unsigned long pfn, unsigned long size, |
|---|
| 3826 | 2010 | struct io_mapping *iomap); |
|---|
| 2011 | +int remap_io_sg(struct vm_area_struct *vma, |
|---|
| 2012 | + unsigned long addr, unsigned long size, |
|---|
| 2013 | + struct scatterlist *sgl, resource_size_t iobase); |
|---|
| 3827 | 2014 | |
|---|
| 3828 | 2015 | static inline int intel_hws_csb_write_index(struct drm_i915_private *i915) |
|---|
| 3829 | 2016 | { |
|---|
| .. | .. |
|---|
| 3833 | 2020 | return I915_HWS_CSB_WRITE_INDEX; |
|---|
| 3834 | 2021 | } |
|---|
| 3835 | 2022 | |
|---|
| 2023 | +static inline enum i915_map_type |
|---|
| 2024 | +i915_coherent_map_type(struct drm_i915_private *i915) |
|---|
| 2025 | +{ |
|---|
| 2026 | + return HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC; |
|---|
| 2027 | +} |
|---|
| 2028 | + |
|---|
| 2029 | +static inline u64 i915_cs_timestamp_ns_to_ticks(struct drm_i915_private *i915, u64 val) |
|---|
| 2030 | +{ |
|---|
| 2031 | + return DIV_ROUND_UP_ULL(val * RUNTIME_INFO(i915)->cs_timestamp_frequency_hz, |
|---|
| 2032 | + 1000000000); |
|---|
| 2033 | +} |
|---|
| 2034 | + |
|---|
| 2035 | +static inline u64 i915_cs_timestamp_ticks_to_ns(struct drm_i915_private *i915, u64 val) |
|---|
| 2036 | +{ |
|---|
| 2037 | + return div_u64(val * 1000000000, |
|---|
| 2038 | + RUNTIME_INFO(i915)->cs_timestamp_frequency_hz); |
|---|
| 2039 | +} |
|---|
| 2040 | + |
|---|
| 3836 | 2041 | #endif |
|---|