History

Merge tag 'drm-intel-next-2018-09-06-2' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

Merge tag 'gvt-next-2018-09-04' drm-intel-next-2018-09-06-1: UAPI Changes: - GGTT coherency GETPARAM: GGTT has turned out to be non-coherent for some platforms, which we've failed to communicate to userspace so far. SNA was modified to do extra flushing on non-coherent GGTT access, while Mesa will mitigate by always requiring WC mapping (which is non-coherent anyway). - Neuter Resource Streamer uAPI: There never really were users for the feature, so neuter it while keeping the interface bits for compatibility. This is a long due item from past. Cross-subsystem Changes: - Backmerge of branch drm-next-4.19 for DP_DPCD_REV_14 changes Core Changes: - None Driver Changes: - A load of Icelake (ICL) enabling patches (Paulo, Manasi) - Enabled full PPGTT for IVB,VLV and HSW (Chris) - Bugzilla #107113: Distribute DDB based on display resolutions (Mahesh) - Bugzillas #100023,#107476,#94921: Support limited range DP displays (Jani) - Bugzilla #107503: Increase LSPCON timeout (Fredrik) - Avoid boosting GPU due to an occasional stall in interactive workloads (Chris) - Apply GGTT coherency W/A only for affected systems instead of all (Chris) - Fix for infinite link training loop for faulty USB-C MST hubs (Nathan) - Keep KMS functional on Gen4 and earlier when GPU is wedged (Chris) - Stop holding ppGTT reference from closed VMAs (Chris) - Clear error registers after error capture (Lionel) - Various Icelake fixes (Anusha, Jyoti, Ville, Tvrtko) - Add missing Coffeelake (CFL) PCI IDs (Rodrigo) - Flush execlists tasklet directly from reset-finish (Chris) - Fix LPE audio runtime PM (Chris) - Fix detection of out of range surface positions (GLK/CNL) (Ville) - Remove wait-for-idle for PSR2 (Dhinakaran) - Power down existing display hardware resources when display is disabled (Chris) - Don't allow runtime power management if RC6 doesn't exist (Chris) - Add debugging checks for runtime power management paths (Imre) - Increase symmetry in display power init/fini paths (Imre) - Isolate GVT specific macros from i915_reg.h (Lucas) - Increase symmetry in power management enable/disable paths (Chris) - Increase IP disable timeout to 100 ms to avoid DRM_ERROR (Imre) - Fix memory leak from HDMI HDCP write function (Brian, Rodrigo) - Reject Y/Yf tiling on interlaced modes (Ville) - Use a cached mapping for the physical HWS on older gens (Chris) - Force slow path of writing relocations to buffer if unable to write to userspace (Chris) - Do a full device reset after being wedged (Chris) - Keep forcewake counts over reset (in case of debugfs user) (Imre, Chris) - Avoid false-positive errors from power wells during init (Imre) - Reset engines forcibly in exchange of declaring whole device wedged (Mika) - Reduce context HW ID lifetime in preparation for Icelake (Chris) - Attempt to recover from module load failures (Chris) - Keep select interrupts over a reset to avoid missing/losing them (Chris) - GuC submission backend improvements (Jakub) - Terminate context images with BB_END (Chris, Lionel) - Make GCC evaluate GGTT view struct size assertions again (Ville) - Add selftest to exercise suspend/hibernate code-paths for GEM (Chris) - Use a full emulation of a user ppgtt context in selftests (Chris) - Exercise resetting in the middle of a wait-on-fence in selftests (Chris) - Fix coherency issues on selftests for Baytrail (Chris) - Various other GEM fixes / self-test updates (Chris, Matt) - GuC doorbell self-tests (Daniele) - PSR mode control through debugfs for IGTs (Maarten) - Degrade expected WM latency errors to DRM_DEBUG_KMS (Chris) - Cope with errors better in MST link training (Dhinakaran) - Fix WARN on KBL external displays (Azhar) - Power well code cleanups (Imre) - Fixes to PSR debugging (Dhinakaran) - Make forcewake errors louder for easier catching in CI (WARNs) (Chris) - Fortify tiling code against programmer errors (Chris) - Bunch of fixes for CI exposed corner cases (multiple authors, mostly Chris) Signed-off-by: Dave Airlie <airlied@redhat.com>

Dave Airlie committed 8 years ago

Commit b1c15662 parents 1f3eb34 a28957b87 files · +3857 −1806Browse files

Unified · Split

87 files
  1. drivers/gpu/drm/i915/Kconfig.debug +12 −0
  2. drivers/gpu/drm/i915/gvt/cfg_space.c +12 −0
  3. drivers/gpu/drm/i915/gvt/cmd_parser.c +10 −1
  4. drivers/gpu/drm/i915/gvt/display.c +1 −0
  5. drivers/gpu/drm/i915/gvt/edid.c +9 −0
  6. drivers/gpu/drm/i915/gvt/gtt.c +6 −3
  7. drivers/gpu/drm/i915/gvt/gvt.c +1 −2
  8. drivers/gpu/drm/i915/gvt/handlers.c +12 −22
  9. drivers/gpu/drm/i915/gvt/kvmgt.c +2 −2
  10. drivers/gpu/drm/i915/gvt/mmio.c +2 −1
  11. drivers/gpu/drm/i915/gvt/mmio_context.c +0 −13
  12. drivers/gpu/drm/i915/gvt/mmio_context.h +3 −0
  13. drivers/gpu/drm/i915/gvt/opregion.c +0 −1
  14. drivers/gpu/drm/i915/gvt/page_track.c +2 −0
  15. drivers/gpu/drm/i915/gvt/reg.h +18 −0
  16. drivers/gpu/drm/i915/gvt/scheduler.c +34 −30
  17. drivers/gpu/drm/i915/i915_debugfs.c +64 −24
  18. drivers/gpu/drm/i915/i915_drv.c +104 −90
  19. drivers/gpu/drm/i915/i915_drv.h +49 −14
  20. drivers/gpu/drm/i915/i915_gem.c +52 −13
  21. drivers/gpu/drm/i915/i915_gem.h +0 −6
  22. drivers/gpu/drm/i915/i915_gem_context.c +161 −71
  23. drivers/gpu/drm/i915/i915_gem_context.h +23 −3
  24. drivers/gpu/drm/i915/i915_gem_execbuffer.c +21 −22
  25. drivers/gpu/drm/i915/i915_gem_gtt.c +25 −27
  26. drivers/gpu/drm/i915/i915_gem_gtt.h +10 −13
  27. drivers/gpu/drm/i915/i915_gem_object.h +5 −5
  28. drivers/gpu/drm/i915/i915_irq.c +26 −10
  29. drivers/gpu/drm/i915/i915_pci.c +11 −5
  30. drivers/gpu/drm/i915/i915_perf.c +24 −31
  31. drivers/gpu/drm/i915/i915_reg.h +387 −340
  32. drivers/gpu/drm/i915/i915_request.c +4 −5
  33. drivers/gpu/drm/i915/i915_request.h +25 −14
  34. drivers/gpu/drm/i915/i915_vma.c +4 −1
  35. drivers/gpu/drm/i915/i915_vma.h +9 −1
  36. drivers/gpu/drm/i915/intel_atomic_plane.c +4 −2
  37. drivers/gpu/drm/i915/intel_breadcrumbs.c +2 −4
  38. drivers/gpu/drm/i915/intel_csr.c +24 −9
  39. drivers/gpu/drm/i915/intel_ddi.c +223 −17
  40. drivers/gpu/drm/i915/intel_device_info.h +1 −1
  41. drivers/gpu/drm/i915/intel_display.c +115 −57
  42. drivers/gpu/drm/i915/intel_display.h +26 −2
  43. drivers/gpu/drm/i915/intel_dp.c +451 −83
  44. drivers/gpu/drm/i915/intel_dp_link_training.c +20 −5
  45. drivers/gpu/drm/i915/intel_dp_mst.c +7 −7
  46. drivers/gpu/drm/i915/intel_dpll_mgr.c +46 −16
  47. drivers/gpu/drm/i915/intel_dpll_mgr.h +1 −0
  48. drivers/gpu/drm/i915/intel_drv.h +33 −10
  49. drivers/gpu/drm/i915/intel_engine_cs.c +41 −52
  50. drivers/gpu/drm/i915/intel_guc.c +46 −56
  51. drivers/gpu/drm/i915/intel_guc.h +5 −7
  52. drivers/gpu/drm/i915/intel_guc_ads.c +1 −1
  53. drivers/gpu/drm/i915/intel_guc_ct.c +2 −5
  54. drivers/gpu/drm/i915/intel_guc_fwif.h +1 −0
  55. drivers/gpu/drm/i915/intel_guc_log.c +1 −1
  56. drivers/gpu/drm/i915/intel_guc_submission.c +20 −15
  57. drivers/gpu/drm/i915/intel_guc_submission.h +4 −0
  58. drivers/gpu/drm/i915/intel_hangcheck.c +1 −1
  59. drivers/gpu/drm/i915/intel_hdcp.c +3 −3
  60. drivers/gpu/drm/i915/intel_hdmi.c +7 −3
  61. drivers/gpu/drm/i915/intel_huc.c +1 −1
  62. drivers/gpu/drm/i915/intel_i2c.c +8 −8
  63. drivers/gpu/drm/i915/intel_lrc.c +110 −49
  64. drivers/gpu/drm/i915/intel_lrc.h +0 −2
  65. drivers/gpu/drm/i915/intel_lrc_reg.h +1 −1
  66. drivers/gpu/drm/i915/intel_mocs.c +3 −8
  67. drivers/gpu/drm/i915/intel_mocs.h +1 −1
  68. drivers/gpu/drm/i915/intel_pm.c +62 −39
  69. drivers/gpu/drm/i915/intel_psr.c +192 −85
  70. drivers/gpu/drm/i915/intel_ringbuffer.c +56 −54
  71. drivers/gpu/drm/i915/intel_ringbuffer.h +29 −10
  72. drivers/gpu/drm/i915/intel_runtime_pm.c +674 −329
  73. drivers/gpu/drm/i915/intel_sprite.c +7 −6
  74. drivers/gpu/drm/i915/intel_uc_fw.c +1 −1
  75. drivers/gpu/drm/i915/intel_uncore.c +92 −38
  76. drivers/gpu/drm/i915/intel_wopcm.c +6 −0
  77. drivers/gpu/drm/i915/selftests/huge_pages.c +6 −5
  78. drivers/gpu/drm/i915/selftests/i915_gem.c +221 −0
  79. drivers/gpu/drm/i915/selftests/i915_gem_coherency.c +17 −21
  80. drivers/gpu/drm/i915/selftests/i915_gem_object.c +1 −1
  81. drivers/gpu/drm/i915/selftests/i915_live_selftests.h +1 −0
  82. drivers/gpu/drm/i915/selftests/intel_guc.c +38 −0
  83. drivers/gpu/drm/i915/selftests/intel_hangcheck.c +89 −12
  84. drivers/gpu/drm/i915/selftests/mock_context.c +3 −8
  85. drivers/gpu/drm/i915/selftests/mock_gtt.c +2 −0
  86. include/drm/i915_pciids.h +1 −0
  87. include/uapi/drm/i915_drm.h +22 −0
drivers/gpu/drm/i915/Kconfig.debug+12−0
@@ -30,6 +30,7 @@ config DRM_I915_DEBUG · 29 unmodified lines
30 select SW_SYNC # signaling validation framework (igt/syncobj*)30 select SW_SYNC # signaling validation framework (igt/syncobj*)
31 select DRM_I915_SW_FENCE_DEBUG_OBJECTS31 select DRM_I915_SW_FENCE_DEBUG_OBJECTS
32 select DRM_I915_SELFTEST32 select DRM_I915_SELFTEST
33 select DRM_I915_DEBUG_RUNTIME_PM
33 default n34 default n
34 help35 help
35 Choose this option to turn on extra driver debugging that may affect36 Choose this option to turn on extra driver debugging that may affect
@@ -167,3 +168,14 @@ config DRM_I915_DEBUG_VBLANK_EVADE · 131 unmodified lines
167 the vblank.168 the vblank.
168 169
169 If in doubt, say "N".170 If in doubt, say "N".
171
172config DRM_I915_DEBUG_RUNTIME_PM
173 bool "Enable extra state checking for runtime PM"
174 depends on DRM_I915
175 default n
176 help
177 Choose this option to turn on extra state checking for the
178 runtime PM functionality. This may introduce overhead during
179 driver loading, suspend and resume operations.
180
181 If in doubt, say "N"
drivers/gpu/drm/i915/gvt/cfg_space.c+12−0
@@ -56,6 +56,10 @@ static const u8 pci_cfg_space_rw_bmp[PCI_INTERRUPT_LINE + 4] = { · 55 unmodified lines
56 56
57/**57/**
58 * vgpu_pci_cfg_mem_write - write virtual cfg space memory58 * vgpu_pci_cfg_mem_write - write virtual cfg space memory
59 * @vgpu: target vgpu
60 * @off: offset
61 * @src: src ptr to write
62 * @bytes: number of bytes
59 *63 *
60 * Use this function to write virtual cfg space memory.64 * Use this function to write virtual cfg space memory.
61 * For standard cfg space, only RW bits can be changed,65 * For standard cfg space, only RW bits can be changed,
@@ -91,6 +95,10 @@ static void vgpu_pci_cfg_mem_write(struct intel_vgpu *vgpu, unsigned int off, · 29 unmodified lines
91 95
92/**96/**
93 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space read97 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space read
98 * @vgpu: target vgpu
99 * @offset: offset
100 * @p_data: return data ptr
101 * @bytes: number of bytes to read
94 *102 *
95 * Returns:103 * Returns:
96 * Zero on success, negative error code if failed.104 * Zero on success, negative error code if failed.
@@ -278,6 +286,10 @@ static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset, · 181 unmodified lines
278 286
279/**287/**
280 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space write288 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space write
289 * @vgpu: target vgpu
290 * @offset: offset
291 * @p_data: write data ptr
292 * @bytes: number of bytes to write
281 *293 *
282 * Returns:294 * Returns:
283 * Zero on success, negative error code if failed.295 * Zero on success, negative error code if failed.
drivers/gpu/drm/i915/gvt/cmd_parser.c+10−1
@@ -1840,6 +1840,8 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s) · 1839 unmodified lines
1840 return ret;1840 return ret;
1841}1841}
1842 1842
1843static int mi_noop_index;
1844
1843static struct cmd_info cmd_info[] = {1845static struct cmd_info cmd_info[] = {
1844 {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL},1846 {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL},
1845 1847
@@ -2525,7 +2527,12 @@ static int cmd_parser_exec(struct parser_exec_state *s) · 679 unmodified lines
2525 2527
2526 cmd = cmd_val(s, 0);2528 cmd = cmd_val(s, 0);
2527 2529
2528 info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);2530 /* fastpath for MI_NOOP */
2531 if (cmd == MI_NOOP)
2532 info = &cmd_info[mi_noop_index];
2533 else
2534 info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
2535
2529 if (info == NULL) {2536 if (info == NULL) {
2530 gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n",2537 gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n",
2531 cmd, get_opcode(cmd, s->ring_id),2538 cmd, get_opcode(cmd, s->ring_id),
@@ -2928,6 +2935,8 @@ static int init_cmd_table(struct intel_gvt *gvt) · 396 unmodified lines
2928 kfree(e);2935 kfree(e);
2929 return -EEXIST;2936 return -EEXIST;
2930 }2937 }
2938 if (cmd_info[i].opcode == OP_MI_NOOP)
2939 mi_noop_index = i;
2931 2940
2932 INIT_HLIST_NODE(&e->hlist);2941 INIT_HLIST_NODE(&e->hlist);
2933 add_cmd_entry(gvt, e);2942 add_cmd_entry(gvt, e);
drivers/gpu/drm/i915/gvt/display.c+1−0
@@ -462,6 +462,7 @@ void intel_vgpu_clean_display(struct intel_vgpu *vgpu) · 461 unmodified lines
462/**462/**
463 * intel_vgpu_init_display- initialize vGPU virtual display emulation463 * intel_vgpu_init_display- initialize vGPU virtual display emulation
464 * @vgpu: a vGPU464 * @vgpu: a vGPU
465 * @resolution: resolution index for intel_vgpu_edid
465 *466 *
466 * This function is used to initialize vGPU virtual display emulation stuffs467 * This function is used to initialize vGPU virtual display emulation stuffs
467 *468 *
drivers/gpu/drm/i915/gvt/edid.c+9−0
@@ -340,6 +340,9 @@ static int gmbus2_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, · 339 unmodified lines
340/**340/**
341 * intel_gvt_i2c_handle_gmbus_read - emulate gmbus register mmio read341 * intel_gvt_i2c_handle_gmbus_read - emulate gmbus register mmio read
342 * @vgpu: a vGPU342 * @vgpu: a vGPU
343 * @offset: reg offset
344 * @p_data: data return buffer
345 * @bytes: access data length
343 *346 *
344 * This function is used to emulate gmbus register mmio read347 * This function is used to emulate gmbus register mmio read
345 *348 *
@@ -365,6 +368,9 @@ int intel_gvt_i2c_handle_gmbus_read(struct intel_vgpu *vgpu, · 19 unmodified lines
365/**368/**
366 * intel_gvt_i2c_handle_gmbus_write - emulate gmbus register mmio write369 * intel_gvt_i2c_handle_gmbus_write - emulate gmbus register mmio write
367 * @vgpu: a vGPU370 * @vgpu: a vGPU
371 * @offset: reg offset
372 * @p_data: data return buffer
373 * @bytes: access data length
368 *374 *
369 * This function is used to emulate gmbus register mmio write375 * This function is used to emulate gmbus register mmio write
370 *376 *
@@ -437,6 +443,9 @@ static inline int get_aux_ch_reg(unsigned int offset) · 66 unmodified lines
437/**443/**
438 * intel_gvt_i2c_handle_aux_ch_write - emulate AUX channel register write444 * intel_gvt_i2c_handle_aux_ch_write - emulate AUX channel register write
439 * @vgpu: a vGPU445 * @vgpu: a vGPU
446 * @port_idx: port index
447 * @offset: reg offset
448 * @p_data: write ptr
440 *449 *
441 * This function is used to emulate AUX channel register write450 * This function is used to emulate AUX channel register write
442 *451 *
drivers/gpu/drm/i915/gvt/gtt.c+6−3
@@ -1113,6 +1113,10 @@ static inline void ppgtt_generate_shadow_entry(struct intel_gvt_gtt_entry *se, · 1112 unmodified lines
1113}1113}
1114 1114
1115/**1115/**
1116 * Check if can do 2M page
1117 * @vgpu: target vgpu
1118 * @entry: target pfn's gtt entry
1119 *
1116 * Return 1 if 2MB huge gtt shadowing is possilbe, 0 if miscondition,1120 * Return 1 if 2MB huge gtt shadowing is possilbe, 0 if miscondition,
1117 * negtive if found err.1121 * negtive if found err.
1118 */1122 */
@@ -1945,7 +1949,7 @@ void intel_vgpu_unpin_mm(struct intel_vgpu_mm *mm) · 826 unmodified lines
1945 1949
1946/**1950/**
1947 * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object1951 * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object
1948 * @vgpu: a vGPU1952 * @mm: target vgpu mm
1949 *1953 *
1950 * This function is called when user wants to use a vGPU mm object. If this1954 * This function is called when user wants to use a vGPU mm object. If this
1951 * mm object hasn't been shadowed yet, the shadow will be populated at this1955 * mm object hasn't been shadowed yet, the shadow will be populated at this
@@ -2521,8 +2525,7 @@ fail: · 569 unmodified lines
2521/**2525/**
2522 * intel_vgpu_find_ppgtt_mm - find a PPGTT mm object2526 * intel_vgpu_find_ppgtt_mm - find a PPGTT mm object
2523 * @vgpu: a vGPU2527 * @vgpu: a vGPU
2524 * @page_table_level: PPGTT page table level2528 * @pdps: pdp root array
2525 * @root_entry: PPGTT page table root pointers
2526 *2529 *
2527 * This function is used to find a PPGTT mm object from mm object pool2530 * This function is used to find a PPGTT mm object from mm object pool
2528 *2531 *
drivers/gpu/drm/i915/gvt/gvt.c+1−2
@@ -189,7 +189,6 @@ static const struct intel_gvt_ops intel_gvt_ops = { · 188 unmodified lines
189 189
190/**190/**
191 * intel_gvt_init_host - Load MPT modules and detect if we're running in host191 * intel_gvt_init_host - Load MPT modules and detect if we're running in host
192 * @gvt: intel gvt device
193 *192 *
194 * This function is called at the driver loading stage. If failed to find a193 * This function is called at the driver loading stage. If failed to find a
195 * loadable MPT module or detect currently we're running in a VM, then GVT-g194 * loadable MPT module or detect currently we're running in a VM, then GVT-g
@@ -303,7 +302,7 @@ static int init_service_thread(struct intel_gvt *gvt) · 107 unmodified lines
303 302
304/**303/**
305 * intel_gvt_clean_device - clean a GVT device304 * intel_gvt_clean_device - clean a GVT device
306 * @gvt: intel gvt device305 * @dev_priv: i915 private
307 *306 *
308 * This function is called at the driver unloading stage, to free the307 * This function is called at the driver unloading stage, to free the
309 * resources owned by a GVT device.308 * resources owned by a GVT device.
drivers/gpu/drm/i915/gvt/handlers.c+12−22
@@ -1287,12 +1287,13 @@ static int power_well_ctl_mmio_write(struct intel_vgpu *vgpu, · 1286 unmodified lines
1287{1287{
1288 write_vreg(vgpu, offset, p_data, bytes);1288 write_vreg(vgpu, offset, p_data, bytes);
1289 1289
1290 if (vgpu_vreg(vgpu, offset) & HSW_PWR_WELL_CTL_REQ(HSW_DISP_PW_GLOBAL))1290 if (vgpu_vreg(vgpu, offset) &
1291 HSW_PWR_WELL_CTL_REQ(HSW_PW_CTL_IDX_GLOBAL))
1291 vgpu_vreg(vgpu, offset) |=1292 vgpu_vreg(vgpu, offset) |=
1292 HSW_PWR_WELL_CTL_STATE(HSW_DISP_PW_GLOBAL);1293 HSW_PWR_WELL_CTL_STATE(HSW_PW_CTL_IDX_GLOBAL);
1293 else1294 else
1294 vgpu_vreg(vgpu, offset) &=1295 vgpu_vreg(vgpu, offset) &=
1295 ~HSW_PWR_WELL_CTL_STATE(HSW_DISP_PW_GLOBAL);1296 ~HSW_PWR_WELL_CTL_STATE(HSW_PW_CTL_IDX_GLOBAL);
1296 return 0;1297 return 0;
1297}1298}
1298 1299
@@ -2118,7 +2119,7 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) · 819 unmodified lines
2118 2119
2119 MMIO_F(PCH_GMBUS0, 4 * 4, 0, 0, 0, D_ALL, gmbus_mmio_read,2120 MMIO_F(PCH_GMBUS0, 4 * 4, 0, 0, 0, D_ALL, gmbus_mmio_read,
2120 gmbus_mmio_write);2121 gmbus_mmio_write);
2121 MMIO_F(PCH_GPIOA, 6 * 4, F_UNALIGN, 0, 0, D_ALL, NULL, NULL);2122 MMIO_F(PCH_GPIO_BASE, 6 * 4, F_UNALIGN, 0, 0, D_ALL, NULL, NULL);
2122 MMIO_F(_MMIO(0xe4f00), 0x28, 0, 0, 0, D_ALL, NULL, NULL);2123 MMIO_F(_MMIO(0xe4f00), 0x28, 0, 0, 0, D_ALL, NULL, NULL);
2123 2124
2124 MMIO_F(_MMIO(_PCH_DPB_AUX_CH_CTL), 6 * 4, 0, 0, 0, D_PRE_SKL, NULL,2125 MMIO_F(_MMIO(_PCH_DPB_AUX_CH_CTL), 6 * 4, 0, 0, 0, D_PRE_SKL, NULL,
@@ -2443,17 +2444,10 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) · 318 unmodified lines
2443 MMIO_D(GEN6_RC6p_THRESHOLD, D_ALL);2444 MMIO_D(GEN6_RC6p_THRESHOLD, D_ALL);
2444 MMIO_D(GEN6_RC6pp_THRESHOLD, D_ALL);2445 MMIO_D(GEN6_RC6pp_THRESHOLD, D_ALL);
2445 MMIO_D(GEN6_PMINTRMSK, D_ALL);2446 MMIO_D(GEN6_PMINTRMSK, D_ALL);
2446 /*2447 MMIO_DH(HSW_PWR_WELL_CTL1, D_BDW, NULL, power_well_ctl_mmio_write);
2447 * Use an arbitrary power well controlled by the PWR_WELL_CTL2448 MMIO_DH(HSW_PWR_WELL_CTL2, D_BDW, NULL, power_well_ctl_mmio_write);
2448 * register.2449 MMIO_DH(HSW_PWR_WELL_CTL3, D_BDW, NULL, power_well_ctl_mmio_write);
2449 */2450 MMIO_DH(HSW_PWR_WELL_CTL4, D_BDW, NULL, power_well_ctl_mmio_write);
2450 MMIO_DH(HSW_PWR_WELL_CTL_BIOS(HSW_DISP_PW_GLOBAL), D_BDW, NULL,
2451 power_well_ctl_mmio_write);
2452 MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL), D_BDW, NULL,
2453 power_well_ctl_mmio_write);
2454 MMIO_DH(HSW_PWR_WELL_CTL_KVMR, D_BDW, NULL, power_well_ctl_mmio_write);
2455 MMIO_DH(HSW_PWR_WELL_CTL_DEBUG(HSW_DISP_PW_GLOBAL), D_BDW, NULL,
2456 power_well_ctl_mmio_write);
2457 MMIO_DH(HSW_PWR_WELL_CTL5, D_BDW, NULL, power_well_ctl_mmio_write);2451 MMIO_DH(HSW_PWR_WELL_CTL5, D_BDW, NULL, power_well_ctl_mmio_write);
2458 MMIO_DH(HSW_PWR_WELL_CTL6, D_BDW, NULL, power_well_ctl_mmio_write);2452 MMIO_DH(HSW_PWR_WELL_CTL6, D_BDW, NULL, power_well_ctl_mmio_write);
2459 2453
@@ -2804,13 +2798,8 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) · 344 unmodified lines
2804 MMIO_F(_MMIO(_DPD_AUX_CH_CTL), 6 * 4, 0, 0, 0, D_SKL_PLUS, NULL,2798 MMIO_F(_MMIO(_DPD_AUX_CH_CTL), 6 * 4, 0, 0, 0, D_SKL_PLUS, NULL,
2805 dp_aux_ch_ctl_mmio_write);2799 dp_aux_ch_ctl_mmio_write);
2806 2800
2807 /*2801 MMIO_D(HSW_PWR_WELL_CTL1, D_SKL_PLUS);
2808 * Use an arbitrary power well controlled by the PWR_WELL_CTL2802 MMIO_DH(HSW_PWR_WELL_CTL2, D_SKL_PLUS, NULL, skl_power_well_ctl_write);
2809 * register.
2810 */
2811 MMIO_D(HSW_PWR_WELL_CTL_BIOS(SKL_DISP_PW_MISC_IO), D_SKL_PLUS);
2812 MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(SKL_DISP_PW_MISC_IO), D_SKL_PLUS, NULL,
2813 skl_power_well_ctl_write);
2814 2803
2815 MMIO_D(_MMIO(0xa210), D_SKL_PLUS);2804 MMIO_D(_MMIO(0xa210), D_SKL_PLUS);
2816 MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS);2805 MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
@@ -3434,6 +3423,7 @@ bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt, · 617 unmodified lines
3434 * @offset: register offset3423 * @offset: register offset
3435 * @pdata: data buffer3424 * @pdata: data buffer
3436 * @bytes: data length3425 * @bytes: data length
3426 * @is_read: read or write
3437 *3427 *
3438 * Returns:3428 * Returns:
3439 * Zero on success, negative error code if failed.3429 * Zero on success, negative error code if failed.
drivers/gpu/drm/i915/gvt/kvmgt.c+2−2
@@ -1712,7 +1712,7 @@ static unsigned long kvmgt_gfn_to_pfn(unsigned long handle, unsigned long gfn) · 1711 unmodified lines
1712 return pfn;1712 return pfn;
1713}1713}
1714 1714
1715int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn,1715static int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn,
1716 unsigned long size, dma_addr_t *dma_addr)1716 unsigned long size, dma_addr_t *dma_addr)
1717{1717{
1718 struct kvmgt_guest_info *info;1718 struct kvmgt_guest_info *info;
@@ -1761,7 +1761,7 @@ static void __gvt_dma_release(struct kref *ref) · 42 unmodified lines
1761 __gvt_cache_remove_entry(entry->vgpu, entry);1761 __gvt_cache_remove_entry(entry->vgpu, entry);
1762}1762}
1763 1763
1764void kvmgt_dma_unmap_guest_page(unsigned long handle, dma_addr_t dma_addr)1764static void kvmgt_dma_unmap_guest_page(unsigned long handle, dma_addr_t dma_addr)
1765{1765{
1766 struct kvmgt_guest_info *info;1766 struct kvmgt_guest_info *info;
1767 struct gvt_dma *entry;1767 struct gvt_dma *entry;
drivers/gpu/drm/i915/gvt/mmio.c+2−1
@@ -39,6 +39,7 @@ · 38 unmodified lines
39/**39/**
40 * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset40 * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
41 * @vgpu: a vGPU41 * @vgpu: a vGPU
42 * @gpa: guest physical address
42 *43 *
43 * Returns:44 * Returns:
44 * Zero on success, negative error code if failed45 * Zero on success, negative error code if failed
@@ -228,7 +229,7 @@ out: · 183 unmodified lines
228/**229/**
229 * intel_vgpu_reset_mmio - reset virtual MMIO space230 * intel_vgpu_reset_mmio - reset virtual MMIO space
230 * @vgpu: a vGPU231 * @vgpu: a vGPU
231 *232 * @dmlr: whether this is device model level reset
232 */233 */
233void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)234void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)
234{235{
drivers/gpu/drm/i915/gvt/mmio_context.c+0−13
@@ -37,19 +37,6 @@ · 36 unmodified lines
37#include "gvt.h"37#include "gvt.h"
38#include "trace.h"38#include "trace.h"
39 39
40/**
41 * Defined in Intel Open Source PRM.
42 * Ref: https://01.org/linuxgraphics/documentation/hardware-specification-prms
43 */
44#define TRVATTL3PTRDW(i) _MMIO(0x4de0 + (i)*4)
45#define TRNULLDETCT _MMIO(0x4de8)
46#define TRINVTILEDETCT _MMIO(0x4dec)
47#define TRVADR _MMIO(0x4df0)
48#define TRTTE _MMIO(0x4df4)
49#define RING_EXCC(base) _MMIO((base) + 0x28)
50#define RING_GFX_MODE(base) _MMIO((base) + 0x29c)
51#define VF_GUARDBAND _MMIO(0x83a4)
52
53#define GEN9_MOCS_SIZE 6440#define GEN9_MOCS_SIZE 64
54 41
55/* Raw offset is appened to each line for convenience. */42/* Raw offset is appened to each line for convenience. */
drivers/gpu/drm/i915/gvt/mmio_context.h+3−0
@@ -53,5 +53,8 @@ bool is_inhibit_context(struct intel_context *ce); · 52 unmodified lines
53 53
54int intel_vgpu_restore_inhibit_context(struct intel_vgpu *vgpu,54int intel_vgpu_restore_inhibit_context(struct intel_vgpu *vgpu,
55 struct i915_request *req);55 struct i915_request *req);
56#define IS_RESTORE_INHIBIT(a) \
57 (_MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT) == \
58 ((a) & _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT)))
56 59
57#endif60#endif
drivers/gpu/drm/i915/gvt/opregion.c+0−1
@@ -216,7 +216,6 @@ static void virt_vbt_generation(struct vbt *v) · 215 unmodified lines
216/**216/**
217 * intel_vgpu_init_opregion - initialize the stuff used to emulate opregion217 * intel_vgpu_init_opregion - initialize the stuff used to emulate opregion
218 * @vgpu: a vGPU218 * @vgpu: a vGPU
219 * @gpa: guest physical address of opregion
220 *219 *
221 * Returns:220 * Returns:
222 * Zero on success, negative error code if failed.221 * Zero on success, negative error code if failed.
drivers/gpu/drm/i915/gvt/page_track.c+2−0
@@ -41,6 +41,8 @@ struct intel_vgpu_page_track *intel_vgpu_find_page_track( · 40 unmodified lines
41 * intel_vgpu_register_page_track - register a guest page to be tacked41 * intel_vgpu_register_page_track - register a guest page to be tacked
42 * @vgpu: a vGPU42 * @vgpu: a vGPU
43 * @gfn: the gfn of guest page43 * @gfn: the gfn of guest page
44 * @handler: page track handler
45 * @priv: tracker private
44 *46 *
45 * Returns:47 * Returns:
46 * zero on success, negative error code if failed.48 * zero on success, negative error code if failed.
drivers/gpu/drm/i915/gvt/reg.h+18−0
@@ -77,4 +77,22 @@ · 76 unmodified lines
77#define _RING_CTL_BUF_SIZE(ctl) (((ctl) & RB_TAIL_SIZE_MASK) + \77#define _RING_CTL_BUF_SIZE(ctl) (((ctl) & RB_TAIL_SIZE_MASK) + \
78 I915_GTT_PAGE_SIZE)78 I915_GTT_PAGE_SIZE)
79 79
80#define PCH_GPIO_BASE _MMIO(0xc5010)
81
82#define PCH_GMBUS0 _MMIO(0xc5100)
83#define PCH_GMBUS1 _MMIO(0xc5104)
84#define PCH_GMBUS2 _MMIO(0xc5108)
85#define PCH_GMBUS3 _MMIO(0xc510c)
86#define PCH_GMBUS4 _MMIO(0xc5110)
87#define PCH_GMBUS5 _MMIO(0xc5120)
88
89#define TRVATTL3PTRDW(i) _MMIO(0x4de0 + (i) * 4)
90#define TRNULLDETCT _MMIO(0x4de8)
91#define TRINVTILEDETCT _MMIO(0x4dec)
92#define TRVADR _MMIO(0x4df0)
93#define TRTTE _MMIO(0x4df4)
94#define RING_EXCC(base) _MMIO((base) + 0x28)
95#define RING_GFX_MODE(base) _MMIO((base) + 0x29c)
96#define VF_GUARDBAND _MMIO(0x83a4)
97
80#endif98#endif
drivers/gpu/drm/i915/gvt/scheduler.c+34−30
@@ -132,35 +132,6 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) · 131 unmodified lines
132 unsigned long context_gpa, context_page_num;132 unsigned long context_gpa, context_page_num;
133 int i;133 int i;
134 134
135 gvt_dbg_sched("ring id %d workload lrca %x", ring_id,
136 workload->ctx_desc.lrca);
137
138 context_page_num = gvt->dev_priv->engine[ring_id]->context_size;
139
140 context_page_num = context_page_num >> PAGE_SHIFT;
141
142 if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS)
143 context_page_num = 19;
144
145 i = 2;
146
147 while (i < context_page_num) {
148 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
149 (u32)((workload->ctx_desc.lrca + i) <<
150 I915_GTT_PAGE_SHIFT));
151 if (context_gpa == INTEL_GVT_INVALID_ADDR) {
152 gvt_vgpu_err("Invalid guest context descriptor\n");
153 return -EFAULT;
154 }
155
156 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
157 dst = kmap(page);
158 intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
159 I915_GTT_PAGE_SIZE);
160 kunmap(page);
161 i++;
162 }
163
164 page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN);135 page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN);
165 shadow_ring_context = kmap(page);136 shadow_ring_context = kmap(page);
166 137
@@ -195,6 +166,37 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) · 28 unmodified lines
195 166
196 sr_oa_regs(workload, (u32 *)shadow_ring_context, false);167 sr_oa_regs(workload, (u32 *)shadow_ring_context, false);
197 kunmap(page);168 kunmap(page);
169
170 if (IS_RESTORE_INHIBIT(shadow_ring_context->ctx_ctrl.val))
171 return 0;
172
173 gvt_dbg_sched("ring id %d workload lrca %x", ring_id,
174 workload->ctx_desc.lrca);
175
176 context_page_num = gvt->dev_priv->engine[ring_id]->context_size;
177
178 context_page_num = context_page_num >> PAGE_SHIFT;
179
180 if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS)
181 context_page_num = 19;
182
183 i = 2;
184 while (i < context_page_num) {
185 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
186 (u32)((workload->ctx_desc.lrca + i) <<
187 I915_GTT_PAGE_SHIFT));
188 if (context_gpa == INTEL_GVT_INVALID_ADDR) {
189 gvt_vgpu_err("Invalid guest context descriptor\n");
190 return -EFAULT;
191 }
192
193 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
194 dst = kmap(page);
195 intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
196 I915_GTT_PAGE_SIZE);
197 kunmap(page);
198 i++;
199 }
198 return 0;200 return 0;
199}201}
200 202
@@ -1138,6 +1140,7 @@ out_shadow_ctx: · 937 unmodified lines
1138/**1140/**
1139 * intel_vgpu_select_submission_ops - select virtual submission interface1141 * intel_vgpu_select_submission_ops - select virtual submission interface
1140 * @vgpu: a vGPU1142 * @vgpu: a vGPU
1143 * @engine_mask: either ALL_ENGINES or target engine mask
1141 * @interface: expected vGPU virtual submission interface1144 * @interface: expected vGPU virtual submission interface
1142 *1145 *
1143 * This function is called when guest configures submission interface.1146 * This function is called when guest configures submission interface.
@@ -1190,7 +1193,7 @@ int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu, · 46 unmodified lines
1190 1193
1191/**1194/**
1192 * intel_vgpu_destroy_workload - destroy a vGPU workload1195 * intel_vgpu_destroy_workload - destroy a vGPU workload
1193 * @vgpu: a vGPU1196 * @workload: workload to destroy
1194 *1197 *
1195 * This function is called when destroy a vGPU workload.1198 * This function is called when destroy a vGPU workload.
1196 *1199 *
@@ -1282,6 +1285,7 @@ static int prepare_mm(struct intel_vgpu_workload *workload) · 85 unmodified lines
1282/**1285/**
1283 * intel_vgpu_create_workload - create a vGPU workload1286 * intel_vgpu_create_workload - create a vGPU workload
1284 * @vgpu: a vGPU1287 * @vgpu: a vGPU
1288 * @ring_id: ring index
1285 * @desc: a guest context descriptor1289 * @desc: a guest context descriptor
1286 *1290 *
1287 * This function is called when creating a vGPU workload.1291 * This function is called when creating a vGPU workload.
drivers/gpu/drm/i915/i915_debugfs.c+64−24
@@ -1953,7 +1953,10 @@ static int i915_context_status(struct seq_file *m, void *unused) · 1952 unmodified lines
1953 return ret;1953 return ret;
1954 1954
1955 list_for_each_entry(ctx, &dev_priv->contexts.list, link) {1955 list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
1956 seq_printf(m, "HW context %u ", ctx->hw_id);1956 seq_puts(m, "HW context ");
1957 if (!list_empty(&ctx->hw_id_link))
1958 seq_printf(m, "%x [pin %u]", ctx->hw_id,
1959 atomic_read(&ctx->hw_id_pin_count));
1957 if (ctx->pid) {1960 if (ctx->pid) {
1958 struct task_struct *task;1961 struct task_struct *task;
1959 1962
@@ -2708,7 +2711,9 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) · 748 unmodified lines
2708 intel_runtime_pm_get(dev_priv);2711 intel_runtime_pm_get(dev_priv);
2709 2712
2710 mutex_lock(&dev_priv->psr.lock);2713 mutex_lock(&dev_priv->psr.lock);
2711 seq_printf(m, "Enabled: %s\n", yesno((bool)dev_priv->psr.enabled));2714 seq_printf(m, "PSR mode: %s\n",
2715 dev_priv->psr.psr2_enabled ? "PSR2" : "PSR1");
2716 seq_printf(m, "Enabled: %s\n", yesno(dev_priv->psr.enabled));
2712 seq_printf(m, "Busy frontbuffer bits: 0x%03x\n",2717 seq_printf(m, "Busy frontbuffer bits: 0x%03x\n",
2713 dev_priv->psr.busy_frontbuffer_bits);2718 dev_priv->psr.busy_frontbuffer_bits);
2714 2719
@@ -2735,7 +2740,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) · 20 unmodified lines
2735 psr_source_status(dev_priv, m);2740 psr_source_status(dev_priv, m);
2736 mutex_unlock(&dev_priv->psr.lock);2741 mutex_unlock(&dev_priv->psr.lock);
2737 2742
2738 if (READ_ONCE(dev_priv->psr.debug)) {2743 if (READ_ONCE(dev_priv->psr.debug) & I915_PSR_DEBUG_IRQ) {
2739 seq_printf(m, "Last attempted entry at: %lld\n",2744 seq_printf(m, "Last attempted entry at: %lld\n",
2740 dev_priv->psr.last_entry_attempt);2745 dev_priv->psr.last_entry_attempt);
2741 seq_printf(m, "Last exit at: %lld\n",2746 seq_printf(m, "Last exit at: %lld\n",
@@ -2750,17 +2755,32 @@ static int · 8 unmodified lines
2750i915_edp_psr_debug_set(void *data, u64 val)2755i915_edp_psr_debug_set(void *data, u64 val)
2751{2756{
2752 struct drm_i915_private *dev_priv = data;2757 struct drm_i915_private *dev_priv = data;
2758 struct drm_modeset_acquire_ctx ctx;
2759 int ret;
2753 2760
2754 if (!CAN_PSR(dev_priv))2761 if (!CAN_PSR(dev_priv))
2755 return -ENODEV;2762 return -ENODEV;
2756 2763
2757 DRM_DEBUG_KMS("PSR debug %s\n", enableddisabled(val));2764 DRM_DEBUG_KMS("Setting PSR debug to %llx\n", val);
2758 2765
2759 intel_runtime_pm_get(dev_priv);2766 intel_runtime_pm_get(dev_priv);
2760 intel_psr_irq_control(dev_priv, !!val);2767
2768 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
2769
2770retry:
2771 ret = intel_psr_set_debugfs_mode(dev_priv, &ctx, val);
2772 if (ret == -EDEADLK) {
2773 ret = drm_modeset_backoff(&ctx);
2774 if (!ret)
2775 goto retry;
2776 }
2777
2778 drm_modeset_drop_locks(&ctx);
2779 drm_modeset_acquire_fini(&ctx);
2780
2761 intel_runtime_pm_put(dev_priv);2781 intel_runtime_pm_put(dev_priv);
2762 2782
2763 return 0;2783 return ret;
2764}2784}
2765 2785
2766static int2786static int
@@ -2845,10 +2865,10 @@ static int i915_power_domain_info(struct seq_file *m, void *unused) · 78 unmodified lines
2845 enum intel_display_power_domain power_domain;2865 enum intel_display_power_domain power_domain;
2846 2866
2847 power_well = &power_domains->power_wells[i];2867 power_well = &power_domains->power_wells[i];
2848 seq_printf(m, "%-25s %d\n", power_well->name,2868 seq_printf(m, "%-25s %d\n", power_well->desc->name,
2849 power_well->count);2869 power_well->count);
2850 2870
2851 for_each_power_domain(power_domain, power_well->domains)2871 for_each_power_domain(power_domain, power_well->desc->domains)
2852 seq_printf(m, " %-23s %d\n",2872 seq_printf(m, " %-23s %d\n",
2853 intel_display_power_domain_str(power_domain),2873 intel_display_power_domain_str(power_domain),
2854 power_domains->domain_use_count[power_domain]);2874 power_domains->domain_use_count[power_domain]);
@@ -4114,13 +4134,17 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_ring_test_irq_fops, · 1259 unmodified lines
4114#define DROP_FREED BIT(4)4134#define DROP_FREED BIT(4)
4115#define DROP_SHRINK_ALL BIT(5)4135#define DROP_SHRINK_ALL BIT(5)
4116#define DROP_IDLE BIT(6)4136#define DROP_IDLE BIT(6)
4137#define DROP_RESET_ACTIVE BIT(7)
4138#define DROP_RESET_SEQNO BIT(8)
4117#define DROP_ALL (DROP_UNBOUND | \4139#define DROP_ALL (DROP_UNBOUND | \
4118 DROP_BOUND | \4140 DROP_BOUND | \
4119 DROP_RETIRE | \4141 DROP_RETIRE | \
4120 DROP_ACTIVE | \4142 DROP_ACTIVE | \
4121 DROP_FREED | \4143 DROP_FREED | \
4122 DROP_SHRINK_ALL |\4144 DROP_SHRINK_ALL |\
4123 DROP_IDLE)4145 DROP_IDLE | \
4146 DROP_RESET_ACTIVE | \
4147 DROP_RESET_SEQNO)
4124static int4148static int
4125i915_drop_caches_get(void *data, u64 *val)4149i915_drop_caches_get(void *data, u64 *val)
4126{4150{
@@ -4132,53 +4156,69 @@ i915_drop_caches_get(void *data, u64 *val) · 5 unmodified lines
4132static int4156static int
4133i915_drop_caches_set(void *data, u64 val)4157i915_drop_caches_set(void *data, u64 val)
4134{4158{
4135 struct drm_i915_private *dev_priv = data;4159 struct drm_i915_private *i915 = data;
4136 struct drm_device *dev = &dev_priv->drm;
4137 int ret = 0;4160 int ret = 0;
4138 4161
4139 DRM_DEBUG("Dropping caches: 0x%08llx [0x%08llx]\n",4162 DRM_DEBUG("Dropping caches: 0x%08llx [0x%08llx]\n",
4140 val, val & DROP_ALL);4163 val, val & DROP_ALL);
4141 4164
4165 if (val & DROP_RESET_ACTIVE && !intel_engines_are_idle(i915))
4166 i915_gem_set_wedged(i915);
4167
4142 /* No need to check and wait for gpu resets, only libdrm auto-restarts4168 /* No need to check and wait for gpu resets, only libdrm auto-restarts
4143 * on ioctls on -EAGAIN. */4169 * on ioctls on -EAGAIN. */
4144 if (val & (DROP_ACTIVE | DROP_RETIRE)) {4170 if (val & (DROP_ACTIVE | DROP_RETIRE | DROP_RESET_SEQNO)) {
4145 ret = mutex_lock_interruptible(&dev->struct_mutex);4171 ret = mutex_lock_interruptible(&i915->drm.struct_mutex);
4146 if (ret)4172 if (ret)
4147 return ret;4173 return ret;
4148 4174
4149 if (val & DROP_ACTIVE)4175 if (val & DROP_ACTIVE)
4150 ret = i915_gem_wait_for_idle(dev_priv,4176 ret = i915_gem_wait_for_idle(i915,
4151 I915_WAIT_INTERRUPTIBLE |4177 I915_WAIT_INTERRUPTIBLE |
4152 I915_WAIT_LOCKED,4178 I915_WAIT_LOCKED,
4153 MAX_SCHEDULE_TIMEOUT);4179 MAX_SCHEDULE_TIMEOUT);
4154 4180
4181 if (val & DROP_RESET_SEQNO) {
4182 intel_runtime_pm_get(i915);
4183 ret = i915_gem_set_global_seqno(&i915->drm, 1);
4184 intel_runtime_pm_put(i915);
4185 }
4186
4155 if (val & DROP_RETIRE)4187 if (val & DROP_RETIRE)
4156 i915_retire_requests(dev_priv);4188 i915_retire_requests(i915);
4157 4189
4158 mutex_unlock(&dev->struct_mutex);4190 mutex_unlock(&i915->drm.struct_mutex);
4191 }
4192
4193 if (val & DROP_RESET_ACTIVE &&
4194 i915_terminally_wedged(&i915->gpu_error)) {
4195 i915_handle_error(i915, ALL_ENGINES, 0, NULL);
4196 wait_on_bit(&i915->gpu_error.flags,
4197 I915_RESET_HANDOFF,
4198 TASK_UNINTERRUPTIBLE);
4159 }4199 }
4160 4200
4161 fs_reclaim_acquire(GFP_KERNEL);4201 fs_reclaim_acquire(GFP_KERNEL);
4162 if (val & DROP_BOUND)4202 if (val & DROP_BOUND)
4163 i915_gem_shrink(dev_priv, LONG_MAX, NULL, I915_SHRINK_BOUND);4203 i915_gem_shrink(i915, LONG_MAX, NULL, I915_SHRINK_BOUND);
4164 4204
4165 if (val & DROP_UNBOUND)4205 if (val & DROP_UNBOUND)
4166 i915_gem_shrink(dev_priv, LONG_MAX, NULL, I915_SHRINK_UNBOUND);4206 i915_gem_shrink(i915, LONG_MAX, NULL, I915_SHRINK_UNBOUND);
4167 4207
4168 if (val & DROP_SHRINK_ALL)4208 if (val & DROP_SHRINK_ALL)
4169 i915_gem_shrink_all(dev_priv);4209 i915_gem_shrink_all(i915);
4170 fs_reclaim_release(GFP_KERNEL);4210 fs_reclaim_release(GFP_KERNEL);
4171 4211
4172 if (val & DROP_IDLE) {4212 if (val & DROP_IDLE) {
4173 do {4213 do {
4174 if (READ_ONCE(dev_priv->gt.active_requests))4214 if (READ_ONCE(i915->gt.active_requests))
4175 flush_delayed_work(&dev_priv->gt.retire_work);4215 flush_delayed_work(&i915->gt.retire_work);
4176 drain_delayed_work(&dev_priv->gt.idle_work);4216 drain_delayed_work(&i915->gt.idle_work);
4177 } while (READ_ONCE(dev_priv->gt.awake));4217 } while (READ_ONCE(i915->gt.awake));
4178 }4218 }
4179 4219
4180 if (val & DROP_FREED)4220 if (val & DROP_FREED)
4181 i915_gem_drain_freed_objects(dev_priv);4221 i915_gem_drain_freed_objects(i915);
4182 4222
4183 return ret;4223 return ret;
4184}4224}
drivers/gpu/drm/i915/i915_drv.c+104−90
@@ -373,7 +373,7 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data, · 372 unmodified lines
373 value = 2;373 value = 2;
374 break;374 break;
375 case I915_PARAM_HAS_RESOURCE_STREAMER:375 case I915_PARAM_HAS_RESOURCE_STREAMER:
376 value = HAS_RESOURCE_STREAMER(dev_priv);376 value = 0;
377 break;377 break;
378 case I915_PARAM_HAS_POOLED_EU:378 case I915_PARAM_HAS_POOLED_EU:
379 value = HAS_POOLED_EU(dev_priv);379 value = HAS_POOLED_EU(dev_priv);
@@ -441,6 +441,9 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data, · 61 unmodified lines
441 case I915_PARAM_CS_TIMESTAMP_FREQUENCY:441 case I915_PARAM_CS_TIMESTAMP_FREQUENCY:
442 value = 1000 * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz;442 value = 1000 * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz;
443 break;443 break;
444 case I915_PARAM_MMAP_GTT_COHERENT:
445 value = INTEL_INFO(dev_priv)->has_coherent_ggtt;
446 break;
444 default:447 default:
445 DRM_DEBUG("Unknown parameter %d\n", param->param);448 DRM_DEBUG("Unknown parameter %d\n", param->param);
446 return -EINVAL;449 return -EINVAL;
@@ -709,7 +712,7 @@ cleanup_irq: · 262 unmodified lines
709 intel_teardown_gmbus(dev_priv);712 intel_teardown_gmbus(dev_priv);
710cleanup_csr:713cleanup_csr:
711 intel_csr_ucode_fini(dev_priv);714 intel_csr_ucode_fini(dev_priv);
712 intel_power_domains_fini(dev_priv);715 intel_power_domains_fini_hw(dev_priv);
713 vga_switcheroo_unregister_client(pdev);716 vga_switcheroo_unregister_client(pdev);
714cleanup_vga_client:717cleanup_vga_client:
715 vga_client_register(pdev, NULL, NULL, NULL);718 vga_client_register(pdev, NULL, NULL, NULL);
@@ -867,7 +870,6 @@ static void intel_detect_preproduction_hw(struct drm_i915_private *dev_priv) · 151 unmodified lines
867/**870/**
868 * i915_driver_init_early - setup state not requiring device access871 * i915_driver_init_early - setup state not requiring device access
869 * @dev_priv: device private872 * @dev_priv: device private
870 * @ent: the matching pci_device_id
871 *873 *
872 * Initialize everything that is a "SW-only" state, that is state not874 * Initialize everything that is a "SW-only" state, that is state not
873 * requiring accessing the device or exposing the driver via kernel internal875 * requiring accessing the device or exposing the driver via kernel internal
@@ -875,25 +877,13 @@ static void intel_detect_preproduction_hw(struct drm_i915_private *dev_priv) · 1 unmodified line
875 * system memory allocation, setting up device specific attributes and877 * system memory allocation, setting up device specific attributes and
876 * function hooks not requiring accessing the device.878 * function hooks not requiring accessing the device.
877 */879 */
878static int i915_driver_init_early(struct drm_i915_private *dev_priv,880static int i915_driver_init_early(struct drm_i915_private *dev_priv)
879 const struct pci_device_id *ent)
880{881{
881 const struct intel_device_info *match_info =
882 (struct intel_device_info *)ent->driver_data;
883 struct intel_device_info *device_info;
884 int ret = 0;882 int ret = 0;
885 883
886 if (i915_inject_load_failure())884 if (i915_inject_load_failure())
887 return -ENODEV;885 return -ENODEV;
888 886
889 /* Setup the write-once "constant" device info */
890 device_info = mkwrite_device_info(dev_priv);
891 memcpy(device_info, match_info, sizeof(*device_info));
892 device_info->device_id = dev_priv->drm.pdev->device;
893
894 BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
895 sizeof(device_info->platform_mask) * BITS_PER_BYTE);
896 BUG_ON(device_info->gen > sizeof(device_info->gen_mask) * BITS_PER_BYTE);
897 spin_lock_init(&dev_priv->irq_lock);887 spin_lock_init(&dev_priv->irq_lock);
898 spin_lock_init(&dev_priv->gpu_error.lock);888 spin_lock_init(&dev_priv->gpu_error.lock);
899 mutex_init(&dev_priv->backlight_lock);889 mutex_init(&dev_priv->backlight_lock);
@@ -921,7 +911,9 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv, · 21 unmodified lines
921 intel_uc_init_early(dev_priv);911 intel_uc_init_early(dev_priv);
922 intel_pm_setup(dev_priv);912 intel_pm_setup(dev_priv);
923 intel_init_dpio(dev_priv);913 intel_init_dpio(dev_priv);
924 intel_power_domains_init(dev_priv);914 ret = intel_power_domains_init(dev_priv);
915 if (ret < 0)
916 goto err_uc;
925 intel_irq_init(dev_priv);917 intel_irq_init(dev_priv);
926 intel_hangcheck_init(dev_priv);918 intel_hangcheck_init(dev_priv);
927 intel_init_display_hooks(dev_priv);919 intel_init_display_hooks(dev_priv);
@@ -933,6 +925,9 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv, · 5 unmodified lines
933 925
934 return 0;926 return 0;
935 927
928err_uc:
929 intel_uc_cleanup_early(dev_priv);
930 i915_gem_cleanup_early(dev_priv);
936err_workqueues:931err_workqueues:
937 i915_workqueues_cleanup(dev_priv);932 i915_workqueues_cleanup(dev_priv);
938err_engines:933err_engines:
@@ -947,6 +942,7 @@ err_engines: · 8 unmodified lines
947static void i915_driver_cleanup_early(struct drm_i915_private *dev_priv)942static void i915_driver_cleanup_early(struct drm_i915_private *dev_priv)
948{943{
949 intel_irq_fini(dev_priv);944 intel_irq_fini(dev_priv);
945 intel_power_domains_cleanup(dev_priv);
950 intel_uc_cleanup_early(dev_priv);946 intel_uc_cleanup_early(dev_priv);
951 i915_gem_cleanup_early(dev_priv);947 i915_gem_cleanup_early(dev_priv);
952 i915_workqueues_cleanup(dev_priv);948 i915_workqueues_cleanup(dev_priv);
@@ -1272,6 +1268,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) · 319 unmodified lines
1272 */1268 */
1273 if (INTEL_INFO(dev_priv)->num_pipes)1269 if (INTEL_INFO(dev_priv)->num_pipes)
1274 drm_kms_helper_poll_init(dev);1270 drm_kms_helper_poll_init(dev);
1271
1272 intel_power_domains_enable(dev_priv);
1273 intel_runtime_pm_enable(dev_priv);
1275}1274}
1276 1275
1277/**1276/**
@@ -1280,6 +1279,9 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) · 2 unmodified lines
1280 */1279 */
1281static void i915_driver_unregister(struct drm_i915_private *dev_priv)1280static void i915_driver_unregister(struct drm_i915_private *dev_priv)
1282{1281{
1282 intel_runtime_pm_disable(dev_priv);
1283 intel_power_domains_disable(dev_priv);
1284
1283 intel_fbdev_unregister(dev_priv);1285 intel_fbdev_unregister(dev_priv);
1284 intel_audio_deinit(dev_priv);1286 intel_audio_deinit(dev_priv);
1285 1287
@@ -1316,6 +1318,52 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv) · 30 unmodified lines
1316 DRM_INFO("DRM_I915_DEBUG enabled\n");1318 DRM_INFO("DRM_I915_DEBUG enabled\n");
1317 if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))1319 if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
1318 DRM_INFO("DRM_I915_DEBUG_GEM enabled\n");1320 DRM_INFO("DRM_I915_DEBUG_GEM enabled\n");
1321 if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM))
1322 DRM_INFO("DRM_I915_DEBUG_RUNTIME_PM enabled\n");
1323}
1324
1325static struct drm_i915_private *
1326i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
1327{
1328 const struct intel_device_info *match_info =
1329 (struct intel_device_info *)ent->driver_data;
1330 struct intel_device_info *device_info;
1331 struct drm_i915_private *i915;
1332
1333 i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
1334 if (!i915)
1335 return NULL;
1336
1337 if (drm_dev_init(&i915->drm, &driver, &pdev->dev)) {
1338 kfree(i915);
1339 return NULL;
1340 }
1341
1342 i915->drm.pdev = pdev;
1343 i915->drm.dev_private = i915;
1344 pci_set_drvdata(pdev, &i915->drm);
1345
1346 /* Setup the write-once "constant" device info */
1347 device_info = mkwrite_device_info(i915);
1348 memcpy(device_info, match_info, sizeof(*device_info));
1349 device_info->device_id = pdev->device;
1350
1351 BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
1352 sizeof(device_info->platform_mask) * BITS_PER_BYTE);
1353 BUG_ON(device_info->gen > sizeof(device_info->gen_mask) * BITS_PER_BYTE);
1354
1355 return i915;
1356}
1357
1358static void i915_driver_destroy(struct drm_i915_private *i915)
1359{
1360 struct pci_dev *pdev = i915->drm.pdev;
1361
1362 drm_dev_fini(&i915->drm);
1363 kfree(i915);
1364
1365 /* And make sure we never chase our dangling pointer from pci_dev */
1366 pci_set_drvdata(pdev, NULL);
1319}1367}
1320 1368
1321/**1369/**
@@ -1340,38 +1388,19 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) · 18 unmodified lines
1340 if (!i915_modparams.nuclear_pageflip && match_info->gen < 5)1388 if (!i915_modparams.nuclear_pageflip && match_info->gen < 5)
1341 driver.driver_features &= ~DRIVER_ATOMIC;1389 driver.driver_features &= ~DRIVER_ATOMIC;
1342 1390
1343 ret = -ENOMEM;1391 dev_priv = i915_driver_create(pdev, ent);
1344 dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);1392 if (!dev_priv)
1345 if (dev_priv)1393 return -ENOMEM;
1346 ret = drm_dev_init(&dev_priv->drm, &driver, &pdev->dev);
1347 if (ret) {
1348 DRM_DEV_ERROR(&pdev->dev, "allocation failed\n");
1349 goto out_free;
1350 }
1351
1352 dev_priv->drm.pdev = pdev;
1353 dev_priv->drm.dev_private = dev_priv;
1354 1394
1355 ret = pci_enable_device(pdev);1395 ret = pci_enable_device(pdev);
1356 if (ret)1396 if (ret)
1357 goto out_fini;1397 goto out_fini;
1358 1398
1359 pci_set_drvdata(pdev, &dev_priv->drm);1399 ret = i915_driver_init_early(dev_priv);
1360 /*
1361 * Disable the system suspend direct complete optimization, which can
1362 * leave the device suspended skipping the driver's suspend handlers
1363 * if the device was already runtime suspended. This is needed due to
1364 * the difference in our runtime and system suspend sequence and
1365 * becaue the HDA driver may require us to enable the audio power
1366 * domain during system suspend.
1367 */
1368 dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP);
1369
1370 ret = i915_driver_init_early(dev_priv, ent);
1371 if (ret < 0)1400 if (ret < 0)
1372 goto out_pci_disable;1401 goto out_pci_disable;
1373 1402
1374 intel_runtime_pm_get(dev_priv);1403 disable_rpm_wakeref_asserts(dev_priv);
1375 1404
1376 ret = i915_driver_init_mmio(dev_priv);1405 ret = i915_driver_init_mmio(dev_priv);
1377 if (ret < 0)1406 if (ret < 0)
@@ -1399,11 +1428,9 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) · 21 unmodified lines
1399 1428
1400 i915_driver_register(dev_priv);1429 i915_driver_register(dev_priv);
1401 1430
1402 intel_runtime_pm_enable(dev_priv);
1403
1404 intel_init_ipc(dev_priv);1431 intel_init_ipc(dev_priv);
1405 1432
1406 intel_runtime_pm_put(dev_priv);1433 enable_rpm_wakeref_asserts(dev_priv);
1407 1434
1408 i915_welcome_messages(dev_priv);1435 i915_welcome_messages(dev_priv);
1409 1436
@@ -1414,16 +1441,13 @@ out_cleanup_hw: · 4 unmodified lines
1414out_cleanup_mmio:1441out_cleanup_mmio:
1415 i915_driver_cleanup_mmio(dev_priv);1442 i915_driver_cleanup_mmio(dev_priv);
1416out_runtime_pm_put:1443out_runtime_pm_put:
1417 intel_runtime_pm_put(dev_priv);1444 enable_rpm_wakeref_asserts(dev_priv);
1418 i915_driver_cleanup_early(dev_priv);1445 i915_driver_cleanup_early(dev_priv);
1419out_pci_disable:1446out_pci_disable:
1420 pci_disable_device(pdev);1447 pci_disable_device(pdev);
1421out_fini:1448out_fini:
1422 i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);1449 i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
1423 drm_dev_fini(&dev_priv->drm);1450 i915_driver_destroy(dev_priv);
1424out_free:
1425 kfree(dev_priv);
1426 pci_set_drvdata(pdev, NULL);
1427 return ret;1451 return ret;
1428}1452}
1429 1453
@@ -1432,13 +1456,13 @@ void i915_driver_unload(struct drm_device *dev) · 2 unmodified lines
1432 struct drm_i915_private *dev_priv = to_i915(dev);1456 struct drm_i915_private *dev_priv = to_i915(dev);
1433 struct pci_dev *pdev = dev_priv->drm.pdev;1457 struct pci_dev *pdev = dev_priv->drm.pdev;
1434 1458
1459 disable_rpm_wakeref_asserts(dev_priv);
1460
1435 i915_driver_unregister(dev_priv);1461 i915_driver_unregister(dev_priv);
1436 1462
1437 if (i915_gem_suspend(dev_priv))1463 if (i915_gem_suspend(dev_priv))
1438 DRM_ERROR("failed to idle hardware; continuing to unload!\n");1464 DRM_ERROR("failed to idle hardware; continuing to unload!\n");
1439 1465
1440 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
1441
1442 drm_atomic_helper_shutdown(dev);1466 drm_atomic_helper_shutdown(dev);
1443 1467
1444 intel_gvt_cleanup(dev_priv);1468 intel_gvt_cleanup(dev_priv);
@@ -1459,12 +1483,14 @@ void i915_driver_unload(struct drm_device *dev) · 14 unmodified lines
1459 i915_gem_fini(dev_priv);1483 i915_gem_fini(dev_priv);
1460 intel_fbc_cleanup_cfb(dev_priv);1484 intel_fbc_cleanup_cfb(dev_priv);
1461 1485
1462 intel_power_domains_fini(dev_priv);1486 intel_power_domains_fini_hw(dev_priv);
1463 1487
1464 i915_driver_cleanup_hw(dev_priv);1488 i915_driver_cleanup_hw(dev_priv);
1465 i915_driver_cleanup_mmio(dev_priv);1489 i915_driver_cleanup_mmio(dev_priv);
1466 1490
1467 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);1491 enable_rpm_wakeref_asserts(dev_priv);
1492
1493 WARN_ON(atomic_read(&dev_priv->runtime_pm.wakeref_count));
1468}1494}
1469 1495
1470static void i915_driver_release(struct drm_device *dev)1496static void i915_driver_release(struct drm_device *dev)
@@ -1472,9 +1498,7 @@ static void i915_driver_release(struct drm_device *dev) · 1 unmodified line
1472 struct drm_i915_private *dev_priv = to_i915(dev);1498 struct drm_i915_private *dev_priv = to_i915(dev);
1473 1499
1474 i915_driver_cleanup_early(dev_priv);1500 i915_driver_cleanup_early(dev_priv);
1475 drm_dev_fini(&dev_priv->drm);1501 i915_driver_destroy(dev_priv);
1476
1477 kfree(dev_priv);
1478}1502}
1479 1503
1480static int i915_driver_open(struct drm_device *dev, struct drm_file *file)1504static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
@@ -1573,7 +1597,7 @@ static int i915_drm_suspend(struct drm_device *dev) · 92 unmodified lines
1573 1597
1574 /* We do a lot of poking in a lot of registers, make sure they work1598 /* We do a lot of poking in a lot of registers, make sure they work
1575 * properly. */1599 * properly. */
1576 intel_display_set_init_power(dev_priv, true);1600 intel_power_domains_disable(dev_priv);
1577 1601
1578 drm_kms_helper_poll_disable(dev);1602 drm_kms_helper_poll_disable(dev);
1579 1603
@@ -1610,6 +1634,18 @@ static int i915_drm_suspend(struct drm_device *dev) · 30 unmodified lines
1610 return 0;1634 return 0;
1611}1635}
1612 1636
1637static enum i915_drm_suspend_mode
1638get_suspend_mode(struct drm_i915_private *dev_priv, bool hibernate)
1639{
1640 if (hibernate)
1641 return I915_DRM_SUSPEND_HIBERNATE;
1642
1643 if (suspend_to_idle(dev_priv))
1644 return I915_DRM_SUSPEND_IDLE;
1645
1646 return I915_DRM_SUSPEND_MEM;
1647}
1648
1613static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)1649static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1614{1650{
1615 struct drm_i915_private *dev_priv = to_i915(dev);1651 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -1620,21 +1656,10 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation) · 4 unmodified lines
1620 1656
1621 i915_gem_suspend_late(dev_priv);1657 i915_gem_suspend_late(dev_priv);
1622 1658
1623 intel_display_set_init_power(dev_priv, false);
1624 intel_uncore_suspend(dev_priv);1659 intel_uncore_suspend(dev_priv);
1625 1660
1626 /*1661 intel_power_domains_suspend(dev_priv,
1627 * In case of firmware assisted context save/restore don't manually1662 get_suspend_mode(dev_priv, hibernation));
1628 * deinit the power domains. This also means the CSR/DMC firmware will
1629 * stay active, it will power down any HW resources as required and
1630 * also enable deeper system power states that would be blocked if the
1631 * firmware was inactive.
1632 */
1633 if (IS_GEN9_LP(dev_priv) || hibernation || !suspend_to_idle(dev_priv) ||
1634 dev_priv->csr.dmc_payload == NULL) {
1635 intel_power_domains_suspend(dev_priv);
1636 dev_priv->power_domains_suspended = true;
1637 }
1638 1663
1639 ret = 0;1664 ret = 0;
1640 if (IS_GEN9_LP(dev_priv))1665 if (IS_GEN9_LP(dev_priv))
@@ -1646,10 +1671,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation) · 5 unmodified lines
1646 1671
1647 if (ret) {1672 if (ret) {
1648 DRM_ERROR("Suspend complete failed: %d\n", ret);1673 DRM_ERROR("Suspend complete failed: %d\n", ret);
1649 if (dev_priv->power_domains_suspended) {1674 intel_power_domains_resume(dev_priv);
1650 intel_power_domains_init_hw(dev_priv, true);
1651 dev_priv->power_domains_suspended = false;
1652 }
1653 1675
1654 goto out;1676 goto out;
1655 }1677 }
@@ -1755,7 +1777,7 @@ static int i915_drm_resume(struct drm_device *dev) · 99 unmodified lines
1755 /*1777 /*
1756 * ... but also need to make sure that hotplug processing1778 * ... but also need to make sure that hotplug processing
1757 * doesn't cause havoc. Like in the driver load code we don't1779 * doesn't cause havoc. Like in the driver load code we don't
1758 * bother with the tiny race here where we might loose hotplug1780 * bother with the tiny race here where we might lose hotplug
1759 * notifications.1781 * notifications.
1760 * */1782 * */
1761 intel_hpd_init(dev_priv);1783 intel_hpd_init(dev_priv);
@@ -1766,6 +1788,8 @@ static int i915_drm_resume(struct drm_device *dev) · 4 unmodified lines
1766 1788
1767 intel_opregion_notify_adapter(dev_priv, PCI_D0);1789 intel_opregion_notify_adapter(dev_priv, PCI_D0);
1768 1790
1791 intel_power_domains_enable(dev_priv);
1792
1769 enable_rpm_wakeref_asserts(dev_priv);1793 enable_rpm_wakeref_asserts(dev_priv);
1770 1794
1771 return 0;1795 return 0;
@@ -1800,7 +1824,7 @@ static int i915_drm_resume_early(struct drm_device *dev) · 28 unmodified lines
1800 ret = pci_set_power_state(pdev, PCI_D0);1824 ret = pci_set_power_state(pdev, PCI_D0);
1801 if (ret) {1825 if (ret) {
1802 DRM_ERROR("failed to set PCI D0 power state (%d)\n", ret);1826 DRM_ERROR("failed to set PCI D0 power state (%d)\n", ret);
1803 goto out;1827 return ret;
1804 }1828 }
1805 1829
1806 /*1830 /*
@@ -1816,10 +1840,8 @@ static int i915_drm_resume_early(struct drm_device *dev) · 9 unmodified lines
1816 * depend on the device enable refcount we can't anyway depend on them1840 * depend on the device enable refcount we can't anyway depend on them
1817 * disabling/enabling the device.1841 * disabling/enabling the device.
1818 */1842 */
1819 if (pci_enable_device(pdev)) {1843 if (pci_enable_device(pdev))
1820 ret = -EIO;1844 return -EIO;
1821 goto out;
1822 }
1823 1845
1824 pci_set_master(pdev);1846 pci_set_master(pdev);
1825 1847
@@ -1842,18 +1864,12 @@ static int i915_drm_resume_early(struct drm_device *dev) · 16 unmodified lines
1842 1864
1843 intel_uncore_sanitize(dev_priv);1865 intel_uncore_sanitize(dev_priv);
1844 1866
1845 if (dev_priv->power_domains_suspended)1867 intel_power_domains_resume(dev_priv);
1846 intel_power_domains_init_hw(dev_priv, true);
1847 else
1848 intel_display_set_init_power(dev_priv, true);
1849 1868
1850 intel_engines_sanitize(dev_priv);1869 intel_engines_sanitize(dev_priv);
1851 1870
1852 enable_rpm_wakeref_asserts(dev_priv);1871 enable_rpm_wakeref_asserts(dev_priv);
1853 1872
1854out:
1855 dev_priv->power_domains_suspended = false;
1856
1857 return ret;1873 return ret;
1858}1874}
1859 1875
@@ -1915,7 +1931,6 @@ void i915_reset(struct drm_i915_private *i915, · 55 unmodified lines
1915 dev_notice(i915->drm.dev, "Resetting chip for %s\n", reason);1931 dev_notice(i915->drm.dev, "Resetting chip for %s\n", reason);
1916 error->reset_count++;1932 error->reset_count++;
1917 1933
1918 disable_irq(i915->drm.irq);
1919 ret = i915_gem_reset_prepare(i915);1934 ret = i915_gem_reset_prepare(i915);
1920 if (ret) {1935 if (ret) {
1921 dev_err(i915->drm.dev, "GPU recovery failed\n");1936 dev_err(i915->drm.dev, "GPU recovery failed\n");
@@ -1977,8 +1992,6 @@ void i915_reset(struct drm_i915_private *i915, · 55 unmodified lines
1977 1992
1978finish:1993finish:
1979 i915_gem_reset_finish(i915);1994 i915_gem_reset_finish(i915);
1980 enable_irq(i915->drm.irq);
1981
1982wakeup:1995wakeup:
1983 clear_bit(I915_RESET_HANDOFF, &error->flags);1996 clear_bit(I915_RESET_HANDOFF, &error->flags);
1984 wake_up_bit(&error->flags, I915_RESET_HANDOFF);1997 wake_up_bit(&error->flags, I915_RESET_HANDOFF);
@@ -2073,6 +2086,7 @@ int i915_reset_engine(struct intel_engine_cs *engine, const char *msg) · 88 unmodified lines
2073 goto out;2086 goto out;
2074 2087
2075out:2088out:
2089 intel_engine_cancel_stop_cs(engine);
2076 i915_gem_reset_finish_engine(engine);2090 i915_gem_reset_finish_engine(engine);
2077 return ret;2091 return ret;
2078}2092}
drivers/gpu/drm/i915/i915_drv.h+49−14
@@ -86,8 +86,8 @@ · 85 unmodified lines
86 86
87#define DRIVER_NAME "i915"87#define DRIVER_NAME "i915"
88#define DRIVER_DESC "Intel Graphics"88#define DRIVER_DESC "Intel Graphics"
89#define DRIVER_DATE "20180719"89#define DRIVER_DATE "20180906"
90#define DRIVER_TIMESTAMP 153201527990#define DRIVER_TIMESTAMP 1536242083
91 91
92/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and92/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and
93 * WARN_ON()) for hw state sanity checks to check for unexpected conditions93 * WARN_ON()) for hw state sanity checks to check for unexpected conditions
@@ -611,8 +611,18 @@ struct i915_drrs { · 517 unmodified lines
611 611
612struct i915_psr {612struct i915_psr {
613 struct mutex lock;613 struct mutex lock;
614
615#define I915_PSR_DEBUG_MODE_MASK 0x0f
616#define I915_PSR_DEBUG_DEFAULT 0x00
617#define I915_PSR_DEBUG_DISABLE 0x01
618#define I915_PSR_DEBUG_ENABLE 0x02
619#define I915_PSR_DEBUG_FORCE_PSR1 0x03
620#define I915_PSR_DEBUG_IRQ 0x10
621
622 u32 debug;
614 bool sink_support;623 bool sink_support;
615 struct intel_dp *enabled;624 bool prepared, enabled;
625 struct intel_dp *dp;
616 bool active;626 bool active;
617 struct work_struct work;627 struct work_struct work;
618 unsigned busy_frontbuffer_bits;628 unsigned busy_frontbuffer_bits;
@@ -622,7 +632,6 @@ struct i915_psr { · 3 unmodified lines
622 bool alpm;632 bool alpm;
623 bool psr2_enabled;633 bool psr2_enabled;
624 u8 sink_sync_latency;634 u8 sink_sync_latency;
625 bool debug;
626 ktime_t last_entry_attempt;635 ktime_t last_entry_attempt;
627 ktime_t last_exit;636 ktime_t last_exit;
628};637};
@@ -867,14 +876,17 @@ struct i915_power_well_ops { · 238 unmodified lines
867 struct i915_power_well *power_well);876 struct i915_power_well *power_well);
868};877};
869 878
879struct i915_power_well_regs {
880 i915_reg_t bios;
881 i915_reg_t driver;
882 i915_reg_t kvmr;
883 i915_reg_t debug;
884};
885
870/* Power well structure for haswell */886/* Power well structure for haswell */
871struct i915_power_well {887struct i915_power_well_desc {
872 const char *name;888 const char *name;
873 bool always_on;889 bool always_on;
874 /* power well enable/disable usage count */
875 int count;
876 /* cached hw enabled state */
877 bool hw_enabled;
878 u64 domains;890 u64 domains;
879 /* unique identifier for this power well */891 /* unique identifier for this power well */
880 enum i915_power_well_id id;892 enum i915_power_well_id id;
@@ -883,10 +895,23 @@ struct i915_power_well { · 2 unmodified lines
883 * well specific.895 * well specific.
884 */896 */
885 union {897 union {
898 struct {
899 /*
900 * request/status flag index in the PUNIT power well
901 * control/status registers.
902 */
903 u8 idx;
904 } vlv;
886 struct {905 struct {
887 enum dpio_phy phy;906 enum dpio_phy phy;
888 } bxt;907 } bxt;
889 struct {908 struct {
909 const struct i915_power_well_regs *regs;
910 /*
911 * request/status flag index in the power well
912 * constrol/status registers.
913 */
914 u8 idx;
890 /* Mask of pipes whose IRQ logic is backed by the pw */915 /* Mask of pipes whose IRQ logic is backed by the pw */
891 u8 irq_pipe_mask;916 u8 irq_pipe_mask;
892 /* The pw is backing the VGA functionality */917 /* The pw is backing the VGA functionality */
@@ -897,13 +922,21 @@ struct i915_power_well { · 4 unmodified lines
897 const struct i915_power_well_ops *ops;922 const struct i915_power_well_ops *ops;
898};923};
899 924
925struct i915_power_well {
926 const struct i915_power_well_desc *desc;
927 /* power well enable/disable usage count */
928 int count;
929 /* cached hw enabled state */
930 bool hw_enabled;
931};
932
900struct i915_power_domains {933struct i915_power_domains {
901 /*934 /*
902 * Power wells needed for initialization at driver init and suspend935 * Power wells needed for initialization at driver init and suspend
903 * time are on. They are kept on until after the first modeset.936 * time are on. They are kept on until after the first modeset.
904 */937 */
905 bool init_power_on;
906 bool initializing;938 bool initializing;
939 bool display_core_suspended;
907 int power_well_count;940 int power_well_count;
908 941
909 struct mutex lock;942 struct mutex lock;
@@ -1610,7 +1643,8 @@ struct drm_i915_private { · 700 unmodified lines
1610 struct mutex gmbus_mutex;1643 struct mutex gmbus_mutex;
1611 1644
1612 /**1645 /**
1613 * Base address of the gmbus and gpio block.1646 * Base address of where the gmbus and gpio blocks are located (either
1647 * on PCH or on SoC for platforms without PCH).
1614 */1648 */
1615 uint32_t gpio_mmio_base;1649 uint32_t gpio_mmio_base;
1616 1650
@@ -1632,7 +1666,6 @@ struct drm_i915_private { · 15 unmodified lines
1632 struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1]1666 struct intel_engine_cs *engine_class[MAX_ENGINE_CLASS + 1]
1633 [MAX_ENGINE_INSTANCE + 1];1667 [MAX_ENGINE_INSTANCE + 1];
1634 1668
1635 struct drm_dma_handle *status_page_dmah;
1636 struct resource mch_res;1669 struct resource mch_res;
1637 1670
1638 /* protects the irq masks */1671 /* protects the irq masks */
@@ -1828,6 +1861,7 @@ struct drm_i915_private { · 189 unmodified lines
1828 struct mutex av_mutex;1861 struct mutex av_mutex;
1829 1862
1830 struct {1863 struct {
1864 struct mutex mutex;
1831 struct list_head list;1865 struct list_head list;
1832 struct llist_head free_list;1866 struct llist_head free_list;
1833 struct work_struct free_work;1867 struct work_struct free_work;
@@ -1840,6 +1874,7 @@ struct drm_i915_private { · 6 unmodified lines
1840#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */1874#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */
1841#define MAX_GUC_CONTEXT_HW_ID (1 << 20) /* exclusive */1875#define MAX_GUC_CONTEXT_HW_ID (1 << 20) /* exclusive */
1842#define GEN11_MAX_CONTEXT_HW_ID (1<<11) /* exclusive */1876#define GEN11_MAX_CONTEXT_HW_ID (1<<11) /* exclusive */
1877 struct list_head hw_id_list;
1843 } contexts;1878 } contexts;
1844 1879
1845 u32 fdi_rx_config;1880 u32 fdi_rx_config;
@@ -2610,8 +2645,6 @@ intel_info(const struct drm_i915_private *dev_priv) · 764 unmodified lines
2610#define USES_GUC_SUBMISSION(dev_priv) intel_uc_is_using_guc_submission()2645#define USES_GUC_SUBMISSION(dev_priv) intel_uc_is_using_guc_submission()
2611#define USES_HUC(dev_priv) intel_uc_is_using_huc()2646#define USES_HUC(dev_priv) intel_uc_is_using_huc()
2612 2647
2613#define HAS_RESOURCE_STREAMER(dev_priv) ((dev_priv)->info.has_resource_streamer)
2614
2615#define HAS_POOLED_EU(dev_priv) ((dev_priv)->info.has_pooled_eu)2648#define HAS_POOLED_EU(dev_priv) ((dev_priv)->info.has_pooled_eu)
2616 2649
2617#define INTEL_PCH_DEVICE_ID_MASK 0xff802650#define INTEL_PCH_DEVICE_ID_MASK 0xff80
@@ -2775,6 +2808,8 @@ extern void intel_irq_fini(struct drm_i915_private *dev_priv); · 157 unmodified lines
2775int intel_irq_install(struct drm_i915_private *dev_priv);2808int intel_irq_install(struct drm_i915_private *dev_priv);
2776void intel_irq_uninstall(struct drm_i915_private *dev_priv);2809void intel_irq_uninstall(struct drm_i915_private *dev_priv);
2777 2810
2811void i915_clear_error_registers(struct drm_i915_private *dev_priv);
2812
2778static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)2813static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)
2779{2814{
2780 return dev_priv->gvt;2815 return dev_priv->gvt;
drivers/gpu/drm/i915/i915_gem.c+52−13
@@ -802,6 +802,11 @@ void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv) · 801 unmodified lines
802 * that was!).802 * that was!).
803 */803 */
804 804
805 wmb();
806
807 if (INTEL_INFO(dev_priv)->has_coherent_ggtt)
808 return;
809
805 i915_gem_chipset_flush(dev_priv);810 i915_gem_chipset_flush(dev_priv);
806 811
807 intel_runtime_pm_get(dev_priv);812 intel_runtime_pm_get(dev_priv);
@@ -1906,7 +1911,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, · 1098 unmodified lines
1906 return 0;1911 return 0;
1907}1912}
1908 1913
1909static unsigned int tile_row_pages(struct drm_i915_gem_object *obj)1914static unsigned int tile_row_pages(const struct drm_i915_gem_object *obj)
1910{1915{
1911 return i915_gem_object_get_tile_row_size(obj) >> PAGE_SHIFT;1916 return i915_gem_object_get_tile_row_size(obj) >> PAGE_SHIFT;
1912}1917}
@@ -1965,7 +1970,7 @@ int i915_gem_mmap_gtt_version(void) · 52 unmodified lines
1965}1970}
1966 1971
1967static inline struct i915_ggtt_view1972static inline struct i915_ggtt_view
1968compute_partial_view(struct drm_i915_gem_object *obj,1973compute_partial_view(const struct drm_i915_gem_object *obj,
1969 pgoff_t page_offset,1974 pgoff_t page_offset,
1970 unsigned int chunk)1975 unsigned int chunk)
1971{1976{
@@ -2013,7 +2018,7 @@ vm_fault_t i915_gem_fault(struct vm_fault *vmf) · 41 unmodified lines
2013 struct drm_device *dev = obj->base.dev;2018 struct drm_device *dev = obj->base.dev;
2014 struct drm_i915_private *dev_priv = to_i915(dev);2019 struct drm_i915_private *dev_priv = to_i915(dev);
2015 struct i915_ggtt *ggtt = &dev_priv->ggtt;2020 struct i915_ggtt *ggtt = &dev_priv->ggtt;
2016 bool write = !!(vmf->flags & FAULT_FLAG_WRITE);2021 bool write = area->vm_flags & VM_WRITE;
2017 struct i915_vma *vma;2022 struct i915_vma *vma;
2018 pgoff_t page_offset;2023 pgoff_t page_offset;
2019 int ret;2024 int ret;
@@ -2528,13 +2533,21 @@ static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) · 508 unmodified lines
2528 gfp_t noreclaim;2533 gfp_t noreclaim;
2529 int ret;2534 int ret;
2530 2535
2531 /* Assert that the object is not currently in any GPU domain. As it2536 /*
2537 * Assert that the object is not currently in any GPU domain. As it
2532 * wasn't in the GTT, there shouldn't be any way it could have been in2538 * wasn't in the GTT, there shouldn't be any way it could have been in
2533 * a GPU cache2539 * a GPU cache
2534 */2540 */
2535 GEM_BUG_ON(obj->read_domains & I915_GEM_GPU_DOMAINS);2541 GEM_BUG_ON(obj->read_domains & I915_GEM_GPU_DOMAINS);
2536 GEM_BUG_ON(obj->write_domain & I915_GEM_GPU_DOMAINS);2542 GEM_BUG_ON(obj->write_domain & I915_GEM_GPU_DOMAINS);
2537 2543
2544 /*
2545 * If there's no chance of allocating enough pages for the whole
2546 * object, bail early.
2547 */
2548 if (page_count > totalram_pages)
2549 return -ENOMEM;
2550
2538 st = kmalloc(sizeof(*st), GFP_KERNEL);2551 st = kmalloc(sizeof(*st), GFP_KERNEL);
2539 if (st == NULL)2552 if (st == NULL)
2540 return -ENOMEM;2553 return -ENOMEM;
@@ -2545,7 +2558,8 @@ rebuild_st: · 4 unmodified lines
2545 return -ENOMEM;2558 return -ENOMEM;
2546 }2559 }
2547 2560
2548 /* Get the list of pages out of our struct file. They'll be pinned2561 /*
2562 * Get the list of pages out of our struct file. They'll be pinned
2549 * at this point until we release them.2563 * at this point until we release them.
2550 *2564 *
2551 * Fail silently without starting the shrinker2565 * Fail silently without starting the shrinker
@@ -2577,7 +2591,8 @@ rebuild_st: · 25 unmodified lines
2577 i915_gem_shrink(dev_priv, 2 * page_count, NULL, *s++);2591 i915_gem_shrink(dev_priv, 2 * page_count, NULL, *s++);
2578 cond_resched();2592 cond_resched();
2579 2593
2580 /* We've tried hard to allocate the memory by reaping2594 /*
2595 * We've tried hard to allocate the memory by reaping
2581 * our own buffer, now let the real VM do its job and2596 * our own buffer, now let the real VM do its job and
2582 * go down in flames if truly OOM.2597 * go down in flames if truly OOM.
2583 *2598 *
@@ -2589,7 +2604,8 @@ rebuild_st: · 5 unmodified lines
2589 /* reclaim and warn, but no oom */2604 /* reclaim and warn, but no oom */
2590 gfp = mapping_gfp_mask(mapping);2605 gfp = mapping_gfp_mask(mapping);
2591 2606
2592 /* Our bo are always dirty and so we require2607 /*
2608 * Our bo are always dirty and so we require
2593 * kswapd to reclaim our pages (direct reclaim2609 * kswapd to reclaim our pages (direct reclaim
2594 * does not effectively begin pageout of our2610 * does not effectively begin pageout of our
2595 * buffers on its own). However, direct reclaim2611 * buffers on its own). However, direct reclaim
@@ -2633,7 +2649,8 @@ rebuild_st: · 37 unmodified lines
2633 2649
2634 ret = i915_gem_gtt_prepare_pages(obj, st);2650 ret = i915_gem_gtt_prepare_pages(obj, st);
2635 if (ret) {2651 if (ret) {
2636 /* DMA remapping failed? One possible cause is that2652 /*
2653 * DMA remapping failed? One possible cause is that
2637 * it could not reserve enough large entries, asking2654 * it could not reserve enough large entries, asking
2638 * for PAGE_SIZE chunks instead may be helpful.2655 * for PAGE_SIZE chunks instead may be helpful.
2639 */2656 */
@@ -2667,7 +2684,8 @@ err_pages: · 27 unmodified lines
2667 sg_free_table(st);2684 sg_free_table(st);
2668 kfree(st);2685 kfree(st);
2669 2686
2670 /* shmemfs first checks if there is enough memory to allocate the page2687 /*
2688 * shmemfs first checks if there is enough memory to allocate the page
2671 * and reports ENOSPC should there be insufficient, along with the usual2689 * and reports ENOSPC should there be insufficient, along with the usual
2672 * ENOMEM for a genuine allocation failure.2690 * ENOMEM for a genuine allocation failure.
2673 *2691 *
@@ -3307,8 +3325,8 @@ void i915_gem_set_wedged(struct drm_i915_private *i915) · 633 unmodified lines
3307 intel_engine_dump(engine, &p, "%s\n", engine->name);3325 intel_engine_dump(engine, &p, "%s\n", engine->name);
3308 }3326 }
3309 3327
3310 set_bit(I915_WEDGED, &i915->gpu_error.flags);3328 if (test_and_set_bit(I915_WEDGED, &i915->gpu_error.flags))
3311 smp_mb__after_atomic();3329 goto out;
3312 3330
3313 /*3331 /*
3314 * First, stop submission to hw, but do not yet complete requests by3332 * First, stop submission to hw, but do not yet complete requests by
@@ -3324,7 +3342,8 @@ void i915_gem_set_wedged(struct drm_i915_private *i915) · 9 unmodified lines
3324 i915->caps.scheduler = 0;3342 i915->caps.scheduler = 0;
3325 3343
3326 /* Even if the GPU reset fails, it should still stop the engines */3344 /* Even if the GPU reset fails, it should still stop the engines */
3327 intel_gpu_reset(i915, ALL_ENGINES);3345 if (INTEL_GEN(i915) >= 5)
3346 intel_gpu_reset(i915, ALL_ENGINES);
3328 3347
3329 /*3348 /*
3330 * Make sure no one is running the old callback before we proceed with3349 * Make sure no one is running the old callback before we proceed with
@@ -3367,6 +3386,7 @@ void i915_gem_set_wedged(struct drm_i915_private *i915) · 36 unmodified lines
3367 i915_gem_reset_finish_engine(engine);3386 i915_gem_reset_finish_engine(engine);
3368 }3387 }
3369 3388
3389out:
3370 GEM_TRACE("end\n");3390 GEM_TRACE("end\n");
3371 3391
3372 wake_up_all(&i915->gpu_error.reset_queue);3392 wake_up_all(&i915->gpu_error.reset_queue);
@@ -3816,6 +3836,12 @@ int i915_gem_wait_for_idle(struct drm_i915_private *i915, · 443 unmodified lines
3816 if (timeout < 0)3836 if (timeout < 0)
3817 return timeout;3837 return timeout;
3818 }3838 }
3839 if (GEM_SHOW_DEBUG() && !timeout) {
3840 /* Presume that timeout was non-zero to begin with! */
3841 dev_warn(&i915->drm.pdev->dev,
3842 "Missed idle-completion interrupt!\n");
3843 GEM_TRACE_DUMP();
3844 }
3819 3845
3820 err = wait_for_engines(i915);3846 err = wait_for_engines(i915);
3821 if (err)3847 if (err)
@@ -5592,6 +5618,8 @@ err_uc_misc: · 1770 unmodified lines
5592 i915_gem_cleanup_userptr(dev_priv);5618 i915_gem_cleanup_userptr(dev_priv);
5593 5619
5594 if (ret == -EIO) {5620 if (ret == -EIO) {
5621 mutex_lock(&dev_priv->drm.struct_mutex);
5622
5595 /*5623 /*
5596 * Allow engine initialisation to fail by marking the GPU as5624 * Allow engine initialisation to fail by marking the GPU as
5597 * wedged. But we only want to do this where the GPU is angry,5625 * wedged. But we only want to do this where the GPU is angry,
@@ -5602,7 +5630,14 @@ err_uc_misc: · 4 unmodified lines
5602 "Failed to initialize GPU, declaring it wedged!\n");5630 "Failed to initialize GPU, declaring it wedged!\n");
5603 i915_gem_set_wedged(dev_priv);5631 i915_gem_set_wedged(dev_priv);
5604 }5632 }
5605 ret = 0;5633
5634 /* Minimal basic recovery for KMS */
5635 ret = i915_ggtt_enable_hw(dev_priv);
5636 i915_gem_restore_gtt_mappings(dev_priv);
5637 i915_gem_restore_fences(dev_priv);
5638 intel_init_clock_gating(dev_priv);
5639
5640 mutex_unlock(&dev_priv->drm.struct_mutex);
5606 }5641 }
5607 5642
5608 i915_gem_drain_freed_objects(dev_priv);5643 i915_gem_drain_freed_objects(dev_priv);
@@ -5612,6 +5647,7 @@ err_uc_misc: · 3 unmodified lines
5612void i915_gem_fini(struct drm_i915_private *dev_priv)5647void i915_gem_fini(struct drm_i915_private *dev_priv)
5613{5648{
5614 i915_gem_suspend_late(dev_priv);5649 i915_gem_suspend_late(dev_priv);
5650 intel_disable_gt_powersave(dev_priv);
5615 5651
5616 /* Flush any outstanding unpin_work. */5652 /* Flush any outstanding unpin_work. */
5617 i915_gem_drain_workqueue(dev_priv);5653 i915_gem_drain_workqueue(dev_priv);
@@ -5623,6 +5659,8 @@ void i915_gem_fini(struct drm_i915_private *dev_priv) · 5 unmodified lines
5623 i915_gem_contexts_fini(dev_priv);5659 i915_gem_contexts_fini(dev_priv);
5624 mutex_unlock(&dev_priv->drm.struct_mutex);5660 mutex_unlock(&dev_priv->drm.struct_mutex);
5625 5661
5662 intel_cleanup_gt_powersave(dev_priv);
5663
5626 intel_uc_fini_misc(dev_priv);5664 intel_uc_fini_misc(dev_priv);
5627 i915_gem_cleanup_userptr(dev_priv);5665 i915_gem_cleanup_userptr(dev_priv);
5628 5666
@@ -6182,4 +6220,5 @@ err_unlock: · 553 unmodified lines
6182#include "selftests/huge_pages.c"6220#include "selftests/huge_pages.c"
6183#include "selftests/i915_gem_object.c"6221#include "selftests/i915_gem_object.c"
6184#include "selftests/i915_gem_coherency.c"6222#include "selftests/i915_gem_coherency.c"
6223#include "selftests/i915_gem.c"
6185#endif6224#endif
drivers/gpu/drm/i915/i915_gem.h+0−6
@@ -82,12 +82,6 @@ static inline void __tasklet_disable_sync_once(struct tasklet_struct *t) · 81 unmodified lines
82 tasklet_unlock_wait(t);82 tasklet_unlock_wait(t);
83}83}
84 84
85static inline void __tasklet_enable_sync_once(struct tasklet_struct *t)
86{
87 if (atomic_dec_return(&t->count) == 0)
88 tasklet_kill(t);
89}
90
91static inline bool __tasklet_is_enabled(const struct tasklet_struct *t)85static inline bool __tasklet_is_enabled(const struct tasklet_struct *t)
92{86{
93 return !atomic_read(&t->count);87 return !atomic_read(&t->count);
drivers/gpu/drm/i915/i915_gem_context.c+161−71
@@ -115,6 +115,95 @@ static void lut_close(struct i915_gem_context *ctx) · 114 unmodified lines
115 rcu_read_unlock();115 rcu_read_unlock();
116}116}
117 117
118static inline int new_hw_id(struct drm_i915_private *i915, gfp_t gfp)
119{
120 unsigned int max;
121
122 lockdep_assert_held(&i915->contexts.mutex);
123
124 if (INTEL_GEN(i915) >= 11)
125 max = GEN11_MAX_CONTEXT_HW_ID;
126 else if (USES_GUC_SUBMISSION(i915))
127 /*
128 * When using GuC in proxy submission, GuC consumes the
129 * highest bit in the context id to indicate proxy submission.
130 */
131 max = MAX_GUC_CONTEXT_HW_ID;
132 else
133 max = MAX_CONTEXT_HW_ID;
134
135 return ida_simple_get(&i915->contexts.hw_ida, 0, max, gfp);
136}
137
138static int steal_hw_id(struct drm_i915_private *i915)
139{
140 struct i915_gem_context *ctx, *cn;
141 LIST_HEAD(pinned);
142 int id = -ENOSPC;
143
144 lockdep_assert_held(&i915->contexts.mutex);
145
146 list_for_each_entry_safe(ctx, cn,
147 &i915->contexts.hw_id_list, hw_id_link) {
148 if (atomic_read(&ctx->hw_id_pin_count)) {
149 list_move_tail(&ctx->hw_id_link, &pinned);
150 continue;
151 }
152
153 GEM_BUG_ON(!ctx->hw_id); /* perma-pinned kernel context */
154 list_del_init(&ctx->hw_id_link);
155 id = ctx->hw_id;
156 break;
157 }
158
159 /*
160 * Remember how far we got up on the last repossesion scan, so the
161 * list is kept in a "least recently scanned" order.
162 */
163 list_splice_tail(&pinned, &i915->contexts.hw_id_list);
164 return id;
165}
166
167static int assign_hw_id(struct drm_i915_private *i915, unsigned int *out)
168{
169 int ret;
170
171 lockdep_assert_held(&i915->contexts.mutex);
172
173 /*
174 * We prefer to steal/stall ourselves and our users over that of the
175 * entire system. That may be a little unfair to our users, and
176 * even hurt high priority clients. The choice is whether to oomkill
177 * something else, or steal a context id.
178 */
179 ret = new_hw_id(i915, GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
180 if (unlikely(ret < 0)) {
181 ret = steal_hw_id(i915);
182 if (ret < 0) /* once again for the correct errno code */
183 ret = new_hw_id(i915, GFP_KERNEL);
184 if (ret < 0)
185 return ret;
186 }
187
188 *out = ret;
189 return 0;
190}
191
192static void release_hw_id(struct i915_gem_context *ctx)
193{
194 struct drm_i915_private *i915 = ctx->i915;
195
196 if (list_empty(&ctx->hw_id_link))
197 return;
198
199 mutex_lock(&i915->contexts.mutex);
200 if (!list_empty(&ctx->hw_id_link)) {
201 ida_simple_remove(&i915->contexts.hw_ida, ctx->hw_id);
202 list_del_init(&ctx->hw_id_link);
203 }
204 mutex_unlock(&i915->contexts.mutex);
205}
206
118static void i915_gem_context_free(struct i915_gem_context *ctx)207static void i915_gem_context_free(struct i915_gem_context *ctx)
119{208{
120 unsigned int n;209 unsigned int n;
@@ -122,6 +211,7 @@ static void i915_gem_context_free(struct i915_gem_context *ctx) · 1 unmodified line
122 lockdep_assert_held(&ctx->i915->drm.struct_mutex);211 lockdep_assert_held(&ctx->i915->drm.struct_mutex);
123 GEM_BUG_ON(!i915_gem_context_is_closed(ctx));212 GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
124 213
214 release_hw_id(ctx);
125 i915_ppgtt_put(ctx->ppgtt);215 i915_ppgtt_put(ctx->ppgtt);
126 216
127 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) {217 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) {
@@ -136,7 +226,6 @@ static void i915_gem_context_free(struct i915_gem_context *ctx) · 8 unmodified lines
136 226
137 list_del(&ctx->link);227 list_del(&ctx->link);
138 228
139 ida_simple_remove(&ctx->i915->contexts.hw_ida, ctx->hw_id);
140 kfree_rcu(ctx, rcu);229 kfree_rcu(ctx, rcu);
141}230}
142 231
@@ -190,6 +279,12 @@ static void context_close(struct i915_gem_context *ctx) · 47 unmodified lines
190{279{
191 i915_gem_context_set_closed(ctx);280 i915_gem_context_set_closed(ctx);
192 281
282 /*
283 * This context will never again be assinged to HW, so we can
284 * reuse its ID for the next context.
285 */
286 release_hw_id(ctx);
287
193 /*288 /*
194 * The LUT uses the VMA as a backpointer to unref the object,289 * The LUT uses the VMA as a backpointer to unref the object,
195 * so we need to clear the LUT before we close all the VMA (inside290 * so we need to clear the LUT before we close all the VMA (inside
@@ -203,43 +298,6 @@ static void context_close(struct i915_gem_context *ctx) · 7 unmodified lines
203 i915_gem_context_put(ctx);298 i915_gem_context_put(ctx);
204}299}
205 300
206static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
207{
208 int ret;
209 unsigned int max;
210
211 if (INTEL_GEN(dev_priv) >= 11) {
212 max = GEN11_MAX_CONTEXT_HW_ID;
213 } else {
214 /*
215 * When using GuC in proxy submission, GuC consumes the
216 * highest bit in the context id to indicate proxy submission.
217 */
218 if (USES_GUC_SUBMISSION(dev_priv))
219 max = MAX_GUC_CONTEXT_HW_ID;
220 else
221 max = MAX_CONTEXT_HW_ID;
222 }
223
224
225 ret = ida_simple_get(&dev_priv->contexts.hw_ida,
226 0, max, GFP_KERNEL);
227 if (ret < 0) {
228 /* Contexts are only released when no longer active.
229 * Flush any pending retires to hopefully release some
230 * stale contexts and try again.
231 */
232 i915_retire_requests(dev_priv);
233 ret = ida_simple_get(&dev_priv->contexts.hw_ida,
234 0, max, GFP_KERNEL);
235 if (ret < 0)
236 return ret;
237 }
238
239 *out = ret;
240 return 0;
241}
242
243static u32 default_desc_template(const struct drm_i915_private *i915,301static u32 default_desc_template(const struct drm_i915_private *i915,
244 const struct i915_hw_ppgtt *ppgtt)302 const struct i915_hw_ppgtt *ppgtt)
245{303{
@@ -276,12 +334,6 @@ __create_hw_context(struct drm_i915_private *dev_priv, · 30 unmodified lines
276 if (ctx == NULL)334 if (ctx == NULL)
277 return ERR_PTR(-ENOMEM);335 return ERR_PTR(-ENOMEM);
278 336
279 ret = assign_hw_id(dev_priv, &ctx->hw_id);
280 if (ret) {
281 kfree(ctx);
282 return ERR_PTR(ret);
283 }
284
285 kref_init(&ctx->ref);337 kref_init(&ctx->ref);
286 list_add_tail(&ctx->link, &dev_priv->contexts.list);338 list_add_tail(&ctx->link, &dev_priv->contexts.list);
287 ctx->i915 = dev_priv;339 ctx->i915 = dev_priv;
@@ -295,6 +347,7 @@ __create_hw_context(struct drm_i915_private *dev_priv, · 7 unmodified lines
295 347
296 INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);348 INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
297 INIT_LIST_HEAD(&ctx->handles_list);349 INIT_LIST_HEAD(&ctx->handles_list);
350 INIT_LIST_HEAD(&ctx->hw_id_link);
298 351
299 /* Default context will never have a file_priv */352 /* Default context will never have a file_priv */
300 ret = DEFAULT_CONTEXT_HANDLE;353 ret = DEFAULT_CONTEXT_HANDLE;
@@ -329,16 +382,6 @@ __create_hw_context(struct drm_i915_private *dev_priv, · 28 unmodified lines
329 ctx->desc_template =382 ctx->desc_template =
330 default_desc_template(dev_priv, dev_priv->mm.aliasing_ppgtt);383 default_desc_template(dev_priv, dev_priv->mm.aliasing_ppgtt);
331 384
332 /*
333 * GuC requires the ring to be placed in Non-WOPCM memory. If GuC is not
334 * present or not in use we still need a small bias as ring wraparound
335 * at offset 0 sometimes hangs. No idea why.
336 */
337 if (USES_GUC(dev_priv))
338 ctx->ggtt_offset_bias = dev_priv->guc.ggtt_pin_bias;
339 else
340 ctx->ggtt_offset_bias = I915_GTT_PAGE_SIZE;
341
342 return ctx;385 return ctx;
343 386
344err_pid:387err_pid:
@@ -431,15 +474,35 @@ out: · 86 unmodified lines
431 return ctx;474 return ctx;
432}475}
433 476
477static void
478destroy_kernel_context(struct i915_gem_context **ctxp)
479{
480 struct i915_gem_context *ctx;
481
482 /* Keep the context ref so that we can free it immediately ourselves */
483 ctx = i915_gem_context_get(fetch_and_zero(ctxp));
484 GEM_BUG_ON(!i915_gem_context_is_kernel(ctx));
485
486 context_close(ctx);
487 i915_gem_context_free(ctx);
488}
489
434struct i915_gem_context *490struct i915_gem_context *
435i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio)491i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio)
436{492{
437 struct i915_gem_context *ctx;493 struct i915_gem_context *ctx;
494 int err;
438 495
439 ctx = i915_gem_create_context(i915, NULL);496 ctx = i915_gem_create_context(i915, NULL);
440 if (IS_ERR(ctx))497 if (IS_ERR(ctx))
441 return ctx;498 return ctx;
442 499
500 err = i915_gem_context_pin_hw_id(ctx);
501 if (err) {
502 destroy_kernel_context(&ctx);
503 return ERR_PTR(err);
504 }
505
443 i915_gem_context_clear_bannable(ctx);506 i915_gem_context_clear_bannable(ctx);
444 ctx->sched.priority = prio;507 ctx->sched.priority = prio;
445 ctx->ring_size = PAGE_SIZE;508 ctx->ring_size = PAGE_SIZE;
@@ -449,17 +512,19 @@ i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio) · 3 unmodified lines
449 return ctx;512 return ctx;
450}513}
451 514
452static void515static void init_contexts(struct drm_i915_private *i915)
453destroy_kernel_context(struct i915_gem_context **ctxp)
454{516{
455 struct i915_gem_context *ctx;517 mutex_init(&i915->contexts.mutex);
518 INIT_LIST_HEAD(&i915->contexts.list);
456 519
457 /* Keep the context ref so that we can free it immediately ourselves */520 /* Using the simple ida interface, the max is limited by sizeof(int) */
458 ctx = i915_gem_context_get(fetch_and_zero(ctxp));521 BUILD_BUG_ON(MAX_CONTEXT_HW_ID > INT_MAX);
459 GEM_BUG_ON(!i915_gem_context_is_kernel(ctx));522 BUILD_BUG_ON(GEN11_MAX_CONTEXT_HW_ID > INT_MAX);
523 ida_init(&i915->contexts.hw_ida);
524 INIT_LIST_HEAD(&i915->contexts.hw_id_list);
460 525
461 context_close(ctx);526 INIT_WORK(&i915->contexts.free_work, contexts_free_worker);
462 i915_gem_context_free(ctx);527 init_llist_head(&i915->contexts.free_list);
463}528}
464 529
465static bool needs_preempt_context(struct drm_i915_private *i915)530static bool needs_preempt_context(struct drm_i915_private *i915)
@@ -480,14 +545,7 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) · 14 unmodified lines
480 if (ret)545 if (ret)
481 return ret;546 return ret;
482 547
483 INIT_LIST_HEAD(&dev_priv->contexts.list);548 init_contexts(dev_priv);
484 INIT_WORK(&dev_priv->contexts.free_work, contexts_free_worker);
485 init_llist_head(&dev_priv->contexts.free_list);
486
487 /* Using the simple ida interface, the max is limited by sizeof(int) */
488 BUILD_BUG_ON(MAX_CONTEXT_HW_ID > INT_MAX);
489 BUILD_BUG_ON(GEN11_MAX_CONTEXT_HW_ID > INT_MAX);
490 ida_init(&dev_priv->contexts.hw_ida);
491 549
492 /* lowest priority; idle task */550 /* lowest priority; idle task */
493 ctx = i915_gem_context_create_kernel(dev_priv, I915_PRIORITY_MIN);551 ctx = i915_gem_context_create_kernel(dev_priv, I915_PRIORITY_MIN);
@@ -497,9 +555,13 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) · 3 unmodified lines
497 }555 }
498 /*556 /*
499 * For easy recognisablity, we want the kernel context to be 0 and then557 * For easy recognisablity, we want the kernel context to be 0 and then
500 * all user contexts will have non-zero hw_id.558 * all user contexts will have non-zero hw_id. Kernel contexts are
559 * permanently pinned, so that we never suffer a stall and can
560 * use them from any allocation context (e.g. for evicting other
561 * contexts and from inside the shrinker).
501 */562 */
502 GEM_BUG_ON(ctx->hw_id);563 GEM_BUG_ON(ctx->hw_id);
564 GEM_BUG_ON(!atomic_read(&ctx->hw_id_pin_count));
503 dev_priv->kernel_context = ctx;565 dev_priv->kernel_context = ctx;
504 566
505 /* highest priority; preempting task */567 /* highest priority; preempting task */
@@ -537,6 +599,7 @@ void i915_gem_contexts_fini(struct drm_i915_private *i915) · 31 unmodified lines
537 destroy_kernel_context(&i915->kernel_context);599 destroy_kernel_context(&i915->kernel_context);
538 600
539 /* Must free all deferred contexts (via flush_workqueue) first */601 /* Must free all deferred contexts (via flush_workqueue) first */
602 GEM_BUG_ON(!list_empty(&i915->contexts.hw_id_list));
540 ida_destroy(&i915->contexts.hw_ida);603 ida_destroy(&i915->contexts.hw_ida);
541}604}
542 605
@@ -942,6 +1005,33 @@ out: · 399 unmodified lines
942 return ret;1005 return ret;
943}1006}
944 1007
1008int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx)
1009{
1010 struct drm_i915_private *i915 = ctx->i915;
1011 int err = 0;
1012
1013 mutex_lock(&i915->contexts.mutex);
1014
1015 GEM_BUG_ON(i915_gem_context_is_closed(ctx));
1016
1017 if (list_empty(&ctx->hw_id_link)) {
1018 GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count));
1019
1020 err = assign_hw_id(i915, &ctx->hw_id);
1021 if (err)
1022 goto out_unlock;
1023
1024 list_add_tail(&ctx->hw_id_link, &i915->contexts.hw_id_list);
1025 }
1026
1027 GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count) == ~0u);
1028 atomic_inc(&ctx->hw_id_pin_count);
1029
1030out_unlock:
1031 mutex_unlock(&i915->contexts.mutex);
1032 return err;
1033}
1034
945#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)1035#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
946#include "selftests/mock_context.c"1036#include "selftests/mock_context.c"
947#include "selftests/i915_gem_context.c"1037#include "selftests/i915_gem_context.c"
drivers/gpu/drm/i915/i915_gem_context.h+23−3
@@ -134,8 +134,16 @@ struct i915_gem_context { · 133 unmodified lines
134 * functions like fault reporting, PASID, scheduling. The134 * functions like fault reporting, PASID, scheduling. The
135 * &drm_i915_private.context_hw_ida is used to assign a unqiue135 * &drm_i915_private.context_hw_ida is used to assign a unqiue
136 * id for the lifetime of the context.136 * id for the lifetime of the context.
137 *
138 * @hw_id_pin_count: - number of times this context had been pinned
139 * for use (should be, at most, once per engine).
140 *
141 * @hw_id_link: - all contexts with an assigned id are tracked
142 * for possible repossession.
137 */143 */
138 unsigned int hw_id;144 unsigned int hw_id;
145 atomic_t hw_id_pin_count;
146 struct list_head hw_id_link;
139 147
140 /**148 /**
141 * @user_handle: userspace identifier149 * @user_handle: userspace identifier
@@ -147,9 +155,6 @@ struct i915_gem_context { · 5 unmodified lines
147 155
148 struct i915_sched_attr sched;156 struct i915_sched_attr sched;
149 157
150 /** ggtt_offset_bias: placement restriction for context objects */
151 u32 ggtt_offset_bias;
152
153 /** engine: per-engine logical HW state */158 /** engine: per-engine logical HW state */
154 struct intel_context {159 struct intel_context {
155 struct i915_gem_context *gem_context;160 struct i915_gem_context *gem_context;
@@ -257,6 +262,21 @@ static inline void i915_gem_context_set_force_single_submission(struct i915_gem_ · 101 unmodified lines
257 __set_bit(CONTEXT_FORCE_SINGLE_SUBMISSION, &ctx->flags);262 __set_bit(CONTEXT_FORCE_SINGLE_SUBMISSION, &ctx->flags);
258}263}
259 264
265int __i915_gem_context_pin_hw_id(struct i915_gem_context *ctx);
266static inline int i915_gem_context_pin_hw_id(struct i915_gem_context *ctx)
267{
268 if (atomic_inc_not_zero(&ctx->hw_id_pin_count))
269 return 0;
270
271 return __i915_gem_context_pin_hw_id(ctx);
272}
273
274static inline void i915_gem_context_unpin_hw_id(struct i915_gem_context *ctx)
275{
276 GEM_BUG_ON(atomic_read(&ctx->hw_id_pin_count) == 0u);
277 atomic_dec(&ctx->hw_id_pin_count);
278}
279
260static inline bool i915_gem_context_is_default(const struct i915_gem_context *c)280static inline bool i915_gem_context_is_default(const struct i915_gem_context *c)
261{281{
262 return c->user_handle == DEFAULT_CONTEXT_HANDLE;282 return c->user_handle == DEFAULT_CONTEXT_HANDLE;
drivers/gpu/drm/i915/i915_gem_execbuffer.c+21−22
@@ -64,7 +64,9 @@ enum { · 63 unmodified lines
64#define BATCH_OFFSET_BIAS (256*1024)64#define BATCH_OFFSET_BIAS (256*1024)
65 65
66#define __I915_EXEC_ILLEGAL_FLAGS \66#define __I915_EXEC_ILLEGAL_FLAGS \
67 (__I915_EXEC_UNKNOWN_FLAGS | I915_EXEC_CONSTANTS_MASK)67 (__I915_EXEC_UNKNOWN_FLAGS | \
68 I915_EXEC_CONSTANTS_MASK | \
69 I915_EXEC_RESOURCE_STREAMER)
68 70
69/* Catch emission of unexpected errors for CI! */71/* Catch emission of unexpected errors for CI! */
70#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)72#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
@@ -733,7 +735,12 @@ static int eb_select_context(struct i915_execbuffer *eb) · 662 unmodified lines
733 return -ENOENT;735 return -ENOENT;
734 736
735 eb->ctx = ctx;737 eb->ctx = ctx;
736 eb->vm = ctx->ppgtt ? &ctx->ppgtt->vm : &eb->i915->ggtt.vm;738 if (ctx->ppgtt) {
739 eb->vm = &ctx->ppgtt->vm;
740 eb->invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
741 } else {
742 eb->vm = &eb->i915->ggtt.vm;
743 }
737 744
738 eb->context_flags = 0;745 eb->context_flags = 0;
739 if (ctx->flags & CONTEXT_NO_ZEROMAP)746 if (ctx->flags & CONTEXT_NO_ZEROMAP)
@@ -1120,6 +1127,13 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb, · 380 unmodified lines
1120 u32 *cmd;1127 u32 *cmd;
1121 int err;1128 int err;
1122 1129
1130 if (DBG_FORCE_RELOC == FORCE_GPU_RELOC) {
1131 obj = vma->obj;
1132 if (obj->cache_dirty & ~obj->cache_coherent)
1133 i915_gem_clflush_object(obj, 0);
1134 obj->write_domain = 0;
1135 }
1136
1123 GEM_BUG_ON(vma->obj->write_domain & I915_GEM_DOMAIN_CPU);1137 GEM_BUG_ON(vma->obj->write_domain & I915_GEM_DOMAIN_CPU);
1124 1138
1125 obj = i915_gem_batch_pool_get(&eb->engine->batch_pool, PAGE_SIZE);1139 obj = i915_gem_batch_pool_get(&eb->engine->batch_pool, PAGE_SIZE);
@@ -1484,8 +1498,10 @@ static int eb_relocate_vma(struct i915_execbuffer *eb, struct i915_vma *vma) · 358 unmodified lines
1484 * can read from this userspace address.1498 * can read from this userspace address.
1485 */1499 */
1486 offset = gen8_canonical_addr(offset & ~UPDATE);1500 offset = gen8_canonical_addr(offset & ~UPDATE);
1487 __put_user(offset,1501 if (unlikely(__put_user(offset, &urelocs[r-stack].presumed_offset))) {
1488 &urelocs[r-stack].presumed_offset);1502 remain = -EFAULT;
1503 goto out;
1504 }
1489 }1505 }
1490 } while (r++, --count);1506 } while (r++, --count);
1491 urelocs += ARRAY_SIZE(stack);1507 urelocs += ARRAY_SIZE(stack);
@@ -1570,7 +1586,6 @@ static int eb_copy_relocations(const struct i915_execbuffer *eb) · 78 unmodified lines
1570 1586
1571 relocs = kvmalloc_array(size, 1, GFP_KERNEL);1587 relocs = kvmalloc_array(size, 1, GFP_KERNEL);
1572 if (!relocs) {1588 if (!relocs) {
1573 kvfree(relocs);
1574 err = -ENOMEM;1589 err = -ENOMEM;
1575 goto err;1590 goto err;
1576 }1591 }
@@ -1584,6 +1599,7 @@ static int eb_copy_relocations(const struct i915_execbuffer *eb) · 7 unmodified lines
1584 if (__copy_from_user((char *)relocs + copied,1599 if (__copy_from_user((char *)relocs + copied,
1585 (char __user *)urelocs + copied,1600 (char __user *)urelocs + copied,
1586 len)) {1601 len)) {
1602end_user:
1587 kvfree(relocs);1603 kvfree(relocs);
1588 err = -EFAULT;1604 err = -EFAULT;
1589 goto err;1605 goto err;
@@ -1607,7 +1623,6 @@ static int eb_copy_relocations(const struct i915_execbuffer *eb) · 17 unmodified lines
1607 unsafe_put_user(-1,1623 unsafe_put_user(-1,
1608 &urelocs[copied].presumed_offset,1624 &urelocs[copied].presumed_offset,
1609 end_user);1625 end_user);
1610end_user:
1611 user_access_end();1626 user_access_end();
1612 1627
1613 eb->exec[i].relocs_ptr = (uintptr_t)relocs;1628 eb->exec[i].relocs_ptr = (uintptr_t)relocs;
@@ -2199,8 +2214,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, · 585 unmodified lines
2199 eb.flags = (unsigned int *)(eb.vma + args->buffer_count + 1);2214 eb.flags = (unsigned int *)(eb.vma + args->buffer_count + 1);
2200 2215
2201 eb.invalid_flags = __EXEC_OBJECT_UNKNOWN_FLAGS;2216 eb.invalid_flags = __EXEC_OBJECT_UNKNOWN_FLAGS;
2202 if (USES_FULL_PPGTT(eb.i915))
2203 eb.invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
2204 reloc_cache_init(&eb.reloc_cache, eb.i915);2217 reloc_cache_init(&eb.reloc_cache, eb.i915);
2205 2218
2206 eb.buffer_count = args->buffer_count;2219 eb.buffer_count = args->buffer_count;
@@ -2221,20 +2234,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, · 14 unmodified lines
2221 if (!eb.engine)2234 if (!eb.engine)
2222 return -EINVAL;2235 return -EINVAL;
2223 2236
2224 if (args->flags & I915_EXEC_RESOURCE_STREAMER) {
2225 if (!HAS_RESOURCE_STREAMER(eb.i915)) {
2226 DRM_DEBUG("RS is only allowed for Haswell, Gen8 and above\n");
2227 return -EINVAL;
2228 }
2229 if (eb.engine->id != RCS) {
2230 DRM_DEBUG("RS is not available on %s\n",
2231 eb.engine->name);
2232 return -EINVAL;
2233 }
2234
2235 eb.batch_flags |= I915_DISPATCH_RS;
2236 }
2237
2238 if (args->flags & I915_EXEC_FENCE_IN) {2237 if (args->flags & I915_EXEC_FENCE_IN) {
2239 in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));2238 in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
2240 if (!in_fence)2239 if (!in_fence)
drivers/gpu/drm/i915/i915_gem_gtt.c+25−27
@@ -173,19 +173,11 @@ int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv, · 172 unmodified lines
173 return 0;173 return 0;
174 }174 }
175 175
176 /* Early VLV doesn't have this */176 if (has_full_48bit_ppgtt)
177 if (IS_VALLEYVIEW(dev_priv) && dev_priv->drm.pdev->revision < 0xb) {177 return 3;
178 DRM_DEBUG_DRIVER("disabling PPGTT on pre-B3 step VLV\n");
179 return 0;
180 }
181
182 if (HAS_LOGICAL_RING_CONTEXTS(dev_priv)) {
183 if (has_full_48bit_ppgtt)
184 return 3;
185 178
186 if (has_full_ppgtt)179 if (has_full_ppgtt)
187 return 2;180 return 2;
188 }
189 181
190 return 1;182 return 1;
191}183}
@@ -1259,9 +1251,6 @@ static void gen8_free_page_tables(struct i915_address_space *vm, · 1067 unmodified lines
1259{1251{
1260 int i;1252 int i;
1261 1253
1262 if (!px_page(pd))
1263 return;
1264
1265 for (i = 0; i < I915_PDES; i++) {1254 for (i = 0; i < I915_PDES; i++) {
1266 if (pd->page_table[i] != vm->scratch_pt)1255 if (pd->page_table[i] != vm->scratch_pt)
1267 free_pt(vm, pd->page_table[i]);1256 free_pt(vm, pd->page_table[i]);
@@ -2348,7 +2337,7 @@ static bool needs_idle_maps(struct drm_i915_private *dev_priv) · 1080 unmodified lines
2348 return IS_GEN5(dev_priv) && IS_MOBILE(dev_priv) && intel_vtd_active();2337 return IS_GEN5(dev_priv) && IS_MOBILE(dev_priv) && intel_vtd_active();
2349}2338}
2350 2339
2351static void gen6_check_and_clear_faults(struct drm_i915_private *dev_priv)2340static void gen6_check_faults(struct drm_i915_private *dev_priv)
2352{2341{
2353 struct intel_engine_cs *engine;2342 struct intel_engine_cs *engine;
2354 enum intel_engine_id id;2343 enum intel_engine_id id;
@@ -2366,15 +2355,11 @@ static void gen6_check_and_clear_faults(struct drm_i915_private *dev_priv) · 11 unmodified lines
2366 fault & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",2355 fault & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",
2367 RING_FAULT_SRCID(fault),2356 RING_FAULT_SRCID(fault),
2368 RING_FAULT_FAULT_TYPE(fault));2357 RING_FAULT_FAULT_TYPE(fault));
2369 I915_WRITE(RING_FAULT_REG(engine),
2370 fault & ~RING_FAULT_VALID);
2371 }2358 }
2372 }2359 }
2373
2374 POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
2375}2360}
2376 2361
2377static void gen8_check_and_clear_faults(struct drm_i915_private *dev_priv)2362static void gen8_check_faults(struct drm_i915_private *dev_priv)
2378{2363{
2379 u32 fault = I915_READ(GEN8_RING_FAULT_REG);2364 u32 fault = I915_READ(GEN8_RING_FAULT_REG);
2380 2365
@@ -2399,22 +2384,20 @@ static void gen8_check_and_clear_faults(struct drm_i915_private *dev_priv) · 18 unmodified lines
2399 GEN8_RING_FAULT_ENGINE_ID(fault),2384 GEN8_RING_FAULT_ENGINE_ID(fault),
2400 RING_FAULT_SRCID(fault),2385 RING_FAULT_SRCID(fault),
2401 RING_FAULT_FAULT_TYPE(fault));2386 RING_FAULT_FAULT_TYPE(fault));
2402 I915_WRITE(GEN8_RING_FAULT_REG,
2403 fault & ~RING_FAULT_VALID);
2404 }2387 }
2405
2406 POSTING_READ(GEN8_RING_FAULT_REG);
2407}2388}
2408 2389
2409void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)2390void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
2410{2391{
2411 /* From GEN8 onwards we only have one 'All Engine Fault Register' */2392 /* From GEN8 onwards we only have one 'All Engine Fault Register' */
2412 if (INTEL_GEN(dev_priv) >= 8)2393 if (INTEL_GEN(dev_priv) >= 8)
2413 gen8_check_and_clear_faults(dev_priv);2394 gen8_check_faults(dev_priv);
2414 else if (INTEL_GEN(dev_priv) >= 6)2395 else if (INTEL_GEN(dev_priv) >= 6)
2415 gen6_check_and_clear_faults(dev_priv);2396 gen6_check_faults(dev_priv);
2416 else2397 else
2417 return;2398 return;
2399
2400 i915_clear_error_registers(dev_priv);
2418}2401}
2419 2402
2420void i915_gem_suspend_gtt_mappings(struct drm_i915_private *dev_priv)2403void i915_gem_suspend_gtt_mappings(struct drm_i915_private *dev_priv)
@@ -2937,6 +2920,15 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv) · 516 unmodified lines
2937 struct drm_mm_node *entry;2920 struct drm_mm_node *entry;
2938 int ret;2921 int ret;
2939 2922
2923 /*
2924 * GuC requires all resources that we're sharing with it to be placed in
2925 * non-WOPCM memory. If GuC is not present or not in use we still need a
2926 * small bias as ring wraparound at offset 0 sometimes hangs. No idea
2927 * why.
2928 */
2929 ggtt->pin_bias = max_t(u32, I915_GTT_PAGE_SIZE,
2930 intel_guc_reserved_gtt_size(&dev_priv->guc));
2931
2940 ret = intel_vgt_balloon(dev_priv);2932 ret = intel_vgt_balloon(dev_priv);
2941 if (ret)2933 if (ret)
2942 return ret;2934 return ret;
@@ -3612,6 +3604,8 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv) · 669 unmodified lines
3612 mutex_lock(&dev_priv->drm.struct_mutex);3604 mutex_lock(&dev_priv->drm.struct_mutex);
3613 i915_address_space_init(&ggtt->vm, dev_priv);3605 i915_address_space_init(&ggtt->vm, dev_priv);
3614 3606
3607 ggtt->vm.is_ggtt = true;
3608
3615 /* Only VLV supports read-only GGTT mappings */3609 /* Only VLV supports read-only GGTT mappings */
3616 ggtt->vm.has_read_only = IS_VALLEYVIEW(dev_priv);3610 ggtt->vm.has_read_only = IS_VALLEYVIEW(dev_priv);
3617 3611
@@ -3662,6 +3656,10 @@ void i915_ggtt_enable_guc(struct drm_i915_private *i915) · 44 unmodified lines
3662 3656
3663void i915_ggtt_disable_guc(struct drm_i915_private *i915)3657void i915_ggtt_disable_guc(struct drm_i915_private *i915)
3664{3658{
3659 /* XXX Temporary pardon for error unload */
3660 if (i915->ggtt.invalidate == gen6_ggtt_invalidate)
3661 return;
3662
3665 /* We should only be called after i915_ggtt_enable_guc() */3663 /* We should only be called after i915_ggtt_enable_guc() */
3666 GEM_BUG_ON(i915->ggtt.invalidate != guc_ggtt_invalidate);3664 GEM_BUG_ON(i915->ggtt.invalidate != guc_ggtt_invalidate);
3667 3665
drivers/gpu/drm/i915/i915_gem_gtt.h+10−13
@@ -167,29 +167,22 @@ struct intel_rotation_info { · 166 unmodified lines
167 } plane[2];167 } plane[2];
168} __packed;168} __packed;
169 169
170static inline void assert_intel_rotation_info_is_packed(void)
171{
172 BUILD_BUG_ON(sizeof(struct intel_rotation_info) != 8*sizeof(unsigned int));
173}
174
175struct intel_partial_info {170struct intel_partial_info {
176 u64 offset;171 u64 offset;
177 unsigned int size;172 unsigned int size;
178} __packed;173} __packed;
179 174
180static inline void assert_intel_partial_info_is_packed(void)
181{
182 BUILD_BUG_ON(sizeof(struct intel_partial_info) != sizeof(u64) + sizeof(unsigned int));
183}
184
185enum i915_ggtt_view_type {175enum i915_ggtt_view_type {
186 I915_GGTT_VIEW_NORMAL = 0,176 I915_GGTT_VIEW_NORMAL = 0,
187 I915_GGTT_VIEW_ROTATED = sizeof(struct intel_rotation_info),177 I915_GGTT_VIEW_ROTATED = sizeof(struct intel_rotation_info),
188 I915_GGTT_VIEW_PARTIAL = sizeof(struct intel_partial_info),178 I915_GGTT_VIEW_PARTIAL = sizeof(struct intel_partial_info),
189};179};
190 180
191static inline void assert_i915_ggtt_view_type_is_unique(void)181static inline void assert_i915_gem_gtt_types(void)
192{182{
183 BUILD_BUG_ON(sizeof(struct intel_rotation_info) != 8*sizeof(unsigned int));
184 BUILD_BUG_ON(sizeof(struct intel_partial_info) != sizeof(u64) + sizeof(unsigned int));
185
193 /* As we encode the size of each branch inside the union into its type,186 /* As we encode the size of each branch inside the union into its type,
194 * we have to be careful that each branch has a unique size.187 * we have to be careful that each branch has a unique size.
195 */188 */
@@ -229,7 +222,6 @@ struct i915_page_dma { · 33 unmodified lines
229};222};
230 223
231#define px_base(px) (&(px)->base)224#define px_base(px) (&(px)->base)
232#define px_page(px) (px_base(px)->page)
233#define px_dma(px) (px_base(px)->daddr)225#define px_dma(px) (px_base(px)->daddr)
234 226
235struct i915_page_table {227struct i915_page_table {
@@ -332,6 +324,9 @@ struct i915_address_space { · 96 unmodified lines
332 324
333 struct pagestash free_pages;325 struct pagestash free_pages;
334 326
327 /* Global GTT */
328 bool is_ggtt:1;
329
335 /* Some systems require uncached updates of the page directories */330 /* Some systems require uncached updates of the page directories */
336 bool pt_kmap_wc:1;331 bool pt_kmap_wc:1;
337 332
@@ -365,7 +360,7 @@ struct i915_address_space { · 27 unmodified lines
365 I915_SELFTEST_DECLARE(bool scrub_64K);360 I915_SELFTEST_DECLARE(bool scrub_64K);
366};361};
367 362
368#define i915_is_ggtt(V) (!(V)->file)363#define i915_is_ggtt(vm) ((vm)->is_ggtt)
369 364
370static inline bool365static inline bool
371i915_vm_is_48bit(const struct i915_address_space *vm)366i915_vm_is_48bit(const struct i915_address_space *vm)
@@ -401,6 +396,8 @@ struct i915_ggtt { · 29 unmodified lines
401 396
402 int mtrr;397 int mtrr;
403 398
399 u32 pin_bias;
400
404 struct drm_mm_node error_capture;401 struct drm_mm_node error_capture;
405};402};
406 403
drivers/gpu/drm/i915/i915_gem_object.h+5−5
@@ -421,19 +421,19 @@ i915_gem_object_is_framebuffer(const struct drm_i915_gem_object *obj) · 420 unmodified lines
421}421}
422 422
423static inline unsigned int423static inline unsigned int
424i915_gem_object_get_tiling(struct drm_i915_gem_object *obj)424i915_gem_object_get_tiling(const struct drm_i915_gem_object *obj)
425{425{
426 return obj->tiling_and_stride & TILING_MASK;426 return obj->tiling_and_stride & TILING_MASK;
427}427}
428 428
429static inline bool429static inline bool
430i915_gem_object_is_tiled(struct drm_i915_gem_object *obj)430i915_gem_object_is_tiled(const struct drm_i915_gem_object *obj)
431{431{
432 return i915_gem_object_get_tiling(obj) != I915_TILING_NONE;432 return i915_gem_object_get_tiling(obj) != I915_TILING_NONE;
433}433}
434 434
435static inline unsigned int435static inline unsigned int
436i915_gem_object_get_stride(struct drm_i915_gem_object *obj)436i915_gem_object_get_stride(const struct drm_i915_gem_object *obj)
437{437{
438 return obj->tiling_and_stride & STRIDE_MASK;438 return obj->tiling_and_stride & STRIDE_MASK;
439}439}
@@ -446,13 +446,13 @@ i915_gem_tile_height(unsigned int tiling) · 6 unmodified lines
446}446}
447 447
448static inline unsigned int448static inline unsigned int
449i915_gem_object_get_tile_height(struct drm_i915_gem_object *obj)449i915_gem_object_get_tile_height(const struct drm_i915_gem_object *obj)
450{450{
451 return i915_gem_tile_height(i915_gem_object_get_tiling(obj));451 return i915_gem_tile_height(i915_gem_object_get_tiling(obj));
452}452}
453 453
454static inline unsigned int454static inline unsigned int
455i915_gem_object_get_tile_row_size(struct drm_i915_gem_object *obj)455i915_gem_object_get_tile_row_size(const struct drm_i915_gem_object *obj)
456{456{
457 return (i915_gem_object_get_stride(obj) *457 return (i915_gem_object_get_stride(obj) *
458 i915_gem_object_get_tile_height(obj));458 i915_gem_object_get_tile_height(obj));
drivers/gpu/drm/i915/i915_irq.c+26−10
@@ -478,7 +478,7 @@ void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv) · 477 unmodified lines
478void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)478void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)
479{479{
480 spin_lock_irq(&dev_priv->irq_lock);480 spin_lock_irq(&dev_priv->irq_lock);
481 gen6_reset_pm_iir(dev_priv, dev_priv->pm_rps_events);481 gen6_reset_pm_iir(dev_priv, GEN6_PM_RPS_EVENTS);
482 dev_priv->gt_pm.rps.pm_iir = 0;482 dev_priv->gt_pm.rps.pm_iir = 0;
483 spin_unlock_irq(&dev_priv->irq_lock);483 spin_unlock_irq(&dev_priv->irq_lock);
484}484}
@@ -516,7 +516,7 @@ void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv) · 31 unmodified lines
516 516
517 I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0u));517 I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0u));
518 518
519 gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events);519 gen6_disable_pm_irq(dev_priv, GEN6_PM_RPS_EVENTS);
520 520
521 spin_unlock_irq(&dev_priv->irq_lock);521 spin_unlock_irq(&dev_priv->irq_lock);
522 synchronize_irq(dev_priv->drm.irq);522 synchronize_irq(dev_priv->drm.irq);
@@ -1534,11 +1534,8 @@ static void gen8_gt_irq_ack(struct drm_i915_private *i915, · 1011 unmodified lines
1534 1534
1535 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {1535 if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1536 gt_iir[2] = raw_reg_read(regs, GEN8_GT_IIR(2));1536 gt_iir[2] = raw_reg_read(regs, GEN8_GT_IIR(2));
1537 if (likely(gt_iir[2] & (i915->pm_rps_events |1537 if (likely(gt_iir[2]))
1538 i915->pm_guc_events)))1538 raw_reg_write(regs, GEN8_GT_IIR(2), gt_iir[2]);
1539 raw_reg_write(regs, GEN8_GT_IIR(2),
1540 gt_iir[2] & (i915->pm_rps_events |
1541 i915->pm_guc_events));
1542 }1539 }
1543 1540
1544 if (master_ctl & GEN8_GT_VECS_IRQ) {1541 if (master_ctl & GEN8_GT_VECS_IRQ) {
@@ -3218,7 +3215,7 @@ static void i915_reset_device(struct drm_i915_private *dev_priv, · 1673 unmodified lines
3218 kobject_uevent_env(kobj, KOBJ_CHANGE, reset_done_event);3215 kobject_uevent_env(kobj, KOBJ_CHANGE, reset_done_event);
3219}3216}
3220 3217
3221static void i915_clear_error_registers(struct drm_i915_private *dev_priv)3218void i915_clear_error_registers(struct drm_i915_private *dev_priv)
3222{3219{
3223 u32 eir;3220 u32 eir;
3224 3221
@@ -3241,6 +3238,22 @@ static void i915_clear_error_registers(struct drm_i915_private *dev_priv) · 16 unmodified lines
3241 I915_WRITE(EMR, I915_READ(EMR) | eir);3238 I915_WRITE(EMR, I915_READ(EMR) | eir);
3242 I915_WRITE(IIR, I915_MASTER_ERROR_INTERRUPT);3239 I915_WRITE(IIR, I915_MASTER_ERROR_INTERRUPT);
3243 }3240 }
3241
3242 if (INTEL_GEN(dev_priv) >= 8) {
3243 I915_WRITE(GEN8_RING_FAULT_REG,
3244 I915_READ(GEN8_RING_FAULT_REG) & ~RING_FAULT_VALID);
3245 POSTING_READ(GEN8_RING_FAULT_REG);
3246 } else if (INTEL_GEN(dev_priv) >= 6) {
3247 struct intel_engine_cs *engine;
3248 enum intel_engine_id id;
3249
3250 for_each_engine(engine, dev_priv, id) {
3251 I915_WRITE(RING_FAULT_REG(engine),
3252 I915_READ(RING_FAULT_REG(engine)) &
3253 ~RING_FAULT_VALID);
3254 }
3255 POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
3256 }
3244}3257}
3245 3258
3246/**3259/**
@@ -3296,7 +3309,8 @@ void i915_handle_error(struct drm_i915_private *dev_priv, · 49 unmodified lines
3296 * Try engine reset when available. We fall back to full reset if3309 * Try engine reset when available. We fall back to full reset if
3297 * single reset fails.3310 * single reset fails.
3298 */3311 */
3299 if (intel_has_reset_engine(dev_priv)) {3312 if (intel_has_reset_engine(dev_priv) &&
3313 !i915_terminally_wedged(&dev_priv->gpu_error)) {
3300 for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {3314 for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
3301 BUILD_BUG_ON(I915_RESET_MODESET >= I915_RESET_ENGINE);3315 BUILD_BUG_ON(I915_RESET_MODESET >= I915_RESET_ENGINE);
3302 if (test_and_set_bit(I915_RESET_ENGINE + engine->id,3316 if (test_and_set_bit(I915_RESET_ENGINE + engine->id,
@@ -4781,7 +4795,9 @@ void intel_irq_init(struct drm_i915_private *dev_priv) · 1478 unmodified lines
4781 /* WaGsvRC0ResidencyMethod:vlv */4795 /* WaGsvRC0ResidencyMethod:vlv */
4782 dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;4796 dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;
4783 else4797 else
4784 dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;4798 dev_priv->pm_rps_events = (GEN6_PM_RP_UP_THRESHOLD |
4799 GEN6_PM_RP_DOWN_THRESHOLD |
4800 GEN6_PM_RP_DOWN_TIMEOUT);
4785 4801
4786 rps->pm_intrmsk_mbz = 0;4802 rps->pm_intrmsk_mbz = 0;
4787 4803
drivers/gpu/drm/i915/i915_pci.c+11−5
@@ -74,6 +74,7 @@ · 73 unmodified lines
74 .unfenced_needs_alignment = 1, \74 .unfenced_needs_alignment = 1, \
75 .ring_mask = RENDER_RING, \75 .ring_mask = RENDER_RING, \
76 .has_snoop = true, \76 .has_snoop = true, \
77 .has_coherent_ggtt = false, \
77 GEN_DEFAULT_PIPEOFFSETS, \78 GEN_DEFAULT_PIPEOFFSETS, \
78 GEN_DEFAULT_PAGE_SIZES, \79 GEN_DEFAULT_PAGE_SIZES, \
79 CURSOR_OFFSETS80 CURSOR_OFFSETS
@@ -110,6 +111,7 @@ static const struct intel_device_info intel_i865g_info = { · 30 unmodified lines
110 .has_gmch_display = 1, \111 .has_gmch_display = 1, \
111 .ring_mask = RENDER_RING, \112 .ring_mask = RENDER_RING, \
112 .has_snoop = true, \113 .has_snoop = true, \
114 .has_coherent_ggtt = true, \
113 GEN_DEFAULT_PIPEOFFSETS, \115 GEN_DEFAULT_PIPEOFFSETS, \
114 GEN_DEFAULT_PAGE_SIZES, \116 GEN_DEFAULT_PAGE_SIZES, \
115 CURSOR_OFFSETS117 CURSOR_OFFSETS
@@ -117,6 +119,7 @@ static const struct intel_device_info intel_i865g_info = { · 1 unmodified line
117static const struct intel_device_info intel_i915g_info = {119static const struct intel_device_info intel_i915g_info = {
118 GEN3_FEATURES,120 GEN3_FEATURES,
119 PLATFORM(INTEL_I915G),121 PLATFORM(INTEL_I915G),
122 .has_coherent_ggtt = false,
120 .cursor_needs_physical = 1,123 .cursor_needs_physical = 1,
121 .has_overlay = 1, .overlay_needs_physical = 1,124 .has_overlay = 1, .overlay_needs_physical = 1,
122 .hws_needs_physical = 1,125 .hws_needs_physical = 1,
@@ -178,6 +181,7 @@ static const struct intel_device_info intel_pineview_info = { · 55 unmodified lines
178 .has_gmch_display = 1, \181 .has_gmch_display = 1, \
179 .ring_mask = RENDER_RING, \182 .ring_mask = RENDER_RING, \
180 .has_snoop = true, \183 .has_snoop = true, \
184 .has_coherent_ggtt = true, \
181 GEN_DEFAULT_PIPEOFFSETS, \185 GEN_DEFAULT_PIPEOFFSETS, \
182 GEN_DEFAULT_PAGE_SIZES, \186 GEN_DEFAULT_PAGE_SIZES, \
183 CURSOR_OFFSETS187 CURSOR_OFFSETS
@@ -220,6 +224,7 @@ static const struct intel_device_info intel_gm45_info = { · 36 unmodified lines
220 .has_hotplug = 1, \224 .has_hotplug = 1, \
221 .ring_mask = RENDER_RING | BSD_RING, \225 .ring_mask = RENDER_RING | BSD_RING, \
222 .has_snoop = true, \226 .has_snoop = true, \
227 .has_coherent_ggtt = true, \
223 /* ilk does support rc6, but we do not implement [power] contexts */ \228 /* ilk does support rc6, but we do not implement [power] contexts */ \
224 .has_rc6 = 0, \229 .has_rc6 = 0, \
225 GEN_DEFAULT_PIPEOFFSETS, \230 GEN_DEFAULT_PIPEOFFSETS, \
@@ -243,6 +248,7 @@ static const struct intel_device_info intel_ironlake_m_info = { · 17 unmodified lines
243 .has_hotplug = 1, \248 .has_hotplug = 1, \
244 .has_fbc = 1, \249 .has_fbc = 1, \
245 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \250 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \
251 .has_coherent_ggtt = true, \
246 .has_llc = 1, \252 .has_llc = 1, \
247 .has_rc6 = 1, \253 .has_rc6 = 1, \
248 .has_rc6p = 1, \254 .has_rc6p = 1, \
@@ -287,6 +293,7 @@ static const struct intel_device_info intel_sandybridge_m_gt2_info = { · 38 unmodified lines
287 .has_hotplug = 1, \293 .has_hotplug = 1, \
288 .has_fbc = 1, \294 .has_fbc = 1, \
289 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \295 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \
296 .has_coherent_ggtt = true, \
290 .has_llc = 1, \297 .has_llc = 1, \
291 .has_rc6 = 1, \298 .has_rc6 = 1, \
292 .has_rc6p = 1, \299 .has_rc6p = 1, \
@@ -347,6 +354,7 @@ static const struct intel_device_info intel_valleyview_info = { · 54 unmodified lines
347 .has_aliasing_ppgtt = 1,354 .has_aliasing_ppgtt = 1,
348 .has_full_ppgtt = 1,355 .has_full_ppgtt = 1,
349 .has_snoop = true,356 .has_snoop = true,
357 .has_coherent_ggtt = false,
350 .ring_mask = RENDER_RING | BSD_RING | BLT_RING,358 .ring_mask = RENDER_RING | BSD_RING | BLT_RING,
351 .display_mmio_offset = VLV_DISPLAY_BASE,359 .display_mmio_offset = VLV_DISPLAY_BASE,
352 GEN_DEFAULT_PAGE_SIZES,360 GEN_DEFAULT_PAGE_SIZES,
@@ -360,7 +368,6 @@ static const struct intel_device_info intel_valleyview_info = { · 7 unmodified lines
360 .has_ddi = 1, \368 .has_ddi = 1, \
361 .has_fpga_dbg = 1, \369 .has_fpga_dbg = 1, \
362 .has_psr = 1, \370 .has_psr = 1, \
363 .has_resource_streamer = 1, \
364 .has_dp_mst = 1, \371 .has_dp_mst = 1, \
365 .has_rc6p = 0 /* RC6p removed-by HSW */, \372 .has_rc6p = 0 /* RC6p removed-by HSW */, \
366 .has_runtime_pm = 1373 .has_runtime_pm = 1
@@ -433,7 +440,6 @@ static const struct intel_device_info intel_cherryview_info = { · 66 unmodified lines
433 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,440 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
434 .has_64bit_reloc = 1,441 .has_64bit_reloc = 1,
435 .has_runtime_pm = 1,442 .has_runtime_pm = 1,
436 .has_resource_streamer = 1,
437 .has_rc6 = 1,443 .has_rc6 = 1,
438 .has_logical_ring_contexts = 1,444 .has_logical_ring_contexts = 1,
439 .has_gmch_display = 1,445 .has_gmch_display = 1,
@@ -441,6 +447,7 @@ static const struct intel_device_info intel_cherryview_info = { · 1 unmodified line
441 .has_full_ppgtt = 1,447 .has_full_ppgtt = 1,
442 .has_reset_engine = 1,448 .has_reset_engine = 1,
443 .has_snoop = true,449 .has_snoop = true,
450 .has_coherent_ggtt = false,
444 .display_mmio_offset = VLV_DISPLAY_BASE,451 .display_mmio_offset = VLV_DISPLAY_BASE,
445 GEN_DEFAULT_PAGE_SIZES,452 GEN_DEFAULT_PAGE_SIZES,
446 GEN_CHV_PIPEOFFSETS,453 GEN_CHV_PIPEOFFSETS,
@@ -506,7 +513,6 @@ static const struct intel_device_info intel_skylake_gt4_info = { · 59 unmodified lines
506 .has_runtime_pm = 1, \513 .has_runtime_pm = 1, \
507 .has_pooled_eu = 0, \514 .has_pooled_eu = 0, \
508 .has_csr = 1, \515 .has_csr = 1, \
509 .has_resource_streamer = 1, \
510 .has_rc6 = 1, \516 .has_rc6 = 1, \
511 .has_dp_mst = 1, \517 .has_dp_mst = 1, \
512 .has_logical_ring_contexts = 1, \518 .has_logical_ring_contexts = 1, \
@@ -517,6 +523,7 @@ static const struct intel_device_info intel_skylake_gt4_info = { · 4 unmodified lines
517 .has_full_48bit_ppgtt = 1, \523 .has_full_48bit_ppgtt = 1, \
518 .has_reset_engine = 1, \524 .has_reset_engine = 1, \
519 .has_snoop = true, \525 .has_snoop = true, \
526 .has_coherent_ggtt = false, \
520 .has_ipc = 1, \527 .has_ipc = 1, \
521 GEN9_DEFAULT_PAGE_SIZES, \528 GEN9_DEFAULT_PAGE_SIZES, \
522 GEN_DEFAULT_PIPEOFFSETS, \529 GEN_DEFAULT_PIPEOFFSETS, \
@@ -580,6 +587,7 @@ static const struct intel_device_info intel_coffeelake_gt3_info = { · 57 unmodified lines
580 GEN9_FEATURES, \587 GEN9_FEATURES, \
581 GEN(10), \588 GEN(10), \
582 .ddb_size = 1024, \589 .ddb_size = 1024, \
590 .has_coherent_ggtt = false, \
583 GLK_COLORS591 GLK_COLORS
584 592
585static const struct intel_device_info intel_cannonlake_info = {593static const struct intel_device_info intel_cannonlake_info = {
@@ -592,14 +600,12 @@ static const struct intel_device_info intel_cannonlake_info = { · 6 unmodified lines
592 GEN10_FEATURES, \600 GEN10_FEATURES, \
593 GEN(11), \601 GEN(11), \
594 .ddb_size = 2048, \602 .ddb_size = 2048, \
595 .has_csr = 0, \
596 .has_logical_ring_elsq = 1603 .has_logical_ring_elsq = 1
597 604
598static const struct intel_device_info intel_icelake_11_info = {605static const struct intel_device_info intel_icelake_11_info = {
599 GEN11_FEATURES,606 GEN11_FEATURES,
600 PLATFORM(INTEL_ICELAKE),607 PLATFORM(INTEL_ICELAKE),
601 .is_alpha_support = 1,608 .is_alpha_support = 1,
602 .has_resource_streamer = 0,
603 .ring_mask = RENDER_RING | BLT_RING | VEBOX_RING | BSD_RING | BSD3_RING,609 .ring_mask = RENDER_RING | BLT_RING | VEBOX_RING | BSD_RING | BSD3_RING,
604};610};
605 611
drivers/gpu/drm/i915/i915_perf.c+24−31
@@ -210,6 +210,7 @@ · 209 unmodified lines
210#include "i915_oa_cflgt3.h"210#include "i915_oa_cflgt3.h"
211#include "i915_oa_cnl.h"211#include "i915_oa_cnl.h"
212#include "i915_oa_icl.h"212#include "i915_oa_icl.h"
213#include "intel_lrc_reg.h"
213 214
214/* HW requires this to be a power of two, between 128k and 16M, though driver215/* HW requires this to be a power of two, between 128k and 16M, though driver
215 * is currently generally designed assuming the largest 16M size is used such216 * is currently generally designed assuming the largest 16M size is used such
@@ -1338,14 +1339,12 @@ free_oa_buffer(struct drm_i915_private *i915) · 1122 unmodified lines
1338{1339{
1339 mutex_lock(&i915->drm.struct_mutex);1340 mutex_lock(&i915->drm.struct_mutex);
1340 1341
1341 i915_gem_object_unpin_map(i915->perf.oa.oa_buffer.vma->obj);1342 i915_vma_unpin_and_release(&i915->perf.oa.oa_buffer.vma,
1342 i915_vma_unpin(i915->perf.oa.oa_buffer.vma);1343 I915_VMA_RELEASE_MAP);
1343 i915_gem_object_put(i915->perf.oa.oa_buffer.vma->obj);
1344
1345 i915->perf.oa.oa_buffer.vma = NULL;
1346 i915->perf.oa.oa_buffer.vaddr = NULL;
1347 1344
1348 mutex_unlock(&i915->drm.struct_mutex);1345 mutex_unlock(&i915->drm.struct_mutex);
1346
1347 i915->perf.oa.oa_buffer.vaddr = NULL;
1349}1348}
1350 1349
1351static void i915_oa_stream_destroy(struct i915_perf_stream *stream)1350static void i915_oa_stream_destroy(struct i915_perf_stream *stream)
@@ -1638,27 +1637,25 @@ static void gen8_update_reg_state_unlocked(struct i915_gem_context *ctx, · 286 unmodified lines
1638 u32 ctx_oactxctrl = dev_priv->perf.oa.ctx_oactxctrl_offset;1637 u32 ctx_oactxctrl = dev_priv->perf.oa.ctx_oactxctrl_offset;
1639 u32 ctx_flexeu0 = dev_priv->perf.oa.ctx_flexeu0_offset;1638 u32 ctx_flexeu0 = dev_priv->perf.oa.ctx_flexeu0_offset;
1640 /* The MMIO offsets for Flex EU registers aren't contiguous */1639 /* The MMIO offsets for Flex EU registers aren't contiguous */
1641 u32 flex_mmio[] = {1640 i915_reg_t flex_regs[] = {
1642 i915_mmio_reg_offset(EU_PERF_CNTL0),1641 EU_PERF_CNTL0,
1643 i915_mmio_reg_offset(EU_PERF_CNTL1),1642 EU_PERF_CNTL1,
1644 i915_mmio_reg_offset(EU_PERF_CNTL2),1643 EU_PERF_CNTL2,
1645 i915_mmio_reg_offset(EU_PERF_CNTL3),1644 EU_PERF_CNTL3,
1646 i915_mmio_reg_offset(EU_PERF_CNTL4),1645 EU_PERF_CNTL4,
1647 i915_mmio_reg_offset(EU_PERF_CNTL5),1646 EU_PERF_CNTL5,
1648 i915_mmio_reg_offset(EU_PERF_CNTL6),1647 EU_PERF_CNTL6,
1649 };1648 };
1650 int i;1649 int i;
1651 1650
1652 reg_state[ctx_oactxctrl] = i915_mmio_reg_offset(GEN8_OACTXCONTROL);1651 CTX_REG(reg_state, ctx_oactxctrl, GEN8_OACTXCONTROL,
1653 reg_state[ctx_oactxctrl+1] = (dev_priv->perf.oa.period_exponent <<1652 (dev_priv->perf.oa.period_exponent << GEN8_OA_TIMER_PERIOD_SHIFT) |
1654 GEN8_OA_TIMER_PERIOD_SHIFT) |1653 (dev_priv->perf.oa.periodic ? GEN8_OA_TIMER_ENABLE : 0) |
1655 (dev_priv->perf.oa.periodic ?1654 GEN8_OA_COUNTER_RESUME);
1656 GEN8_OA_TIMER_ENABLE : 0) |
1657 GEN8_OA_COUNTER_RESUME;
1658 1655
1659 for (i = 0; i < ARRAY_SIZE(flex_mmio); i++) {1656 for (i = 0; i < ARRAY_SIZE(flex_regs); i++) {
1660 u32 state_offset = ctx_flexeu0 + i * 2;1657 u32 state_offset = ctx_flexeu0 + i * 2;
1661 u32 mmio = flex_mmio[i];1658 u32 mmio = i915_mmio_reg_offset(flex_regs[i]);
1662 1659
1663 /*1660 /*
1664 * This arbitrary default will select the 'EU FPU0 Pipeline1661 * This arbitrary default will select the 'EU FPU0 Pipeline
@@ -1678,8 +1675,7 @@ static void gen8_update_reg_state_unlocked(struct i915_gem_context *ctx, · 13 unmodified lines
1678 }1675 }
1679 }1676 }
1680 1677
1681 reg_state[state_offset] = mmio;1678 CTX_REG(reg_state, state_offset, flex_regs[i], value);
1682 reg_state[state_offset+1] = value;
1683 }1679 }
1684}1680}
1685 1681
@@ -1821,7 +1817,7 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, · 135 unmodified lines
1821 /* Switch away from any user context. */1817 /* Switch away from any user context. */
1822 ret = gen8_switch_to_updated_kernel_context(dev_priv, oa_config);1818 ret = gen8_switch_to_updated_kernel_context(dev_priv, oa_config);
1823 if (ret)1819 if (ret)
1824 goto out;1820 return ret;
1825 1821
1826 /*1822 /*
1827 * The OA register config is setup through the context image. This image1823 * The OA register config is setup through the context image. This image
@@ -1840,7 +1836,7 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, · 12 unmodified lines
1840 wait_flags,1836 wait_flags,
1841 MAX_SCHEDULE_TIMEOUT);1837 MAX_SCHEDULE_TIMEOUT);
1842 if (ret)1838 if (ret)
1843 goto out;1839 return ret;
1844 1840
1845 /* Update all contexts now that we've stalled the submission. */1841 /* Update all contexts now that we've stalled the submission. */
1846 list_for_each_entry(ctx, &dev_priv->contexts.list, link) {1842 list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
@@ -1852,10 +1848,8 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, · 5 unmodified lines
1852 continue;1848 continue;
1853 1849
1854 regs = i915_gem_object_pin_map(ce->state->obj, I915_MAP_WB);1850 regs = i915_gem_object_pin_map(ce->state->obj, I915_MAP_WB);
1855 if (IS_ERR(regs)) {1851 if (IS_ERR(regs))
1856 ret = PTR_ERR(regs);1852 return PTR_ERR(regs);
1857 goto out;
1858 }
1859 1853
1860 ce->state->obj->mm.dirty = true;1854 ce->state->obj->mm.dirty = true;
1861 regs += LRC_STATE_PN * PAGE_SIZE / sizeof(*regs);1855 regs += LRC_STATE_PN * PAGE_SIZE / sizeof(*regs);
@@ -1865,7 +1859,6 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, · 3 unmodified lines
1865 i915_gem_object_unpin_map(ce->state->obj);1859 i915_gem_object_unpin_map(ce->state->obj);
1866 }1860 }
1867 1861
1868 out:
1869 return ret;1862 return ret;
1870}1863}
1871 1864
drivers/gpu/drm/i915/i915_reg.h+387−340
@@ -344,6 +344,8 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) · 343 unmodified lines
344#define GEN8_RPCS_S_CNT_ENABLE (1 << 18)344#define GEN8_RPCS_S_CNT_ENABLE (1 << 18)
345#define GEN8_RPCS_S_CNT_SHIFT 15345#define GEN8_RPCS_S_CNT_SHIFT 15
346#define GEN8_RPCS_S_CNT_MASK (0x7 << GEN8_RPCS_S_CNT_SHIFT)346#define GEN8_RPCS_S_CNT_MASK (0x7 << GEN8_RPCS_S_CNT_SHIFT)
347#define GEN11_RPCS_S_CNT_SHIFT 12
348#define GEN11_RPCS_S_CNT_MASK (0x3f << GEN11_RPCS_S_CNT_SHIFT)
347#define GEN8_RPCS_SS_CNT_ENABLE (1 << 11)349#define GEN8_RPCS_SS_CNT_ENABLE (1 << 11)
348#define GEN8_RPCS_SS_CNT_SHIFT 8350#define GEN8_RPCS_SS_CNT_SHIFT 8
349#define GEN8_RPCS_SS_CNT_MASK (0x7 << GEN8_RPCS_SS_CNT_SHIFT)351#define GEN8_RPCS_SS_CNT_MASK (0x7 << GEN8_RPCS_SS_CNT_SHIFT)
@@ -1029,126 +1031,43 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) · 679 unmodified lines
1029/*1031/*
1030 * i915_power_well_id:1032 * i915_power_well_id:
1031 *1033 *
1032 * Platform specific IDs used to look up power wells and - except for custom1034 * IDs used to look up power wells. Power wells accessed directly bypassing
1033 * power wells - to define request/status register flag bit positions. As such1035 * the power domains framework must be assigned a unique ID. The rest of power
1034 * the set of IDs on a given platform must be unique and except for custom1036 * wells must be assigned DISP_PW_ID_NONE.
1035 * power wells their value must stay fixed.
1036 */1037 */
1037enum i915_power_well_id {1038enum i915_power_well_id {
1038 /*1039 DISP_PW_ID_NONE,
1039 * I8301040
1040 * - custom power well1041 VLV_DISP_PW_DISP2D,
1041 */1042 BXT_DISP_PW_DPIO_CMN_A,
1042 I830_DISP_PW_PIPES = 0,1043 VLV_DISP_PW_DPIO_CMN_BC,
1043 1044 GLK_DISP_PW_DPIO_CMN_C,
1044 /*1045 CHV_DISP_PW_DPIO_CMN_D,
1045 * VLV/CHV1046 HSW_DISP_PW_GLOBAL,
1046 * - PUNIT_REG_PWRGT_CTRL (bit: id*2),1047 SKL_DISP_PW_MISC_IO,
1047 * PUNIT_REG_PWRGT_STATUS (bit: id*2) (PUNIT HAS v0.8)1048 SKL_DISP_PW_1,
1048 */
1049 PUNIT_POWER_WELL_RENDER = 0,
1050 PUNIT_POWER_WELL_MEDIA = 1,
1051 PUNIT_POWER_WELL_DISP2D = 3,
1052 PUNIT_POWER_WELL_DPIO_CMN_BC = 5,
1053 PUNIT_POWER_WELL_DPIO_TX_B_LANES_01 = 6,
1054 PUNIT_POWER_WELL_DPIO_TX_B_LANES_23 = 7,
1055 PUNIT_POWER_WELL_DPIO_TX_C_LANES_01 = 8,
1056 PUNIT_POWER_WELL_DPIO_TX_C_LANES_23 = 9,
1057 PUNIT_POWER_WELL_DPIO_RX0 = 10,
1058 PUNIT_POWER_WELL_DPIO_RX1 = 11,
1059 PUNIT_POWER_WELL_DPIO_CMN_D = 12,
1060 /* - custom power well */
1061 CHV_DISP_PW_PIPE_A, /* 13 */
1062
1063 /*
1064 * HSW/BDW
1065 * - _HSW_PWR_WELL_CTL1-4 (status bit: id*2, req bit: id*2+1)
1066 */
1067 HSW_DISP_PW_GLOBAL = 15,
1068
1069 /*
1070 * GEN9+
1071 * - _HSW_PWR_WELL_CTL1-4 (status bit: id*2, req bit: id*2+1)
1072 */
1073 SKL_DISP_PW_MISC_IO = 0,
1074 SKL_DISP_PW_DDI_A_E,
1075 GLK_DISP_PW_DDI_A = SKL_DISP_PW_DDI_A_E,
1076 CNL_DISP_PW_DDI_A = SKL_DISP_PW_DDI_A_E,
1077 SKL_DISP_PW_DDI_B,
1078 SKL_DISP_PW_DDI_C,
1079 SKL_DISP_PW_DDI_D,
1080 CNL_DISP_PW_DDI_F = 6,
1081
1082 GLK_DISP_PW_AUX_A = 8,
1083 GLK_DISP_PW_AUX_B,
1084 GLK_DISP_PW_AUX_C,
1085 CNL_DISP_PW_AUX_A = GLK_DISP_PW_AUX_A,
1086 CNL_DISP_PW_AUX_B = GLK_DISP_PW_AUX_B,
1087 CNL_DISP_PW_AUX_C = GLK_DISP_PW_AUX_C,
1088 CNL_DISP_PW_AUX_D,
1089 CNL_DISP_PW_AUX_F,
1090
1091 SKL_DISP_PW_1 = 14,
1092 SKL_DISP_PW_2,1049 SKL_DISP_PW_2,
1093
1094 /* - custom power wells */
1095 BXT_DPIO_CMN_A,
1096 BXT_DPIO_CMN_BC,
1097 GLK_DPIO_CMN_C, /* 18 */
1098
1099 /*
1100 * GEN11+
1101 * - _HSW_PWR_WELL_CTL1-4
1102 * (status bit: (id&15)*2, req bit:(id&15)*2+1)
1103 */
1104 ICL_DISP_PW_1 = 0,
1105 ICL_DISP_PW_2,
1106 ICL_DISP_PW_3,
1107 ICL_DISP_PW_4,
1108
1109 /*
1110 * - _HSW_PWR_WELL_CTL_AUX1/2/4
1111 * (status bit: (id&15)*2, req bit:(id&15)*2+1)
1112 */
1113 ICL_DISP_PW_AUX_A = 16,
1114 ICL_DISP_PW_AUX_B,
1115 ICL_DISP_PW_AUX_C,
1116 ICL_DISP_PW_AUX_D,
1117 ICL_DISP_PW_AUX_E,
1118 ICL_DISP_PW_AUX_F,
1119
1120 ICL_DISP_PW_AUX_TBT1 = 24,
1121 ICL_DISP_PW_AUX_TBT2,
1122 ICL_DISP_PW_AUX_TBT3,
1123 ICL_DISP_PW_AUX_TBT4,
1124
1125 /*
1126 * - _HSW_PWR_WELL_CTL_DDI1/2/4
1127 * (status bit: (id&15)*2, req bit:(id&15)*2+1)
1128 */
1129 ICL_DISP_PW_DDI_A = 32,
1130 ICL_DISP_PW_DDI_B,
1131 ICL_DISP_PW_DDI_C,
1132 ICL_DISP_PW_DDI_D,
1133 ICL_DISP_PW_DDI_E,
1134 ICL_DISP_PW_DDI_F, /* 37 */
1135
1136 /*
1137 * Multiple platforms.
1138 * Must start following the highest ID of any platform.
1139 * - custom power wells
1140 */
1141 SKL_DISP_PW_DC_OFF = 38,
1142 I915_DISP_PW_ALWAYS_ON,
1143};1050};
1144 1051
1145#define PUNIT_REG_PWRGT_CTRL 0x601052#define PUNIT_REG_PWRGT_CTRL 0x60
1146#define PUNIT_REG_PWRGT_STATUS 0x611053#define PUNIT_REG_PWRGT_STATUS 0x61
1147#define PUNIT_PWRGT_MASK(power_well) (3 << ((power_well) * 2))1054#define PUNIT_PWRGT_MASK(pw_idx) (3 << ((pw_idx) * 2))
1148#define PUNIT_PWRGT_PWR_ON(power_well) (0 << ((power_well) * 2))1055#define PUNIT_PWRGT_PWR_ON(pw_idx) (0 << ((pw_idx) * 2))
1149#define PUNIT_PWRGT_CLK_GATE(power_well) (1 << ((power_well) * 2))1056#define PUNIT_PWRGT_CLK_GATE(pw_idx) (1 << ((pw_idx) * 2))
1150#define PUNIT_PWRGT_RESET(power_well) (2 << ((power_well) * 2))1057#define PUNIT_PWRGT_RESET(pw_idx) (2 << ((pw_idx) * 2))
1151#define PUNIT_PWRGT_PWR_GATE(power_well) (3 << ((power_well) * 2))1058#define PUNIT_PWRGT_PWR_GATE(pw_idx) (3 << ((pw_idx) * 2))
1059
1060#define PUNIT_PWGT_IDX_RENDER 0
1061#define PUNIT_PWGT_IDX_MEDIA 1
1062#define PUNIT_PWGT_IDX_DISP2D 3
1063#define PUNIT_PWGT_IDX_DPIO_CMN_BC 5
1064#define PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01 6
1065#define PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23 7
1066#define PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01 8
1067#define PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23 9
1068#define PUNIT_PWGT_IDX_DPIO_RX0 10
1069#define PUNIT_PWGT_IDX_DPIO_RX1 11
1070#define PUNIT_PWGT_IDX_DPIO_CMN_D 12
1152 1071
1153#define PUNIT_REG_GPU_LFM 0xd31072#define PUNIT_REG_GPU_LFM 0xd3
1154#define PUNIT_REG_GPU_FREQ_REQ 0xd41073#define PUNIT_REG_GPU_FREQ_REQ 0xd4
@@ -1932,121 +1851,200 @@ enum i915_power_well_id { · 777 unmodified lines
1932#define N_SCALAR(x) ((x) << 24)1851#define N_SCALAR(x) ((x) << 24)
1933#define N_SCALAR_MASK (0x7F << 24)1852#define N_SCALAR_MASK (0x7F << 24)
1934 1853
1935#define _ICL_MG_PHY_PORT_LN(port, ln, ln0p1, ln0p2, ln1p1) \1854#define MG_PHY_PORT_LN(port, ln, ln0p1, ln0p2, ln1p1) \
1936 _MMIO(_PORT((port) - PORT_C, ln0p1, ln0p2) + (ln) * ((ln1p1) - (ln0p1)))1855 _MMIO(_PORT((port) - PORT_C, ln0p1, ln0p2) + (ln) * ((ln1p1) - (ln0p1)))
1937 1856
1938#define _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT1 0x16812C1857#define MG_TX_LINK_PARAMS_TX1LN0_PORT1 0x16812C
1939#define _ICL_MG_TX_LINK_PARAMS_TX1LN1_PORT1 0x16852C1858#define MG_TX_LINK_PARAMS_TX1LN1_PORT1 0x16852C
1940#define _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT2 0x16912C1859#define MG_TX_LINK_PARAMS_TX1LN0_PORT2 0x16912C
1941#define _ICL_MG_TX_LINK_PARAMS_TX1LN1_PORT2 0x16952C1860#define MG_TX_LINK_PARAMS_TX1LN1_PORT2 0x16952C
1942#define _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT3 0x16A12C1861#define MG_TX_LINK_PARAMS_TX1LN0_PORT3 0x16A12C
1943#define _ICL_MG_TX_LINK_PARAMS_TX1LN1_PORT3 0x16A52C1862#define MG_TX_LINK_PARAMS_TX1LN1_PORT3 0x16A52C
1944#define _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT4 0x16B12C1863#define MG_TX_LINK_PARAMS_TX1LN0_PORT4 0x16B12C
1945#define _ICL_MG_TX_LINK_PARAMS_TX1LN1_PORT4 0x16B52C1864#define MG_TX_LINK_PARAMS_TX1LN1_PORT4 0x16B52C
1946#define ICL_PORT_MG_TX1_LINK_PARAMS(port, ln) \1865#define MG_TX1_LINK_PARAMS(port, ln) \
1947 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT1, \1866 MG_PHY_PORT_LN(port, ln, MG_TX_LINK_PARAMS_TX1LN0_PORT1, \
1948 _ICL_MG_TX_LINK_PARAMS_TX1LN0_PORT2, \1867 MG_TX_LINK_PARAMS_TX1LN0_PORT2, \
1949 _ICL_MG_TX_LINK_PARAMS_TX1LN1_PORT1)1868 MG_TX_LINK_PARAMS_TX1LN1_PORT1)
1950 1869
1951#define _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT1 0x1680AC1870#define MG_TX_LINK_PARAMS_TX2LN0_PORT1 0x1680AC
1952#define _ICL_MG_TX_LINK_PARAMS_TX2LN1_PORT1 0x1684AC1871#define MG_TX_LINK_PARAMS_TX2LN1_PORT1 0x1684AC
1953#define _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT2 0x1690AC1872#define MG_TX_LINK_PARAMS_TX2LN0_PORT2 0x1690AC
1954#define _ICL_MG_TX_LINK_PARAMS_TX2LN1_PORT2 0x1694AC1873#define MG_TX_LINK_PARAMS_TX2LN1_PORT2 0x1694AC
1955#define _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT3 0x16A0AC1874#define MG_TX_LINK_PARAMS_TX2LN0_PORT3 0x16A0AC
1956#define _ICL_MG_TX_LINK_PARAMS_TX2LN1_PORT3 0x16A4AC1875#define MG_TX_LINK_PARAMS_TX2LN1_PORT3 0x16A4AC
1957#define _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT4 0x16B0AC1876#define MG_TX_LINK_PARAMS_TX2LN0_PORT4 0x16B0AC
1958#define _ICL_MG_TX_LINK_PARAMS_TX2LN1_PORT4 0x16B4AC1877#define MG_TX_LINK_PARAMS_TX2LN1_PORT4 0x16B4AC
1959#define ICL_PORT_MG_TX2_LINK_PARAMS(port, ln) \1878#define MG_TX2_LINK_PARAMS(port, ln) \
1960 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT1, \1879 MG_PHY_PORT_LN(port, ln, MG_TX_LINK_PARAMS_TX2LN0_PORT1, \
1961 _ICL_MG_TX_LINK_PARAMS_TX2LN0_PORT2, \1880 MG_TX_LINK_PARAMS_TX2LN0_PORT2, \
1962 _ICL_MG_TX_LINK_PARAMS_TX2LN1_PORT1)1881 MG_TX_LINK_PARAMS_TX2LN1_PORT1)
1963#define CRI_USE_FS32 (1 << 5)1882#define CRI_USE_FS32 (1 << 5)
1964 1883
1965#define _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT1 0x16814C1884#define MG_TX_PISO_READLOAD_TX1LN0_PORT1 0x16814C
1966#define _ICL_MG_TX_PISO_READLOAD_TX1LN1_PORT1 0x16854C1885#define MG_TX_PISO_READLOAD_TX1LN1_PORT1 0x16854C
1967#define _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT2 0x16914C1886#define MG_TX_PISO_READLOAD_TX1LN0_PORT2 0x16914C
1968#define _ICL_MG_TX_PISO_READLOAD_TX1LN1_PORT2 0x16954C1887#define MG_TX_PISO_READLOAD_TX1LN1_PORT2 0x16954C
1969#define _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT3 0x16A14C1888#define MG_TX_PISO_READLOAD_TX1LN0_PORT3 0x16A14C
1970#define _ICL_MG_TX_PISO_READLOAD_TX1LN1_PORT3 0x16A54C1889#define MG_TX_PISO_READLOAD_TX1LN1_PORT3 0x16A54C
1971#define _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT4 0x16B14C1890#define MG_TX_PISO_READLOAD_TX1LN0_PORT4 0x16B14C
1972#define _ICL_MG_TX_PISO_READLOAD_TX1LN1_PORT4 0x16B54C1891#define MG_TX_PISO_READLOAD_TX1LN1_PORT4 0x16B54C
1973#define ICL_PORT_MG_TX1_PISO_READLOAD(port, ln) \1892#define MG_TX1_PISO_READLOAD(port, ln) \
1974 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT1, \1893 MG_PHY_PORT_LN(port, ln, MG_TX_PISO_READLOAD_TX1LN0_PORT1, \
1975 _ICL_MG_TX_PISO_READLOAD_TX1LN0_PORT2, \1894 MG_TX_PISO_READLOAD_TX1LN0_PORT2, \
1976 _ICL_MG_TX_PISO_READLOAD_TX1LN1_PORT1)1895 MG_TX_PISO_READLOAD_TX1LN1_PORT1)
1977 1896
1978#define _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT1 0x1680CC1897#define MG_TX_PISO_READLOAD_TX2LN0_PORT1 0x1680CC
1979#define _ICL_MG_TX_PISO_READLOAD_TX2LN1_PORT1 0x1684CC1898#define MG_TX_PISO_READLOAD_TX2LN1_PORT1 0x1684CC
1980#define _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT2 0x1690CC1899#define MG_TX_PISO_READLOAD_TX2LN0_PORT2 0x1690CC
1981#define _ICL_MG_TX_PISO_READLOAD_TX2LN1_PORT2 0x1694CC1900#define MG_TX_PISO_READLOAD_TX2LN1_PORT2 0x1694CC
1982#define _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT3 0x16A0CC1901#define MG_TX_PISO_READLOAD_TX2LN0_PORT3 0x16A0CC
1983#define _ICL_MG_TX_PISO_READLOAD_TX2LN1_PORT3 0x16A4CC1902#define MG_TX_PISO_READLOAD_TX2LN1_PORT3 0x16A4CC
1984#define _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT4 0x16B0CC1903#define MG_TX_PISO_READLOAD_TX2LN0_PORT4 0x16B0CC
1985#define _ICL_MG_TX_PISO_READLOAD_TX2LN1_PORT4 0x16B4CC1904#define MG_TX_PISO_READLOAD_TX2LN1_PORT4 0x16B4CC
1986#define ICL_PORT_MG_TX2_PISO_READLOAD(port, ln) \1905#define MG_TX2_PISO_READLOAD(port, ln) \
1987 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT1, \1906 MG_PHY_PORT_LN(port, ln, MG_TX_PISO_READLOAD_TX2LN0_PORT1, \
1988 _ICL_MG_TX_PISO_READLOAD_TX2LN0_PORT2, \1907 MG_TX_PISO_READLOAD_TX2LN0_PORT2, \
1989 _ICL_MG_TX_PISO_READLOAD_TX2LN1_PORT1)1908 MG_TX_PISO_READLOAD_TX2LN1_PORT1)
1990#define CRI_CALCINIT (1 << 1)1909#define CRI_CALCINIT (1 << 1)
1991 1910
1992#define _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT1 0x1681481911#define MG_TX_SWINGCTRL_TX1LN0_PORT1 0x168148
1993#define _ICL_MG_TX_SWINGCTRL_TX1LN1_PORT1 0x1685481912#define MG_TX_SWINGCTRL_TX1LN1_PORT1 0x168548
1994#define _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT2 0x1691481913#define MG_TX_SWINGCTRL_TX1LN0_PORT2 0x169148
1995#define _ICL_MG_TX_SWINGCTRL_TX1LN1_PORT2 0x1695481914#define MG_TX_SWINGCTRL_TX1LN1_PORT2 0x169548
1996#define _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT3 0x16A1481915#define MG_TX_SWINGCTRL_TX1LN0_PORT3 0x16A148
1997#define _ICL_MG_TX_SWINGCTRL_TX1LN1_PORT3 0x16A5481916#define MG_TX_SWINGCTRL_TX1LN1_PORT3 0x16A548
1998#define _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT4 0x16B1481917#define MG_TX_SWINGCTRL_TX1LN0_PORT4 0x16B148
1999#define _ICL_MG_TX_SWINGCTRL_TX1LN1_PORT4 0x16B5481918#define MG_TX_SWINGCTRL_TX1LN1_PORT4 0x16B548
2000#define ICL_PORT_MG_TX1_SWINGCTRL(port, ln) \1919#define MG_TX1_SWINGCTRL(port, ln) \
2001 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT1, \1920 MG_PHY_PORT_LN(port, ln, MG_TX_SWINGCTRL_TX1LN0_PORT1, \
2002 _ICL_MG_TX_SWINGCTRL_TX1LN0_PORT2, \1921 MG_TX_SWINGCTRL_TX1LN0_PORT2, \
2003 _ICL_MG_TX_SWINGCTRL_TX1LN1_PORT1)1922 MG_TX_SWINGCTRL_TX1LN1_PORT1)
2004 1923
2005#define _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT1 0x1680C81924#define MG_TX_SWINGCTRL_TX2LN0_PORT1 0x1680C8
2006#define _ICL_MG_TX_SWINGCTRL_TX2LN1_PORT1 0x1684C81925#define MG_TX_SWINGCTRL_TX2LN1_PORT1 0x1684C8
2007#define _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT2 0x1690C81926#define MG_TX_SWINGCTRL_TX2LN0_PORT2 0x1690C8
2008#define _ICL_MG_TX_SWINGCTRL_TX2LN1_PORT2 0x1694C81927#define MG_TX_SWINGCTRL_TX2LN1_PORT2 0x1694C8
2009#define _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT3 0x16A0C81928#define MG_TX_SWINGCTRL_TX2LN0_PORT3 0x16A0C8
2010#define _ICL_MG_TX_SWINGCTRL_TX2LN1_PORT3 0x16A4C81929#define MG_TX_SWINGCTRL_TX2LN1_PORT3 0x16A4C8
2011#define _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT4 0x16B0C81930#define MG_TX_SWINGCTRL_TX2LN0_PORT4 0x16B0C8
2012#define _ICL_MG_TX_SWINGCTRL_TX2LN1_PORT4 0x16B4C81931#define MG_TX_SWINGCTRL_TX2LN1_PORT4 0x16B4C8
2013#define ICL_PORT_MG_TX2_SWINGCTRL(port, ln) \1932#define MG_TX2_SWINGCTRL(port, ln) \
2014 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT1, \1933 MG_PHY_PORT_LN(port, ln, MG_TX_SWINGCTRL_TX2LN0_PORT1, \
2015 _ICL_MG_TX_SWINGCTRL_TX2LN0_PORT2, \1934 MG_TX_SWINGCTRL_TX2LN0_PORT2, \
2016 _ICL_MG_TX_SWINGCTRL_TX2LN1_PORT1)1935 MG_TX_SWINGCTRL_TX2LN1_PORT1)
2017#define CRI_TXDEEMPH_OVERRIDE_17_12(x) ((x) << 0)1936#define CRI_TXDEEMPH_OVERRIDE_17_12(x) ((x) << 0)
2018#define CRI_TXDEEMPH_OVERRIDE_17_12_MASK (0x3F << 0)1937#define CRI_TXDEEMPH_OVERRIDE_17_12_MASK (0x3F << 0)
2019 1938
2020#define _ICL_MG_TX_DRVCTRL_TX1LN0_PORT1 0x1681441939#define MG_TX_DRVCTRL_TX1LN0_TXPORT1 0x168144
2021#define _ICL_MG_TX_DRVCTRL_TX1LN1_PORT1 0x1685441940#define MG_TX_DRVCTRL_TX1LN1_TXPORT1 0x168544
2022#define _ICL_MG_TX_DRVCTRL_TX1LN0_PORT2 0x1691441941#define MG_TX_DRVCTRL_TX1LN0_TXPORT2 0x169144
2023#define _ICL_MG_TX_DRVCTRL_TX1LN1_PORT2 0x1695441942#define MG_TX_DRVCTRL_TX1LN1_TXPORT2 0x169544
2024#define _ICL_MG_TX_DRVCTRL_TX1LN0_PORT3 0x16A1441943#define MG_TX_DRVCTRL_TX1LN0_TXPORT3 0x16A144
2025#define _ICL_MG_TX_DRVCTRL_TX1LN1_PORT3 0x16A5441944#define MG_TX_DRVCTRL_TX1LN1_TXPORT3 0x16A544
2026#define _ICL_MG_TX_DRVCTRL_TX1LN0_PORT4 0x16B1441945#define MG_TX_DRVCTRL_TX1LN0_TXPORT4 0x16B144
2027#define _ICL_MG_TX_DRVCTRL_TX1LN1_PORT4 0x16B5441946#define MG_TX_DRVCTRL_TX1LN1_TXPORT4 0x16B544
2028#define ICL_PORT_MG_TX1_DRVCTRL(port, ln) \1947#define MG_TX1_DRVCTRL(port, ln) \
2029 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_DRVCTRL_TX1LN0_PORT1, \1948 MG_PHY_PORT_LN(port, ln, MG_TX_DRVCTRL_TX1LN0_TXPORT1, \
2030 _ICL_MG_TX_DRVCTRL_TX1LN0_PORT2, \1949 MG_TX_DRVCTRL_TX1LN0_TXPORT2, \
2031 _ICL_MG_TX_DRVCTRL_TX1LN1_PORT1)1950 MG_TX_DRVCTRL_TX1LN1_TXPORT1)
2032 1951
2033#define _ICL_MG_TX_DRVCTRL_TX2LN0_PORT1 0x1680C41952#define MG_TX_DRVCTRL_TX2LN0_PORT1 0x1680C4
2034#define _ICL_MG_TX_DRVCTRL_TX2LN1_PORT1 0x1684C41953#define MG_TX_DRVCTRL_TX2LN1_PORT1 0x1684C4
2035#define _ICL_MG_TX_DRVCTRL_TX2LN0_PORT2 0x1690C41954#define MG_TX_DRVCTRL_TX2LN0_PORT2 0x1690C4
2036#define _ICL_MG_TX_DRVCTRL_TX2LN1_PORT2 0x1694C41955#define MG_TX_DRVCTRL_TX2LN1_PORT2 0x1694C4
2037#define _ICL_MG_TX_DRVCTRL_TX2LN0_PORT3 0x16A0C41956#define MG_TX_DRVCTRL_TX2LN0_PORT3 0x16A0C4
2038#define _ICL_MG_TX_DRVCTRL_TX2LN1_PORT3 0x16A4C41957#define MG_TX_DRVCTRL_TX2LN1_PORT3 0x16A4C4
2039#define _ICL_MG_TX_DRVCTRL_TX2LN0_PORT4 0x16B0C41958#define MG_TX_DRVCTRL_TX2LN0_PORT4 0x16B0C4
2040#define _ICL_MG_TX_DRVCTRL_TX2LN1_PORT4 0x16B4C41959#define MG_TX_DRVCTRL_TX2LN1_PORT4 0x16B4C4
2041#define ICL_PORT_MG_TX2_DRVCTRL(port, ln) \1960#define MG_TX2_DRVCTRL(port, ln) \
2042 _ICL_MG_PHY_PORT_LN(port, ln, _ICL_MG_TX_DRVCTRL_TX2LN0_PORT1, \1961 MG_PHY_PORT_LN(port, ln, MG_TX_DRVCTRL_TX2LN0_PORT1, \
2043 _ICL_MG_TX_DRVCTRL_TX2LN0_PORT2, \1962 MG_TX_DRVCTRL_TX2LN0_PORT2, \
2044 _ICL_MG_TX_DRVCTRL_TX2LN1_PORT1)1963 MG_TX_DRVCTRL_TX2LN1_PORT1)
2045#define CRI_TXDEEMPH_OVERRIDE_11_6(x) ((x) << 24)1964#define CRI_TXDEEMPH_OVERRIDE_11_6(x) ((x) << 24)
2046#define CRI_TXDEEMPH_OVERRIDE_11_6_MASK (0x3F << 24)1965#define CRI_TXDEEMPH_OVERRIDE_11_6_MASK (0x3F << 24)
2047#define CRI_TXDEEMPH_OVERRIDE_EN (1 << 22)1966#define CRI_TXDEEMPH_OVERRIDE_EN (1 << 22)
2048#define CRI_TXDEEMPH_OVERRIDE_5_0(x) ((x) << 16)1967#define CRI_TXDEEMPH_OVERRIDE_5_0(x) ((x) << 16)
2049#define CRI_TXDEEMPH_OVERRIDE_5_0_MASK (0x3F << 16)1968#define CRI_TXDEEMPH_OVERRIDE_5_0_MASK (0x3F << 16)
1969#define CRI_LOADGEN_SEL(x) ((x) << 12)
1970#define CRI_LOADGEN_SEL_MASK (0x3 << 12)
1971
1972#define MG_CLKHUB_LN0_PORT1 0x16839C
1973#define MG_CLKHUB_LN1_PORT1 0x16879C
1974#define MG_CLKHUB_LN0_PORT2 0x16939C
1975#define MG_CLKHUB_LN1_PORT2 0x16979C
1976#define MG_CLKHUB_LN0_PORT3 0x16A39C
1977#define MG_CLKHUB_LN1_PORT3 0x16A79C
1978#define MG_CLKHUB_LN0_PORT4 0x16B39C
1979#define MG_CLKHUB_LN1_PORT4 0x16B79C
1980#define MG_CLKHUB(port, ln) \
1981 MG_PHY_PORT_LN(port, ln, MG_CLKHUB_LN0_PORT1, \
1982 MG_CLKHUB_LN0_PORT2, \
1983 MG_CLKHUB_LN1_PORT1)
1984#define CFG_LOW_RATE_LKREN_EN (1 << 11)
1985
1986#define MG_TX_DCC_TX1LN0_PORT1 0x168110
1987#define MG_TX_DCC_TX1LN1_PORT1 0x168510
1988#define MG_TX_DCC_TX1LN0_PORT2 0x169110
1989#define MG_TX_DCC_TX1LN1_PORT2 0x169510
1990#define MG_TX_DCC_TX1LN0_PORT3 0x16A110
1991#define MG_TX_DCC_TX1LN1_PORT3 0x16A510
1992#define MG_TX_DCC_TX1LN0_PORT4 0x16B110
1993#define MG_TX_DCC_TX1LN1_PORT4 0x16B510
1994#define MG_TX1_DCC(port, ln) \
1995 MG_PHY_PORT_LN(port, ln, MG_TX_DCC_TX1LN0_PORT1, \
1996 MG_TX_DCC_TX1LN0_PORT2, \
1997 MG_TX_DCC_TX1LN1_PORT1)
1998#define MG_TX_DCC_TX2LN0_PORT1 0x168090
1999#define MG_TX_DCC_TX2LN1_PORT1 0x168490
2000#define MG_TX_DCC_TX2LN0_PORT2 0x169090
2001#define MG_TX_DCC_TX2LN1_PORT2 0x169490
2002#define MG_TX_DCC_TX2LN0_PORT3 0x16A090
2003#define MG_TX_DCC_TX2LN1_PORT3 0x16A490
2004#define MG_TX_DCC_TX2LN0_PORT4 0x16B090
2005#define MG_TX_DCC_TX2LN1_PORT4 0x16B490
2006#define MG_TX2_DCC(port, ln) \
2007 MG_PHY_PORT_LN(port, ln, MG_TX_DCC_TX2LN0_PORT1, \
2008 MG_TX_DCC_TX2LN0_PORT2, \
2009 MG_TX_DCC_TX2LN1_PORT1)
2010#define CFG_AMI_CK_DIV_OVERRIDE_VAL(x) ((x) << 25)
2011#define CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK (0x3 << 25)
2012#define CFG_AMI_CK_DIV_OVERRIDE_EN (1 << 24)
2013
2014#define MG_DP_MODE_LN0_ACU_PORT1 0x1683A0
2015#define MG_DP_MODE_LN1_ACU_PORT1 0x1687A0
2016#define MG_DP_MODE_LN0_ACU_PORT2 0x1693A0
2017#define MG_DP_MODE_LN1_ACU_PORT2 0x1697A0
2018#define MG_DP_MODE_LN0_ACU_PORT3 0x16A3A0
2019#define MG_DP_MODE_LN1_ACU_PORT3 0x16A7A0
2020#define MG_DP_MODE_LN0_ACU_PORT4 0x16B3A0
2021#define MG_DP_MODE_LN1_ACU_PORT4 0x16B7A0
2022#define MG_DP_MODE(port, ln) \
2023 MG_PHY_PORT_LN(port, ln, MG_DP_MODE_LN0_ACU_PORT1, \
2024 MG_DP_MODE_LN0_ACU_PORT2, \
2025 MG_DP_MODE_LN1_ACU_PORT1)
2026#define MG_DP_MODE_CFG_DP_X2_MODE (1 << 7)
2027#define MG_DP_MODE_CFG_DP_X1_MODE (1 << 6)
2028#define MG_DP_MODE_CFG_TR2PWR_GATING (1 << 5)
2029#define MG_DP_MODE_CFG_TRPWR_GATING (1 << 4)
2030#define MG_DP_MODE_CFG_CLNPWR_GATING (1 << 3)
2031#define MG_DP_MODE_CFG_DIGPWR_GATING (1 << 2)
2032#define MG_DP_MODE_CFG_GAONPWR_GATING (1 << 1)
2033
2034#define MG_MISC_SUS0_PORT1 0x168814
2035#define MG_MISC_SUS0_PORT2 0x169814
2036#define MG_MISC_SUS0_PORT3 0x16A814
2037#define MG_MISC_SUS0_PORT4 0x16B814
2038#define MG_MISC_SUS0(tc_port) \
2039 _MMIO(_PORT(tc_port, MG_MISC_SUS0_PORT1, MG_MISC_SUS0_PORT2))
2040#define MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE_MASK (3 << 14)
2041#define MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE(x) ((x) << 14)
2042#define MG_MISC_SUS0_CFG_TR2PWR_GATING (1 << 12)
2043#define MG_MISC_SUS0_CFG_CL2PWR_GATING (1 << 11)
2044#define MG_MISC_SUS0_CFG_GAONPWR_GATING (1 << 10)
2045#define MG_MISC_SUS0_CFG_TRPWR_GATING (1 << 7)
2046#define MG_MISC_SUS0_CFG_CL1PWR_GATING (1 << 6)
2047#define MG_MISC_SUS0_CFG_DGPWR_GATING (1 << 5)
2050 2048
2051/* The spec defines this only for BXT PHY0, but lets assume that this2049/* The spec defines this only for BXT PHY0, but lets assume that this
2052 * would exist for PHY1 too if it had a second channel.2050 * would exist for PHY1 too if it had a second channel.
@@ -3086,18 +3084,9 @@ enum i915_power_well_id { · 1033 unmodified lines
3086/*3084/*
3087 * GPIO regs3085 * GPIO regs
3088 */3086 */
3089#define GPIOA _MMIO(0x5010)3087#define GPIO(gpio) _MMIO(dev_priv->gpio_mmio_base + 0x5010 + \
3090#define GPIOB _MMIO(0x5014)3088 4 * (gpio))
3091#define GPIOC _MMIO(0x5018)3089
3092#define GPIOD _MMIO(0x501c)
3093#define GPIOE _MMIO(0x5020)
3094#define GPIOF _MMIO(0x5024)
3095#define GPIOG _MMIO(0x5028)
3096#define GPIOH _MMIO(0x502c)
3097#define GPIOJ _MMIO(0x5034)
3098#define GPIOK _MMIO(0x5038)
3099#define GPIOL _MMIO(0x503C)
3100#define GPIOM _MMIO(0x5040)
3101# define GPIO_CLOCK_DIR_MASK (1 << 0)3090# define GPIO_CLOCK_DIR_MASK (1 << 0)
3102# define GPIO_CLOCK_DIR_IN (0 << 1)3091# define GPIO_CLOCK_DIR_IN (0 << 1)
3103# define GPIO_CLOCK_DIR_OUT (1 << 1)3092# define GPIO_CLOCK_DIR_OUT (1 << 1)
@@ -5476,6 +5465,7 @@ enum { · 2372 unmodified lines
5476#define DP_AUX_CH_CTL_PSR_DATA_AUX_REG_SKL (1 << 14)5465#define DP_AUX_CH_CTL_PSR_DATA_AUX_REG_SKL (1 << 14)
5477#define DP_AUX_CH_CTL_FS_DATA_AUX_REG_SKL (1 << 13)5466#define DP_AUX_CH_CTL_FS_DATA_AUX_REG_SKL (1 << 13)
5478#define DP_AUX_CH_CTL_GTC_DATA_AUX_REG_SKL (1 << 12)5467#define DP_AUX_CH_CTL_GTC_DATA_AUX_REG_SKL (1 << 12)
5468#define DP_AUX_CH_CTL_TBT_IO (1 << 11)
5479#define DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL_MASK (0x1f << 5)5469#define DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL_MASK (0x1f << 5)
5480#define DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(c) (((c) - 1) << 5)5470#define DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(c) (((c) - 1) << 5)
5481#define DP_AUX_CH_CTL_SYNC_PULSE_SKL(c) ((c) - 1)5471#define DP_AUX_CH_CTL_SYNC_PULSE_SKL(c) ((c) - 1)
@@ -6527,7 +6517,7 @@ enum { · 1045 unmodified lines
6527#define PLANE_CTL_YUV422_UYVY (1 << 16)6517#define PLANE_CTL_YUV422_UYVY (1 << 16)
6528#define PLANE_CTL_YUV422_YVYU (2 << 16)6518#define PLANE_CTL_YUV422_YVYU (2 << 16)
6529#define PLANE_CTL_YUV422_VYUY (3 << 16)6519#define PLANE_CTL_YUV422_VYUY (3 << 16)
6530#define PLANE_CTL_DECOMPRESSION_ENABLE (1 << 15)6520#define PLANE_CTL_RENDER_DECOMPRESSION_ENABLE (1 << 15)
6531#define PLANE_CTL_TRICKLE_FEED_DISABLE (1 << 14)6521#define PLANE_CTL_TRICKLE_FEED_DISABLE (1 << 14)
6532#define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13) /* Pre-GLK */6522#define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13) /* Pre-GLK */
6533#define PLANE_CTL_TILED_MASK (0x7 << 10)6523#define PLANE_CTL_TILED_MASK (0x7 << 10)
@@ -7207,6 +7197,7 @@ enum { · 673 unmodified lines
7207#define GEN11_TC3_HOTPLUG (1 << 18)7197#define GEN11_TC3_HOTPLUG (1 << 18)
7208#define GEN11_TC2_HOTPLUG (1 << 17)7198#define GEN11_TC2_HOTPLUG (1 << 17)
7209#define GEN11_TC1_HOTPLUG (1 << 16)7199#define GEN11_TC1_HOTPLUG (1 << 16)
7200#define GEN11_TC_HOTPLUG(tc_port) (1 << ((tc_port) + 16))
7210#define GEN11_DE_TC_HOTPLUG_MASK (GEN11_TC4_HOTPLUG | \7201#define GEN11_DE_TC_HOTPLUG_MASK (GEN11_TC4_HOTPLUG | \
7211 GEN11_TC3_HOTPLUG | \7202 GEN11_TC3_HOTPLUG | \
7212 GEN11_TC2_HOTPLUG | \7203 GEN11_TC2_HOTPLUG | \
@@ -7215,6 +7206,7 @@ enum { · 2 unmodified lines
7215#define GEN11_TBT3_HOTPLUG (1 << 2)7206#define GEN11_TBT3_HOTPLUG (1 << 2)
7216#define GEN11_TBT2_HOTPLUG (1 << 1)7207#define GEN11_TBT2_HOTPLUG (1 << 1)
7217#define GEN11_TBT1_HOTPLUG (1 << 0)7208#define GEN11_TBT1_HOTPLUG (1 << 0)
7209#define GEN11_TBT_HOTPLUG(tc_port) (1 << (tc_port))
7218#define GEN11_DE_TBT_HOTPLUG_MASK (GEN11_TBT4_HOTPLUG | \7210#define GEN11_DE_TBT_HOTPLUG_MASK (GEN11_TBT4_HOTPLUG | \
7219 GEN11_TBT3_HOTPLUG | \7211 GEN11_TBT3_HOTPLUG | \
7220 GEN11_TBT2_HOTPLUG | \7212 GEN11_TBT2_HOTPLUG | \
@@ -7490,6 +7482,8 @@ enum { · 269 unmodified lines
7490 7482
7491/* PCH */7483/* PCH */
7492 7484
7485#define PCH_DISPLAY_BASE 0xc0000u
7486
7493/* south display engine interrupt: IBX */7487/* south display engine interrupt: IBX */
7494#define SDE_AUDIO_POWER_D (1 << 27)7488#define SDE_AUDIO_POWER_D (1 << 27)
7495#define SDE_AUDIO_POWER_C (1 << 26)7489#define SDE_AUDIO_POWER_C (1 << 26)
@@ -7587,6 +7581,8 @@ enum { · 91 unmodified lines
7587#define SDE_GMBUS_ICP (1 << 23)7581#define SDE_GMBUS_ICP (1 << 23)
7588#define SDE_DDIB_HOTPLUG_ICP (1 << 17)7582#define SDE_DDIB_HOTPLUG_ICP (1 << 17)
7589#define SDE_DDIA_HOTPLUG_ICP (1 << 16)7583#define SDE_DDIA_HOTPLUG_ICP (1 << 16)
7584#define SDE_TC_HOTPLUG_ICP(tc_port) (1 << ((tc_port) + 24))
7585#define SDE_DDI_HOTPLUG_ICP(port) (1 << ((port) + 16))
7590#define SDE_DDI_MASK_ICP (SDE_DDIB_HOTPLUG_ICP | \7586#define SDE_DDI_MASK_ICP (SDE_DDIB_HOTPLUG_ICP | \
7591 SDE_DDIA_HOTPLUG_ICP)7587 SDE_DDIA_HOTPLUG_ICP)
7592#define SDE_TC_MASK_ICP (SDE_TC4_HOTPLUG_ICP | \7588#define SDE_TC_MASK_ICP (SDE_TC4_HOTPLUG_ICP | \
@@ -7782,20 +7778,6 @@ enum { · 189 unmodified lines
7782#define ICP_TC_HPD_LONG_DETECT(tc_port) (2 << (tc_port) * 4)7778#define ICP_TC_HPD_LONG_DETECT(tc_port) (2 << (tc_port) * 4)
7783#define ICP_TC_HPD_SHORT_DETECT(tc_port) (1 << (tc_port) * 4)7779#define ICP_TC_HPD_SHORT_DETECT(tc_port) (1 << (tc_port) * 4)
7784 7780
7785#define PCH_GPIOA _MMIO(0xc5010)
7786#define PCH_GPIOB _MMIO(0xc5014)
7787#define PCH_GPIOC _MMIO(0xc5018)
7788#define PCH_GPIOD _MMIO(0xc501c)
7789#define PCH_GPIOE _MMIO(0xc5020)
7790#define PCH_GPIOF _MMIO(0xc5024)
7791
7792#define PCH_GMBUS0 _MMIO(0xc5100)
7793#define PCH_GMBUS1 _MMIO(0xc5104)
7794#define PCH_GMBUS2 _MMIO(0xc5108)
7795#define PCH_GMBUS3 _MMIO(0xc510c)
7796#define PCH_GMBUS4 _MMIO(0xc5110)
7797#define PCH_GMBUS5 _MMIO(0xc5120)
7798
7799#define _PCH_DPLL_A 0xc60147781#define _PCH_DPLL_A 0xc6014
7800#define _PCH_DPLL_B 0xc60187782#define _PCH_DPLL_B 0xc6018
7801#define PCH_DPLL(pll) _MMIO((pll) == 0 ? _PCH_DPLL_A : _PCH_DPLL_B)7783#define PCH_DPLL(pll) _MMIO((pll) == 0 ? _PCH_DPLL_A : _PCH_DPLL_B)
@@ -8498,8 +8480,10 @@ enum { · 696 unmodified lines
8498#define GEN6_PM_RP_DOWN_THRESHOLD (1 << 4)8480#define GEN6_PM_RP_DOWN_THRESHOLD (1 << 4)
8499#define GEN6_PM_RP_UP_EI_EXPIRED (1 << 2)8481#define GEN6_PM_RP_UP_EI_EXPIRED (1 << 2)
8500#define GEN6_PM_RP_DOWN_EI_EXPIRED (1 << 1)8482#define GEN6_PM_RP_DOWN_EI_EXPIRED (1 << 1)
8501#define GEN6_PM_RPS_EVENTS (GEN6_PM_RP_UP_THRESHOLD | \8483#define GEN6_PM_RPS_EVENTS (GEN6_PM_RP_UP_EI_EXPIRED | \
8502 GEN6_PM_RP_DOWN_THRESHOLD | \8484 GEN6_PM_RP_UP_THRESHOLD | \
8485 GEN6_PM_RP_DOWN_EI_EXPIRED | \
8486 GEN6_PM_RP_DOWN_THRESHOLD | \
8503 GEN6_PM_RP_DOWN_TIMEOUT)8487 GEN6_PM_RP_DOWN_TIMEOUT)
8504 8488
8505#define GEN7_GT_SCRATCH(i) _MMIO(0x4F100 + (i) * 4)8489#define GEN7_GT_SCRATCH(i) _MMIO(0x4F100 + (i) * 4)
@@ -8827,46 +8811,78 @@ enum { · 321 unmodified lines
8827#define HSW_AUD_CHICKENBIT _MMIO(0x65f10)8811#define HSW_AUD_CHICKENBIT _MMIO(0x65f10)
8828#define SKL_AUD_CODEC_WAKE_SIGNAL (1 << 15)8812#define SKL_AUD_CODEC_WAKE_SIGNAL (1 << 15)
8829 8813
8830/* HSW Power Wells */
8831#define _HSW_PWR_WELL_CTL1 0x45400
8832#define _HSW_PWR_WELL_CTL2 0x45404
8833#define _HSW_PWR_WELL_CTL3 0x45408
8834#define _HSW_PWR_WELL_CTL4 0x4540C
8835
8836#define _ICL_PWR_WELL_CTL_AUX1 0x45440
8837#define _ICL_PWR_WELL_CTL_AUX2 0x45444
8838#define _ICL_PWR_WELL_CTL_AUX4 0x4544C
8839
8840#define _ICL_PWR_WELL_CTL_DDI1 0x45450
8841#define _ICL_PWR_WELL_CTL_DDI2 0x45454
8842#define _ICL_PWR_WELL_CTL_DDI4 0x4545C
8843
8844/*8814/*
8845 * Each power well control register contains up to 16 (request, status) HW8815 * HSW - ICL power wells
8846 * flag tuples. The register index and HW flag shift is determined by the8816 *
8847 * power well ID (see i915_power_well_id). There are 4 possible sources of8817 * Platforms have up to 3 power well control register sets, each set
8848 * power well requests each source having its own set of control registers:8818 * controlling up to 16 power wells via a request/status HW flag tuple:
8849 * BIOS, DRIVER, KVMR, DEBUG.8819 * - main (HSW_PWR_WELL_CTL[1-4])
8820 * - AUX (ICL_PWR_WELL_CTL_AUX[1-4])
8821 * - DDI (ICL_PWR_WELL_CTL_DDI[1-4])
8822 * Each control register set consists of up to 4 registers used by different
8823 * sources that can request a power well to be enabled:
8824 * - BIOS (HSW_PWR_WELL_CTL1/ICL_PWR_WELL_CTL_AUX1/ICL_PWR_WELL_CTL_DDI1)
8825 * - DRIVER (HSW_PWR_WELL_CTL2/ICL_PWR_WELL_CTL_AUX2/ICL_PWR_WELL_CTL_DDI2)
8826 * - KVMR (HSW_PWR_WELL_CTL3) (only in the main register set)
8827 * - DEBUG (HSW_PWR_WELL_CTL4/ICL_PWR_WELL_CTL_AUX4/ICL_PWR_WELL_CTL_DDI4)
8850 */8828 */
8851#define _HSW_PW_REG_IDX(pw) ((pw) >> 4)8829#define HSW_PWR_WELL_CTL1 _MMIO(0x45400)
8852#define _HSW_PW_SHIFT(pw) (((pw) & 0xf) * 2)8830#define HSW_PWR_WELL_CTL2 _MMIO(0x45404)
8853#define HSW_PWR_WELL_CTL_BIOS(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \8831#define HSW_PWR_WELL_CTL3 _MMIO(0x45408)
8854 _HSW_PWR_WELL_CTL1, \8832#define HSW_PWR_WELL_CTL4 _MMIO(0x4540C)
8855 _ICL_PWR_WELL_CTL_AUX1, \8833#define HSW_PWR_WELL_CTL_REQ(pw_idx) (0x2 << ((pw_idx) * 2))
8856 _ICL_PWR_WELL_CTL_DDI1))8834#define HSW_PWR_WELL_CTL_STATE(pw_idx) (0x1 << ((pw_idx) * 2))
8857#define HSW_PWR_WELL_CTL_DRIVER(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \8835
8858 _HSW_PWR_WELL_CTL2, \8836/* HSW/BDW power well */
8859 _ICL_PWR_WELL_CTL_AUX2, \8837#define HSW_PW_CTL_IDX_GLOBAL 15
8860 _ICL_PWR_WELL_CTL_DDI2))8838
8861/* KVMR doesn't have a reg for AUX or DDI power well control */8839/* SKL/BXT/GLK/CNL power wells */
8862#define HSW_PWR_WELL_CTL_KVMR _MMIO(_HSW_PWR_WELL_CTL3)8840#define SKL_PW_CTL_IDX_PW_2 15
8863#define HSW_PWR_WELL_CTL_DEBUG(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \8841#define SKL_PW_CTL_IDX_PW_1 14
8864 _HSW_PWR_WELL_CTL4, \8842#define CNL_PW_CTL_IDX_AUX_F 12
8865 _ICL_PWR_WELL_CTL_AUX4, \8843#define CNL_PW_CTL_IDX_AUX_D 11
8866 _ICL_PWR_WELL_CTL_DDI4))8844#define GLK_PW_CTL_IDX_AUX_C 10
8867 8845#define GLK_PW_CTL_IDX_AUX_B 9
8868#define HSW_PWR_WELL_CTL_REQ(pw) (1 << (_HSW_PW_SHIFT(pw) + 1))8846#define GLK_PW_CTL_IDX_AUX_A 8
8869#define HSW_PWR_WELL_CTL_STATE(pw) (1 << _HSW_PW_SHIFT(pw))8847#define CNL_PW_CTL_IDX_DDI_F 6
8848#define SKL_PW_CTL_IDX_DDI_D 4
8849#define SKL_PW_CTL_IDX_DDI_C 3
8850#define SKL_PW_CTL_IDX_DDI_B 2
8851#define SKL_PW_CTL_IDX_DDI_A_E 1
8852#define GLK_PW_CTL_IDX_DDI_A 1
8853#define SKL_PW_CTL_IDX_MISC_IO 0
8854
8855/* ICL - power wells */
8856#define ICL_PW_CTL_IDX_PW_4 3
8857#define ICL_PW_CTL_IDX_PW_3 2
8858#define ICL_PW_CTL_IDX_PW_2 1
8859#define ICL_PW_CTL_IDX_PW_1 0
8860
8861#define ICL_PWR_WELL_CTL_AUX1 _MMIO(0x45440)
8862#define ICL_PWR_WELL_CTL_AUX2 _MMIO(0x45444)
8863#define ICL_PWR_WELL_CTL_AUX4 _MMIO(0x4544C)
8864#define ICL_PW_CTL_IDX_AUX_TBT4 11
8865#define ICL_PW_CTL_IDX_AUX_TBT3 10
8866#define ICL_PW_CTL_IDX_AUX_TBT2 9
8867#define ICL_PW_CTL_IDX_AUX_TBT1 8
8868#define ICL_PW_CTL_IDX_AUX_F 5
8869#define ICL_PW_CTL_IDX_AUX_E 4
8870#define ICL_PW_CTL_IDX_AUX_D 3
8871#define ICL_PW_CTL_IDX_AUX_C 2
8872#define ICL_PW_CTL_IDX_AUX_B 1
8873#define ICL_PW_CTL_IDX_AUX_A 0
8874
8875#define ICL_PWR_WELL_CTL_DDI1 _MMIO(0x45450)
8876#define ICL_PWR_WELL_CTL_DDI2 _MMIO(0x45454)
8877#define ICL_PWR_WELL_CTL_DDI4 _MMIO(0x4545C)
8878#define ICL_PW_CTL_IDX_DDI_F 5
8879#define ICL_PW_CTL_IDX_DDI_E 4
8880#define ICL_PW_CTL_IDX_DDI_D 3
8881#define ICL_PW_CTL_IDX_DDI_C 2
8882#define ICL_PW_CTL_IDX_DDI_B 1
8883#define ICL_PW_CTL_IDX_DDI_A 0
8884
8885/* HSW - power well misc debug registers */
8870#define HSW_PWR_WELL_CTL5 _MMIO(0x45410)8886#define HSW_PWR_WELL_CTL5 _MMIO(0x45410)
8871#define HSW_PWR_WELL_ENABLE_SINGLE_STEP (1 << 31)8887#define HSW_PWR_WELL_ENABLE_SINGLE_STEP (1 << 31)
8872#define HSW_PWR_WELL_PWR_GATE_OVERRIDE (1 << 20)8888#define HSW_PWR_WELL_PWR_GATE_OVERRIDE (1 << 20)
@@ -8878,22 +8894,32 @@ enum skl_power_gate { · 5 unmodified lines
8878 SKL_PG0,8894 SKL_PG0,
8879 SKL_PG1,8895 SKL_PG1,
8880 SKL_PG2,8896 SKL_PG2,
8897 ICL_PG3,
8898 ICL_PG4,
8881};8899};
8882 8900
8883#define SKL_FUSE_STATUS _MMIO(0x42000)8901#define SKL_FUSE_STATUS _MMIO(0x42000)
8884#define SKL_FUSE_DOWNLOAD_STATUS (1 << 31)8902#define SKL_FUSE_DOWNLOAD_STATUS (1 << 31)
8885/* PG0 (HW control->no power well ID), PG1..PG2 (SKL_DISP_PW1..SKL_DISP_PW2) */8903/*
8886#define SKL_PW_TO_PG(pw) ((pw) - SKL_DISP_PW_1 + SKL_PG1)8904 * PG0 is HW controlled, so doesn't have a corresponding power well control knob
8887/* PG0 (HW control->no power well ID), PG1..PG4 (ICL_DISP_PW1..ICL_DISP_PW4) */8905 * SKL_DISP_PW1_IDX..SKL_DISP_PW2_IDX -> PG1..PG2
8888#define ICL_PW_TO_PG(pw) ((pw) - ICL_DISP_PW_1 + SKL_PG1)8906 */
8907#define SKL_PW_CTL_IDX_TO_PG(pw_idx) \
8908 ((pw_idx) - SKL_PW_CTL_IDX_PW_1 + SKL_PG1)
8909/*
8910 * PG0 is HW controlled, so doesn't have a corresponding power well control knob
8911 * ICL_DISP_PW1_IDX..ICL_DISP_PW4_IDX -> PG1..PG4
8912 */
8913#define ICL_PW_CTL_IDX_TO_PG(pw_idx) \
8914 ((pw_idx) - ICL_PW_CTL_IDX_PW_1 + SKL_PG1)
8889#define SKL_FUSE_PG_DIST_STATUS(pg) (1 << (27 - (pg)))8915#define SKL_FUSE_PG_DIST_STATUS(pg) (1 << (27 - (pg)))
8890 8916
8891#define _CNL_AUX_REG_IDX(pw) ((pw) - 9)8917#define _CNL_AUX_REG_IDX(pw_idx) ((pw_idx) - GLK_PW_CTL_IDX_AUX_B)
8892#define _CNL_AUX_ANAOVRD1_B 0x1622508918#define _CNL_AUX_ANAOVRD1_B 0x162250
8893#define _CNL_AUX_ANAOVRD1_C 0x1622108919#define _CNL_AUX_ANAOVRD1_C 0x162210
8894#define _CNL_AUX_ANAOVRD1_D 0x1622D08920#define _CNL_AUX_ANAOVRD1_D 0x1622D0
8895#define _CNL_AUX_ANAOVRD1_F 0x162A908921#define _CNL_AUX_ANAOVRD1_F 0x162A90
8896#define CNL_AUX_ANAOVRD1(pw) _MMIO(_PICK(_CNL_AUX_REG_IDX(pw), \8922#define CNL_AUX_ANAOVRD1(pw_idx) _MMIO(_PICK(_CNL_AUX_REG_IDX(pw_idx), \
8897 _CNL_AUX_ANAOVRD1_B, \8923 _CNL_AUX_ANAOVRD1_B, \
8898 _CNL_AUX_ANAOVRD1_C, \8924 _CNL_AUX_ANAOVRD1_C, \
8899 _CNL_AUX_ANAOVRD1_D, \8925 _CNL_AUX_ANAOVRD1_D, \
@@ -9367,9 +9393,13 @@ enum skl_power_gate { · 467 unmodified lines
9367#define MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK (0x1 << 16)9393#define MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK (0x1 << 16)
9368#define MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(x) ((x) << 14)9394#define MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(x) ((x) << 14)
9369#define MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK (0x3 << 14)9395#define MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK (0x3 << 14)
9370#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO(x) ((x) << 12)
9371#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK (0x3 << 12)9396#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK (0x3 << 12)
9397#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2 (0 << 12)
9398#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3 (1 << 12)
9399#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5 (2 << 12)
9400#define MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7 (3 << 12)
9372#define MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(x) ((x) << 8)9401#define MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(x) ((x) << 8)
9402#define MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_SHIFT 8
9373#define MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK (0xf << 8)9403#define MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK (0xf << 8)
9374#define MG_CLKTOP2_HSCLKCTL(port) _MMIO_PORT((port) - PORT_C, \9404#define MG_CLKTOP2_HSCLKCTL(port) _MMIO_PORT((port) - PORT_C, \
9375 _MG_CLKTOP2_HSCLKCTL_PORT1, \9405 _MG_CLKTOP2_HSCLKCTL_PORT1, \
@@ -9380,7 +9410,10 @@ enum skl_power_gate { · 4 unmodified lines
9380#define _MG_PLL_DIV0_PORT3 0x16AA009410#define _MG_PLL_DIV0_PORT3 0x16AA00
9381#define _MG_PLL_DIV0_PORT4 0x16BA009411#define _MG_PLL_DIV0_PORT4 0x16BA00
9382#define MG_PLL_DIV0_FRACNEN_H (1 << 30)9412#define MG_PLL_DIV0_FRACNEN_H (1 << 30)
9413#define MG_PLL_DIV0_FBDIV_FRAC_MASK (0x3fffff << 8)
9414#define MG_PLL_DIV0_FBDIV_FRAC_SHIFT 8
9383#define MG_PLL_DIV0_FBDIV_FRAC(x) ((x) << 8)9415#define MG_PLL_DIV0_FBDIV_FRAC(x) ((x) << 8)
9416#define MG_PLL_DIV0_FBDIV_INT_MASK (0xff << 0)
9384#define MG_PLL_DIV0_FBDIV_INT(x) ((x) << 0)9417#define MG_PLL_DIV0_FBDIV_INT(x) ((x) << 0)
9385#define MG_PLL_DIV0(port) _MMIO_PORT((port) - PORT_C, _MG_PLL_DIV0_PORT1, \9418#define MG_PLL_DIV0(port) _MMIO_PORT((port) - PORT_C, _MG_PLL_DIV0_PORT1, \
9386 _MG_PLL_DIV0_PORT2)9419 _MG_PLL_DIV0_PORT2)
@@ -9395,6 +9428,7 @@ enum skl_power_gate { · 8 unmodified lines
9395#define MG_PLL_DIV1_DITHER_DIV_4 (2 << 12)9428#define MG_PLL_DIV1_DITHER_DIV_4 (2 << 12)
9396#define MG_PLL_DIV1_DITHER_DIV_8 (3 << 12)9429#define MG_PLL_DIV1_DITHER_DIV_8 (3 << 12)
9397#define MG_PLL_DIV1_NDIVRATIO(x) ((x) << 4)9430#define MG_PLL_DIV1_NDIVRATIO(x) ((x) << 4)
9431#define MG_PLL_DIV1_FBPREDIV_MASK (0xf << 0)
9398#define MG_PLL_DIV1_FBPREDIV(x) ((x) << 0)9432#define MG_PLL_DIV1_FBPREDIV(x) ((x) << 0)
9399#define MG_PLL_DIV1(port) _MMIO_PORT((port) - PORT_C, _MG_PLL_DIV1_PORT1, \9433#define MG_PLL_DIV1(port) _MMIO_PORT((port) - PORT_C, _MG_PLL_DIV1_PORT1, \
9400 _MG_PLL_DIV1_PORT2)9434 _MG_PLL_DIV1_PORT2)
@@ -10347,8 +10381,8 @@ enum skl_power_gate { · 946 unmodified lines
10347#define ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN (1 << 23)10381#define ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN (1 << 23)
10348 10382
10349/* Icelake Display Stream Compression Registers */10383/* Icelake Display Stream Compression Registers */
10350#define DSCA_PICTURE_PARAMETER_SET_0 0x6B20010384#define DSCA_PICTURE_PARAMETER_SET_0 _MMIO(0x6B200)
10351#define DSCC_PICTURE_PARAMETER_SET_0 0x6BA0010385#define DSCC_PICTURE_PARAMETER_SET_0 _MMIO(0x6BA00)
10352#define _ICL_DSC0_PICTURE_PARAMETER_SET_0_PB 0x7827010386#define _ICL_DSC0_PICTURE_PARAMETER_SET_0_PB 0x78270
10353#define _ICL_DSC1_PICTURE_PARAMETER_SET_0_PB 0x7837010387#define _ICL_DSC1_PICTURE_PARAMETER_SET_0_PB 0x78370
10354#define _ICL_DSC0_PICTURE_PARAMETER_SET_0_PC 0x7847010388#define _ICL_DSC0_PICTURE_PARAMETER_SET_0_PC 0x78470
@@ -10368,8 +10402,8 @@ enum skl_power_gate { · 13 unmodified lines
10368#define DSC_VER_MIN_SHIFT 410402#define DSC_VER_MIN_SHIFT 4
10369#define DSC_VER_MAJ (0x1 << 0)10403#define DSC_VER_MAJ (0x1 << 0)
10370 10404
10371#define DSCA_PICTURE_PARAMETER_SET_1 0x6B20410405#define DSCA_PICTURE_PARAMETER_SET_1 _MMIO(0x6B204)
10372#define DSCC_PICTURE_PARAMETER_SET_1 0x6BA0410406#define DSCC_PICTURE_PARAMETER_SET_1 _MMIO(0x6BA04)
10373#define _ICL_DSC0_PICTURE_PARAMETER_SET_1_PB 0x7827410407#define _ICL_DSC0_PICTURE_PARAMETER_SET_1_PB 0x78274
10374#define _ICL_DSC1_PICTURE_PARAMETER_SET_1_PB 0x7837410408#define _ICL_DSC1_PICTURE_PARAMETER_SET_1_PB 0x78374
10375#define _ICL_DSC0_PICTURE_PARAMETER_SET_1_PC 0x7847410409#define _ICL_DSC0_PICTURE_PARAMETER_SET_1_PC 0x78474
@@ -10382,8 +10416,8 @@ enum skl_power_gate { · 6 unmodified lines
10382 _ICL_DSC1_PICTURE_PARAMETER_SET_1_PC)10416 _ICL_DSC1_PICTURE_PARAMETER_SET_1_PC)
10383#define DSC_BPP(bpp) ((bpp) << 0)10417#define DSC_BPP(bpp) ((bpp) << 0)
10384 10418
10385#define DSCA_PICTURE_PARAMETER_SET_2 0x6B20810419#define DSCA_PICTURE_PARAMETER_SET_2 _MMIO(0x6B208)
10386#define DSCC_PICTURE_PARAMETER_SET_2 0x6BA0810420#define DSCC_PICTURE_PARAMETER_SET_2 _MMIO(0x6BA08)
10387#define _ICL_DSC0_PICTURE_PARAMETER_SET_2_PB 0x7827810421#define _ICL_DSC0_PICTURE_PARAMETER_SET_2_PB 0x78278
10388#define _ICL_DSC1_PICTURE_PARAMETER_SET_2_PB 0x7837810422#define _ICL_DSC1_PICTURE_PARAMETER_SET_2_PB 0x78378
10389#define _ICL_DSC0_PICTURE_PARAMETER_SET_2_PC 0x7847810423#define _ICL_DSC0_PICTURE_PARAMETER_SET_2_PC 0x78478
@@ -10397,8 +10431,8 @@ enum skl_power_gate { · 7 unmodified lines
10397#define DSC_PIC_WIDTH(pic_width) ((pic_width) << 16)10431#define DSC_PIC_WIDTH(pic_width) ((pic_width) << 16)
10398#define DSC_PIC_HEIGHT(pic_height) ((pic_height) << 0)10432#define DSC_PIC_HEIGHT(pic_height) ((pic_height) << 0)
10399 10433
10400#define DSCA_PICTURE_PARAMETER_SET_3 0x6B20C10434#define DSCA_PICTURE_PARAMETER_SET_3 _MMIO(0x6B20C)
10401#define DSCC_PICTURE_PARAMETER_SET_3 0x6BA0C10435#define DSCC_PICTURE_PARAMETER_SET_3 _MMIO(0x6BA0C)
10402#define _ICL_DSC0_PICTURE_PARAMETER_SET_3_PB 0x7827C10436#define _ICL_DSC0_PICTURE_PARAMETER_SET_3_PB 0x7827C
10403#define _ICL_DSC1_PICTURE_PARAMETER_SET_3_PB 0x7837C10437#define _ICL_DSC1_PICTURE_PARAMETER_SET_3_PB 0x7837C
10404#define _ICL_DSC0_PICTURE_PARAMETER_SET_3_PC 0x7847C10438#define _ICL_DSC0_PICTURE_PARAMETER_SET_3_PC 0x7847C
@@ -10412,8 +10446,8 @@ enum skl_power_gate { · 7 unmodified lines
10412#define DSC_SLICE_WIDTH(slice_width) ((slice_width) << 16)10446#define DSC_SLICE_WIDTH(slice_width) ((slice_width) << 16)
10413#define DSC_SLICE_HEIGHT(slice_height) ((slice_height) << 0)10447#define DSC_SLICE_HEIGHT(slice_height) ((slice_height) << 0)
10414 10448
10415#define DSCA_PICTURE_PARAMETER_SET_4 0x6B21010449#define DSCA_PICTURE_PARAMETER_SET_4 _MMIO(0x6B210)
10416#define DSCC_PICTURE_PARAMETER_SET_4 0x6BA1010450#define DSCC_PICTURE_PARAMETER_SET_4 _MMIO(0x6BA10)
10417#define _ICL_DSC0_PICTURE_PARAMETER_SET_4_PB 0x7828010451#define _ICL_DSC0_PICTURE_PARAMETER_SET_4_PB 0x78280
10418#define _ICL_DSC1_PICTURE_PARAMETER_SET_4_PB 0x7838010452#define _ICL_DSC1_PICTURE_PARAMETER_SET_4_PB 0x78380
10419#define _ICL_DSC0_PICTURE_PARAMETER_SET_4_PC 0x7848010453#define _ICL_DSC0_PICTURE_PARAMETER_SET_4_PC 0x78480
@@ -10422,13 +10456,13 @@ enum skl_power_gate { · 2 unmodified lines
10422 _ICL_DSC0_PICTURE_PARAMETER_SET_4_PB, \10456 _ICL_DSC0_PICTURE_PARAMETER_SET_4_PB, \
10423 _ICL_DSC0_PICTURE_PARAMETER_SET_4_PC)10457 _ICL_DSC0_PICTURE_PARAMETER_SET_4_PC)
10424#define ICL_DSC1_PICTURE_PARAMETER_SET_4(pipe) _MMIO_PIPE((pipe) - PIPE_B, \10458#define ICL_DSC1_PICTURE_PARAMETER_SET_4(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10425 _ICL_DSC0_PICTURE_PARAMETER_SET_4_PB, \10459 _ICL_DSC1_PICTURE_PARAMETER_SET_4_PB, \
10426 _ICL_DSC1_PICTURE_PARAMETER_SET_4_PC)10460 _ICL_DSC1_PICTURE_PARAMETER_SET_4_PC)
10427#define DSC_INITIAL_DEC_DELAY(dec_delay) ((dec_delay) << 16)10461#define DSC_INITIAL_DEC_DELAY(dec_delay) ((dec_delay) << 16)
10428#define DSC_INITIAL_XMIT_DELAY(xmit_delay) ((xmit_delay) << 0)10462#define DSC_INITIAL_XMIT_DELAY(xmit_delay) ((xmit_delay) << 0)
10429 10463
10430#define DSCA_PICTURE_PARAMETER_SET_5 0x6B21410464#define DSCA_PICTURE_PARAMETER_SET_5 _MMIO(0x6B214)
10431#define DSCC_PICTURE_PARAMETER_SET_5 0x6BA1410465#define DSCC_PICTURE_PARAMETER_SET_5 _MMIO(0x6BA14)
10432#define _ICL_DSC0_PICTURE_PARAMETER_SET_5_PB 0x7828410466#define _ICL_DSC0_PICTURE_PARAMETER_SET_5_PB 0x78284
10433#define _ICL_DSC1_PICTURE_PARAMETER_SET_5_PB 0x7838410467#define _ICL_DSC1_PICTURE_PARAMETER_SET_5_PB 0x78384
10434#define _ICL_DSC0_PICTURE_PARAMETER_SET_5_PC 0x7848410468#define _ICL_DSC0_PICTURE_PARAMETER_SET_5_PC 0x78484
@@ -10437,13 +10471,13 @@ enum skl_power_gate { · 2 unmodified lines
10437 _ICL_DSC0_PICTURE_PARAMETER_SET_5_PB, \10471 _ICL_DSC0_PICTURE_PARAMETER_SET_5_PB, \
10438 _ICL_DSC0_PICTURE_PARAMETER_SET_5_PC)10472 _ICL_DSC0_PICTURE_PARAMETER_SET_5_PC)
10439#define ICL_DSC1_PICTURE_PARAMETER_SET_5(pipe) _MMIO_PIPE((pipe) - PIPE_B, \10473#define ICL_DSC1_PICTURE_PARAMETER_SET_5(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10440 _ICL_DSC1_PICTURE_PARAMETER_SET_5_PC, \10474 _ICL_DSC1_PICTURE_PARAMETER_SET_5_PB, \
10441 _ICL_DSC1_PICTURE_PARAMETER_SET_5_PC)10475 _ICL_DSC1_PICTURE_PARAMETER_SET_5_PC)
10442#define DSC_SCALE_DEC_INTINT(scale_dec) ((scale_dec) << 16)10476#define DSC_SCALE_DEC_INT(scale_dec) ((scale_dec) << 16)
10443#define DSC_SCALE_INC_INT(scale_inc) ((scale_inc) << 0)10477#define DSC_SCALE_INC_INT(scale_inc) ((scale_inc) << 0)
10444 10478
10445#define DSCA_PICTURE_PARAMETER_SET_6 0x6B21810479#define DSCA_PICTURE_PARAMETER_SET_6 _MMIO(0x6B218)
10446#define DSCC_PICTURE_PARAMETER_SET_6 0x6BA1810480#define DSCC_PICTURE_PARAMETER_SET_6 _MMIO(0x6BA18)
10447#define _ICL_DSC0_PICTURE_PARAMETER_SET_6_PB 0x7828810481#define _ICL_DSC0_PICTURE_PARAMETER_SET_6_PB 0x78288
10448#define _ICL_DSC1_PICTURE_PARAMETER_SET_6_PB 0x7838810482#define _ICL_DSC1_PICTURE_PARAMETER_SET_6_PB 0x78388
10449#define _ICL_DSC0_PICTURE_PARAMETER_SET_6_PC 0x7848810483#define _ICL_DSC0_PICTURE_PARAMETER_SET_6_PC 0x78488
@@ -10454,13 +10488,13 @@ enum skl_power_gate { · 4 unmodified lines
10454#define ICL_DSC1_PICTURE_PARAMETER_SET_6(pipe) _MMIO_PIPE((pipe) - PIPE_B, \10488#define ICL_DSC1_PICTURE_PARAMETER_SET_6(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10455 _ICL_DSC1_PICTURE_PARAMETER_SET_6_PB, \10489 _ICL_DSC1_PICTURE_PARAMETER_SET_6_PB, \
10456 _ICL_DSC1_PICTURE_PARAMETER_SET_6_PC)10490 _ICL_DSC1_PICTURE_PARAMETER_SET_6_PC)
10457#define DSC_FLATNESS_MAX_QP(max_qp) (qp << 24)10491#define DSC_FLATNESS_MAX_QP(max_qp) ((max_qp) << 24)
10458#define DSC_FLATNESS_MIN_QP(min_qp) (qp << 16)10492#define DSC_FLATNESS_MIN_QP(min_qp) ((min_qp) << 16)
10459#define DSC_FIRST_LINE_BPG_OFFSET(offset) ((offset) << 8)10493#define DSC_FIRST_LINE_BPG_OFFSET(offset) ((offset) << 8)
10460#define DSC_INITIAL_SCALE_VALUE(value) ((value) << 0)10494#define DSC_INITIAL_SCALE_VALUE(value) ((value) << 0)
10461 10495
10462#define DSCA_PICTURE_PARAMETER_SET_7 0x6B21C10496#define DSCA_PICTURE_PARAMETER_SET_7 _MMIO(0x6B21C)
10463#define DSCC_PICTURE_PARAMETER_SET_7 0x6BA1C10497#define DSCC_PICTURE_PARAMETER_SET_7 _MMIO(0x6BA1C)
10464#define _ICL_DSC0_PICTURE_PARAMETER_SET_7_PB 0x7828C10498#define _ICL_DSC0_PICTURE_PARAMETER_SET_7_PB 0x7828C
10465#define _ICL_DSC1_PICTURE_PARAMETER_SET_7_PB 0x7838C10499#define _ICL_DSC1_PICTURE_PARAMETER_SET_7_PB 0x7838C
10466#define _ICL_DSC0_PICTURE_PARAMETER_SET_7_PC 0x7848C10500#define _ICL_DSC0_PICTURE_PARAMETER_SET_7_PC 0x7848C
@@ -10474,8 +10508,8 @@ enum skl_power_gate { · 7 unmodified lines
10474#define DSC_NFL_BPG_OFFSET(bpg_offset) ((bpg_offset) << 16)10508#define DSC_NFL_BPG_OFFSET(bpg_offset) ((bpg_offset) << 16)
10475#define DSC_SLICE_BPG_OFFSET(bpg_offset) ((bpg_offset) << 0)10509#define DSC_SLICE_BPG_OFFSET(bpg_offset) ((bpg_offset) << 0)
10476 10510
10477#define DSCA_PICTURE_PARAMETER_SET_8 0x6B22010511#define DSCA_PICTURE_PARAMETER_SET_8 _MMIO(0x6B220)
10478#define DSCC_PICTURE_PARAMETER_SET_8 0x6BA2010512#define DSCC_PICTURE_PARAMETER_SET_8 _MMIO(0x6BA20)
10479#define _ICL_DSC0_PICTURE_PARAMETER_SET_8_PB 0x7829010513#define _ICL_DSC0_PICTURE_PARAMETER_SET_8_PB 0x78290
10480#define _ICL_DSC1_PICTURE_PARAMETER_SET_8_PB 0x7839010514#define _ICL_DSC1_PICTURE_PARAMETER_SET_8_PB 0x78390
10481#define _ICL_DSC0_PICTURE_PARAMETER_SET_8_PC 0x7849010515#define _ICL_DSC0_PICTURE_PARAMETER_SET_8_PC 0x78490
@@ -10489,8 +10523,8 @@ enum skl_power_gate { · 7 unmodified lines
10489#define DSC_INITIAL_OFFSET(initial_offset) ((initial_offset) << 16)10523#define DSC_INITIAL_OFFSET(initial_offset) ((initial_offset) << 16)
10490#define DSC_FINAL_OFFSET(final_offset) ((final_offset) << 0)10524#define DSC_FINAL_OFFSET(final_offset) ((final_offset) << 0)
10491 10525
10492#define DSCA_PICTURE_PARAMETER_SET_9 0x6B22410526#define DSCA_PICTURE_PARAMETER_SET_9 _MMIO(0x6B224)
10493#define DSCC_PICTURE_PARAMETER_SET_9 0x6BA2410527#define DSCC_PICTURE_PARAMETER_SET_9 _MMIO(0x6BA24)
10494#define _ICL_DSC0_PICTURE_PARAMETER_SET_9_PB 0x7829410528#define _ICL_DSC0_PICTURE_PARAMETER_SET_9_PB 0x78294
10495#define _ICL_DSC1_PICTURE_PARAMETER_SET_9_PB 0x7839410529#define _ICL_DSC1_PICTURE_PARAMETER_SET_9_PB 0x78394
10496#define _ICL_DSC0_PICTURE_PARAMETER_SET_9_PC 0x7849410530#define _ICL_DSC0_PICTURE_PARAMETER_SET_9_PC 0x78494
@@ -10504,8 +10538,8 @@ enum skl_power_gate { · 7 unmodified lines
10504#define DSC_RC_EDGE_FACTOR(rc_edge_fact) ((rc_edge_fact) << 16)10538#define DSC_RC_EDGE_FACTOR(rc_edge_fact) ((rc_edge_fact) << 16)
10505#define DSC_RC_MODEL_SIZE(rc_model_size) ((rc_model_size) << 0)10539#define DSC_RC_MODEL_SIZE(rc_model_size) ((rc_model_size) << 0)
10506 10540
10507#define DSCA_PICTURE_PARAMETER_SET_10 0x6B22810541#define DSCA_PICTURE_PARAMETER_SET_10 _MMIO(0x6B228)
10508#define DSCC_PICTURE_PARAMETER_SET_10 0x6BA2810542#define DSCC_PICTURE_PARAMETER_SET_10 _MMIO(0x6BA28)
10509#define _ICL_DSC0_PICTURE_PARAMETER_SET_10_PB 0x7829810543#define _ICL_DSC0_PICTURE_PARAMETER_SET_10_PB 0x78298
10510#define _ICL_DSC1_PICTURE_PARAMETER_SET_10_PB 0x7839810544#define _ICL_DSC1_PICTURE_PARAMETER_SET_10_PB 0x78398
10511#define _ICL_DSC0_PICTURE_PARAMETER_SET_10_PC 0x7849810545#define _ICL_DSC0_PICTURE_PARAMETER_SET_10_PC 0x78498
@@ -10521,8 +10555,8 @@ enum skl_power_gate { · 9 unmodified lines
10521#define DSC_RC_QUANT_INC_LIMIT1(lim) ((lim) << 8)10555#define DSC_RC_QUANT_INC_LIMIT1(lim) ((lim) << 8)
10522#define DSC_RC_QUANT_INC_LIMIT0(lim) ((lim) << 0)10556#define DSC_RC_QUANT_INC_LIMIT0(lim) ((lim) << 0)
10523 10557
10524#define DSCA_PICTURE_PARAMETER_SET_11 0x6B22C10558#define DSCA_PICTURE_PARAMETER_SET_11 _MMIO(0x6B22C)
10525#define DSCC_PICTURE_PARAMETER_SET_11 0x6BA2C10559#define DSCC_PICTURE_PARAMETER_SET_11 _MMIO(0x6BA2C)
10526#define _ICL_DSC0_PICTURE_PARAMETER_SET_11_PB 0x7829C10560#define _ICL_DSC0_PICTURE_PARAMETER_SET_11_PB 0x7829C
10527#define _ICL_DSC1_PICTURE_PARAMETER_SET_11_PB 0x7839C10561#define _ICL_DSC1_PICTURE_PARAMETER_SET_11_PB 0x7839C
10528#define _ICL_DSC0_PICTURE_PARAMETER_SET_11_PC 0x7849C10562#define _ICL_DSC0_PICTURE_PARAMETER_SET_11_PC 0x7849C
@@ -10534,8 +10568,8 @@ enum skl_power_gate { · 5 unmodified lines
10534 _ICL_DSC1_PICTURE_PARAMETER_SET_11_PB, \10568 _ICL_DSC1_PICTURE_PARAMETER_SET_11_PB, \
10535 _ICL_DSC1_PICTURE_PARAMETER_SET_11_PC)10569 _ICL_DSC1_PICTURE_PARAMETER_SET_11_PC)
10536 10570
10537#define DSCA_PICTURE_PARAMETER_SET_12 0x6B26010571#define DSCA_PICTURE_PARAMETER_SET_12 _MMIO(0x6B260)
10538#define DSCC_PICTURE_PARAMETER_SET_12 0x6BA6010572#define DSCC_PICTURE_PARAMETER_SET_12 _MMIO(0x6BA60)
10539#define _ICL_DSC0_PICTURE_PARAMETER_SET_12_PB 0x782A010573#define _ICL_DSC0_PICTURE_PARAMETER_SET_12_PB 0x782A0
10540#define _ICL_DSC1_PICTURE_PARAMETER_SET_12_PB 0x783A010574#define _ICL_DSC1_PICTURE_PARAMETER_SET_12_PB 0x783A0
10541#define _ICL_DSC0_PICTURE_PARAMETER_SET_12_PC 0x784A010575#define _ICL_DSC0_PICTURE_PARAMETER_SET_12_PC 0x784A0
@@ -10547,8 +10581,8 @@ enum skl_power_gate { · 5 unmodified lines
10547 _ICL_DSC1_PICTURE_PARAMETER_SET_12_PB, \10581 _ICL_DSC1_PICTURE_PARAMETER_SET_12_PB, \
10548 _ICL_DSC1_PICTURE_PARAMETER_SET_12_PC)10582 _ICL_DSC1_PICTURE_PARAMETER_SET_12_PC)
10549 10583
10550#define DSCA_PICTURE_PARAMETER_SET_13 0x6B26410584#define DSCA_PICTURE_PARAMETER_SET_13 _MMIO(0x6B264)
10551#define DSCC_PICTURE_PARAMETER_SET_13 0x6BA6410585#define DSCC_PICTURE_PARAMETER_SET_13 _MMIO(0x6BA64)
10552#define _ICL_DSC0_PICTURE_PARAMETER_SET_13_PB 0x782A410586#define _ICL_DSC0_PICTURE_PARAMETER_SET_13_PB 0x782A4
10553#define _ICL_DSC1_PICTURE_PARAMETER_SET_13_PB 0x783A410587#define _ICL_DSC1_PICTURE_PARAMETER_SET_13_PB 0x783A4
10554#define _ICL_DSC0_PICTURE_PARAMETER_SET_13_PC 0x784A410588#define _ICL_DSC0_PICTURE_PARAMETER_SET_13_PC 0x784A4
@@ -10560,8 +10594,8 @@ enum skl_power_gate { · 5 unmodified lines
10560 _ICL_DSC1_PICTURE_PARAMETER_SET_13_PB, \10594 _ICL_DSC1_PICTURE_PARAMETER_SET_13_PB, \
10561 _ICL_DSC1_PICTURE_PARAMETER_SET_13_PC)10595 _ICL_DSC1_PICTURE_PARAMETER_SET_13_PC)
10562 10596
10563#define DSCA_PICTURE_PARAMETER_SET_14 0x6B26810597#define DSCA_PICTURE_PARAMETER_SET_14 _MMIO(0x6B268)
10564#define DSCC_PICTURE_PARAMETER_SET_14 0x6BA6810598#define DSCC_PICTURE_PARAMETER_SET_14 _MMIO(0x6BA68)
10565#define _ICL_DSC0_PICTURE_PARAMETER_SET_14_PB 0x782A810599#define _ICL_DSC0_PICTURE_PARAMETER_SET_14_PB 0x782A8
10566#define _ICL_DSC1_PICTURE_PARAMETER_SET_14_PB 0x783A810600#define _ICL_DSC1_PICTURE_PARAMETER_SET_14_PB 0x783A8
10567#define _ICL_DSC0_PICTURE_PARAMETER_SET_14_PC 0x784A810601#define _ICL_DSC0_PICTURE_PARAMETER_SET_14_PC 0x784A8
@@ -10573,8 +10607,8 @@ enum skl_power_gate { · 5 unmodified lines
10573 _ICL_DSC1_PICTURE_PARAMETER_SET_14_PB, \10607 _ICL_DSC1_PICTURE_PARAMETER_SET_14_PB, \
10574 _ICL_DSC1_PICTURE_PARAMETER_SET_14_PC)10608 _ICL_DSC1_PICTURE_PARAMETER_SET_14_PC)
10575 10609
10576#define DSCA_PICTURE_PARAMETER_SET_15 0x6B26C10610#define DSCA_PICTURE_PARAMETER_SET_15 _MMIO(0x6B26C)
10577#define DSCC_PICTURE_PARAMETER_SET_15 0x6BA6C10611#define DSCC_PICTURE_PARAMETER_SET_15 _MMIO(0x6BA6C)
10578#define _ICL_DSC0_PICTURE_PARAMETER_SET_15_PB 0x782AC10612#define _ICL_DSC0_PICTURE_PARAMETER_SET_15_PB 0x782AC
10579#define _ICL_DSC1_PICTURE_PARAMETER_SET_15_PB 0x783AC10613#define _ICL_DSC1_PICTURE_PARAMETER_SET_15_PB 0x783AC
10580#define _ICL_DSC0_PICTURE_PARAMETER_SET_15_PC 0x784AC10614#define _ICL_DSC0_PICTURE_PARAMETER_SET_15_PC 0x784AC
@@ -10586,8 +10620,8 @@ enum skl_power_gate { · 5 unmodified lines
10586 _ICL_DSC1_PICTURE_PARAMETER_SET_15_PB, \10620 _ICL_DSC1_PICTURE_PARAMETER_SET_15_PB, \
10587 _ICL_DSC1_PICTURE_PARAMETER_SET_15_PC)10621 _ICL_DSC1_PICTURE_PARAMETER_SET_15_PC)
10588 10622
10589#define DSCA_PICTURE_PARAMETER_SET_16 0x6B27010623#define DSCA_PICTURE_PARAMETER_SET_16 _MMIO(0x6B270)
10590#define DSCC_PICTURE_PARAMETER_SET_16 0x6BA7010624#define DSCC_PICTURE_PARAMETER_SET_16 _MMIO(0x6BA70)
10591#define _ICL_DSC0_PICTURE_PARAMETER_SET_16_PB 0x782B010625#define _ICL_DSC0_PICTURE_PARAMETER_SET_16_PB 0x782B0
10592#define _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB 0x783B010626#define _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB 0x783B0
10593#define _ICL_DSC0_PICTURE_PARAMETER_SET_16_PC 0x784B010627#define _ICL_DSC0_PICTURE_PARAMETER_SET_16_PC 0x784B0
@@ -10599,7 +10633,7 @@ enum skl_power_gate { · 5 unmodified lines
10599 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB, \10633 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB, \
10600 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PC)10634 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PC)
10601#define DSC_SLICE_PER_LINE(slice_per_line) ((slice_per_line) << 16)10635#define DSC_SLICE_PER_LINE(slice_per_line) ((slice_per_line) << 16)
10602#define DSC_SLICE_CHUNK_SIZE(slice_chunk_aize) (slice_chunk_size << 0)10636#define DSC_SLICE_CHUNK_SIZE(slice_chunk_size) ((slice_chunk_size) << 0)
10603 10637
10604/* Icelake Rate Control Buffer Threshold Registers */10638/* Icelake Rate Control Buffer Threshold Registers */
10605#define DSCA_RC_BUF_THRESH_0 _MMIO(0x6B230)10639#define DSCA_RC_BUF_THRESH_0 _MMIO(0x6B230)
@@ -10652,4 +10686,17 @@ enum skl_power_gate { · 46 unmodified lines
10652 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PB, \10686 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PB, \
10653 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PC)10687 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PC)
10654 10688
10689#define PORT_TX_DFLEXDPSP _MMIO(0x1638A0)
10690#define TC_LIVE_STATE_TBT(tc_port) (1 << ((tc_port) * 8 + 6))
10691#define TC_LIVE_STATE_TC(tc_port) (1 << ((tc_port) * 8 + 5))
10692#define DP_LANE_ASSIGNMENT_SHIFT(tc_port) ((tc_port) * 8)
10693#define DP_LANE_ASSIGNMENT_MASK(tc_port) (0xf << ((tc_port) * 8))
10694#define DP_LANE_ASSIGNMENT(tc_port, x) ((x) << ((tc_port) * 8))
10695
10696#define PORT_TX_DFLEXDPPMS _MMIO(0x163890)
10697#define DP_PHY_MODE_STATUS_COMPLETED(tc_port) (1 << (tc_port))
10698
10699#define PORT_TX_DFLEXDPCSSS _MMIO(0x163894)
10700#define DP_PHY_MODE_STATUS_NOT_SAFE(tc_port) (1 << (tc_port))
10701
10655#endif /* _I915_REG_H_ */10702#endif /* _I915_REG_H_ */
drivers/gpu/drm/i915/i915_request.c+4−5
@@ -527,7 +527,7 @@ void __i915_request_submit(struct i915_request *request) · 526 unmodified lines
527 527
528 seqno = timeline_get_seqno(&engine->timeline);528 seqno = timeline_get_seqno(&engine->timeline);
529 GEM_BUG_ON(!seqno);529 GEM_BUG_ON(!seqno);
530 GEM_BUG_ON(i915_seqno_passed(intel_engine_get_seqno(engine), seqno));530 GEM_BUG_ON(intel_engine_signaled(engine, seqno));
531 531
532 /* We may be recursing from the signal callback of another i915 fence */532 /* We may be recursing from the signal callback of another i915 fence */
533 spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING);533 spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING);
@@ -579,8 +579,7 @@ void __i915_request_unsubmit(struct i915_request *request) · 45 unmodified lines
579 */579 */
580 GEM_BUG_ON(!request->global_seqno);580 GEM_BUG_ON(!request->global_seqno);
581 GEM_BUG_ON(request->global_seqno != engine->timeline.seqno);581 GEM_BUG_ON(request->global_seqno != engine->timeline.seqno);
582 GEM_BUG_ON(i915_seqno_passed(intel_engine_get_seqno(engine),582 GEM_BUG_ON(intel_engine_has_completed(engine, request->global_seqno));
583 request->global_seqno));
584 engine->timeline.seqno--;583 engine->timeline.seqno--;
585 584
586 /* We may be recursing from the signal callback of another i915 fence */585 /* We may be recursing from the signal callback of another i915 fence */
@@ -1205,7 +1204,7 @@ static bool __i915_spin_request(const struct i915_request *rq, · 618 unmodified lines
1205 * it is a fair assumption that it will not complete within our1204 * it is a fair assumption that it will not complete within our
1206 * relatively short timeout.1205 * relatively short timeout.
1207 */1206 */
1208 if (!i915_seqno_passed(intel_engine_get_seqno(engine), seqno - 1))1207 if (!intel_engine_has_started(engine, seqno))
1209 return false;1208 return false;
1210 1209
1211 /*1210 /*
@@ -1222,7 +1221,7 @@ static bool __i915_spin_request(const struct i915_request *rq, · 10 unmodified lines
1222 irq = READ_ONCE(engine->breadcrumbs.irq_count);1221 irq = READ_ONCE(engine->breadcrumbs.irq_count);
1223 timeout_us += local_clock_us(&cpu);1222 timeout_us += local_clock_us(&cpu);
1224 do {1223 do {
1225 if (i915_seqno_passed(intel_engine_get_seqno(engine), seqno))1224 if (intel_engine_has_completed(engine, seqno))
1226 return seqno == i915_request_global_seqno(rq);1225 return seqno == i915_request_global_seqno(rq);
1227 1226
1228 /*1227 /*
drivers/gpu/drm/i915/i915_request.h+25−14
@@ -272,7 +272,10 @@ long i915_request_wait(struct i915_request *rq, · 271 unmodified lines
272#define I915_WAIT_ALL BIT(2) /* used by i915_gem_object_wait() */272#define I915_WAIT_ALL BIT(2) /* used by i915_gem_object_wait() */
273#define I915_WAIT_FOR_IDLE_BOOST BIT(3)273#define I915_WAIT_FOR_IDLE_BOOST BIT(3)
274 274
275static inline u32 intel_engine_get_seqno(struct intel_engine_cs *engine);275static inline bool intel_engine_has_started(struct intel_engine_cs *engine,
276 u32 seqno);
277static inline bool intel_engine_has_completed(struct intel_engine_cs *engine,
278 u32 seqno);
276 279
277/**280/**
278 * Returns true if seq1 is later than seq2.281 * Returns true if seq1 is later than seq2.
@@ -282,11 +285,31 @@ static inline bool i915_seqno_passed(u32 seq1, u32 seq2) · 3 unmodified lines
282 return (s32)(seq1 - seq2) >= 0;285 return (s32)(seq1 - seq2) >= 0;
283}286}
284 287
288/**
289 * i915_request_started - check if the request has begun being executed
290 * @rq: the request
291 *
292 * Returns true if the request has been submitted to hardware, and the hardware
293 * has advanced passed the end of the previous request and so should be either
294 * currently processing the request (though it may be preempted and so
295 * not necessarily the next request to complete) or have completed the request.
296 */
297static inline bool i915_request_started(const struct i915_request *rq)
298{
299 u32 seqno;
300
301 seqno = i915_request_global_seqno(rq);
302 if (!seqno) /* not yet submitted to HW */
303 return false;
304
305 return intel_engine_has_started(rq->engine, seqno);
306}
307
285static inline bool308static inline bool
286__i915_request_completed(const struct i915_request *rq, u32 seqno)309__i915_request_completed(const struct i915_request *rq, u32 seqno)
287{310{
288 GEM_BUG_ON(!seqno);311 GEM_BUG_ON(!seqno);
289 return i915_seqno_passed(intel_engine_get_seqno(rq->engine), seqno) &&312 return intel_engine_has_completed(rq->engine, seqno) &&
290 seqno == i915_request_global_seqno(rq);313 seqno == i915_request_global_seqno(rq);
291}314}
292 315
@@ -301,18 +324,6 @@ static inline bool i915_request_completed(const struct i915_request *rq) · 8 unmodified lines
301 return __i915_request_completed(rq, seqno);324 return __i915_request_completed(rq, seqno);
302}325}
303 326
304static inline bool i915_request_started(const struct i915_request *rq)
305{
306 u32 seqno;
307
308 seqno = i915_request_global_seqno(rq);
309 if (!seqno)
310 return false;
311
312 return i915_seqno_passed(intel_engine_get_seqno(rq->engine),
313 seqno - 1);
314}
315
316static inline bool i915_sched_node_signaled(const struct i915_sched_node *node)327static inline bool i915_sched_node_signaled(const struct i915_sched_node *node)
317{328{
318 const struct i915_request *rq =329 const struct i915_request *rq =
drivers/gpu/drm/i915/i915_vma.c+4−1
@@ -405,7 +405,7 @@ void i915_vma_unpin_iomap(struct i915_vma *vma) · 404 unmodified lines
405 i915_vma_unpin(vma);405 i915_vma_unpin(vma);
406}406}
407 407
408void i915_vma_unpin_and_release(struct i915_vma **p_vma)408void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags)
409{409{
410 struct i915_vma *vma;410 struct i915_vma *vma;
411 struct drm_i915_gem_object *obj;411 struct drm_i915_gem_object *obj;
@@ -420,6 +420,9 @@ void i915_vma_unpin_and_release(struct i915_vma **p_vma) · 8 unmodified lines
420 i915_vma_unpin(vma);420 i915_vma_unpin(vma);
421 i915_vma_close(vma);421 i915_vma_close(vma);
422 422
423 if (flags & I915_VMA_RELEASE_MAP)
424 i915_gem_object_unpin_map(obj);
425
423 __i915_gem_object_release_unless_active(obj);426 __i915_gem_object_release_unless_active(obj);
424}427}
425 428
drivers/gpu/drm/i915/i915_vma.h+9−1
@@ -138,7 +138,8 @@ i915_vma_instance(struct drm_i915_gem_object *obj, · 137 unmodified lines
138 struct i915_address_space *vm,138 struct i915_address_space *vm,
139 const struct i915_ggtt_view *view);139 const struct i915_ggtt_view *view);
140 140
141void i915_vma_unpin_and_release(struct i915_vma **p_vma);141void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags);
142#define I915_VMA_RELEASE_MAP BIT(0)
142 143
143static inline bool i915_vma_is_active(struct i915_vma *vma)144static inline bool i915_vma_is_active(struct i915_vma *vma)
144{145{
@@ -207,6 +208,11 @@ static inline u32 i915_ggtt_offset(const struct i915_vma *vma) · 62 unmodified lines
207 return lower_32_bits(vma->node.start);208 return lower_32_bits(vma->node.start);
208}209}
209 210
211static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma)
212{
213 return i915_vm_to_ggtt(vma->vm)->pin_bias;
214}
215
210static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)216static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)
211{217{
212 i915_gem_object_get(vma->obj);218 i915_gem_object_get(vma->obj);
@@ -245,6 +251,8 @@ i915_vma_compare(struct i915_vma *vma, · 32 unmodified lines
245 if (cmp)251 if (cmp)
246 return cmp;252 return cmp;
247 253
254 assert_i915_gem_gtt_types();
255
248 /* ggtt_view.type also encodes its size so that we both distinguish256 /* ggtt_view.type also encodes its size so that we both distinguish
249 * different views using it as a "type" and also use a compact (no257 * different views using it as a "type" and also use a compact (no
250 * accessing of uninitialised padding bytes) memcmp without storing258 * accessing of uninitialised padding bytes) memcmp without storing
drivers/gpu/drm/i915/intel_atomic_plane.c+4−2
@@ -159,7 +159,7 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_ · 158 unmodified lines
159 }159 }
160 160
161 intel_state->base.visible = false;161 intel_state->base.visible = false;
162 ret = intel_plane->check_plane(intel_plane, crtc_state, intel_state);162 ret = intel_plane->check_plane(crtc_state, intel_state);
163 if (ret)163 if (ret)
164 return ret;164 return ret;
165 165
@@ -170,7 +170,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_ · 4 unmodified lines
170 if (state->fb && INTEL_GEN(dev_priv) >= 9 && crtc_state->base.enable &&170 if (state->fb && INTEL_GEN(dev_priv) >= 9 && crtc_state->base.enable &&
171 adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {171 adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
172 if (state->fb->modifier == I915_FORMAT_MOD_Y_TILED ||172 if (state->fb->modifier == I915_FORMAT_MOD_Y_TILED ||
173 state->fb->modifier == I915_FORMAT_MOD_Yf_TILED) {173 state->fb->modifier == I915_FORMAT_MOD_Yf_TILED ||
174 state->fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS ||
175 state->fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS) {
174 DRM_DEBUG_KMS("Y/Yf tiling not supported in IF-ID mode\n");176 DRM_DEBUG_KMS("Y/Yf tiling not supported in IF-ID mode\n");
175 return -EINVAL;177 return -EINVAL;
176 }178 }
drivers/gpu/drm/i915/intel_breadcrumbs.c+2−4
@@ -256,8 +256,7 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) · 255 unmodified lines
256 spin_unlock(&b->irq_lock);256 spin_unlock(&b->irq_lock);
257 257
258 rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) {258 rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) {
259 GEM_BUG_ON(!i915_seqno_passed(intel_engine_get_seqno(engine),259 GEM_BUG_ON(!intel_engine_signaled(engine, wait->seqno));
260 wait->seqno));
261 RB_CLEAR_NODE(&wait->node);260 RB_CLEAR_NODE(&wait->node);
262 wake_up_process(wait->tsk);261 wake_up_process(wait->tsk);
263 }262 }
@@ -508,8 +507,7 @@ bool intel_engine_add_wait(struct intel_engine_cs *engine, · 244 unmodified lines
508 return armed;507 return armed;
509 508
510 /* Make the caller recheck if its request has already started. */509 /* Make the caller recheck if its request has already started. */
511 return i915_seqno_passed(intel_engine_get_seqno(engine),510 return intel_engine_has_started(engine, wait->seqno);
512 wait->seqno - 1);
513}511}
514 512
515static inline bool chain_wakeup(struct rb_node *rb, int priority)513static inline bool chain_wakeup(struct rb_node *rb, int priority)
drivers/gpu/drm/i915/intel_csr.c+24−9
@@ -55,7 +55,9 @@ MODULE_FIRMWARE(I915_CSR_BXT); · 54 unmodified lines
55#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)55#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
56 56
57 57
58#define CSR_MAX_FW_SIZE 0x2FFF58#define BXT_CSR_MAX_FW_SIZE 0x3000
59#define GLK_CSR_MAX_FW_SIZE 0x4000
60#define ICL_CSR_MAX_FW_SIZE 0x6000
59#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF61#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
60 62
61struct intel_css_header {63struct intel_css_header {
@@ -279,6 +281,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv, · 217 unmodified lines
279 struct intel_csr *csr = &dev_priv->csr;281 struct intel_csr *csr = &dev_priv->csr;
280 const struct stepping_info *si = intel_get_stepping_info(dev_priv);282 const struct stepping_info *si = intel_get_stepping_info(dev_priv);
281 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;283 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
284 uint32_t max_fw_size = 0;
282 uint32_t i;285 uint32_t i;
283 uint32_t *dmc_payload;286 uint32_t *dmc_payload;
284 uint32_t required_version;287 uint32_t required_version;
@@ -359,6 +362,8 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv, · 74 unmodified lines
359 si->stepping);362 si->stepping);
360 return NULL;363 return NULL;
361 }364 }
365 /* Convert dmc_offset into number of bytes. By default it is in dwords*/
366 dmc_offset *= 4;
362 readcount += dmc_offset;367 readcount += dmc_offset;
363 368
364 /* Extract dmc_header information. */369 /* Extract dmc_header information. */
@@ -391,8 +396,16 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv, · 26 unmodified lines
391 396
392 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */397 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
393 nbytes = dmc_header->fw_size * 4;398 nbytes = dmc_header->fw_size * 4;
394 if (nbytes > CSR_MAX_FW_SIZE) {399 if (INTEL_GEN(dev_priv) >= 11)
395 DRM_ERROR("DMC firmware too big (%u bytes)\n", nbytes);400 max_fw_size = ICL_CSR_MAX_FW_SIZE;
401 else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
402 max_fw_size = GLK_CSR_MAX_FW_SIZE;
403 else if (IS_GEN9(dev_priv))
404 max_fw_size = BXT_CSR_MAX_FW_SIZE;
405 else
406 MISSING_CASE(INTEL_REVID(dev_priv));
407 if (nbytes > max_fw_size) {
408 DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes);
396 return NULL;409 return NULL;
397 }410 }
398 csr->dmc_fw_size = dmc_header->fw_size;411 csr->dmc_fw_size = dmc_header->fw_size;
@@ -468,12 +481,6 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv) · 69 unmodified lines
468 csr->fw_path = I915_CSR_SKL;481 csr->fw_path = I915_CSR_SKL;
469 else if (IS_BROXTON(dev_priv))482 else if (IS_BROXTON(dev_priv))
470 csr->fw_path = I915_CSR_BXT;483 csr->fw_path = I915_CSR_BXT;
471 else {
472 DRM_ERROR("Unexpected: no known CSR firmware for platform\n");
473 return;
474 }
475
476 DRM_DEBUG_KMS("Loading %s\n", csr->fw_path);
477 484
478 /*485 /*
479 * Obtain a runtime pm reference, until CSR is loaded,486 * Obtain a runtime pm reference, until CSR is loaded,
@@ -481,6 +488,14 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv) · 1 unmodified line
481 */488 */
482 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);489 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
483 490
491 if (csr->fw_path == NULL) {
492 DRM_DEBUG_KMS("No known CSR firmware for platform, disabling runtime PM\n");
493 WARN_ON(!IS_ALPHA_SUPPORT(INTEL_INFO(dev_priv)));
494
495 return;
496 }
497
498 DRM_DEBUG_KMS("Loading %s\n", csr->fw_path);
484 schedule_work(&dev_priv->csr.work);499 schedule_work(&dev_priv->csr.work);
485}500}
486 501
drivers/gpu/drm/i915/intel_ddi.c+223−17
@@ -1414,7 +1414,7 @@ static int cnl_calc_wrpll_link(struct drm_i915_private *dev_priv, · 1413 unmodified lines
1414 break;1414 break;
1415 }1415 }
1416 1416
1417 ref_clock = dev_priv->cdclk.hw.ref;1417 ref_clock = cnl_hdmi_pll_ref_clock(dev_priv);
1418 1418
1419 dco_freq = (cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) * ref_clock;1419 dco_freq = (cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) * ref_clock;
1420 1420
@@ -1427,6 +1427,81 @@ static int cnl_calc_wrpll_link(struct drm_i915_private *dev_priv, · 6 unmodified lines
1427 return dco_freq / (p0 * p1 * p2 * 5);1427 return dco_freq / (p0 * p1 * p2 * 5);
1428}1428}
1429 1429
1430static int icl_calc_tbt_pll_link(struct drm_i915_private *dev_priv,
1431 enum port port)
1432{
1433 u32 val = I915_READ(DDI_CLK_SEL(port)) & DDI_CLK_SEL_MASK;
1434
1435 switch (val) {
1436 case DDI_CLK_SEL_NONE:
1437 return 0;
1438 case DDI_CLK_SEL_TBT_162:
1439 return 162000;
1440 case DDI_CLK_SEL_TBT_270:
1441 return 270000;
1442 case DDI_CLK_SEL_TBT_540:
1443 return 540000;
1444 case DDI_CLK_SEL_TBT_810:
1445 return 810000;
1446 default:
1447 MISSING_CASE(val);
1448 return 0;
1449 }
1450}
1451
1452static int icl_calc_mg_pll_link(struct drm_i915_private *dev_priv,
1453 enum port port)
1454{
1455 u32 mg_pll_div0, mg_clktop_hsclkctl;
1456 u32 m1, m2_int, m2_frac, div1, div2, refclk;
1457 u64 tmp;
1458
1459 refclk = dev_priv->cdclk.hw.ref;
1460
1461 mg_pll_div0 = I915_READ(MG_PLL_DIV0(port));
1462 mg_clktop_hsclkctl = I915_READ(MG_CLKTOP2_HSCLKCTL(port));
1463
1464 m1 = I915_READ(MG_PLL_DIV1(port)) & MG_PLL_DIV1_FBPREDIV_MASK;
1465 m2_int = mg_pll_div0 & MG_PLL_DIV0_FBDIV_INT_MASK;
1466 m2_frac = (mg_pll_div0 & MG_PLL_DIV0_FRACNEN_H) ?
1467 (mg_pll_div0 & MG_PLL_DIV0_FBDIV_FRAC_MASK) >>
1468 MG_PLL_DIV0_FBDIV_FRAC_SHIFT : 0;
1469
1470 switch (mg_clktop_hsclkctl & MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK) {
1471 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2:
1472 div1 = 2;
1473 break;
1474 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3:
1475 div1 = 3;
1476 break;
1477 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5:
1478 div1 = 5;
1479 break;
1480 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7:
1481 div1 = 7;
1482 break;
1483 default:
1484 MISSING_CASE(mg_clktop_hsclkctl);
1485 return 0;
1486 }
1487
1488 div2 = (mg_clktop_hsclkctl & MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK) >>
1489 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_SHIFT;
1490 /* div2 value of 0 is same as 1 means no div */
1491 if (div2 == 0)
1492 div2 = 1;
1493
1494 /*
1495 * Adjust the original formula to delay the division by 2^22 in order to
1496 * minimize possible rounding errors.
1497 */
1498 tmp = (u64)m1 * m2_int * refclk +
1499 (((u64)m1 * m2_frac * refclk) >> 22);
1500 tmp = div_u64(tmp, 5 * div1 * div2);
1501
1502 return tmp;
1503}
1504
1430static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)1505static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
1431{1506{
1432 int dotclock;1507 int dotclock;
@@ -1467,8 +1542,10 @@ static void icl_ddi_clock_get(struct intel_encoder *encoder, · 34 unmodified lines
1467 link_clock = icl_calc_dp_combo_pll_link(dev_priv,1542 link_clock = icl_calc_dp_combo_pll_link(dev_priv,
1468 pll_id);1543 pll_id);
1469 } else {1544 } else {
1470 /* FIXME - Add for MG PLL */1545 if (pll_id == DPLL_ID_ICL_TBTPLL)
1471 WARN(1, "MG PLL clock_get code not implemented yet\n");1546 link_clock = icl_calc_tbt_pll_link(dev_priv, port);
1547 else
1548 link_clock = icl_calc_mg_pll_link(dev_priv, port);
1472 }1549 }
1473 1550
1474 pipe_config->port_clock = link_clock;1551 pipe_config->port_clock = link_clock;
@@ -2468,7 +2545,128 @@ static void icl_combo_phy_ddi_vswing_sequence(struct intel_encoder *encoder, · 993 unmodified lines
2468 I915_WRITE(ICL_PORT_TX_DW5_GRP(port), val);2545 I915_WRITE(ICL_PORT_TX_DW5_GRP(port), val);
2469}2546}
2470 2547
2471static void icl_ddi_vswing_sequence(struct intel_encoder *encoder, u32 level,2548static void icl_mg_phy_ddi_vswing_sequence(struct intel_encoder *encoder,
2549 int link_clock,
2550 u32 level)
2551{
2552 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2553 enum port port = encoder->port;
2554 const struct icl_mg_phy_ddi_buf_trans *ddi_translations;
2555 u32 n_entries, val;
2556 int ln;
2557
2558 n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations);
2559 ddi_translations = icl_mg_phy_ddi_translations;
2560 /* The table does not have values for level 3 and level 9. */
2561 if (level >= n_entries || level == 3 || level == 9) {
2562 DRM_DEBUG_KMS("DDI translation not found for level %d. Using %d instead.",
2563 level, n_entries - 2);
2564 level = n_entries - 2;
2565 }
2566
2567 /* Set MG_TX_LINK_PARAMS cri_use_fs32 to 0. */
2568 for (ln = 0; ln < 2; ln++) {
2569 val = I915_READ(MG_TX1_LINK_PARAMS(port, ln));
2570 val &= ~CRI_USE_FS32;
2571 I915_WRITE(MG_TX1_LINK_PARAMS(port, ln), val);
2572
2573 val = I915_READ(MG_TX2_LINK_PARAMS(port, ln));
2574 val &= ~CRI_USE_FS32;
2575 I915_WRITE(MG_TX2_LINK_PARAMS(port, ln), val);
2576 }
2577
2578 /* Program MG_TX_SWINGCTRL with values from vswing table */
2579 for (ln = 0; ln < 2; ln++) {
2580 val = I915_READ(MG_TX1_SWINGCTRL(port, ln));
2581 val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK;
2582 val |= CRI_TXDEEMPH_OVERRIDE_17_12(
2583 ddi_translations[level].cri_txdeemph_override_17_12);
2584 I915_WRITE(MG_TX1_SWINGCTRL(port, ln), val);
2585
2586 val = I915_READ(MG_TX2_SWINGCTRL(port, ln));
2587 val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK;
2588 val |= CRI_TXDEEMPH_OVERRIDE_17_12(
2589 ddi_translations[level].cri_txdeemph_override_17_12);
2590 I915_WRITE(MG_TX2_SWINGCTRL(port, ln), val);
2591 }
2592
2593 /* Program MG_TX_DRVCTRL with values from vswing table */
2594 for (ln = 0; ln < 2; ln++) {
2595 val = I915_READ(MG_TX1_DRVCTRL(port, ln));
2596 val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK |
2597 CRI_TXDEEMPH_OVERRIDE_5_0_MASK);
2598 val |= CRI_TXDEEMPH_OVERRIDE_5_0(
2599 ddi_translations[level].cri_txdeemph_override_5_0) |
2600 CRI_TXDEEMPH_OVERRIDE_11_6(
2601 ddi_translations[level].cri_txdeemph_override_11_6) |
2602 CRI_TXDEEMPH_OVERRIDE_EN;
2603 I915_WRITE(MG_TX1_DRVCTRL(port, ln), val);
2604
2605 val = I915_READ(MG_TX2_DRVCTRL(port, ln));
2606 val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK |
2607 CRI_TXDEEMPH_OVERRIDE_5_0_MASK);
2608 val |= CRI_TXDEEMPH_OVERRIDE_5_0(
2609 ddi_translations[level].cri_txdeemph_override_5_0) |
2610 CRI_TXDEEMPH_OVERRIDE_11_6(
2611 ddi_translations[level].cri_txdeemph_override_11_6) |
2612 CRI_TXDEEMPH_OVERRIDE_EN;
2613 I915_WRITE(MG_TX2_DRVCTRL(port, ln), val);
2614
2615 /* FIXME: Program CRI_LOADGEN_SEL after the spec is updated */
2616 }
2617
2618 /*
2619 * Program MG_CLKHUB<LN, port being used> with value from frequency table
2620 * In case of Legacy mode on MG PHY, both TX1 and TX2 enabled so use the
2621 * values from table for which TX1 and TX2 enabled.
2622 */
2623 for (ln = 0; ln < 2; ln++) {
2624 val = I915_READ(MG_CLKHUB(port, ln));
2625 if (link_clock < 300000)
2626 val |= CFG_LOW_RATE_LKREN_EN;
2627 else
2628 val &= ~CFG_LOW_RATE_LKREN_EN;
2629 I915_WRITE(MG_CLKHUB(port, ln), val);
2630 }
2631
2632 /* Program the MG_TX_DCC<LN, port being used> based on the link frequency */
2633 for (ln = 0; ln < 2; ln++) {
2634 val = I915_READ(MG_TX1_DCC(port, ln));
2635 val &= ~CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK;
2636 if (link_clock <= 500000) {
2637 val &= ~CFG_AMI_CK_DIV_OVERRIDE_EN;
2638 } else {
2639 val |= CFG_AMI_CK_DIV_OVERRIDE_EN |
2640 CFG_AMI_CK_DIV_OVERRIDE_VAL(1);
2641 }
2642 I915_WRITE(MG_TX1_DCC(port, ln), val);
2643
2644 val = I915_READ(MG_TX2_DCC(port, ln));
2645 val &= ~CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK;
2646 if (link_clock <= 500000) {
2647 val &= ~CFG_AMI_CK_DIV_OVERRIDE_EN;
2648 } else {
2649 val |= CFG_AMI_CK_DIV_OVERRIDE_EN |
2650 CFG_AMI_CK_DIV_OVERRIDE_VAL(1);
2651 }
2652 I915_WRITE(MG_TX2_DCC(port, ln), val);
2653 }
2654
2655 /* Program MG_TX_PISO_READLOAD with values from vswing table */
2656 for (ln = 0; ln < 2; ln++) {
2657 val = I915_READ(MG_TX1_PISO_READLOAD(port, ln));
2658 val |= CRI_CALCINIT;
2659 I915_WRITE(MG_TX1_PISO_READLOAD(port, ln), val);
2660
2661 val = I915_READ(MG_TX2_PISO_READLOAD(port, ln));
2662 val |= CRI_CALCINIT;
2663 I915_WRITE(MG_TX2_PISO_READLOAD(port, ln), val);
2664 }
2665}
2666
2667static void icl_ddi_vswing_sequence(struct intel_encoder *encoder,
2668 int link_clock,
2669 u32 level,
2472 enum intel_output_type type)2670 enum intel_output_type type)
2473{2671{
2474 enum port port = encoder->port;2672 enum port port = encoder->port;
@@ -2476,8 +2674,7 @@ static void icl_ddi_vswing_sequence(struct intel_encoder *encoder, u32 level, · 1 unmodified line
2476 if (port == PORT_A || port == PORT_B)2674 if (port == PORT_A || port == PORT_B)
2477 icl_combo_phy_ddi_vswing_sequence(encoder, level, type);2675 icl_combo_phy_ddi_vswing_sequence(encoder, level, type);
2478 else2676 else
2479 /* Not Implemented Yet */2677 icl_mg_phy_ddi_vswing_sequence(encoder, link_clock, level);
2480 WARN_ON(1);
2481}2678}
2482 2679
2483static uint32_t translate_signal_level(int signal_levels)2680static uint32_t translate_signal_level(int signal_levels)
@@ -2512,7 +2709,8 @@ u32 bxt_signal_levels(struct intel_dp *intel_dp) · 28 unmodified lines
2512 int level = intel_ddi_dp_level(intel_dp);2709 int level = intel_ddi_dp_level(intel_dp);
2513 2710
2514 if (IS_ICELAKE(dev_priv))2711 if (IS_ICELAKE(dev_priv))
2515 icl_ddi_vswing_sequence(encoder, level, encoder->type);2712 icl_ddi_vswing_sequence(encoder, intel_dp->link_rate,
2713 level, encoder->type);
2516 else if (IS_CANNONLAKE(dev_priv))2714 else if (IS_CANNONLAKE(dev_priv))
2517 cnl_ddi_vswing_sequence(encoder, level, encoder->type);2715 cnl_ddi_vswing_sequence(encoder, level, encoder->type);
2518 else2716 else
@@ -2692,8 +2890,12 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, · 173 unmodified lines
2692 2890
2693 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);2891 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2694 2892
2893 icl_program_mg_dp_mode(intel_dp);
2894 icl_disable_phy_clock_gating(dig_port);
2895
2695 if (IS_ICELAKE(dev_priv))2896 if (IS_ICELAKE(dev_priv))
2696 icl_ddi_vswing_sequence(encoder, level, encoder->type);2897 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock,
2898 level, encoder->type);
2697 else if (IS_CANNONLAKE(dev_priv))2899 else if (IS_CANNONLAKE(dev_priv))
2698 cnl_ddi_vswing_sequence(encoder, level, encoder->type);2900 cnl_ddi_vswing_sequence(encoder, level, encoder->type);
2699 else if (IS_GEN9_LP(dev_priv))2901 else if (IS_GEN9_LP(dev_priv))
@@ -2708,7 +2910,10 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, · 8 unmodified lines
2708 if (port != PORT_A || INTEL_GEN(dev_priv) >= 9)2910 if (port != PORT_A || INTEL_GEN(dev_priv) >= 9)
2709 intel_dp_stop_link_train(intel_dp);2911 intel_dp_stop_link_train(intel_dp);
2710 2912
2711 intel_ddi_enable_pipe_clock(crtc_state);2913 icl_enable_phy_clock_gating(dig_port);
2914
2915 if (!is_mst)
2916 intel_ddi_enable_pipe_clock(crtc_state);
2712}2917}
2713 2918
2714static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,2919static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
@@ -2728,7 +2933,8 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder, · 13 unmodified lines
2728 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);2933 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2729 2934
2730 if (IS_ICELAKE(dev_priv))2935 if (IS_ICELAKE(dev_priv))
2731 icl_ddi_vswing_sequence(encoder, level, INTEL_OUTPUT_HDMI);2936 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock,
2937 level, INTEL_OUTPUT_HDMI);
2732 else if (IS_CANNONLAKE(dev_priv))2938 else if (IS_CANNONLAKE(dev_priv))
2733 cnl_ddi_vswing_sequence(encoder, level, INTEL_OUTPUT_HDMI);2939 cnl_ddi_vswing_sequence(encoder, level, INTEL_OUTPUT_HDMI);
2734 else if (IS_GEN9_LP(dev_priv))2940 else if (IS_GEN9_LP(dev_priv))
@@ -2810,14 +3016,14 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder, · 75 unmodified lines
2810 bool is_mst = intel_crtc_has_type(old_crtc_state,3016 bool is_mst = intel_crtc_has_type(old_crtc_state,
2811 INTEL_OUTPUT_DP_MST);3017 INTEL_OUTPUT_DP_MST);
2812 3018
2813 intel_ddi_disable_pipe_clock(old_crtc_state);3019 if (!is_mst) {
2814 3020 intel_ddi_disable_pipe_clock(old_crtc_state);
2815 /*3021 /*
2816 * Power down sink before disabling the port, otherwise we end3022 * Power down sink before disabling the port, otherwise we end
2817 * up getting interrupts from the sink on detecting link loss.3023 * up getting interrupts from the sink on detecting link loss.
2818 */3024 */
2819 if (!is_mst)
2820 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);3025 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
3026 }
2821 3027
2822 intel_disable_ddi_buf(encoder);3028 intel_disable_ddi_buf(encoder);
2823 3029
drivers/gpu/drm/i915/intel_device_info.h+1−1
@@ -103,9 +103,9 @@ enum intel_platform { · 102 unmodified lines
103 func(has_psr); \103 func(has_psr); \
104 func(has_rc6); \104 func(has_rc6); \
105 func(has_rc6p); \105 func(has_rc6p); \
106 func(has_resource_streamer); \
107 func(has_runtime_pm); \106 func(has_runtime_pm); \
108 func(has_snoop); \107 func(has_snoop); \
108 func(has_coherent_ggtt); \
109 func(unfenced_needs_alignment); \109 func(unfenced_needs_alignment); \
110 func(cursor_needs_physical); \110 func(cursor_needs_physical); \
111 func(hws_needs_physical); \111 func(hws_needs_physical); \
drivers/gpu/drm/i915/intel_display.c+115−57
@@ -2474,6 +2474,12 @@ intel_get_format_info(const struct drm_mode_fb_cmd2 *cmd) · 2473 unmodified lines
2474 }2474 }
2475}2475}
2476 2476
2477bool is_ccs_modifier(u64 modifier)
2478{
2479 return modifier == I915_FORMAT_MOD_Y_TILED_CCS ||
2480 modifier == I915_FORMAT_MOD_Yf_TILED_CCS;
2481}
2482
2477static int2483static int
2478intel_fill_fb_info(struct drm_i915_private *dev_priv,2484intel_fill_fb_info(struct drm_i915_private *dev_priv,
2479 struct drm_framebuffer *fb)2485 struct drm_framebuffer *fb)
@@ -2504,8 +2510,7 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv, · 24 unmodified lines
2504 return ret;2510 return ret;
2505 }2511 }
2506 2512
2507 if ((fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS ||2513 if (is_ccs_modifier(fb->modifier) && i == 1) {
2508 fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS) && i == 1) {
2509 int hsub = fb->format->hsub;2514 int hsub = fb->format->hsub;
2510 int vsub = fb->format->vsub;2515 int vsub = fb->format->vsub;
2511 int tile_width, tile_height;2516 int tile_width, tile_height;
@@ -3055,8 +3060,7 @@ static int skl_check_main_surface(const struct intel_crtc_state *crtc_state, · 543 unmodified lines
3055 * CCS AUX surface doesn't have its own x/y offsets, we must make sure3060 * CCS AUX surface doesn't have its own x/y offsets, we must make sure
3056 * they match with the main surface x/y offsets.3061 * they match with the main surface x/y offsets.
3057 */3062 */
3058 if (fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS ||3063 if (is_ccs_modifier(fb->modifier)) {
3059 fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS) {
3060 while (!skl_check_main_ccs_coordinates(plane_state, x, y, offset)) {3064 while (!skl_check_main_ccs_coordinates(plane_state, x, y, offset)) {
3061 if (offset == 0)3065 if (offset == 0)
3062 break;3066 break;
@@ -3190,8 +3194,7 @@ int skl_check_plane_surface(const struct intel_crtc_state *crtc_state, · 127 unmodified lines
3190 ret = skl_check_nv12_aux_surface(plane_state);3194 ret = skl_check_nv12_aux_surface(plane_state);
3191 if (ret)3195 if (ret)
3192 return ret;3196 return ret;
3193 } else if (fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS ||3197 } else if (is_ccs_modifier(fb->modifier)) {
3194 fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS) {
3195 ret = skl_check_ccs_aux_surface(plane_state);3198 ret = skl_check_ccs_aux_surface(plane_state);
3196 if (ret)3199 if (ret)
3197 return ret;3200 return ret;
@@ -3552,11 +3555,11 @@ static u32 skl_plane_ctl_tiling(uint64_t fb_modifier) · 354 unmodified lines
3552 case I915_FORMAT_MOD_Y_TILED:3555 case I915_FORMAT_MOD_Y_TILED:
3553 return PLANE_CTL_TILED_Y;3556 return PLANE_CTL_TILED_Y;
3554 case I915_FORMAT_MOD_Y_TILED_CCS:3557 case I915_FORMAT_MOD_Y_TILED_CCS:
3555 return PLANE_CTL_TILED_Y | PLANE_CTL_DECOMPRESSION_ENABLE;3558 return PLANE_CTL_TILED_Y | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
3556 case I915_FORMAT_MOD_Yf_TILED:3559 case I915_FORMAT_MOD_Yf_TILED:
3557 return PLANE_CTL_TILED_YF;3560 return PLANE_CTL_TILED_YF;
3558 case I915_FORMAT_MOD_Yf_TILED_CCS:3561 case I915_FORMAT_MOD_Yf_TILED_CCS:
3559 return PLANE_CTL_TILED_YF | PLANE_CTL_DECOMPRESSION_ENABLE;3562 return PLANE_CTL_TILED_YF | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
3560 default:3563 default:
3561 MISSING_CASE(fb_modifier);3564 MISSING_CASE(fb_modifier);
3562 }3565 }
@@ -5079,10 +5082,14 @@ void hsw_disable_ips(const struct intel_crtc_state *crtc_state) · 1516 unmodified lines
5079 mutex_lock(&dev_priv->pcu_lock);5082 mutex_lock(&dev_priv->pcu_lock);
5080 WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));5083 WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));
5081 mutex_unlock(&dev_priv->pcu_lock);5084 mutex_unlock(&dev_priv->pcu_lock);
5082 /* wait for pcode to finish disabling IPS, which may take up to 42ms */5085 /*
5086 * Wait for PCODE to finish disabling IPS. The BSpec specified
5087 * 42ms timeout value leads to occasional timeouts so use 100ms
5088 * instead.
5089 */
5083 if (intel_wait_for_register(dev_priv,5090 if (intel_wait_for_register(dev_priv,
5084 IPS_CTL, IPS_ENABLE, 0,5091 IPS_CTL, IPS_ENABLE, 0,
5085 42))5092 100))
5086 DRM_ERROR("Timed out waiting for IPS disable\n");5093 DRM_ERROR("Timed out waiting for IPS disable\n");
5087 } else {5094 } else {
5088 I915_WRITE(IPS_CTL, 0);5095 I915_WRITE(IPS_CTL, 0);
@@ -8799,13 +8806,13 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc, · 3710 unmodified lines
8799 fb->modifier = I915_FORMAT_MOD_X_TILED;8806 fb->modifier = I915_FORMAT_MOD_X_TILED;
8800 break;8807 break;
8801 case PLANE_CTL_TILED_Y:8808 case PLANE_CTL_TILED_Y:
8802 if (val & PLANE_CTL_DECOMPRESSION_ENABLE)8809 if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
8803 fb->modifier = I915_FORMAT_MOD_Y_TILED_CCS;8810 fb->modifier = I915_FORMAT_MOD_Y_TILED_CCS;
8804 else8811 else
8805 fb->modifier = I915_FORMAT_MOD_Y_TILED;8812 fb->modifier = I915_FORMAT_MOD_Y_TILED;
8806 break;8813 break;
8807 case PLANE_CTL_TILED_YF:8814 case PLANE_CTL_TILED_YF:
8808 if (val & PLANE_CTL_DECOMPRESSION_ENABLE)8815 if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
8809 fb->modifier = I915_FORMAT_MOD_Yf_TILED_CCS;8816 fb->modifier = I915_FORMAT_MOD_Yf_TILED_CCS;
8810 else8817 else
8811 fb->modifier = I915_FORMAT_MOD_Yf_TILED;8818 fb->modifier = I915_FORMAT_MOD_Yf_TILED;
@@ -8974,7 +8981,7 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv) · 162 unmodified lines
8974 I915_STATE_WARN(crtc->active, "CRTC for pipe %c enabled\n",8981 I915_STATE_WARN(crtc->active, "CRTC for pipe %c enabled\n",
8975 pipe_name(crtc->pipe));8982 pipe_name(crtc->pipe));
8976 8983
8977 I915_STATE_WARN(I915_READ(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL)),8984 I915_STATE_WARN(I915_READ(HSW_PWR_WELL_CTL2),
8978 "Display power well on\n");8985 "Display power well on\n");
8979 I915_STATE_WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n");8986 I915_STATE_WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n");
8980 I915_STATE_WARN(I915_READ(WRPLL_CTL(0)) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n");8987 I915_STATE_WARN(I915_READ(WRPLL_CTL(0)) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n");
@@ -9691,8 +9698,7 @@ static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state) · 710 unmodified lines
9691 return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);9698 return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);
9692}9699}
9693 9700
9694static int i845_check_cursor(struct intel_plane *plane,9701static int i845_check_cursor(struct intel_crtc_state *crtc_state,
9695 struct intel_crtc_state *crtc_state,
9696 struct intel_plane_state *plane_state)9702 struct intel_plane_state *plane_state)
9697{9703{
9698 const struct drm_framebuffer *fb = plane_state->base.fb;9704 const struct drm_framebuffer *fb = plane_state->base.fb;
@@ -9882,10 +9888,10 @@ static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state) · 183 unmodified lines
9882 return true;9888 return true;
9883}9889}
9884 9890
9885static int i9xx_check_cursor(struct intel_plane *plane,9891static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
9886 struct intel_crtc_state *crtc_state,
9887 struct intel_plane_state *plane_state)9892 struct intel_plane_state *plane_state)
9888{9893{
9894 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
9889 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);9895 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
9890 const struct drm_framebuffer *fb = plane_state->base.fb;9896 const struct drm_framebuffer *fb = plane_state->base.fb;
9891 enum pipe pipe = plane->pipe;9897 enum pipe pipe = plane->pipe;
@@ -12739,7 +12745,7 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state) · 2847 unmodified lines
12739 * down.12745 * down.
12740 */12746 */
12741 INIT_WORK(&state->commit_work, intel_atomic_cleanup_work);12747 INIT_WORK(&state->commit_work, intel_atomic_cleanup_work);
12742 schedule_work(&state->commit_work);12748 queue_work(system_highpri_wq, &state->commit_work);
12743}12749}
12744 12750
12745static void intel_atomic_commit_work(struct work_struct *work)12751static void intel_atomic_commit_work(struct work_struct *work)
@@ -12969,8 +12975,11 @@ static int intel_plane_pin_fb(struct intel_plane_state *plane_state) · 223 unmodified lines
12969 INTEL_INFO(dev_priv)->cursor_needs_physical) {12975 INTEL_INFO(dev_priv)->cursor_needs_physical) {
12970 struct drm_i915_gem_object *obj = intel_fb_obj(fb);12976 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
12971 const int align = intel_cursor_alignment(dev_priv);12977 const int align = intel_cursor_alignment(dev_priv);
12978 int err;
12972 12979
12973 return i915_gem_object_attach_phys(obj, align);12980 err = i915_gem_object_attach_phys(obj, align);
12981 if (err)
12982 return err;
12974 }12983 }
12975 12984
12976 vma = intel_pin_and_fence_fb_obj(fb,12985 vma = intel_pin_and_fence_fb_obj(fb,
@@ -13189,10 +13198,10 @@ skl_max_scale(struct intel_crtc *intel_crtc, · 212 unmodified lines
13189}13198}
13190 13199
13191static int13200static int
13192intel_check_primary_plane(struct intel_plane *plane,13201intel_check_primary_plane(struct intel_crtc_state *crtc_state,
13193 struct intel_crtc_state *crtc_state,
13194 struct intel_plane_state *state)13202 struct intel_plane_state *state)
13195{13203{
13204 struct intel_plane *plane = to_intel_plane(state->base.plane);
13196 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);13205 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
13197 struct drm_crtc *crtc = state->base.crtc;13206 struct drm_crtc *crtc = state->base.crtc;
13198 int min_scale = DRM_PLANE_HELPER_NO_SCALING;13207 int min_scale = DRM_PLANE_HELPER_NO_SCALING;
@@ -13400,8 +13409,7 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane, · 201 unmodified lines
13400 case DRM_FORMAT_XBGR8888:13409 case DRM_FORMAT_XBGR8888:
13401 case DRM_FORMAT_ARGB8888:13410 case DRM_FORMAT_ARGB8888:
13402 case DRM_FORMAT_ABGR8888:13411 case DRM_FORMAT_ABGR8888:
13403 if (modifier == I915_FORMAT_MOD_Yf_TILED_CCS ||13412 if (is_ccs_modifier(modifier))
13404 modifier == I915_FORMAT_MOD_Y_TILED_CCS)
13405 return true;13413 return true;
13406 /* fall through */13414 /* fall through */
13407 case DRM_FORMAT_RGB565:13415 case DRM_FORMAT_RGB565:
@@ -13620,24 +13628,22 @@ static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, · 212 unmodified lines
13620bool skl_plane_has_planar(struct drm_i915_private *dev_priv,13628bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
13621 enum pipe pipe, enum plane_id plane_id)13629 enum pipe pipe, enum plane_id plane_id)
13622{13630{
13623 if (plane_id == PLANE_PRIMARY) {13631 /*
13624 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))13632 * FIXME: ICL requires two hardware planes for scanning out NV12
13625 return false;13633 * framebuffers. Do not advertize support until this is implemented.
13626 else if ((INTEL_GEN(dev_priv) == 9 && pipe == PIPE_C) &&13634 */
13627 !IS_GEMINILAKE(dev_priv))13635 if (INTEL_GEN(dev_priv) >= 11)
13628 return false;13636 return false;
13629 } else if (plane_id >= PLANE_SPRITE0) {13637
13630 if (plane_id == PLANE_CURSOR)13638 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
13631 return false;13639 return false;
13632 if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) == 10) {13640
13633 if (plane_id != PLANE_SPRITE0)13641 if (INTEL_GEN(dev_priv) == 9 && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C)
13634 return false;13642 return false;
13635 } else {13643
13636 if (plane_id != PLANE_SPRITE0 || pipe == PIPE_C ||13644 if (plane_id != PLANE_PRIMARY && plane_id != PLANE_SPRITE0)
13637 IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))13645 return false;
13638 return false;13646
13639 }
13640 }
13641 return true;13647 return true;
13642}13648}
13643 13649
@@ -14131,6 +14137,9 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) · 487 unmodified lines
14131 14137
14132 intel_pps_init(dev_priv);14138 intel_pps_init(dev_priv);
14133 14139
14140 if (INTEL_INFO(dev_priv)->num_pipes == 0)
14141 return;
14142
14134 /*14143 /*
14135 * intel_edp_init_connector() depends on this completing first, to14144 * intel_edp_init_connector() depends on this completing first, to
14136 * prevent the registeration of both eDP and LVDS and the incorrect14145 * prevent the registeration of both eDP and LVDS and the incorrect
@@ -14547,7 +14556,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb, · 410 unmodified lines
14547 break;14556 break;
14548 case DRM_FORMAT_NV12:14557 case DRM_FORMAT_NV12:
14549 if (INTEL_GEN(dev_priv) < 9 || IS_SKYLAKE(dev_priv) ||14558 if (INTEL_GEN(dev_priv) < 9 || IS_SKYLAKE(dev_priv) ||
14550 IS_BROXTON(dev_priv)) {14559 IS_BROXTON(dev_priv) || INTEL_GEN(dev_priv) >= 11) {
14551 DRM_DEBUG_KMS("unsupported pixel format: %s\n",14560 DRM_DEBUG_KMS("unsupported pixel format: %s\n",
14552 drm_get_format_name(mode_cmd->pixel_format,14561 drm_get_format_name(mode_cmd->pixel_format,
14553 &format_name));14562 &format_name));
@@ -14594,8 +14603,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb, · 40 unmodified lines
14594 * potential runtime errors at plane configuration time.14603 * potential runtime errors at plane configuration time.
14595 */14604 */
14596 if (IS_GEN9(dev_priv) && i == 0 && fb->width > 3840 &&14605 if (IS_GEN9(dev_priv) && i == 0 && fb->width > 3840 &&
14597 (fb->modifier == I915_FORMAT_MOD_Y_TILED_CCS ||14606 is_ccs_modifier(fb->modifier))
14598 fb->modifier == I915_FORMAT_MOD_Yf_TILED_CCS))
14599 stride_alignment *= 4;14607 stride_alignment *= 4;
14600 14608
14601 if (fb->pitches[i] & (stride_alignment - 1)) {14609 if (fb->pitches[i] & (stride_alignment - 1)) {
@@ -15131,12 +15139,61 @@ static void intel_update_fdi_pll_freq(struct drm_i915_private *dev_priv) · 529 unmodified lines
15131 DRM_DEBUG_DRIVER("FDI PLL freq=%d\n", dev_priv->fdi_pll_freq);15139 DRM_DEBUG_DRIVER("FDI PLL freq=%d\n", dev_priv->fdi_pll_freq);
15132}15140}
15133 15141
15142static int intel_initial_commit(struct drm_device *dev)
15143{
15144 struct drm_atomic_state *state = NULL;
15145 struct drm_modeset_acquire_ctx ctx;
15146 struct drm_crtc *crtc;
15147 struct drm_crtc_state *crtc_state;
15148 int ret = 0;
15149
15150 state = drm_atomic_state_alloc(dev);
15151 if (!state)
15152 return -ENOMEM;
15153
15154 drm_modeset_acquire_init(&ctx, 0);
15155
15156retry:
15157 state->acquire_ctx = &ctx;
15158
15159 drm_for_each_crtc(crtc, dev) {
15160 crtc_state = drm_atomic_get_crtc_state(state, crtc);
15161 if (IS_ERR(crtc_state)) {
15162 ret = PTR_ERR(crtc_state);
15163 goto out;
15164 }
15165
15166 if (crtc_state->active) {
15167 ret = drm_atomic_add_affected_planes(state, crtc);
15168 if (ret)
15169 goto out;
15170 }
15171 }
15172
15173 ret = drm_atomic_commit(state);
15174
15175out:
15176 if (ret == -EDEADLK) {
15177 drm_atomic_state_clear(state);
15178 drm_modeset_backoff(&ctx);
15179 goto retry;
15180 }
15181
15182 drm_atomic_state_put(state);
15183
15184 drm_modeset_drop_locks(&ctx);
15185 drm_modeset_acquire_fini(&ctx);
15186
15187 return ret;
15188}
15189
15134int intel_modeset_init(struct drm_device *dev)15190int intel_modeset_init(struct drm_device *dev)
15135{15191{
15136 struct drm_i915_private *dev_priv = to_i915(dev);15192 struct drm_i915_private *dev_priv = to_i915(dev);
15137 struct i915_ggtt *ggtt = &dev_priv->ggtt;15193 struct i915_ggtt *ggtt = &dev_priv->ggtt;
15138 enum pipe pipe;15194 enum pipe pipe;
15139 struct intel_crtc *crtc;15195 struct intel_crtc *crtc;
15196 int ret;
15140 15197
15141 dev_priv->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);15198 dev_priv->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
15142 15199
@@ -15160,9 +15217,6 @@ int intel_modeset_init(struct drm_device *dev) · 17 unmodified lines
15160 15217
15161 intel_init_pm(dev_priv);15218 intel_init_pm(dev_priv);
15162 15219
15163 if (INTEL_INFO(dev_priv)->num_pipes == 0)
15164 return 0;
15165
15166 /*15220 /*
15167 * There may be no VBT; and if the BIOS enabled SSC we can15221 * There may be no VBT; and if the BIOS enabled SSC we can
15168 * just keep using it to avoid unnecessary flicker. Whereas if the15222 * just keep using it to avoid unnecessary flicker. Whereas if the
@@ -15211,8 +15265,6 @@ int intel_modeset_init(struct drm_device *dev) · 42 unmodified lines
15211 INTEL_INFO(dev_priv)->num_pipes > 1 ? "s" : "");15265 INTEL_INFO(dev_priv)->num_pipes > 1 ? "s" : "");
15212 15266
15213 for_each_pipe(dev_priv, pipe) {15267 for_each_pipe(dev_priv, pipe) {
15214 int ret;
15215
15216 ret = intel_crtc_init(dev_priv, pipe);15268 ret = intel_crtc_init(dev_priv, pipe);
15217 if (ret) {15269 if (ret) {
15218 drm_mode_config_cleanup(dev);15270 drm_mode_config_cleanup(dev);
@@ -15268,6 +15320,16 @@ int intel_modeset_init(struct drm_device *dev) · 49 unmodified lines
15268 if (!HAS_GMCH_DISPLAY(dev_priv))15320 if (!HAS_GMCH_DISPLAY(dev_priv))
15269 sanitize_watermarks(dev);15321 sanitize_watermarks(dev);
15270 15322
15323 /*
15324 * Force all active planes to recompute their states. So that on
15325 * mode_setcrtc after probe, all the intel_plane_state variables
15326 * are already calculated and there is no assert_plane warnings
15327 * during bootup.
15328 */
15329 ret = intel_initial_commit(dev);
15330 if (ret)
15331 DRM_DEBUG_KMS("Initial commit in probe failed.\n");
15332
15271 return 0;15333 return 0;
15272}15334}
15273 15335
@@ -15792,6 +15854,8 @@ intel_modeset_setup_hw_state(struct drm_device *dev, · 518 unmodified lines
15792 struct intel_encoder *encoder;15854 struct intel_encoder *encoder;
15793 int i;15855 int i;
15794 15856
15857 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
15858
15795 intel_early_display_was(dev_priv);15859 intel_early_display_was(dev_priv);
15796 intel_modeset_readout_hw_state(dev);15860 intel_modeset_readout_hw_state(dev);
15797 15861
@@ -15846,9 +15910,8 @@ intel_modeset_setup_hw_state(struct drm_device *dev, · 48 unmodified lines
15846 if (WARN_ON(put_domains))15910 if (WARN_ON(put_domains))
15847 modeset_put_power_domains(dev_priv, put_domains);15911 modeset_put_power_domains(dev_priv, put_domains);
15848 }15912 }
15849 intel_display_set_init_power(dev_priv, false);
15850 15913
15851 intel_power_domains_verify_state(dev_priv);15914 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
15852 15915
15853 intel_fbc_init_pipe_state(dev_priv);15916 intel_fbc_init_pipe_state(dev_priv);
15854}15917}
@@ -15937,8 +16000,6 @@ void intel_modeset_cleanup(struct drm_device *dev) · 82 unmodified lines
15937 flush_work(&dev_priv->atomic_helper.free_work);16000 flush_work(&dev_priv->atomic_helper.free_work);
15938 WARN_ON(!llist_empty(&dev_priv->atomic_helper.free_list));16001 WARN_ON(!llist_empty(&dev_priv->atomic_helper.free_list));
15939 16002
15940 intel_disable_gt_powersave(dev_priv);
15941
15942 /*16003 /*
15943 * Interrupts and polling as the first thing to avoid creating havoc.16004 * Interrupts and polling as the first thing to avoid creating havoc.
15944 * Too much stuff here (turning of connectors, ...) would16005 * Too much stuff here (turning of connectors, ...) would
@@ -15966,8 +16027,6 @@ void intel_modeset_cleanup(struct drm_device *dev) · 21 unmodified lines
15966 16027
15967 intel_cleanup_overlay(dev_priv);16028 intel_cleanup_overlay(dev_priv);
15968 16029
15969 intel_cleanup_gt_powersave(dev_priv);
15970
15971 intel_teardown_gmbus(dev_priv);16030 intel_teardown_gmbus(dev_priv);
15972 16031
15973 destroy_workqueue(dev_priv->modeset_wq);16032 destroy_workqueue(dev_priv->modeset_wq);
@@ -16075,8 +16134,7 @@ intel_display_capture_error_state(struct drm_i915_private *dev_priv) · 101 unmodified lines
16075 return NULL;16134 return NULL;
16076 16135
16077 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))16136 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
16078 error->power_well_driver =16137 error->power_well_driver = I915_READ(HSW_PWR_WELL_CTL2);
16079 I915_READ(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL));
16080 16138
16081 for_each_pipe(dev_priv, i) {16139 for_each_pipe(dev_priv, i) {
16082 error->pipe[i].power_domain_on =16140 error->pipe[i].power_domain_on =
drivers/gpu/drm/i915/intel_display.h+26−2
@@ -25,6 +25,22 @@ · 24 unmodified lines
25#ifndef _INTEL_DISPLAY_H_25#ifndef _INTEL_DISPLAY_H_
26#define _INTEL_DISPLAY_H_26#define _INTEL_DISPLAY_H_
27 27
28enum i915_gpio {
29 GPIOA,
30 GPIOB,
31 GPIOC,
32 GPIOD,
33 GPIOE,
34 GPIOF,
35 GPIOG,
36 GPIOH,
37 __GPIOI_UNUSED,
38 GPIOJ,
39 GPIOK,
40 GPIOL,
41 GPIOM,
42};
43
28enum pipe {44enum pipe {
29 INVALID_PIPE = -1,45 INVALID_PIPE = -1,
30 46
@@ -161,6 +177,13 @@ enum tc_port { · 130 unmodified lines
161 I915_MAX_TC_PORTS177 I915_MAX_TC_PORTS
162};178};
163 179
180enum tc_port_type {
181 TC_PORT_UNKNOWN = 0,
182 TC_PORT_TYPEC,
183 TC_PORT_TBT,
184 TC_PORT_LEGACY,
185};
186
164enum dpio_channel {187enum dpio_channel {
165 DPIO_CH0,188 DPIO_CH0,
166 DPIO_CH1189 DPIO_CH1
@@ -346,11 +369,11 @@ struct intel_link_m_n { · 179 unmodified lines
346 369
347#define for_each_power_domain_well(__dev_priv, __power_well, __domain_mask) \370#define for_each_power_domain_well(__dev_priv, __power_well, __domain_mask) \
348 for_each_power_well(__dev_priv, __power_well) \371 for_each_power_well(__dev_priv, __power_well) \
349 for_each_if((__power_well)->domains & (__domain_mask))372 for_each_if((__power_well)->desc->domains & (__domain_mask))
350 373
351#define for_each_power_domain_well_rev(__dev_priv, __power_well, __domain_mask) \374#define for_each_power_domain_well_rev(__dev_priv, __power_well, __domain_mask) \
352 for_each_power_well_rev(__dev_priv, __power_well) \375 for_each_power_well_rev(__dev_priv, __power_well) \
353 for_each_if((__power_well)->domains & (__domain_mask))376 for_each_if((__power_well)->desc->domains & (__domain_mask))
354 377
355#define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \378#define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \
356 for ((__i) = 0; \379 for ((__i) = 0; \
@@ -382,4 +405,5 @@ void intel_link_compute_m_n(int bpp, int nlanes, · 25 unmodified lines
382 struct intel_link_m_n *m_n,405 struct intel_link_m_n *m_n,
383 bool reduce_m_n);406 bool reduce_m_n);
384 407
408bool is_ccs_modifier(u64 modifier);
385#endif409#endif
drivers/gpu/drm/i915/intel_dp.c+451−83
@@ -107,13 +107,6 @@ bool intel_dp_is_edp(struct intel_dp *intel_dp) · 106 unmodified lines
107 return intel_dig_port->base.type == INTEL_OUTPUT_EDP;107 return intel_dig_port->base.type == INTEL_OUTPUT_EDP;
108}108}
109 109
110static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp)
111{
112 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
113
114 return intel_dig_port->base.base.dev;
115}
116
117static struct intel_dp *intel_attached_dp(struct drm_connector *connector)110static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
118{111{
119 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);112 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
@@ -176,14 +169,45 @@ static int intel_dp_max_common_rate(struct intel_dp *intel_dp) · 56 unmodified lines
176 return intel_dp->common_rates[intel_dp->num_common_rates - 1];169 return intel_dp->common_rates[intel_dp->num_common_rates - 1];
177}170}
178 171
172static int intel_dp_get_fia_supported_lane_count(struct intel_dp *intel_dp)
173{
174 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
175 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
176 enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
177 u32 lane_info;
178
179 if (tc_port == PORT_TC_NONE || dig_port->tc_type != TC_PORT_TYPEC)
180 return 4;
181
182 lane_info = (I915_READ(PORT_TX_DFLEXDPSP) &
183 DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
184 DP_LANE_ASSIGNMENT_SHIFT(tc_port);
185
186 switch (lane_info) {
187 default:
188 MISSING_CASE(lane_info);
189 case 1:
190 case 2:
191 case 4:
192 case 8:
193 return 1;
194 case 3:
195 case 12:
196 return 2;
197 case 15:
198 return 4;
199 }
200}
201
179/* Theoretical max between source and sink */202/* Theoretical max between source and sink */
180static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)203static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
181{204{
182 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);205 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
183 int source_max = intel_dig_port->max_lanes;206 int source_max = intel_dig_port->max_lanes;
184 int sink_max = drm_dp_max_lane_count(intel_dp->dpcd);207 int sink_max = drm_dp_max_lane_count(intel_dp->dpcd);
208 int fia_max = intel_dp_get_fia_supported_lane_count(intel_dp);
185 209
186 return min(source_max, sink_max);210 return min3(source_max, sink_max, fia_max);
187}211}
188 212
189int intel_dp_max_lane_count(struct intel_dp *intel_dp)213int intel_dp_max_lane_count(struct intel_dp *intel_dp)
@@ -198,6 +222,138 @@ intel_dp_link_required(int pixel_clock, int bpp) · 8 unmodified lines
198 return DIV_ROUND_UP(pixel_clock * bpp, 8);222 return DIV_ROUND_UP(pixel_clock * bpp, 8);
199}223}
200 224
225void icl_program_mg_dp_mode(struct intel_dp *intel_dp)
226{
227 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
228 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
229 enum port port = intel_dig_port->base.port;
230 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
231 u32 ln0, ln1, lane_info;
232
233 if (tc_port == PORT_TC_NONE || intel_dig_port->tc_type == TC_PORT_TBT)
234 return;
235
236 ln0 = I915_READ(MG_DP_MODE(port, 0));
237 ln1 = I915_READ(MG_DP_MODE(port, 1));
238
239 switch (intel_dig_port->tc_type) {
240 case TC_PORT_TYPEC:
241 ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
242 ln1 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
243
244 lane_info = (I915_READ(PORT_TX_DFLEXDPSP) &
245 DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
246 DP_LANE_ASSIGNMENT_SHIFT(tc_port);
247
248 switch (lane_info) {
249 case 0x1:
250 case 0x4:
251 break;
252 case 0x2:
253 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE;
254 break;
255 case 0x3:
256 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
257 MG_DP_MODE_CFG_DP_X2_MODE;
258 break;
259 case 0x8:
260 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE;
261 break;
262 case 0xC:
263 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
264 MG_DP_MODE_CFG_DP_X2_MODE;
265 break;
266 case 0xF:
267 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
268 MG_DP_MODE_CFG_DP_X2_MODE;
269 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
270 MG_DP_MODE_CFG_DP_X2_MODE;
271 break;
272 default:
273 MISSING_CASE(lane_info);
274 }
275 break;
276
277 case TC_PORT_LEGACY:
278 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
279 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
280 break;
281
282 default:
283 MISSING_CASE(intel_dig_port->tc_type);
284 return;
285 }
286
287 I915_WRITE(MG_DP_MODE(port, 0), ln0);
288 I915_WRITE(MG_DP_MODE(port, 1), ln1);
289}
290
291void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port)
292{
293 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
294 enum port port = dig_port->base.port;
295 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
296 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
297 u32 val;
298 int i;
299
300 if (tc_port == PORT_TC_NONE)
301 return;
302
303 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
304 val = I915_READ(mg_regs[i]);
305 val |= MG_DP_MODE_CFG_TR2PWR_GATING |
306 MG_DP_MODE_CFG_TRPWR_GATING |
307 MG_DP_MODE_CFG_CLNPWR_GATING |
308 MG_DP_MODE_CFG_DIGPWR_GATING |
309 MG_DP_MODE_CFG_GAONPWR_GATING;
310 I915_WRITE(mg_regs[i], val);
311 }
312
313 val = I915_READ(MG_MISC_SUS0(tc_port));
314 val |= MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE(3) |
315 MG_MISC_SUS0_CFG_TR2PWR_GATING |
316 MG_MISC_SUS0_CFG_CL2PWR_GATING |
317 MG_MISC_SUS0_CFG_GAONPWR_GATING |
318 MG_MISC_SUS0_CFG_TRPWR_GATING |
319 MG_MISC_SUS0_CFG_CL1PWR_GATING |
320 MG_MISC_SUS0_CFG_DGPWR_GATING;
321 I915_WRITE(MG_MISC_SUS0(tc_port), val);
322}
323
324void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port)
325{
326 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
327 enum port port = dig_port->base.port;
328 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
329 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
330 u32 val;
331 int i;
332
333 if (tc_port == PORT_TC_NONE)
334 return;
335
336 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
337 val = I915_READ(mg_regs[i]);
338 val &= ~(MG_DP_MODE_CFG_TR2PWR_GATING |
339 MG_DP_MODE_CFG_TRPWR_GATING |
340 MG_DP_MODE_CFG_CLNPWR_GATING |
341 MG_DP_MODE_CFG_DIGPWR_GATING |
342 MG_DP_MODE_CFG_GAONPWR_GATING);
343 I915_WRITE(mg_regs[i], val);
344 }
345
346 val = I915_READ(MG_MISC_SUS0(tc_port));
347 val &= ~(MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE_MASK |
348 MG_MISC_SUS0_CFG_TR2PWR_GATING |
349 MG_MISC_SUS0_CFG_CL2PWR_GATING |
350 MG_MISC_SUS0_CFG_GAONPWR_GATING |
351 MG_MISC_SUS0_CFG_TRPWR_GATING |
352 MG_MISC_SUS0_CFG_CL1PWR_GATING |
353 MG_MISC_SUS0_CFG_DGPWR_GATING);
354 I915_WRITE(MG_MISC_SUS0(tc_port), val);
355}
356
201int357int
202intel_dp_max_data_rate(int max_link_clock, int max_lanes)358intel_dp_max_data_rate(int max_link_clock, int max_lanes)
203{359{
@@ -498,7 +654,7 @@ intel_dp_pps_init(struct intel_dp *intel_dp); · 294 unmodified lines
498 654
499static void pps_lock(struct intel_dp *intel_dp)655static void pps_lock(struct intel_dp *intel_dp)
500{656{
501 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));657 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
502 658
503 /*659 /*
504 * See intel_power_sequencer_reset() why we need660 * See intel_power_sequencer_reset() why we need
@@ -511,7 +667,7 @@ static void pps_lock(struct intel_dp *intel_dp) · 6 unmodified lines
511 667
512static void pps_unlock(struct intel_dp *intel_dp)668static void pps_unlock(struct intel_dp *intel_dp)
513{669{
514 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));670 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
515 671
516 mutex_unlock(&dev_priv->pps_mutex);672 mutex_unlock(&dev_priv->pps_mutex);
517 673
@@ -521,7 +677,7 @@ static void pps_unlock(struct intel_dp *intel_dp) · 3 unmodified lines
521static void677static void
522vlv_power_sequencer_kick(struct intel_dp *intel_dp)678vlv_power_sequencer_kick(struct intel_dp *intel_dp)
523{679{
524 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));680 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
525 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);681 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
526 enum pipe pipe = intel_dp->pps_pipe;682 enum pipe pipe = intel_dp->pps_pipe;
527 bool pll_enabled, release_cl_override = false;683 bool pll_enabled, release_cl_override = false;
@@ -626,7 +782,7 @@ static enum pipe vlv_find_free_pps(struct drm_i915_private *dev_priv) · 98 unmodified lines
626static enum pipe782static enum pipe
627vlv_power_sequencer_pipe(struct intel_dp *intel_dp)783vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
628{784{
629 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));785 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
630 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);786 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
631 enum pipe pipe;787 enum pipe pipe;
632 788
@@ -673,7 +829,7 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) · 40 unmodified lines
673static int829static int
674bxt_power_sequencer_idx(struct intel_dp *intel_dp)830bxt_power_sequencer_idx(struct intel_dp *intel_dp)
675{831{
676 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));832 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
677 int backlight_controller = dev_priv->vbt.backlight.controller;833 int backlight_controller = dev_priv->vbt.backlight.controller;
678 834
679 lockdep_assert_held(&dev_priv->pps_mutex);835 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -742,7 +898,7 @@ vlv_initial_pps_pipe(struct drm_i915_private *dev_priv, · 62 unmodified lines
742static void898static void
743vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)899vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
744{900{
745 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));901 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
746 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);902 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
747 enum port port = intel_dig_port->base.port;903 enum port port = intel_dig_port->base.port;
748 904
@@ -819,7 +975,7 @@ struct pps_registers { · 70 unmodified lines
819static void intel_pps_get_registers(struct intel_dp *intel_dp,975static void intel_pps_get_registers(struct intel_dp *intel_dp,
820 struct pps_registers *regs)976 struct pps_registers *regs)
821{977{
822 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));978 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
823 int pps_idx = 0;979 int pps_idx = 0;
824 980
825 memset(regs, 0, sizeof(*regs));981 memset(regs, 0, sizeof(*regs));
@@ -865,7 +1021,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, · 39 unmodified lines
865{1021{
866 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),1022 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
867 edp_notifier);1023 edp_notifier);
868 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1024 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
869 1025
870 if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)1026 if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)
871 return 0;1027 return 0;
@@ -895,7 +1051,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, · 23 unmodified lines
895 1051
896static bool edp_have_panel_power(struct intel_dp *intel_dp)1052static bool edp_have_panel_power(struct intel_dp *intel_dp)
897{1053{
898 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1054 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
899 1055
900 lockdep_assert_held(&dev_priv->pps_mutex);1056 lockdep_assert_held(&dev_priv->pps_mutex);
901 1057
@@ -908,7 +1064,7 @@ static bool edp_have_panel_power(struct intel_dp *intel_dp) · 6 unmodified lines
908 1064
909static bool edp_have_panel_vdd(struct intel_dp *intel_dp)1065static bool edp_have_panel_vdd(struct intel_dp *intel_dp)
910{1066{
911 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1067 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
912 1068
913 lockdep_assert_held(&dev_priv->pps_mutex);1069 lockdep_assert_held(&dev_priv->pps_mutex);
914 1070
@@ -922,7 +1078,7 @@ static bool edp_have_panel_vdd(struct intel_dp *intel_dp) · 7 unmodified lines
922static void1078static void
923intel_dp_check_edp(struct intel_dp *intel_dp)1079intel_dp_check_edp(struct intel_dp *intel_dp)
924{1080{
925 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1081 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
926 1082
927 if (!intel_dp_is_edp(intel_dp))1083 if (!intel_dp_is_edp(intel_dp))
928 return;1084 return;
@@ -938,7 +1094,7 @@ intel_dp_check_edp(struct intel_dp *intel_dp) · 9 unmodified lines
938static uint32_t1094static uint32_t
939intel_dp_aux_wait_done(struct intel_dp *intel_dp)1095intel_dp_aux_wait_done(struct intel_dp *intel_dp)
940{1096{
941 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1097 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
942 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg(intel_dp);1098 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg(intel_dp);
943 uint32_t status;1099 uint32_t status;
944 bool done;1100 bool done;
@@ -955,7 +1111,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp) · 10 unmodified lines
955 1111
956static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)1112static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
957{1113{
958 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1114 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
959 1115
960 if (index)1116 if (index)
961 return 0;1117 return 0;
@@ -969,7 +1125,7 @@ static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index) · 7 unmodified lines
969 1125
970static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)1126static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
971{1127{
972 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1128 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
973 1129
974 if (index)1130 if (index)
975 return 0;1131 return 0;
@@ -987,7 +1143,7 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index) · 11 unmodified lines
987 1143
988static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)1144static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
989{1145{
990 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1146 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
991 1147
992 if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {1148 if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
993 /* Workaround for non-ULT HSW */1149 /* Workaround for non-ULT HSW */
@@ -1045,15 +1201,23 @@ static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp, · 51 unmodified lines
1045 int send_bytes,1201 int send_bytes,
1046 uint32_t unused)1202 uint32_t unused)
1047{1203{
1048 return DP_AUX_CH_CTL_SEND_BUSY |1204 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1049 DP_AUX_CH_CTL_DONE |1205 uint32_t ret;
1050 DP_AUX_CH_CTL_INTERRUPT |1206
1051 DP_AUX_CH_CTL_TIME_OUT_ERROR |1207 ret = DP_AUX_CH_CTL_SEND_BUSY |
1052 DP_AUX_CH_CTL_TIME_OUT_MAX |1208 DP_AUX_CH_CTL_DONE |
1053 DP_AUX_CH_CTL_RECEIVE_ERROR |1209 DP_AUX_CH_CTL_INTERRUPT |
1054 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |1210 DP_AUX_CH_CTL_TIME_OUT_ERROR |
1055 DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(32) |1211 DP_AUX_CH_CTL_TIME_OUT_MAX |
1056 DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);1212 DP_AUX_CH_CTL_RECEIVE_ERROR |
1213 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
1214 DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(32) |
1215 DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);
1216
1217 if (intel_dig_port->tc_type == TC_PORT_TBT)
1218 ret |= DP_AUX_CH_CTL_TBT_IO;
1219
1220 return ret;
1057}1221}
1058 1222
1059static int1223static int
@@ -1381,7 +1545,7 @@ intel_aux_power_domain(struct intel_dp *intel_dp) · 321 unmodified lines
1381 1545
1382static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)1546static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
1383{1547{
1384 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1548 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1385 enum aux_ch aux_ch = intel_dp->aux_ch;1549 enum aux_ch aux_ch = intel_dp->aux_ch;
1386 1550
1387 switch (aux_ch) {1551 switch (aux_ch) {
@@ -1397,7 +1561,7 @@ static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp) · 9 unmodified lines
1397 1561
1398static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)1562static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
1399{1563{
1400 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1564 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1401 enum aux_ch aux_ch = intel_dp->aux_ch;1565 enum aux_ch aux_ch = intel_dp->aux_ch;
1402 1566
1403 switch (aux_ch) {1567 switch (aux_ch) {
@@ -1413,7 +1577,7 @@ static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index) · 9 unmodified lines
1413 1577
1414static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)1578static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
1415{1579{
1416 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1580 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1417 enum aux_ch aux_ch = intel_dp->aux_ch;1581 enum aux_ch aux_ch = intel_dp->aux_ch;
1418 1582
1419 switch (aux_ch) {1583 switch (aux_ch) {
@@ -1431,7 +1595,7 @@ static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp) · 11 unmodified lines
1431 1595
1432static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)1596static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
1433{1597{
1434 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1598 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1435 enum aux_ch aux_ch = intel_dp->aux_ch;1599 enum aux_ch aux_ch = intel_dp->aux_ch;
1436 1600
1437 switch (aux_ch) {1601 switch (aux_ch) {
@@ -1449,7 +1613,7 @@ static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index) · 11 unmodified lines
1449 1613
1450static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)1614static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
1451{1615{
1452 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1616 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1453 enum aux_ch aux_ch = intel_dp->aux_ch;1617 enum aux_ch aux_ch = intel_dp->aux_ch;
1454 1618
1455 switch (aux_ch) {1619 switch (aux_ch) {
@@ -1468,7 +1632,7 @@ static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp) · 12 unmodified lines
1468 1632
1469static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)1633static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
1470{1634{
1471 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1635 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1472 enum aux_ch aux_ch = intel_dp->aux_ch;1636 enum aux_ch aux_ch = intel_dp->aux_ch;
1473 1637
1474 switch (aux_ch) {1638 switch (aux_ch) {
@@ -1494,7 +1658,7 @@ intel_dp_aux_fini(struct intel_dp *intel_dp) · 19 unmodified lines
1494static void1658static void
1495intel_dp_aux_init(struct intel_dp *intel_dp)1659intel_dp_aux_init(struct intel_dp *intel_dp)
1496{1660{
1497 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1661 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1498 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;1662 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
1499 1663
1500 intel_dp->aux_ch = intel_aux_ch(intel_dp);1664 intel_dp->aux_ch = intel_aux_ch(intel_dp);
@@ -1662,7 +1826,7 @@ struct link_config_limits { · 161 unmodified lines
1662static int intel_dp_compute_bpp(struct intel_dp *intel_dp,1826static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
1663 struct intel_crtc_state *pipe_config)1827 struct intel_crtc_state *pipe_config)
1664{1828{
1665 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));1829 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1666 struct intel_connector *intel_connector = intel_dp->attached_connector;1830 struct intel_connector *intel_connector = intel_dp->attached_connector;
1667 int bpp, bpc;1831 int bpp, bpc;
1668 1832
@@ -2030,7 +2194,7 @@ static void wait_panel_status(struct intel_dp *intel_dp, · 361 unmodified lines
2030 u32 mask,2194 u32 mask,
2031 u32 value)2195 u32 value)
2032{2196{
2033 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2197 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2034 i915_reg_t pp_stat_reg, pp_ctrl_reg;2198 i915_reg_t pp_stat_reg, pp_ctrl_reg;
2035 2199
2036 lockdep_assert_held(&dev_priv->pps_mutex);2200 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -2106,7 +2270,7 @@ static void edp_wait_backlight_off(struct intel_dp *intel_dp) · 69 unmodified lines
2106 2270
2107static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)2271static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
2108{2272{
2109 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2273 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2110 u32 control;2274 u32 control;
2111 2275
2112 lockdep_assert_held(&dev_priv->pps_mutex);2276 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -2127,7 +2291,7 @@ static u32 ironlake_get_pp_control(struct intel_dp *intel_dp) · 14 unmodified lines
2127 */2291 */
2128static bool edp_panel_vdd_on(struct intel_dp *intel_dp)2292static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
2129{2293{
2130 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2294 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2131 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);2295 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2132 u32 pp;2296 u32 pp;
2133 i915_reg_t pp_stat_reg, pp_ctrl_reg;2297 i915_reg_t pp_stat_reg, pp_ctrl_reg;
@@ -2198,7 +2362,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp) · 64 unmodified lines
2198 2362
2199static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)2363static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
2200{2364{
2201 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2365 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2202 struct intel_digital_port *intel_dig_port =2366 struct intel_digital_port *intel_dig_port =
2203 dp_to_dig_port(intel_dp);2367 dp_to_dig_port(intel_dp);
2204 u32 pp;2368 u32 pp;
@@ -2264,7 +2428,7 @@ static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp) · 59 unmodified lines
2264 */2428 */
2265static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)2429static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
2266{2430{
2267 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2431 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2268 2432
2269 lockdep_assert_held(&dev_priv->pps_mutex);2433 lockdep_assert_held(&dev_priv->pps_mutex);
2270 2434
@@ -2284,7 +2448,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) · 13 unmodified lines
2284 2448
2285static void edp_panel_on(struct intel_dp *intel_dp)2449static void edp_panel_on(struct intel_dp *intel_dp)
2286{2450{
2287 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2451 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2288 u32 pp;2452 u32 pp;
2289 i915_reg_t pp_ctrl_reg;2453 i915_reg_t pp_ctrl_reg;
2290 2454
@@ -2342,7 +2506,7 @@ void intel_edp_panel_on(struct intel_dp *intel_dp) · 51 unmodified lines
2342 2506
2343static void edp_panel_off(struct intel_dp *intel_dp)2507static void edp_panel_off(struct intel_dp *intel_dp)
2344{2508{
2345 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2509 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2346 u32 pp;2510 u32 pp;
2347 i915_reg_t pp_ctrl_reg;2511 i915_reg_t pp_ctrl_reg;
2348 2512
@@ -2390,7 +2554,7 @@ void intel_edp_panel_off(struct intel_dp *intel_dp) · 41 unmodified lines
2390/* Enable backlight in the panel power control. */2554/* Enable backlight in the panel power control. */
2391static void _intel_edp_backlight_on(struct intel_dp *intel_dp)2555static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
2392{2556{
2393 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2557 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2394 u32 pp;2558 u32 pp;
2395 i915_reg_t pp_ctrl_reg;2559 i915_reg_t pp_ctrl_reg;
2396 2560
@@ -2433,7 +2597,7 @@ void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state, · 36 unmodified lines
2433/* Disable backlight in the panel power control. */2597/* Disable backlight in the panel power control. */
2434static void _intel_edp_backlight_off(struct intel_dp *intel_dp)2598static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
2435{2599{
2436 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));2600 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2437 u32 pp;2601 u32 pp;
2438 i915_reg_t pp_ctrl_reg;2602 i915_reg_t pp_ctrl_reg;
2439 2603
@@ -2864,7 +3028,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, · 424 unmodified lines
2864 uint32_t *DP,3028 uint32_t *DP,
2865 uint8_t dp_train_pat)3029 uint8_t dp_train_pat)
2866{3030{
2867 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3031 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2868 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);3032 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2869 enum port port = intel_dig_port->base.port;3033 enum port port = intel_dig_port->base.port;
2870 uint8_t train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);3034 uint8_t train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);
@@ -2946,7 +3110,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, · 75 unmodified lines
2946static void intel_dp_enable_port(struct intel_dp *intel_dp,3110static void intel_dp_enable_port(struct intel_dp *intel_dp,
2947 const struct intel_crtc_state *old_crtc_state)3111 const struct intel_crtc_state *old_crtc_state)
2948{3112{
2949 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3113 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2950 3114
2951 /* enable with pattern 1 (as per spec) */3115 /* enable with pattern 1 (as per spec) */
2952 3116
@@ -3203,7 +3367,7 @@ intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_ · 250 unmodified lines
3203uint8_t3367uint8_t
3204intel_dp_voltage_max(struct intel_dp *intel_dp)3368intel_dp_voltage_max(struct intel_dp *intel_dp)
3205{3369{
3206 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3370 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
3207 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;3371 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
3208 enum port port = encoder->port;3372 enum port port = encoder->port;
3209 3373
@@ -3222,7 +3386,7 @@ intel_dp_voltage_max(struct intel_dp *intel_dp) · 12 unmodified lines
3222uint8_t3386uint8_t
3223intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)3387intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
3224{3388{
3225 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3389 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
3226 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;3390 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
3227 enum port port = encoder->port;3391 enum port port = encoder->port;
3228 3392
@@ -3534,7 +3698,7 @@ ivb_cpu_edp_signal_levels(uint8_t train_set) · 305 unmodified lines
3534void3698void
3535intel_dp_set_signal_levels(struct intel_dp *intel_dp)3699intel_dp_set_signal_levels(struct intel_dp *intel_dp)
3536{3700{
3537 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3701 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
3538 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);3702 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3539 enum port port = intel_dig_port->base.port;3703 enum port port = intel_dig_port->base.port;
3540 uint32_t signal_levels, mask = 0;3704 uint32_t signal_levels, mask = 0;
@@ -3591,7 +3755,7 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, · 50 unmodified lines
3591 3755
3592void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)3756void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
3593{3757{
3594 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));3758 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
3595 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);3759 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3596 enum port port = intel_dig_port->base.port;3760 enum port port = intel_dig_port->base.port;
3597 uint32_t val;3761 uint32_t val;
@@ -4090,12 +4254,14 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp) · 492 unmodified lines
4090 int ret = 0;4254 int ret = 0;
4091 int retry;4255 int retry;
4092 bool handled;4256 bool handled;
4257
4258 WARN_ON_ONCE(intel_dp->active_mst_links < 0);
4093 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);4259 bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
4094go_again:4260go_again:
4095 if (bret == true) {4261 if (bret == true) {
4096 4262
4097 /* check link status - esi[10] = 0x200c */4263 /* check link status - esi[10] = 0x200c */
4098 if (intel_dp->active_mst_links &&4264 if (intel_dp->active_mst_links > 0 &&
4099 !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {4265 !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
4100 DRM_DEBUG_KMS("channel EQ not ok, retraining\n");4266 DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
4101 intel_dp_start_link_train(intel_dp);4267 intel_dp_start_link_train(intel_dp);
@@ -4160,18 +4326,6 @@ intel_dp_needs_link_retrain(struct intel_dp *intel_dp) · 58 unmodified lines
4160 return !drm_dp_channel_eq_ok(link_status, intel_dp->lane_count);4326 return !drm_dp_channel_eq_ok(link_status, intel_dp->lane_count);
4161}4327}
4162 4328
4163/*
4164 * If display is now connected check links status,
4165 * there has been known issues of link loss triggering
4166 * long pulse.
4167 *
4168 * Some sinks (eg. ASUS PB287Q) seem to perform some
4169 * weird HPD ping pong during modesets. So we can apparently
4170 * end up with HPD going low during a modeset, and then
4171 * going back up soon after. And once that happens we must
4172 * retrain the link to get a picture. That's in case no
4173 * userspace component reacted to intermittent HPD dip.
4174 */
4175int intel_dp_retrain_link(struct intel_encoder *encoder,4329int intel_dp_retrain_link(struct intel_encoder *encoder,
4176 struct drm_modeset_acquire_ctx *ctx)4330 struct drm_modeset_acquire_ctx *ctx)
4177{4331{
@@ -4294,7 +4448,7 @@ static bool intel_dp_hotplug(struct intel_encoder *encoder, · 116 unmodified lines
4294static bool4448static bool
4295intel_dp_short_pulse(struct intel_dp *intel_dp)4449intel_dp_short_pulse(struct intel_dp *intel_dp)
4296{4450{
4297 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));4451 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
4298 u8 sink_irq_vector = 0;4452 u8 sink_irq_vector = 0;
4299 u8 old_sink_count = intel_dp->sink_count;4453 u8 old_sink_count = intel_dp->sink_count;
4300 bool ret;4454 bool ret;
@@ -4586,10 +4740,205 @@ static bool bxt_digital_port_connected(struct intel_encoder *encoder) · 285 unmodified lines
4586 return I915_READ(GEN8_DE_PORT_ISR) & bit;4740 return I915_READ(GEN8_DE_PORT_ISR) & bit;
4587}4741}
4588 4742
4743static bool icl_combo_port_connected(struct drm_i915_private *dev_priv,
4744 struct intel_digital_port *intel_dig_port)
4745{
4746 enum port port = intel_dig_port->base.port;
4747
4748 return I915_READ(SDEISR) & SDE_DDI_HOTPLUG_ICP(port);
4749}
4750
4751static void icl_update_tc_port_type(struct drm_i915_private *dev_priv,
4752 struct intel_digital_port *intel_dig_port,
4753 bool is_legacy, bool is_typec, bool is_tbt)
4754{
4755 enum port port = intel_dig_port->base.port;
4756 enum tc_port_type old_type = intel_dig_port->tc_type;
4757 const char *type_str;
4758
4759 WARN_ON(is_legacy + is_typec + is_tbt != 1);
4760
4761 if (is_legacy) {
4762 intel_dig_port->tc_type = TC_PORT_LEGACY;
4763 type_str = "legacy";
4764 } else if (is_typec) {
4765 intel_dig_port->tc_type = TC_PORT_TYPEC;
4766 type_str = "typec";
4767 } else if (is_tbt) {
4768 intel_dig_port->tc_type = TC_PORT_TBT;
4769 type_str = "tbt";
4770 } else {
4771 return;
4772 }
4773
4774 /* Types are not supposed to be changed at runtime. */
4775 WARN_ON(old_type != TC_PORT_UNKNOWN &&
4776 old_type != intel_dig_port->tc_type);
4777
4778 if (old_type != intel_dig_port->tc_type)
4779 DRM_DEBUG_KMS("Port %c has TC type %s\n", port_name(port),
4780 type_str);
4781}
4782
4783/*
4784 * This function implements the first part of the Connect Flow described by our
4785 * specification, Gen11 TypeC Programming chapter. The rest of the flow (reading
4786 * lanes, EDID, etc) is done as needed in the typical places.
4787 *
4788 * Unlike the other ports, type-C ports are not available to use as soon as we
4789 * get a hotplug. The type-C PHYs can be shared between multiple controllers:
4790 * display, USB, etc. As a result, handshaking through FIA is required around
4791 * connect and disconnect to cleanly transfer ownership with the controller and
4792 * set the type-C power state.
4793 *
4794 * We could opt to only do the connect flow when we actually try to use the AUX
4795 * channels or do a modeset, then immediately run the disconnect flow after
4796 * usage, but there are some implications on this for a dynamic environment:
4797 * things may go away or change behind our backs. So for now our driver is
4798 * always trying to acquire ownership of the controller as soon as it gets an
4799 * interrupt (or polls state and sees a port is connected) and only gives it
4800 * back when it sees a disconnect. Implementation of a more fine-grained model
4801 * will require a lot of coordination with user space and thorough testing for
4802 * the extra possible cases.
4803 */
4804static bool icl_tc_phy_connect(struct drm_i915_private *dev_priv,
4805 struct intel_digital_port *dig_port)
4806{
4807 enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
4808 u32 val;
4809
4810 if (dig_port->tc_type != TC_PORT_LEGACY &&
4811 dig_port->tc_type != TC_PORT_TYPEC)
4812 return true;
4813
4814 val = I915_READ(PORT_TX_DFLEXDPPMS);
4815 if (!(val & DP_PHY_MODE_STATUS_COMPLETED(tc_port))) {
4816 DRM_DEBUG_KMS("DP PHY for TC port %d not ready\n", tc_port);
4817 return false;
4818 }
4819
4820 /*
4821 * This function may be called many times in a row without an HPD event
4822 * in between, so try to avoid the write when we can.
4823 */
4824 val = I915_READ(PORT_TX_DFLEXDPCSSS);
4825 if (!(val & DP_PHY_MODE_STATUS_NOT_SAFE(tc_port))) {
4826 val |= DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
4827 I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
4828 }
4829
4830 /*
4831 * Now we have to re-check the live state, in case the port recently
4832 * became disconnected. Not necessary for legacy mode.
4833 */
4834 if (dig_port->tc_type == TC_PORT_TYPEC &&
4835 !(I915_READ(PORT_TX_DFLEXDPSP) & TC_LIVE_STATE_TC(tc_port))) {
4836 DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n", tc_port);
4837 val = I915_READ(PORT_TX_DFLEXDPCSSS);
4838 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
4839 I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
4840 return false;
4841 }
4842
4843 return true;
4844}
4845
4846/*
4847 * See the comment at the connect function. This implements the Disconnect
4848 * Flow.
4849 */
4850static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
4851 struct intel_digital_port *dig_port)
4852{
4853 enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
4854 u32 val;
4855
4856 if (dig_port->tc_type != TC_PORT_LEGACY &&
4857 dig_port->tc_type != TC_PORT_TYPEC)
4858 return;
4859
4860 /*
4861 * This function may be called many times in a row without an HPD event
4862 * in between, so try to avoid the write when we can.
4863 */
4864 val = I915_READ(PORT_TX_DFLEXDPCSSS);
4865 if (val & DP_PHY_MODE_STATUS_NOT_SAFE(tc_port)) {
4866 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
4867 I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
4868 }
4869}
4870
4871/*
4872 * The type-C ports are different because even when they are connected, they may
4873 * not be available/usable by the graphics driver: see the comment on
4874 * icl_tc_phy_connect(). So in our driver instead of adding the additional
4875 * concept of "usable" and make everything check for "connected and usable" we
4876 * define a port as "connected" when it is not only connected, but also when it
4877 * is usable by the rest of the driver. That maintains the old assumption that
4878 * connected ports are usable, and avoids exposing to the users objects they
4879 * can't really use.
4880 */
4881static bool icl_tc_port_connected(struct drm_i915_private *dev_priv,
4882 struct intel_digital_port *intel_dig_port)
4883{
4884 enum port port = intel_dig_port->base.port;
4885 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
4886 bool is_legacy, is_typec, is_tbt;
4887 u32 dpsp;
4888
4889 is_legacy = I915_READ(SDEISR) & SDE_TC_HOTPLUG_ICP(tc_port);
4890
4891 /*
4892 * The spec says we shouldn't be using the ISR bits for detecting
4893 * between TC and TBT. We should use DFLEXDPSP.
4894 */
4895 dpsp = I915_READ(PORT_TX_DFLEXDPSP);
4896 is_typec = dpsp & TC_LIVE_STATE_TC(tc_port);
4897 is_tbt = dpsp & TC_LIVE_STATE_TBT(tc_port);
4898
4899 if (!is_legacy && !is_typec && !is_tbt) {
4900 icl_tc_phy_disconnect(dev_priv, intel_dig_port);
4901 return false;
4902 }
4903
4904 icl_update_tc_port_type(dev_priv, intel_dig_port, is_legacy, is_typec,
4905 is_tbt);
4906
4907 if (!icl_tc_phy_connect(dev_priv, intel_dig_port))
4908 return false;
4909
4910 return true;
4911}
4912
4913static bool icl_digital_port_connected(struct intel_encoder *encoder)
4914{
4915 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4916 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
4917
4918 switch (encoder->hpd_pin) {
4919 case HPD_PORT_A:
4920 case HPD_PORT_B:
4921 return icl_combo_port_connected(dev_priv, dig_port);
4922 case HPD_PORT_C:
4923 case HPD_PORT_D:
4924 case HPD_PORT_E:
4925 case HPD_PORT_F:
4926 return icl_tc_port_connected(dev_priv, dig_port);
4927 default:
4928 MISSING_CASE(encoder->hpd_pin);
4929 return false;
4930 }
4931}
4932
4589/*4933/*
4590 * intel_digital_port_connected - is the specified port connected?4934 * intel_digital_port_connected - is the specified port connected?
4591 * @encoder: intel_encoder4935 * @encoder: intel_encoder
4592 *4936 *
4937 * In cases where there's a connector physically connected but it can't be used
4938 * by our hardware we also return false, since the rest of the driver should
4939 * pretty much treat the port as disconnected. This is relevant for type-C
4940 * (starting on ICL) where there's ownership involved.
4941 *
4593 * Return %true if port is connected, %false otherwise.4942 * Return %true if port is connected, %false otherwise.
4594 */4943 */
4595bool intel_digital_port_connected(struct intel_encoder *encoder)4944bool intel_digital_port_connected(struct intel_encoder *encoder)
@@ -4613,8 +4962,10 @@ bool intel_digital_port_connected(struct intel_encoder *encoder) · 17 unmodified lines
4613 return bdw_digital_port_connected(encoder);4962 return bdw_digital_port_connected(encoder);
4614 else if (IS_GEN9_LP(dev_priv))4963 else if (IS_GEN9_LP(dev_priv))
4615 return bxt_digital_port_connected(encoder);4964 return bxt_digital_port_connected(encoder);
4616 else4965 else if (IS_GEN9_BC(dev_priv) || IS_GEN10(dev_priv))
4617 return spt_digital_port_connected(encoder);4966 return spt_digital_port_connected(encoder);
4967 else
4968 return icl_digital_port_connected(encoder);
4618}4969}
4619 4970
4620static struct edid *4971static struct edid *
@@ -4661,7 +5012,8 @@ intel_dp_unset_edid(struct intel_dp *intel_dp) · 40 unmodified lines
4661}5012}
4662 5013
4663static int5014static int
4664intel_dp_long_pulse(struct intel_connector *connector)5015intel_dp_long_pulse(struct intel_connector *connector,
5016 struct drm_modeset_acquire_ctx *ctx)
4665{5017{
4666 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);5018 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
4667 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);5019 struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
@@ -4720,6 +5072,22 @@ intel_dp_long_pulse(struct intel_connector *connector) · 52 unmodified lines
4720 */5072 */
4721 status = connector_status_disconnected;5073 status = connector_status_disconnected;
4722 goto out;5074 goto out;
5075 } else {
5076 /*
5077 * If display is now connected check links status,
5078 * there has been known issues of link loss triggering
5079 * long pulse.
5080 *
5081 * Some sinks (eg. ASUS PB287Q) seem to perform some
5082 * weird HPD ping pong during modesets. So we can apparently
5083 * end up with HPD going low during a modeset, and then
5084 * going back up soon after. And once that happens we must
5085 * retrain the link to get a picture. That's in case no
5086 * userspace component reacted to intermittent HPD dip.
5087 */
5088 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
5089
5090 intel_dp_retrain_link(encoder, ctx);
4723 }5091 }
4724 5092
4725 /*5093 /*
@@ -4781,7 +5149,7 @@ intel_dp_detect(struct drm_connector *connector, · 55 unmodified lines
4781 return ret;5149 return ret;
4782 }5150 }
4783 5151
4784 status = intel_dp_long_pulse(intel_dp->attached_connector);5152 status = intel_dp_long_pulse(intel_dp->attached_connector, ctx);
4785 }5153 }
4786 5154
4787 intel_dp->detect_done = false;5155 intel_dp->detect_done = false;
@@ -5172,7 +5540,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = { · 384 unmodified lines
5172 5540
5173static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)5541static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
5174{5542{
5175 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5543 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5176 5544
5177 lockdep_assert_held(&dev_priv->pps_mutex);5545 lockdep_assert_held(&dev_priv->pps_mutex);
5178 5546
@@ -5193,7 +5561,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) · 14 unmodified lines
5193 5561
5194static enum pipe vlv_active_pipe(struct intel_dp *intel_dp)5562static enum pipe vlv_active_pipe(struct intel_dp *intel_dp)
5195{5563{
5196 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5564 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5197 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;5565 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
5198 enum pipe pipe;5566 enum pipe pipe;
5199 5567
@@ -5260,7 +5628,7 @@ enum irqreturn · 60 unmodified lines
5260intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)5628intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
5261{5629{
5262 struct intel_dp *intel_dp = &intel_dig_port->dp;5630 struct intel_dp *intel_dp = &intel_dig_port->dp;
5263 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5631 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5264 enum irqreturn ret = IRQ_NONE;5632 enum irqreturn ret = IRQ_NONE;
5265 5633
5266 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {5634 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
@@ -5376,7 +5744,7 @@ static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp) · 109 unmodified lines
5376static void5744static void
5377intel_pps_readout_hw_state(struct intel_dp *intel_dp, struct edp_power_seq *seq)5745intel_pps_readout_hw_state(struct intel_dp *intel_dp, struct edp_power_seq *seq)
5378{5746{
5379 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5747 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5380 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0;5748 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0;
5381 struct pps_registers regs;5749 struct pps_registers regs;
5382 5750
@@ -5444,7 +5812,7 @@ intel_pps_verify_state(struct intel_dp *intel_dp) · 61 unmodified lines
5444static void5812static void
5445intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp)5813intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp)
5446{5814{
5447 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5815 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5448 struct edp_power_seq cur, vbt, spec,5816 struct edp_power_seq cur, vbt, spec,
5449 *final = &intel_dp->pps_delays;5817 *final = &intel_dp->pps_delays;
5450 5818
@@ -5537,7 +5905,7 @@ static void · 86 unmodified lines
5537intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,5905intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
5538 bool force_disable_vdd)5906 bool force_disable_vdd)
5539{5907{
5540 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));5908 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5541 u32 pp_on, pp_off, pp_div, port_sel = 0;5909 u32 pp_on, pp_off, pp_div, port_sel = 0;
5542 int div = dev_priv->rawclk_freq / 1000;5910 int div = dev_priv->rawclk_freq / 1000;
5543 struct pps_registers regs;5911 struct pps_registers regs;
@@ -5633,7 +6001,7 @@ intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp, · 89 unmodified lines
5633 6001
5634static void intel_dp_pps_init(struct intel_dp *intel_dp)6002static void intel_dp_pps_init(struct intel_dp *intel_dp)
5635{6003{
5636 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));6004 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5637 6005
5638 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {6006 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
5639 vlv_initial_power_sequencer_setup(intel_dp);6007 vlv_initial_power_sequencer_setup(intel_dp);
@@ -5750,7 +6118,7 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv, · 110 unmodified lines
5750void intel_edp_drrs_enable(struct intel_dp *intel_dp,6118void intel_edp_drrs_enable(struct intel_dp *intel_dp,
5751 const struct intel_crtc_state *crtc_state)6119 const struct intel_crtc_state *crtc_state)
5752{6120{
5753 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));6121 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5754 6122
5755 if (!crtc_state->has_drrs) {6123 if (!crtc_state->has_drrs) {
5756 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");6124 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");
@@ -5785,7 +6153,7 @@ unlock: · 28 unmodified lines
5785void intel_edp_drrs_disable(struct intel_dp *intel_dp,6153void intel_edp_drrs_disable(struct intel_dp *intel_dp,
5786 const struct intel_crtc_state *old_crtc_state)6154 const struct intel_crtc_state *old_crtc_state)
5787{6155{
5788 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));6156 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5789 6157
5790 if (!old_crtc_state->has_drrs)6158 if (!old_crtc_state->has_drrs)
5791 return;6159 return;
@@ -6017,8 +6385,8 @@ intel_dp_drrs_init(struct intel_connector *connector, · 225 unmodified lines
6017static bool intel_edp_init_connector(struct intel_dp *intel_dp,6385static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6018 struct intel_connector *intel_connector)6386 struct intel_connector *intel_connector)
6019{6387{
6020 struct drm_device *dev = intel_dp_to_dev(intel_dp);6388 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
6021 struct drm_i915_private *dev_priv = to_i915(dev);6389 struct drm_device *dev = &dev_priv->drm;
6022 struct drm_connector *connector = &intel_connector->base;6390 struct drm_connector *connector = &intel_connector->base;
6023 struct drm_display_mode *fixed_mode = NULL;6391 struct drm_display_mode *fixed_mode = NULL;
6024 struct drm_display_mode *downclock_mode = NULL;6392 struct drm_display_mode *downclock_mode = NULL;
drivers/gpu/drm/i915/intel_dp_link_training.c+20−5
@@ -129,7 +129,8 @@ static bool · 128 unmodified lines
129intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)129intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
130{130{
131 uint8_t voltage;131 uint8_t voltage;
132 int voltage_tries, max_vswing_tries;132 int voltage_tries, cr_tries, max_cr_tries;
133 bool max_vswing_reached = false;
133 uint8_t link_config[2];134 uint8_t link_config[2];
134 uint8_t link_bw, rate_select;135 uint8_t link_bw, rate_select;
135 136
@@ -170,9 +171,21 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) · 34 unmodified lines
170 return false;171 return false;
171 }172 }
172 173
174 /*
175 * The DP 1.4 spec defines the max clock recovery retries value
176 * as 10 but for pre-DP 1.4 devices we set a very tolerant
177 * retry limit of 80 (4 voltage levels x 4 preemphasis levels x
178 * x 5 identical voltage retries). Since the previous specs didn't
179 * define a limit and created the possibility of an infinite loop
180 * we want to prevent any sync from triggering that corner case.
181 */
182 if (intel_dp->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14)
183 max_cr_tries = 10;
184 else
185 max_cr_tries = 80;
186
173 voltage_tries = 1;187 voltage_tries = 1;
174 max_vswing_tries = 0;188 for (cr_tries = 0; cr_tries < max_cr_tries; ++cr_tries) {
175 for (;;) {
176 uint8_t link_status[DP_LINK_STATUS_SIZE];189 uint8_t link_status[DP_LINK_STATUS_SIZE];
177 190
178 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);191 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
@@ -192,7 +205,7 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) · 13 unmodified lines
192 return false;205 return false;
193 }206 }
194 207
195 if (max_vswing_tries == 1) {208 if (max_vswing_reached) {
196 DRM_DEBUG_KMS("Max Voltage Swing reached\n");209 DRM_DEBUG_KMS("Max Voltage Swing reached\n");
197 return false;210 return false;
198 }211 }
@@ -213,9 +226,11 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) · 14 unmodified lines
213 voltage_tries = 1;226 voltage_tries = 1;
214 227
215 if (intel_dp_link_max_vswing_reached(intel_dp))228 if (intel_dp_link_max_vswing_reached(intel_dp))
216 ++max_vswing_tries;229 max_vswing_reached = true;
217 230
218 }231 }
232 DRM_ERROR("Failed clock recovery %d times, giving up!\n", max_cr_tries);
233 return false;
219}234}
220 235
221/*236/*
drivers/gpu/drm/i915/intel_dp_mst.c+7−7
@@ -166,6 +166,8 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder, · 165 unmodified lines
166 struct intel_connector *connector =166 struct intel_connector *connector =
167 to_intel_connector(old_conn_state->connector);167 to_intel_connector(old_conn_state->connector);
168 168
169 intel_ddi_disable_pipe_clock(old_crtc_state);
170
169 /* this can fail */171 /* this can fail */
170 drm_dp_check_act_status(&intel_dp->mst_mgr);172 drm_dp_check_act_status(&intel_dp->mst_mgr);
171 /* and this can also fail */173 /* and this can also fail */
@@ -241,17 +243,16 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, · 69 unmodified lines
241 connector->port,243 connector->port,
242 pipe_config->pbn,244 pipe_config->pbn,
243 pipe_config->dp_m_n.tu);245 pipe_config->dp_m_n.tu);
244 if (ret == false) {246 if (!ret)
245 DRM_ERROR("failed to allocate vcpi\n");247 DRM_ERROR("failed to allocate vcpi\n");
246 return;
247 }
248
249 248
250 intel_dp->active_mst_links++;249 intel_dp->active_mst_links++;
251 temp = I915_READ(DP_TP_STATUS(port));250 temp = I915_READ(DP_TP_STATUS(port));
252 I915_WRITE(DP_TP_STATUS(port), temp);251 I915_WRITE(DP_TP_STATUS(port), temp);
253 252
254 ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);253 ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
254
255 intel_ddi_enable_pipe_clock(pipe_config);
255}256}
256 257
257static void intel_mst_enable_dp(struct intel_encoder *encoder,258static void intel_mst_enable_dp(struct intel_encoder *encoder,
@@ -263,7 +264,6 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, · 5 unmodified lines
263 struct intel_dp *intel_dp = &intel_dig_port->dp;264 struct intel_dp *intel_dp = &intel_dig_port->dp;
264 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);265 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
265 enum port port = intel_dig_port->base.port;266 enum port port = intel_dig_port->base.port;
266 int ret;
267 267
268 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);268 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
269 269
@@ -274,9 +274,9 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, · 4 unmodified lines
274 1))274 1))
275 DRM_ERROR("Timed out waiting for ACT sent\n");275 DRM_ERROR("Timed out waiting for ACT sent\n");
276 276
277 ret = drm_dp_check_act_status(&intel_dp->mst_mgr);277 drm_dp_check_act_status(&intel_dp->mst_mgr);
278 278
279 ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr);279 drm_dp_update_payload_part2(&intel_dp->mst_mgr);
280 if (pipe_config->has_audio)280 if (pipe_config->has_audio)
281 intel_audio_codec_enable(encoder, pipe_config, conn_state);281 intel_audio_codec_enable(encoder, pipe_config, conn_state);
282}282}
drivers/gpu/drm/i915/intel_dpll_mgr.c+46−16
@@ -2212,6 +2212,20 @@ static void cnl_wrpll_params_populate(struct skl_wrpll_params *params, · 2211 unmodified lines
2212 params->dco_fraction = dco & 0x7fff;2212 params->dco_fraction = dco & 0x7fff;
2213}2213}
2214 2214
2215int cnl_hdmi_pll_ref_clock(struct drm_i915_private *dev_priv)
2216{
2217 int ref_clock = dev_priv->cdclk.hw.ref;
2218
2219 /*
2220 * For ICL+, the spec states: if reference frequency is 38.4,
2221 * use 19.2 because the DPLL automatically divides that by 2.
2222 */
2223 if (INTEL_GEN(dev_priv) >= 11 && ref_clock == 38400)
2224 ref_clock = 19200;
2225
2226 return ref_clock;
2227}
2228
2215static bool2229static bool
2216cnl_ddi_calculate_wrpll(int clock,2230cnl_ddi_calculate_wrpll(int clock,
2217 struct drm_i915_private *dev_priv,2231 struct drm_i915_private *dev_priv,
@@ -2251,14 +2265,7 @@ cnl_ddi_calculate_wrpll(int clock, · 33 unmodified lines
2251 2265
2252 cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);2266 cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2253 2267
2254 ref_clock = dev_priv->cdclk.hw.ref;2268 ref_clock = cnl_hdmi_pll_ref_clock(dev_priv);
2255
2256 /*
2257 * For ICL, the spec states: if reference frequency is 38.4, use 19.2
2258 * because the DPLL automatically divides that by 2.
2259 */
2260 if (IS_ICELAKE(dev_priv) && ref_clock == 38400)
2261 ref_clock = 19200;
2262 2269
2263 cnl_wrpll_params_populate(wrpll_params, best_dco, ref_clock, pdiv, qdiv,2270 cnl_wrpll_params_populate(wrpll_params, best_dco, ref_clock, pdiv, qdiv,
2264 kdiv);2271 kdiv);
@@ -2452,6 +2459,16 @@ static const struct skl_wrpll_params icl_dp_combo_pll_19_2MHz_values[] = { · 187 unmodified lines
2452 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},2459 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2453};2460};
2454 2461
2462static const struct skl_wrpll_params icl_tbt_pll_24MHz_values = {
2463 .dco_integer = 0x151, .dco_fraction = 0x4000,
2464 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2465};
2466
2467static const struct skl_wrpll_params icl_tbt_pll_19_2MHz_values = {
2468 .dco_integer = 0x1A5, .dco_fraction = 0x7000,
2469 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2470};
2471
2455static bool icl_calc_dp_combo_pll(struct drm_i915_private *dev_priv, int clock,2472static bool icl_calc_dp_combo_pll(struct drm_i915_private *dev_priv, int clock,
2456 struct skl_wrpll_params *pll_params)2473 struct skl_wrpll_params *pll_params)
2457{2474{
@@ -2494,6 +2511,14 @@ static bool icl_calc_dp_combo_pll(struct drm_i915_private *dev_priv, int clock, · 36 unmodified lines
2494 return true;2511 return true;
2495}2512}
2496 2513
2514static bool icl_calc_tbt_pll(struct drm_i915_private *dev_priv, int clock,
2515 struct skl_wrpll_params *pll_params)
2516{
2517 *pll_params = dev_priv->cdclk.hw.ref == 24000 ?
2518 icl_tbt_pll_24MHz_values : icl_tbt_pll_19_2MHz_values;
2519 return true;
2520}
2521
2497static bool icl_calc_dpll_state(struct intel_crtc_state *crtc_state,2522static bool icl_calc_dpll_state(struct intel_crtc_state *crtc_state,
2498 struct intel_encoder *encoder, int clock,2523 struct intel_encoder *encoder, int clock,
2499 struct intel_dpll_hw_state *pll_state)2524 struct intel_dpll_hw_state *pll_state)
@@ -2503,7 +2528,9 @@ static bool icl_calc_dpll_state(struct intel_crtc_state *crtc_state, · 3 unmodified lines
2503 struct skl_wrpll_params pll_params = { 0 };2528 struct skl_wrpll_params pll_params = { 0 };
2504 bool ret;2529 bool ret;
2505 2530
2506 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))2531 if (intel_port_is_tc(dev_priv, encoder->port))
2532 ret = icl_calc_tbt_pll(dev_priv, clock, &pll_params);
2533 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
2507 ret = cnl_ddi_calculate_wrpll(clock, dev_priv, &pll_params);2534 ret = cnl_ddi_calculate_wrpll(clock, dev_priv, &pll_params);
2508 else2535 else
2509 ret = icl_calc_dp_combo_pll(dev_priv, clock, &pll_params);2536 ret = icl_calc_dp_combo_pll(dev_priv, clock, &pll_params);
@@ -2623,7 +2650,8 @@ static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc, · 113 unmodified lines
2623 2650
2624 for (div2 = 10; div2 > 0; div2--) {2651 for (div2 = 10; div2 > 0; div2--) {
2625 int dco = div1 * div2 * clock_khz * 5;2652 int dco = div1 * div2 * clock_khz * 5;
2626 int a_divratio, tlinedrv, inputsel, hsdiv;2653 int a_divratio, tlinedrv, inputsel;
2654 u32 hsdiv;
2627 2655
2628 if (dco < dco_min_freq || dco > dco_max_freq)2656 if (dco < dco_min_freq || dco > dco_max_freq)
2629 continue;2657 continue;
@@ -2642,16 +2670,16 @@ static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc, · 12 unmodified lines
2642 MISSING_CASE(div1);2670 MISSING_CASE(div1);
2643 /* fall through */2671 /* fall through */
2644 case 2:2672 case 2:
2645 hsdiv = 0;2673 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2;
2646 break;2674 break;
2647 case 3:2675 case 3:
2648 hsdiv = 1;2676 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3;
2649 break;2677 break;
2650 case 5:2678 case 5:
2651 hsdiv = 2;2679 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5;
2652 break;2680 break;
2653 case 7:2681 case 7:
2654 hsdiv = 3;2682 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7;
2655 break;2683 break;
2656 }2684 }
2657 2685
@@ -2665,7 +2693,7 @@ static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc, · 7 unmodified lines
2665 state->mg_clktop2_hsclkctl =2693 state->mg_clktop2_hsclkctl =
2666 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |2694 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |
2667 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |2695 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |
2668 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO(hsdiv) |2696 hsdiv |
2669 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);2697 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);
2670 2698
2671 return true;2699 return true;
@@ -2846,6 +2874,8 @@ static struct intel_shared_dpll * · 174 unmodified lines
2846icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,2874icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2847 struct intel_encoder *encoder)2875 struct intel_encoder *encoder)
2848{2876{
2877 struct intel_digital_port *intel_dig_port =
2878 enc_to_dig_port(&encoder->base);
2849 struct intel_shared_dpll *pll;2879 struct intel_shared_dpll *pll;
2850 struct intel_dpll_hw_state pll_state = {};2880 struct intel_dpll_hw_state pll_state = {};
2851 enum port port = encoder->port;2881 enum port port = encoder->port;
@@ -2865,7 +2895,7 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 13 unmodified lines
2865 case PORT_D:2895 case PORT_D:
2866 case PORT_E:2896 case PORT_E:
2867 case PORT_F:2897 case PORT_F:
2868 if (0 /* TODO: TBT PLLs */) {2898 if (intel_dig_port->tc_type == TC_PORT_TBT) {
2869 min = DPLL_ID_ICL_TBTPLL;2899 min = DPLL_ID_ICL_TBTPLL;
2870 max = min;2900 max = min;
2871 ret = icl_calc_dpll_state(crtc_state, encoder, clock,2901 ret = icl_calc_dpll_state(crtc_state, encoder, clock,
drivers/gpu/drm/i915/intel_dpll_mgr.h+1−0
@@ -344,5 +344,6 @@ void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv, · 343 unmodified lines
344 struct intel_dpll_hw_state *hw_state);344 struct intel_dpll_hw_state *hw_state);
345int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv,345int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv,
346 uint32_t pll_id);346 uint32_t pll_id);
347int cnl_hdmi_pll_ref_clock(struct drm_i915_private *dev_priv);
347 348
348#endif /* _INTEL_DPLL_MGR_H_ */349#endif /* _INTEL_DPLL_MGR_H_ */
drivers/gpu/drm/i915/intel_drv.h+33−10
@@ -972,9 +972,8 @@ struct intel_plane { · 971 unmodified lines
972 void (*disable_plane)(struct intel_plane *plane,972 void (*disable_plane)(struct intel_plane *plane,
973 struct intel_crtc *crtc);973 struct intel_crtc *crtc);
974 bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe);974 bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe);
975 int (*check_plane)(struct intel_plane *plane,975 int (*check_plane)(struct intel_crtc_state *crtc_state,
976 struct intel_crtc_state *crtc_state,976 struct intel_plane_state *plane_state);
977 struct intel_plane_state *state);
978};977};
979 978
980struct intel_watermark_params {979struct intel_watermark_params {
@@ -1168,6 +1167,7 @@ struct intel_digital_port { · 187 unmodified lines
1168 bool release_cl2_override;1167 bool release_cl2_override;
1169 uint8_t max_lanes;1168 uint8_t max_lanes;
1170 enum intel_display_power_domain ddi_io_power_domain;1169 enum intel_display_power_domain ddi_io_power_domain;
1170 enum tc_port_type tc_type;
1171 1171
1172 void (*write_infoframe)(struct drm_encoder *encoder,1172 void (*write_infoframe)(struct drm_encoder *encoder,
1173 const struct intel_crtc_state *crtc_state,1173 const struct intel_crtc_state *crtc_state,
@@ -1314,6 +1314,12 @@ dp_to_lspcon(struct intel_dp *intel_dp) · 140 unmodified lines
1314 return &dp_to_dig_port(intel_dp)->lspcon;1314 return &dp_to_dig_port(intel_dp)->lspcon;
1315}1315}
1316 1316
1317static inline struct drm_i915_private *
1318dp_to_i915(struct intel_dp *intel_dp)
1319{
1320 return to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
1321}
1322
1317static inline struct intel_digital_port *1323static inline struct intel_digital_port *
1318hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)1324hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)
1319{1325{
@@ -1717,6 +1723,9 @@ void intel_edp_drrs_invalidate(struct drm_i915_private *dev_priv, · 397 unmodified lines
1717 unsigned int frontbuffer_bits);1723 unsigned int frontbuffer_bits);
1718void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,1724void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,
1719 unsigned int frontbuffer_bits);1725 unsigned int frontbuffer_bits);
1726void icl_program_mg_dp_mode(struct intel_dp *intel_dp);
1727void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port);
1728void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port);
1720 1729
1721void1730void
1722intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,1731intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
@@ -1930,6 +1939,9 @@ void intel_psr_enable(struct intel_dp *intel_dp, · 207 unmodified lines
1930 const struct intel_crtc_state *crtc_state);1939 const struct intel_crtc_state *crtc_state);
1931void intel_psr_disable(struct intel_dp *intel_dp,1940void intel_psr_disable(struct intel_dp *intel_dp,
1932 const struct intel_crtc_state *old_crtc_state);1941 const struct intel_crtc_state *old_crtc_state);
1942int intel_psr_set_debugfs_mode(struct drm_i915_private *dev_priv,
1943 struct drm_modeset_acquire_ctx *ctx,
1944 u64 value);
1933void intel_psr_invalidate(struct drm_i915_private *dev_priv,1945void intel_psr_invalidate(struct drm_i915_private *dev_priv,
1934 unsigned frontbuffer_bits,1946 unsigned frontbuffer_bits,
1935 enum fb_op_origin origin);1947 enum fb_op_origin origin);
@@ -1939,20 +1951,33 @@ void intel_psr_flush(struct drm_i915_private *dev_priv, · 3 unmodified lines
1939void intel_psr_init(struct drm_i915_private *dev_priv);1951void intel_psr_init(struct drm_i915_private *dev_priv);
1940void intel_psr_compute_config(struct intel_dp *intel_dp,1952void intel_psr_compute_config(struct intel_dp *intel_dp,
1941 struct intel_crtc_state *crtc_state);1953 struct intel_crtc_state *crtc_state);
1942void intel_psr_irq_control(struct drm_i915_private *dev_priv, bool debug);1954void intel_psr_irq_control(struct drm_i915_private *dev_priv, u32 debug);
1943void intel_psr_irq_handler(struct drm_i915_private *dev_priv, u32 psr_iir);1955void intel_psr_irq_handler(struct drm_i915_private *dev_priv, u32 psr_iir);
1944void intel_psr_short_pulse(struct intel_dp *intel_dp);1956void intel_psr_short_pulse(struct intel_dp *intel_dp);
1945int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state);1957int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state,
1958 u32 *out_value);
1946 1959
1947/* intel_runtime_pm.c */1960/* intel_runtime_pm.c */
1948int intel_power_domains_init(struct drm_i915_private *);1961int intel_power_domains_init(struct drm_i915_private *);
1949void intel_power_domains_fini(struct drm_i915_private *);1962void intel_power_domains_cleanup(struct drm_i915_private *dev_priv);
1950void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);1963void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
1951void intel_power_domains_suspend(struct drm_i915_private *dev_priv);1964void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv);
1952void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);1965void intel_power_domains_enable(struct drm_i915_private *dev_priv);
1966void intel_power_domains_disable(struct drm_i915_private *dev_priv);
1967
1968enum i915_drm_suspend_mode {
1969 I915_DRM_SUSPEND_IDLE,
1970 I915_DRM_SUSPEND_MEM,
1971 I915_DRM_SUSPEND_HIBERNATE,
1972};
1973
1974void intel_power_domains_suspend(struct drm_i915_private *dev_priv,
1975 enum i915_drm_suspend_mode);
1976void intel_power_domains_resume(struct drm_i915_private *dev_priv);
1953void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);1977void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);
1954void bxt_display_core_uninit(struct drm_i915_private *dev_priv);1978void bxt_display_core_uninit(struct drm_i915_private *dev_priv);
1955void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);1979void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);
1980void intel_runtime_pm_disable(struct drm_i915_private *dev_priv);
1956const char *1981const char *
1957intel_display_power_domain_str(enum intel_display_power_domain domain);1982intel_display_power_domain_str(enum intel_display_power_domain domain);
1958 1983
@@ -2030,8 +2055,6 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv); · 71 unmodified lines
2030void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv);2055void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv);
2031void intel_runtime_pm_put(struct drm_i915_private *dev_priv);2056void intel_runtime_pm_put(struct drm_i915_private *dev_priv);
2032 2057
2033void intel_display_set_init_power(struct drm_i915_private *dev, bool enable);
2034
2035void chv_phy_powergate_lanes(struct intel_encoder *encoder,2058void chv_phy_powergate_lanes(struct intel_encoder *encoder,
2036 bool override, unsigned int mask);2059 bool override, unsigned int mask);
2037bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy,2060bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy,
drivers/gpu/drm/i915/intel_engine_cs.c+41−52
@@ -513,7 +513,7 @@ int intel_engine_create_scratch(struct intel_engine_cs *engine, · 512 unmodified lines
513 goto err_unref;513 goto err_unref;
514 }514 }
515 515
516 ret = i915_vma_pin(vma, 0, 4096, PIN_GLOBAL | PIN_HIGH);516 ret = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
517 if (ret)517 if (ret)
518 goto err_unref;518 goto err_unref;
519 519
@@ -527,36 +527,19 @@ err_unref: · 7 unmodified lines
527 527
528void intel_engine_cleanup_scratch(struct intel_engine_cs *engine)528void intel_engine_cleanup_scratch(struct intel_engine_cs *engine)
529{529{
530 i915_vma_unpin_and_release(&engine->scratch);530 i915_vma_unpin_and_release(&engine->scratch, 0);
531}
532
533static void cleanup_phys_status_page(struct intel_engine_cs *engine)
534{
535 struct drm_i915_private *dev_priv = engine->i915;
536
537 if (!dev_priv->status_page_dmah)
538 return;
539
540 drm_pci_free(&dev_priv->drm, dev_priv->status_page_dmah);
541 engine->status_page.page_addr = NULL;
542}531}
543 532
544static void cleanup_status_page(struct intel_engine_cs *engine)533static void cleanup_status_page(struct intel_engine_cs *engine)
545{534{
546 struct i915_vma *vma;535 if (HWS_NEEDS_PHYSICAL(engine->i915)) {
547 struct drm_i915_gem_object *obj;536 void *addr = fetch_and_zero(&engine->status_page.page_addr);
548
549 vma = fetch_and_zero(&engine->status_page.vma);
550 if (!vma)
551 return;
552
553 obj = vma->obj;
554 537
555 i915_vma_unpin(vma);538 __free_page(virt_to_page(addr));
556 i915_vma_close(vma);539 }
557 540
558 i915_gem_object_unpin_map(obj);541 i915_vma_unpin_and_release(&engine->status_page.vma,
559 __i915_gem_object_release_unless_active(obj);542 I915_VMA_RELEASE_MAP);
560}543}
561 544
562static int init_status_page(struct intel_engine_cs *engine)545static int init_status_page(struct intel_engine_cs *engine)
@@ -598,7 +581,7 @@ static int init_status_page(struct intel_engine_cs *engine) · 35 unmodified lines
598 flags |= PIN_MAPPABLE;581 flags |= PIN_MAPPABLE;
599 else582 else
600 flags |= PIN_HIGH;583 flags |= PIN_HIGH;
601 ret = i915_vma_pin(vma, 0, 4096, flags);584 ret = i915_vma_pin(vma, 0, 0, flags);
602 if (ret)585 if (ret)
603 goto err;586 goto err;
604 587
@@ -622,17 +605,18 @@ err: · 17 unmodified lines
622 605
623static int init_phys_status_page(struct intel_engine_cs *engine)606static int init_phys_status_page(struct intel_engine_cs *engine)
624{607{
625 struct drm_i915_private *dev_priv = engine->i915;608 struct page *page;
626 609
627 GEM_BUG_ON(engine->id != RCS);610 /*
628 611 * Though the HWS register does support 36bit addresses, historically
629 dev_priv->status_page_dmah =612 * we have had hangs and corruption reported due to wild writes if
630 drm_pci_alloc(&dev_priv->drm, PAGE_SIZE, PAGE_SIZE);613 * the HWS is placed above 4G.
631 if (!dev_priv->status_page_dmah)614 */
615 page = alloc_page(GFP_KERNEL | __GFP_DMA32 | __GFP_ZERO);
616 if (!page)
632 return -ENOMEM;617 return -ENOMEM;
633 618
634 engine->status_page.page_addr = dev_priv->status_page_dmah->vaddr;619 engine->status_page.page_addr = page_address(page);
635 memset(engine->status_page.page_addr, 0, PAGE_SIZE);
636 620
637 return 0;621 return 0;
638}622}
@@ -722,10 +706,7 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine) · 83 unmodified lines
722 706
723 intel_engine_cleanup_scratch(engine);707 intel_engine_cleanup_scratch(engine);
724 708
725 if (HWS_NEEDS_PHYSICAL(engine->i915))709 cleanup_status_page(engine);
726 cleanup_phys_status_page(engine);
727 else
728 cleanup_status_page(engine);
729 710
730 intel_engine_fini_breadcrumbs(engine);711 intel_engine_fini_breadcrumbs(engine);
731 intel_engine_cleanup_cmd_parser(engine);712 intel_engine_cleanup_cmd_parser(engine);
@@ -800,6 +781,16 @@ int intel_engine_stop_cs(struct intel_engine_cs *engine) · 68 unmodified lines
800 return err;781 return err;
801}782}
802 783
784void intel_engine_cancel_stop_cs(struct intel_engine_cs *engine)
785{
786 struct drm_i915_private *dev_priv = engine->i915;
787
788 GEM_TRACE("%s\n", engine->name);
789
790 I915_WRITE_FW(RING_MI_MODE(engine->mmio_base),
791 _MASKED_BIT_DISABLE(STOP_RING));
792}
793
803const char *i915_cache_level_str(struct drm_i915_private *i915, int type)794const char *i915_cache_level_str(struct drm_i915_private *i915, int type)
804{795{
805 switch (type) {796 switch (type) {
@@ -980,8 +971,7 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine) · 174 unmodified lines
980 return true;971 return true;
981 972
982 /* Any inflight/incomplete requests? */973 /* Any inflight/incomplete requests? */
983 if (!i915_seqno_passed(intel_engine_get_seqno(engine),974 if (!intel_engine_signaled(engine, intel_engine_last_submit(engine)))
984 intel_engine_last_submit(engine)))
985 return false;975 return false;
986 976
987 if (I915_SELFTEST_ONLY(engine->breadcrumbs.mock))977 if (I915_SELFTEST_ONLY(engine->breadcrumbs.mock))
@@ -1348,20 +1338,19 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine, · 360 unmodified lines
1348 1338
1349 if (HAS_EXECLISTS(dev_priv)) {1339 if (HAS_EXECLISTS(dev_priv)) {
1350 const u32 *hws = &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];1340 const u32 *hws = &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];
1351 u32 ptr, read, write;
1352 unsigned int idx;1341 unsigned int idx;
1342 u8 read, write;
1353 1343
1354 drm_printf(m, "\tExeclist status: 0x%08x %08x\n",1344 drm_printf(m, "\tExeclist status: 0x%08x %08x\n",
1355 I915_READ(RING_EXECLIST_STATUS_LO(engine)),1345 I915_READ(RING_EXECLIST_STATUS_LO(engine)),
1356 I915_READ(RING_EXECLIST_STATUS_HI(engine)));1346 I915_READ(RING_EXECLIST_STATUS_HI(engine)));
1357 1347
1358 ptr = I915_READ(RING_CONTEXT_STATUS_PTR(engine));1348 read = execlists->csb_head;
1359 read = GEN8_CSB_READ_PTR(ptr);1349 write = READ_ONCE(*execlists->csb_write);
1360 write = GEN8_CSB_WRITE_PTR(ptr);1350
1361 drm_printf(m, "\tExeclist CSB read %d [%d cached], write %d [%d from hws], tasklet queued? %s (%s)\n",1351 drm_printf(m, "\tExeclist CSB read %d, write %d [mmio:%d], tasklet queued? %s (%s)\n",
1362 read, execlists->csb_head,1352 read, write,
1363 write,1353 GEN8_CSB_WRITE_PTR(I915_READ(RING_CONTEXT_STATUS_PTR(engine))),
1364 intel_read_status_page(engine, intel_hws_csb_write_index(engine->i915)),
1365 yesno(test_bit(TASKLET_STATE_SCHED,1354 yesno(test_bit(TASKLET_STATE_SCHED,
1366 &engine->execlists.tasklet.state)),1355 &engine->execlists.tasklet.state)),
1367 enableddisabled(!atomic_read(&engine->execlists.tasklet.count)));1356 enableddisabled(!atomic_read(&engine->execlists.tasklet.count)));
@@ -1373,12 +1362,12 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine, · 5 unmodified lines
1373 write += GEN8_CSB_ENTRIES;1362 write += GEN8_CSB_ENTRIES;
1374 while (read < write) {1363 while (read < write) {
1375 idx = ++read % GEN8_CSB_ENTRIES;1364 idx = ++read % GEN8_CSB_ENTRIES;
1376 drm_printf(m, "\tExeclist CSB[%d]: 0x%08x [0x%08x in hwsp], context: %d [%d in hwsp]\n",1365 drm_printf(m, "\tExeclist CSB[%d]: 0x%08x [mmio:0x%08x], context: %d [mmio:%d]\n",
1377 idx,1366 idx,
1378 I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, idx)),
1379 hws[idx * 2],1367 hws[idx * 2],
1380 I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, idx)),1368 I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, idx)),
1381 hws[idx * 2 + 1]);1369 hws[idx * 2 + 1],
1370 I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, idx)));
1382 }1371 }
1383 1372
1384 rcu_read_lock();1373 rcu_read_lock();
drivers/gpu/drm/i915/intel_guc.c+46−56
@@ -27,8 +27,6 @@ · 26 unmodified lines
27#include "intel_guc_submission.h"27#include "intel_guc_submission.h"
28#include "i915_drv.h"28#include "i915_drv.h"
29 29
30static void guc_init_ggtt_pin_bias(struct intel_guc *guc);
31
32static void gen8_guc_raise_irq(struct intel_guc *guc)30static void gen8_guc_raise_irq(struct intel_guc *guc)
33{31{
34 struct drm_i915_private *dev_priv = guc_to_i915(guc);32 struct drm_i915_private *dev_priv = guc_to_i915(guc);
@@ -128,13 +126,15 @@ static int guc_init_wq(struct intel_guc *guc) · 93 unmodified lines
128 126
129static void guc_fini_wq(struct intel_guc *guc)127static void guc_fini_wq(struct intel_guc *guc)
130{128{
131 struct drm_i915_private *dev_priv = guc_to_i915(guc);129 struct workqueue_struct *wq;
132 130
133 if (HAS_LOGICAL_RING_PREEMPTION(dev_priv) &&131 wq = fetch_and_zero(&guc->preempt_wq);
134 USES_GUC_SUBMISSION(dev_priv))132 if (wq)
135 destroy_workqueue(guc->preempt_wq);133 destroy_workqueue(wq);
136 134
137 destroy_workqueue(guc->log.relay.flush_wq);135 wq = fetch_and_zero(&guc->log.relay.flush_wq);
136 if (wq)
137 destroy_workqueue(wq);
138}138}
139 139
140int intel_guc_init_misc(struct intel_guc *guc)140int intel_guc_init_misc(struct intel_guc *guc)
@@ -142,8 +142,6 @@ int intel_guc_init_misc(struct intel_guc *guc) · 1 unmodified line
142 struct drm_i915_private *i915 = guc_to_i915(guc);142 struct drm_i915_private *i915 = guc_to_i915(guc);
143 int ret;143 int ret;
144 144
145 guc_init_ggtt_pin_bias(guc);
146
147 ret = guc_init_wq(guc);145 ret = guc_init_wq(guc);
148 if (ret)146 if (ret)
149 return ret;147 return ret;
@@ -170,7 +168,7 @@ static int guc_shared_data_create(struct intel_guc *guc) · 20 unmodified lines
170 168
171 vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);169 vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
172 if (IS_ERR(vaddr)) {170 if (IS_ERR(vaddr)) {
173 i915_vma_unpin_and_release(&vma);171 i915_vma_unpin_and_release(&vma, 0);
174 return PTR_ERR(vaddr);172 return PTR_ERR(vaddr);
175 }173 }
176 174
@@ -182,8 +180,7 @@ static int guc_shared_data_create(struct intel_guc *guc) · 5 unmodified lines
182 180
183static void guc_shared_data_destroy(struct intel_guc *guc)181static void guc_shared_data_destroy(struct intel_guc *guc)
184{182{
185 i915_gem_object_unpin_map(guc->shared_data->obj);183 i915_vma_unpin_and_release(&guc->shared_data, I915_VMA_RELEASE_MAP);
186 i915_vma_unpin_and_release(&guc->shared_data);
187}184}
188 185
189int intel_guc_init(struct intel_guc *guc)186int intel_guc_init(struct intel_guc *guc)
@@ -584,52 +581,27 @@ int intel_guc_resume(struct intel_guc *guc) · 394 unmodified lines
584 *581 *
585 * ::582 * ::
586 *583 *
587 * +==============> +====================+ <== GUC_GGTT_TOP584 * +===========> +====================+ <== FFFF_FFFF
588 * ^ | |585 * ^ | Reserved |
589 * | | |586 * | +====================+ <== GUC_GGTT_TOP
590 * | | DRAM |587 * | | |
591 * | | Memory |588 * | | DRAM |
592 * | | |589 * GuC | |
593 * GuC | |590 * Address +===> +====================+ <== GuC ggtt_pin_bias
594 * Address +========> +====================+ <== WOPCM Top591 * Space ^ | |
595 * Space ^ | HW contexts RSVD |592 * | | | |
596 * | | | WOPCM |593 * | GuC | GuC |
597 * | | +==> +--------------------+ <== GuC WOPCM Top594 * | WOPCM | WOPCM |
598 * | GuC ^ | |595 * | Size | |
599 * | GGTT | | |596 * | | | |
600 * | Pin GuC | GuC |597 * v v | |
601 * | Bias WOPCM | WOPCM |598 * +=======+===> +====================+ <== 0000_0000
602 * | | Size | |
603 * | | | | |
604 * v v v | |
605 * +=====+=====+==> +====================+ <== GuC WOPCM Base
606 * | Non-GuC WOPCM |
607 * | (HuC/Reserved) |
608 * +====================+ <== WOPCM Base
609 *599 *
610 * The lower part of GuC Address Space [0, ggtt_pin_bias) is mapped to WOPCM600 * The lower part of GuC Address Space [0, ggtt_pin_bias) is mapped to GuC WOPCM
611 * while upper part of GuC Address Space [ggtt_pin_bias, GUC_GGTT_TOP) is mapped601 * while upper part of GuC Address Space [ggtt_pin_bias, GUC_GGTT_TOP) is mapped
612 * to DRAM. The value of the GuC ggtt_pin_bias is determined by WOPCM size and602 * to DRAM. The value of the GuC ggtt_pin_bias is the GuC WOPCM size.
613 * actual GuC WOPCM size.
614 */603 */
615 604
616/**
617 * guc_init_ggtt_pin_bias() - Initialize the GuC ggtt_pin_bias value.
618 * @guc: intel_guc structure.
619 *
620 * This function will calculate and initialize the ggtt_pin_bias value based on
621 * overall WOPCM size and GuC WOPCM size.
622 */
623static void guc_init_ggtt_pin_bias(struct intel_guc *guc)
624{
625 struct drm_i915_private *i915 = guc_to_i915(guc);
626
627 GEM_BUG_ON(!i915->wopcm.size);
628 GEM_BUG_ON(i915->wopcm.size < i915->wopcm.guc.base);
629
630 guc->ggtt_pin_bias = i915->wopcm.size - i915->wopcm.guc.base;
631}
632
633/**605/**
634 * intel_guc_allocate_vma() - Allocate a GGTT VMA for GuC usage606 * intel_guc_allocate_vma() - Allocate a GGTT VMA for GuC usage
635 * @guc: the guc607 * @guc: the guc
@@ -648,6 +620,7 @@ struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size) · 12 unmodified lines
648 struct drm_i915_private *dev_priv = guc_to_i915(guc);620 struct drm_i915_private *dev_priv = guc_to_i915(guc);
649 struct drm_i915_gem_object *obj;621 struct drm_i915_gem_object *obj;
650 struct i915_vma *vma;622 struct i915_vma *vma;
623 u64 flags;
651 int ret;624 int ret;
652 625
653 obj = i915_gem_object_create(dev_priv, size);626 obj = i915_gem_object_create(dev_priv, size);
@@ -658,8 +631,8 @@ struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size) · 4 unmodified lines
658 if (IS_ERR(vma))631 if (IS_ERR(vma))
659 goto err;632 goto err;
660 633
661 ret = i915_vma_pin(vma, 0, PAGE_SIZE,634 flags = PIN_GLOBAL | PIN_OFFSET_BIAS | i915_ggtt_pin_bias(vma);
662 PIN_GLOBAL | PIN_OFFSET_BIAS | guc->ggtt_pin_bias);635 ret = i915_vma_pin(vma, 0, 0, flags);
663 if (ret) {636 if (ret) {
664 vma = ERR_PTR(ret);637 vma = ERR_PTR(ret);
665 goto err;638 goto err;
@@ -671,3 +644,20 @@ err: · 5 unmodified lines
671 i915_gem_object_put(obj);644 i915_gem_object_put(obj);
672 return vma;645 return vma;
673}646}
647
648/**
649 * intel_guc_reserved_gtt_size()
650 * @guc: intel_guc structure
651 *
652 * The GuC WOPCM mapping shadows the lower part of the GGTT, so if we are using
653 * GuC we can't have any objects pinned in that region. This function returns
654 * the size of the shadowed region.
655 *
656 * Returns:
657 * 0 if GuC is not present or not in use.
658 * Otherwise, the GuC WOPCM size.
659 */
660u32 intel_guc_reserved_gtt_size(struct intel_guc *guc)
661{
662 return guc_to_i915(guc)->wopcm.guc.size;
663}
drivers/gpu/drm/i915/intel_guc.h+5−7
@@ -49,9 +49,6 @@ struct intel_guc { · 48 unmodified lines
49 struct intel_guc_log log;49 struct intel_guc_log log;
50 struct intel_guc_ct ct;50 struct intel_guc_ct ct;
51 51
52 /* Offset where Non-WOPCM memory starts. */
53 u32 ggtt_pin_bias;
54
55 /* Log snapshot if GuC errors during load */52 /* Log snapshot if GuC errors during load */
56 struct drm_i915_gem_object *load_err_log;53 struct drm_i915_gem_object *load_err_log;
57 54
@@ -130,10 +127,10 @@ static inline void intel_guc_to_host_event_handler(struct intel_guc *guc) · 72 unmodified lines
130 * @vma: i915 graphics virtual memory area.127 * @vma: i915 graphics virtual memory area.
131 *128 *
132 * GuC does not allow any gfx GGTT address that falls into range129 * GuC does not allow any gfx GGTT address that falls into range
133 * [0, GuC ggtt_pin_bias), which is reserved for Boot ROM, SRAM and WOPCM.130 * [0, ggtt.pin_bias), which is reserved for Boot ROM, SRAM and WOPCM.
134 * Currently, in order to exclude [0, GuC ggtt_pin_bias) address space from131 * Currently, in order to exclude [0, ggtt.pin_bias) address space from
135 * GGTT, all gfx objects used by GuC are allocated with intel_guc_allocate_vma()132 * GGTT, all gfx objects used by GuC are allocated with intel_guc_allocate_vma()
136 * and pinned with PIN_OFFSET_BIAS along with the value of GuC ggtt_pin_bias.133 * and pinned with PIN_OFFSET_BIAS along with the value of ggtt.pin_bias.
137 *134 *
138 * Return: GGTT offset of the @vma.135 * Return: GGTT offset of the @vma.
139 */136 */
@@ -142,7 +139,7 @@ static inline u32 intel_guc_ggtt_offset(struct intel_guc *guc, · 2 unmodified lines
142{139{
143 u32 offset = i915_ggtt_offset(vma);140 u32 offset = i915_ggtt_offset(vma);
144 141
145 GEM_BUG_ON(offset < guc->ggtt_pin_bias);142 GEM_BUG_ON(offset < i915_ggtt_pin_bias(vma));
146 GEM_BUG_ON(range_overflows_t(u64, offset, vma->size, GUC_GGTT_TOP));143 GEM_BUG_ON(range_overflows_t(u64, offset, vma->size, GUC_GGTT_TOP));
147 144
148 return offset;145 return offset;
@@ -168,6 +165,7 @@ int intel_guc_auth_huc(struct intel_guc *guc, u32 rsa_offset); · 19 unmodified lines
168int intel_guc_suspend(struct intel_guc *guc);165int intel_guc_suspend(struct intel_guc *guc);
169int intel_guc_resume(struct intel_guc *guc);166int intel_guc_resume(struct intel_guc *guc);
170struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size);167struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size);
168u32 intel_guc_reserved_gtt_size(struct intel_guc *guc);
171 169
172static inline int intel_guc_sanitize(struct intel_guc *guc)170static inline int intel_guc_sanitize(struct intel_guc *guc)
173{171{
drivers/gpu/drm/i915/intel_guc_ads.c+1−1
@@ -148,5 +148,5 @@ int intel_guc_ads_create(struct intel_guc *guc) · 147 unmodified lines
148 148
149void intel_guc_ads_destroy(struct intel_guc *guc)149void intel_guc_ads_destroy(struct intel_guc *guc)
150{150{
151 i915_vma_unpin_and_release(&guc->ads_vma);151 i915_vma_unpin_and_release(&guc->ads_vma, 0);
152}152}
drivers/gpu/drm/i915/intel_guc_ct.c+2−5
@@ -204,7 +204,7 @@ static int ctch_init(struct intel_guc *guc, · 203 unmodified lines
204 return 0;204 return 0;
205 205
206err_vma:206err_vma:
207 i915_vma_unpin_and_release(&ctch->vma);207 i915_vma_unpin_and_release(&ctch->vma, 0);
208err_out:208err_out:
209 CT_DEBUG_DRIVER("CT: channel %d initialization failed; err=%d\n",209 CT_DEBUG_DRIVER("CT: channel %d initialization failed; err=%d\n",
210 ctch->owner, err);210 ctch->owner, err);
@@ -214,10 +214,7 @@ err_out: · 3 unmodified lines
214static void ctch_fini(struct intel_guc *guc,214static void ctch_fini(struct intel_guc *guc,
215 struct intel_guc_ct_channel *ctch)215 struct intel_guc_ct_channel *ctch)
216{216{
217 GEM_BUG_ON(!ctch->vma);217 i915_vma_unpin_and_release(&ctch->vma, I915_VMA_RELEASE_MAP);
218
219 i915_gem_object_unpin_map(ctch->vma->obj);
220 i915_vma_unpin_and_release(&ctch->vma);
221}218}
222 219
223static int ctch_open(struct intel_guc *guc,220static int ctch_open(struct intel_guc *guc,
drivers/gpu/drm/i915/intel_guc_fwif.h+1−0
@@ -49,6 +49,7 @@ · 48 unmodified lines
49#define WQ_TYPE_BATCH_BUF (0x1 << WQ_TYPE_SHIFT)49#define WQ_TYPE_BATCH_BUF (0x1 << WQ_TYPE_SHIFT)
50#define WQ_TYPE_PSEUDO (0x2 << WQ_TYPE_SHIFT)50#define WQ_TYPE_PSEUDO (0x2 << WQ_TYPE_SHIFT)
51#define WQ_TYPE_INORDER (0x3 << WQ_TYPE_SHIFT)51#define WQ_TYPE_INORDER (0x3 << WQ_TYPE_SHIFT)
52#define WQ_TYPE_NOOP (0x4 << WQ_TYPE_SHIFT)
52#define WQ_TARGET_SHIFT 1053#define WQ_TARGET_SHIFT 10
53#define WQ_LEN_SHIFT 1654#define WQ_LEN_SHIFT 16
54#define WQ_NO_WCFLUSH_WAIT (1 << 27)55#define WQ_NO_WCFLUSH_WAIT (1 << 27)
drivers/gpu/drm/i915/intel_guc_log.c+1−1
@@ -498,7 +498,7 @@ err: · 497 unmodified lines
498 498
499void intel_guc_log_destroy(struct intel_guc_log *log)499void intel_guc_log_destroy(struct intel_guc_log *log)
500{500{
501 i915_vma_unpin_and_release(&log->vma);501 i915_vma_unpin_and_release(&log->vma, 0);
502}502}
503 503
504int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)504int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
drivers/gpu/drm/i915/intel_guc_submission.c+20−15
@@ -317,7 +317,7 @@ static int guc_stage_desc_pool_create(struct intel_guc *guc) · 316 unmodified lines
317 317
318 vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);318 vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
319 if (IS_ERR(vaddr)) {319 if (IS_ERR(vaddr)) {
320 i915_vma_unpin_and_release(&vma);320 i915_vma_unpin_and_release(&vma, 0);
321 return PTR_ERR(vaddr);321 return PTR_ERR(vaddr);
322 }322 }
323 323
@@ -331,8 +331,7 @@ static int guc_stage_desc_pool_create(struct intel_guc *guc) · 7 unmodified lines
331static void guc_stage_desc_pool_destroy(struct intel_guc *guc)331static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
332{332{
333 ida_destroy(&guc->stage_ids);333 ida_destroy(&guc->stage_ids);
334 i915_gem_object_unpin_map(guc->stage_desc_pool->obj);334 i915_vma_unpin_and_release(&guc->stage_desc_pool, I915_VMA_RELEASE_MAP);
335 i915_vma_unpin_and_release(&guc->stage_desc_pool);
336}335}
337 336
338/*337/*
@@ -457,6 +456,9 @@ static void guc_wq_item_append(struct intel_guc_client *client, · 118 unmodified lines
457 */456 */
458 BUILD_BUG_ON(wqi_size != 16);457 BUILD_BUG_ON(wqi_size != 16);
459 458
459 /* We expect the WQ to be active if we're appending items to it */
460 GEM_BUG_ON(desc->wq_status != WQ_STATUS_ACTIVE);
461
460 /* Free space is guaranteed. */462 /* Free space is guaranteed. */
461 wq_off = READ_ONCE(desc->tail);463 wq_off = READ_ONCE(desc->tail);
462 GEM_BUG_ON(CIRC_SPACE(wq_off, READ_ONCE(desc->head),464 GEM_BUG_ON(CIRC_SPACE(wq_off, READ_ONCE(desc->head),
@@ -466,15 +468,19 @@ static void guc_wq_item_append(struct intel_guc_client *client, · 3 unmodified lines
466 /* WQ starts from the page after doorbell / process_desc */468 /* WQ starts from the page after doorbell / process_desc */
467 wqi = client->vaddr + wq_off + GUC_DB_SIZE;469 wqi = client->vaddr + wq_off + GUC_DB_SIZE;
468 470
469 /* Now fill in the 4-word work queue item */471 if (I915_SELFTEST_ONLY(client->use_nop_wqi)) {
470 wqi->header = WQ_TYPE_INORDER |472 wqi->header = WQ_TYPE_NOOP | (wqi_len << WQ_LEN_SHIFT);
471 (wqi_len << WQ_LEN_SHIFT) |473 } else {
472 (target_engine << WQ_TARGET_SHIFT) |474 /* Now fill in the 4-word work queue item */
473 WQ_NO_WCFLUSH_WAIT;475 wqi->header = WQ_TYPE_INORDER |
474 wqi->context_desc = context_desc;476 (wqi_len << WQ_LEN_SHIFT) |
475 wqi->submit_element_info = ring_tail << WQ_RING_TAIL_SHIFT;477 (target_engine << WQ_TARGET_SHIFT) |
476 GEM_BUG_ON(ring_tail > WQ_RING_TAIL_MAX);478 WQ_NO_WCFLUSH_WAIT;
477 wqi->fence_id = fence_id;479 wqi->context_desc = context_desc;
480 wqi->submit_element_info = ring_tail << WQ_RING_TAIL_SHIFT;
481 GEM_BUG_ON(ring_tail > WQ_RING_TAIL_MAX);
482 wqi->fence_id = fence_id;
483 }
478 484
479 /* Make the update visible to GuC */485 /* Make the update visible to GuC */
480 WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1));486 WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1));
@@ -1008,7 +1014,7 @@ guc_client_alloc(struct drm_i915_private *dev_priv, · 527 unmodified lines
1008err_vaddr:1014err_vaddr:
1009 i915_gem_object_unpin_map(client->vma->obj);1015 i915_gem_object_unpin_map(client->vma->obj);
1010err_vma:1016err_vma:
1011 i915_vma_unpin_and_release(&client->vma);1017 i915_vma_unpin_and_release(&client->vma, 0);
1012err_id:1018err_id:
1013 ida_simple_remove(&guc->stage_ids, client->stage_id);1019 ida_simple_remove(&guc->stage_ids, client->stage_id);
1014err_client:1020err_client:
@@ -1020,8 +1026,7 @@ static void guc_client_free(struct intel_guc_client *client) · 5 unmodified lines
1020{1026{
1021 unreserve_doorbell(client);1027 unreserve_doorbell(client);
1022 guc_stage_desc_fini(client->guc, client);1028 guc_stage_desc_fini(client->guc, client);
1023 i915_gem_object_unpin_map(client->vma->obj);1029 i915_vma_unpin_and_release(&client->vma, I915_VMA_RELEASE_MAP);
1024 i915_vma_unpin_and_release(&client->vma);
1025 ida_simple_remove(&client->guc->stage_ids, client->stage_id);1030 ida_simple_remove(&client->guc->stage_ids, client->stage_id);
1026 kfree(client);1031 kfree(client);
1027}1032}
drivers/gpu/drm/i915/intel_guc_submission.h+4−0
@@ -28,6 +28,7 @@ · 27 unmodified lines
28#include <linux/spinlock.h>28#include <linux/spinlock.h>
29 29
30#include "i915_gem.h"30#include "i915_gem.h"
31#include "i915_selftest.h"
31 32
32struct drm_i915_private;33struct drm_i915_private;
33 34
@@ -71,6 +72,9 @@ struct intel_guc_client { · 37 unmodified lines
71 spinlock_t wq_lock;72 spinlock_t wq_lock;
72 /* Per-engine counts of GuC submissions */73 /* Per-engine counts of GuC submissions */
73 u64 submissions[I915_NUM_ENGINES];74 u64 submissions[I915_NUM_ENGINES];
75
76 /* For testing purposes, use nop WQ items instead of real ones */
77 I915_SELFTEST_DECLARE(bool use_nop_wqi);
74};78};
75 79
76int intel_guc_submission_init(struct intel_guc *guc);80int intel_guc_submission_init(struct intel_guc *guc);
drivers/gpu/drm/i915/intel_hangcheck.c+1−1
@@ -142,7 +142,7 @@ static int semaphore_passed(struct intel_engine_cs *engine) · 141 unmodified lines
142 if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES)142 if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES)
143 return -1;143 return -1;
144 144
145 if (i915_seqno_passed(intel_engine_get_seqno(signaller), seqno))145 if (intel_engine_signaled(signaller, seqno))
146 return 1;146 return 1;
147 147
148 /* cursory check for an unkickable deadlock */148 /* cursory check for an unkickable deadlock */
drivers/gpu/drm/i915/intel_hdcp.c+3−3
@@ -57,9 +57,9 @@ static bool hdcp_key_loadable(struct drm_i915_private *dev_priv) · 56 unmodified lines
57 57
58 /* PG1 (power well #1) needs to be enabled */58 /* PG1 (power well #1) needs to be enabled */
59 for_each_power_well(dev_priv, power_well) {59 for_each_power_well(dev_priv, power_well) {
60 if (power_well->id == id) {60 if (power_well->desc->id == id) {
61 enabled = power_well->ops->is_enabled(dev_priv,61 enabled = power_well->desc->ops->is_enabled(dev_priv,
62 power_well);62 power_well);
63 break;63 break;
64 }64 }
65 }65 }
drivers/gpu/drm/i915/intel_hdmi.c+7−3
@@ -1911,22 +1911,26 @@ intel_hdmi_set_edid(struct drm_connector *connector) · 1910 unmodified lines
1911static enum drm_connector_status1911static enum drm_connector_status
1912intel_hdmi_detect(struct drm_connector *connector, bool force)1912intel_hdmi_detect(struct drm_connector *connector, bool force)
1913{1913{
1914 enum drm_connector_status status;1914 enum drm_connector_status status = connector_status_disconnected;
1915 struct drm_i915_private *dev_priv = to_i915(connector->dev);1915 struct drm_i915_private *dev_priv = to_i915(connector->dev);
1916 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);1916 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1917 struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base;
1917 1918
1918 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",1919 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
1919 connector->base.id, connector->name);1920 connector->base.id, connector->name);
1920 1921
1921 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);1922 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1922 1923
1924 if (IS_ICELAKE(dev_priv) &&
1925 !intel_digital_port_connected(encoder))
1926 goto out;
1927
1923 intel_hdmi_unset_edid(connector);1928 intel_hdmi_unset_edid(connector);
1924 1929
1925 if (intel_hdmi_set_edid(connector))1930 if (intel_hdmi_set_edid(connector))
1926 status = connector_status_connected;1931 status = connector_status_connected;
1927 else
1928 status = connector_status_disconnected;
1929 1932
1933out:
1930 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);1934 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1931 1935
1932 if (status != connector_status_connected)1936 if (status != connector_status_connected)
drivers/gpu/drm/i915/intel_huc.c+1−1
@@ -63,7 +63,7 @@ int intel_huc_auth(struct intel_huc *huc) · 62 unmodified lines
63 return -ENOEXEC;63 return -ENOEXEC;
64 64
65 vma = i915_gem_object_ggtt_pin(huc->fw.obj, NULL, 0, 0,65 vma = i915_gem_object_ggtt_pin(huc->fw.obj, NULL, 0, 0,
66 PIN_OFFSET_BIAS | guc->ggtt_pin_bias);66 PIN_OFFSET_BIAS | i915->ggtt.pin_bias);
67 if (IS_ERR(vma)) {67 if (IS_ERR(vma)) {
68 ret = PTR_ERR(vma);68 ret = PTR_ERR(vma);
69 DRM_ERROR("HuC: Failed to pin huc fw object %d\n", ret);69 DRM_ERROR("HuC: Failed to pin huc fw object %d\n", ret);
drivers/gpu/drm/i915/intel_i2c.c+8−8
@@ -37,7 +37,7 @@ · 36 unmodified lines
37 37
38struct gmbus_pin {38struct gmbus_pin {
39 const char *name;39 const char *name;
40 i915_reg_t reg;40 enum i915_gpio gpio;
41};41};
42 42
43/* Map gmbus pin pairs to names and registers. */43/* Map gmbus pin pairs to names and registers. */
@@ -121,8 +121,7 @@ bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv, · 77 unmodified lines
121 else121 else
122 size = ARRAY_SIZE(gmbus_pins);122 size = ARRAY_SIZE(gmbus_pins);
123 123
124 return pin < size &&124 return pin < size && get_gmbus_pin(dev_priv, pin)->name;
125 i915_mmio_reg_valid(get_gmbus_pin(dev_priv, pin)->reg);
126}125}
127 126
128/* Intel GPIO access functions */127/* Intel GPIO access functions */
@@ -292,8 +291,7 @@ intel_gpio_setup(struct intel_gmbus *bus, unsigned int pin) · 163 unmodified lines
292 291
293 algo = &bus->bit_algo;292 algo = &bus->bit_algo;
294 293
295 bus->gpio_reg = _MMIO(dev_priv->gpio_mmio_base +294 bus->gpio_reg = GPIO(get_gmbus_pin(dev_priv, pin)->gpio);
296 i915_mmio_reg_offset(get_gmbus_pin(dev_priv, pin)->reg));
297 bus->adapter.algo_data = algo;295 bus->adapter.algo_data = algo;
298 algo->setsda = set_data;296 algo->setsda = set_data;
299 algo->setscl = set_clock;297 algo->setscl = set_clock;
@@ -825,9 +823,11 @@ int intel_setup_gmbus(struct drm_i915_private *dev_priv) · 525 unmodified lines
825 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))823 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
826 dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE;824 dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE;
827 else if (!HAS_GMCH_DISPLAY(dev_priv))825 else if (!HAS_GMCH_DISPLAY(dev_priv))
828 dev_priv->gpio_mmio_base =826 /*
829 i915_mmio_reg_offset(PCH_GPIOA) -827 * Broxton uses the same PCH offsets for South Display Engine,
830 i915_mmio_reg_offset(GPIOA);828 * even though it doesn't have a PCH.
829 */
830 dev_priv->gpio_mmio_base = PCH_DISPLAY_BASE;
831 831
832 mutex_init(&dev_priv->gmbus_mutex);832 mutex_init(&dev_priv->gmbus_mutex);
833 init_waitqueue_head(&dev_priv->gmbus_wait_queue);833 init_waitqueue_head(&dev_priv->gmbus_wait_queue);
drivers/gpu/drm/i915/intel_lrc.c+110−49
@@ -541,11 +541,6 @@ static void inject_preempt_context(struct intel_engine_cs *engine) · 540 unmodified lines
541 541
542 GEM_BUG_ON(execlists->preempt_complete_status !=542 GEM_BUG_ON(execlists->preempt_complete_status !=
543 upper_32_bits(ce->lrc_desc));543 upper_32_bits(ce->lrc_desc));
544 GEM_BUG_ON((ce->lrc_reg_state[CTX_CONTEXT_CONTROL + 1] &
545 _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
546 CTX_CTRL_ENGINE_CTX_SAVE_INHIBIT)) !=
547 _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
548 CTX_CTRL_ENGINE_CTX_SAVE_INHIBIT));
549 544
550 /*545 /*
551 * Switch to our empty preempt context so546 * Switch to our empty preempt context so
@@ -1277,6 +1272,8 @@ static void execlists_context_destroy(struct intel_context *ce) · 725 unmodified lines
1277 1272
1278static void execlists_context_unpin(struct intel_context *ce)1273static void execlists_context_unpin(struct intel_context *ce)
1279{1274{
1275 i915_gem_context_unpin_hw_id(ce->gem_context);
1276
1280 intel_ring_unpin(ce->ring);1277 intel_ring_unpin(ce->ring);
1281 1278
1282 ce->state->obj->pin_global--;1279 ce->state->obj->pin_global--;
@@ -1303,10 +1300,9 @@ static int __context_pin(struct i915_gem_context *ctx, struct i915_vma *vma) · 20 unmodified lines
1303 }1300 }
1304 1301
1305 flags = PIN_GLOBAL | PIN_HIGH;1302 flags = PIN_GLOBAL | PIN_HIGH;
1306 if (ctx->ggtt_offset_bias)1303 flags |= PIN_OFFSET_BIAS | i915_ggtt_pin_bias(vma);
1307 flags |= PIN_OFFSET_BIAS | ctx->ggtt_offset_bias;
1308 1304
1309 return i915_vma_pin(vma, 0, GEN8_LR_CONTEXT_ALIGN, flags);1305 return i915_vma_pin(vma, 0, 0, flags);
1310}1306}
1311 1307
1312static struct intel_context *1308static struct intel_context *
@@ -1332,10 +1328,14 @@ __execlists_context_pin(struct intel_engine_cs *engine, · 19 unmodified lines
1332 goto unpin_vma;1328 goto unpin_vma;
1333 }1329 }
1334 1330
1335 ret = intel_ring_pin(ce->ring, ctx->i915, ctx->ggtt_offset_bias);1331 ret = intel_ring_pin(ce->ring);
1336 if (ret)1332 if (ret)
1337 goto unpin_map;1333 goto unpin_map;
1338 1334
1335 ret = i915_gem_context_pin_hw_id(ctx);
1336 if (ret)
1337 goto unpin_ring;
1338
1339 intel_lr_context_descriptor_update(ctx, engine, ce);1339 intel_lr_context_descriptor_update(ctx, engine, ce);
1340 1340
1341 ce->lrc_reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;1341 ce->lrc_reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;
@@ -1348,6 +1348,8 @@ __execlists_context_pin(struct intel_engine_cs *engine, · 6 unmodified lines
1348 i915_gem_context_get(ctx);1348 i915_gem_context_get(ctx);
1349 return ce;1349 return ce;
1350 1350
1351unpin_ring:
1352 intel_ring_unpin(ce->ring);
1351unpin_map:1353unpin_map:
1352 i915_gem_object_unpin_map(ce->state->obj);1354 i915_gem_object_unpin_map(ce->state->obj);
1353unpin_vma:1355unpin_vma:
@@ -1643,7 +1645,7 @@ static int lrc_setup_wa_ctx(struct intel_engine_cs *engine) · 289 unmodified lines
1643 goto err;1645 goto err;
1644 }1646 }
1645 1647
1646 err = i915_vma_pin(vma, 0, PAGE_SIZE, PIN_GLOBAL | PIN_HIGH);1648 err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
1647 if (err)1649 if (err)
1648 goto err;1650 goto err;
1649 1651
@@ -1657,7 +1659,7 @@ err: · 7 unmodified lines
1657 1659
1658static void lrc_destroy_wa_ctx(struct intel_engine_cs *engine)1660static void lrc_destroy_wa_ctx(struct intel_engine_cs *engine)
1659{1661{
1660 i915_vma_unpin_and_release(&engine->wa_ctx.vma);1662 i915_vma_unpin_and_release(&engine->wa_ctx.vma, 0);
1661}1663}
1662 1664
1663typedef u32 *(*wa_bb_func_t)(struct intel_engine_cs *engine, u32 *batch);1665typedef u32 *(*wa_bb_func_t)(struct intel_engine_cs *engine, u32 *batch);
@@ -1775,11 +1777,7 @@ static bool unexpected_starting_state(struct intel_engine_cs *engine) · 111 unmodified lines
1775 1777
1776static int gen8_init_common_ring(struct intel_engine_cs *engine)1778static int gen8_init_common_ring(struct intel_engine_cs *engine)
1777{1779{
1778 int ret;1780 intel_mocs_init_engine(engine);
1779
1780 ret = intel_mocs_init_engine(engine);
1781 if (ret)
1782 return ret;
1783 1781
1784 intel_engine_reset_breadcrumbs(engine);1782 intel_engine_reset_breadcrumbs(engine);
1785 1783
@@ -1838,7 +1836,8 @@ execlists_reset_prepare(struct intel_engine_cs *engine) · 52 unmodified lines
1838 struct i915_request *request, *active;1836 struct i915_request *request, *active;
1839 unsigned long flags;1837 unsigned long flags;
1840 1838
1841 GEM_TRACE("%s\n", engine->name);1839 GEM_TRACE("%s: depth<-%d\n", engine->name,
1840 atomic_read(&execlists->tasklet.count));
1842 1841
1843 /*1842 /*
1844 * Prevent request submission to the hardware until we have1843 * Prevent request submission to the hardware until we have
@@ -1971,22 +1970,18 @@ static void execlists_reset_finish(struct intel_engine_cs *engine) · 126 unmodified lines
1971{1970{
1972 struct intel_engine_execlists * const execlists = &engine->execlists;1971 struct intel_engine_execlists * const execlists = &engine->execlists;
1973 1972
1974 /* After a GPU reset, we may have requests to replay */
1975 if (!RB_EMPTY_ROOT(&execlists->queue.rb_root))
1976 tasklet_schedule(&execlists->tasklet);
1977
1978 /*1973 /*
1979 * Flush the tasklet while we still have the forcewake to be sure1974 * After a GPU reset, we may have requests to replay. Do so now while
1980 * that it is not allowed to sleep before we restart and reload a1975 * we still have the forcewake to be sure that the GPU is not allowed
1981 * context.1976 * to sleep before we restart and reload a context.
1982 *1977 *
1983 * As before (with execlists_reset_prepare) we rely on the caller
1984 * serialising multiple attempts to reset so that we know that we
1985 * are the only one manipulating tasklet state.
1986 */1978 */
1987 __tasklet_enable_sync_once(&execlists->tasklet);1979 if (!RB_EMPTY_ROOT(&execlists->queue.rb_root))
1980 execlists->tasklet.func(execlists->tasklet.data);
1988 1981
1989 GEM_TRACE("%s\n", engine->name);1982 tasklet_enable(&execlists->tasklet);
1983 GEM_TRACE("%s: depth->%d\n", engine->name,
1984 atomic_read(&execlists->tasklet.count));
1990}1985}
1991 1986
1992static int intel_logical_ring_emit_pdps(struct i915_request *rq)1987static int intel_logical_ring_emit_pdps(struct i915_request *rq)
@@ -2066,8 +2061,7 @@ static int gen8_emit_bb_start(struct i915_request *rq, · 73 unmodified lines
2066 2061
2067 /* FIXME(BDW): Address space and security selectors. */2062 /* FIXME(BDW): Address space and security selectors. */
2068 *cs++ = MI_BATCH_BUFFER_START_GEN8 |2063 *cs++ = MI_BATCH_BUFFER_START_GEN8 |
2069 (flags & I915_DISPATCH_SECURE ? 0 : BIT(8)) |2064 (flags & I915_DISPATCH_SECURE ? 0 : BIT(8));
2070 (flags & I915_DISPATCH_RS ? MI_BATCH_RESOURCE_STREAMER : 0);
2071 *cs++ = lower_32_bits(offset);2065 *cs++ = lower_32_bits(offset);
2072 *cs++ = upper_32_bits(offset);2066 *cs++ = upper_32_bits(offset);
2073 2067
@@ -2494,6 +2488,9 @@ int logical_xcs_ring_init(struct intel_engine_cs *engine) · 420 unmodified lines
2494static u322488static u32
2495make_rpcs(struct drm_i915_private *dev_priv)2489make_rpcs(struct drm_i915_private *dev_priv)
2496{2490{
2491 bool subslice_pg = INTEL_INFO(dev_priv)->sseu.has_subslice_pg;
2492 u8 slices = hweight8(INTEL_INFO(dev_priv)->sseu.slice_mask);
2493 u8 subslices = hweight8(INTEL_INFO(dev_priv)->sseu.subslice_mask[0]);
2497 u32 rpcs = 0;2494 u32 rpcs = 0;
2498 2495
2499 /*2496 /*
@@ -2503,6 +2500,38 @@ make_rpcs(struct drm_i915_private *dev_priv) · 3 unmodified lines
2503 if (INTEL_GEN(dev_priv) < 9)2500 if (INTEL_GEN(dev_priv) < 9)
2504 return 0;2501 return 0;
2505 2502
2503 /*
2504 * Since the SScount bitfield in GEN8_R_PWR_CLK_STATE is only three bits
2505 * wide and Icelake has up to eight subslices, specfial programming is
2506 * needed in order to correctly enable all subslices.
2507 *
2508 * According to documentation software must consider the configuration
2509 * as 2x4x8 and hardware will translate this to 1x8x8.
2510 *
2511 * Furthemore, even though SScount is three bits, maximum documented
2512 * value for it is four. From this some rules/restrictions follow:
2513 *
2514 * 1.
2515 * If enabled subslice count is greater than four, two whole slices must
2516 * be enabled instead.
2517 *
2518 * 2.
2519 * When more than one slice is enabled, hardware ignores the subslice
2520 * count altogether.
2521 *
2522 * From these restrictions it follows that it is not possible to enable
2523 * a count of subslices between the SScount maximum of four restriction,
2524 * and the maximum available number on a particular SKU. Either all
2525 * subslices are enabled, or a count between one and four on the first
2526 * slice.
2527 */
2528 if (IS_GEN11(dev_priv) && slices == 1 && subslices >= 4) {
2529 GEM_BUG_ON(subslices & 1);
2530
2531 subslice_pg = false;
2532 slices *= 2;
2533 }
2534
2506 /*2535 /*
2507 * Starting in Gen9, render power gating can leave2536 * Starting in Gen9, render power gating can leave
2508 * slice/subslice/EU in a partially enabled state. We2537 * slice/subslice/EU in a partially enabled state. We
@@ -2510,24 +2539,50 @@ make_rpcs(struct drm_i915_private *dev_priv) · 1 unmodified line
2510 * enablement.2539 * enablement.
2511 */2540 */
2512 if (INTEL_INFO(dev_priv)->sseu.has_slice_pg) {2541 if (INTEL_INFO(dev_priv)->sseu.has_slice_pg) {
2513 rpcs |= GEN8_RPCS_S_CNT_ENABLE;2542 u32 mask, val = slices;
2514 rpcs |= hweight8(INTEL_INFO(dev_priv)->sseu.slice_mask) <<2543
2515 GEN8_RPCS_S_CNT_SHIFT;2544 if (INTEL_GEN(dev_priv) >= 11) {
2516 rpcs |= GEN8_RPCS_ENABLE;2545 mask = GEN11_RPCS_S_CNT_MASK;
2546 val <<= GEN11_RPCS_S_CNT_SHIFT;
2547 } else {
2548 mask = GEN8_RPCS_S_CNT_MASK;
2549 val <<= GEN8_RPCS_S_CNT_SHIFT;
2550 }
2551
2552 GEM_BUG_ON(val & ~mask);
2553 val &= mask;
2554
2555 rpcs |= GEN8_RPCS_ENABLE | GEN8_RPCS_S_CNT_ENABLE | val;
2517 }2556 }
2518 2557
2519 if (INTEL_INFO(dev_priv)->sseu.has_subslice_pg) {2558 if (subslice_pg) {
2520 rpcs |= GEN8_RPCS_SS_CNT_ENABLE;2559 u32 val = subslices;
2521 rpcs |= hweight8(INTEL_INFO(dev_priv)->sseu.subslice_mask[0]) <<2560
2522 GEN8_RPCS_SS_CNT_SHIFT;2561 val <<= GEN8_RPCS_SS_CNT_SHIFT;
2523 rpcs |= GEN8_RPCS_ENABLE;2562
2563 GEM_BUG_ON(val & ~GEN8_RPCS_SS_CNT_MASK);
2564 val &= GEN8_RPCS_SS_CNT_MASK;
2565
2566 rpcs |= GEN8_RPCS_ENABLE | GEN8_RPCS_SS_CNT_ENABLE | val;
2524 }2567 }
2525 2568
2526 if (INTEL_INFO(dev_priv)->sseu.has_eu_pg) {2569 if (INTEL_INFO(dev_priv)->sseu.has_eu_pg) {
2527 rpcs |= INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<2570 u32 val;
2528 GEN8_RPCS_EU_MIN_SHIFT;2571
2529 rpcs |= INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<2572 val = INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<
2530 GEN8_RPCS_EU_MAX_SHIFT;2573 GEN8_RPCS_EU_MIN_SHIFT;
2574 GEM_BUG_ON(val & ~GEN8_RPCS_EU_MIN_MASK);
2575 val &= GEN8_RPCS_EU_MIN_MASK;
2576
2577 rpcs |= val;
2578
2579 val = INTEL_INFO(dev_priv)->sseu.eu_per_subslice <<
2580 GEN8_RPCS_EU_MAX_SHIFT;
2581 GEM_BUG_ON(val & ~GEN8_RPCS_EU_MAX_MASK);
2582 val &= GEN8_RPCS_EU_MAX_MASK;
2583
2584 rpcs |= val;
2585
2531 rpcs |= GEN8_RPCS_ENABLE;2586 rpcs |= GEN8_RPCS_ENABLE;
2532 }2587 }
2533 2588
@@ -2584,11 +2639,13 @@ static void execlists_init_reg_state(u32 *regs, · 50 unmodified lines
2584 MI_LRI_FORCE_POSTED;2639 MI_LRI_FORCE_POSTED;
2585 2640
2586 CTX_REG(regs, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(engine),2641 CTX_REG(regs, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(engine),
2587 _MASKED_BIT_DISABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |2642 _MASKED_BIT_DISABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT) |
2588 CTX_CTRL_ENGINE_CTX_SAVE_INHIBIT) |2643 _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH));
2589 _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH |2644 if (INTEL_GEN(dev_priv) < 11) {
2590 (HAS_RESOURCE_STREAMER(dev_priv) ?2645 regs[CTX_CONTEXT_CONTROL + 1] |=
2591 CTX_CTRL_RS_CTX_ENABLE : 0)));2646 _MASKED_BIT_DISABLE(CTX_CTRL_ENGINE_CTX_SAVE_INHIBIT |
2647 CTX_CTRL_RS_CTX_ENABLE);
2648 }
2592 CTX_REG(regs, CTX_RING_HEAD, RING_HEAD(base), 0);2649 CTX_REG(regs, CTX_RING_HEAD, RING_HEAD(base), 0);
2593 CTX_REG(regs, CTX_RING_TAIL, RING_TAIL(base), 0);2650 CTX_REG(regs, CTX_RING_TAIL, RING_TAIL(base), 0);
2594 CTX_REG(regs, CTX_RING_BUFFER_START, RING_START(base), 0);2651 CTX_REG(regs, CTX_RING_BUFFER_START, RING_START(base), 0);
@@ -2654,6 +2711,10 @@ static void execlists_init_reg_state(u32 *regs, · 59 unmodified lines
2654 2711
2655 i915_oa_init_reg_state(engine, ctx, regs);2712 i915_oa_init_reg_state(engine, ctx, regs);
2656 }2713 }
2714
2715 regs[CTX_END] = MI_BATCH_BUFFER_END;
2716 if (INTEL_GEN(dev_priv) >= 10)
2717 regs[CTX_END] |= BIT(0);
2657}2718}
2658 2719
2659static int2720static int
drivers/gpu/drm/i915/intel_lrc.h+0−2
@@ -27,8 +27,6 @@ · 26 unmodified lines
27#include "intel_ringbuffer.h"27#include "intel_ringbuffer.h"
28#include "i915_gem_context.h"28#include "i915_gem_context.h"
29 29
30#define GEN8_LR_CONTEXT_ALIGN I915_GTT_MIN_ALIGNMENT
31
32/* Execlists regs */30/* Execlists regs */
33#define RING_ELSP(engine) _MMIO((engine)->mmio_base + 0x230)31#define RING_ELSP(engine) _MMIO((engine)->mmio_base + 0x230)
34#define RING_EXECLIST_STATUS_LO(engine) _MMIO((engine)->mmio_base + 0x234)32#define RING_EXECLIST_STATUS_LO(engine) _MMIO((engine)->mmio_base + 0x234)
drivers/gpu/drm/i915/intel_lrc_reg.h+1−1
@@ -37,7 +37,7 @@ · 36 unmodified lines
37#define CTX_PDP0_LDW 0x3237#define CTX_PDP0_LDW 0x32
38#define CTX_LRI_HEADER_2 0x4138#define CTX_LRI_HEADER_2 0x41
39#define CTX_R_PWR_CLK_STATE 0x4239#define CTX_R_PWR_CLK_STATE 0x42
40#define CTX_GPGPU_CSR_BASE_ADDRESS 0x4440#define CTX_END 0x44
41 41
42#define CTX_REG(reg_state, pos, reg, val) do { \42#define CTX_REG(reg_state, pos, reg, val) do { \
43 u32 *reg_state__ = (reg_state); \43 u32 *reg_state__ = (reg_state); \
drivers/gpu/drm/i915/intel_mocs.c+3−8
@@ -232,20 +232,17 @@ static i915_reg_t mocs_register(enum intel_engine_id engine_id, int index) · 231 unmodified lines
232 *232 *
233 * This function simply emits a MI_LOAD_REGISTER_IMM command for the233 * This function simply emits a MI_LOAD_REGISTER_IMM command for the
234 * given table starting at the given address.234 * given table starting at the given address.
235 *
236 * Return: 0 on success, otherwise the error status.
237 */235 */
238int intel_mocs_init_engine(struct intel_engine_cs *engine)236void intel_mocs_init_engine(struct intel_engine_cs *engine)
239{237{
240 struct drm_i915_private *dev_priv = engine->i915;238 struct drm_i915_private *dev_priv = engine->i915;
241 struct drm_i915_mocs_table table;239 struct drm_i915_mocs_table table;
242 unsigned int index;240 unsigned int index;
243 241
244 if (!get_mocs_settings(dev_priv, &table))242 if (!get_mocs_settings(dev_priv, &table))
245 return 0;243 return;
246 244
247 if (WARN_ON(table.size > GEN9_NUM_MOCS_ENTRIES))245 GEM_BUG_ON(table.size > GEN9_NUM_MOCS_ENTRIES);
248 return -ENODEV;
249 246
250 for (index = 0; index < table.size; index++)247 for (index = 0; index < table.size; index++)
251 I915_WRITE(mocs_register(engine->id, index),248 I915_WRITE(mocs_register(engine->id, index),
@@ -262,8 +259,6 @@ int intel_mocs_init_engine(struct intel_engine_cs *engine) · 10 unmodified lines
262 for (; index < GEN9_NUM_MOCS_ENTRIES; index++)259 for (; index < GEN9_NUM_MOCS_ENTRIES; index++)
263 I915_WRITE(mocs_register(engine->id, index),260 I915_WRITE(mocs_register(engine->id, index),
264 table.table[0].control_value);261 table.table[0].control_value);
265
266 return 0;
267}262}
268 263
269/**264/**
drivers/gpu/drm/i915/intel_mocs.h+1−1
@@ -54,6 +54,6 @@ · 53 unmodified lines
54 54
55int intel_rcs_context_init_mocs(struct i915_request *rq);55int intel_rcs_context_init_mocs(struct i915_request *rq);
56void intel_mocs_init_l3cc_table(struct drm_i915_private *dev_priv);56void intel_mocs_init_l3cc_table(struct drm_i915_private *dev_priv);
57int intel_mocs_init_engine(struct intel_engine_cs *engine);57void intel_mocs_init_engine(struct intel_engine_cs *engine);
58 58
59#endif59#endif
drivers/gpu/drm/i915/intel_pm.c+62−39
@@ -26,6 +26,7 @@ · 25 unmodified lines
26 */26 */
27 27
28#include <linux/cpufreq.h>28#include <linux/cpufreq.h>
29#include <linux/pm_runtime.h>
29#include <drm/drm_plane_helper.h>30#include <drm/drm_plane_helper.h>
30#include "i915_drv.h"31#include "i915_drv.h"
31#include "intel_drv.h"32#include "intel_drv.h"
@@ -2942,8 +2943,8 @@ static void intel_print_wm_latency(struct drm_i915_private *dev_priv, · 2910 unmodified lines
2942 unsigned int latency = wm[level];2943 unsigned int latency = wm[level];
2943 2944
2944 if (latency == 0) {2945 if (latency == 0) {
2945 DRM_ERROR("%s WM%d latency not provided\n",2946 DRM_DEBUG_KMS("%s WM%d latency not provided\n",
2946 name, level);2947 name, level);
2947 continue;2948 continue;
2948 }2949 }
2949 2950
@@ -3771,11 +3772,11 @@ bool intel_can_enable_sagv(struct drm_atomic_state *state) · 821 unmodified lines
3771 return true;3772 return true;
3772}3773}
3773 3774
3774static unsigned int intel_get_ddb_size(struct drm_i915_private *dev_priv,3775static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv,
3775 const struct intel_crtc_state *cstate,3776 const struct intel_crtc_state *cstate,
3776 const unsigned int total_data_rate,3777 const unsigned int total_data_rate,
3777 const int num_active,3778 const int num_active,
3778 struct skl_ddb_allocation *ddb)3779 struct skl_ddb_allocation *ddb)
3779{3780{
3780 const struct drm_display_mode *adjusted_mode;3781 const struct drm_display_mode *adjusted_mode;
3781 u64 total_data_bw;3782 u64 total_data_bw;
@@ -3814,8 +3815,12 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, · 32 unmodified lines
3814 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);3815 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
3815 struct drm_i915_private *dev_priv = to_i915(dev);3816 struct drm_i915_private *dev_priv = to_i915(dev);
3816 struct drm_crtc *for_crtc = cstate->base.crtc;3817 struct drm_crtc *for_crtc = cstate->base.crtc;
3817 unsigned int pipe_size, ddb_size;3818 const struct drm_crtc_state *crtc_state;
3818 int nth_active_pipe;3819 const struct drm_crtc *crtc;
3820 u32 pipe_width = 0, total_width = 0, width_before_pipe = 0;
3821 enum pipe for_pipe = to_intel_crtc(for_crtc)->pipe;
3822 u16 ddb_size;
3823 u32 i;
3819 3824
3820 if (WARN_ON(!state) || !cstate->base.active) {3825 if (WARN_ON(!state) || !cstate->base.active) {
3821 alloc->start = 0;3826 alloc->start = 0;
@@ -3833,14 +3838,14 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, · 11 unmodified lines
3833 *num_active, ddb);3838 *num_active, ddb);
3834 3839
3835 /*3840 /*
3836 * If the state doesn't change the active CRTC's, then there's3841 * If the state doesn't change the active CRTC's or there is no
3837 * no need to recalculate; the existing pipe allocation limits3842 * modeset request, then there's no need to recalculate;
3838 * should remain unchanged. Note that we're safe from racing3843 * the existing pipe allocation limits should remain unchanged.
3839 * commits since any racing commit that changes the active CRTC3844 * Note that we're safe from racing commits since any racing commit
3840 * list would need to grab _all_ crtc locks, including the one3845 * that changes the active CRTC list or do modeset would need to
3841 * we currently hold.3846 * grab _all_ crtc locks, including the one we currently hold.
3842 */3847 */
3843 if (!intel_state->active_pipe_changes) {3848 if (!intel_state->active_pipe_changes && !intel_state->modeset) {
3844 /*3849 /*
3845 * alloc may be cleared by clear_intel_crtc_state,3850 * alloc may be cleared by clear_intel_crtc_state,
3846 * copy from old state to be sure3851 * copy from old state to be sure
@@ -3849,11 +3854,32 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, · 2 unmodified lines
3849 return;3854 return;
3850 }3855 }
3851 3856
3852 nth_active_pipe = hweight32(intel_state->active_crtcs &3857 /*
3853 (drm_crtc_mask(for_crtc) - 1));3858 * Watermark/ddb requirement highly depends upon width of the
3854 pipe_size = ddb_size / hweight32(intel_state->active_crtcs);3859 * framebuffer, So instead of allocating DDB equally among pipes
3855 alloc->start = nth_active_pipe * ddb_size / *num_active;3860 * distribute DDB based on resolution/width of the display.
3856 alloc->end = alloc->start + pipe_size;3861 */
3862 for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
3863 const struct drm_display_mode *adjusted_mode;
3864 int hdisplay, vdisplay;
3865 enum pipe pipe;
3866
3867 if (!crtc_state->enable)
3868 continue;
3869
3870 pipe = to_intel_crtc(crtc)->pipe;
3871 adjusted_mode = &crtc_state->adjusted_mode;
3872 drm_mode_get_hv_timing(adjusted_mode, &hdisplay, &vdisplay);
3873 total_width += hdisplay;
3874
3875 if (pipe < for_pipe)
3876 width_before_pipe += hdisplay;
3877 else if (pipe == for_pipe)
3878 pipe_width = hdisplay;
3879 }
3880
3881 alloc->start = ddb_size * width_before_pipe / total_width;
3882 alloc->end = ddb_size * (width_before_pipe + pipe_width) / total_width;
3857}3883}
3858 3884
3859static unsigned int skl_cursor_allocation(int num_active)3885static unsigned int skl_cursor_allocation(int num_active)
@@ -3909,7 +3935,12 @@ skl_ddb_get_hw_plane_state(struct drm_i915_private *dev_priv, · 49 unmodified lines
3909 val & PLANE_CTL_ALPHA_MASK);3935 val & PLANE_CTL_ALPHA_MASK);
3910 3936
3911 val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));3937 val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));
3912 val2 = I915_READ(PLANE_NV12_BUF_CFG(pipe, plane_id));3938 /*
3939 * FIXME: add proper NV12 support for ICL. Avoid reading unclaimed
3940 * registers for now.
3941 */
3942 if (INTEL_GEN(dev_priv) < 11)
3943 val2 = I915_READ(PLANE_NV12_BUF_CFG(pipe, plane_id));
3913 3944
3914 if (fourcc == DRM_FORMAT_NV12) {3945 if (fourcc == DRM_FORMAT_NV12) {
3915 skl_ddb_entry_init_from_hw(dev_priv,3946 skl_ddb_entry_init_from_hw(dev_priv,
@@ -4977,6 +5008,7 @@ static void skl_write_plane_wm(struct intel_crtc *intel_crtc, · 1061 unmodified lines
4977 5008
4978 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id),5009 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id),
4979 &ddb->plane[pipe][plane_id]);5010 &ddb->plane[pipe][plane_id]);
5011 /* FIXME: add proper NV12 support for ICL. */
4980 if (INTEL_GEN(dev_priv) >= 11)5012 if (INTEL_GEN(dev_priv) >= 11)
4981 return skl_ddb_entry_write(dev_priv,5013 return skl_ddb_entry_write(dev_priv,
4982 PLANE_BUF_CFG(pipe, plane_id),5014 PLANE_BUF_CFG(pipe, plane_id),
@@ -5141,17 +5173,6 @@ skl_compute_ddb(struct drm_atomic_state *state) · 158 unmodified lines
5141 return 0;5173 return 0;
5142}5174}
5143 5175
5144static void
5145skl_copy_ddb_for_pipe(struct skl_ddb_values *dst,
5146 struct skl_ddb_values *src,
5147 enum pipe pipe)
5148{
5149 memcpy(dst->ddb.uv_plane[pipe], src->ddb.uv_plane[pipe],
5150 sizeof(dst->ddb.uv_plane[pipe]));
5151 memcpy(dst->ddb.plane[pipe], src->ddb.plane[pipe],
5152 sizeof(dst->ddb.plane[pipe]));
5153}
5154
5155static void5176static void
5156skl_print_wm_changes(const struct drm_atomic_state *state)5177skl_print_wm_changes(const struct drm_atomic_state *state)
5157{5178{
@@ -5259,7 +5280,7 @@ skl_ddb_add_affected_pipes(struct drm_atomic_state *state, bool *changed) · 101 unmodified lines
5259 * any other display updates race with this transaction, so we need5280 * any other display updates race with this transaction, so we need
5260 * to grab the lock on *all* CRTC's.5281 * to grab the lock on *all* CRTC's.
5261 */5282 */
5262 if (intel_state->active_pipe_changes) {5283 if (intel_state->active_pipe_changes || intel_state->modeset) {
5263 realloc_pipes = ~0;5284 realloc_pipes = ~0;
5264 intel_state->wm_results.dirty_pipes = ~0;5285 intel_state->wm_results.dirty_pipes = ~0;
5265 }5286 }
@@ -5381,7 +5402,10 @@ static void skl_initial_wm(struct intel_atomic_state *state, · 115 unmodified lines
5381 if (cstate->base.active_changed)5402 if (cstate->base.active_changed)
5382 skl_atomic_update_crtc_wm(state, cstate);5403 skl_atomic_update_crtc_wm(state, cstate);
5383 5404
5384 skl_copy_ddb_for_pipe(hw_vals, results, pipe);5405 memcpy(hw_vals->ddb.uv_plane[pipe], results->ddb.uv_plane[pipe],
5406 sizeof(hw_vals->ddb.uv_plane[pipe]));
5407 memcpy(hw_vals->ddb.plane[pipe], results->ddb.plane[pipe],
5408 sizeof(hw_vals->ddb.plane[pipe]));
5385 5409
5386 mutex_unlock(&dev_priv->wm.wm_mutex);5410 mutex_unlock(&dev_priv->wm.wm_mutex);
5387}5411}
@@ -6379,7 +6403,6 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) · 991 unmodified lines
6379 new_power = HIGH_POWER;6403 new_power = HIGH_POWER;
6380 rps_set_power(dev_priv, new_power);6404 rps_set_power(dev_priv, new_power);
6381 mutex_unlock(&rps->power.mutex);6405 mutex_unlock(&rps->power.mutex);
6382 rps->last_adj = 0;
6383}6406}
6384 6407
6385void intel_rps_mark_interactive(struct drm_i915_private *i915, bool interactive)6408void intel_rps_mark_interactive(struct drm_i915_private *i915, bool interactive)
@@ -8159,7 +8182,7 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv) · 1773 unmodified lines
8159 */8182 */
8160 if (!sanitize_rc6(dev_priv)) {8183 if (!sanitize_rc6(dev_priv)) {
8161 DRM_INFO("RC6 disabled, disabling runtime PM support\n");8184 DRM_INFO("RC6 disabled, disabling runtime PM support\n");
8162 intel_runtime_pm_get(dev_priv);8185 pm_runtime_get(&dev_priv->drm.pdev->dev);
8163 }8186 }
8164 8187
8165 mutex_lock(&dev_priv->pcu_lock);8188 mutex_lock(&dev_priv->pcu_lock);
@@ -8211,7 +8234,7 @@ void intel_cleanup_gt_powersave(struct drm_i915_private *dev_priv) · 45 unmodified lines
8211 valleyview_cleanup_gt_powersave(dev_priv);8234 valleyview_cleanup_gt_powersave(dev_priv);
8212 8235
8213 if (!HAS_RC6(dev_priv))8236 if (!HAS_RC6(dev_priv))
8214 intel_runtime_pm_put(dev_priv);8237 pm_runtime_put(&dev_priv->drm.pdev->dev);
8215}8238}
8216 8239
8217/**8240/**
@@ -8238,7 +8261,7 @@ void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv) · 20 unmodified lines
8238 8261
8239 if (INTEL_GEN(dev_priv) >= 11)8262 if (INTEL_GEN(dev_priv) >= 11)
8240 gen11_reset_rps_interrupts(dev_priv);8263 gen11_reset_rps_interrupts(dev_priv);
8241 else8264 else if (INTEL_GEN(dev_priv) >= 6)
8242 gen6_reset_rps_interrupts(dev_priv);8265 gen6_reset_rps_interrupts(dev_priv);
8243}8266}
8244 8267
drivers/gpu/drm/i915/intel_psr.c+192−85
@@ -56,7 +56,30 @@ · 55 unmodified lines
56#include "intel_drv.h"56#include "intel_drv.h"
57#include "i915_drv.h"57#include "i915_drv.h"
58 58
59void intel_psr_irq_control(struct drm_i915_private *dev_priv, bool debug)59static bool psr_global_enabled(u32 debug)
60{
61 switch (debug & I915_PSR_DEBUG_MODE_MASK) {
62 case I915_PSR_DEBUG_DEFAULT:
63 return i915_modparams.enable_psr;
64 case I915_PSR_DEBUG_DISABLE:
65 return false;
66 default:
67 return true;
68 }
69}
70
71static bool intel_psr2_enabled(struct drm_i915_private *dev_priv,
72 const struct intel_crtc_state *crtc_state)
73{
74 switch (dev_priv->psr.debug & I915_PSR_DEBUG_MODE_MASK) {
75 case I915_PSR_DEBUG_FORCE_PSR1:
76 return false;
77 default:
78 return crtc_state->has_psr2;
79 }
80}
81
82void intel_psr_irq_control(struct drm_i915_private *dev_priv, u32 debug)
60{83{
61 u32 debug_mask, mask;84 u32 debug_mask, mask;
62 85
@@ -77,10 +100,9 @@ void intel_psr_irq_control(struct drm_i915_private *dev_priv, bool debug) · 14 unmodified lines
77 EDP_PSR_PRE_ENTRY(TRANSCODER_C);100 EDP_PSR_PRE_ENTRY(TRANSCODER_C);
78 }101 }
79 102
80 if (debug)103 if (debug & I915_PSR_DEBUG_IRQ)
81 mask |= debug_mask;104 mask |= debug_mask;
82 105
83 WRITE_ONCE(dev_priv->psr.debug, debug);
84 I915_WRITE(EDP_PSR_IMR, ~mask);106 I915_WRITE(EDP_PSR_IMR, ~mask);
85}107}
86 108
@@ -213,6 +235,9 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp) · 126 unmodified lines
213 dev_priv->psr.sink_sync_latency =235 dev_priv->psr.sink_sync_latency =
214 intel_dp_get_sink_sync_latency(intel_dp);236 intel_dp_get_sink_sync_latency(intel_dp);
215 237
238 WARN_ON(dev_priv->psr.dp);
239 dev_priv->psr.dp = intel_dp;
240
216 if (INTEL_GEN(dev_priv) >= 9 &&241 if (INTEL_GEN(dev_priv) >= 9 &&
217 (intel_dp->psr_dpcd[0] == DP_PSR2_WITH_Y_COORD_IS_SUPPORTED)) {242 (intel_dp->psr_dpcd[0] == DP_PSR2_WITH_Y_COORD_IS_SUPPORTED)) {
218 bool y_req = intel_dp->psr_dpcd[1] &243 bool y_req = intel_dp->psr_dpcd[1] &
@@ -245,7 +270,7 @@ static void intel_psr_setup_vsc(struct intel_dp *intel_dp, · 26 unmodified lines
245 const struct intel_crtc_state *crtc_state)270 const struct intel_crtc_state *crtc_state)
246{271{
247 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);272 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
248 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);273 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
249 struct edp_vsc_psr psr_vsc;274 struct edp_vsc_psr psr_vsc;
250 275
251 if (dev_priv->psr.psr2_enabled) {276 if (dev_priv->psr.psr2_enabled) {
@@ -275,8 +300,7 @@ static void intel_psr_setup_vsc(struct intel_dp *intel_dp, · 23 unmodified lines
275 300
276static void hsw_psr_setup_aux(struct intel_dp *intel_dp)301static void hsw_psr_setup_aux(struct intel_dp *intel_dp)
277{302{
278 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);303 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
279 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
280 u32 aux_clock_divider, aux_ctl;304 u32 aux_clock_divider, aux_ctl;
281 int i;305 int i;
282 static const uint8_t aux_msg[] = {306 static const uint8_t aux_msg[] = {
@@ -309,9 +333,7 @@ static void hsw_psr_setup_aux(struct intel_dp *intel_dp) · 26 unmodified lines
309 333
310static void intel_psr_enable_sink(struct intel_dp *intel_dp)334static void intel_psr_enable_sink(struct intel_dp *intel_dp)
311{335{
312 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);336 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
313 struct drm_device *dev = dig_port->base.base.dev;
314 struct drm_i915_private *dev_priv = to_i915(dev);
315 u8 dpcd_val = DP_PSR_ENABLE;337 u8 dpcd_val = DP_PSR_ENABLE;
316 338
317 /* Enable ALPM at sink for psr2 */339 /* Enable ALPM at sink for psr2 */
@@ -332,9 +354,7 @@ static void intel_psr_enable_sink(struct intel_dp *intel_dp) · 14 unmodified lines
332 354
333static void hsw_activate_psr1(struct intel_dp *intel_dp)355static void hsw_activate_psr1(struct intel_dp *intel_dp)
334{356{
335 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);357 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
336 struct drm_device *dev = dig_port->base.base.dev;
337 struct drm_i915_private *dev_priv = to_i915(dev);
338 u32 max_sleep_time = 0x1f;358 u32 max_sleep_time = 0x1f;
339 u32 val = EDP_PSR_ENABLE;359 u32 val = EDP_PSR_ENABLE;
340 360
@@ -389,9 +409,7 @@ static void hsw_activate_psr1(struct intel_dp *intel_dp) · 48 unmodified lines
389 409
390static void hsw_activate_psr2(struct intel_dp *intel_dp)410static void hsw_activate_psr2(struct intel_dp *intel_dp)
391{411{
392 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);412 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
393 struct drm_device *dev = dig_port->base.base.dev;
394 struct drm_i915_private *dev_priv = to_i915(dev);
395 u32 val;413 u32 val;
396 414
397 /* Let's use 6 as the minimum to cover all known cases including the415 /* Let's use 6 as the minimum to cover all known cases including the
@@ -427,8 +445,7 @@ static void hsw_activate_psr2(struct intel_dp *intel_dp) · 29 unmodified lines
427static bool intel_psr2_config_valid(struct intel_dp *intel_dp,445static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
428 struct intel_crtc_state *crtc_state)446 struct intel_crtc_state *crtc_state)
429{447{
430 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);448 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
431 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
432 int crtc_hdisplay = crtc_state->base.adjusted_mode.crtc_hdisplay;449 int crtc_hdisplay = crtc_state->base.adjusted_mode.crtc_hdisplay;
433 int crtc_vdisplay = crtc_state->base.adjusted_mode.crtc_vdisplay;450 int crtc_vdisplay = crtc_state->base.adjusted_mode.crtc_vdisplay;
434 int psr_max_h = 0, psr_max_v = 0;451 int psr_max_h = 0, psr_max_v = 0;
@@ -463,7 +480,7 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, · 28 unmodified lines
463 struct intel_crtc_state *crtc_state)480 struct intel_crtc_state *crtc_state)
464{481{
465 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);482 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
466 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);483 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
467 const struct drm_display_mode *adjusted_mode =484 const struct drm_display_mode *adjusted_mode =
468 &crtc_state->base.adjusted_mode;485 &crtc_state->base.adjusted_mode;
469 int psr_setup_time;486 int psr_setup_time;
@@ -471,10 +488,8 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, · 1 unmodified line
471 if (!CAN_PSR(dev_priv))488 if (!CAN_PSR(dev_priv))
472 return;489 return;
473 490
474 if (!i915_modparams.enable_psr) {491 if (intel_dp != dev_priv->psr.dp)
475 DRM_DEBUG_KMS("PSR disable by flag\n");
476 return;492 return;
477 }
478 493
479 /*494 /*
480 * HSW spec explicitly says PSR is tied to port A.495 * HSW spec explicitly says PSR is tied to port A.
@@ -517,14 +532,11 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, · 36 unmodified lines
517 532
518 crtc_state->has_psr = true;533 crtc_state->has_psr = true;
519 crtc_state->has_psr2 = intel_psr2_config_valid(intel_dp, crtc_state);534 crtc_state->has_psr2 = intel_psr2_config_valid(intel_dp, crtc_state);
520 DRM_DEBUG_KMS("Enabling PSR%s\n", crtc_state->has_psr2 ? "2" : "");
521}535}
522 536
523static void intel_psr_activate(struct intel_dp *intel_dp)537static void intel_psr_activate(struct intel_dp *intel_dp)
524{538{
525 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);539 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
526 struct drm_device *dev = intel_dig_port->base.base.dev;
527 struct drm_i915_private *dev_priv = to_i915(dev);
528 540
529 if (INTEL_GEN(dev_priv) >= 9)541 if (INTEL_GEN(dev_priv) >= 9)
530 WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE);542 WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE);
@@ -544,9 +556,7 @@ static void intel_psr_activate(struct intel_dp *intel_dp) · 13 unmodified lines
544static void intel_psr_enable_source(struct intel_dp *intel_dp,556static void intel_psr_enable_source(struct intel_dp *intel_dp,
545 const struct intel_crtc_state *crtc_state)557 const struct intel_crtc_state *crtc_state)
546{558{
547 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);559 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
548 struct drm_device *dev = dig_port->base.base.dev;
549 struct drm_i915_private *dev_priv = to_i915(dev);
550 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;560 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
551 561
552 /* Only HSW and BDW have PSR AUX registers that need to be setup. SKL+562 /* Only HSW and BDW have PSR AUX registers that need to be setup. SKL+
@@ -589,6 +599,24 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp, · 36 unmodified lines
589 }599 }
590}600}
591 601
602static void intel_psr_enable_locked(struct drm_i915_private *dev_priv,
603 const struct intel_crtc_state *crtc_state)
604{
605 struct intel_dp *intel_dp = dev_priv->psr.dp;
606
607 if (dev_priv->psr.enabled)
608 return;
609
610 DRM_DEBUG_KMS("Enabling PSR%s\n",
611 dev_priv->psr.psr2_enabled ? "2" : "1");
612 intel_psr_setup_vsc(intel_dp, crtc_state);
613 intel_psr_enable_sink(intel_dp);
614 intel_psr_enable_source(intel_dp, crtc_state);
615 dev_priv->psr.enabled = true;
616
617 intel_psr_activate(intel_dp);
618}
619
592/**620/**
593 * intel_psr_enable - Enable PSR621 * intel_psr_enable - Enable PSR
594 * @intel_dp: Intel DP622 * @intel_dp: Intel DP
@@ -599,9 +627,7 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp, · 4 unmodified lines
599void intel_psr_enable(struct intel_dp *intel_dp,627void intel_psr_enable(struct intel_dp *intel_dp,
600 const struct intel_crtc_state *crtc_state)628 const struct intel_crtc_state *crtc_state)
601{629{
602 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);630 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
603 struct drm_device *dev = intel_dig_port->base.base.dev;
604 struct drm_i915_private *dev_priv = to_i915(dev);
605 631
606 if (!crtc_state->has_psr)632 if (!crtc_state->has_psr)
607 return;633 return;
@@ -610,21 +636,21 @@ void intel_psr_enable(struct intel_dp *intel_dp, · 2 unmodified lines
610 return;636 return;
611 637
612 WARN_ON(dev_priv->drrs.dp);638 WARN_ON(dev_priv->drrs.dp);
639
613 mutex_lock(&dev_priv->psr.lock);640 mutex_lock(&dev_priv->psr.lock);
614 if (dev_priv->psr.enabled) {641 if (dev_priv->psr.prepared) {
615 DRM_DEBUG_KMS("PSR already in use\n");642 DRM_DEBUG_KMS("PSR already in use\n");
616 goto unlock;643 goto unlock;
617 }644 }
618 645
619 dev_priv->psr.psr2_enabled = crtc_state->has_psr2;646 dev_priv->psr.psr2_enabled = intel_psr2_enabled(dev_priv, crtc_state);
620 dev_priv->psr.busy_frontbuffer_bits = 0;647 dev_priv->psr.busy_frontbuffer_bits = 0;
648 dev_priv->psr.prepared = true;
621 649
622 intel_psr_setup_vsc(intel_dp, crtc_state);650 if (psr_global_enabled(dev_priv->psr.debug))
623 intel_psr_enable_sink(intel_dp);651 intel_psr_enable_locked(dev_priv, crtc_state);
624 intel_psr_enable_source(intel_dp, crtc_state);652 else
625 dev_priv->psr.enabled = intel_dp;653 DRM_DEBUG_KMS("PSR disabled by flag\n");
626
627 intel_psr_activate(intel_dp);
628 654
629unlock:655unlock:
630 mutex_unlock(&dev_priv->psr.lock);656 mutex_unlock(&dev_priv->psr.lock);
@@ -633,9 +659,7 @@ unlock: · 2 unmodified lines
633static void659static void
634intel_psr_disable_source(struct intel_dp *intel_dp)660intel_psr_disable_source(struct intel_dp *intel_dp)
635{661{
636 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);662 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
637 struct drm_device *dev = intel_dig_port->base.base.dev;
638 struct drm_i915_private *dev_priv = to_i915(dev);
639 663
640 if (dev_priv->psr.active) {664 if (dev_priv->psr.active) {
641 i915_reg_t psr_status;665 i915_reg_t psr_status;
@@ -674,21 +698,21 @@ intel_psr_disable_source(struct intel_dp *intel_dp) · 32 unmodified lines
674 698
675static void intel_psr_disable_locked(struct intel_dp *intel_dp)699static void intel_psr_disable_locked(struct intel_dp *intel_dp)
676{700{
677 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);701 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
678 struct drm_device *dev = intel_dig_port->base.base.dev;
679 struct drm_i915_private *dev_priv = to_i915(dev);
680 702
681 lockdep_assert_held(&dev_priv->psr.lock);703 lockdep_assert_held(&dev_priv->psr.lock);
682 704
683 if (!dev_priv->psr.enabled)705 if (!dev_priv->psr.enabled)
684 return;706 return;
685 707
708 DRM_DEBUG_KMS("Disabling PSR%s\n",
709 dev_priv->psr.psr2_enabled ? "2" : "1");
686 intel_psr_disable_source(intel_dp);710 intel_psr_disable_source(intel_dp);
687 711
688 /* Disable PSR on Sink */712 /* Disable PSR on Sink */
689 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);713 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);
690 714
691 dev_priv->psr.enabled = NULL;715 dev_priv->psr.enabled = false;
692}716}
693 717
694/**718/**
@@ -701,9 +725,7 @@ static void intel_psr_disable_locked(struct intel_dp *intel_dp) · 6 unmodified lines
701void intel_psr_disable(struct intel_dp *intel_dp,725void intel_psr_disable(struct intel_dp *intel_dp,
702 const struct intel_crtc_state *old_crtc_state)726 const struct intel_crtc_state *old_crtc_state)
703{727{
704 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);728 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
705 struct drm_device *dev = intel_dig_port->base.base.dev;
706 struct drm_i915_private *dev_priv = to_i915(dev);
707 729
708 if (!old_crtc_state->has_psr)730 if (!old_crtc_state->has_psr)
709 return;731 return;
@@ -712,57 +734,61 @@ void intel_psr_disable(struct intel_dp *intel_dp, · 2 unmodified lines
712 return;734 return;
713 735
714 mutex_lock(&dev_priv->psr.lock);736 mutex_lock(&dev_priv->psr.lock);
737 if (!dev_priv->psr.prepared) {
738 mutex_unlock(&dev_priv->psr.lock);
739 return;
740 }
741
715 intel_psr_disable_locked(intel_dp);742 intel_psr_disable_locked(intel_dp);
743
744 dev_priv->psr.prepared = false;
716 mutex_unlock(&dev_priv->psr.lock);745 mutex_unlock(&dev_priv->psr.lock);
717 cancel_work_sync(&dev_priv->psr.work);746 cancel_work_sync(&dev_priv->psr.work);
718}747}
719 748
720int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state)749/**
750 * intel_psr_wait_for_idle - wait for PSR1 to idle
751 * @new_crtc_state: new CRTC state
752 * @out_value: PSR status in case of failure
753 *
754 * This function is expected to be called from pipe_update_start() where it is
755 * not expected to race with PSR enable or disable.
756 *
757 * Returns: 0 on success or -ETIMEOUT if PSR status does not idle.
758 */
759int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state,
760 u32 *out_value)
721{761{
722 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);762 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);
723 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);763 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
724 i915_reg_t reg;
725 u32 mask;
726 764
727 if (!new_crtc_state->has_psr)765 if (!dev_priv->psr.enabled || !new_crtc_state->has_psr)
728 return 0;766 return 0;
729 767
730 /*768 /* FIXME: Update this for PSR2 if we need to wait for idle */
731 * The sole user right now is intel_pipe_update_start(),769 if (READ_ONCE(dev_priv->psr.psr2_enabled))
732 * which won't race with psr_enable/disable, which is770 return 0;
733 * where psr2_enabled is written to. So, we don't need
734 * to acquire the psr.lock. More importantly, we want the
735 * latency inside intel_pipe_update_start() to be as low
736 * as possible, so no need to acquire psr.lock when it is
737 * not needed and will induce latencies in the atomic
738 * update path.
739 */
740 if (dev_priv->psr.psr2_enabled) {
741 reg = EDP_PSR2_STATUS;
742 mask = EDP_PSR2_STATUS_STATE_MASK;
743 } else {
744 reg = EDP_PSR_STATUS;
745 mask = EDP_PSR_STATUS_STATE_MASK;
746 }
747 771
748 /*772 /*
749 * Max time for PSR to idle = Inverse of the refresh rate +773 * From bspec: Panel Self Refresh (BDW+)
750 * 6 ms of exit training time + 1.5 ms of aux channel774 * Max. time for PSR to idle = Inverse of the refresh rate + 6 ms of
751 * handshake. 50 msec is defesive enough to cover everything.775 * exit training time + 1.5 ms of aux channel handshake. 50 ms is
776 * defensive enough to cover everything.
752 */777 */
753 return intel_wait_for_register(dev_priv, reg, mask,778
754 EDP_PSR_STATUS_STATE_IDLE, 50);779 return __intel_wait_for_register(dev_priv, EDP_PSR_STATUS,
780 EDP_PSR_STATUS_STATE_MASK,
781 EDP_PSR_STATUS_STATE_IDLE, 2, 50,
782 out_value);
755}783}
756 784
757static bool __psr_wait_for_idle_locked(struct drm_i915_private *dev_priv)785static bool __psr_wait_for_idle_locked(struct drm_i915_private *dev_priv)
758{786{
759 struct intel_dp *intel_dp;
760 i915_reg_t reg;787 i915_reg_t reg;
761 u32 mask;788 u32 mask;
762 int err;789 int err;
763 790
764 intel_dp = dev_priv->psr.enabled;791 if (!dev_priv->psr.enabled)
765 if (!intel_dp)
766 return false;792 return false;
767 793
768 if (dev_priv->psr.psr2_enabled) {794 if (dev_priv->psr.psr2_enabled) {
@@ -784,6 +810,89 @@ static bool __psr_wait_for_idle_locked(struct drm_i915_private *dev_priv) · 15 unmodified lines
784 return err == 0 && dev_priv->psr.enabled;810 return err == 0 && dev_priv->psr.enabled;
785}811}
786 812
813static bool switching_psr(struct drm_i915_private *dev_priv,
814 struct intel_crtc_state *crtc_state,
815 u32 mode)
816{
817 /* Can't switch psr state anyway if PSR2 is not supported. */
818 if (!crtc_state || !crtc_state->has_psr2)
819 return false;
820
821 if (dev_priv->psr.psr2_enabled && mode == I915_PSR_DEBUG_FORCE_PSR1)
822 return true;
823
824 if (!dev_priv->psr.psr2_enabled && mode != I915_PSR_DEBUG_FORCE_PSR1)
825 return true;
826
827 return false;
828}
829
830int intel_psr_set_debugfs_mode(struct drm_i915_private *dev_priv,
831 struct drm_modeset_acquire_ctx *ctx,
832 u64 val)
833{
834 struct drm_device *dev = &dev_priv->drm;
835 struct drm_connector_state *conn_state;
836 struct intel_crtc_state *crtc_state = NULL;
837 struct drm_crtc_commit *commit;
838 struct drm_crtc *crtc;
839 struct intel_dp *dp;
840 int ret;
841 bool enable;
842 u32 mode = val & I915_PSR_DEBUG_MODE_MASK;
843
844 if (val & ~(I915_PSR_DEBUG_IRQ | I915_PSR_DEBUG_MODE_MASK) ||
845 mode > I915_PSR_DEBUG_FORCE_PSR1) {
846 DRM_DEBUG_KMS("Invalid debug mask %llx\n", val);
847 return -EINVAL;
848 }
849
850 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
851 if (ret)
852 return ret;
853
854 /* dev_priv->psr.dp should be set once and then never touched again. */
855 dp = READ_ONCE(dev_priv->psr.dp);
856 conn_state = dp->attached_connector->base.state;
857 crtc = conn_state->crtc;
858 if (crtc) {
859 ret = drm_modeset_lock(&crtc->mutex, ctx);
860 if (ret)
861 return ret;
862
863 crtc_state = to_intel_crtc_state(crtc->state);
864 commit = crtc_state->base.commit;
865 } else {
866 commit = conn_state->commit;
867 }
868 if (commit) {
869 ret = wait_for_completion_interruptible(&commit->hw_done);
870 if (ret)
871 return ret;
872 }
873
874 ret = mutex_lock_interruptible(&dev_priv->psr.lock);
875 if (ret)
876 return ret;
877
878 enable = psr_global_enabled(val);
879
880 if (!enable || switching_psr(dev_priv, crtc_state, mode))
881 intel_psr_disable_locked(dev_priv->psr.dp);
882
883 dev_priv->psr.debug = val;
884 if (crtc)
885 dev_priv->psr.psr2_enabled = intel_psr2_enabled(dev_priv, crtc_state);
886
887 intel_psr_irq_control(dev_priv, dev_priv->psr.debug);
888
889 if (dev_priv->psr.prepared && enable)
890 intel_psr_enable_locked(dev_priv, crtc_state);
891
892 mutex_unlock(&dev_priv->psr.lock);
893 return ret;
894}
895
787static void intel_psr_work(struct work_struct *work)896static void intel_psr_work(struct work_struct *work)
788{897{
789 struct drm_i915_private *dev_priv =898 struct drm_i915_private *dev_priv =
@@ -811,7 +920,7 @@ static void intel_psr_work(struct work_struct *work) · 21 unmodified lines
811 if (dev_priv->psr.busy_frontbuffer_bits || dev_priv->psr.active)920 if (dev_priv->psr.busy_frontbuffer_bits || dev_priv->psr.active)
812 goto unlock;921 goto unlock;
813 922
814 intel_psr_activate(dev_priv->psr.enabled);923 intel_psr_activate(dev_priv->psr.dp);
815unlock:924unlock:
816 mutex_unlock(&dev_priv->psr.lock);925 mutex_unlock(&dev_priv->psr.lock);
817}926}
@@ -866,7 +975,7 @@ void intel_psr_invalidate(struct drm_i915_private *dev_priv, · 48 unmodified lines
866 return;975 return;
867 }976 }
868 977
869 crtc = dp_to_dig_port(dev_priv->psr.enabled)->base.base.crtc;978 crtc = dp_to_dig_port(dev_priv->psr.dp)->base.base.crtc;
870 pipe = to_intel_crtc(crtc)->pipe;979 pipe = to_intel_crtc(crtc)->pipe;
871 980
872 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);981 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
@@ -909,7 +1018,7 @@ void intel_psr_flush(struct drm_i915_private *dev_priv, · 36 unmodified lines
909 return;1018 return;
910 }1019 }
911 1020
912 crtc = dp_to_dig_port(dev_priv->psr.enabled)->base.base.crtc;1021 crtc = dp_to_dig_port(dev_priv->psr.dp)->base.base.crtc;
913 pipe = to_intel_crtc(crtc)->pipe;1022 pipe = to_intel_crtc(crtc)->pipe;
914 1023
915 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);1024 frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
@@ -977,9 +1086,7 @@ void intel_psr_init(struct drm_i915_private *dev_priv) · 61 unmodified lines
977 1086
978void intel_psr_short_pulse(struct intel_dp *intel_dp)1087void intel_psr_short_pulse(struct intel_dp *intel_dp)
979{1088{
980 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);1089 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
981 struct drm_device *dev = intel_dig_port->base.base.dev;
982 struct drm_i915_private *dev_priv = to_i915(dev);
983 struct i915_psr *psr = &dev_priv->psr;1090 struct i915_psr *psr = &dev_priv->psr;
984 u8 val;1091 u8 val;
985 const u8 errors = DP_PSR_RFB_STORAGE_ERROR |1092 const u8 errors = DP_PSR_RFB_STORAGE_ERROR |
@@ -991,7 +1098,7 @@ void intel_psr_short_pulse(struct intel_dp *intel_dp) · 5 unmodified lines
991 1098
992 mutex_lock(&psr->lock);1099 mutex_lock(&psr->lock);
993 1100
994 if (psr->enabled != intel_dp)1101 if (!psr->enabled || psr->dp != intel_dp)
995 goto exit;1102 goto exit;
996 1103
997 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val) != 1) {1104 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val) != 1) {
drivers/gpu/drm/i915/intel_ringbuffer.c+56−54
@@ -344,11 +344,14 @@ gen7_render_ring_flush(struct i915_request *rq, u32 mode) · 343 unmodified lines
344static void ring_setup_phys_status_page(struct intel_engine_cs *engine)344static void ring_setup_phys_status_page(struct intel_engine_cs *engine)
345{345{
346 struct drm_i915_private *dev_priv = engine->i915;346 struct drm_i915_private *dev_priv = engine->i915;
347 struct page *page = virt_to_page(engine->status_page.page_addr);
348 phys_addr_t phys = PFN_PHYS(page_to_pfn(page));
347 u32 addr;349 u32 addr;
348 350
349 addr = dev_priv->status_page_dmah->busaddr;351 addr = lower_32_bits(phys);
350 if (INTEL_GEN(dev_priv) >= 4)352 if (INTEL_GEN(dev_priv) >= 4)
351 addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;353 addr |= (phys >> 28) & 0xf0;
354
352 I915_WRITE(HWS_PGA, addr);355 I915_WRITE(HWS_PGA, addr);
353}356}
354 357
@@ -537,6 +540,8 @@ static int init_ring_common(struct intel_engine_cs *engine) · 182 unmodified lines
537 if (INTEL_GEN(dev_priv) > 2)540 if (INTEL_GEN(dev_priv) > 2)
538 I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));541 I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));
539 542
543 /* Papering over lost _interrupts_ immediately following the restart */
544 intel_engine_wakeup(engine);
540out:545out:
541 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);546 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
542 547
@@ -1013,24 +1018,22 @@ i915_emit_bb_start(struct i915_request *rq, · 470 unmodified lines
1013 return 0;1018 return 0;
1014}1019}
1015 1020
1016 1021int intel_ring_pin(struct intel_ring *ring)
1017
1018int intel_ring_pin(struct intel_ring *ring,
1019 struct drm_i915_private *i915,
1020 unsigned int offset_bias)
1021{1022{
1022 enum i915_map_type map = HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC;
1023 struct i915_vma *vma = ring->vma;1023 struct i915_vma *vma = ring->vma;
1024 enum i915_map_type map =
1025 HAS_LLC(vma->vm->i915) ? I915_MAP_WB : I915_MAP_WC;
1024 unsigned int flags;1026 unsigned int flags;
1025 void *addr;1027 void *addr;
1026 int ret;1028 int ret;
1027 1029
1028 GEM_BUG_ON(ring->vaddr);1030 GEM_BUG_ON(ring->vaddr);
1029 1031
1030
1031 flags = PIN_GLOBAL;1032 flags = PIN_GLOBAL;
1032 if (offset_bias)1033
1033 flags |= PIN_OFFSET_BIAS | offset_bias;1034 /* Ring wraparound at offset 0 sometimes hangs. No idea why. */
1035 flags |= PIN_OFFSET_BIAS | i915_ggtt_pin_bias(vma);
1036
1034 if (vma->obj->stolen)1037 if (vma->obj->stolen)
1035 flags |= PIN_MAPPABLE;1038 flags |= PIN_MAPPABLE;
1036 else1039 else
@@ -1045,7 +1048,7 @@ int intel_ring_pin(struct intel_ring *ring, · 8 unmodified lines
1045 return ret;1048 return ret;
1046 }1049 }
1047 1050
1048 ret = i915_vma_pin(vma, 0, PAGE_SIZE, flags);1051 ret = i915_vma_pin(vma, 0, 0, flags);
1049 if (unlikely(ret))1052 if (unlikely(ret))
1050 return ret;1053 return ret;
1051 1054
@@ -1230,8 +1233,7 @@ static int __context_pin(struct intel_context *ce) · 178 unmodified lines
1230 return err;1233 return err;
1231 }1234 }
1232 1235
1233 err = i915_vma_pin(vma, 0, I915_GTT_MIN_ALIGNMENT,1236 err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
1234 PIN_GLOBAL | PIN_HIGH);
1235 if (err)1237 if (err)
1236 return err;1238 return err;
1237 1239
@@ -1419,8 +1421,7 @@ static int intel_init_ring_buffer(struct intel_engine_cs *engine) · 181 unmodified lines
1419 goto err;1421 goto err;
1420 }1422 }
1421 1423
1422 /* Ring wraparound at offset 0 sometimes hangs. No idea why. */1424 err = intel_ring_pin(ring);
1423 err = intel_ring_pin(ring, engine->i915, I915_GTT_PAGE_SIZE);
1424 if (err)1425 if (err)
1425 goto err_ring;1426 goto err_ring;
1426 1427
@@ -1706,9 +1707,29 @@ static int switch_context(struct i915_request *rq) · 279 unmodified lines
1706 }1707 }
1707 1708
1708 if (ppgtt) {1709 if (ppgtt) {
1710 ret = engine->emit_flush(rq, EMIT_INVALIDATE);
1711 if (ret)
1712 goto err_mm;
1713
1709 ret = flush_pd_dir(rq);1714 ret = flush_pd_dir(rq);
1710 if (ret)1715 if (ret)
1711 goto err_mm;1716 goto err_mm;
1717
1718 /*
1719 * Not only do we need a full barrier (post-sync write) after
1720 * invalidating the TLBs, but we need to wait a little bit
1721 * longer. Whether this is merely delaying us, or the
1722 * subsequent flush is a key part of serialising with the
1723 * post-sync op, this extra pass appears vital before a
1724 * mm switch!
1725 */
1726 ret = engine->emit_flush(rq, EMIT_INVALIDATE);
1727 if (ret)
1728 goto err_mm;
1729
1730 ret = engine->emit_flush(rq, EMIT_FLUSH);
1731 if (ret)
1732 goto err_mm;
1712 }1733 }
1713 1734
1714 if (ctx->remap_slice) {1735 if (ctx->remap_slice) {
@@ -1946,7 +1967,7 @@ static void gen6_bsd_submit_request(struct i915_request *request) · 231 unmodified lines
1946 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);1967 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
1947}1968}
1948 1969
1949static int gen6_bsd_ring_flush(struct i915_request *rq, u32 mode)1970static int mi_flush_dw(struct i915_request *rq, u32 flags)
1950{1971{
1951 u32 cmd, *cs;1972 u32 cmd, *cs;
1952 1973
@@ -1956,7 +1977,8 @@ static int gen6_bsd_ring_flush(struct i915_request *rq, u32 mode) · 3 unmodified lines
1956 1977
1957 cmd = MI_FLUSH_DW;1978 cmd = MI_FLUSH_DW;
1958 1979
1959 /* We always require a command barrier so that subsequent1980 /*
1981 * We always require a command barrier so that subsequent
1960 * commands, such as breadcrumb interrupts, are strictly ordered1982 * commands, such as breadcrumb interrupts, are strictly ordered
1961 * wrt the contents of the write cache being flushed to memory1983 * wrt the contents of the write cache being flushed to memory
1962 * (and thus being coherent from the CPU).1984 * (and thus being coherent from the CPU).
@@ -1964,22 +1986,33 @@ static int gen6_bsd_ring_flush(struct i915_request *rq, u32 mode) · 1 unmodified line
1964 cmd |= MI_FLUSH_DW_STORE_INDEX | MI_FLUSH_DW_OP_STOREDW;1986 cmd |= MI_FLUSH_DW_STORE_INDEX | MI_FLUSH_DW_OP_STOREDW;
1965 1987
1966 /*1988 /*
1967 * Bspec vol 1c.5 - video engine command streamer:1989 * Bspec vol 1c.3 - blitter engine command streamer:
1968 * "If ENABLED, all TLBs will be invalidated once the flush1990 * "If ENABLED, all TLBs will be invalidated once the flush
1969 * operation is complete. This bit is only valid when the1991 * operation is complete. This bit is only valid when the
1970 * Post-Sync Operation field is a value of 1h or 3h."1992 * Post-Sync Operation field is a value of 1h or 3h."
1971 */1993 */
1972 if (mode & EMIT_INVALIDATE)1994 cmd |= flags;
1973 cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1974 1995
1975 *cs++ = cmd;1996 *cs++ = cmd;
1976 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT;1997 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT;
1977 *cs++ = 0;1998 *cs++ = 0;
1978 *cs++ = MI_NOOP;1999 *cs++ = MI_NOOP;
2000
1979 intel_ring_advance(rq, cs);2001 intel_ring_advance(rq, cs);
2002
1980 return 0;2003 return 0;
1981}2004}
1982 2005
2006static int gen6_flush_dw(struct i915_request *rq, u32 mode, u32 invflags)
2007{
2008 return mi_flush_dw(rq, mode & EMIT_INVALIDATE ? invflags : 0);
2009}
2010
2011static int gen6_bsd_ring_flush(struct i915_request *rq, u32 mode)
2012{
2013 return gen6_flush_dw(rq, mode, MI_INVALIDATE_TLB | MI_INVALIDATE_BSD);
2014}
2015
1983static int2016static int
1984hsw_emit_bb_start(struct i915_request *rq,2017hsw_emit_bb_start(struct i915_request *rq,
1985 u64 offset, u32 len,2018 u64 offset, u32 len,
@@ -1992,9 +2025,7 @@ hsw_emit_bb_start(struct i915_request *rq, · 6 unmodified lines
1992 return PTR_ERR(cs);2025 return PTR_ERR(cs);
1993 2026
1994 *cs++ = MI_BATCH_BUFFER_START | (dispatch_flags & I915_DISPATCH_SECURE ?2027 *cs++ = MI_BATCH_BUFFER_START | (dispatch_flags & I915_DISPATCH_SECURE ?
1995 0 : MI_BATCH_PPGTT_HSW | MI_BATCH_NON_SECURE_HSW) |2028 0 : MI_BATCH_PPGTT_HSW | MI_BATCH_NON_SECURE_HSW);
1996 (dispatch_flags & I915_DISPATCH_RS ?
1997 MI_BATCH_RESOURCE_STREAMER : 0);
1998 /* bit0-7 is the length on GEN6+ */2029 /* bit0-7 is the length on GEN6+ */
1999 *cs++ = offset;2030 *cs++ = offset;
2000 intel_ring_advance(rq, cs);2031 intel_ring_advance(rq, cs);
@@ -2026,36 +2057,7 @@ gen6_emit_bb_start(struct i915_request *rq, · 25 unmodified lines
2026 2057
2027static int gen6_ring_flush(struct i915_request *rq, u32 mode)2058static int gen6_ring_flush(struct i915_request *rq, u32 mode)
2028{2059{
2029 u32 cmd, *cs;2060 return gen6_flush_dw(rq, mode, MI_INVALIDATE_TLB);
2030
2031 cs = intel_ring_begin(rq, 4);
2032 if (IS_ERR(cs))
2033 return PTR_ERR(cs);
2034
2035 cmd = MI_FLUSH_DW;
2036
2037 /* We always require a command barrier so that subsequent
2038 * commands, such as breadcrumb interrupts, are strictly ordered
2039 * wrt the contents of the write cache being flushed to memory
2040 * (and thus being coherent from the CPU).
2041 */
2042 cmd |= MI_FLUSH_DW_STORE_INDEX | MI_FLUSH_DW_OP_STOREDW;
2043
2044 /*
2045 * Bspec vol 1c.3 - blitter engine command streamer:
2046 * "If ENABLED, all TLBs will be invalidated once the flush
2047 * operation is complete. This bit is only valid when the
2048 * Post-Sync Operation field is a value of 1h or 3h."
2049 */
2050 if (mode & EMIT_INVALIDATE)
2051 cmd |= MI_INVALIDATE_TLB;
2052 *cs++ = cmd;
2053 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT;
2054 *cs++ = 0;
2055 *cs++ = MI_NOOP;
2056 intel_ring_advance(rq, cs);
2057
2058 return 0;
2059}2061}
2060 2062
2061static void intel_ring_init_semaphores(struct drm_i915_private *dev_priv,2063static void intel_ring_init_semaphores(struct drm_i915_private *dev_priv,
drivers/gpu/drm/i915/intel_ringbuffer.h+29−10
@@ -474,7 +474,6 @@ struct intel_engine_cs { · 473 unmodified lines
474 unsigned int dispatch_flags);474 unsigned int dispatch_flags);
475#define I915_DISPATCH_SECURE BIT(0)475#define I915_DISPATCH_SECURE BIT(0)
476#define I915_DISPATCH_PINNED BIT(1)476#define I915_DISPATCH_PINNED BIT(1)
477#define I915_DISPATCH_RS BIT(2)
478 void (*emit_breadcrumb)(struct i915_request *rq, u32 *cs);477 void (*emit_breadcrumb)(struct i915_request *rq, u32 *cs);
479 int emit_breadcrumb_sz;478 int emit_breadcrumb_sz;
480 479
@@ -797,9 +796,7 @@ struct intel_ring * · 316 unmodified lines
797intel_engine_create_ring(struct intel_engine_cs *engine,796intel_engine_create_ring(struct intel_engine_cs *engine,
798 struct i915_timeline *timeline,797 struct i915_timeline *timeline,
799 int size);798 int size);
800int intel_ring_pin(struct intel_ring *ring,799int intel_ring_pin(struct intel_ring *ring);
801 struct drm_i915_private *i915,
802 unsigned int offset_bias);
803void intel_ring_reset(struct intel_ring *ring, u32 tail);800void intel_ring_reset(struct intel_ring *ring, u32 tail);
804unsigned int intel_ring_update_space(struct intel_ring *ring);801unsigned int intel_ring_update_space(struct intel_ring *ring);
805void intel_ring_unpin(struct intel_ring *ring);802void intel_ring_unpin(struct intel_ring *ring);
@@ -909,18 +906,15 @@ int intel_init_blt_ring_buffer(struct intel_engine_cs *engine); · 103 unmodified lines
909int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine);906int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine);
910 907
911int intel_engine_stop_cs(struct intel_engine_cs *engine);908int intel_engine_stop_cs(struct intel_engine_cs *engine);
909void intel_engine_cancel_stop_cs(struct intel_engine_cs *engine);
912 910
913u64 intel_engine_get_active_head(const struct intel_engine_cs *engine);911u64 intel_engine_get_active_head(const struct intel_engine_cs *engine);
914u64 intel_engine_get_last_batch_head(const struct intel_engine_cs *engine);912u64 intel_engine_get_last_batch_head(const struct intel_engine_cs *engine);
915 913
916static inline u32 intel_engine_get_seqno(struct intel_engine_cs *engine)
917{
918 return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
919}
920
921static inline u32 intel_engine_last_submit(struct intel_engine_cs *engine)914static inline u32 intel_engine_last_submit(struct intel_engine_cs *engine)
922{915{
923 /* We are only peeking at the tail of the submit queue (and not the916 /*
917 * We are only peeking at the tail of the submit queue (and not the
924 * queue itself) in order to gain a hint as to the current active918 * queue itself) in order to gain a hint as to the current active
925 * state of the engine. Callers are not expected to be taking919 * state of the engine. Callers are not expected to be taking
926 * engine->timeline->lock, nor are they expected to be concerned920 * engine->timeline->lock, nor are they expected to be concerned
@@ -930,6 +924,31 @@ static inline u32 intel_engine_last_submit(struct intel_engine_cs *engine) · 3 unmodified lines
930 return READ_ONCE(engine->timeline.seqno);924 return READ_ONCE(engine->timeline.seqno);
931}925}
932 926
927static inline u32 intel_engine_get_seqno(struct intel_engine_cs *engine)
928{
929 return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
930}
931
932static inline bool intel_engine_signaled(struct intel_engine_cs *engine,
933 u32 seqno)
934{
935 return i915_seqno_passed(intel_engine_get_seqno(engine), seqno);
936}
937
938static inline bool intel_engine_has_completed(struct intel_engine_cs *engine,
939 u32 seqno)
940{
941 GEM_BUG_ON(!seqno);
942 return intel_engine_signaled(engine, seqno);
943}
944
945static inline bool intel_engine_has_started(struct intel_engine_cs *engine,
946 u32 seqno)
947{
948 GEM_BUG_ON(!seqno);
949 return intel_engine_signaled(engine, seqno - 1);
950}
951
933void intel_engine_get_instdone(struct intel_engine_cs *engine,952void intel_engine_get_instdone(struct intel_engine_cs *engine,
934 struct intel_instdone *instdone);953 struct intel_instdone *instdone);
935 954
drivers/gpu/drm/i915/intel_runtime_pm.c+674−329
@@ -52,10 +52,6 @@ · 51 unmodified lines
52bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,52bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
53 enum i915_power_well_id power_well_id);53 enum i915_power_well_id power_well_id);
54 54
55static struct i915_power_well *
56lookup_power_well(struct drm_i915_private *dev_priv,
57 enum i915_power_well_id power_well_id);
58
59const char *55const char *
60intel_display_power_domain_str(enum intel_display_power_domain domain)56intel_display_power_domain_str(enum intel_display_power_domain domain)
61{57{
@@ -159,17 +155,17 @@ intel_display_power_domain_str(enum intel_display_power_domain domain) · 97 unmodified lines
159static void intel_power_well_enable(struct drm_i915_private *dev_priv,155static void intel_power_well_enable(struct drm_i915_private *dev_priv,
160 struct i915_power_well *power_well)156 struct i915_power_well *power_well)
161{157{
162 DRM_DEBUG_KMS("enabling %s\n", power_well->name);158 DRM_DEBUG_KMS("enabling %s\n", power_well->desc->name);
163 power_well->ops->enable(dev_priv, power_well);159 power_well->desc->ops->enable(dev_priv, power_well);
164 power_well->hw_enabled = true;160 power_well->hw_enabled = true;
165}161}
166 162
167static void intel_power_well_disable(struct drm_i915_private *dev_priv,163static void intel_power_well_disable(struct drm_i915_private *dev_priv,
168 struct i915_power_well *power_well)164 struct i915_power_well *power_well)
169{165{
170 DRM_DEBUG_KMS("disabling %s\n", power_well->name);166 DRM_DEBUG_KMS("disabling %s\n", power_well->desc->name);
171 power_well->hw_enabled = false;167 power_well->hw_enabled = false;
172 power_well->ops->disable(dev_priv, power_well);168 power_well->desc->ops->disable(dev_priv, power_well);
173}169}
174 170
175static void intel_power_well_get(struct drm_i915_private *dev_priv,171static void intel_power_well_get(struct drm_i915_private *dev_priv,
@@ -183,7 +179,7 @@ static void intel_power_well_put(struct drm_i915_private *dev_priv, · 7 unmodified lines
183 struct i915_power_well *power_well)179 struct i915_power_well *power_well)
184{180{
185 WARN(!power_well->count, "Use count on power well %s is already zero",181 WARN(!power_well->count, "Use count on power well %s is already zero",
186 power_well->name);182 power_well->desc->name);
187 183
188 if (!--power_well->count)184 if (!--power_well->count)
189 intel_power_well_disable(dev_priv, power_well);185 intel_power_well_disable(dev_priv, power_well);
@@ -213,7 +209,7 @@ bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv, · 23 unmodified lines
213 is_enabled = true;209 is_enabled = true;
214 210
215 for_each_power_domain_well_rev(dev_priv, power_well, BIT_ULL(domain)) {211 for_each_power_domain_well_rev(dev_priv, power_well, BIT_ULL(domain)) {
216 if (power_well->always_on)212 if (power_well->desc->always_on)
217 continue;213 continue;
218 214
219 if (!power_well->hw_enabled) {215 if (!power_well->hw_enabled) {
@@ -257,30 +253,6 @@ bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv, · 37 unmodified lines
257 return ret;253 return ret;
258}254}
259 255
260/**
261 * intel_display_set_init_power - set the initial power domain state
262 * @dev_priv: i915 device instance
263 * @enable: whether to enable or disable the initial power domain state
264 *
265 * For simplicity our driver load/unload and system suspend/resume code assumes
266 * that all power domains are always enabled. This functions controls the state
267 * of this little hack. While the initial power domain state is enabled runtime
268 * pm is effectively disabled.
269 */
270void intel_display_set_init_power(struct drm_i915_private *dev_priv,
271 bool enable)
272{
273 if (dev_priv->power_domains.init_power_on == enable)
274 return;
275
276 if (enable)
277 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
278 else
279 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
280
281 dev_priv->power_domains.init_power_on = enable;
282}
283
284/*256/*
285 * Starting with Haswell, we have a "Power Down Well" that can be turned off257 * Starting with Haswell, we have a "Power Down Well" that can be turned off
286 * when not needed anymore. We have 4 registers that can request the power well258 * when not needed anymore. We have 4 registers that can request the power well
@@ -323,26 +295,29 @@ static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv, · 36 unmodified lines
323static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,295static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
324 struct i915_power_well *power_well)296 struct i915_power_well *power_well)
325{297{
326 enum i915_power_well_id id = power_well->id;298 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
299 int pw_idx = power_well->desc->hsw.idx;
327 300
328 /* Timeout for PW1:10 us, AUX:not specified, other PWs:20 us. */301 /* Timeout for PW1:10 us, AUX:not specified, other PWs:20 us. */
329 WARN_ON(intel_wait_for_register(dev_priv,302 WARN_ON(intel_wait_for_register(dev_priv,
330 HSW_PWR_WELL_CTL_DRIVER(id),303 regs->driver,
331 HSW_PWR_WELL_CTL_STATE(id),304 HSW_PWR_WELL_CTL_STATE(pw_idx),
332 HSW_PWR_WELL_CTL_STATE(id),305 HSW_PWR_WELL_CTL_STATE(pw_idx),
333 1));306 1));
334}307}
335 308
336static u32 hsw_power_well_requesters(struct drm_i915_private *dev_priv,309static u32 hsw_power_well_requesters(struct drm_i915_private *dev_priv,
337 enum i915_power_well_id id)310 const struct i915_power_well_regs *regs,
311 int pw_idx)
338{312{
339 u32 req_mask = HSW_PWR_WELL_CTL_REQ(id);313 u32 req_mask = HSW_PWR_WELL_CTL_REQ(pw_idx);
340 u32 ret;314 u32 ret;
341 315
342 ret = I915_READ(HSW_PWR_WELL_CTL_BIOS(id)) & req_mask ? 1 : 0;316 ret = I915_READ(regs->bios) & req_mask ? 1 : 0;
343 ret |= I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & req_mask ? 2 : 0;317 ret |= I915_READ(regs->driver) & req_mask ? 2 : 0;
344 ret |= I915_READ(HSW_PWR_WELL_CTL_KVMR) & req_mask ? 4 : 0;318 if (regs->kvmr.reg)
345 ret |= I915_READ(HSW_PWR_WELL_CTL_DEBUG(id)) & req_mask ? 8 : 0;319 ret |= I915_READ(regs->kvmr) & req_mask ? 4 : 0;
320 ret |= I915_READ(regs->debug) & req_mask ? 8 : 0;
346 321
347 return ret;322 return ret;
348}323}
@@ -350,7 +325,8 @@ static u32 hsw_power_well_requesters(struct drm_i915_private *dev_priv, · 1 unmodified line
350static void hsw_wait_for_power_well_disable(struct drm_i915_private *dev_priv,325static void hsw_wait_for_power_well_disable(struct drm_i915_private *dev_priv,
351 struct i915_power_well *power_well)326 struct i915_power_well *power_well)
352{327{
353 enum i915_power_well_id id = power_well->id;328 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
329 int pw_idx = power_well->desc->hsw.idx;
354 bool disabled;330 bool disabled;
355 u32 reqs;331 u32 reqs;
356 332
@@ -363,14 +339,14 @@ static void hsw_wait_for_power_well_disable(struct drm_i915_private *dev_priv, · 6 unmodified lines
363 * Skip the wait in case any of the request bits are set and print a339 * Skip the wait in case any of the request bits are set and print a
364 * diagnostic message.340 * diagnostic message.
365 */341 */
366 wait_for((disabled = !(I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) &342 wait_for((disabled = !(I915_READ(regs->driver) &
367 HSW_PWR_WELL_CTL_STATE(id))) ||343 HSW_PWR_WELL_CTL_STATE(pw_idx))) ||
368 (reqs = hsw_power_well_requesters(dev_priv, id)), 1);344 (reqs = hsw_power_well_requesters(dev_priv, regs, pw_idx)), 1);
369 if (disabled)345 if (disabled)
370 return;346 return;
371 347
372 DRM_DEBUG_KMS("%s forced on (bios:%d driver:%d kvmr:%d debug:%d)\n",348 DRM_DEBUG_KMS("%s forced on (bios:%d driver:%d kvmr:%d debug:%d)\n",
373 power_well->name,349 power_well->desc->name,
374 !!(reqs & 1), !!(reqs & 2), !!(reqs & 4), !!(reqs & 8));350 !!(reqs & 1), !!(reqs & 2), !!(reqs & 4), !!(reqs & 8));
375}351}
376 352
@@ -386,14 +362,15 @@ static void gen9_wait_for_power_well_fuses(struct drm_i915_private *dev_priv, · 9 unmodified lines
386static void hsw_power_well_enable(struct drm_i915_private *dev_priv,362static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
387 struct i915_power_well *power_well)363 struct i915_power_well *power_well)
388{364{
389 enum i915_power_well_id id = power_well->id;365 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
390 bool wait_fuses = power_well->hsw.has_fuses;366 int pw_idx = power_well->desc->hsw.idx;
367 bool wait_fuses = power_well->desc->hsw.has_fuses;
391 enum skl_power_gate uninitialized_var(pg);368 enum skl_power_gate uninitialized_var(pg);
392 u32 val;369 u32 val;
393 370
394 if (wait_fuses) {371 if (wait_fuses) {
395 pg = INTEL_GEN(dev_priv) >= 11 ? ICL_PW_TO_PG(id) :372 pg = INTEL_GEN(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
396 SKL_PW_TO_PG(id);373 SKL_PW_CTL_IDX_TO_PG(pw_idx);
397 /*374 /*
398 * For PW1 we have to wait both for the PW0/PG0 fuse state375 * For PW1 we have to wait both for the PW0/PG0 fuse state
399 * before enabling the power well and PW1/PG1's own fuse376 * before enabling the power well and PW1/PG1's own fuse
@@ -405,52 +382,55 @@ static void hsw_power_well_enable(struct drm_i915_private *dev_priv, · 5 unmodified lines
405 gen9_wait_for_power_well_fuses(dev_priv, SKL_PG0);382 gen9_wait_for_power_well_fuses(dev_priv, SKL_PG0);
406 }383 }
407 384
408 val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id));385 val = I915_READ(regs->driver);
409 I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), val | HSW_PWR_WELL_CTL_REQ(id));386 I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
410 hsw_wait_for_power_well_enable(dev_priv, power_well);387 hsw_wait_for_power_well_enable(dev_priv, power_well);
411 388
412 /* Display WA #1178: cnl */389 /* Display WA #1178: cnl */
413 if (IS_CANNONLAKE(dev_priv) &&390 if (IS_CANNONLAKE(dev_priv) &&
414 (id == CNL_DISP_PW_AUX_B || id == CNL_DISP_PW_AUX_C ||391 pw_idx >= GLK_PW_CTL_IDX_AUX_B &&
415 id == CNL_DISP_PW_AUX_D || id == CNL_DISP_PW_AUX_F)) {392 pw_idx <= CNL_PW_CTL_IDX_AUX_F) {
416 val = I915_READ(CNL_AUX_ANAOVRD1(id));393 val = I915_READ(CNL_AUX_ANAOVRD1(pw_idx));
417 val |= CNL_AUX_ANAOVRD1_ENABLE | CNL_AUX_ANAOVRD1_LDO_BYPASS;394 val |= CNL_AUX_ANAOVRD1_ENABLE | CNL_AUX_ANAOVRD1_LDO_BYPASS;
418 I915_WRITE(CNL_AUX_ANAOVRD1(id), val);395 I915_WRITE(CNL_AUX_ANAOVRD1(pw_idx), val);
419 }396 }
420 397
421 if (wait_fuses)398 if (wait_fuses)
422 gen9_wait_for_power_well_fuses(dev_priv, pg);399 gen9_wait_for_power_well_fuses(dev_priv, pg);
423 400
424 hsw_power_well_post_enable(dev_priv, power_well->hsw.irq_pipe_mask,401 hsw_power_well_post_enable(dev_priv,
425 power_well->hsw.has_vga);402 power_well->desc->hsw.irq_pipe_mask,
403 power_well->desc->hsw.has_vga);
426}404}
427 405
428static void hsw_power_well_disable(struct drm_i915_private *dev_priv,406static void hsw_power_well_disable(struct drm_i915_private *dev_priv,
429 struct i915_power_well *power_well)407 struct i915_power_well *power_well)
430{408{
431 enum i915_power_well_id id = power_well->id;409 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
410 int pw_idx = power_well->desc->hsw.idx;
432 u32 val;411 u32 val;
433 412
434 hsw_power_well_pre_disable(dev_priv, power_well->hsw.irq_pipe_mask);413 hsw_power_well_pre_disable(dev_priv,
414 power_well->desc->hsw.irq_pipe_mask);
435 415
436 val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id));416 val = I915_READ(regs->driver);
437 I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id),417 I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
438 val & ~HSW_PWR_WELL_CTL_REQ(id));
439 hsw_wait_for_power_well_disable(dev_priv, power_well);418 hsw_wait_for_power_well_disable(dev_priv, power_well);
440}419}
441 420
442#define ICL_AUX_PW_TO_PORT(pw) ((pw) - ICL_DISP_PW_AUX_A)421#define ICL_AUX_PW_TO_PORT(pw_idx) ((pw_idx) - ICL_PW_CTL_IDX_AUX_A)
443 422
444static void423static void
445icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,424icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
446 struct i915_power_well *power_well)425 struct i915_power_well *power_well)
447{426{
448 enum i915_power_well_id id = power_well->id;427 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
449 enum port port = ICL_AUX_PW_TO_PORT(id);428 int pw_idx = power_well->desc->hsw.idx;
429 enum port port = ICL_AUX_PW_TO_PORT(pw_idx);
450 u32 val;430 u32 val;
451 431
452 val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id));432 val = I915_READ(regs->driver);
453 I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), val | HSW_PWR_WELL_CTL_REQ(id));433 I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
454 434
455 val = I915_READ(ICL_PORT_CL_DW12(port));435 val = I915_READ(ICL_PORT_CL_DW12(port));
456 I915_WRITE(ICL_PORT_CL_DW12(port), val | ICL_LANE_ENABLE_AUX);436 I915_WRITE(ICL_PORT_CL_DW12(port), val | ICL_LANE_ENABLE_AUX);
@@ -462,16 +442,16 @@ static void · 5 unmodified lines
462icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,442icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
463 struct i915_power_well *power_well)443 struct i915_power_well *power_well)
464{444{
465 enum i915_power_well_id id = power_well->id;445 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
466 enum port port = ICL_AUX_PW_TO_PORT(id);446 int pw_idx = power_well->desc->hsw.idx;
447 enum port port = ICL_AUX_PW_TO_PORT(pw_idx);
467 u32 val;448 u32 val;
468 449
469 val = I915_READ(ICL_PORT_CL_DW12(port));450 val = I915_READ(ICL_PORT_CL_DW12(port));
470 I915_WRITE(ICL_PORT_CL_DW12(port), val & ~ICL_LANE_ENABLE_AUX);451 I915_WRITE(ICL_PORT_CL_DW12(port), val & ~ICL_LANE_ENABLE_AUX);
471 452
472 val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id));453 val = I915_READ(regs->driver);
473 I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id),454 I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
474 val & ~HSW_PWR_WELL_CTL_REQ(id));
475 455
476 hsw_wait_for_power_well_disable(dev_priv, power_well);456 hsw_wait_for_power_well_disable(dev_priv, power_well);
477}457}
@@ -484,22 +464,22 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv, · 6 unmodified lines
484static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,464static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
485 struct i915_power_well *power_well)465 struct i915_power_well *power_well)
486{466{
487 enum i915_power_well_id id = power_well->id;467 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
488 u32 mask = HSW_PWR_WELL_CTL_REQ(id) | HSW_PWR_WELL_CTL_STATE(id);468 int pw_idx = power_well->desc->hsw.idx;
469 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx) |
470 HSW_PWR_WELL_CTL_STATE(pw_idx);
489 471
490 return (I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & mask) == mask;472 return (I915_READ(regs->driver) & mask) == mask;
491}473}
492 474
493static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)475static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)
494{476{
495 enum i915_power_well_id id = SKL_DISP_PW_2;
496
497 WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9),477 WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9),
498 "DC9 already programmed to be enabled.\n");478 "DC9 already programmed to be enabled.\n");
499 WARN_ONCE(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,479 WARN_ONCE(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,
500 "DC5 still not disabled to enable DC9.\n");480 "DC5 still not disabled to enable DC9.\n");
501 WARN_ONCE(I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) &481 WARN_ONCE(I915_READ(HSW_PWR_WELL_CTL2) &
502 HSW_PWR_WELL_CTL_REQ(id),482 HSW_PWR_WELL_CTL_REQ(SKL_PW_CTL_IDX_PW_2),
503 "Power well 2 on.\n");483 "Power well 2 on.\n");
504 WARN_ONCE(intel_irqs_enabled(dev_priv),484 WARN_ONCE(intel_irqs_enabled(dev_priv),
505 "Interrupts not disabled yet.\n");485 "Interrupts not disabled yet.\n");
@@ -668,6 +648,27 @@ static void assert_csr_loaded(struct drm_i915_private *dev_priv) · 162 unmodified lines
668 WARN_ONCE(!I915_READ(CSR_HTP_SKL), "CSR HTP Not fine\n");648 WARN_ONCE(!I915_READ(CSR_HTP_SKL), "CSR HTP Not fine\n");
669}649}
670 650
651static struct i915_power_well *
652lookup_power_well(struct drm_i915_private *dev_priv,
653 enum i915_power_well_id power_well_id)
654{
655 struct i915_power_well *power_well;
656
657 for_each_power_well(dev_priv, power_well)
658 if (power_well->desc->id == power_well_id)
659 return power_well;
660
661 /*
662 * It's not feasible to add error checking code to the callers since
663 * this condition really shouldn't happen and it doesn't even make sense
664 * to abort things like display initialization sequences. Just return
665 * the first power well and hope the WARN gets reported so we can fix
666 * our driver.
667 */
668 WARN(1, "Power well %d not defined for this platform\n", power_well_id);
669 return &dev_priv->power_domains.power_wells[0];
670}
671
671static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)672static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
672{673{
673 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,674 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
@@ -723,54 +724,57 @@ static void skl_enable_dc6(struct drm_i915_private *dev_priv) · 49 unmodified lines
723static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,724static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,
724 struct i915_power_well *power_well)725 struct i915_power_well *power_well)
725{726{
726 enum i915_power_well_id id = power_well->id;727 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
727 u32 mask = HSW_PWR_WELL_CTL_REQ(id);728 int pw_idx = power_well->desc->hsw.idx;
728 u32 bios_req = I915_READ(HSW_PWR_WELL_CTL_BIOS(id));729 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx);
730 u32 bios_req = I915_READ(regs->bios);
729 731
730 /* Take over the request bit if set by BIOS. */732 /* Take over the request bit if set by BIOS. */
731 if (bios_req & mask) {733 if (bios_req & mask) {
732 u32 drv_req = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id));734 u32 drv_req = I915_READ(regs->driver);
733 735
734 if (!(drv_req & mask))736 if (!(drv_req & mask))
735 I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), drv_req | mask);737 I915_WRITE(regs->driver, drv_req | mask);
736 I915_WRITE(HSW_PWR_WELL_CTL_BIOS(id), bios_req & ~mask);738 I915_WRITE(regs->bios, bios_req & ~mask);
737 }739 }
738}740}
739 741
740static void bxt_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,742static void bxt_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
741 struct i915_power_well *power_well)743 struct i915_power_well *power_well)
742{744{
743 bxt_ddi_phy_init(dev_priv, power_well->bxt.phy);745 bxt_ddi_phy_init(dev_priv, power_well->desc->bxt.phy);
744}746}
745 747
746static void bxt_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,748static void bxt_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
747 struct i915_power_well *power_well)749 struct i915_power_well *power_well)
748{750{
749 bxt_ddi_phy_uninit(dev_priv, power_well->bxt.phy);751 bxt_ddi_phy_uninit(dev_priv, power_well->desc->bxt.phy);
750}752}
751 753
752static bool bxt_dpio_cmn_power_well_enabled(struct drm_i915_private *dev_priv,754static bool bxt_dpio_cmn_power_well_enabled(struct drm_i915_private *dev_priv,
753 struct i915_power_well *power_well)755 struct i915_power_well *power_well)
754{756{
755 return bxt_ddi_phy_is_enabled(dev_priv, power_well->bxt.phy);757 return bxt_ddi_phy_is_enabled(dev_priv, power_well->desc->bxt.phy);
756}758}
757 759
758static void bxt_verify_ddi_phy_power_wells(struct drm_i915_private *dev_priv)760static void bxt_verify_ddi_phy_power_wells(struct drm_i915_private *dev_priv)
759{761{
760 struct i915_power_well *power_well;762 struct i915_power_well *power_well;
761 763
762 power_well = lookup_power_well(dev_priv, BXT_DPIO_CMN_A);764 power_well = lookup_power_well(dev_priv, BXT_DISP_PW_DPIO_CMN_A);
763 if (power_well->count > 0)765 if (power_well->count > 0)
764 bxt_ddi_phy_verify_state(dev_priv, power_well->bxt.phy);766 bxt_ddi_phy_verify_state(dev_priv, power_well->desc->bxt.phy);
765 767
766 power_well = lookup_power_well(dev_priv, BXT_DPIO_CMN_BC);768 power_well = lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
767 if (power_well->count > 0)769 if (power_well->count > 0)
768 bxt_ddi_phy_verify_state(dev_priv, power_well->bxt.phy);770 bxt_ddi_phy_verify_state(dev_priv, power_well->desc->bxt.phy);
769 771
770 if (IS_GEMINILAKE(dev_priv)) {772 if (IS_GEMINILAKE(dev_priv)) {
771 power_well = lookup_power_well(dev_priv, GLK_DPIO_CMN_C);773 power_well = lookup_power_well(dev_priv,
774 GLK_DISP_PW_DPIO_CMN_C);
772 if (power_well->count > 0)775 if (power_well->count > 0)
773 bxt_ddi_phy_verify_state(dev_priv, power_well->bxt.phy);776 bxt_ddi_phy_verify_state(dev_priv,
777 power_well->desc->bxt.phy);
774 }778 }
775}779}
776 780
@@ -869,14 +873,14 @@ static void i830_pipes_power_well_sync_hw(struct drm_i915_private *dev_priv, · 92 unmodified lines
869static void vlv_set_power_well(struct drm_i915_private *dev_priv,873static void vlv_set_power_well(struct drm_i915_private *dev_priv,
870 struct i915_power_well *power_well, bool enable)874 struct i915_power_well *power_well, bool enable)
871{875{
872 enum i915_power_well_id power_well_id = power_well->id;876 int pw_idx = power_well->desc->vlv.idx;
873 u32 mask;877 u32 mask;
874 u32 state;878 u32 state;
875 u32 ctrl;879 u32 ctrl;
876 880
877 mask = PUNIT_PWRGT_MASK(power_well_id);881 mask = PUNIT_PWRGT_MASK(pw_idx);
878 state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) :882 state = enable ? PUNIT_PWRGT_PWR_ON(pw_idx) :
879 PUNIT_PWRGT_PWR_GATE(power_well_id);883 PUNIT_PWRGT_PWR_GATE(pw_idx);
880 884
881 mutex_lock(&dev_priv->pcu_lock);885 mutex_lock(&dev_priv->pcu_lock);
882 886
@@ -917,14 +921,14 @@ static void vlv_power_well_disable(struct drm_i915_private *dev_priv, · 34 unmodified lines
917static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv,921static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv,
918 struct i915_power_well *power_well)922 struct i915_power_well *power_well)
919{923{
920 enum i915_power_well_id power_well_id = power_well->id;924 int pw_idx = power_well->desc->vlv.idx;
921 bool enabled = false;925 bool enabled = false;
922 u32 mask;926 u32 mask;
923 u32 state;927 u32 state;
924 u32 ctrl;928 u32 ctrl;
925 929
926 mask = PUNIT_PWRGT_MASK(power_well_id);930 mask = PUNIT_PWRGT_MASK(pw_idx);
927 ctrl = PUNIT_PWRGT_PWR_ON(power_well_id);931 ctrl = PUNIT_PWRGT_PWR_ON(pw_idx);
928 932
929 mutex_lock(&dev_priv->pcu_lock);933 mutex_lock(&dev_priv->pcu_lock);
930 934
@@ -933,8 +937,8 @@ static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv, · 2 unmodified lines
933 * We only ever set the power-on and power-gate states, anything937 * We only ever set the power-on and power-gate states, anything
934 * else is unexpected.938 * else is unexpected.
935 */939 */
936 WARN_ON(state != PUNIT_PWRGT_PWR_ON(power_well_id) &&940 WARN_ON(state != PUNIT_PWRGT_PWR_ON(pw_idx) &&
937 state != PUNIT_PWRGT_PWR_GATE(power_well_id));941 state != PUNIT_PWRGT_PWR_GATE(pw_idx));
938 if (state == ctrl)942 if (state == ctrl)
939 enabled = true;943 enabled = true;
940 944
@@ -1045,8 +1049,6 @@ static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv) · 104 unmodified lines
1045static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,1049static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,
1046 struct i915_power_well *power_well)1050 struct i915_power_well *power_well)
1047{1051{
1048 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DISP2D);
1049
1050 vlv_set_power_well(dev_priv, power_well, true);1052 vlv_set_power_well(dev_priv, power_well, true);
1051 1053
1052 vlv_display_power_well_init(dev_priv);1054 vlv_display_power_well_init(dev_priv);
@@ -1055,8 +1057,6 @@ static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, · 2 unmodified lines
1055static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv,1057static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv,
1056 struct i915_power_well *power_well)1058 struct i915_power_well *power_well)
1057{1059{
1058 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DISP2D);
1059
1060 vlv_display_power_well_deinit(dev_priv);1060 vlv_display_power_well_deinit(dev_priv);
1061 1061
1062 vlv_set_power_well(dev_priv, power_well, false);1062 vlv_set_power_well(dev_priv, power_well, false);
@@ -1065,8 +1065,6 @@ static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv, · 2 unmodified lines
1065static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,1065static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
1066 struct i915_power_well *power_well)1066 struct i915_power_well *power_well)
1067{1067{
1068 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DPIO_CMN_BC);
1069
1070 /* since ref/cri clock was enabled */1068 /* since ref/cri clock was enabled */
1071 udelay(1); /* >10ns for cmnreset, >0ns for sidereset */1069 udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
1072 1070
@@ -1091,8 +1089,6 @@ static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, · 18 unmodified lines
1091{1089{
1092 enum pipe pipe;1090 enum pipe pipe;
1093 1091
1094 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DPIO_CMN_BC);
1095
1096 for_each_pipe(dev_priv, pipe)1092 for_each_pipe(dev_priv, pipe)
1097 assert_pll_disabled(dev_priv, pipe);1093 assert_pll_disabled(dev_priv, pipe);
1098 1094
@@ -1104,32 +1100,14 @@ static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, · 5 unmodified lines
1104 1100
1105#define POWER_DOMAIN_MASK (GENMASK_ULL(POWER_DOMAIN_NUM - 1, 0))1101#define POWER_DOMAIN_MASK (GENMASK_ULL(POWER_DOMAIN_NUM - 1, 0))
1106 1102
1107static struct i915_power_well *
1108lookup_power_well(struct drm_i915_private *dev_priv,
1109 enum i915_power_well_id power_well_id)
1110{
1111 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1112 int i;
1113
1114 for (i = 0; i < power_domains->power_well_count; i++) {
1115 struct i915_power_well *power_well;
1116
1117 power_well = &power_domains->power_wells[i];
1118 if (power_well->id == power_well_id)
1119 return power_well;
1120 }
1121
1122 return NULL;
1123}
1124
1125#define BITS_SET(val, bits) (((val) & (bits)) == (bits))1103#define BITS_SET(val, bits) (((val) & (bits)) == (bits))
1126 1104
1127static void assert_chv_phy_status(struct drm_i915_private *dev_priv)1105static void assert_chv_phy_status(struct drm_i915_private *dev_priv)
1128{1106{
1129 struct i915_power_well *cmn_bc =1107 struct i915_power_well *cmn_bc =
1130 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC);1108 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
1131 struct i915_power_well *cmn_d =1109 struct i915_power_well *cmn_d =
1132 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_D);1110 lookup_power_well(dev_priv, CHV_DISP_PW_DPIO_CMN_D);
1133 u32 phy_control = dev_priv->chv_phy_control;1111 u32 phy_control = dev_priv->chv_phy_control;
1134 u32 phy_status = 0;1112 u32 phy_status = 0;
1135 u32 phy_status_mask = 0xffffffff;1113 u32 phy_status_mask = 0xffffffff;
@@ -1154,7 +1132,7 @@ static void assert_chv_phy_status(struct drm_i915_private *dev_priv) · 18 unmodified lines
1154 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 0) |1132 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 0) |
1155 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 1));1133 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 1));
1156 1134
1157 if (cmn_bc->ops->is_enabled(dev_priv, cmn_bc)) {1135 if (cmn_bc->desc->ops->is_enabled(dev_priv, cmn_bc)) {
1158 phy_status |= PHY_POWERGOOD(DPIO_PHY0);1136 phy_status |= PHY_POWERGOOD(DPIO_PHY0);
1159 1137
1160 /* this assumes override is only used to enable lanes */1138 /* this assumes override is only used to enable lanes */
@@ -1195,7 +1173,7 @@ static void assert_chv_phy_status(struct drm_i915_private *dev_priv) · 34 unmodified lines
1195 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 1);1173 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 1);
1196 }1174 }
1197 1175
1198 if (cmn_d->ops->is_enabled(dev_priv, cmn_d)) {1176 if (cmn_d->desc->ops->is_enabled(dev_priv, cmn_d)) {
1199 phy_status |= PHY_POWERGOOD(DPIO_PHY1);1177 phy_status |= PHY_POWERGOOD(DPIO_PHY1);
1200 1178
1201 /* this assumes override is only used to enable lanes */1179 /* this assumes override is only used to enable lanes */
@@ -1239,10 +1217,10 @@ static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, · 37 unmodified lines
1239 enum pipe pipe;1217 enum pipe pipe;
1240 uint32_t tmp;1218 uint32_t tmp;
1241 1219
1242 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DPIO_CMN_BC &&1220 WARN_ON_ONCE(power_well->desc->id != VLV_DISP_PW_DPIO_CMN_BC &&
1243 power_well->id != PUNIT_POWER_WELL_DPIO_CMN_D);1221 power_well->desc->id != CHV_DISP_PW_DPIO_CMN_D);
1244 1222
1245 if (power_well->id == PUNIT_POWER_WELL_DPIO_CMN_BC) {1223 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1246 pipe = PIPE_A;1224 pipe = PIPE_A;
1247 phy = DPIO_PHY0;1225 phy = DPIO_PHY0;
1248 } else {1226 } else {
@@ -1270,7 +1248,7 @@ static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, · 21 unmodified lines
1270 DPIO_SUS_CLK_CONFIG_GATE_CLKREQ;1248 DPIO_SUS_CLK_CONFIG_GATE_CLKREQ;
1271 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW28, tmp);1249 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW28, tmp);
1272 1250
1273 if (power_well->id == PUNIT_POWER_WELL_DPIO_CMN_BC) {1251 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1274 tmp = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW6_CH1);1252 tmp = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW6_CH1);
1275 tmp |= DPIO_DYNPWRDOWNEN_CH1;1253 tmp |= DPIO_DYNPWRDOWNEN_CH1;
1276 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW6_CH1, tmp);1254 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW6_CH1, tmp);
@@ -1301,10 +1279,10 @@ static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, · 24 unmodified lines
1301{1279{
1302 enum dpio_phy phy;1280 enum dpio_phy phy;
1303 1281
1304 WARN_ON_ONCE(power_well->id != PUNIT_POWER_WELL_DPIO_CMN_BC &&1282 WARN_ON_ONCE(power_well->desc->id != VLV_DISP_PW_DPIO_CMN_BC &&
1305 power_well->id != PUNIT_POWER_WELL_DPIO_CMN_D);1283 power_well->desc->id != CHV_DISP_PW_DPIO_CMN_D);
1306 1284
1307 if (power_well->id == PUNIT_POWER_WELL_DPIO_CMN_BC) {1285 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1308 phy = DPIO_PHY0;1286 phy = DPIO_PHY0;
1309 assert_pll_disabled(dev_priv, PIPE_A);1287 assert_pll_disabled(dev_priv, PIPE_A);
1310 assert_pll_disabled(dev_priv, PIPE_B);1288 assert_pll_disabled(dev_priv, PIPE_B);
@@ -1516,8 +1494,6 @@ out: · 205 unmodified lines
1516static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv,1494static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv,
1517 struct i915_power_well *power_well)1495 struct i915_power_well *power_well)
1518{1496{
1519 WARN_ON_ONCE(power_well->id != CHV_DISP_PW_PIPE_A);
1520
1521 chv_set_pipe_power_well(dev_priv, power_well, true);1497 chv_set_pipe_power_well(dev_priv, power_well, true);
1522 1498
1523 vlv_display_power_well_init(dev_priv);1499 vlv_display_power_well_init(dev_priv);
@@ -1526,8 +1502,6 @@ static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv, · 2 unmodified lines
1526static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,1502static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
1527 struct i915_power_well *power_well)1503 struct i915_power_well *power_well)
1528{1504{
1529 WARN_ON_ONCE(power_well->id != CHV_DISP_PW_PIPE_A);
1530
1531 vlv_display_power_well_deinit(dev_priv);1505 vlv_display_power_well_deinit(dev_priv);
1532 1506
1533 chv_set_pipe_power_well(dev_priv, power_well, false);1507 chv_set_pipe_power_well(dev_priv, power_well, false);
@@ -2063,13 +2037,13 @@ static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = { · 529 unmodified lines
2063 .is_enabled = vlv_power_well_enabled,2037 .is_enabled = vlv_power_well_enabled,
2064};2038};
2065 2039
2066static struct i915_power_well i9xx_always_on_power_well[] = {2040static const struct i915_power_well_desc i9xx_always_on_power_well[] = {
2067 {2041 {
2068 .name = "always-on",2042 .name = "always-on",
2069 .always_on = 1,2043 .always_on = 1,
2070 .domains = POWER_DOMAIN_MASK,2044 .domains = POWER_DOMAIN_MASK,
2071 .ops = &i9xx_always_on_power_well_ops,2045 .ops = &i9xx_always_on_power_well_ops,
2072 .id = I915_DISP_PW_ALWAYS_ON,2046 .id = DISP_PW_ID_NONE,
2073 },2047 },
2074};2048};
2075 2049
@@ -2080,19 +2054,19 @@ static const struct i915_power_well_ops i830_pipes_power_well_ops = { · 4 unmodified lines
2080 .is_enabled = i830_pipes_power_well_enabled,2054 .is_enabled = i830_pipes_power_well_enabled,
2081};2055};
2082 2056
2083static struct i915_power_well i830_power_wells[] = {2057static const struct i915_power_well_desc i830_power_wells[] = {
2084 {2058 {
2085 .name = "always-on",2059 .name = "always-on",
2086 .always_on = 1,2060 .always_on = 1,
2087 .domains = POWER_DOMAIN_MASK,2061 .domains = POWER_DOMAIN_MASK,
2088 .ops = &i9xx_always_on_power_well_ops,2062 .ops = &i9xx_always_on_power_well_ops,
2089 .id = I915_DISP_PW_ALWAYS_ON,2063 .id = DISP_PW_ID_NONE,
2090 },2064 },
2091 {2065 {
2092 .name = "pipes",2066 .name = "pipes",
2093 .domains = I830_PIPES_POWER_DOMAINS,2067 .domains = I830_PIPES_POWER_DOMAINS,
2094 .ops = &i830_pipes_power_well_ops,2068 .ops = &i830_pipes_power_well_ops,
2095 .id = I830_DISP_PW_PIPES,2069 .id = DISP_PW_ID_NONE,
2096 },2070 },
2097};2071};
2098 2072
@@ -2117,13 +2091,20 @@ static const struct i915_power_well_ops bxt_dpio_cmn_power_well_ops = { · 18 unmodified lines
2117 .is_enabled = bxt_dpio_cmn_power_well_enabled,2091 .is_enabled = bxt_dpio_cmn_power_well_enabled,
2118};2092};
2119 2093
2120static struct i915_power_well hsw_power_wells[] = {2094static const struct i915_power_well_regs hsw_power_well_regs = {
2095 .bios = HSW_PWR_WELL_CTL1,
2096 .driver = HSW_PWR_WELL_CTL2,
2097 .kvmr = HSW_PWR_WELL_CTL3,
2098 .debug = HSW_PWR_WELL_CTL4,
2099};
2100
2101static const struct i915_power_well_desc hsw_power_wells[] = {
2121 {2102 {
2122 .name = "always-on",2103 .name = "always-on",
2123 .always_on = 1,2104 .always_on = 1,
2124 .domains = POWER_DOMAIN_MASK,2105 .domains = POWER_DOMAIN_MASK,
2125 .ops = &i9xx_always_on_power_well_ops,2106 .ops = &i9xx_always_on_power_well_ops,
2126 .id = I915_DISP_PW_ALWAYS_ON,2107 .id = DISP_PW_ID_NONE,
2127 },2108 },
2128 {2109 {
2129 .name = "display",2110 .name = "display",
@@ -2131,18 +2112,20 @@ static struct i915_power_well hsw_power_wells[] = { · 1 unmodified line
2131 .ops = &hsw_power_well_ops,2112 .ops = &hsw_power_well_ops,
2132 .id = HSW_DISP_PW_GLOBAL,2113 .id = HSW_DISP_PW_GLOBAL,
2133 {2114 {
2115 .hsw.regs = &hsw_power_well_regs,
2116 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
2134 .hsw.has_vga = true,2117 .hsw.has_vga = true,
2135 },2118 },
2136 },2119 },
2137};2120};
2138 2121
2139static struct i915_power_well bdw_power_wells[] = {2122static const struct i915_power_well_desc bdw_power_wells[] = {
2140 {2123 {
2141 .name = "always-on",2124 .name = "always-on",
2142 .always_on = 1,2125 .always_on = 1,
2143 .domains = POWER_DOMAIN_MASK,2126 .domains = POWER_DOMAIN_MASK,
2144 .ops = &i9xx_always_on_power_well_ops,2127 .ops = &i9xx_always_on_power_well_ops,
2145 .id = I915_DISP_PW_ALWAYS_ON,2128 .id = DISP_PW_ID_NONE,
2146 },2129 },
2147 {2130 {
2148 .name = "display",2131 .name = "display",
@@ -2150,6 +2133,8 @@ static struct i915_power_well bdw_power_wells[] = { · 1 unmodified line
2150 .ops = &hsw_power_well_ops,2133 .ops = &hsw_power_well_ops,
2151 .id = HSW_DISP_PW_GLOBAL,2134 .id = HSW_DISP_PW_GLOBAL,
2152 {2135 {
2136 .hsw.regs = &hsw_power_well_regs,
2137 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
2153 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),2138 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2154 .hsw.has_vga = true,2139 .hsw.has_vga = true,
2155 },2140 },
@@ -2177,19 +2162,22 @@ static const struct i915_power_well_ops vlv_dpio_power_well_ops = { · 21 unmodified lines
2177 .is_enabled = vlv_power_well_enabled,2162 .is_enabled = vlv_power_well_enabled,
2178};2163};
2179 2164
2180static struct i915_power_well vlv_power_wells[] = {2165static const struct i915_power_well_desc vlv_power_wells[] = {
2181 {2166 {
2182 .name = "always-on",2167 .name = "always-on",
2183 .always_on = 1,2168 .always_on = 1,
2184 .domains = POWER_DOMAIN_MASK,2169 .domains = POWER_DOMAIN_MASK,
2185 .ops = &i9xx_always_on_power_well_ops,2170 .ops = &i9xx_always_on_power_well_ops,
2186 .id = I915_DISP_PW_ALWAYS_ON,2171 .id = DISP_PW_ID_NONE,
2187 },2172 },
2188 {2173 {
2189 .name = "display",2174 .name = "display",
2190 .domains = VLV_DISPLAY_POWER_DOMAINS,2175 .domains = VLV_DISPLAY_POWER_DOMAINS,
2191 .id = PUNIT_POWER_WELL_DISP2D,
2192 .ops = &vlv_display_power_well_ops,2176 .ops = &vlv_display_power_well_ops,
2177 .id = VLV_DISP_PW_DISP2D,
2178 {
2179 .vlv.idx = PUNIT_PWGT_IDX_DISP2D,
2180 },
2193 },2181 },
2194 {2182 {
2195 .name = "dpio-tx-b-01",2183 .name = "dpio-tx-b-01",
@@ -2198,7 +2186,10 @@ static struct i915_power_well vlv_power_wells[] = { · 2 unmodified lines
2198 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |2186 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2199 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,2187 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2200 .ops = &vlv_dpio_power_well_ops,2188 .ops = &vlv_dpio_power_well_ops,
2201 .id = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01,2189 .id = DISP_PW_ID_NONE,
2190 {
2191 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01,
2192 },
2202 },2193 },
2203 {2194 {
2204 .name = "dpio-tx-b-23",2195 .name = "dpio-tx-b-23",
@@ -2207,7 +2198,10 @@ static struct i915_power_well vlv_power_wells[] = { · 2 unmodified lines
2207 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |2198 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2208 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,2199 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2209 .ops = &vlv_dpio_power_well_ops,2200 .ops = &vlv_dpio_power_well_ops,
2210 .id = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23,2201 .id = DISP_PW_ID_NONE,
2202 {
2203 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23,
2204 },
2211 },2205 },
2212 {2206 {
2213 .name = "dpio-tx-c-01",2207 .name = "dpio-tx-c-01",
@@ -2216,7 +2210,10 @@ static struct i915_power_well vlv_power_wells[] = { · 2 unmodified lines
2216 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |2210 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2217 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,2211 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2218 .ops = &vlv_dpio_power_well_ops,2212 .ops = &vlv_dpio_power_well_ops,
2219 .id = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01,2213 .id = DISP_PW_ID_NONE,
2214 {
2215 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01,
2216 },
2220 },2217 },
2221 {2218 {
2222 .name = "dpio-tx-c-23",2219 .name = "dpio-tx-c-23",
@@ -2225,23 +2222,29 @@ static struct i915_power_well vlv_power_wells[] = { · 2 unmodified lines
2225 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |2222 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2226 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,2223 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2227 .ops = &vlv_dpio_power_well_ops,2224 .ops = &vlv_dpio_power_well_ops,
2228 .id = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,2225 .id = DISP_PW_ID_NONE,
2226 {
2227 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23,
2228 },
2229 },2229 },
2230 {2230 {
2231 .name = "dpio-common",2231 .name = "dpio-common",
2232 .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,2232 .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
2233 .id = PUNIT_POWER_WELL_DPIO_CMN_BC,
2234 .ops = &vlv_dpio_cmn_power_well_ops,2233 .ops = &vlv_dpio_cmn_power_well_ops,
2234 .id = VLV_DISP_PW_DPIO_CMN_BC,
2235 {
2236 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
2237 },
2235 },2238 },
2236};2239};
2237 2240
2238static struct i915_power_well chv_power_wells[] = {2241static const struct i915_power_well_desc chv_power_wells[] = {
2239 {2242 {
2240 .name = "always-on",2243 .name = "always-on",
2241 .always_on = 1,2244 .always_on = 1,
2242 .domains = POWER_DOMAIN_MASK,2245 .domains = POWER_DOMAIN_MASK,
2243 .ops = &i9xx_always_on_power_well_ops,2246 .ops = &i9xx_always_on_power_well_ops,
2244 .id = I915_DISP_PW_ALWAYS_ON,2247 .id = DISP_PW_ID_NONE,
2245 },2248 },
2246 {2249 {
2247 .name = "display",2250 .name = "display",
@@ -2251,20 +2254,26 @@ static struct i915_power_well chv_power_wells[] = { · 3 unmodified lines
2251 * required for any pipe to work.2254 * required for any pipe to work.
2252 */2255 */
2253 .domains = CHV_DISPLAY_POWER_DOMAINS,2256 .domains = CHV_DISPLAY_POWER_DOMAINS,
2254 .id = CHV_DISP_PW_PIPE_A,
2255 .ops = &chv_pipe_power_well_ops,2257 .ops = &chv_pipe_power_well_ops,
2258 .id = DISP_PW_ID_NONE,
2256 },2259 },
2257 {2260 {
2258 .name = "dpio-common-bc",2261 .name = "dpio-common-bc",
2259 .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,2262 .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
2260 .id = PUNIT_POWER_WELL_DPIO_CMN_BC,
2261 .ops = &chv_dpio_cmn_power_well_ops,2263 .ops = &chv_dpio_cmn_power_well_ops,
2264 .id = VLV_DISP_PW_DPIO_CMN_BC,
2265 {
2266 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
2267 },
2262 },2268 },
2263 {2269 {
2264 .name = "dpio-common-d",2270 .name = "dpio-common-d",
2265 .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,2271 .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,
2266 .id = PUNIT_POWER_WELL_DPIO_CMN_D,
2267 .ops = &chv_dpio_cmn_power_well_ops,2272 .ops = &chv_dpio_cmn_power_well_ops,
2273 .id = CHV_DISP_PW_DPIO_CMN_D,
2274 {
2275 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D,
2276 },
2268 },2277 },
2269};2278};
2270 2279
@@ -2275,18 +2284,18 @@ bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, · 4 unmodified lines
2275 bool ret;2284 bool ret;
2276 2285
2277 power_well = lookup_power_well(dev_priv, power_well_id);2286 power_well = lookup_power_well(dev_priv, power_well_id);
2278 ret = power_well->ops->is_enabled(dev_priv, power_well);2287 ret = power_well->desc->ops->is_enabled(dev_priv, power_well);
2279 2288
2280 return ret;2289 return ret;
2281}2290}
2282 2291
2283static struct i915_power_well skl_power_wells[] = {2292static const struct i915_power_well_desc skl_power_wells[] = {
2284 {2293 {
2285 .name = "always-on",2294 .name = "always-on",
2286 .always_on = 1,2295 .always_on = 1,
2287 .domains = POWER_DOMAIN_MASK,2296 .domains = POWER_DOMAIN_MASK,
2288 .ops = &i9xx_always_on_power_well_ops,2297 .ops = &i9xx_always_on_power_well_ops,
2289 .id = I915_DISP_PW_ALWAYS_ON,2298 .id = DISP_PW_ID_NONE,
2290 },2299 },
2291 {2300 {
2292 .name = "power well 1",2301 .name = "power well 1",
@@ -2295,6 +2304,8 @@ static struct i915_power_well skl_power_wells[] = { · 2 unmodified lines
2295 .ops = &hsw_power_well_ops,2304 .ops = &hsw_power_well_ops,
2296 .id = SKL_DISP_PW_1,2305 .id = SKL_DISP_PW_1,
2297 {2306 {
2307 .hsw.regs = &hsw_power_well_regs,
2308 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
2298 .hsw.has_fuses = true,2309 .hsw.has_fuses = true,
2299 },2310 },
2300 },2311 },
@@ -2304,12 +2315,16 @@ static struct i915_power_well skl_power_wells[] = { · 3 unmodified lines
2304 .domains = 0,2315 .domains = 0,
2305 .ops = &hsw_power_well_ops,2316 .ops = &hsw_power_well_ops,
2306 .id = SKL_DISP_PW_MISC_IO,2317 .id = SKL_DISP_PW_MISC_IO,
2318 {
2319 .hsw.regs = &hsw_power_well_regs,
2320 .hsw.idx = SKL_PW_CTL_IDX_MISC_IO,
2321 },
2307 },2322 },
2308 {2323 {
2309 .name = "DC off",2324 .name = "DC off",
2310 .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,2325 .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,
2311 .ops = &gen9_dc_off_power_well_ops,2326 .ops = &gen9_dc_off_power_well_ops,
2312 .id = SKL_DISP_PW_DC_OFF,2327 .id = DISP_PW_ID_NONE,
2313 },2328 },
2314 {2329 {
2315 .name = "power well 2",2330 .name = "power well 2",
@@ -2317,6 +2332,8 @@ static struct i915_power_well skl_power_wells[] = { · 1 unmodified line
2317 .ops = &hsw_power_well_ops,2332 .ops = &hsw_power_well_ops,
2318 .id = SKL_DISP_PW_2,2333 .id = SKL_DISP_PW_2,
2319 {2334 {
2335 .hsw.regs = &hsw_power_well_regs,
2336 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
2320 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),2337 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2321 .hsw.has_vga = true,2338 .hsw.has_vga = true,
2322 .hsw.has_fuses = true,2339 .hsw.has_fuses = true,
@@ -2326,35 +2343,51 @@ static struct i915_power_well skl_power_wells[] = { · 3 unmodified lines
2326 .name = "DDI A/E IO power well",2343 .name = "DDI A/E IO power well",
2327 .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS,2344 .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS,
2328 .ops = &hsw_power_well_ops,2345 .ops = &hsw_power_well_ops,
2329 .id = SKL_DISP_PW_DDI_A_E,2346 .id = DISP_PW_ID_NONE,
2347 {
2348 .hsw.regs = &hsw_power_well_regs,
2349 .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E,
2350 },
2330 },2351 },
2331 {2352 {
2332 .name = "DDI B IO power well",2353 .name = "DDI B IO power well",
2333 .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS,2354 .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS,
2334 .ops = &hsw_power_well_ops,2355 .ops = &hsw_power_well_ops,
2335 .id = SKL_DISP_PW_DDI_B,2356 .id = DISP_PW_ID_NONE,
2357 {
2358 .hsw.regs = &hsw_power_well_regs,
2359 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
2360 },
2336 },2361 },
2337 {2362 {
2338 .name = "DDI C IO power well",2363 .name = "DDI C IO power well",
2339 .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS,2364 .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS,
2340 .ops = &hsw_power_well_ops,2365 .ops = &hsw_power_well_ops,
2341 .id = SKL_DISP_PW_DDI_C,2366 .id = DISP_PW_ID_NONE,
2367 {
2368 .hsw.regs = &hsw_power_well_regs,
2369 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
2370 },
2342 },2371 },
2343 {2372 {
2344 .name = "DDI D IO power well",2373 .name = "DDI D IO power well",
2345 .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS,2374 .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS,
2346 .ops = &hsw_power_well_ops,2375 .ops = &hsw_power_well_ops,
2347 .id = SKL_DISP_PW_DDI_D,2376 .id = DISP_PW_ID_NONE,
2377 {
2378 .hsw.regs = &hsw_power_well_regs,
2379 .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
2380 },
2348 },2381 },
2349};2382};
2350 2383
2351static struct i915_power_well bxt_power_wells[] = {2384static const struct i915_power_well_desc bxt_power_wells[] = {
2352 {2385 {
2353 .name = "always-on",2386 .name = "always-on",
2354 .always_on = 1,2387 .always_on = 1,
2355 .domains = POWER_DOMAIN_MASK,2388 .domains = POWER_DOMAIN_MASK,
2356 .ops = &i9xx_always_on_power_well_ops,2389 .ops = &i9xx_always_on_power_well_ops,
2357 .id = I915_DISP_PW_ALWAYS_ON,2390 .id = DISP_PW_ID_NONE,
2358 },2391 },
2359 {2392 {
2360 .name = "power well 1",2393 .name = "power well 1",
@@ -2362,6 +2395,8 @@ static struct i915_power_well bxt_power_wells[] = { · 1 unmodified line
2362 .ops = &hsw_power_well_ops,2395 .ops = &hsw_power_well_ops,
2363 .id = SKL_DISP_PW_1,2396 .id = SKL_DISP_PW_1,
2364 {2397 {
2398 .hsw.regs = &hsw_power_well_regs,
2399 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
2365 .hsw.has_fuses = true,2400 .hsw.has_fuses = true,
2366 },2401 },
2367 },2402 },
@@ -2369,7 +2404,7 @@ static struct i915_power_well bxt_power_wells[] = { · 1 unmodified line
2369 .name = "DC off",2404 .name = "DC off",
2370 .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,2405 .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,
2371 .ops = &gen9_dc_off_power_well_ops,2406 .ops = &gen9_dc_off_power_well_ops,
2372 .id = SKL_DISP_PW_DC_OFF,2407 .id = DISP_PW_ID_NONE,
2373 },2408 },
2374 {2409 {
2375 .name = "power well 2",2410 .name = "power well 2",
@@ -2377,6 +2412,8 @@ static struct i915_power_well bxt_power_wells[] = { · 1 unmodified line
2377 .ops = &hsw_power_well_ops,2412 .ops = &hsw_power_well_ops,
2378 .id = SKL_DISP_PW_2,2413 .id = SKL_DISP_PW_2,
2379 {2414 {
2415 .hsw.regs = &hsw_power_well_regs,
2416 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
2380 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),2417 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2381 .hsw.has_vga = true,2418 .hsw.has_vga = true,
2382 .hsw.has_fuses = true,2419 .hsw.has_fuses = true,
@@ -2386,7 +2423,7 @@ static struct i915_power_well bxt_power_wells[] = { · 3 unmodified lines
2386 .name = "dpio-common-a",2423 .name = "dpio-common-a",
2387 .domains = BXT_DPIO_CMN_A_POWER_DOMAINS,2424 .domains = BXT_DPIO_CMN_A_POWER_DOMAINS,
2388 .ops = &bxt_dpio_cmn_power_well_ops,2425 .ops = &bxt_dpio_cmn_power_well_ops,
2389 .id = BXT_DPIO_CMN_A,2426 .id = BXT_DISP_PW_DPIO_CMN_A,
2390 {2427 {
2391 .bxt.phy = DPIO_PHY1,2428 .bxt.phy = DPIO_PHY1,
2392 },2429 },
@@ -2395,20 +2432,20 @@ static struct i915_power_well bxt_power_wells[] = { · 2 unmodified lines
2395 .name = "dpio-common-bc",2432 .name = "dpio-common-bc",
2396 .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS,2433 .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS,
2397 .ops = &bxt_dpio_cmn_power_well_ops,2434 .ops = &bxt_dpio_cmn_power_well_ops,
2398 .id = BXT_DPIO_CMN_BC,2435 .id = VLV_DISP_PW_DPIO_CMN_BC,
2399 {2436 {
2400 .bxt.phy = DPIO_PHY0,2437 .bxt.phy = DPIO_PHY0,
2401 },2438 },
2402 },2439 },
2403};2440};
2404 2441
2405static struct i915_power_well glk_power_wells[] = {2442static const struct i915_power_well_desc glk_power_wells[] = {
2406 {2443 {
2407 .name = "always-on",2444 .name = "always-on",
2408 .always_on = 1,2445 .always_on = 1,
2409 .domains = POWER_DOMAIN_MASK,2446 .domains = POWER_DOMAIN_MASK,
2410 .ops = &i9xx_always_on_power_well_ops,2447 .ops = &i9xx_always_on_power_well_ops,
2411 .id = I915_DISP_PW_ALWAYS_ON,2448 .id = DISP_PW_ID_NONE,
2412 },2449 },
2413 {2450 {
2414 .name = "power well 1",2451 .name = "power well 1",
@@ -2417,6 +2454,8 @@ static struct i915_power_well glk_power_wells[] = { · 2 unmodified lines
2417 .ops = &hsw_power_well_ops,2454 .ops = &hsw_power_well_ops,
2418 .id = SKL_DISP_PW_1,2455 .id = SKL_DISP_PW_1,
2419 {2456 {
2457 .hsw.regs = &hsw_power_well_regs,
2458 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
2420 .hsw.has_fuses = true,2459 .hsw.has_fuses = true,
2421 },2460 },
2422 },2461 },
@@ -2424,7 +2463,7 @@ static struct i915_power_well glk_power_wells[] = { · 1 unmodified line
2424 .name = "DC off",2463 .name = "DC off",
2425 .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS,2464 .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS,
2426 .ops = &gen9_dc_off_power_well_ops,2465 .ops = &gen9_dc_off_power_well_ops,
2427 .id = SKL_DISP_PW_DC_OFF,2466 .id = DISP_PW_ID_NONE,
2428 },2467 },
2429 {2468 {
2430 .name = "power well 2",2469 .name = "power well 2",
@@ -2432,6 +2471,8 @@ static struct i915_power_well glk_power_wells[] = { · 1 unmodified line
2432 .ops = &hsw_power_well_ops,2471 .ops = &hsw_power_well_ops,
2433 .id = SKL_DISP_PW_2,2472 .id = SKL_DISP_PW_2,
2434 {2473 {
2474 .hsw.regs = &hsw_power_well_regs,
2475 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
2435 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),2476 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2436 .hsw.has_vga = true,2477 .hsw.has_vga = true,
2437 .hsw.has_fuses = true,2478 .hsw.has_fuses = true,
@@ -2441,7 +2482,7 @@ static struct i915_power_well glk_power_wells[] = { · 3 unmodified lines
2441 .name = "dpio-common-a",2482 .name = "dpio-common-a",
2442 .domains = GLK_DPIO_CMN_A_POWER_DOMAINS,2483 .domains = GLK_DPIO_CMN_A_POWER_DOMAINS,
2443 .ops = &bxt_dpio_cmn_power_well_ops,2484 .ops = &bxt_dpio_cmn_power_well_ops,
2444 .id = BXT_DPIO_CMN_A,2485 .id = BXT_DISP_PW_DPIO_CMN_A,
2445 {2486 {
2446 .bxt.phy = DPIO_PHY1,2487 .bxt.phy = DPIO_PHY1,
2447 },2488 },
@@ -2450,7 +2491,7 @@ static struct i915_power_well glk_power_wells[] = { · 2 unmodified lines
2450 .name = "dpio-common-b",2491 .name = "dpio-common-b",
2451 .domains = GLK_DPIO_CMN_B_POWER_DOMAINS,2492 .domains = GLK_DPIO_CMN_B_POWER_DOMAINS,
2452 .ops = &bxt_dpio_cmn_power_well_ops,2493 .ops = &bxt_dpio_cmn_power_well_ops,
2453 .id = BXT_DPIO_CMN_BC,2494 .id = VLV_DISP_PW_DPIO_CMN_BC,
2454 {2495 {
2455 .bxt.phy = DPIO_PHY0,2496 .bxt.phy = DPIO_PHY0,
2456 },2497 },
@@ -2459,7 +2500,7 @@ static struct i915_power_well glk_power_wells[] = { · 2 unmodified lines
2459 .name = "dpio-common-c",2500 .name = "dpio-common-c",
2460 .domains = GLK_DPIO_CMN_C_POWER_DOMAINS,2501 .domains = GLK_DPIO_CMN_C_POWER_DOMAINS,
2461 .ops = &bxt_dpio_cmn_power_well_ops,2502 .ops = &bxt_dpio_cmn_power_well_ops,
2462 .id = GLK_DPIO_CMN_C,2503 .id = GLK_DISP_PW_DPIO_CMN_C,
2463 {2504 {
2464 .bxt.phy = DPIO_PHY2,2505 .bxt.phy = DPIO_PHY2,
2465 },2506 },
@@ -2468,47 +2509,71 @@ static struct i915_power_well glk_power_wells[] = { · 2 unmodified lines
2468 .name = "AUX A",2509 .name = "AUX A",
2469 .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS,2510 .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS,
2470 .ops = &hsw_power_well_ops,2511 .ops = &hsw_power_well_ops,
2471 .id = GLK_DISP_PW_AUX_A,2512 .id = DISP_PW_ID_NONE,
2513 {
2514 .hsw.regs = &hsw_power_well_regs,
2515 .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
2516 },
2472 },2517 },
2473 {2518 {
2474 .name = "AUX B",2519 .name = "AUX B",
2475 .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS,2520 .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS,
2476 .ops = &hsw_power_well_ops,2521 .ops = &hsw_power_well_ops,
2477 .id = GLK_DISP_PW_AUX_B,2522 .id = DISP_PW_ID_NONE,
2523 {
2524 .hsw.regs = &hsw_power_well_regs,
2525 .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
2526 },
2478 },2527 },
2479 {2528 {
2480 .name = "AUX C",2529 .name = "AUX C",
2481 .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS,2530 .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS,
2482 .ops = &hsw_power_well_ops,2531 .ops = &hsw_power_well_ops,
2483 .id = GLK_DISP_PW_AUX_C,2532 .id = DISP_PW_ID_NONE,
2533 {
2534 .hsw.regs = &hsw_power_well_regs,
2535 .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
2536 },
2484 },2537 },
2485 {2538 {
2486 .name = "DDI A IO power well",2539 .name = "DDI A IO power well",
2487 .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS,2540 .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS,
2488 .ops = &hsw_power_well_ops,2541 .ops = &hsw_power_well_ops,
2489 .id = GLK_DISP_PW_DDI_A,2542 .id = DISP_PW_ID_NONE,
2543 {
2544 .hsw.regs = &hsw_power_well_regs,
2545 .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
2546 },
2490 },2547 },
2491 {2548 {
2492 .name = "DDI B IO power well",2549 .name = "DDI B IO power well",
2493 .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS,2550 .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS,
2494 .ops = &hsw_power_well_ops,2551 .ops = &hsw_power_well_ops,
2495 .id = SKL_DISP_PW_DDI_B,2552 .id = DISP_PW_ID_NONE,
2553 {
2554 .hsw.regs = &hsw_power_well_regs,
2555 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
2556 },
2496 },2557 },
2497 {2558 {
2498 .name = "DDI C IO power well",2559 .name = "DDI C IO power well",
2499 .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS,2560 .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS,
2500 .ops = &hsw_power_well_ops,2561 .ops = &hsw_power_well_ops,
2501 .id = SKL_DISP_PW_DDI_C,2562 .id = DISP_PW_ID_NONE,
2563 {
2564 .hsw.regs = &hsw_power_well_regs,
2565 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
2566 },
2502 },2567 },
2503};2568};
2504 2569
2505static struct i915_power_well cnl_power_wells[] = {2570static const struct i915_power_well_desc cnl_power_wells[] = {
2506 {2571 {
2507 .name = "always-on",2572 .name = "always-on",
2508 .always_on = 1,2573 .always_on = 1,
2509 .domains = POWER_DOMAIN_MASK,2574 .domains = POWER_DOMAIN_MASK,
2510 .ops = &i9xx_always_on_power_well_ops,2575 .ops = &i9xx_always_on_power_well_ops,
2511 .id = I915_DISP_PW_ALWAYS_ON,2576 .id = DISP_PW_ID_NONE,
2512 },2577 },
2513 {2578 {
2514 .name = "power well 1",2579 .name = "power well 1",
@@ -2517,6 +2582,8 @@ static struct i915_power_well cnl_power_wells[] = { · 2 unmodified lines
2517 .ops = &hsw_power_well_ops,2582 .ops = &hsw_power_well_ops,
2518 .id = SKL_DISP_PW_1,2583 .id = SKL_DISP_PW_1,
2519 {2584 {
2585 .hsw.regs = &hsw_power_well_regs,
2586 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
2520 .hsw.has_fuses = true,2587 .hsw.has_fuses = true,
2521 },2588 },
2522 },2589 },
@@ -2524,31 +2591,47 @@ static struct i915_power_well cnl_power_wells[] = { · 1 unmodified line
2524 .name = "AUX A",2591 .name = "AUX A",
2525 .domains = CNL_DISPLAY_AUX_A_POWER_DOMAINS,2592 .domains = CNL_DISPLAY_AUX_A_POWER_DOMAINS,
2526 .ops = &hsw_power_well_ops,2593 .ops = &hsw_power_well_ops,
2527 .id = CNL_DISP_PW_AUX_A,2594 .id = DISP_PW_ID_NONE,
2595 {
2596 .hsw.regs = &hsw_power_well_regs,
2597 .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
2598 },
2528 },2599 },
2529 {2600 {
2530 .name = "AUX B",2601 .name = "AUX B",
2531 .domains = CNL_DISPLAY_AUX_B_POWER_DOMAINS,2602 .domains = CNL_DISPLAY_AUX_B_POWER_DOMAINS,
2532 .ops = &hsw_power_well_ops,2603 .ops = &hsw_power_well_ops,
2533 .id = CNL_DISP_PW_AUX_B,2604 .id = DISP_PW_ID_NONE,
2605 {
2606 .hsw.regs = &hsw_power_well_regs,
2607 .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
2608 },
2534 },2609 },
2535 {2610 {
2536 .name = "AUX C",2611 .name = "AUX C",
2537 .domains = CNL_DISPLAY_AUX_C_POWER_DOMAINS,2612 .domains = CNL_DISPLAY_AUX_C_POWER_DOMAINS,
2538 .ops = &hsw_power_well_ops,2613 .ops = &hsw_power_well_ops,
2539 .id = CNL_DISP_PW_AUX_C,2614 .id = DISP_PW_ID_NONE,
2615 {
2616 .hsw.regs = &hsw_power_well_regs,
2617 .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
2618 },
2540 },2619 },
2541 {2620 {
2542 .name = "AUX D",2621 .name = "AUX D",
2543 .domains = CNL_DISPLAY_AUX_D_POWER_DOMAINS,2622 .domains = CNL_DISPLAY_AUX_D_POWER_DOMAINS,
2544 .ops = &hsw_power_well_ops,2623 .ops = &hsw_power_well_ops,
2545 .id = CNL_DISP_PW_AUX_D,2624 .id = DISP_PW_ID_NONE,
2625 {
2626 .hsw.regs = &hsw_power_well_regs,
2627 .hsw.idx = CNL_PW_CTL_IDX_AUX_D,
2628 },
2546 },2629 },
2547 {2630 {
2548 .name = "DC off",2631 .name = "DC off",
2549 .domains = CNL_DISPLAY_DC_OFF_POWER_DOMAINS,2632 .domains = CNL_DISPLAY_DC_OFF_POWER_DOMAINS,
2550 .ops = &gen9_dc_off_power_well_ops,2633 .ops = &gen9_dc_off_power_well_ops,
2551 .id = SKL_DISP_PW_DC_OFF,2634 .id = DISP_PW_ID_NONE,
2552 },2635 },
2553 {2636 {
2554 .name = "power well 2",2637 .name = "power well 2",
@@ -2556,6 +2639,8 @@ static struct i915_power_well cnl_power_wells[] = { · 1 unmodified line
2556 .ops = &hsw_power_well_ops,2639 .ops = &hsw_power_well_ops,
2557 .id = SKL_DISP_PW_2,2640 .id = SKL_DISP_PW_2,
2558 {2641 {
2642 .hsw.regs = &hsw_power_well_regs,
2643 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
2559 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),2644 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2560 .hsw.has_vga = true,2645 .hsw.has_vga = true,
2561 .hsw.has_fuses = true,2646 .hsw.has_fuses = true,
@@ -2565,37 +2650,61 @@ static struct i915_power_well cnl_power_wells[] = { · 3 unmodified lines
2565 .name = "DDI A IO power well",2650 .name = "DDI A IO power well",
2566 .domains = CNL_DISPLAY_DDI_A_IO_POWER_DOMAINS,2651 .domains = CNL_DISPLAY_DDI_A_IO_POWER_DOMAINS,
2567 .ops = &hsw_power_well_ops,2652 .ops = &hsw_power_well_ops,
2568 .id = CNL_DISP_PW_DDI_A,2653 .id = DISP_PW_ID_NONE,
2654 {
2655 .hsw.regs = &hsw_power_well_regs,
2656 .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
2657 },
2569 },2658 },
2570 {2659 {
2571 .name = "DDI B IO power well",2660 .name = "DDI B IO power well",
2572 .domains = CNL_DISPLAY_DDI_B_IO_POWER_DOMAINS,2661 .domains = CNL_DISPLAY_DDI_B_IO_POWER_DOMAINS,
2573 .ops = &hsw_power_well_ops,2662 .ops = &hsw_power_well_ops,
2574 .id = SKL_DISP_PW_DDI_B,2663 .id = DISP_PW_ID_NONE,
2664 {
2665 .hsw.regs = &hsw_power_well_regs,
2666 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
2667 },
2575 },2668 },
2576 {2669 {
2577 .name = "DDI C IO power well",2670 .name = "DDI C IO power well",
2578 .domains = CNL_DISPLAY_DDI_C_IO_POWER_DOMAINS,2671 .domains = CNL_DISPLAY_DDI_C_IO_POWER_DOMAINS,
2579 .ops = &hsw_power_well_ops,2672 .ops = &hsw_power_well_ops,
2580 .id = SKL_DISP_PW_DDI_C,2673 .id = DISP_PW_ID_NONE,
2674 {
2675 .hsw.regs = &hsw_power_well_regs,
2676 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
2677 },
2581 },2678 },
2582 {2679 {
2583 .name = "DDI D IO power well",2680 .name = "DDI D IO power well",
2584 .domains = CNL_DISPLAY_DDI_D_IO_POWER_DOMAINS,2681 .domains = CNL_DISPLAY_DDI_D_IO_POWER_DOMAINS,
2585 .ops = &hsw_power_well_ops,2682 .ops = &hsw_power_well_ops,
2586 .id = SKL_DISP_PW_DDI_D,2683 .id = DISP_PW_ID_NONE,
2684 {
2685 .hsw.regs = &hsw_power_well_regs,
2686 .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
2687 },
2587 },2688 },
2588 {2689 {
2589 .name = "DDI F IO power well",2690 .name = "DDI F IO power well",
2590 .domains = CNL_DISPLAY_DDI_F_IO_POWER_DOMAINS,2691 .domains = CNL_DISPLAY_DDI_F_IO_POWER_DOMAINS,
2591 .ops = &hsw_power_well_ops,2692 .ops = &hsw_power_well_ops,
2592 .id = CNL_DISP_PW_DDI_F,2693 .id = DISP_PW_ID_NONE,
2694 {
2695 .hsw.regs = &hsw_power_well_regs,
2696 .hsw.idx = CNL_PW_CTL_IDX_DDI_F,
2697 },
2593 },2698 },
2594 {2699 {
2595 .name = "AUX F",2700 .name = "AUX F",
2596 .domains = CNL_DISPLAY_AUX_F_POWER_DOMAINS,2701 .domains = CNL_DISPLAY_AUX_F_POWER_DOMAINS,
2597 .ops = &hsw_power_well_ops,2702 .ops = &hsw_power_well_ops,
2598 .id = CNL_DISP_PW_AUX_F,2703 .id = DISP_PW_ID_NONE,
2704 {
2705 .hsw.regs = &hsw_power_well_regs,
2706 .hsw.idx = CNL_PW_CTL_IDX_AUX_F,
2707 },
2599 },2708 },
2600};2709};
2601 2710
@@ -2606,147 +2715,239 @@ static const struct i915_power_well_ops icl_combo_phy_aux_power_well_ops = { · 4 unmodified lines
2606 .is_enabled = hsw_power_well_enabled,2715 .is_enabled = hsw_power_well_enabled,
2607};2716};
2608 2717
2609static struct i915_power_well icl_power_wells[] = {2718static const struct i915_power_well_regs icl_aux_power_well_regs = {
2719 .bios = ICL_PWR_WELL_CTL_AUX1,
2720 .driver = ICL_PWR_WELL_CTL_AUX2,
2721 .debug = ICL_PWR_WELL_CTL_AUX4,
2722};
2723
2724static const struct i915_power_well_regs icl_ddi_power_well_regs = {
2725 .bios = ICL_PWR_WELL_CTL_DDI1,
2726 .driver = ICL_PWR_WELL_CTL_DDI2,
2727 .debug = ICL_PWR_WELL_CTL_DDI4,
2728};
2729
2730static const struct i915_power_well_desc icl_power_wells[] = {
2610 {2731 {
2611 .name = "always-on",2732 .name = "always-on",
2612 .always_on = 1,2733 .always_on = 1,
2613 .domains = POWER_DOMAIN_MASK,2734 .domains = POWER_DOMAIN_MASK,
2614 .ops = &i9xx_always_on_power_well_ops,2735 .ops = &i9xx_always_on_power_well_ops,
2615 .id = I915_DISP_PW_ALWAYS_ON,2736 .id = DISP_PW_ID_NONE,
2616 },2737 },
2617 {2738 {
2618 .name = "power well 1",2739 .name = "power well 1",
2619 /* Handled by the DMC firmware */2740 /* Handled by the DMC firmware */
2620 .domains = 0,2741 .domains = 0,
2621 .ops = &hsw_power_well_ops,2742 .ops = &hsw_power_well_ops,
2622 .id = ICL_DISP_PW_1,2743 .id = SKL_DISP_PW_1,
2623 .hsw.has_fuses = true,2744 {
2745 .hsw.regs = &hsw_power_well_regs,
2746 .hsw.idx = ICL_PW_CTL_IDX_PW_1,
2747 .hsw.has_fuses = true,
2748 },
2624 },2749 },
2625 {2750 {
2626 .name = "power well 2",2751 .name = "power well 2",
2627 .domains = ICL_PW_2_POWER_DOMAINS,2752 .domains = ICL_PW_2_POWER_DOMAINS,
2628 .ops = &hsw_power_well_ops,2753 .ops = &hsw_power_well_ops,
2629 .id = ICL_DISP_PW_2,2754 .id = SKL_DISP_PW_2,
2630 .hsw.has_fuses = true,2755 {
2756 .hsw.regs = &hsw_power_well_regs,
2757 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
2758 .hsw.has_fuses = true,
2759 },
2631 },2760 },
2632 {2761 {
2633 .name = "DC off",2762 .name = "DC off",
2634 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,2763 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
2635 .ops = &gen9_dc_off_power_well_ops,2764 .ops = &gen9_dc_off_power_well_ops,
2636 .id = SKL_DISP_PW_DC_OFF,2765 .id = DISP_PW_ID_NONE,
2637 },2766 },
2638 {2767 {
2639 .name = "power well 3",2768 .name = "power well 3",
2640 .domains = ICL_PW_3_POWER_DOMAINS,2769 .domains = ICL_PW_3_POWER_DOMAINS,
2641 .ops = &hsw_power_well_ops,2770 .ops = &hsw_power_well_ops,
2642 .id = ICL_DISP_PW_3,2771 .id = DISP_PW_ID_NONE,
2643 .hsw.irq_pipe_mask = BIT(PIPE_B),2772 {
2644 .hsw.has_vga = true,2773 .hsw.regs = &hsw_power_well_regs,
2645 .hsw.has_fuses = true,2774 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
2775 .hsw.irq_pipe_mask = BIT(PIPE_B),
2776 .hsw.has_vga = true,
2777 .hsw.has_fuses = true,
2778 },
2646 },2779 },
2647 {2780 {
2648 .name = "DDI A IO",2781 .name = "DDI A IO",
2649 .domains = ICL_DDI_IO_A_POWER_DOMAINS,2782 .domains = ICL_DDI_IO_A_POWER_DOMAINS,
2650 .ops = &hsw_power_well_ops,2783 .ops = &hsw_power_well_ops,
2651 .id = ICL_DISP_PW_DDI_A,2784 .id = DISP_PW_ID_NONE,
2785 {
2786 .hsw.regs = &icl_ddi_power_well_regs,
2787 .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
2788 },
2652 },2789 },
2653 {2790 {
2654 .name = "DDI B IO",2791 .name = "DDI B IO",
2655 .domains = ICL_DDI_IO_B_POWER_DOMAINS,2792 .domains = ICL_DDI_IO_B_POWER_DOMAINS,
2656 .ops = &hsw_power_well_ops,2793 .ops = &hsw_power_well_ops,
2657 .id = ICL_DISP_PW_DDI_B,2794 .id = DISP_PW_ID_NONE,
2795 {
2796 .hsw.regs = &icl_ddi_power_well_regs,
2797 .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
2798 },
2658 },2799 },
2659 {2800 {
2660 .name = "DDI C IO",2801 .name = "DDI C IO",
2661 .domains = ICL_DDI_IO_C_POWER_DOMAINS,2802 .domains = ICL_DDI_IO_C_POWER_DOMAINS,
2662 .ops = &hsw_power_well_ops,2803 .ops = &hsw_power_well_ops,
2663 .id = ICL_DISP_PW_DDI_C,2804 .id = DISP_PW_ID_NONE,
2805 {
2806 .hsw.regs = &icl_ddi_power_well_regs,
2807 .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
2808 },
2664 },2809 },
2665 {2810 {
2666 .name = "DDI D IO",2811 .name = "DDI D IO",
2667 .domains = ICL_DDI_IO_D_POWER_DOMAINS,2812 .domains = ICL_DDI_IO_D_POWER_DOMAINS,
2668 .ops = &hsw_power_well_ops,2813 .ops = &hsw_power_well_ops,
2669 .id = ICL_DISP_PW_DDI_D,2814 .id = DISP_PW_ID_NONE,
2815 {
2816 .hsw.regs = &icl_ddi_power_well_regs,
2817 .hsw.idx = ICL_PW_CTL_IDX_DDI_D,
2818 },
2670 },2819 },
2671 {2820 {
2672 .name = "DDI E IO",2821 .name = "DDI E IO",
2673 .domains = ICL_DDI_IO_E_POWER_DOMAINS,2822 .domains = ICL_DDI_IO_E_POWER_DOMAINS,
2674 .ops = &hsw_power_well_ops,2823 .ops = &hsw_power_well_ops,
2675 .id = ICL_DISP_PW_DDI_E,2824 .id = DISP_PW_ID_NONE,
2825 {
2826 .hsw.regs = &icl_ddi_power_well_regs,
2827 .hsw.idx = ICL_PW_CTL_IDX_DDI_E,
2828 },
2676 },2829 },
2677 {2830 {
2678 .name = "DDI F IO",2831 .name = "DDI F IO",
2679 .domains = ICL_DDI_IO_F_POWER_DOMAINS,2832 .domains = ICL_DDI_IO_F_POWER_DOMAINS,
2680 .ops = &hsw_power_well_ops,2833 .ops = &hsw_power_well_ops,
2681 .id = ICL_DISP_PW_DDI_F,2834 .id = DISP_PW_ID_NONE,
2835 {
2836 .hsw.regs = &icl_ddi_power_well_regs,
2837 .hsw.idx = ICL_PW_CTL_IDX_DDI_F,
2838 },
2682 },2839 },
2683 {2840 {
2684 .name = "AUX A",2841 .name = "AUX A",
2685 .domains = ICL_AUX_A_IO_POWER_DOMAINS,2842 .domains = ICL_AUX_A_IO_POWER_DOMAINS,
2686 .ops = &icl_combo_phy_aux_power_well_ops,2843 .ops = &icl_combo_phy_aux_power_well_ops,
2687 .id = ICL_DISP_PW_AUX_A,2844 .id = DISP_PW_ID_NONE,
2845 {
2846 .hsw.regs = &icl_aux_power_well_regs,
2847 .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
2848 },
2688 },2849 },
2689 {2850 {
2690 .name = "AUX B",2851 .name = "AUX B",
2691 .domains = ICL_AUX_B_IO_POWER_DOMAINS,2852 .domains = ICL_AUX_B_IO_POWER_DOMAINS,
2692 .ops = &icl_combo_phy_aux_power_well_ops,2853 .ops = &icl_combo_phy_aux_power_well_ops,
2693 .id = ICL_DISP_PW_AUX_B,2854 .id = DISP_PW_ID_NONE,
2855 {
2856 .hsw.regs = &icl_aux_power_well_regs,
2857 .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
2858 },
2694 },2859 },
2695 {2860 {
2696 .name = "AUX C",2861 .name = "AUX C",
2697 .domains = ICL_AUX_C_IO_POWER_DOMAINS,2862 .domains = ICL_AUX_C_IO_POWER_DOMAINS,
2698 .ops = &hsw_power_well_ops,2863 .ops = &hsw_power_well_ops,
2699 .id = ICL_DISP_PW_AUX_C,2864 .id = DISP_PW_ID_NONE,
2865 {
2866 .hsw.regs = &icl_aux_power_well_regs,
2867 .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
2868 },
2700 },2869 },
2701 {2870 {
2702 .name = "AUX D",2871 .name = "AUX D",
2703 .domains = ICL_AUX_D_IO_POWER_DOMAINS,2872 .domains = ICL_AUX_D_IO_POWER_DOMAINS,
2704 .ops = &hsw_power_well_ops,2873 .ops = &hsw_power_well_ops,
2705 .id = ICL_DISP_PW_AUX_D,2874 .id = DISP_PW_ID_NONE,
2875 {
2876 .hsw.regs = &icl_aux_power_well_regs,
2877 .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
2878 },
2706 },2879 },
2707 {2880 {
2708 .name = "AUX E",2881 .name = "AUX E",
2709 .domains = ICL_AUX_E_IO_POWER_DOMAINS,2882 .domains = ICL_AUX_E_IO_POWER_DOMAINS,
2710 .ops = &hsw_power_well_ops,2883 .ops = &hsw_power_well_ops,
2711 .id = ICL_DISP_PW_AUX_E,2884 .id = DISP_PW_ID_NONE,
2885 {
2886 .hsw.regs = &icl_aux_power_well_regs,
2887 .hsw.idx = ICL_PW_CTL_IDX_AUX_E,
2888 },
2712 },2889 },
2713 {2890 {
2714 .name = "AUX F",2891 .name = "AUX F",
2715 .domains = ICL_AUX_F_IO_POWER_DOMAINS,2892 .domains = ICL_AUX_F_IO_POWER_DOMAINS,
2716 .ops = &hsw_power_well_ops,2893 .ops = &hsw_power_well_ops,
2717 .id = ICL_DISP_PW_AUX_F,2894 .id = DISP_PW_ID_NONE,
2895 {
2896 .hsw.regs = &icl_aux_power_well_regs,
2897 .hsw.idx = ICL_PW_CTL_IDX_AUX_F,
2898 },
2718 },2899 },
2719 {2900 {
2720 .name = "AUX TBT1",2901 .name = "AUX TBT1",
2721 .domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,2902 .domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
2722 .ops = &hsw_power_well_ops,2903 .ops = &hsw_power_well_ops,
2723 .id = ICL_DISP_PW_AUX_TBT1,2904 .id = DISP_PW_ID_NONE,
2905 {
2906 .hsw.regs = &icl_aux_power_well_regs,
2907 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
2908 },
2724 },2909 },
2725 {2910 {
2726 .name = "AUX TBT2",2911 .name = "AUX TBT2",
2727 .domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,2912 .domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
2728 .ops = &hsw_power_well_ops,2913 .ops = &hsw_power_well_ops,
2729 .id = ICL_DISP_PW_AUX_TBT2,2914 .id = DISP_PW_ID_NONE,
2915 {
2916 .hsw.regs = &icl_aux_power_well_regs,
2917 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
2918 },
2730 },2919 },
2731 {2920 {
2732 .name = "AUX TBT3",2921 .name = "AUX TBT3",
2733 .domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,2922 .domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
2734 .ops = &hsw_power_well_ops,2923 .ops = &hsw_power_well_ops,
2735 .id = ICL_DISP_PW_AUX_TBT3,2924 .id = DISP_PW_ID_NONE,
2925 {
2926 .hsw.regs = &icl_aux_power_well_regs,
2927 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
2928 },
2736 },2929 },
2737 {2930 {
2738 .name = "AUX TBT4",2931 .name = "AUX TBT4",
2739 .domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,2932 .domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
2740 .ops = &hsw_power_well_ops,2933 .ops = &hsw_power_well_ops,
2741 .id = ICL_DISP_PW_AUX_TBT4,2934 .id = DISP_PW_ID_NONE,
2935 {
2936 .hsw.regs = &icl_aux_power_well_regs,
2937 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
2938 },
2742 },2939 },
2743 {2940 {
2744 .name = "power well 4",2941 .name = "power well 4",
2745 .domains = ICL_PW_4_POWER_DOMAINS,2942 .domains = ICL_PW_4_POWER_DOMAINS,
2746 .ops = &hsw_power_well_ops,2943 .ops = &hsw_power_well_ops,
2747 .id = ICL_DISP_PW_4,2944 .id = DISP_PW_ID_NONE,
2748 .hsw.has_fuses = true,2945 {
2749 .hsw.irq_pipe_mask = BIT(PIPE_C),2946 .hsw.regs = &hsw_power_well_regs,
2947 .hsw.idx = ICL_PW_CTL_IDX_PW_4,
2948 .hsw.has_fuses = true,
2949 .hsw.irq_pipe_mask = BIT(PIPE_C),
2950 },
2750 },2951 },
2751};2952};
2752 2953
@@ -2809,26 +3010,41 @@ static uint32_t get_allowed_dc_mask(const struct drm_i915_private *dev_priv, · 56 unmodified lines
2809 return mask;3010 return mask;
2810}3011}
2811 3012
2812static void assert_power_well_ids_unique(struct drm_i915_private *dev_priv)3013static int
3014__set_power_wells(struct i915_power_domains *power_domains,
3015 const struct i915_power_well_desc *power_well_descs,
3016 int power_well_count)
2813{3017{
2814 struct i915_power_domains *power_domains = &dev_priv->power_domains;3018 u64 power_well_ids = 0;
2815 u64 power_well_ids;
2816 int i;3019 int i;
2817 3020
2818 power_well_ids = 0;3021 power_domains->power_well_count = power_well_count;
2819 for (i = 0; i < power_domains->power_well_count; i++) {3022 power_domains->power_wells =
2820 enum i915_power_well_id id = power_domains->power_wells[i].id;3023 kcalloc(power_well_count,
3024 sizeof(*power_domains->power_wells),
3025 GFP_KERNEL);
3026 if (!power_domains->power_wells)
3027 return -ENOMEM;
3028
3029 for (i = 0; i < power_well_count; i++) {
3030 enum i915_power_well_id id = power_well_descs[i].id;
3031
3032 power_domains->power_wells[i].desc = &power_well_descs[i];
3033
3034 if (id == DISP_PW_ID_NONE)
3035 continue;
2821 3036
2822 WARN_ON(id >= sizeof(power_well_ids) * 8);3037 WARN_ON(id >= sizeof(power_well_ids) * 8);
2823 WARN_ON(power_well_ids & BIT_ULL(id));3038 WARN_ON(power_well_ids & BIT_ULL(id));
2824 power_well_ids |= BIT_ULL(id);3039 power_well_ids |= BIT_ULL(id);
2825 }3040 }
3041
3042 return 0;
2826}3043}
2827 3044
2828#define set_power_wells(power_domains, __power_wells) ({ \3045#define set_power_wells(power_domains, __power_well_descs) \
2829 (power_domains)->power_wells = (__power_wells); \3046 __set_power_wells(power_domains, __power_well_descs, \
2830 (power_domains)->power_well_count = ARRAY_SIZE(__power_wells); \3047 ARRAY_SIZE(__power_well_descs))
2831})
2832 3048
2833/**3049/**
2834 * intel_power_domains_init - initializes the power domain structures3050 * intel_power_domains_init - initializes the power domain structures
@@ -2840,6 +3056,7 @@ static void assert_power_well_ids_unique(struct drm_i915_private *dev_priv) · 5 unmodified lines
2840int intel_power_domains_init(struct drm_i915_private *dev_priv)3056int intel_power_domains_init(struct drm_i915_private *dev_priv)
2841{3057{
2842 struct i915_power_domains *power_domains = &dev_priv->power_domains;3058 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3059 int err;
2843 3060
2844 i915_modparams.disable_power_well =3061 i915_modparams.disable_power_well =
2845 sanitize_disable_power_well_option(dev_priv,3062 sanitize_disable_power_well_option(dev_priv,
@@ -2856,15 +3073,15 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) · 10 unmodified lines
2856 * the disabling order is reversed.3073 * the disabling order is reversed.
2857 */3074 */
2858 if (IS_ICELAKE(dev_priv)) {3075 if (IS_ICELAKE(dev_priv)) {
2859 set_power_wells(power_domains, icl_power_wells);3076 err = set_power_wells(power_domains, icl_power_wells);
2860 } else if (IS_HASWELL(dev_priv)) {3077 } else if (IS_HASWELL(dev_priv)) {
2861 set_power_wells(power_domains, hsw_power_wells);3078 err = set_power_wells(power_domains, hsw_power_wells);
2862 } else if (IS_BROADWELL(dev_priv)) {3079 } else if (IS_BROADWELL(dev_priv)) {
2863 set_power_wells(power_domains, bdw_power_wells);3080 err = set_power_wells(power_domains, bdw_power_wells);
2864 } else if (IS_GEN9_BC(dev_priv)) {3081 } else if (IS_GEN9_BC(dev_priv)) {
2865 set_power_wells(power_domains, skl_power_wells);3082 err = set_power_wells(power_domains, skl_power_wells);
2866 } else if (IS_CANNONLAKE(dev_priv)) {3083 } else if (IS_CANNONLAKE(dev_priv)) {
2867 set_power_wells(power_domains, cnl_power_wells);3084 err = set_power_wells(power_domains, cnl_power_wells);
2868 3085
2869 /*3086 /*
2870 * DDI and Aux IO are getting enabled for all ports3087 * DDI and Aux IO are getting enabled for all ports
@@ -2876,57 +3093,31 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) · 5 unmodified lines
2876 power_domains->power_well_count -= 2;3093 power_domains->power_well_count -= 2;
2877 3094
2878 } else if (IS_BROXTON(dev_priv)) {3095 } else if (IS_BROXTON(dev_priv)) {
2879 set_power_wells(power_domains, bxt_power_wells);3096 err = set_power_wells(power_domains, bxt_power_wells);
2880 } else if (IS_GEMINILAKE(dev_priv)) {3097 } else if (IS_GEMINILAKE(dev_priv)) {
2881 set_power_wells(power_domains, glk_power_wells);3098 err = set_power_wells(power_domains, glk_power_wells);
2882 } else if (IS_CHERRYVIEW(dev_priv)) {3099 } else if (IS_CHERRYVIEW(dev_priv)) {
2883 set_power_wells(power_domains, chv_power_wells);3100 err = set_power_wells(power_domains, chv_power_wells);
2884 } else if (IS_VALLEYVIEW(dev_priv)) {3101 } else if (IS_VALLEYVIEW(dev_priv)) {
2885 set_power_wells(power_domains, vlv_power_wells);3102 err = set_power_wells(power_domains, vlv_power_wells);
2886 } else if (IS_I830(dev_priv)) {3103 } else if (IS_I830(dev_priv)) {
2887 set_power_wells(power_domains, i830_power_wells);3104 err = set_power_wells(power_domains, i830_power_wells);
2888 } else {3105 } else {
2889 set_power_wells(power_domains, i9xx_always_on_power_well);3106 err = set_power_wells(power_domains, i9xx_always_on_power_well);
2890 }3107 }
2891 3108
2892 assert_power_well_ids_unique(dev_priv);3109 return err;
2893
2894 return 0;
2895}3110}
2896 3111
2897/**3112/**
2898 * intel_power_domains_fini - finalizes the power domain structures3113 * intel_power_domains_cleanup - clean up power domains resources
2899 * @dev_priv: i915 device instance3114 * @dev_priv: i915 device instance
2900 *3115 *
2901 * Finalizes the power domain structures for @dev_priv depending upon the3116 * Release any resources acquired by intel_power_domains_init()
2902 * supported platform. This function also disables runtime pm and ensures that
2903 * the device stays powered up so that the driver can be reloaded.
2904 */3117 */
2905void intel_power_domains_fini(struct drm_i915_private *dev_priv)3118void intel_power_domains_cleanup(struct drm_i915_private *dev_priv)
2906{3119{
2907 struct device *kdev = &dev_priv->drm.pdev->dev;3120 kfree(dev_priv->power_domains.power_wells);
2908
2909 /*
2910 * The i915.ko module is still not prepared to be loaded when
2911 * the power well is not enabled, so just enable it in case
2912 * we're going to unload/reload.
2913 * The following also reacquires the RPM reference the core passed
2914 * to the driver during loading, which is dropped in
2915 * intel_runtime_pm_enable(). We have to hand back the control of the
2916 * device to the core with this reference held.
2917 */
2918 intel_display_set_init_power(dev_priv, true);
2919
2920 /* Remove the refcount we took to keep power well support disabled. */
2921 if (!i915_modparams.disable_power_well)
2922 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
2923
2924 /*
2925 * Remove the refcount we took in intel_runtime_pm_enable() in case
2926 * the platform doesn't support runtime PM.
2927 */
2928 if (!HAS_RUNTIME_PM(dev_priv))
2929 pm_runtime_put(kdev);
2930}3121}
2931 3122
2932static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)3123static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
@@ -2936,9 +3127,9 @@ static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv) · 3 unmodified lines
2936 3127
2937 mutex_lock(&power_domains->lock);3128 mutex_lock(&power_domains->lock);
2938 for_each_power_well(dev_priv, power_well) {3129 for_each_power_well(dev_priv, power_well) {
2939 power_well->ops->sync_hw(dev_priv, power_well);3130 power_well->desc->ops->sync_hw(dev_priv, power_well);
2940 power_well->hw_enabled = power_well->ops->is_enabled(dev_priv,3131 power_well->hw_enabled =
2941 power_well);3132 power_well->desc->ops->is_enabled(dev_priv, power_well);
2942 }3133 }
2943 mutex_unlock(&power_domains->lock);3134 mutex_unlock(&power_domains->lock);
2944}3135}
@@ -3360,7 +3551,7 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv, · 415 unmodified lines
3360 * The AUX IO power wells will be enabled on demand.3551 * The AUX IO power wells will be enabled on demand.
3361 */3552 */
3362 mutex_lock(&power_domains->lock);3553 mutex_lock(&power_domains->lock);
3363 well = lookup_power_well(dev_priv, ICL_DISP_PW_1);3554 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
3364 intel_power_well_enable(dev_priv, well);3555 intel_power_well_enable(dev_priv, well);
3365 mutex_unlock(&power_domains->lock);3556 mutex_unlock(&power_domains->lock);
3366 3557
@@ -3372,10 +3563,6 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv, · 5 unmodified lines
3372 3563
3373 /* 7. Setup MBUS. */3564 /* 7. Setup MBUS. */
3374 icl_mbus_init(dev_priv);3565 icl_mbus_init(dev_priv);
3375
3376 /* 8. CHICKEN_DCPR_1 */
3377 I915_WRITE(GEN8_CHICKEN_DCPR_1, I915_READ(GEN8_CHICKEN_DCPR_1) |
3378 CNL_DDI_CLOCK_REG_ACCESS_ON);
3379}3566}
3380 3567
3381static void icl_display_core_uninit(struct drm_i915_private *dev_priv)3568static void icl_display_core_uninit(struct drm_i915_private *dev_priv)
@@ -3401,7 +3588,7 @@ static void icl_display_core_uninit(struct drm_i915_private *dev_priv) · 19 unmodified lines
3401 * disabled at this point.3588 * disabled at this point.
3402 */3589 */
3403 mutex_lock(&power_domains->lock);3590 mutex_lock(&power_domains->lock);
3404 well = lookup_power_well(dev_priv, ICL_DISP_PW_1);3591 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
3405 intel_power_well_disable(dev_priv, well);3592 intel_power_well_disable(dev_priv, well);
3406 mutex_unlock(&power_domains->lock);3593 mutex_unlock(&power_domains->lock);
3407 3594
@@ -3416,9 +3603,9 @@ static void icl_display_core_uninit(struct drm_i915_private *dev_priv) · 8 unmodified lines
3416static void chv_phy_control_init(struct drm_i915_private *dev_priv)3603static void chv_phy_control_init(struct drm_i915_private *dev_priv)
3417{3604{
3418 struct i915_power_well *cmn_bc =3605 struct i915_power_well *cmn_bc =
3419 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC);3606 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
3420 struct i915_power_well *cmn_d =3607 struct i915_power_well *cmn_d =
3421 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_D);3608 lookup_power_well(dev_priv, CHV_DISP_PW_DPIO_CMN_D);
3422 3609
3423 /*3610 /*
3424 * DISPLAY_PHY_CONTROL can get corrupted if read. As a3611 * DISPLAY_PHY_CONTROL can get corrupted if read. As a
@@ -3441,7 +3628,7 @@ static void chv_phy_control_init(struct drm_i915_private *dev_priv) · 16 unmodified lines
3441 * override and set the lane powerdown bits accding to the3628 * override and set the lane powerdown bits accding to the
3442 * current lane status.3629 * current lane status.
3443 */3630 */
3444 if (cmn_bc->ops->is_enabled(dev_priv, cmn_bc)) {3631 if (cmn_bc->desc->ops->is_enabled(dev_priv, cmn_bc)) {
3445 uint32_t status = I915_READ(DPLL(PIPE_A));3632 uint32_t status = I915_READ(DPLL(PIPE_A));
3446 unsigned int mask;3633 unsigned int mask;
3447 3634
@@ -3472,7 +3659,7 @@ static void chv_phy_control_init(struct drm_i915_private *dev_priv) · 24 unmodified lines
3472 dev_priv->chv_phy_assert[DPIO_PHY0] = true;3659 dev_priv->chv_phy_assert[DPIO_PHY0] = true;
3473 }3660 }
3474 3661
3475 if (cmn_d->ops->is_enabled(dev_priv, cmn_d)) {3662 if (cmn_d->desc->ops->is_enabled(dev_priv, cmn_d)) {
3476 uint32_t status = I915_READ(DPIO_PHY_STATUS);3663 uint32_t status = I915_READ(DPIO_PHY_STATUS);
3477 unsigned int mask;3664 unsigned int mask;
3478 3665
@@ -3503,20 +3690,20 @@ static void chv_phy_control_init(struct drm_i915_private *dev_priv) · 24 unmodified lines
3503static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)3690static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
3504{3691{
3505 struct i915_power_well *cmn =3692 struct i915_power_well *cmn =
3506 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC);3693 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
3507 struct i915_power_well *disp2d =3694 struct i915_power_well *disp2d =
3508 lookup_power_well(dev_priv, PUNIT_POWER_WELL_DISP2D);3695 lookup_power_well(dev_priv, VLV_DISP_PW_DISP2D);
3509 3696
3510 /* If the display might be already active skip this */3697 /* If the display might be already active skip this */
3511 if (cmn->ops->is_enabled(dev_priv, cmn) &&3698 if (cmn->desc->ops->is_enabled(dev_priv, cmn) &&
3512 disp2d->ops->is_enabled(dev_priv, disp2d) &&3699 disp2d->desc->ops->is_enabled(dev_priv, disp2d) &&
3513 I915_READ(DPIO_CTL) & DPIO_CMNRST)3700 I915_READ(DPIO_CTL) & DPIO_CMNRST)
3514 return;3701 return;
3515 3702
3516 DRM_DEBUG_KMS("toggling display PHY side reset\n");3703 DRM_DEBUG_KMS("toggling display PHY side reset\n");
3517 3704
3518 /* cmnlane needs DPLL registers */3705 /* cmnlane needs DPLL registers */
3519 disp2d->ops->enable(dev_priv, disp2d);3706 disp2d->desc->ops->enable(dev_priv, disp2d);
3520 3707
3521 /*3708 /*
3522 * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:3709 * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:
@@ -3525,9 +3712,11 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) · 2 unmodified lines
3525 * Simply ungating isn't enough to reset the PHY enough to get3712 * Simply ungating isn't enough to reset the PHY enough to get
3526 * ports and lanes running.3713 * ports and lanes running.
3527 */3714 */
3528 cmn->ops->disable(dev_priv, cmn);3715 cmn->desc->ops->disable(dev_priv, cmn);
3529}3716}
3530 3717
3718static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);
3719
3531/**3720/**
3532 * intel_power_domains_init_hw - initialize hardware power domain state3721 * intel_power_domains_init_hw - initialize hardware power domain state
3533 * @dev_priv: i915 device instance3722 * @dev_priv: i915 device instance
@@ -3535,9 +3724,14 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) · 1 unmodified line
3535 *3724 *
3536 * This function initializes the hardware power domain state and enables all3725 * This function initializes the hardware power domain state and enables all
3537 * power wells belonging to the INIT power domain. Power wells in other3726 * power wells belonging to the INIT power domain. Power wells in other
3538 * domains (and not in the INIT domain) are referenced or disabled during the3727 * domains (and not in the INIT domain) are referenced or disabled by
3539 * modeset state HW readout. After that the reference count of each power well3728 * intel_modeset_readout_hw_state(). After that the reference count of each
3540 * must match its HW enabled state, see intel_power_domains_verify_state().3729 * power well must match its HW enabled state, see
3730 * intel_power_domains_verify_state().
3731 *
3732 * It will return with power domains disabled (to be enabled later by
3733 * intel_power_domains_enable()) and must be paired with
3734 * intel_power_domains_fini_hw().
3541 */3735 */
3542void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)3736void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
3543{3737{
@@ -3563,30 +3757,117 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume) · 19 unmodified lines
3563 mutex_unlock(&power_domains->lock);3757 mutex_unlock(&power_domains->lock);
3564 }3758 }
3565 3759
3566 /* For now, we need the power well to be always enabled. */3760 /*
3567 intel_display_set_init_power(dev_priv, true);3761 * Keep all power wells enabled for any dependent HW access during
3762 * initialization and to make sure we keep BIOS enabled display HW
3763 * resources powered until display HW readout is complete. We drop
3764 * this reference in intel_power_domains_enable().
3765 */
3766 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3568 /* Disable power support if the user asked so. */3767 /* Disable power support if the user asked so. */
3569 if (!i915_modparams.disable_power_well)3768 if (!i915_modparams.disable_power_well)
3570 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);3769 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3571 intel_power_domains_sync_hw(dev_priv);3770 intel_power_domains_sync_hw(dev_priv);
3771
3572 power_domains->initializing = false;3772 power_domains->initializing = false;
3573}3773}
3574 3774
3775/**
3776 * intel_power_domains_fini_hw - deinitialize hw power domain state
3777 * @dev_priv: i915 device instance
3778 *
3779 * De-initializes the display power domain HW state. It also ensures that the
3780 * device stays powered up so that the driver can be reloaded.
3781 *
3782 * It must be called with power domains already disabled (after a call to
3783 * intel_power_domains_disable()) and must be paired with
3784 * intel_power_domains_init_hw().
3785 */
3786void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv)
3787{
3788 /* Keep the power well enabled, but cancel its rpm wakeref. */
3789 intel_runtime_pm_put(dev_priv);
3790
3791 /* Remove the refcount we took to keep power well support disabled. */
3792 if (!i915_modparams.disable_power_well)
3793 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3794
3795 intel_power_domains_verify_state(dev_priv);
3796}
3797
3798/**
3799 * intel_power_domains_enable - enable toggling of display power wells
3800 * @dev_priv: i915 device instance
3801 *
3802 * Enable the ondemand enabling/disabling of the display power wells. Note that
3803 * power wells not belonging to POWER_DOMAIN_INIT are allowed to be toggled
3804 * only at specific points of the display modeset sequence, thus they are not
3805 * affected by the intel_power_domains_enable()/disable() calls. The purpose
3806 * of these function is to keep the rest of power wells enabled until the end
3807 * of display HW readout (which will acquire the power references reflecting
3808 * the current HW state).
3809 */
3810void intel_power_domains_enable(struct drm_i915_private *dev_priv)
3811{
3812 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3813
3814 intel_power_domains_verify_state(dev_priv);
3815}
3816
3817/**
3818 * intel_power_domains_disable - disable toggling of display power wells
3819 * @dev_priv: i915 device instance
3820 *
3821 * Disable the ondemand enabling/disabling of the display power wells. See
3822 * intel_power_domains_enable() for which power wells this call controls.
3823 */
3824void intel_power_domains_disable(struct drm_i915_private *dev_priv)
3825{
3826 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3827
3828 intel_power_domains_verify_state(dev_priv);
3829}
3830
3575/**3831/**
3576 * intel_power_domains_suspend - suspend power domain state3832 * intel_power_domains_suspend - suspend power domain state
3577 * @dev_priv: i915 device instance3833 * @dev_priv: i915 device instance
3834 * @suspend_mode: specifies the target suspend state (idle, mem, hibernation)
3578 *3835 *
3579 * This function prepares the hardware power domain state before entering3836 * This function prepares the hardware power domain state before entering
3580 * system suspend. It must be paired with intel_power_domains_init_hw().3837 * system suspend.
3838 *
3839 * It must be called with power domains already disabled (after a call to
3840 * intel_power_domains_disable()) and paired with intel_power_domains_resume().
3581 */3841 */
3582void intel_power_domains_suspend(struct drm_i915_private *dev_priv)3842void intel_power_domains_suspend(struct drm_i915_private *dev_priv,
3843 enum i915_drm_suspend_mode suspend_mode)
3583{3844{
3845 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3846
3847 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3848
3849 /*
3850 * In case of suspend-to-idle (aka S0ix) on a DMC platform without DC9
3851 * support don't manually deinit the power domains. This also means the
3852 * CSR/DMC firmware will stay active, it will power down any HW
3853 * resources as required and also enable deeper system power states
3854 * that would be blocked if the firmware was inactive.
3855 */
3856 if (!(dev_priv->csr.allowed_dc_mask & DC_STATE_EN_DC9) &&
3857 suspend_mode == I915_DRM_SUSPEND_IDLE &&
3858 dev_priv->csr.dmc_payload != NULL) {
3859 intel_power_domains_verify_state(dev_priv);
3860 return;
3861 }
3862
3584 /*3863 /*
3585 * Even if power well support was disabled we still want to disable3864 * Even if power well support was disabled we still want to disable
3586 * power wells while we are system suspended.3865 * power wells if power domains must be deinitialized for suspend.
3587 */3866 */
3588 if (!i915_modparams.disable_power_well)3867 if (!i915_modparams.disable_power_well) {
3589 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);3868 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3869 intel_power_domains_verify_state(dev_priv);
3870 }
3590 3871
3591 if (IS_ICELAKE(dev_priv))3872 if (IS_ICELAKE(dev_priv))
3592 icl_display_core_uninit(dev_priv);3873 icl_display_core_uninit(dev_priv);
@@ -3596,8 +3877,36 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv) · 3 unmodified lines
3596 skl_display_core_uninit(dev_priv);3877 skl_display_core_uninit(dev_priv);
3597 else if (IS_GEN9_LP(dev_priv))3878 else if (IS_GEN9_LP(dev_priv))
3598 bxt_display_core_uninit(dev_priv);3879 bxt_display_core_uninit(dev_priv);
3880
3881 power_domains->display_core_suspended = true;
3599}3882}
3600 3883
3884/**
3885 * intel_power_domains_resume - resume power domain state
3886 * @dev_priv: i915 device instance
3887 *
3888 * This function resume the hardware power domain state during system resume.
3889 *
3890 * It will return with power domain support disabled (to be enabled later by
3891 * intel_power_domains_enable()) and must be paired with
3892 * intel_power_domains_suspend().
3893 */
3894void intel_power_domains_resume(struct drm_i915_private *dev_priv)
3895{
3896 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3897
3898 if (power_domains->display_core_suspended) {
3899 intel_power_domains_init_hw(dev_priv, true);
3900 power_domains->display_core_suspended = false;
3901 } else {
3902 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3903 }
3904
3905 intel_power_domains_verify_state(dev_priv);
3906}
3907
3908#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
3909
3601static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv)3910static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv)
3602{3911{
3603 struct i915_power_domains *power_domains = &dev_priv->power_domains;3912 struct i915_power_domains *power_domains = &dev_priv->power_domains;
@@ -3607,9 +3916,9 @@ static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv) · 3 unmodified lines
3607 enum intel_display_power_domain domain;3916 enum intel_display_power_domain domain;
3608 3917
3609 DRM_DEBUG_DRIVER("%-25s %d\n",3918 DRM_DEBUG_DRIVER("%-25s %d\n",
3610 power_well->name, power_well->count);3919 power_well->desc->name, power_well->count);
3611 3920
3612 for_each_power_domain(domain, power_well->domains)3921 for_each_power_domain(domain, power_well->desc->domains)
3613 DRM_DEBUG_DRIVER(" %-23s %d\n",3922 DRM_DEBUG_DRIVER(" %-23s %d\n",
3614 intel_display_power_domain_str(domain),3923 intel_display_power_domain_str(domain),
3615 power_domains->domain_use_count[domain]);3924 power_domains->domain_use_count[domain]);
@@ -3626,7 +3935,7 @@ static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv) · 10 unmodified lines
3626 * acquiring reference counts for any power wells in use and disabling the3935 * acquiring reference counts for any power wells in use and disabling the
3627 * ones left on by BIOS but not required by any active output.3936 * ones left on by BIOS but not required by any active output.
3628 */3937 */
3629void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)3938static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
3630{3939{
3631 struct i915_power_domains *power_domains = &dev_priv->power_domains;3940 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3632 struct i915_power_well *power_well;3941 struct i915_power_well *power_well;
@@ -3645,22 +3954,25 @@ void intel_power_domains_verify_state(struct drm_i915_private *dev_priv) · 12 unmodified lines
3645 * and PW1 power wells) are under FW control, so ignore them,3954 * and PW1 power wells) are under FW control, so ignore them,
3646 * since their state can change asynchronously.3955 * since their state can change asynchronously.
3647 */3956 */
3648 if (!power_well->domains)3957 if (!power_well->desc->domains)
3649 continue;3958 continue;
3650 3959
3651 enabled = power_well->ops->is_enabled(dev_priv, power_well);3960 enabled = power_well->desc->ops->is_enabled(dev_priv,
3652 if ((power_well->count || power_well->always_on) != enabled)3961 power_well);
3962 if ((power_well->count || power_well->desc->always_on) !=
3963 enabled)
3653 DRM_ERROR("power well %s state mismatch (refcount %d/enabled %d)",3964 DRM_ERROR("power well %s state mismatch (refcount %d/enabled %d)",
3654 power_well->name, power_well->count, enabled);3965 power_well->desc->name,
3966 power_well->count, enabled);
3655 3967
3656 domains_count = 0;3968 domains_count = 0;
3657 for_each_power_domain(domain, power_well->domains)3969 for_each_power_domain(domain, power_well->desc->domains)
3658 domains_count += power_domains->domain_use_count[domain];3970 domains_count += power_domains->domain_use_count[domain];
3659 3971
3660 if (power_well->count != domains_count) {3972 if (power_well->count != domains_count) {
3661 DRM_ERROR("power well %s refcount/domain refcount mismatch "3973 DRM_ERROR("power well %s refcount/domain refcount mismatch "
3662 "(refcount %d/domains refcount %d)\n",3974 "(refcount %d/domains refcount %d)\n",
3663 power_well->name, power_well->count,3975 power_well->desc->name, power_well->count,
3664 domains_count);3976 domains_count);
3665 dump_domain_info = true;3977 dump_domain_info = true;
3666 }3978 }
@@ -3678,6 +3990,14 @@ void intel_power_domains_verify_state(struct drm_i915_private *dev_priv) · 11 unmodified lines
3678 mutex_unlock(&power_domains->lock);3990 mutex_unlock(&power_domains->lock);
3679}3991}
3680 3992
3993#else
3994
3995static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
3996{
3997}
3998
3999#endif
4000
3681/**4001/**
3682 * intel_runtime_pm_get - grab a runtime pm reference4002 * intel_runtime_pm_get - grab a runtime pm reference
3683 * @dev_priv: i915 device instance4003 * @dev_priv: i915 device instance
@@ -3791,14 +4111,24 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv) · 107 unmodified lines
3791 * This function enables runtime pm at the end of the driver load sequence.4111 * This function enables runtime pm at the end of the driver load sequence.
3792 *4112 *
3793 * Note that this function does currently not enable runtime pm for the4113 * Note that this function does currently not enable runtime pm for the
3794 * subordinate display power domains. That is only done on the first modeset4114 * subordinate display power domains. That is done by
3795 * using intel_display_set_init_power().4115 * intel_power_domains_enable().
3796 */4116 */
3797void intel_runtime_pm_enable(struct drm_i915_private *dev_priv)4117void intel_runtime_pm_enable(struct drm_i915_private *dev_priv)
3798{4118{
3799 struct pci_dev *pdev = dev_priv->drm.pdev;4119 struct pci_dev *pdev = dev_priv->drm.pdev;
3800 struct device *kdev = &pdev->dev;4120 struct device *kdev = &pdev->dev;
3801 4121
4122 /*
4123 * Disable the system suspend direct complete optimization, which can
4124 * leave the device suspended skipping the driver's suspend handlers
4125 * if the device was already runtime suspended. This is needed due to
4126 * the difference in our runtime and system suspend sequence and
4127 * becaue the HDA driver may require us to enable the audio power
4128 * domain during system suspend.
4129 */
4130 dev_pm_set_driver_flags(kdev, DPM_FLAG_NEVER_SKIP);
4131
3802 pm_runtime_set_autosuspend_delay(kdev, 10000); /* 10s */4132 pm_runtime_set_autosuspend_delay(kdev, 10000); /* 10s */
3803 pm_runtime_mark_last_busy(kdev);4133 pm_runtime_mark_last_busy(kdev);
3804 4134
@@ -3825,3 +4155,18 @@ void intel_runtime_pm_enable(struct drm_i915_private *dev_priv) · 20 unmodified lines
3825 */4155 */
3826 pm_runtime_put_autosuspend(kdev);4156 pm_runtime_put_autosuspend(kdev);
3827}4157}
4158
4159void intel_runtime_pm_disable(struct drm_i915_private *dev_priv)
4160{
4161 struct pci_dev *pdev = dev_priv->drm.pdev;
4162 struct device *kdev = &pdev->dev;
4163
4164 /* Transfer rpm ownership back to core */
4165 WARN(pm_runtime_get_sync(&dev_priv->drm.pdev->dev) < 0,
4166 "Failed to pass rpm ownership back to core\n");
4167
4168 pm_runtime_dont_use_autosuspend(kdev);
4169
4170 if (!HAS_RUNTIME_PM(dev_priv))
4171 pm_runtime_put(kdev);
4172}
drivers/gpu/drm/i915/intel_sprite.c+7−6
@@ -83,6 +83,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) · 82 unmodified lines
83 bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&83 bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
84 intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);84 intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);
85 DEFINE_WAIT(wait);85 DEFINE_WAIT(wait);
86 u32 psr_status;
86 87
87 vblank_start = adjusted_mode->crtc_vblank_start;88 vblank_start = adjusted_mode->crtc_vblank_start;
88 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)89 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
@@ -104,8 +105,9 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) · 15 unmodified lines
104 * VBL interrupts will start the PSR exit and prevent a PSR105 * VBL interrupts will start the PSR exit and prevent a PSR
105 * re-entry as well.106 * re-entry as well.
106 */107 */
107 if (intel_psr_wait_for_idle(new_crtc_state))108 if (intel_psr_wait_for_idle(new_crtc_state, &psr_status))
108 DRM_ERROR("PSR idle timed out, atomic update may fail\n");109 DRM_ERROR("PSR idle timed out 0x%x, atomic update may fail\n",
110 psr_status);
109 111
110 local_irq_disable();112 local_irq_disable();
111 113
@@ -957,10 +959,10 @@ g4x_plane_get_hw_state(struct intel_plane *plane, · 845 unmodified lines
957}959}
958 960
959static int961static int
960intel_check_sprite_plane(struct intel_plane *plane,962intel_check_sprite_plane(struct intel_crtc_state *crtc_state,
961 struct intel_crtc_state *crtc_state,
962 struct intel_plane_state *state)963 struct intel_plane_state *state)
963{964{
965 struct intel_plane *plane = to_intel_plane(state->base.plane);
964 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);966 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
965 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);967 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
966 struct drm_framebuffer *fb = state->base.fb;968 struct drm_framebuffer *fb = state->base.fb;
@@ -1407,8 +1409,7 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane, · 440 unmodified lines
1407 case DRM_FORMAT_XBGR8888:1409 case DRM_FORMAT_XBGR8888:
1408 case DRM_FORMAT_ARGB8888:1410 case DRM_FORMAT_ARGB8888:
1409 case DRM_FORMAT_ABGR8888:1411 case DRM_FORMAT_ABGR8888:
1410 if (modifier == I915_FORMAT_MOD_Yf_TILED_CCS ||1412 if (is_ccs_modifier(modifier))
1411 modifier == I915_FORMAT_MOD_Y_TILED_CCS)
1412 return true;1413 return true;
1413 /* fall through */1414 /* fall through */
1414 case DRM_FORMAT_RGB565:1415 case DRM_FORMAT_RGB565:
drivers/gpu/drm/i915/intel_uc_fw.c+1−1
@@ -222,7 +222,7 @@ int intel_uc_fw_upload(struct intel_uc_fw *uc_fw, · 221 unmodified lines
222 goto fail;222 goto fail;
223 }223 }
224 224
225 ggtt_pin_bias = to_i915(uc_fw->obj->base.dev)->guc.ggtt_pin_bias;225 ggtt_pin_bias = to_i915(uc_fw->obj->base.dev)->ggtt.pin_bias;
226 vma = i915_gem_object_ggtt_pin(uc_fw->obj, NULL, 0, 0,226 vma = i915_gem_object_ggtt_pin(uc_fw->obj, NULL, 0, 0,
227 PIN_OFFSET_BIAS | ggtt_pin_bias);227 PIN_OFFSET_BIAS | ggtt_pin_bias);
228 if (IS_ERR(vma)) {228 if (IS_ERR(vma)) {
drivers/gpu/drm/i915/intel_uncore.c+92−38
@@ -283,14 +283,24 @@ fw_domains_reset(struct drm_i915_private *i915, · 282 unmodified lines
283 fw_domain_reset(i915, d);283 fw_domain_reset(i915, d);
284}284}
285 285
286static inline u32 gt_thread_status(struct drm_i915_private *dev_priv)
287{
288 u32 val;
289
290 val = __raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG);
291 val &= GEN6_GT_THREAD_STATUS_CORE_MASK;
292
293 return val;
294}
295
286static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)296static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
287{297{
288 /* w/a for a sporadic read returning 0 by waiting for the GT298 /*
299 * w/a for a sporadic read returning 0 by waiting for the GT
289 * thread to wake up.300 * thread to wake up.
290 */301 */
291 if (wait_for_atomic_us((__raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG) &302 WARN_ONCE(wait_for_atomic_us(gt_thread_status(dev_priv) == 0, 5000),
292 GEN6_GT_THREAD_STATUS_CORE_MASK) == 0, 500))303 "GT thread status wait timed out\n");
293 DRM_ERROR("GT thread status wait timed out\n");
294}304}
295 305
296static void fw_domains_get_with_thread_status(struct drm_i915_private *dev_priv,306static void fw_domains_get_with_thread_status(struct drm_i915_private *dev_priv,
@@ -1729,7 +1739,7 @@ static void gen3_stop_engine(struct intel_engine_cs *engine) · 1432 unmodified lines
1729}1739}
1730 1740
1731static void i915_stop_engines(struct drm_i915_private *dev_priv,1741static void i915_stop_engines(struct drm_i915_private *dev_priv,
1732 unsigned engine_mask)1742 unsigned int engine_mask)
1733{1743{
1734 struct intel_engine_cs *engine;1744 struct intel_engine_cs *engine;
1735 enum intel_engine_id id;1745 enum intel_engine_id id;
@@ -1749,7 +1759,9 @@ static bool i915_in_reset(struct pci_dev *pdev) · 13 unmodified lines
1749 return gdrst & GRDOM_RESET_STATUS;1759 return gdrst & GRDOM_RESET_STATUS;
1750}1760}
1751 1761
1752static int i915_do_reset(struct drm_i915_private *dev_priv, unsigned engine_mask)1762static int i915_do_reset(struct drm_i915_private *dev_priv,
1763 unsigned int engine_mask,
1764 unsigned int retry)
1753{1765{
1754 struct pci_dev *pdev = dev_priv->drm.pdev;1766 struct pci_dev *pdev = dev_priv->drm.pdev;
1755 int err;1767 int err;
@@ -1776,7 +1788,9 @@ static bool g4x_reset_complete(struct pci_dev *pdev) · 20 unmodified lines
1776 return (gdrst & GRDOM_RESET_ENABLE) == 0;1788 return (gdrst & GRDOM_RESET_ENABLE) == 0;
1777}1789}
1778 1790
1779static int g33_do_reset(struct drm_i915_private *dev_priv, unsigned engine_mask)1791static int g33_do_reset(struct drm_i915_private *dev_priv,
1792 unsigned int engine_mask,
1793 unsigned int retry)
1780{1794{
1781 struct pci_dev *pdev = dev_priv->drm.pdev;1795 struct pci_dev *pdev = dev_priv->drm.pdev;
1782 1796
@@ -1784,7 +1798,9 @@ static int g33_do_reset(struct drm_i915_private *dev_priv, unsigned engine_mask) · 1 unmodified line
1784 return wait_for(g4x_reset_complete(pdev), 500);1798 return wait_for(g4x_reset_complete(pdev), 500);
1785}1799}
1786 1800
1787static int g4x_do_reset(struct drm_i915_private *dev_priv, unsigned engine_mask)1801static int g4x_do_reset(struct drm_i915_private *dev_priv,
1802 unsigned int engine_mask,
1803 unsigned int retry)
1788{1804{
1789 struct pci_dev *pdev = dev_priv->drm.pdev;1805 struct pci_dev *pdev = dev_priv->drm.pdev;
1790 int ret;1806 int ret;
@@ -1821,7 +1837,8 @@ out: · 30 unmodified lines
1821}1837}
1822 1838
1823static int ironlake_do_reset(struct drm_i915_private *dev_priv,1839static int ironlake_do_reset(struct drm_i915_private *dev_priv,
1824 unsigned engine_mask)1840 unsigned int engine_mask,
1841 unsigned int retry)
1825{1842{
1826 int ret;1843 int ret;
1827 1844
@@ -1877,6 +1894,7 @@ static int gen6_hw_domain_reset(struct drm_i915_private *dev_priv, · 49 unmodified lines
1877 * gen6_reset_engines - reset individual engines1894 * gen6_reset_engines - reset individual engines
1878 * @dev_priv: i915 device1895 * @dev_priv: i915 device
1879 * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset1896 * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
1897 * @retry: the count of of previous attempts to reset.
1880 *1898 *
1881 * This function will reset the individual engines that are set in engine_mask.1899 * This function will reset the individual engines that are set in engine_mask.
1882 * If you provide ALL_ENGINES as mask, full global domain reset will be issued.1900 * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
@@ -1887,7 +1905,8 @@ static int gen6_hw_domain_reset(struct drm_i915_private *dev_priv, · 4 unmodified lines
1887 * Returns 0 on success, nonzero on error.1905 * Returns 0 on success, nonzero on error.
1888 */1906 */
1889static int gen6_reset_engines(struct drm_i915_private *dev_priv,1907static int gen6_reset_engines(struct drm_i915_private *dev_priv,
1890 unsigned engine_mask)1908 unsigned int engine_mask,
1909 unsigned int retry)
1891{1910{
1892 struct intel_engine_cs *engine;1911 struct intel_engine_cs *engine;
1893 const u32 hw_engine_mask[I915_NUM_ENGINES] = {1912 const u32 hw_engine_mask[I915_NUM_ENGINES] = {
@@ -1926,7 +1945,7 @@ static int gen6_reset_engines(struct drm_i915_private *dev_priv, · 32 unmodified lines
1926 * Returns 0 on success, nonzero on error.1945 * Returns 0 on success, nonzero on error.
1927 */1946 */
1928static int gen11_reset_engines(struct drm_i915_private *dev_priv,1947static int gen11_reset_engines(struct drm_i915_private *dev_priv,
1929 unsigned engine_mask)1948 unsigned int engine_mask)
1930{1949{
1931 struct intel_engine_cs *engine;1950 struct intel_engine_cs *engine;
1932 const u32 hw_engine_mask[I915_NUM_ENGINES] = {1951 const u32 hw_engine_mask[I915_NUM_ENGINES] = {
@@ -2066,7 +2085,7 @@ int __intel_wait_for_register(struct drm_i915_private *dev_priv, · 133 unmodified lines
2066 return ret;2085 return ret;
2067}2086}
2068 2087
2069static int gen8_reset_engine_start(struct intel_engine_cs *engine)2088static int gen8_engine_reset_prepare(struct intel_engine_cs *engine)
2070{2089{
2071 struct drm_i915_private *dev_priv = engine->i915;2090 struct drm_i915_private *dev_priv = engine->i915;
2072 int ret;2091 int ret;
@@ -2086,7 +2105,7 @@ static int gen8_reset_engine_start(struct intel_engine_cs *engine) · 13 unmodified lines
2086 return ret;2105 return ret;
2087}2106}
2088 2107
2089static void gen8_reset_engine_cancel(struct intel_engine_cs *engine)2108static void gen8_engine_reset_cancel(struct intel_engine_cs *engine)
2090{2109{
2091 struct drm_i915_private *dev_priv = engine->i915;2110 struct drm_i915_private *dev_priv = engine->i915;
2092 2111
@@ -2094,33 +2113,56 @@ static void gen8_reset_engine_cancel(struct intel_engine_cs *engine) · 1 unmodified line
2094 _MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));2113 _MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
2095}2114}
2096 2115
2116static int reset_engines(struct drm_i915_private *i915,
2117 unsigned int engine_mask,
2118 unsigned int retry)
2119{
2120 if (INTEL_GEN(i915) >= 11)
2121 return gen11_reset_engines(i915, engine_mask);
2122 else
2123 return gen6_reset_engines(i915, engine_mask, retry);
2124}
2125
2097static int gen8_reset_engines(struct drm_i915_private *dev_priv,2126static int gen8_reset_engines(struct drm_i915_private *dev_priv,
2098 unsigned engine_mask)2127 unsigned int engine_mask,
2128 unsigned int retry)
2099{2129{
2100 struct intel_engine_cs *engine;2130 struct intel_engine_cs *engine;
2131 const bool reset_non_ready = retry >= 1;
2101 unsigned int tmp;2132 unsigned int tmp;
2102 int ret;2133 int ret;
2103 2134
2104 for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {2135 for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
2105 if (gen8_reset_engine_start(engine)) {2136 ret = gen8_engine_reset_prepare(engine);
2106 ret = -EIO;2137 if (ret && !reset_non_ready)
2107 goto not_ready;2138 goto skip_reset;
2108 }2139
2140 /*
2141 * If this is not the first failed attempt to prepare,
2142 * we decide to proceed anyway.
2143 *
2144 * By doing so we risk context corruption and with
2145 * some gens (kbl), possible system hang if reset
2146 * happens during active bb execution.
2147 *
2148 * We rather take context corruption instead of
2149 * failed reset with a wedged driver/gpu. And
2150 * active bb execution case should be covered by
2151 * i915_stop_engines we have before the reset.
2152 */
2109 }2153 }
2110 2154
2111 if (INTEL_GEN(dev_priv) >= 11)2155 ret = reset_engines(dev_priv, engine_mask, retry);
2112 ret = gen11_reset_engines(dev_priv, engine_mask);
2113 else
2114 ret = gen6_reset_engines(dev_priv, engine_mask);
2115 2156
2116not_ready:2157skip_reset:
2117 for_each_engine_masked(engine, dev_priv, engine_mask, tmp)2158 for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
2118 gen8_reset_engine_cancel(engine);2159 gen8_engine_reset_cancel(engine);
2119 2160
2120 return ret;2161 return ret;
2121}2162}
2122 2163
2123typedef int (*reset_func)(struct drm_i915_private *, unsigned engine_mask);2164typedef int (*reset_func)(struct drm_i915_private *,
2165 unsigned int engine_mask, unsigned int retry);
2124 2166
2125static reset_func intel_get_gpu_reset(struct drm_i915_private *dev_priv)2167static reset_func intel_get_gpu_reset(struct drm_i915_private *dev_priv)
2126{2168{
@@ -2143,12 +2185,15 @@ static reset_func intel_get_gpu_reset(struct drm_i915_private *dev_priv) · 16 unmodified lines
2143 return NULL;2185 return NULL;
2144}2186}
2145 2187
2146int intel_gpu_reset(struct drm_i915_private *dev_priv, unsigned engine_mask)2188int intel_gpu_reset(struct drm_i915_private *dev_priv,
2189 const unsigned int engine_mask)
2147{2190{
2148 reset_func reset = intel_get_gpu_reset(dev_priv);2191 reset_func reset = intel_get_gpu_reset(dev_priv);
2149 int retry;2192 unsigned int retry;
2150 int ret;2193 int ret;
2151 2194
2195 GEM_BUG_ON(!engine_mask);
2196
2152 /*2197 /*
2153 * We want to perform per-engine reset from atomic context (e.g.2198 * We want to perform per-engine reset from atomic context (e.g.
2154 * softirq), which imposes the constraint that we cannot sleep.2199 * softirq), which imposes the constraint that we cannot sleep.
@@ -2190,8 +2235,9 @@ int intel_gpu_reset(struct drm_i915_private *dev_priv, unsigned engine_mask) · 35 unmodified lines
2190 2235
2191 ret = -ENODEV;2236 ret = -ENODEV;
2192 if (reset) {2237 if (reset) {
2193 GEM_TRACE("engine_mask=%x\n", engine_mask);2238 ret = reset(dev_priv, engine_mask, retry);
2194 ret = reset(dev_priv, engine_mask);2239 GEM_TRACE("engine_mask=%x, ret=%d, retry=%d\n",
2240 engine_mask, ret, retry);
2195 }2241 }
2196 if (ret != -ETIMEDOUT || engine_mask != ALL_ENGINES)2242 if (ret != -ETIMEDOUT || engine_mask != ALL_ENGINES)
2197 break;2243 break;
@@ -2237,20 +2283,28 @@ bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv) · 39 unmodified lines
2237bool2283bool
2238intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)2284intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
2239{2285{
2240 if (unlikely(i915_modparams.mmio_debug ||2286 bool ret = false;
2241 dev_priv->uncore.unclaimed_mmio_check <= 0))2287
2242 return false;2288 spin_lock_irq(&dev_priv->uncore.lock);
2289
2290 if (unlikely(dev_priv->uncore.unclaimed_mmio_check <= 0))
2291 goto out;
2243 2292
2244 if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) {2293 if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) {
2245 DRM_DEBUG("Unclaimed register detected, "2294 if (!i915_modparams.mmio_debug) {
2246 "enabling oneshot unclaimed register reporting. "2295 DRM_DEBUG("Unclaimed register detected, "
2247 "Please use i915.mmio_debug=N for more information.\n");2296 "enabling oneshot unclaimed register reporting. "
2248 i915_modparams.mmio_debug++;2297 "Please use i915.mmio_debug=N for more information.\n");
2298 i915_modparams.mmio_debug++;
2299 }
2249 dev_priv->uncore.unclaimed_mmio_check--;2300 dev_priv->uncore.unclaimed_mmio_check--;
2250 return true;2301 ret = true;
2251 }2302 }
2252 2303
2253 return false;2304out:
2305 spin_unlock_irq(&dev_priv->uncore.lock);
2306
2307 return ret;
2254}2308}
2255 2309
2256static enum forcewake_domains2310static enum forcewake_domains
drivers/gpu/drm/i915/intel_wopcm.c+6−0
@@ -163,8 +163,14 @@ int intel_wopcm_init(struct intel_wopcm *wopcm) · 162 unmodified lines
163 u32 guc_wopcm_rsvd;163 u32 guc_wopcm_rsvd;
164 int err;164 int err;
165 165
166 if (!USES_GUC(dev_priv))
167 return 0;
168
166 GEM_BUG_ON(!wopcm->size);169 GEM_BUG_ON(!wopcm->size);
167 170
171 if (i915_inject_load_failure())
172 return -E2BIG;
173
168 if (guc_fw_size >= wopcm->size) {174 if (guc_fw_size >= wopcm->size) {
169 DRM_ERROR("GuC FW (%uKiB) is too big to fit in WOPCM.",175 DRM_ERROR("GuC FW (%uKiB) is too big to fit in WOPCM.",
170 guc_fw_size / 1024);176 guc_fw_size / 1024);
drivers/gpu/drm/i915/selftests/huge_pages.c+6−5
@@ -906,7 +906,11 @@ gpu_write_dw(struct i915_vma *vma, u64 offset, u32 val) · 905 unmodified lines
906 if (IS_ERR(obj))906 if (IS_ERR(obj))
907 return ERR_CAST(obj);907 return ERR_CAST(obj);
908 908
909 cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);909 err = i915_gem_object_set_to_wc_domain(obj, true);
910 if (err)
911 goto err;
912
913 cmd = i915_gem_object_pin_map(obj, I915_MAP_WC);
910 if (IS_ERR(cmd)) {914 if (IS_ERR(cmd)) {
911 err = PTR_ERR(cmd);915 err = PTR_ERR(cmd);
912 goto err;916 goto err;
@@ -936,13 +940,10 @@ gpu_write_dw(struct i915_vma *vma, u64 offset, u32 val) · 23 unmodified lines
936 }940 }
937 941
938 *cmd = MI_BATCH_BUFFER_END;942 *cmd = MI_BATCH_BUFFER_END;
943 i915_gem_chipset_flush(i915);
939 944
940 i915_gem_object_unpin_map(obj);945 i915_gem_object_unpin_map(obj);
941 946
942 err = i915_gem_object_set_to_gtt_domain(obj, false);
943 if (err)
944 goto err;
945
946 batch = i915_vma_instance(obj, vma->vm, NULL);947 batch = i915_vma_instance(obj, vma->vm, NULL);
947 if (IS_ERR(batch)) {948 if (IS_ERR(batch)) {
948 err = PTR_ERR(batch);949 err = PTR_ERR(batch);
drivers/gpu/drm/i915/selftests/i915_gem.c+221−0
@@ -0,0 +1,221 @@
1/*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright © 2018 Intel Corporation
5 */
6
7#include <linux/random.h>
8
9#include "../i915_selftest.h"
10
11#include "mock_context.h"
12#include "igt_flush_test.h"
13
14static int switch_to_context(struct drm_i915_private *i915,
15 struct i915_gem_context *ctx)
16{
17 struct intel_engine_cs *engine;
18 enum intel_engine_id id;
19 int err = 0;
20
21 intel_runtime_pm_get(i915);
22
23 for_each_engine(engine, i915, id) {
24 struct i915_request *rq;
25
26 rq = i915_request_alloc(engine, ctx);
27 if (IS_ERR(rq)) {
28 err = PTR_ERR(rq);
29 break;
30 }
31
32 i915_request_add(rq);
33 }
34
35 intel_runtime_pm_put(i915);
36
37 return err;
38}
39
40static void trash_stolen(struct drm_i915_private *i915)
41{
42 struct i915_ggtt *ggtt = &i915->ggtt;
43 const u64 slot = ggtt->error_capture.start;
44 const resource_size_t size = resource_size(&i915->dsm);
45 unsigned long page;
46 u32 prng = 0x12345678;
47
48 for (page = 0; page < size; page += PAGE_SIZE) {
49 const dma_addr_t dma = i915->dsm.start + page;
50 u32 __iomem *s;
51 int x;
52
53 ggtt->vm.insert_page(&ggtt->vm, dma, slot, I915_CACHE_NONE, 0);
54
55 s = io_mapping_map_atomic_wc(&ggtt->iomap, slot);
56 for (x = 0; x < PAGE_SIZE / sizeof(u32); x++) {
57 prng = next_pseudo_random32(prng);
58 iowrite32(prng, &s[x]);
59 }
60 io_mapping_unmap_atomic(s);
61 }
62
63 ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE);
64}
65
66static void simulate_hibernate(struct drm_i915_private *i915)
67{
68 intel_runtime_pm_get(i915);
69
70 /*
71 * As a final sting in the tail, invalidate stolen. Under a real S4,
72 * stolen is lost and needs to be refilled on resume. However, under
73 * CI we merely do S4-device testing (as full S4 is too unreliable
74 * for automated testing across a cluster), so to simulate the effect
75 * of stolen being trashed across S4, we trash it ourselves.
76 */
77 trash_stolen(i915);
78
79 intel_runtime_pm_put(i915);
80}
81
82static int pm_prepare(struct drm_i915_private *i915)
83{
84 int err = 0;
85
86 if (i915_gem_suspend(i915)) {
87 pr_err("i915_gem_suspend failed\n");
88 err = -EINVAL;
89 }
90
91 return err;
92}
93
94static void pm_suspend(struct drm_i915_private *i915)
95{
96 intel_runtime_pm_get(i915);
97
98 i915_gem_suspend_gtt_mappings(i915);
99 i915_gem_suspend_late(i915);
100
101 intel_runtime_pm_put(i915);
102}
103
104static void pm_hibernate(struct drm_i915_private *i915)
105{
106 intel_runtime_pm_get(i915);
107
108 i915_gem_suspend_gtt_mappings(i915);
109
110 i915_gem_freeze(i915);
111 i915_gem_freeze_late(i915);
112
113 intel_runtime_pm_put(i915);
114}
115
116static void pm_resume(struct drm_i915_private *i915)
117{
118 /*
119 * Both suspend and hibernate follow the same wakeup path and assume
120 * that runtime-pm just works.
121 */
122 intel_runtime_pm_get(i915);
123
124 intel_engines_sanitize(i915);
125 i915_gem_sanitize(i915);
126 i915_gem_resume(i915);
127
128 intel_runtime_pm_put(i915);
129}
130
131static int igt_gem_suspend(void *arg)
132{
133 struct drm_i915_private *i915 = arg;
134 struct i915_gem_context *ctx;
135 struct drm_file *file;
136 int err;
137
138 file = mock_file(i915);
139 if (IS_ERR(file))
140 return PTR_ERR(file);
141
142 err = -ENOMEM;
143 mutex_lock(&i915->drm.struct_mutex);
144 ctx = live_context(i915, file);
145 if (!IS_ERR(ctx))
146 err = switch_to_context(i915, ctx);
147 mutex_unlock(&i915->drm.struct_mutex);
148 if (err)
149 goto out;
150
151 err = pm_prepare(i915);
152 if (err)
153 goto out;
154
155 pm_suspend(i915);
156
157 /* Here be dragons! Note that with S3RST any S3 may become S4! */
158 simulate_hibernate(i915);
159
160 pm_resume(i915);
161
162 mutex_lock(&i915->drm.struct_mutex);
163 err = switch_to_context(i915, ctx);
164 if (igt_flush_test(i915, I915_WAIT_LOCKED))
165 err = -EIO;
166 mutex_unlock(&i915->drm.struct_mutex);
167out:
168 mock_file_free(i915, file);
169 return err;
170}
171
172static int igt_gem_hibernate(void *arg)
173{
174 struct drm_i915_private *i915 = arg;
175 struct i915_gem_context *ctx;
176 struct drm_file *file;
177 int err;
178
179 file = mock_file(i915);
180 if (IS_ERR(file))
181 return PTR_ERR(file);
182
183 err = -ENOMEM;
184 mutex_lock(&i915->drm.struct_mutex);
185 ctx = live_context(i915, file);
186 if (!IS_ERR(ctx))
187 err = switch_to_context(i915, ctx);
188 mutex_unlock(&i915->drm.struct_mutex);
189 if (err)
190 goto out;
191
192 err = pm_prepare(i915);
193 if (err)
194 goto out;
195
196 pm_hibernate(i915);
197
198 /* Here be dragons! */
199 simulate_hibernate(i915);
200
201 pm_resume(i915);
202
203 mutex_lock(&i915->drm.struct_mutex);
204 err = switch_to_context(i915, ctx);
205 if (igt_flush_test(i915, I915_WAIT_LOCKED))
206 err = -EIO;
207 mutex_unlock(&i915->drm.struct_mutex);
208out:
209 mock_file_free(i915, file);
210 return err;
211}
212
213int i915_gem_live_selftests(struct drm_i915_private *i915)
214{
215 static const struct i915_subtest tests[] = {
216 SUBTEST(igt_gem_suspend),
217 SUBTEST(igt_gem_hibernate),
218 };
219
220 return i915_subtests(tests, i915);
221}
drivers/gpu/drm/i915/selftests/i915_gem_coherency.c+17−21
@@ -33,7 +33,8 @@ static int cpu_set(struct drm_i915_gem_object *obj, · 32 unmodified lines
33{33{
34 unsigned int needs_clflush;34 unsigned int needs_clflush;
35 struct page *page;35 struct page *page;
36 u32 *map;36 void *map;
37 u32 *cpu;
37 int err;38 int err;
38 39
39 err = i915_gem_obj_prepare_shmem_write(obj, &needs_clflush);40 err = i915_gem_obj_prepare_shmem_write(obj, &needs_clflush);
@@ -42,24 +43,19 @@ static int cpu_set(struct drm_i915_gem_object *obj, · 2 unmodified lines
42 43
43 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);44 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
44 map = kmap_atomic(page);45 map = kmap_atomic(page);
46 cpu = map + offset_in_page(offset);
45 47
46 if (needs_clflush & CLFLUSH_BEFORE) {48 if (needs_clflush & CLFLUSH_BEFORE)
47 mb();49 drm_clflush_virt_range(cpu, sizeof(*cpu));
48 clflush(map+offset_in_page(offset) / sizeof(*map));
49 mb();
50 }
51 50
52 map[offset_in_page(offset) / sizeof(*map)] = v;51 *cpu = v;
53 52
54 if (needs_clflush & CLFLUSH_AFTER) {53 if (needs_clflush & CLFLUSH_AFTER)
55 mb();54 drm_clflush_virt_range(cpu, sizeof(*cpu));
56 clflush(map+offset_in_page(offset) / sizeof(*map));
57 mb();
58 }
59 55
60 kunmap_atomic(map);56 kunmap_atomic(map);
61
62 i915_gem_obj_finish_shmem_access(obj);57 i915_gem_obj_finish_shmem_access(obj);
58
63 return 0;59 return 0;
64}60}
65 61
@@ -69,7 +65,8 @@ static int cpu_get(struct drm_i915_gem_object *obj, · 3 unmodified lines
69{65{
70 unsigned int needs_clflush;66 unsigned int needs_clflush;
71 struct page *page;67 struct page *page;
72 u32 *map;68 void *map;
69 u32 *cpu;
73 int err;70 int err;
74 71
75 err = i915_gem_obj_prepare_shmem_read(obj, &needs_clflush);72 err = i915_gem_obj_prepare_shmem_read(obj, &needs_clflush);
@@ -78,17 +75,16 @@ static int cpu_get(struct drm_i915_gem_object *obj, · 2 unmodified lines
78 75
79 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);76 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
80 map = kmap_atomic(page);77 map = kmap_atomic(page);
78 cpu = map + offset_in_page(offset);
81 79
82 if (needs_clflush & CLFLUSH_BEFORE) {80 if (needs_clflush & CLFLUSH_BEFORE)
83 mb();81 drm_clflush_virt_range(cpu, sizeof(*cpu));
84 clflush(map+offset_in_page(offset) / sizeof(*map));
85 mb();
86 }
87 82
88 *v = map[offset_in_page(offset) / sizeof(*map)];83 *v = *cpu;
89 kunmap_atomic(map);
90 84
85 kunmap_atomic(map);
91 i915_gem_obj_finish_shmem_access(obj);86 i915_gem_obj_finish_shmem_access(obj);
87
92 return 0;88 return 0;
93}89}
94 90
drivers/gpu/drm/i915/selftests/i915_gem_object.c+1−1
@@ -282,7 +282,7 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj, · 281 unmodified lines
282 view.partial.offset,282 view.partial.offset,
283 view.partial.size,283 view.partial.size,
284 vma->size >> PAGE_SHIFT,284 vma->size >> PAGE_SHIFT,
285 tile_row_pages(obj),285 tile->tiling ? tile_row_pages(obj) : 0,
286 vma->fence ? vma->fence->id : -1, tile->tiling, tile->stride,286 vma->fence ? vma->fence->id : -1, tile->tiling, tile->stride,
287 offset >> PAGE_SHIFT,287 offset >> PAGE_SHIFT,
288 (unsigned int)offset_in_page(offset),288 (unsigned int)offset_in_page(offset),
drivers/gpu/drm/i915/selftests/i915_live_selftests.h+1−0
@@ -17,6 +17,7 @@ selftest(objects, i915_gem_object_live_selftests) · 16 unmodified lines
17selftest(dmabuf, i915_gem_dmabuf_live_selftests)17selftest(dmabuf, i915_gem_dmabuf_live_selftests)
18selftest(coherency, i915_gem_coherency_live_selftests)18selftest(coherency, i915_gem_coherency_live_selftests)
19selftest(gtt, i915_gem_gtt_live_selftests)19selftest(gtt, i915_gem_gtt_live_selftests)
20selftest(gem, i915_gem_live_selftests)
20selftest(evict, i915_gem_evict_live_selftests)21selftest(evict, i915_gem_evict_live_selftests)
21selftest(hugepages, i915_gem_huge_page_live_selftests)22selftest(hugepages, i915_gem_huge_page_live_selftests)
22selftest(contexts, i915_gem_context_live_selftests)23selftest(contexts, i915_gem_context_live_selftests)
drivers/gpu/drm/i915/selftests/intel_guc.c+38−0
@@ -65,6 +65,40 @@ static int check_all_doorbells(struct intel_guc *guc) · 64 unmodified lines
65 return 0;65 return 0;
66}66}
67 67
68static int ring_doorbell_nop(struct intel_guc_client *client)
69{
70 struct guc_process_desc *desc = __get_process_desc(client);
71 int err;
72
73 client->use_nop_wqi = true;
74
75 spin_lock_irq(&client->wq_lock);
76
77 guc_wq_item_append(client, 0, 0, 0, 0);
78 guc_ring_doorbell(client);
79
80 spin_unlock_irq(&client->wq_lock);
81
82 client->use_nop_wqi = false;
83
84 /* if there are no issues GuC will update the WQ head and keep the
85 * WQ in active status
86 */
87 err = wait_for(READ_ONCE(desc->head) == READ_ONCE(desc->tail), 10);
88 if (err) {
89 pr_err("doorbell %u ring failed!\n", client->doorbell_id);
90 return -EIO;
91 }
92
93 if (desc->wq_status != WQ_STATUS_ACTIVE) {
94 pr_err("doorbell %u ring put WQ in bad state (%u)!\n",
95 client->doorbell_id, desc->wq_status);
96 return -EIO;
97 }
98
99 return 0;
100}
101
68/*102/*
69 * Basic client sanity check, handy to validate create_clients.103 * Basic client sanity check, handy to validate create_clients.
70 */104 */
@@ -332,6 +366,10 @@ static int igt_guc_doorbells(void *arg) · 261 unmodified lines
332 err = check_all_doorbells(guc);366 err = check_all_doorbells(guc);
333 if (err)367 if (err)
334 goto out;368 goto out;
369
370 err = ring_doorbell_nop(clients[i]);
371 if (err)
372 goto out;
335 }373 }
336 374
337out:375out:
drivers/gpu/drm/i915/selftests/intel_hangcheck.c+89−12
@@ -1018,8 +1018,41 @@ static int evict_vma(void *data) · 1017 unmodified lines
1018 return err;1018 return err;
1019}1019}
1020 1020
1021static int evict_fence(void *data)
1022{
1023 struct evict_vma *arg = data;
1024 struct drm_i915_private *i915 = arg->vma->vm->i915;
1025 int err;
1026
1027 complete(&arg->completion);
1028
1029 mutex_lock(&i915->drm.struct_mutex);
1030
1031 /* Mark the fence register as dirty to force the mmio update. */
1032 err = i915_gem_object_set_tiling(arg->vma->obj, I915_TILING_Y, 512);
1033 if (err) {
1034 pr_err("Invalid Y-tiling settings; err:%d\n", err);
1035 goto out_unlock;
1036 }
1037
1038 err = i915_vma_pin_fence(arg->vma);
1039 if (err) {
1040 pr_err("Unable to pin Y-tiled fence; err:%d\n", err);
1041 goto out_unlock;
1042 }
1043
1044 i915_vma_unpin_fence(arg->vma);
1045
1046out_unlock:
1047 mutex_unlock(&i915->drm.struct_mutex);
1048
1049 return err;
1050}
1051
1021static int __igt_reset_evict_vma(struct drm_i915_private *i915,1052static int __igt_reset_evict_vma(struct drm_i915_private *i915,
1022 struct i915_address_space *vm)1053 struct i915_address_space *vm,
1054 int (*fn)(void *),
1055 unsigned int flags)
1023{1056{
1024 struct drm_i915_gem_object *obj;1057 struct drm_i915_gem_object *obj;
1025 struct task_struct *tsk = NULL;1058 struct task_struct *tsk = NULL;
@@ -1040,12 +1073,20 @@ static int __igt_reset_evict_vma(struct drm_i915_private *i915, · 14 unmodified lines
1040 if (err)1073 if (err)
1041 goto unlock;1074 goto unlock;
1042 1075
1043 obj = i915_gem_object_create_internal(i915, PAGE_SIZE);1076 obj = i915_gem_object_create_internal(i915, SZ_1M);
1044 if (IS_ERR(obj)) {1077 if (IS_ERR(obj)) {
1045 err = PTR_ERR(obj);1078 err = PTR_ERR(obj);
1046 goto fini;1079 goto fini;
1047 }1080 }
1048 1081
1082 if (flags & EXEC_OBJECT_NEEDS_FENCE) {
1083 err = i915_gem_object_set_tiling(obj, I915_TILING_X, 512);
1084 if (err) {
1085 pr_err("Invalid X-tiling settings; err:%d\n", err);
1086 goto out_obj;
1087 }
1088 }
1089
1049 arg.vma = i915_vma_instance(obj, vm, NULL);1090 arg.vma = i915_vma_instance(obj, vm, NULL);
1050 if (IS_ERR(arg.vma)) {1091 if (IS_ERR(arg.vma)) {
1051 err = PTR_ERR(arg.vma);1092 err = PTR_ERR(arg.vma);
@@ -1059,11 +1100,28 @@ static int __igt_reset_evict_vma(struct drm_i915_private *i915, · 7 unmodified lines
1059 }1100 }
1060 1101
1061 err = i915_vma_pin(arg.vma, 0, 0,1102 err = i915_vma_pin(arg.vma, 0, 0,
1062 i915_vma_is_ggtt(arg.vma) ? PIN_GLOBAL : PIN_USER);1103 i915_vma_is_ggtt(arg.vma) ?
1063 if (err)1104 PIN_GLOBAL | PIN_MAPPABLE :
1105 PIN_USER);
1106 if (err) {
1107 i915_request_add(rq);
1064 goto out_obj;1108 goto out_obj;
1109 }
1110
1111 if (flags & EXEC_OBJECT_NEEDS_FENCE) {
1112 err = i915_vma_pin_fence(arg.vma);
1113 if (err) {
1114 pr_err("Unable to pin X-tiled fence; err:%d\n", err);
1115 i915_vma_unpin(arg.vma);
1116 i915_request_add(rq);
1117 goto out_obj;
1118 }
1119 }
1120
1121 err = i915_vma_move_to_active(arg.vma, rq, flags);
1065 1122
1066 err = i915_vma_move_to_active(arg.vma, rq, EXEC_OBJECT_WRITE);1123 if (flags & EXEC_OBJECT_NEEDS_FENCE)
1124 i915_vma_unpin_fence(arg.vma);
1067 i915_vma_unpin(arg.vma);1125 i915_vma_unpin(arg.vma);
1068 1126
1069 i915_request_get(rq);1127 i915_request_get(rq);
@@ -1086,7 +1144,7 @@ static int __igt_reset_evict_vma(struct drm_i915_private *i915, · 16 unmodified lines
1086 1144
1087 init_completion(&arg.completion);1145 init_completion(&arg.completion);
1088 1146
1089 tsk = kthread_run(evict_vma, &arg, "igt/evict_vma");1147 tsk = kthread_run(fn, &arg, "igt/evict_vma");
1090 if (IS_ERR(tsk)) {1148 if (IS_ERR(tsk)) {
1091 err = PTR_ERR(tsk);1149 err = PTR_ERR(tsk);
1092 tsk = NULL;1150 tsk = NULL;
@@ -1137,29 +1195,47 @@ static int igt_reset_evict_ggtt(void *arg) · 44 unmodified lines
1137{1195{
1138 struct drm_i915_private *i915 = arg;1196 struct drm_i915_private *i915 = arg;
1139 1197
1140 return __igt_reset_evict_vma(i915, &i915->ggtt.vm);1198 return __igt_reset_evict_vma(i915, &i915->ggtt.vm,
1199 evict_vma, EXEC_OBJECT_WRITE);
1141}1200}
1142 1201
1143static int igt_reset_evict_ppgtt(void *arg)1202static int igt_reset_evict_ppgtt(void *arg)
1144{1203{
1145 struct drm_i915_private *i915 = arg;1204 struct drm_i915_private *i915 = arg;
1146 struct i915_gem_context *ctx;1205 struct i915_gem_context *ctx;
1206 struct drm_file *file;
1147 int err;1207 int err;
1148 1208
1209 file = mock_file(i915);
1210 if (IS_ERR(file))
1211 return PTR_ERR(file);
1212
1149 mutex_lock(&i915->drm.struct_mutex);1213 mutex_lock(&i915->drm.struct_mutex);
1150 ctx = kernel_context(i915);1214 ctx = live_context(i915, file);
1151 mutex_unlock(&i915->drm.struct_mutex);1215 mutex_unlock(&i915->drm.struct_mutex);
1152 if (IS_ERR(ctx))1216 if (IS_ERR(ctx)) {
1153 return PTR_ERR(ctx);1217 err = PTR_ERR(ctx);
1218 goto out;
1219 }
1154 1220
1155 err = 0;1221 err = 0;
1156 if (ctx->ppgtt) /* aliasing == global gtt locking, covered above */1222 if (ctx->ppgtt) /* aliasing == global gtt locking, covered above */
1157 err = __igt_reset_evict_vma(i915, &ctx->ppgtt->vm);1223 err = __igt_reset_evict_vma(i915, &ctx->ppgtt->vm,
1224 evict_vma, EXEC_OBJECT_WRITE);
1158 1225
1159 kernel_context_close(ctx);1226out:
1227 mock_file_free(i915, file);
1160 return err;1228 return err;
1161}1229}
1162 1230
1231static int igt_reset_evict_fence(void *arg)
1232{
1233 struct drm_i915_private *i915 = arg;
1234
1235 return __igt_reset_evict_vma(i915, &i915->ggtt.vm,
1236 evict_fence, EXEC_OBJECT_NEEDS_FENCE);
1237}
1238
1163static int wait_for_others(struct drm_i915_private *i915,1239static int wait_for_others(struct drm_i915_private *i915,
1164 struct intel_engine_cs *exclude)1240 struct intel_engine_cs *exclude)
1165{1241{
@@ -1409,6 +1485,7 @@ int intel_hangcheck_live_selftests(struct drm_i915_private *i915) · 243 unmodified lines
1409 SUBTEST(igt_reset_wait),1485 SUBTEST(igt_reset_wait),
1410 SUBTEST(igt_reset_evict_ggtt),1486 SUBTEST(igt_reset_evict_ggtt),
1411 SUBTEST(igt_reset_evict_ppgtt),1487 SUBTEST(igt_reset_evict_ppgtt),
1488 SUBTEST(igt_reset_evict_fence),
1412 SUBTEST(igt_handle_error),1489 SUBTEST(igt_handle_error),
1413 };1490 };
1414 bool saved_hangcheck;1491 bool saved_hangcheck;
drivers/gpu/drm/i915/selftests/mock_context.c+3−8
@@ -43,6 +43,7 @@ mock_context(struct drm_i915_private *i915, · 42 unmodified lines
43 43
44 INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);44 INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
45 INIT_LIST_HEAD(&ctx->handles_list);45 INIT_LIST_HEAD(&ctx->handles_list);
46 INIT_LIST_HEAD(&ctx->hw_id_link);
46 47
47 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) {48 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) {
48 struct intel_context *ce = &ctx->__engine[n];49 struct intel_context *ce = &ctx->__engine[n];
@@ -50,11 +51,9 @@ mock_context(struct drm_i915_private *i915, · 1 unmodified line
50 ce->gem_context = ctx;51 ce->gem_context = ctx;
51 }52 }
52 53
53 ret = ida_simple_get(&i915->contexts.hw_ida,54 ret = i915_gem_context_pin_hw_id(ctx);
54 0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
55 if (ret < 0)55 if (ret < 0)
56 goto err_handles;56 goto err_handles;
57 ctx->hw_id = ret;
58 57
59 if (name) {58 if (name) {
60 ctx->name = kstrdup(name, GFP_KERNEL);59 ctx->name = kstrdup(name, GFP_KERNEL);
@@ -85,11 +84,7 @@ void mock_context_close(struct i915_gem_context *ctx) · 24 unmodified lines
85 84
86void mock_init_contexts(struct drm_i915_private *i915)85void mock_init_contexts(struct drm_i915_private *i915)
87{86{
88 INIT_LIST_HEAD(&i915->contexts.list);87 init_contexts(i915);
89 ida_init(&i915->contexts.hw_ida);
90
91 INIT_WORK(&i915->contexts.free_work, contexts_free_worker);
92 init_llist_head(&i915->contexts.free_list);
93}88}
94 89
95struct i915_gem_context *90struct i915_gem_context *
drivers/gpu/drm/i915/selftests/mock_gtt.c+2−0
@@ -118,6 +118,8 @@ void mock_init_ggtt(struct drm_i915_private *i915) · 117 unmodified lines
118 ggtt->vm.vma_ops.clear_pages = clear_pages;118 ggtt->vm.vma_ops.clear_pages = clear_pages;
119 119
120 i915_address_space_init(&ggtt->vm, i915);120 i915_address_space_init(&ggtt->vm, i915);
121
122 ggtt->vm.is_ggtt = true;
121}123}
122 124
123void mock_fini_ggtt(struct drm_i915_private *i915)125void mock_fini_ggtt(struct drm_i915_private *i915)
include/drm/i915_pciids.h+1−0
@@ -386,6 +386,7 @@ · 385 unmodified lines
386 INTEL_VGA_DEVICE(0x3E91, info), /* SRV GT2 */ \386 INTEL_VGA_DEVICE(0x3E91, info), /* SRV GT2 */ \
387 INTEL_VGA_DEVICE(0x3E92, info), /* SRV GT2 */ \387 INTEL_VGA_DEVICE(0x3E92, info), /* SRV GT2 */ \
388 INTEL_VGA_DEVICE(0x3E96, info), /* SRV GT2 */ \388 INTEL_VGA_DEVICE(0x3E96, info), /* SRV GT2 */ \
389 INTEL_VGA_DEVICE(0x3E98, info), /* SRV GT2 */ \
389 INTEL_VGA_DEVICE(0x3E9A, info) /* SRV GT2 */390 INTEL_VGA_DEVICE(0x3E9A, info) /* SRV GT2 */
390 391
391/* CFL H */392/* CFL H */
include/uapi/drm/i915_drm.h+22−0
@@ -529,6 +529,28 @@ typedef struct drm_i915_irq_wait { · 528 unmodified lines
529 */529 */
530#define I915_PARAM_CS_TIMESTAMP_FREQUENCY 51530#define I915_PARAM_CS_TIMESTAMP_FREQUENCY 51
531 531
532/*
533 * Once upon a time we supposed that writes through the GGTT would be
534 * immediately in physical memory (once flushed out of the CPU path). However,
535 * on a few different processors and chipsets, this is not necessarily the case
536 * as the writes appear to be buffered internally. Thus a read of the backing
537 * storage (physical memory) via a different path (with different physical tags
538 * to the indirect write via the GGTT) will see stale values from before
539 * the GGTT write. Inside the kernel, we can for the most part keep track of
540 * the different read/write domains in use (e.g. set-domain), but the assumption
541 * of coherency is baked into the ABI, hence reporting its true state in this
542 * parameter.
543 *
544 * Reports true when writes via mmap_gtt are immediately visible following an
545 * lfence to flush the WCB.
546 *
547 * Reports false when writes via mmap_gtt are indeterminately delayed in an in
548 * internal buffer and are _not_ immediately visible to third parties accessing
549 * directly via mmap_cpu/mmap_wc. Use of mmap_gtt as part of an IPC
550 * communications channel when reporting false is strongly disadvised.
551 */
552#define I915_PARAM_MMAP_GTT_COHERENT 52
553
532typedef struct drm_i915_getparam {554typedef struct drm_i915_getparam {
533 __s32 param;555 __s32 param;
534 /*556 /*

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t